foreach/0000755000176200001440000000000013214055060011655 5ustar liggesusersforeach/inst/0000755000176200001440000000000013212620533012633 5ustar liggesusersforeach/inst/examples/0000755000176200001440000000000013212617760014461 5ustar liggesusersforeach/inst/examples/germandata.txt0000644000176200001440000030716011472542406017334 0ustar liggesusers 1 6 4 12 5 5 3 4 1 67 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 2 48 2 60 1 3 2 2 1 22 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 4 12 4 21 1 4 3 3 1 49 3 1 2 1 1 0 0 1 0 0 1 0 1 0 1 1 42 2 79 1 4 3 4 2 45 3 1 2 1 1 0 0 0 0 0 0 0 0 1 1 1 24 3 49 1 3 3 4 4 53 3 2 2 1 1 1 0 1 0 0 0 0 0 1 2 4 36 2 91 5 3 3 4 4 35 3 1 2 2 1 0 0 1 0 0 0 0 1 0 1 4 24 2 28 3 5 3 4 2 53 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 36 2 69 1 3 3 2 3 35 3 1 1 2 1 0 1 1 0 1 0 0 0 0 1 4 12 2 31 4 4 1 4 1 61 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 2 30 4 52 1 1 4 2 3 28 3 2 1 1 1 1 0 1 0 0 1 0 0 0 2 2 12 2 13 1 2 2 1 3 25 3 1 1 1 1 1 0 1 0 1 0 0 0 1 2 1 48 2 43 1 2 2 4 2 24 3 1 1 1 1 0 0 1 0 1 0 0 0 1 2 2 12 2 16 1 3 2 1 3 22 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 1 24 4 12 1 5 3 4 3 60 3 2 1 1 1 1 0 1 0 0 1 0 1 0 2 1 15 2 14 1 3 2 4 3 28 3 1 1 1 1 1 0 1 0 1 0 0 0 1 1 1 24 2 13 2 3 2 2 3 32 3 1 1 1 1 0 0 1 0 0 1 0 1 0 2 4 24 4 24 5 5 3 4 2 53 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 1 30 0 81 5 2 3 3 3 25 1 3 1 1 1 0 0 1 0 0 1 0 0 1 1 2 24 2 126 1 5 2 2 4 44 3 1 1 2 1 0 1 1 0 0 0 0 0 0 2 4 24 2 34 3 5 3 2 3 31 3 1 2 2 1 0 0 1 0 0 1 0 0 1 1 4 9 4 21 1 3 3 4 3 48 3 3 1 2 1 1 0 1 0 0 1 0 0 1 1 1 6 2 26 3 3 3 3 1 44 3 1 2 1 1 0 0 1 0 1 0 0 0 1 1 1 10 4 22 1 2 3 3 1 48 3 2 2 1 2 1 0 1 0 1 0 0 1 0 1 2 12 4 18 2 2 3 4 2 44 3 1 1 1 1 0 1 1 0 0 1 0 0 1 1 4 10 4 21 5 3 4 1 3 26 3 2 1 1 2 0 0 1 0 0 1 0 0 1 1 1 6 2 14 1 3 3 2 1 36 1 1 1 2 1 0 0 1 0 0 1 0 1 0 1 4 6 0 4 1 5 4 4 3 39 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 3 12 1 4 4 3 2 3 1 42 3 2 1 1 1 0 0 1 0 1 0 0 0 1 1 2 7 2 24 1 3 3 2 1 34 3 1 1 1 1 0 0 0 0 0 1 0 0 1 1 1 60 3 68 1 5 3 4 4 63 3 2 1 2 1 0 0 1 0 0 1 0 0 1 2 2 18 2 19 4 2 4 3 1 36 1 1 1 2 1 0 0 1 0 0 1 0 0 1 1 1 24 2 40 1 3 3 2 3 27 2 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 18 2 59 2 3 3 2 3 30 3 2 1 2 1 1 0 1 0 0 1 0 0 1 1 4 12 4 13 5 5 3 4 4 57 3 1 1 1 1 0 0 1 0 1 0 0 1 0 1 3 12 2 15 1 2 2 1 2 33 1 1 1 2 1 0 0 1 0 0 1 0 0 0 1 2 45 4 47 1 2 3 2 2 25 3 2 1 1 1 0 0 1 0 0 1 0 1 0 2 4 48 4 61 1 3 3 3 4 31 1 1 1 2 1 0 0 1 0 0 0 0 0 1 1 3 18 2 21 1 3 3 2 1 37 2 1 1 1 1 0 0 0 1 0 1 0 0 1 2 3 10 2 12 1 3 3 2 3 37 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 9 2 5 1 3 3 3 1 24 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 30 2 23 3 5 3 2 3 30 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 2 12 2 12 3 3 1 1 3 26 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 18 3 62 1 3 3 4 1 44 3 1 2 2 1 0 0 1 0 0 1 0 1 0 1 1 30 4 62 2 4 4 4 3 24 3 2 1 1 1 0 1 1 0 1 0 0 0 1 1 1 48 4 61 1 5 2 4 4 58 2 2 1 1 1 0 1 1 0 0 0 0 1 0 2 4 11 4 14 1 2 2 4 3 35 3 2 1 1 1 1 0 1 0 0 1 0 0 0 1 4 36 2 23 3 5 3 4 3 39 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 6 2 14 3 1 2 2 2 23 3 1 1 2 1 0 1 1 0 1 0 1 0 0 1 4 11 4 72 1 3 3 4 2 39 3 2 1 1 1 1 0 1 0 0 1 0 1 0 1 4 12 2 21 2 3 2 2 1 28 3 1 1 1 1 0 0 0 1 0 1 0 0 1 1 2 24 3 23 5 2 3 2 2 29 1 1 1 1 1 0 0 1 0 0 1 0 1 0 1 2 27 3 60 1 5 3 2 3 30 3 2 1 2 1 0 1 1 0 0 1 0 0 0 1 4 12 2 13 1 3 3 2 3 25 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 18 2 34 5 3 3 1 2 31 3 1 1 2 1 0 1 1 0 0 1 0 0 1 1 2 36 3 22 1 5 3 4 4 57 1 2 1 2 1 1 0 1 0 0 0 0 0 1 2 4 6 1 8 5 3 3 2 1 26 2 1 2 1 1 1 0 0 0 0 1 0 1 0 1 2 12 2 65 5 1 3 1 4 52 3 1 1 2 1 0 0 1 0 0 1 0 0 0 2 4 36 4 96 1 3 2 2 3 31 2 2 1 1 1 0 0 1 0 0 1 0 0 1 1 3 18 2 20 1 5 2 2 3 23 3 1 1 1 1 1 0 1 0 0 1 0 0 0 1 1 36 4 62 1 2 2 4 4 23 3 2 1 2 1 0 0 0 1 1 0 0 1 0 2 2 9 2 14 1 3 4 1 1 27 1 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 15 4 15 5 5 3 4 1 50 3 2 1 2 1 0 0 0 0 0 1 0 0 1 1 2 36 0 20 1 5 3 4 4 61 3 1 1 2 1 0 0 1 0 0 0 0 0 0 2 2 48 0 144 1 3 3 2 3 25 3 1 1 2 1 0 0 1 0 0 1 0 0 1 2 4 24 2 32 1 2 2 4 2 26 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 4 27 2 52 5 5 3 4 2 48 3 4 2 2 1 0 0 1 0 0 1 0 0 1 1 4 12 2 22 1 2 2 2 3 29 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 12 2 10 4 3 4 1 1 22 3 1 1 1 1 1 0 1 0 0 1 0 0 1 1 4 36 2 18 1 3 3 4 4 37 2 1 1 2 1 0 0 1 0 0 0 0 0 1 2 4 36 2 24 5 3 2 4 3 25 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 36 2 81 1 3 2 2 2 30 1 1 1 1 1 0 1 1 0 0 1 0 0 1 1 4 7 4 7 5 5 3 2 2 46 3 2 1 2 1 0 0 1 0 1 0 0 1 0 1 1 8 4 12 1 5 3 4 4 51 1 2 2 2 1 0 0 1 0 0 0 0 0 0 1 2 42 4 60 1 4 2 1 1 41 1 2 1 1 1 0 0 1 0 0 1 0 1 0 1 1 36 2 20 5 5 3 4 4 40 3 1 1 2 1 0 0 1 0 0 1 0 0 0 2 1 12 4 15 1 5 3 4 4 66 3 2 1 1 1 0 1 1 0 0 0 0 0 0 1 1 42 2 40 1 2 3 3 3 34 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 2 11 3 48 1 4 3 4 2 51 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 54 0 94 5 3 3 2 2 39 3 1 2 1 1 0 1 1 0 0 1 0 1 0 1 2 30 2 38 1 2 4 1 2 22 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 24 2 59 5 2 2 1 3 44 3 2 1 2 1 0 0 1 0 0 1 0 0 1 2 4 15 2 12 3 5 3 3 2 47 2 1 1 2 1 0 0 1 0 0 1 0 0 1 1 4 18 2 16 2 3 2 4 2 24 3 1 1 1 1 0 0 1 0 1 0 0 1 0 1 1 24 2 18 1 5 2 4 1 58 3 1 1 2 1 0 0 0 0 0 1 0 1 0 1 1 10 2 23 1 5 3 4 1 52 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 4 12 4 14 1 3 2 2 1 29 3 2 1 2 1 0 0 0 0 0 1 0 0 0 1 2 18 4 13 1 2 2 1 2 27 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 2 36 2 126 2 3 3 4 4 47 3 1 2 2 1 0 0 1 0 0 0 0 0 1 2 1 18 2 22 2 4 3 3 3 30 3 1 2 2 1 1 0 1 0 0 1 0 0 0 1 1 12 0 11 1 4 3 3 1 28 3 2 1 1 1 0 0 1 0 0 1 0 0 1 2 4 12 4 6 1 5 3 4 1 56 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 12 4 14 1 5 3 3 1 54 3 1 1 1 1 0 1 1 0 0 1 0 0 1 1 4 12 4 8 5 5 2 3 2 33 1 1 2 1 1 0 0 1 0 0 1 0 1 0 2 3 24 4 36 5 5 3 4 4 20 3 2 1 1 1 0 0 0 1 1 0 0 0 1 1 2 12 2 13 4 5 3 4 1 54 3 1 1 2 1 1 0 1 0 0 1 0 0 1 1 2 54 0 159 1 2 3 4 4 58 3 1 1 2 1 0 0 1 0 1 0 0 0 1 2 4 12 4 20 5 4 2 2 3 61 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 18 2 26 2 3 3 4 3 34 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 36 4 23 1 5 3 4 1 36 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 20 3 71 5 4 3 4 2 36 1 2 2 2 1 0 1 1 0 1 0 0 0 0 1 4 24 2 15 2 5 4 4 1 41 3 1 1 1 1 1 0 1 0 1 0 0 1 0 1 2 36 2 23 1 4 3 4 3 24 3 1 1 1 1 0 0 1 0 1 0 0 0 1 1 4 6 3 9 1 3 2 2 1 24 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 9 4 19 1 4 3 3 3 35 3 1 1 2 1 0 0 1 0 1 0 0 0 1 1 4 12 2 24 5 2 4 4 3 26 3 1 1 2 1 0 1 1 0 1 0 0 0 1 1 2 24 4 119 1 3 3 3 3 39 3 2 2 2 1 0 0 0 1 0 1 0 0 0 2 4 18 1 65 1 5 3 4 4 39 1 2 2 2 1 1 0 1 0 0 1 0 0 0 2 2 12 2 61 1 4 3 2 3 32 3 1 1 1 1 1 0 1 0 0 1 0 0 1 1 1 24 2 77 5 2 2 2 2 30 3 1 1 2 2 0 0 1 0 0 1 0 0 1 1 2 14 2 14 3 5 4 2 1 35 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 6 3 14 2 5 1 2 3 31 1 2 2 1 1 0 0 1 0 0 1 0 0 1 1 3 15 2 4 1 2 2 4 2 23 3 1 1 2 1 0 0 1 0 1 0 0 0 1 1 2 18 2 63 1 4 3 3 1 28 3 1 1 1 1 1 0 1 0 1 0 0 1 0 1 4 36 4 79 1 3 2 2 1 25 2 2 1 2 1 1 0 1 0 0 1 0 0 1 2 1 12 2 17 3 5 4 1 1 35 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 48 4 36 5 5 3 1 1 47 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 1 42 2 72 5 4 2 3 3 30 3 1 1 2 1 0 0 1 0 0 1 0 0 0 2 1 10 4 21 5 2 2 3 1 27 3 2 1 1 2 0 0 0 1 1 0 0 0 1 1 1 33 4 43 3 3 2 4 3 23 3 2 1 1 1 0 0 1 0 0 1 0 0 1 2 2 12 4 24 3 4 1 3 3 36 3 1 1 2 1 1 0 1 0 0 1 0 0 0 1 1 21 2 18 1 3 2 2 1 25 3 2 1 2 1 0 0 1 0 0 1 0 0 1 2 4 24 4 39 1 5 2 2 3 41 3 2 1 2 1 0 1 1 0 1 0 0 0 0 1 4 12 2 18 1 3 3 2 1 24 3 1 1 1 1 0 0 1 0 1 0 0 1 0 1 3 10 4 8 1 5 3 4 4 63 3 2 1 2 1 1 0 1 0 0 0 0 0 1 1 2 18 2 19 5 2 2 3 1 27 3 1 1 1 1 0 0 1 0 1 0 0 0 1 2 1 12 4 21 1 3 3 2 2 30 3 2 1 1 1 1 0 1 0 0 1 0 0 1 1 1 12 2 7 1 3 4 2 1 40 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 2 12 2 6 1 3 3 2 3 30 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 2 12 4 19 1 1 3 2 3 34 3 2 1 2 1 0 1 1 0 0 1 0 0 0 1 1 12 4 35 1 3 2 2 1 29 3 2 1 1 1 1 0 0 1 0 1 0 0 1 2 2 48 2 85 5 4 2 2 3 24 3 1 1 1 1 1 0 1 0 0 1 0 0 1 1 1 36 3 69 1 3 3 3 2 29 2 1 1 2 1 0 0 1 0 0 1 0 0 1 2 4 15 2 27 1 2 3 3 2 27 1 2 1 1 1 0 0 1 0 0 1 0 1 0 1 4 18 2 20 1 3 3 4 4 47 1 2 1 1 1 0 0 1 0 0 0 0 0 1 1 4 60 2 101 2 4 2 4 1 21 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 4 12 4 12 5 5 2 2 1 38 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 4 27 3 86 4 3 3 2 3 27 3 2 1 1 1 0 1 1 0 0 1 0 0 1 1 2 12 2 8 3 3 3 3 1 66 3 1 1 1 1 0 0 1 0 0 1 0 1 0 2 2 15 4 27 5 4 3 2 1 35 1 3 1 2 1 0 0 0 0 0 1 0 0 1 1 3 12 2 19 1 3 2 2 3 44 3 1 1 2 1 0 0 1 0 1 0 0 1 0 1 3 6 2 7 4 2 4 2 1 27 3 1 1 1 2 1 0 1 0 0 1 1 0 0 1 2 36 2 48 1 2 2 1 4 30 3 1 1 2 1 0 0 1 0 0 1 0 0 0 1 1 27 2 34 1 3 3 2 3 27 3 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 18 2 25 1 3 3 2 3 22 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 4 21 4 23 1 2 2 4 2 23 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 48 1 36 2 4 3 2 3 30 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 6 4 9 1 5 2 4 4 39 3 2 1 2 1 1 0 1 0 0 1 0 0 1 1 4 12 4 7 2 4 2 3 3 51 3 2 1 2 1 1 0 1 0 0 1 0 0 1 1 1 36 4 54 1 3 3 2 2 28 3 2 1 1 1 0 0 0 0 0 1 0 0 1 1 4 18 4 16 4 5 3 4 3 46 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 6 2 13 2 5 3 4 4 42 1 1 2 2 1 0 0 1 0 0 0 0 0 1 1 4 10 2 19 1 3 3 4 2 38 3 1 1 2 2 0 0 1 0 0 1 0 0 1 1 3 36 2 58 1 3 3 1 3 24 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 24 4 78 4 5 2 4 4 29 3 1 1 1 1 0 1 1 0 1 0 0 0 1 1 2 24 3 70 2 4 3 4 3 36 3 1 1 2 1 0 0 1 0 1 0 0 0 0 1 1 12 2 13 1 3 2 4 3 20 3 1 1 1 1 0 0 1 0 1 0 0 0 1 2 1 9 4 13 2 5 3 4 1 48 3 2 2 1 2 0 0 0 0 0 1 0 0 1 1 1 12 1 3 1 5 4 1 3 45 1 1 1 1 1 0 0 1 0 0 1 0 1 0 1 2 24 2 35 2 4 3 3 3 38 1 2 1 2 1 1 0 1 0 0 1 0 0 1 1 4 6 4 19 5 3 3 2 1 34 3 2 2 1 1 0 0 1 0 0 1 0 1 0 1 4 24 4 29 2 5 3 4 1 36 3 1 2 2 1 0 0 1 0 0 1 0 0 1 1 4 18 4 11 1 2 2 1 2 30 3 2 1 1 1 1 0 1 0 0 1 0 0 1 1 4 15 2 13 3 4 3 3 2 36 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 2 10 2 73 1 1 3 4 4 70 1 1 1 2 1 1 0 1 0 0 0 0 0 0 1 4 36 2 9 3 5 3 4 2 36 3 1 1 1 1 1 0 1 0 0 1 0 0 1 1 4 6 2 30 3 3 3 2 3 32 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 1 18 2 11 1 1 2 2 3 33 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 2 11 2 16 4 2 2 1 1 20 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 24 2 40 1 4 2 4 2 25 3 1 1 2 1 0 0 1 0 1 0 0 0 1 1 2 24 4 19 1 5 1 4 1 31 3 2 1 2 1 0 0 1 0 0 1 0 0 1 2 1 15 0 10 1 5 3 3 3 33 3 2 2 1 1 1 0 1 0 1 0 0 0 1 2 4 12 2 8 1 3 2 1 1 26 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 24 3 21 1 1 2 2 2 34 3 1 1 2 1 0 0 1 0 0 1 0 0 0 2 2 8 2 14 1 3 3 2 1 33 3 1 1 1 2 0 0 0 0 0 1 0 0 1 1 1 21 3 34 1 2 3 1 2 26 3 2 1 1 1 0 0 1 0 0 1 0 0 1 2 4 30 1 75 5 1 2 1 1 53 1 1 1 2 1 0 1 1 0 0 1 0 0 0 2 1 12 2 26 1 3 1 1 3 42 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 6 4 3 3 5 3 4 3 52 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 12 2 20 1 4 3 2 3 31 3 2 2 2 1 0 0 1 0 1 0 0 0 0 1 1 21 4 6 1 5 3 4 1 65 3 2 1 1 1 1 0 1 0 0 1 0 0 1 1 4 36 3 96 1 2 1 1 3 28 3 2 1 1 1 0 0 1 0 0 1 0 0 1 2 2 36 3 45 1 3 1 2 1 30 2 2 1 2 1 0 0 1 0 0 1 0 0 0 2 1 21 1 16 5 3 3 2 2 40 3 2 2 1 1 1 0 1 0 0 1 0 1 0 2 4 24 4 38 4 3 3 4 1 50 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 18 4 9 1 5 3 4 3 36 1 1 2 2 1 1 0 1 0 0 1 0 0 1 2 4 15 4 14 1 3 3 2 2 31 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 2 9 1 51 1 5 2 4 4 74 1 1 2 2 1 0 1 1 0 0 0 0 0 0 2 2 16 4 12 1 1 3 3 3 68 3 3 1 2 1 1 0 1 0 0 0 1 0 0 1 1 12 2 7 2 4 4 1 2 20 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 2 18 0 32 1 3 2 4 3 33 1 2 1 2 1 0 0 1 0 0 1 0 0 1 1 4 24 2 46 4 3 3 3 2 54 3 3 1 2 1 0 0 1 0 0 1 0 0 0 2 2 48 0 38 2 4 3 4 4 34 3 1 2 1 1 0 0 1 0 0 0 0 1 0 2 2 27 2 39 1 3 3 2 3 36 3 1 2 2 1 0 0 1 0 0 1 0 0 1 2 4 6 2 21 1 4 4 2 1 29 3 1 1 1 1 0 0 1 0 1 0 0 0 1 1 2 45 2 30 2 3 3 4 2 21 3 1 1 1 1 0 0 0 0 1 0 0 0 1 2 2 9 4 15 1 5 2 3 3 34 3 2 1 2 1 0 0 1 0 0 1 0 0 0 2 4 6 4 14 1 3 2 1 3 28 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 2 12 2 10 2 2 2 4 3 27 1 4 1 1 1 0 0 1 0 1 0 0 0 1 2 2 24 2 28 5 5 3 4 4 36 1 1 1 2 1 0 1 1 0 0 0 0 0 1 1 2 18 3 43 1 5 1 3 4 40 3 1 1 2 1 0 0 1 0 0 1 0 0 0 2 4 9 4 9 3 5 3 2 3 52 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 1 12 2 12 1 3 4 3 1 27 3 1 1 1 1 1 0 1 0 0 1 0 1 0 1 4 27 3 51 1 4 3 4 3 26 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 1 12 2 9 1 4 4 4 2 21 3 1 1 1 1 0 0 1 0 1 0 0 0 1 2 4 12 4 15 1 5 3 1 1 38 3 2 2 1 1 1 0 1 0 0 1 0 1 0 1 1 30 4 106 1 5 3 4 4 38 3 3 2 2 1 0 1 1 0 0 0 0 0 0 1 4 12 4 19 1 5 3 4 1 43 3 3 1 2 1 0 0 1 0 0 1 0 0 1 1 2 12 4 14 1 4 3 3 2 26 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 24 2 66 1 3 4 2 3 21 2 1 1 1 1 0 0 1 0 0 1 0 1 0 1 4 12 2 14 4 4 3 2 2 55 3 1 1 1 2 0 1 1 0 0 1 0 0 1 1 4 9 4 31 5 3 3 2 1 33 3 2 2 1 1 0 0 1 0 0 1 0 0 1 1 4 36 2 38 5 5 2 4 1 45 3 1 1 2 1 0 0 1 0 0 1 0 1 0 1 1 27 0 53 1 1 3 4 2 50 2 2 1 2 1 0 0 1 0 0 1 0 0 1 2 3 30 3 19 1 5 3 4 1 66 3 1 1 2 1 0 0 1 0 0 1 0 0 0 2 4 36 4 33 5 5 3 2 3 51 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 6 4 9 5 4 2 3 2 39 3 2 1 1 1 0 0 1 0 0 1 0 1 0 1 1 18 0 31 1 4 3 1 2 31 1 1 1 2 1 0 0 1 0 0 1 0 0 1 1 3 36 2 39 1 3 3 2 1 23 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 1 24 2 30 1 3 1 2 1 24 3 1 1 1 1 0 0 1 0 1 0 0 1 0 1 4 10 2 14 1 3 2 4 3 64 3 1 1 2 1 1 0 1 0 0 1 0 0 1 1 2 12 2 6 1 2 4 1 1 26 1 1 1 1 1 0 0 0 0 0 1 0 1 0 1 1 12 2 12 5 3 2 4 2 23 1 1 1 2 1 0 0 1 0 1 0 0 0 1 1 4 12 2 7 1 3 3 2 1 30 1 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 24 3 30 5 3 3 4 1 32 3 2 2 2 1 0 0 1 0 0 1 0 0 1 1 4 15 2 47 1 3 3 2 3 30 3 1 1 2 1 0 1 1 0 0 1 0 0 1 1 4 36 0 26 1 3 3 2 3 27 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 2 48 2 110 4 4 3 2 4 27 1 2 1 2 1 0 0 0 1 0 1 0 0 1 2 1 12 2 79 1 5 3 4 4 53 3 1 1 2 1 0 0 1 0 0 0 0 0 0 2 4 9 2 15 1 4 3 2 3 22 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 1 24 2 31 1 2 3 1 4 22 1 1 1 1 1 0 0 1 0 0 0 0 0 1 1 3 36 2 42 1 3 3 2 3 26 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 4 9 2 25 3 5 3 4 4 51 3 1 1 1 1 1 0 1 0 0 0 0 1 0 1 4 12 2 21 2 4 3 1 4 35 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 18 2 9 1 3 4 2 1 25 3 1 1 1 1 0 0 0 0 0 1 0 1 0 1 4 4 4 15 1 4 3 1 1 42 3 3 2 1 1 0 0 1 0 0 1 0 1 0 1 1 24 2 18 1 1 3 2 3 30 2 1 2 1 1 0 0 1 0 0 1 0 0 0 2 2 6 2 146 5 1 3 2 2 23 3 1 1 2 1 1 0 1 0 0 1 1 0 0 2 2 21 2 28 2 5 1 2 3 61 1 2 1 1 1 0 0 1 0 1 0 0 1 0 2 4 12 4 13 1 3 2 2 2 35 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 1 30 2 25 1 5 3 3 2 39 3 1 2 1 1 0 0 0 0 0 1 0 0 1 1 1 24 2 9 5 5 2 2 3 29 1 1 1 1 1 1 0 1 0 0 1 0 0 1 2 4 6 2 16 1 4 3 2 2 51 3 1 2 1 1 0 0 1 0 0 1 0 0 1 1 1 48 0 46 1 5 3 4 4 24 3 2 2 1 1 0 1 1 0 0 0 0 0 1 2 4 12 4 12 1 3 2 2 1 27 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 12 1 34 3 3 2 3 1 35 3 1 2 1 1 0 0 1 0 0 1 0 1 0 1 4 24 2 13 1 4 3 1 1 25 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 4 12 4 7 1 5 3 4 1 52 3 3 1 1 1 0 0 1 0 0 1 0 0 1 1 4 6 0 12 2 3 3 1 4 35 1 1 1 1 2 1 0 1 0 1 0 0 0 1 1 3 24 2 19 1 3 3 2 1 26 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 18 2 4 1 1 2 4 1 22 3 1 1 1 1 0 0 0 1 1 0 0 0 1 2 1 6 4 7 4 4 2 4 1 39 3 2 1 2 1 1 0 1 0 0 1 0 1 0 1 3 12 2 23 1 3 2 2 3 46 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 2 30 2 22 1 3 2 2 4 24 1 1 1 1 1 1 0 0 0 0 1 0 0 1 2 4 24 3 42 2 3 3 3 2 35 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 2 9 2 20 5 4 3 1 3 24 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 60 3 74 5 3 3 1 1 27 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 4 24 4 27 1 3 3 2 1 35 3 2 1 1 1 0 0 1 0 0 1 0 1 0 1 1 12 1 21 1 3 1 1 4 29 3 1 1 1 1 0 0 1 0 0 0 0 0 1 2 4 15 2 38 2 2 2 4 3 23 3 1 1 2 1 0 1 1 0 0 1 0 0 1 1 4 11 4 12 2 1 2 4 1 57 3 3 1 1 1 0 0 1 0 0 1 0 1 0 1 1 12 2 17 1 3 3 2 1 27 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 24 2 16 1 5 2 4 3 55 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 18 4 53 1 5 3 4 4 36 3 3 1 2 1 1 0 1 0 0 0 0 0 0 1 4 12 4 27 1 5 2 4 4 57 1 3 1 1 1 0 0 1 0 0 0 0 1 0 1 4 10 4 12 1 5 3 4 1 32 3 2 2 1 2 1 0 1 0 0 1 0 1 0 1 2 15 2 8 1 5 3 3 3 37 3 1 2 1 1 0 0 1 0 0 1 0 0 1 2 4 36 4 63 5 5 3 4 1 36 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 24 2 15 1 2 2 3 3 38 2 1 1 2 1 0 0 1 0 0 1 0 0 1 1 1 14 2 90 1 5 1 4 2 45 3 1 1 2 2 1 0 1 0 0 1 0 0 0 2 4 24 2 10 5 5 3 2 3 25 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 18 2 27 5 4 3 3 2 32 3 1 1 1 2 1 0 1 0 0 1 0 0 1 1 4 12 4 14 3 4 2 4 3 37 3 1 1 2 1 0 0 1 0 1 0 0 0 1 1 2 48 1 122 5 1 3 4 4 36 3 1 1 2 1 1 0 0 1 0 0 0 0 0 1 2 48 2 31 1 4 3 4 1 28 3 2 1 1 1 0 0 1 0 0 1 0 0 1 2 1 30 2 120 1 2 1 1 4 34 3 1 1 2 1 0 0 1 0 0 1 0 1 0 2 4 9 2 27 1 3 3 2 1 32 3 1 2 1 1 0 0 1 0 0 1 0 0 1 1 4 18 4 24 1 3 2 2 3 26 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 1 12 2 13 5 5 1 4 2 49 3 1 1 2 1 0 0 1 0 0 1 0 1 0 1 4 6 2 46 1 2 2 4 2 32 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 4 24 2 19 2 3 3 4 3 29 3 1 1 2 1 0 0 1 0 1 0 0 0 0 1 4 15 4 34 4 5 3 4 4 23 3 2 1 2 1 0 1 1 0 1 0 0 0 1 1 4 12 2 16 1 3 3 2 1 50 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 3 18 1 14 5 4 3 4 3 49 1 1 1 1 1 0 0 1 0 0 1 0 1 0 1 4 15 4 15 5 5 3 4 2 63 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 24 4 39 2 2 1 2 3 37 3 1 1 2 1 1 0 1 0 0 1 0 0 1 1 1 47 2 107 1 2 2 1 1 35 3 1 1 2 1 1 0 1 0 0 1 0 1 0 1 1 48 2 48 1 4 3 3 2 26 3 1 2 1 1 0 1 1 0 0 1 0 0 1 1 2 48 3 76 2 1 3 4 4 31 3 1 1 2 1 0 0 1 0 0 0 0 0 0 1 2 12 2 11 1 3 2 4 1 49 3 2 1 2 1 0 0 0 0 0 1 0 0 1 1 1 24 3 10 1 2 4 4 1 48 2 1 1 1 1 0 0 1 0 0 1 0 0 1 2 4 12 2 11 1 3 4 2 1 26 3 1 1 2 2 0 0 1 0 0 1 0 0 1 1 2 36 2 94 1 2 4 4 3 28 3 1 1 2 1 0 1 1 0 1 0 0 0 0 2 1 24 4 64 1 5 2 4 4 44 3 2 2 2 1 0 1 1 0 0 0 0 0 0 1 3 42 4 48 1 5 3 4 4 56 3 1 1 1 1 0 1 1 0 0 0 0 0 1 1 4 48 4 76 5 5 1 2 3 46 1 2 2 1 1 0 0 1 0 0 1 0 0 0 1 2 48 2 100 1 2 2 2 3 26 3 1 1 2 1 0 0 1 0 0 1 0 0 1 2 4 12 2 47 5 2 2 4 3 20 3 1 1 1 1 0 1 1 0 1 0 0 0 1 1 4 10 2 13 5 5 3 2 2 45 3 1 1 1 2 1 0 0 1 0 1 0 1 0 1 4 18 2 25 1 3 3 4 1 43 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 21 4 27 4 4 3 2 3 32 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 4 6 2 7 1 1 2 4 1 54 3 1 1 2 1 1 0 1 0 0 1 1 0 0 1 2 36 0 38 1 3 2 1 3 42 3 1 1 2 1 0 0 1 0 0 1 0 0 1 2 3 24 4 13 5 4 3 2 1 37 1 2 2 1 1 1 0 1 0 0 1 0 1 0 2 1 10 4 10 1 4 3 3 2 49 3 2 1 2 1 1 0 0 1 0 1 0 0 1 1 4 48 4 101 3 3 3 2 4 44 1 1 1 1 1 1 0 1 0 0 0 0 0 1 2 4 6 2 15 4 3 1 2 1 33 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 30 2 48 5 4 2 4 2 24 2 1 1 1 1 0 1 1 0 1 0 0 1 0 1 1 12 2 7 2 2 4 3 4 33 3 1 1 2 1 0 0 1 0 0 1 0 1 0 2 2 8 2 12 1 3 2 4 1 24 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 2 9 2 3 1 3 4 4 1 22 3 1 1 1 1 1 0 1 0 1 0 0 1 0 1 2 48 2 54 5 1 3 4 4 40 1 1 1 2 1 0 0 1 0 0 0 1 0 0 1 4 24 2 55 2 3 3 1 3 25 2 1 1 1 1 0 0 1 0 0 1 0 0 1 1 3 24 2 37 1 2 2 4 3 26 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 12 2 7 1 4 4 3 3 25 1 1 1 1 1 1 0 1 0 0 1 0 1 0 2 3 4 2 15 5 2 3 2 1 29 3 1 2 1 2 1 0 1 0 0 1 0 1 0 1 1 36 1 27 1 5 3 4 3 31 1 1 1 1 1 0 0 1 0 0 1 0 0 1 2 1 12 2 7 1 3 3 3 2 38 3 1 2 1 1 0 0 0 0 0 1 0 1 0 1 2 24 2 44 5 3 2 4 2 48 3 1 1 2 1 0 0 1 0 0 1 0 1 0 1 4 12 4 7 1 3 3 2 3 32 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 1 15 3 36 1 5 2 4 2 27 3 2 1 1 1 0 0 1 0 0 1 0 1 0 1 2 30 4 42 1 1 4 2 3 28 3 2 1 1 1 1 0 1 0 0 1 0 0 0 2 1 24 2 19 1 2 1 3 2 32 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 1 24 2 29 1 4 3 1 4 34 3 1 1 2 1 0 1 1 0 0 0 0 0 0 1 1 18 2 27 4 3 3 2 3 28 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 18 4 10 1 3 2 3 1 36 3 2 1 1 1 1 0 1 0 0 1 0 0 1 1 1 8 4 34 1 4 3 4 1 39 3 2 1 1 2 1 0 1 0 0 1 0 1 0 1 4 12 4 58 5 5 3 4 2 49 3 1 1 2 1 0 0 1 0 1 0 0 0 1 1 4 24 2 15 4 4 2 3 3 34 3 1 2 2 1 1 0 1 0 0 1 0 0 1 1 3 36 2 45 1 5 3 2 3 31 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 6 2 11 1 5 3 4 3 28 3 1 2 1 1 0 0 1 0 0 1 0 0 1 1 1 24 4 66 1 1 3 4 4 75 3 2 1 2 1 0 1 1 0 0 0 0 0 0 1 4 18 4 19 2 3 2 2 1 30 3 2 1 1 1 0 0 1 0 0 1 0 0 1 2 2 60 2 74 2 2 2 2 2 24 3 1 1 1 1 1 0 1 0 0 1 0 0 0 2 4 48 4 116 2 3 2 4 3 24 1 2 1 1 1 0 1 1 0 1 0 0 1 0 2 1 24 0 41 1 5 3 4 4 23 1 2 2 1 1 0 0 1 0 1 0 0 0 1 2 1 6 4 34 1 3 1 4 1 44 3 1 1 2 1 0 0 1 0 1 0 0 0 0 2 2 13 2 21 1 2 2 4 2 23 3 1 1 1 1 0 0 0 0 0 1 0 1 0 1 1 15 2 13 5 3 2 2 3 24 3 1 1 1 1 0 0 1 0 1 0 0 0 1 2 1 24 2 42 1 3 3 4 2 28 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 10 2 15 1 3 1 2 3 31 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 2 24 4 57 1 2 2 4 4 24 3 2 1 2 1 0 0 1 0 0 0 0 0 1 1 1 21 2 36 1 4 2 4 3 26 3 1 1 1 1 0 0 1 0 1 0 0 1 0 1 2 18 2 32 3 2 4 3 1 25 3 1 1 1 1 0 0 1 0 1 0 0 0 1 1 2 18 2 44 1 5 3 1 1 33 1 1 1 2 1 0 0 0 1 0 1 0 0 0 1 3 10 2 39 1 2 3 1 2 37 3 1 2 1 1 1 0 0 0 0 1 0 1 0 1 4 15 4 15 1 3 2 2 3 43 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 2 13 4 9 1 2 3 4 1 23 3 2 1 1 1 0 0 0 0 0 1 0 0 1 1 2 24 2 38 3 1 2 4 4 23 3 1 1 1 1 0 0 1 0 1 0 1 0 0 1 4 6 3 17 2 3 3 2 1 34 3 2 1 1 1 0 0 1 0 0 1 0 1 0 1 2 9 4 11 4 5 3 3 4 32 3 2 2 1 1 0 0 1 0 0 0 0 0 1 2 4 9 2 12 1 2 2 4 1 23 3 1 1 2 1 0 0 1 0 1 0 0 0 1 1 2 9 2 10 1 3 2 2 3 29 3 1 1 1 2 0 0 1 0 0 1 0 0 1 2 4 18 4 32 5 1 3 4 4 38 3 1 1 2 1 0 1 1 0 0 1 0 0 0 1 1 12 0 62 1 3 3 2 2 28 3 2 1 2 1 0 0 1 0 1 0 0 0 1 2 4 10 2 7 3 5 3 4 4 46 3 1 1 2 1 0 0 1 0 0 0 0 0 1 1 2 24 2 12 1 2 3 2 1 23 2 1 1 1 1 1 0 1 0 0 1 0 1 0 2 4 12 4 23 5 5 3 4 1 49 3 1 1 2 1 0 0 0 1 0 1 0 0 1 1 4 36 3 45 1 3 3 2 3 26 3 2 1 2 1 0 0 1 0 0 1 0 0 0 2 4 12 2 8 1 3 4 2 1 28 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 30 2 24 1 4 2 4 1 23 3 1 1 1 1 0 0 1 0 1 0 0 0 1 2 2 18 2 12 5 3 3 4 4 61 3 1 1 1 1 0 0 1 0 0 0 0 0 1 1 3 12 2 34 5 5 3 3 3 37 3 1 1 1 1 0 0 1 0 0 1 0 0 0 1 3 12 3 22 1 3 2 2 3 36 2 2 1 2 1 1 0 1 0 0 1 0 0 1 1 4 6 2 18 1 3 4 2 2 21 3 1 1 1 1 0 0 1 0 1 0 0 0 1 1 1 18 2 25 1 1 3 1 3 25 3 1 1 1 1 0 0 1 0 0 1 1 0 0 2 4 12 2 15 1 4 3 4 3 36 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 4 18 4 38 1 4 3 1 3 27 3 2 1 1 1 0 1 1 0 0 1 0 0 1 1 1 18 2 36 1 2 2 4 3 22 3 1 1 1 1 0 0 1 0 1 0 0 0 1 1 1 36 2 34 1 5 3 2 3 42 3 1 2 1 1 0 0 1 0 0 1 0 0 1 2 2 18 2 30 1 4 2 4 1 40 3 1 1 1 1 0 0 1 0 1 0 0 0 1 1 4 36 2 31 5 3 3 4 1 36 3 1 1 1 1 1 0 1 0 0 1 0 0 1 1 4 18 4 61 1 5 3 4 3 33 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 4 10 4 21 1 2 2 3 1 23 3 2 1 1 1 0 0 1 0 1 0 0 0 1 1 4 60 4 138 5 5 3 4 4 63 1 1 1 2 1 1 0 1 0 0 0 0 0 0 1 2 60 1 148 2 5 2 4 4 60 1 2 1 2 1 0 0 1 0 0 0 0 0 0 2 1 48 1 77 1 4 2 4 3 37 3 1 1 1 1 0 0 0 0 1 0 0 0 1 2 4 18 3 23 1 1 4 3 1 34 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 7 3 8 5 5 3 4 4 36 3 1 1 1 1 0 0 1 0 0 0 0 0 1 1 2 36 2 143 1 5 3 2 4 57 3 1 1 2 1 1 0 1 0 0 0 0 0 0 2 4 6 4 4 2 3 2 4 3 52 3 2 1 1 1 1 0 1 0 0 1 0 1 0 1 1 20 2 22 5 4 3 4 3 39 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 18 2 130 1 1 2 4 4 38 3 1 1 2 1 0 1 1 0 0 0 0 0 0 2 4 22 2 13 5 4 2 4 2 25 3 1 1 1 1 1 0 1 0 1 0 0 0 1 1 3 12 2 13 1 2 3 1 1 26 3 1 1 1 1 1 0 1 0 0 1 0 0 1 1 4 30 3 43 2 3 3 2 2 26 3 2 1 1 1 0 0 1 0 0 1 0 1 0 1 4 18 4 22 1 3 2 1 3 25 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 18 2 11 5 2 2 2 1 21 3 1 1 2 1 0 0 1 0 1 0 0 0 1 1 2 18 4 74 1 1 3 4 2 40 2 2 1 2 1 0 0 1 0 0 1 0 0 0 1 2 15 4 23 3 3 3 4 3 27 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 9 2 14 1 4 2 2 3 27 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 18 2 18 1 3 4 2 2 30 3 1 1 2 1 1 0 1 0 0 1 0 0 0 1 2 12 2 10 4 2 2 4 1 19 3 1 1 1 1 0 0 1 0 1 0 0 1 0 1 1 36 2 32 1 4 3 4 4 39 1 1 2 2 1 1 0 1 0 0 0 0 0 0 1 1 6 4 20 1 4 2 4 3 31 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 9 4 24 1 1 3 3 3 31 3 1 1 1 1 0 0 1 0 0 1 0 0 0 1 2 39 3 118 2 4 3 3 4 32 3 1 1 2 1 0 0 1 0 1 0 0 0 1 1 1 12 2 26 1 1 2 4 4 55 3 1 1 1 1 0 0 1 0 0 0 0 0 0 1 1 36 4 23 1 3 4 2 2 46 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 2 12 2 12 1 5 1 1 1 46 3 2 1 1 1 1 0 1 0 1 0 0 0 1 2 4 24 4 15 4 3 2 1 1 43 3 2 1 1 1 0 0 1 0 0 1 0 1 0 1 4 18 2 15 1 2 4 4 1 39 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 18 4 19 5 3 4 4 1 28 1 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 24 3 86 1 2 3 2 3 27 1 2 1 2 1 0 0 1 0 0 1 0 0 1 2 4 14 3 8 1 3 3 2 3 27 3 2 1 1 1 1 0 1 0 0 1 0 1 0 1 2 18 3 29 5 5 3 4 3 43 3 1 2 1 1 1 0 1 0 0 1 0 0 1 1 2 24 2 20 1 2 4 1 2 22 3 1 1 2 1 0 0 1 0 0 1 0 0 1 2 4 24 4 22 5 4 3 4 3 43 3 2 2 2 1 0 1 1 0 0 1 0 0 1 1 1 15 2 11 1 2 4 2 1 27 3 1 1 1 2 0 0 1 0 0 1 0 0 1 1 4 24 2 32 3 5 1 2 3 26 3 1 1 2 1 0 0 1 0 0 1 0 0 0 1 3 12 4 9 3 4 4 2 1 28 3 3 1 2 1 1 0 1 0 0 1 0 0 1 2 2 24 2 20 1 5 2 4 3 20 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 4 33 4 73 1 4 3 2 3 35 3 2 1 2 1 0 1 1 0 0 1 0 0 0 1 4 12 4 23 1 1 3 2 3 42 2 2 1 2 1 0 0 1 0 0 1 0 0 0 2 4 10 2 16 3 3 3 2 4 40 3 1 2 1 2 1 0 1 0 1 0 0 1 0 1 1 24 2 14 5 3 2 2 2 35 3 1 1 1 1 1 0 1 0 0 1 0 0 1 2 4 36 4 58 1 5 3 2 2 35 3 2 2 2 1 0 1 1 0 0 1 0 0 1 1 1 12 2 26 1 2 3 1 1 33 3 1 2 1 1 1 0 1 0 0 1 0 1 0 2 1 18 3 85 5 3 2 2 3 23 3 2 1 2 1 0 0 1 0 1 0 0 0 1 1 4 21 2 28 3 4 2 2 3 31 1 1 1 1 1 1 0 1 0 0 1 0 0 0 1 2 18 2 10 5 3 2 2 2 33 3 1 1 1 1 1 0 1 0 0 1 0 0 1 2 4 15 2 32 4 4 2 3 3 20 3 1 1 1 1 1 0 1 0 1 0 0 0 1 1 2 12 2 20 5 3 3 2 3 30 3 1 1 1 1 0 1 1 0 0 1 0 0 1 1 2 12 4 10 1 4 3 3 1 47 3 2 2 1 1 1 0 1 0 0 1 0 1 0 1 4 21 3 16 2 4 3 3 1 34 3 2 1 1 1 0 0 1 0 0 1 0 0 0 1 2 12 2 28 5 5 2 2 2 25 1 1 1 2 1 0 0 1 0 0 1 0 0 1 2 2 18 2 28 1 3 4 3 3 21 3 1 1 2 1 0 1 1 0 1 0 0 0 1 1 4 28 4 27 1 5 3 2 3 29 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 18 4 11 4 3 3 3 1 46 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 9 2 13 1 5 3 4 3 20 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 18 4 12 1 1 2 4 4 55 3 3 2 1 1 0 0 1 0 0 0 1 0 0 2 4 5 2 34 1 4 3 4 1 74 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 2 24 2 113 1 3 3 3 3 29 1 2 1 2 1 0 0 0 1 0 1 0 0 0 2 1 6 4 19 1 1 3 4 4 36 3 3 1 2 1 0 0 1 0 0 0 0 0 0 1 4 24 4 21 1 3 1 2 1 33 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 1 9 2 21 1 3 3 2 1 25 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 12 2 15 5 3 4 1 1 25 3 1 1 2 1 0 0 1 0 0 1 0 0 1 2 4 6 2 7 3 4 4 4 1 23 3 1 1 1 1 0 0 1 0 1 0 0 1 0 1 4 24 4 13 4 5 2 4 1 37 3 2 1 2 1 1 0 1 0 0 1 0 0 1 1 1 42 4 34 1 1 3 4 3 65 3 2 1 1 1 0 0 0 1 0 1 1 0 0 1 3 12 1 6 1 2 2 1 1 26 3 1 1 1 1 0 0 1 0 0 1 1 0 0 2 4 12 2 19 1 5 3 4 3 39 3 1 1 2 1 1 0 1 0 0 1 0 0 0 1 1 12 2 16 1 3 2 3 2 30 3 1 1 1 1 0 0 0 1 0 1 0 0 1 1 2 20 3 26 1 3 3 3 3 29 1 2 1 2 1 0 0 1 0 0 1 0 0 1 1 4 12 2 7 1 5 3 4 3 41 1 1 2 1 1 0 0 1 0 0 1 0 1 0 2 2 48 4 51 1 3 2 3 3 30 3 1 1 2 1 0 0 1 0 0 1 0 0 0 2 4 9 4 12 5 5 2 4 2 41 3 2 1 1 1 0 0 1 0 1 0 0 1 0 1 1 36 2 18 1 2 2 4 3 34 3 1 1 2 1 1 0 1 0 0 1 0 0 1 2 2 7 2 26 1 3 3 2 1 35 3 1 1 1 1 0 0 0 0 0 1 0 0 1 1 3 12 2 14 5 5 2 4 1 55 3 1 1 2 1 0 0 1 0 0 1 0 0 0 1 2 15 3 15 4 3 4 3 2 61 2 2 1 1 1 0 0 1 0 0 1 0 0 1 2 4 36 4 111 5 3 3 2 3 30 3 1 1 2 1 0 1 1 0 0 1 0 0 0 1 4 6 2 5 1 3 2 1 1 29 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 12 0 28 1 5 3 4 2 34 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 24 2 27 1 5 3 4 3 35 3 1 1 2 1 0 1 1 0 0 1 0 0 0 1 1 24 2 48 1 4 3 3 2 31 3 1 1 2 1 1 0 0 1 0 1 0 0 1 2 4 24 2 27 1 2 2 1 4 29 3 1 1 2 1 0 1 1 0 0 1 0 0 0 1 1 11 4 39 1 3 3 2 1 36 3 2 2 1 1 1 0 1 0 1 0 0 0 1 1 1 12 2 34 1 5 3 4 4 35 3 1 1 2 1 0 1 1 0 0 0 0 0 1 2 1 6 2 3 1 2 2 1 1 27 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 18 2 46 1 2 3 2 3 32 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 1 36 2 36 1 3 3 2 2 37 3 1 2 1 1 0 0 0 0 0 1 0 0 1 1 1 15 2 17 1 2 3 3 1 36 3 1 1 1 1 1 0 1 0 0 1 0 0 1 1 2 12 2 30 1 2 2 1 1 34 3 1 1 1 1 0 0 1 0 1 0 0 0 0 1 2 12 2 8 5 5 3 4 2 38 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 18 2 20 1 4 3 1 3 34 2 2 1 2 1 0 0 1 0 0 1 0 0 1 1 1 24 2 29 1 3 3 4 4 63 1 1 2 2 1 0 1 0 0 0 1 0 0 1 1 1 24 3 17 1 2 2 2 3 29 3 1 1 2 1 0 0 1 0 1 0 0 1 0 2 4 48 3 72 5 5 3 3 3 32 1 2 2 1 1 0 0 1 0 0 1 0 0 1 1 4 33 3 28 1 3 2 2 3 26 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 4 24 3 47 1 4 3 3 3 35 3 2 1 2 1 0 1 1 0 0 1 0 1 0 1 2 24 2 31 2 2 4 2 3 22 3 1 1 2 1 0 0 1 0 1 0 0 0 1 2 1 6 2 4 1 2 2 4 2 23 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 1 9 2 7 1 3 3 3 3 28 3 1 1 1 1 1 0 1 0 0 1 0 1 0 2 4 6 2 12 5 1 3 4 2 36 3 1 2 2 1 0 0 1 0 0 1 0 0 0 1 2 18 4 12 1 3 4 2 3 33 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 1 18 0 31 1 2 2 4 2 26 3 1 1 1 1 0 0 1 0 1 0 0 0 1 2 4 39 2 26 3 3 3 4 3 24 3 1 1 1 1 0 1 1 0 0 1 0 0 1 1 3 24 2 52 1 4 3 2 3 25 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 12 2 10 2 4 3 4 1 39 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 1 15 4 15 1 5 3 4 3 44 3 2 2 2 1 0 0 1 0 0 1 0 0 1 1 2 12 4 36 1 3 2 1 1 23 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 2 24 2 12 1 2 3 1 2 26 3 1 1 1 1 1 0 1 0 0 1 0 0 1 1 1 30 2 36 4 5 2 4 2 57 3 2 1 2 1 0 0 1 0 1 0 0 0 1 1 4 15 3 10 4 4 2 2 2 30 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 12 4 12 3 3 3 4 1 44 3 1 1 2 1 1 0 1 0 0 1 0 0 1 1 2 6 3 12 1 1 3 4 2 47 3 1 1 2 1 1 0 1 0 0 1 0 0 0 2 4 12 2 31 1 3 3 4 3 52 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 4 24 2 38 1 5 2 4 4 62 3 1 1 2 1 1 0 0 1 0 0 0 0 1 1 4 10 2 14 2 3 3 2 1 35 3 1 1 1 2 1 0 1 0 1 0 0 1 0 1 4 6 2 35 1 3 3 3 2 26 3 1 1 1 1 1 0 0 0 1 0 0 0 1 1 4 12 4 19 1 5 3 2 4 26 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 2 27 0 83 1 5 2 4 4 42 3 2 1 2 1 0 0 1 0 0 0 0 0 0 2 4 6 4 12 2 3 2 1 2 27 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 2 6 2 4 5 5 3 4 2 38 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 12 4 21 1 3 3 2 1 39 3 2 2 1 2 1 0 1 0 1 0 0 1 0 1 1 24 2 30 5 3 4 4 3 20 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 2 36 2 90 2 2 3 1 4 29 3 1 1 2 1 0 0 0 1 1 0 0 0 0 2 4 24 4 16 1 4 3 3 2 40 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 2 18 2 13 1 5 4 2 1 32 3 1 1 1 1 0 0 0 0 0 1 0 1 0 1 3 6 4 13 2 5 1 4 3 28 3 2 2 2 1 1 0 1 0 0 1 0 0 1 1 1 24 2 31 1 2 2 1 2 27 3 1 1 1 1 1 0 1 0 0 1 0 0 1 2 1 36 2 55 1 5 3 4 4 42 3 1 2 1 1 0 1 1 0 0 0 0 0 1 1 3 9 2 11 2 5 1 4 1 49 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 24 4 12 2 2 3 4 4 38 1 2 2 1 1 0 0 1 0 0 1 0 0 1 2 1 24 2 12 1 2 2 4 2 24 3 1 1 1 1 1 0 1 0 1 0 0 0 1 2 4 10 2 13 5 3 3 4 2 27 3 1 1 1 1 1 0 0 0 0 1 0 1 0 2 3 15 4 24 3 3 3 2 3 36 3 1 1 2 1 0 1 1 0 0 1 0 0 1 1 2 15 1 68 2 1 3 2 2 34 3 1 2 2 1 1 0 1 0 0 1 0 0 0 2 4 24 2 14 1 3 4 2 2 28 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 39 2 86 2 5 3 2 3 45 3 1 1 2 1 0 1 1 0 0 1 0 0 0 1 1 12 2 8 1 4 3 2 1 26 3 1 1 1 1 1 0 1 0 0 1 0 0 1 2 4 36 2 47 1 3 3 2 4 32 3 1 1 2 1 0 1 1 0 0 0 0 0 0 1 3 15 2 27 1 4 3 4 2 26 3 1 1 2 1 0 0 1 0 1 0 0 0 1 1 2 12 3 6 1 3 4 4 1 20 3 2 1 1 1 0 0 0 1 1 0 0 0 1 1 4 24 2 23 5 2 3 1 2 54 3 1 1 1 1 1 0 1 0 0 1 0 0 1 1 1 6 4 6 1 4 2 3 2 37 3 2 1 1 2 1 0 1 0 0 1 0 0 1 1 1 6 4 14 1 2 3 4 1 40 3 1 2 1 2 1 0 1 0 0 1 0 1 0 1 4 36 4 71 1 2 2 4 2 23 3 2 1 2 1 0 0 1 0 1 0 0 0 1 2 1 6 2 12 2 5 3 2 2 43 3 1 1 2 1 1 0 1 0 0 1 0 0 1 1 4 6 4 7 5 5 3 4 4 36 3 2 1 1 1 0 0 1 0 0 0 0 0 1 1 4 24 4 55 1 5 3 4 4 44 3 2 1 1 1 0 0 1 0 0 0 0 0 1 1 1 18 2 32 1 3 2 2 1 24 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 1 48 0 71 1 3 3 4 4 53 3 2 2 1 1 0 0 1 0 0 0 0 0 1 2 4 24 2 35 2 4 2 4 3 23 3 1 1 1 1 0 1 1 0 0 1 0 0 1 1 2 18 2 11 1 3 2 4 1 26 3 1 2 1 1 0 0 0 0 0 1 0 1 0 1 2 26 2 80 1 2 3 3 3 30 3 2 1 1 1 0 1 1 0 0 1 0 0 1 1 4 15 4 15 2 3 2 3 3 31 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 4 4 15 1 4 3 1 1 42 3 2 2 1 1 0 0 1 0 0 1 0 1 0 1 1 36 2 23 1 3 1 4 3 31 3 1 1 1 1 0 0 1 0 1 0 0 0 1 2 1 6 2 7 1 2 3 4 1 41 3 1 2 2 1 1 0 1 0 0 1 0 1 0 1 2 36 2 23 1 4 3 1 3 32 3 2 2 1 1 0 0 1 0 0 1 0 0 1 1 2 15 2 26 2 3 2 4 3 28 3 2 1 2 1 1 0 1 0 1 0 0 0 1 2 4 12 3 15 1 3 4 4 1 41 3 1 1 1 1 0 1 1 0 1 0 0 0 1 1 4 24 2 13 2 4 4 3 2 26 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 4 24 2 31 5 2 3 2 3 25 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 3 21 4 23 1 2 1 1 3 33 3 1 1 1 1 0 0 1 0 1 0 0 0 1 2 1 6 2 14 5 1 2 3 2 75 3 1 1 2 1 1 0 1 0 0 1 0 0 0 1 2 18 4 36 1 5 2 4 2 37 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 1 48 2 78 1 5 3 4 4 42 1 1 1 1 1 1 0 1 0 0 0 0 0 0 2 3 18 2 30 1 2 2 1 2 45 2 1 1 1 1 0 0 1 0 0 1 0 1 0 1 2 12 2 15 1 2 4 1 1 23 3 1 1 1 1 0 0 1 0 1 0 0 0 1 2 4 24 3 20 1 5 3 4 4 60 3 2 1 2 1 1 0 1 0 0 0 0 0 1 1 1 30 2 64 5 5 3 4 2 31 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 3 18 2 29 1 3 3 1 1 34 3 1 2 1 1 0 0 1 0 0 1 0 1 0 2 4 12 4 13 1 5 3 4 1 61 3 2 1 1 1 1 0 1 0 0 1 0 1 0 1 1 24 3 13 1 1 3 2 1 43 3 2 2 1 1 1 0 1 0 0 0 0 0 1 2 4 24 4 20 1 3 2 4 3 37 3 1 1 2 1 1 0 1 0 0 1 0 0 1 1 4 24 2 16 1 4 3 1 3 32 1 1 2 1 1 0 0 1 0 0 1 0 0 1 1 1 12 1 6 1 3 2 4 1 24 1 1 1 1 1 0 0 1 0 0 1 0 1 0 2 4 48 4 89 5 4 3 1 4 35 3 2 1 2 1 0 1 1 0 0 0 0 0 1 1 4 12 4 10 5 4 2 4 1 23 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 6 1 18 3 5 3 4 2 45 1 1 2 1 1 0 0 1 0 0 1 0 1 0 1 1 48 2 70 1 4 4 1 1 34 3 2 1 2 1 0 0 0 0 0 1 0 0 1 2 2 12 4 20 2 2 3 1 3 27 3 1 1 1 1 1 0 1 0 0 1 0 0 1 1 2 9 2 12 1 4 2 4 2 67 3 2 1 2 1 0 0 1 0 0 1 0 0 0 1 2 12 2 13 1 2 3 1 3 22 2 1 1 1 1 0 0 1 0 0 1 0 0 1 2 2 18 0 23 2 2 2 3 3 28 3 2 1 1 1 1 0 1 0 0 1 0 0 1 2 4 21 0 50 5 3 2 4 2 29 1 2 1 2 1 1 0 1 0 0 1 0 0 1 2 1 24 1 36 1 4 3 4 3 27 1 1 1 1 1 0 0 1 0 0 1 0 0 1 2 2 18 4 19 1 2 3 2 1 31 3 2 1 1 1 0 0 1 0 0 1 0 1 0 2 1 24 2 30 5 5 3 4 4 49 1 1 2 2 1 0 1 1 0 0 0 0 0 1 1 1 24 1 15 1 4 3 4 3 24 1 1 1 1 1 0 0 0 0 1 0 0 1 0 2 3 6 3 7 1 2 2 1 2 29 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 36 2 124 5 3 3 4 4 37 3 1 1 2 1 1 0 1 0 0 0 0 0 1 2 2 24 3 47 5 3 3 2 2 37 1 2 1 2 1 0 0 1 0 0 1 0 0 0 1 2 24 3 16 2 4 2 2 2 23 3 2 1 2 1 0 0 1 0 1 0 0 0 1 1 1 12 2 14 1 4 1 3 3 36 3 1 1 1 1 1 0 1 0 0 1 0 0 1 2 4 24 4 26 4 5 3 2 3 34 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 48 2 40 5 4 3 1 3 41 3 2 2 2 1 0 0 1 0 0 1 0 0 1 1 1 48 2 68 1 3 2 2 3 31 3 1 1 2 1 0 0 1 0 0 1 0 0 1 2 1 24 2 32 1 2 2 4 1 23 3 1 1 2 1 0 0 1 0 1 0 0 1 0 2 4 30 4 60 1 4 3 2 3 38 3 1 1 1 1 0 0 0 1 0 1 0 0 1 1 4 24 2 54 5 1 2 4 2 26 3 1 1 2 1 0 1 1 0 1 0 0 0 0 1 1 15 2 8 1 3 2 4 2 22 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 2 9 2 11 1 5 3 4 3 27 3 2 1 1 1 0 0 1 0 0 1 0 1 0 1 4 15 4 28 1 4 2 3 3 24 1 2 1 1 1 0 0 0 1 0 1 0 0 1 1 2 12 2 29 1 4 2 1 1 27 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 24 4 19 5 3 2 2 3 33 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 2 36 4 28 1 2 1 4 3 27 3 2 1 1 1 1 0 1 0 0 1 0 0 1 2 4 24 2 9 1 2 4 3 3 27 3 2 1 1 1 0 0 1 0 0 1 0 1 0 1 2 18 4 11 1 5 3 3 1 30 1 2 1 1 1 1 0 0 0 0 1 0 0 1 2 2 12 4 31 1 2 3 3 1 49 1 2 2 1 1 1 0 1 0 0 1 0 1 0 1 4 9 2 14 1 3 2 2 1 26 3 1 1 1 1 0 0 1 0 1 0 0 0 1 1 2 36 2 24 1 2 3 1 4 33 3 1 1 1 1 0 0 1 0 1 0 0 1 0 2 4 12 2 21 5 5 2 4 4 52 3 1 1 2 1 1 0 1 0 0 0 0 0 0 1 1 18 2 20 1 3 2 4 1 20 1 1 1 1 1 0 0 1 0 1 0 0 0 1 2 1 9 4 28 1 3 3 2 1 36 3 2 2 1 1 1 0 1 0 1 0 0 0 1 1 1 12 2 13 1 3 3 1 2 21 3 1 1 1 1 0 0 0 0 0 1 0 1 0 1 1 18 2 12 1 3 4 3 1 47 3 1 1 2 1 0 0 1 0 0 1 0 1 0 2 1 12 4 22 1 5 3 3 2 60 3 2 1 1 1 0 0 1 0 0 1 0 0 1 2 1 12 4 4 1 4 2 3 1 58 3 4 1 2 1 0 0 1 0 0 1 0 1 0 1 2 24 3 20 5 3 2 4 3 42 3 2 1 2 1 1 0 1 0 1 0 0 0 1 1 4 21 2 16 4 5 2 4 1 36 1 1 1 1 1 0 0 1 0 0 1 0 1 0 1 2 24 2 27 1 3 2 4 2 20 3 1 1 2 1 1 0 1 0 1 0 0 1 0 2 1 24 1 14 5 5 3 3 3 40 2 1 1 2 1 0 0 1 0 0 1 0 0 0 2 2 6 1 9 2 2 2 1 2 32 2 1 1 1 1 1 0 1 0 0 1 0 1 0 2 1 24 2 14 1 4 2 4 3 23 3 2 1 1 1 1 0 1 0 1 0 0 0 1 2 2 24 0 42 1 3 3 4 1 36 3 3 1 2 1 0 0 1 0 0 1 0 1 0 2 4 18 4 28 1 4 3 2 2 31 1 2 1 1 1 1 0 1 0 0 1 0 0 1 2 4 24 3 39 1 3 3 2 4 32 3 1 1 1 1 0 0 1 0 0 0 0 0 1 1 2 7 2 23 1 2 2 1 1 45 3 1 1 1 1 0 0 0 0 0 1 0 0 1 1 2 9 2 9 1 3 2 1 2 30 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 2 24 1 18 1 4 2 4 4 34 1 1 1 1 1 0 0 1 0 0 0 0 1 0 2 4 36 2 33 1 3 2 2 3 28 3 1 1 2 1 0 0 1 0 0 1 0 0 0 2 3 10 2 13 1 2 2 2 2 23 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 24 1 28 3 3 3 4 1 22 2 1 1 2 1 0 0 1 0 0 1 0 0 1 1 4 24 4 45 1 3 3 2 1 74 3 1 1 2 1 0 0 1 0 0 1 0 0 0 1 2 36 2 27 2 3 2 4 4 50 3 1 1 1 1 0 0 0 1 0 0 0 0 1 2 4 18 2 21 1 2 3 1 1 33 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 15 2 13 5 5 3 4 4 45 1 1 2 1 1 0 1 1 0 0 0 0 0 1 1 1 12 2 7 2 1 2 3 2 22 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 3 10 2 12 2 5 2 4 4 48 3 1 2 1 1 1 0 1 0 0 0 0 1 0 2 1 21 2 34 4 2 2 2 3 29 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 24 1 36 1 3 2 4 3 22 1 1 1 1 2 0 1 0 0 1 0 0 0 1 1 4 18 3 18 1 4 2 1 1 22 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 2 48 0 122 5 3 3 2 3 48 1 1 1 2 1 0 0 1 0 0 1 0 0 0 1 2 60 3 92 5 3 3 2 4 27 3 1 1 1 1 0 0 1 0 0 0 0 0 0 1 1 6 4 37 1 3 3 3 1 37 3 3 2 1 1 1 0 1 0 1 0 0 0 1 1 2 30 2 34 2 3 2 4 3 21 3 1 1 1 1 0 0 0 1 1 0 0 0 1 2 4 12 2 6 1 3 1 2 1 49 3 1 1 1 1 1 0 1 0 0 1 0 1 0 1 2 21 4 37 1 4 3 3 2 27 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 18 4 15 1 3 3 2 2 32 1 2 1 1 1 1 0 1 0 0 1 0 0 1 2 4 48 2 39 5 3 1 2 1 38 1 1 1 1 1 0 0 1 0 0 1 0 0 1 2 1 12 2 19 1 2 2 1 3 22 3 1 1 1 1 0 0 1 0 1 0 0 0 1 1 1 18 2 26 1 3 3 4 4 65 3 2 1 1 1 0 0 1 0 0 0 0 0 1 2 4 15 2 20 5 5 3 2 3 35 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 3 6 2 21 1 3 3 2 1 41 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 9 1 14 2 4 3 3 4 29 3 1 1 1 1 1 0 1 0 0 1 0 0 1 2 4 42 4 40 3 3 3 4 1 36 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 4 9 2 38 5 5 3 4 1 64 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 1 24 2 37 1 3 2 4 3 28 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 18 1 16 1 3 3 3 3 44 1 1 1 1 1 0 0 1 0 0 1 0 0 1 2 2 15 2 14 5 2 3 1 2 23 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 9 2 20 1 2 2 2 3 19 3 2 1 1 1 0 0 0 1 1 0 0 0 1 2 2 24 2 14 1 2 2 4 3 25 3 1 1 2 1 1 0 1 0 0 1 0 1 0 2 4 12 2 14 1 5 3 4 2 47 1 3 2 2 1 0 0 1 0 0 1 0 0 1 1 4 24 2 14 3 4 2 1 3 28 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 60 3 157 1 4 3 4 3 21 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 4 12 2 15 1 2 2 3 3 34 3 1 2 1 1 0 0 1 0 0 1 0 0 1 1 1 42 3 44 1 4 3 2 2 26 1 2 2 2 1 0 0 1 0 0 1 0 0 1 2 1 18 2 8 1 1 2 1 1 27 3 1 1 1 1 0 0 1 0 0 1 1 0 0 2 2 15 2 13 1 5 3 4 3 38 3 2 1 1 1 0 0 1 0 0 1 0 1 0 1 4 15 2 46 2 3 3 2 2 40 3 1 1 2 1 0 0 1 0 0 1 0 0 0 2 4 24 4 19 1 4 4 2 3 33 3 2 1 2 1 0 0 0 0 0 1 0 0 1 1 1 18 4 19 1 4 4 1 2 32 3 2 1 2 1 0 0 1 0 0 1 0 0 0 1 4 36 3 80 5 2 3 4 3 27 3 2 1 2 1 0 0 1 0 1 0 0 0 1 2 1 30 0 46 1 3 1 2 1 32 3 2 1 1 1 0 0 0 0 0 1 0 0 1 1 4 12 2 14 3 3 2 2 2 26 3 1 1 1 1 1 0 1 0 0 1 0 0 1 2 3 24 2 9 1 4 3 3 4 38 1 1 2 1 1 1 0 1 0 0 0 0 0 1 2 1 12 2 7 1 3 3 4 3 40 3 1 2 1 1 0 0 1 0 1 0 0 1 0 2 1 48 2 75 1 4 3 1 4 50 3 1 1 2 1 0 0 1 0 0 0 0 0 0 1 2 12 2 19 1 3 3 2 2 37 3 1 1 1 1 0 0 1 0 0 1 0 1 0 2 1 24 2 23 1 5 3 1 1 45 3 1 1 1 1 1 0 0 1 0 1 0 0 1 2 2 36 3 81 2 5 3 4 3 42 3 4 1 2 1 1 0 1 0 0 1 0 0 0 2 4 24 4 23 1 4 3 3 3 35 3 2 1 2 1 0 1 1 0 0 1 0 0 1 1 1 14 2 40 1 1 3 4 4 22 3 1 1 1 1 1 0 1 0 0 0 0 0 1 1 2 12 2 9 1 5 3 4 3 41 1 1 2 1 1 1 0 1 0 0 1 0 1 0 2 4 48 2 102 5 4 3 3 3 37 2 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 30 0 42 1 3 2 1 3 28 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 2 18 4 64 1 5 3 1 4 41 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 3 12 2 13 1 3 4 4 1 23 3 1 1 1 1 0 0 1 0 1 0 0 0 1 1 1 12 2 9 5 3 4 2 3 23 3 1 1 1 1 1 0 1 0 0 1 0 0 1 2 4 21 2 22 1 5 3 2 1 50 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 2 6 3 10 1 1 3 1 2 35 2 2 1 2 1 0 0 1 0 0 1 0 0 0 1 3 6 4 10 1 3 2 4 2 50 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 4 24 4 63 1 1 3 2 4 27 1 2 1 2 1 0 0 0 1 0 1 0 0 0 1 2 30 1 35 4 3 3 2 3 34 2 1 2 2 1 0 0 1 0 0 1 0 0 1 1 4 48 1 36 1 3 2 1 1 27 2 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 12 4 48 1 5 3 4 2 43 3 2 1 2 1 1 0 0 1 1 0 0 0 1 2 3 30 4 30 1 5 3 4 2 47 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 24 4 41 2 3 3 3 2 27 3 2 1 2 1 0 0 1 0 0 1 0 1 0 1 4 36 2 57 2 4 3 2 3 31 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 4 60 2 104 1 5 3 4 2 42 3 1 1 2 1 1 0 1 0 0 1 0 0 0 1 4 6 4 21 3 3 4 2 3 24 3 1 1 1 1 1 0 1 0 0 1 0 0 1 1 4 21 3 26 3 2 3 2 1 41 1 1 2 1 1 0 0 1 0 0 1 0 1 0 2 4 30 4 45 1 4 2 4 3 26 3 1 1 2 1 0 0 1 0 1 0 0 0 0 1 4 24 4 52 1 5 3 4 3 33 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 72 2 56 2 3 4 2 3 24 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 1 24 2 24 1 5 3 4 1 64 1 1 1 1 1 0 0 1 0 1 0 0 1 0 1 4 18 2 15 1 2 2 1 1 26 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 6 2 15 1 2 2 2 4 56 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 12 2 23 5 3 3 4 4 37 3 1 1 2 1 0 0 1 0 0 0 0 0 1 1 4 15 3 15 1 3 4 3 1 33 1 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 24 4 51 1 2 4 3 4 47 3 3 1 2 1 0 0 1 0 0 0 0 0 1 1 2 36 3 99 2 4 3 3 2 31 3 2 2 2 1 0 0 1 0 0 1 0 1 0 1 4 60 2 65 5 3 3 4 4 34 3 1 2 2 1 1 0 1 0 0 0 0 0 1 1 3 10 4 13 5 4 3 2 2 27 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 2 36 3 29 2 5 3 3 4 30 3 1 1 1 1 1 0 1 0 0 0 0 0 1 1 4 9 2 28 2 5 3 4 3 35 3 1 1 2 1 0 0 0 1 0 1 0 0 1 1 1 12 2 37 4 3 3 3 2 31 3 1 2 1 1 1 0 1 0 0 1 0 0 1 1 1 15 4 10 1 3 1 3 2 25 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 2 15 2 26 2 3 2 2 1 25 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 2 24 2 29 2 2 3 1 3 29 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 6 4 47 5 2 3 3 1 44 3 2 2 1 1 1 0 1 0 0 1 0 1 0 1 4 24 2 23 1 4 3 2 3 28 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 4 6 2 12 3 3 3 4 2 50 3 1 1 1 1 0 1 1 0 1 0 0 0 1 1 2 12 2 11 1 4 3 3 1 29 3 2 1 1 2 0 0 0 0 0 1 0 0 1 1 4 12 4 9 1 1 2 2 2 38 3 1 1 1 1 1 0 1 0 0 1 1 0 0 1 4 18 4 18 1 3 3 2 3 24 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 3 15 2 19 1 5 3 4 3 40 3 1 1 2 1 0 0 1 0 1 0 0 0 0 1 4 12 2 11 3 3 2 4 3 29 3 1 1 1 1 0 0 1 0 1 0 0 1 0 2 1 48 4 63 1 5 3 4 4 46 3 2 1 2 1 0 1 1 0 0 0 0 0 1 2 3 24 2 14 2 5 2 2 4 47 3 1 1 2 1 0 0 1 0 0 0 0 0 1 1 2 30 3 25 2 5 3 2 2 41 2 2 1 1 1 0 0 1 0 0 1 0 0 1 1 2 27 2 25 1 2 2 1 2 32 3 1 2 2 1 0 0 1 0 0 1 0 0 1 1 4 15 2 53 3 5 2 4 4 35 3 1 1 1 1 1 0 1 0 0 0 0 0 1 1 2 48 2 66 2 4 3 2 2 24 3 1 1 1 1 1 0 1 0 0 1 0 0 1 2 2 12 0 30 1 2 2 3 2 25 3 2 1 1 1 0 0 1 0 1 0 0 0 1 2 2 9 2 12 1 5 2 4 1 25 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 9 2 21 1 3 3 2 1 37 3 1 2 1 1 0 0 1 0 0 1 0 1 0 1 4 18 4 6 3 5 3 3 2 32 1 2 1 2 1 0 0 1 0 0 1 0 0 0 1 1 6 1 12 1 5 2 4 4 35 3 1 1 1 1 0 0 1 0 0 0 0 0 1 2 4 21 2 25 5 5 3 4 1 46 3 1 1 2 1 0 1 1 0 0 1 0 0 0 1 1 9 4 11 1 3 3 4 1 25 3 2 1 1 1 0 0 1 0 0 1 0 1 0 1 2 60 2 140 1 4 3 2 4 27 3 1 1 2 1 1 0 1 0 0 1 0 0 0 2 4 30 4 76 5 5 3 4 3 63 3 2 1 1 1 0 1 1 0 0 1 0 0 1 1 4 30 4 31 5 5 3 2 3 40 3 2 2 2 1 0 0 1 0 0 1 0 0 1 1 4 18 2 15 1 3 3 2 4 32 3 1 1 2 1 0 0 1 0 0 0 0 0 0 1 3 24 4 31 5 3 3 2 3 31 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 2 20 0 61 2 5 4 4 3 31 1 2 1 2 1 0 1 1 0 0 1 0 0 1 1 3 9 0 13 1 2 3 2 3 34 3 2 1 2 1 0 0 1 0 0 1 0 0 0 2 2 6 1 4 4 2 2 2 2 24 1 1 2 1 1 0 0 1 0 1 0 0 0 1 2 1 12 2 12 1 3 2 2 1 24 3 1 1 1 1 1 0 1 0 0 1 0 1 0 2 2 9 2 8 3 3 2 3 1 66 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 4 27 2 26 1 3 2 3 1 21 3 1 1 1 1 1 0 1 0 1 0 0 0 1 2 4 6 4 2 4 3 2 2 1 41 1 2 1 1 1 1 0 1 0 0 1 0 1 0 1 4 15 4 13 3 3 4 2 2 47 3 2 1 1 1 0 0 1 0 0 1 0 1 0 1 1 18 2 19 1 3 2 4 3 25 1 2 1 1 1 0 0 1 0 1 0 0 0 1 2 2 48 1 64 1 5 2 3 4 59 3 1 1 1 1 0 0 1 0 1 0 0 0 1 2 3 24 4 13 4 3 1 4 1 36 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 2 24 3 64 1 2 3 2 3 33 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 24 2 20 1 3 3 4 1 21 3 1 2 1 1 0 0 1 0 1 0 0 1 0 2 2 8 2 8 1 4 2 2 1 44 3 1 1 1 1 0 0 0 0 0 1 0 1 0 1 4 24 2 26 4 3 2 4 3 28 3 1 1 2 1 0 1 1 0 1 0 0 0 1 1 4 4 4 34 1 4 2 1 1 37 3 1 2 1 1 1 0 1 0 0 1 0 0 1 1 2 36 1 40 5 2 2 2 4 29 1 1 1 1 1 0 0 1 0 0 1 1 0 0 1 2 24 2 116 1 3 2 4 3 23 3 2 1 1 1 0 1 1 0 1 0 0 0 0 2 1 18 2 44 2 3 3 4 3 35 3 1 2 2 1 1 0 1 0 0 1 0 1 0 1 4 6 4 68 1 4 3 3 4 45 3 2 2 2 1 1 0 1 0 0 1 0 0 0 1 2 30 0 43 2 3 2 4 3 26 3 2 1 1 1 0 0 1 0 1 0 0 1 0 2 1 24 1 23 2 4 3 3 3 32 1 1 1 1 1 1 0 1 0 0 1 0 0 1 1 2 10 1 10 1 3 3 4 1 23 2 1 1 1 1 0 0 1 0 0 1 0 1 0 1 4 21 2 32 5 5 3 3 2 41 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 1 24 1 25 3 3 3 4 1 22 2 1 1 2 1 0 0 1 0 0 1 0 0 1 1 1 39 4 142 5 4 3 4 2 30 3 2 1 2 1 0 0 1 0 0 1 0 0 0 1 1 13 4 18 1 2 3 1 2 28 1 2 1 1 1 0 0 1 0 0 1 0 1 0 1 1 15 2 25 1 1 2 4 3 23 3 1 1 1 1 1 0 1 0 1 0 0 0 1 1 1 12 2 13 1 2 2 1 1 37 3 1 1 1 1 1 0 1 0 0 1 0 1 0 2 4 21 2 52 5 3 3 3 3 26 3 1 1 1 1 0 1 1 0 0 1 0 0 1 1 4 15 2 30 1 4 3 2 3 33 3 1 1 1 1 0 1 1 0 0 1 0 0 1 1 1 6 2 4 1 5 2 1 2 49 1 1 1 2 1 0 0 1 0 0 1 0 0 1 1 1 18 2 10 1 2 2 2 3 23 3 1 1 1 1 1 0 1 0 0 1 0 1 0 2 2 12 2 8 2 4 2 4 1 23 3 1 1 1 1 0 0 1 0 1 0 0 1 0 1 4 30 4 58 1 4 2 2 3 25 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 12 3 16 4 5 3 4 4 55 3 2 2 1 1 0 0 1 0 0 0 0 0 1 2 1 24 2 13 5 4 2 4 4 32 3 1 1 1 1 1 0 1 0 1 0 0 0 1 2 3 6 4 13 1 3 3 1 1 74 3 3 2 1 2 1 0 1 0 0 1 1 0 0 1 3 15 4 13 5 3 3 4 4 39 3 2 1 2 1 0 0 1 0 0 0 0 0 1 2 4 24 2 14 1 3 3 2 1 31 3 1 1 2 1 1 0 0 0 0 1 0 0 1 1 1 12 4 7 1 5 3 3 2 35 3 2 1 1 1 1 0 1 0 0 1 0 0 1 2 4 15 4 50 5 5 2 4 3 59 3 1 1 2 1 1 0 1 0 0 1 0 0 1 1 1 18 4 21 1 3 2 4 1 24 3 2 1 1 1 0 0 1 0 1 0 0 0 1 2 1 12 2 22 1 3 3 3 2 24 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 4 21 4 127 5 5 3 4 4 30 3 1 1 2 1 1 0 1 0 0 0 0 0 0 2 4 24 4 25 2 4 4 3 2 27 3 2 1 2 1 1 0 1 0 0 1 0 0 1 1 2 12 2 12 1 5 4 3 1 40 1 2 1 1 1 0 0 0 0 0 1 0 1 0 1 1 30 2 31 1 2 1 4 2 31 3 1 1 1 1 0 0 1 0 0 1 0 1 0 2 4 10 2 29 5 2 2 4 1 31 3 1 1 1 1 0 1 1 0 1 0 0 0 1 1 2 12 4 36 1 5 3 4 3 28 3 3 1 2 1 0 0 1 0 1 0 0 0 1 1 4 12 4 17 1 5 3 4 1 63 3 2 1 2 1 0 0 1 0 0 1 0 1 0 1 1 24 2 28 5 5 2 4 1 26 3 1 1 1 1 0 1 1 0 1 0 0 0 1 1 1 36 4 81 1 3 2 2 4 25 3 2 1 2 1 0 0 1 0 0 1 0 0 0 2 4 21 4 33 1 5 3 4 3 36 3 1 1 2 1 0 1 1 0 0 1 0 0 0 1 4 24 4 22 2 5 3 4 2 52 1 2 1 1 1 0 0 1 0 0 1 0 0 1 1 3 12 4 15 3 1 3 4 4 66 1 3 1 1 1 1 0 1 0 0 0 1 0 0 1 1 24 2 14 5 3 2 4 1 25 3 1 1 1 1 1 0 1 0 1 0 0 0 1 2 4 36 4 35 1 4 3 4 3 37 3 2 1 2 1 1 0 1 0 0 1 0 0 1 1 1 18 2 35 1 4 2 1 1 25 3 1 1 1 1 0 0 0 0 0 1 0 0 1 1 4 36 4 57 4 5 3 2 3 38 3 2 1 2 1 0 1 1 0 0 1 0 0 0 1 2 18 2 39 1 1 2 4 3 67 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 39 4 49 1 4 3 2 1 25 3 2 1 1 1 0 0 0 0 0 1 0 0 1 2 4 24 4 19 4 5 3 4 1 60 3 1 1 2 1 1 0 1 0 0 1 0 0 1 1 2 12 0 14 1 3 3 2 1 31 3 1 1 2 1 0 0 1 0 0 1 0 1 0 1 2 12 2 8 2 2 2 2 2 23 1 1 1 1 1 1 0 1 0 0 1 0 1 0 2 2 20 2 65 5 1 1 4 1 60 3 1 1 2 1 0 1 1 0 0 1 0 0 0 1 2 18 2 19 4 3 3 2 2 35 3 1 1 2 1 0 0 1 0 0 1 0 1 0 1 4 22 2 27 3 5 3 4 3 40 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 48 4 28 5 5 3 3 3 38 3 2 2 2 1 0 1 1 0 0 1 0 0 1 1 2 48 3 62 1 5 3 4 4 50 3 1 1 1 1 0 0 1 0 0 0 0 0 1 2 1 40 4 60 1 3 3 3 4 27 1 1 1 2 1 0 0 1 0 0 1 0 0 1 2 2 21 2 12 1 5 2 4 2 39 3 1 2 1 1 0 0 1 0 0 1 0 0 1 2 4 24 2 63 5 5 3 4 3 41 3 1 2 2 1 0 1 1 0 0 1 0 0 0 1 4 6 4 12 5 3 4 2 2 27 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 3 24 2 29 1 5 1 4 4 51 3 1 1 1 1 0 0 1 0 0 0 0 0 1 1 4 24 2 31 3 5 3 3 4 32 3 1 1 2 1 0 0 1 0 1 0 0 0 1 1 4 9 2 23 2 2 2 4 2 22 3 1 1 1 1 0 0 1 0 1 0 0 0 1 1 1 18 2 75 5 5 3 4 2 51 3 1 2 2 1 0 1 1 0 0 0 0 0 1 2 4 12 4 13 1 2 2 4 2 22 3 2 1 1 1 0 0 1 0 1 0 0 1 0 1 4 24 3 7 5 5 4 4 3 54 3 2 1 2 1 1 0 1 0 0 1 0 0 1 1 2 9 2 15 5 2 3 2 1 35 3 1 1 1 1 1 0 1 0 0 1 1 0 0 1 4 24 4 16 1 5 3 4 4 54 3 2 2 1 1 0 0 1 0 0 0 0 0 1 1 2 18 4 18 1 5 2 4 1 48 1 2 1 2 1 0 0 0 0 1 0 0 1 0 1 1 20 4 43 1 5 2 4 2 24 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 12 4 10 5 5 3 4 3 35 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 2 12 2 75 5 1 2 2 1 24 3 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 36 2 93 1 4 3 1 3 24 3 1 1 2 1 1 0 1 0 0 1 0 0 1 2 2 6 2 6 1 2 4 3 1 26 3 1 1 1 2 0 0 1 0 0 1 0 1 0 1 4 12 4 9 5 5 3 4 1 65 3 4 1 1 1 0 0 1 0 0 1 0 0 1 1 2 42 1 93 1 1 3 2 4 55 1 1 1 2 1 0 1 1 0 0 0 0 0 0 1 2 15 0 18 1 2 2 1 1 26 3 2 1 1 1 1 0 1 0 1 0 1 0 0 2 2 8 2 9 1 2 4 2 1 26 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 2 6 2 5 1 4 4 3 1 28 1 1 1 1 1 0 0 0 0 0 1 0 1 0 1 1 36 4 96 1 4 3 4 3 24 3 2 1 2 1 0 1 1 0 0 1 0 0 1 2 1 48 2 31 1 3 3 4 3 54 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 1 48 2 39 1 4 3 4 4 46 3 1 2 1 1 1 0 1 0 0 0 0 0 1 2 2 36 3 74 1 3 2 2 2 54 3 1 1 1 1 1 0 1 0 1 0 0 0 1 1 4 6 2 13 3 3 1 4 1 62 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 6 4 16 1 4 2 2 3 24 3 2 1 2 1 0 0 1 0 1 0 0 0 1 1 1 36 2 159 1 1 1 3 3 43 3 1 1 1 1 0 0 0 1 0 1 0 0 0 1 1 18 2 13 1 3 4 3 1 26 1 1 1 1 1 0 0 1 0 0 1 0 0 1 2 4 12 2 11 1 3 4 2 1 27 3 2 1 2 1 1 0 1 0 0 1 0 0 1 1 3 12 2 30 1 3 4 1 3 24 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 36 2 27 1 5 3 2 2 41 1 1 2 1 1 0 0 1 0 0 1 0 0 1 2 1 8 4 7 1 5 3 4 1 47 3 2 1 1 1 1 0 1 0 0 1 0 1 0 1 4 18 4 38 1 2 1 2 3 35 3 2 1 2 1 0 0 1 0 0 1 0 0 0 1 1 21 4 16 1 5 4 3 3 30 3 2 1 2 1 1 0 1 0 0 1 0 0 1 1 1 18 4 40 1 5 2 4 1 33 1 3 1 2 1 1 0 1 0 1 0 0 0 1 2 4 18 0 42 1 3 3 2 3 36 2 2 2 1 1 0 0 1 0 0 1 0 0 1 2 1 36 2 83 5 5 3 4 4 47 3 1 1 1 1 0 1 1 0 0 0 0 0 1 2 2 48 3 67 5 3 3 4 4 38 3 1 2 2 1 0 0 1 0 0 0 0 0 1 1 4 24 3 24 3 3 3 2 3 44 3 2 2 2 1 0 0 1 0 0 1 0 0 1 1 1 18 2 12 1 2 2 3 3 23 3 1 1 2 1 1 0 1 0 1 0 0 0 1 2 1 45 0 118 1 5 3 4 3 29 3 2 1 1 1 0 0 1 0 1 0 0 0 1 2 2 24 2 51 5 5 2 4 3 42 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 3 15 2 23 1 2 2 3 1 25 3 1 1 1 1 0 0 1 0 0 1 0 1 0 2 1 12 0 11 1 3 3 4 3 48 1 2 1 1 1 1 0 1 0 0 1 0 0 1 2 4 12 2 9 5 3 2 2 3 21 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 4 2 6 1 2 2 3 1 23 3 1 2 1 1 0 0 1 0 1 0 0 1 0 1 1 24 4 30 1 5 3 4 2 63 3 2 1 2 1 0 1 1 0 0 1 0 0 1 1 4 24 4 26 1 5 4 3 1 46 3 2 1 1 1 0 0 0 1 0 1 0 0 1 1 1 36 2 52 1 4 3 2 2 29 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 4 21 3 30 1 3 3 2 1 28 2 2 1 1 1 0 1 1 0 0 1 0 1 0 1 4 18 2 19 1 2 2 4 1 23 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 4 24 1 16 1 4 3 4 3 50 1 1 1 2 1 0 0 1 0 0 1 0 0 1 1 4 18 2 34 1 5 3 4 2 47 1 3 2 2 1 0 0 1 0 0 1 0 0 1 1 2 21 2 40 5 4 3 3 3 35 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 4 18 2 68 5 3 3 4 3 68 3 2 1 1 1 1 0 1 0 1 0 0 0 1 2 4 24 2 12 1 2 4 2 1 28 3 1 1 1 1 1 0 1 0 0 1 0 0 1 1 1 9 2 14 1 4 3 4 1 59 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 12 2 7 1 5 3 4 1 57 2 1 1 1 1 0 0 1 0 0 1 0 1 0 2 1 20 4 22 1 3 4 2 2 33 1 2 1 1 2 1 0 0 0 1 0 0 0 1 2 4 24 4 40 5 4 3 4 2 43 3 2 1 2 1 0 1 1 0 0 1 0 0 1 1 4 15 4 15 1 3 3 4 4 35 3 2 1 2 1 0 0 1 0 0 0 0 0 1 1 1 18 1 14 1 4 3 4 4 32 3 2 2 1 1 1 0 1 0 0 0 0 1 0 2 4 36 3 109 1 5 3 2 3 45 3 2 2 2 1 1 0 1 0 0 1 0 0 1 1 4 24 2 15 2 2 4 3 1 33 3 1 1 2 1 1 0 1 0 0 1 0 0 1 1 4 10 2 9 5 4 2 3 2 40 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 4 15 4 33 1 3 3 2 4 28 3 1 1 2 1 0 0 1 0 0 0 0 0 1 1 1 15 2 40 1 3 2 2 2 29 3 1 1 2 1 1 0 1 0 0 1 0 0 1 2 4 9 2 36 2 3 3 2 1 26 3 1 2 1 2 1 0 0 0 1 0 0 0 1 1 4 24 4 58 4 3 3 2 1 27 3 2 1 1 1 0 1 1 0 0 1 0 0 1 1 4 18 3 22 1 3 4 2 3 28 3 1 1 2 1 0 0 1 0 0 1 0 0 1 2 1 24 2 24 1 2 2 4 1 35 3 1 1 2 1 0 0 1 0 0 1 0 0 1 2 4 27 4 45 4 2 3 2 1 32 2 2 2 2 1 0 0 1 0 0 1 0 1 0 1 4 10 2 22 1 3 3 2 1 25 1 1 1 1 1 0 0 1 0 1 0 0 1 0 2 4 15 2 22 3 3 2 4 3 20 3 1 1 1 1 0 0 1 0 1 0 0 0 1 1 1 18 2 24 1 2 2 1 3 27 2 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 12 4 33 1 5 3 4 2 42 2 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 36 2 74 5 5 3 2 2 37 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 1 12 2 7 1 5 2 4 2 24 3 1 1 1 1 0 0 1 0 1 0 0 0 1 1 4 36 3 77 3 4 2 4 3 40 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 3 6 4 13 1 5 3 4 1 46 3 2 2 1 2 1 0 1 0 0 1 0 0 1 1 1 24 4 14 2 4 3 1 1 26 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 4 15 2 9 5 2 2 1 1 24 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 12 2 36 1 3 3 2 2 29 3 1 2 1 1 0 0 0 1 0 1 0 1 0 1 2 11 4 13 4 3 2 4 3 40 3 2 1 1 1 1 0 1 0 0 1 0 0 1 1 1 18 1 19 1 2 3 4 4 36 1 1 1 2 1 0 0 0 1 0 0 0 0 0 1 4 36 2 36 1 5 3 2 3 28 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 9 2 14 1 2 3 2 4 27 3 1 1 2 1 1 0 1 0 0 0 0 0 0 2 4 30 4 67 5 4 3 3 2 36 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 24 2 78 1 4 3 3 3 38 3 1 1 2 1 0 1 1 0 0 1 0 0 0 1 4 24 2 93 5 3 1 4 4 48 3 1 1 2 1 0 1 1 0 0 0 0 0 1 1 2 30 4 22 5 5 3 4 1 36 3 2 1 1 1 1 0 1 0 0 1 0 0 1 1 4 18 4 11 1 1 2 4 3 65 3 2 1 1 1 0 0 1 0 0 1 1 0 0 1 2 24 2 41 1 4 1 3 3 43 3 1 1 2 1 0 0 1 0 0 1 0 0 1 2 1 12 2 8 1 2 2 4 2 53 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 2 24 4 28 5 4 3 3 4 34 3 2 2 2 1 0 0 1 0 0 1 0 0 1 1 2 48 2 157 1 3 3 2 3 23 3 1 1 2 1 0 0 1 0 0 1 0 0 1 2 4 36 4 66 1 5 3 4 3 34 3 2 1 2 1 1 0 1 0 0 1 0 0 0 1 4 28 1 78 5 2 3 4 1 40 1 2 2 2 1 0 1 0 0 1 0 0 0 1 1 1 27 4 24 1 5 3 4 3 43 2 4 2 2 1 0 0 1 0 0 1 0 0 0 1 4 15 4 18 1 5 3 4 3 46 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 1 12 4 22 1 3 3 4 2 38 1 2 1 1 2 1 0 1 0 0 1 0 1 0 1 2 36 4 58 1 3 3 4 3 34 3 2 1 2 1 0 1 1 0 0 1 0 0 1 1 4 18 4 12 5 3 3 3 2 29 3 2 1 2 1 0 0 1 0 0 1 0 0 1 1 4 36 3 89 5 4 3 2 3 31 2 1 2 2 1 0 1 1 0 0 1 0 0 0 1 1 21 2 26 1 2 2 4 2 28 3 1 1 2 1 0 0 1 0 1 0 0 0 0 1 4 12 4 16 4 4 2 2 2 35 3 1 1 1 2 0 0 1 0 0 1 0 0 1 1 4 15 2 22 5 4 2 4 1 33 1 1 1 1 1 0 0 1 0 1 0 0 1 0 1 1 18 2 42 1 3 3 3 3 42 3 1 1 1 1 0 0 0 1 0 1 0 0 1 2 1 16 4 26 1 5 3 4 2 43 1 1 1 2 1 1 0 0 0 1 0 0 0 1 2 4 20 4 35 5 2 1 4 1 44 3 2 1 2 1 1 0 1 0 0 1 0 0 1 1 4 36 4 105 5 5 3 4 4 42 3 2 1 1 1 0 1 1 0 0 0 0 0 1 1 4 15 2 14 5 3 4 2 1 40 3 1 1 2 1 0 0 1 0 1 0 0 0 1 1 4 24 2 13 1 5 3 1 1 36 3 1 1 2 1 0 0 1 0 0 1 0 0 0 1 1 12 2 11 1 3 3 2 1 20 3 1 2 2 1 0 0 1 0 1 0 0 0 0 1 1 21 2 38 5 4 3 2 1 24 3 1 1 1 2 1 0 0 1 0 1 0 1 0 1 2 36 2 37 5 3 4 2 3 27 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 15 3 36 1 2 2 2 2 46 3 2 1 1 1 0 1 1 0 0 1 0 1 0 1 2 9 2 32 5 3 2 2 1 33 3 1 1 1 1 1 0 1 0 0 1 0 1 0 1 4 36 3 45 1 3 2 4 1 34 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 2 24 4 47 1 2 2 4 3 25 1 1 1 1 1 0 0 1 0 0 1 0 1 0 2 2 30 2 30 5 5 2 4 3 25 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 4 11 2 21 4 5 1 2 1 28 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 1 24 1 32 1 3 3 2 2 31 3 1 1 2 1 0 0 1 0 1 0 0 0 1 2 2 48 0 184 1 3 2 2 2 32 1 1 1 2 2 0 0 1 0 0 1 0 0 0 2 4 10 2 28 2 3 3 2 1 32 3 1 2 1 1 0 1 0 1 0 1 0 0 1 1 1 6 2 149 1 5 3 4 4 68 1 1 1 2 1 1 0 1 0 0 1 0 0 0 2 1 24 2 24 2 1 1 1 2 33 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 1 24 2 33 1 5 3 2 2 39 3 1 1 2 1 0 0 1 0 1 0 0 0 0 2 4 18 4 18 1 3 2 2 4 28 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 48 3 127 3 4 3 1 3 37 3 1 1 2 1 0 0 1 0 0 1 0 0 0 1 1 9 2 14 1 2 2 4 2 22 3 1 1 1 1 0 0 1 0 1 0 0 0 1 2 2 12 2 20 1 4 3 4 2 30 3 1 2 2 1 1 0 1 0 1 0 0 0 1 1 1 24 1 69 1 2 1 1 2 55 1 1 1 2 1 0 0 1 0 0 1 0 0 1 2 1 12 1 7 1 2 3 2 3 46 1 2 1 2 1 1 0 1 0 0 1 0 0 1 2 1 18 4 10 1 2 2 4 2 21 3 1 1 1 1 0 0 1 0 1 0 0 0 1 1 1 48 2 103 1 4 3 4 4 39 2 3 2 2 1 0 1 1 0 0 0 0 0 1 2 4 30 2 19 5 5 3 4 3 58 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 1 12 3 13 1 3 3 2 1 43 3 2 2 1 1 1 0 1 0 0 1 0 1 0 1 1 24 2 17 1 2 3 1 2 24 3 1 1 1 2 0 0 0 1 0 1 0 1 0 1 2 9 2 17 1 2 2 2 3 22 3 1 1 2 1 0 0 1 0 0 1 0 0 1 2 4 9 4 12 1 3 3 1 1 30 3 2 1 1 1 1 0 1 0 0 1 0 0 1 1 4 12 4 5 3 5 3 4 2 42 3 2 2 2 1 0 0 1 0 0 1 0 0 1 1 1 12 2 15 1 3 2 1 3 23 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 30 3 19 2 2 3 3 4 30 2 2 1 1 1 0 0 1 0 0 1 0 0 0 2 3 9 2 7 1 3 2 2 1 28 3 1 1 1 1 0 0 1 0 0 1 0 1 0 2 2 6 2 21 1 2 4 3 3 30 3 1 1 2 1 0 0 1 0 1 0 0 0 0 1 2 60 2 63 1 3 3 4 4 42 3 1 1 1 1 0 0 1 0 0 0 0 0 1 2 4 24 4 68 5 3 3 4 2 46 3 2 2 2 1 0 1 1 0 0 1 0 0 0 1 4 12 2 35 5 2 3 3 2 45 3 1 2 2 1 1 0 1 0 0 1 0 0 0 1 4 10 2 15 1 3 3 2 1 31 3 1 2 1 2 1 0 1 0 0 1 0 1 0 1 4 24 2 9 5 4 3 2 3 31 2 1 1 2 1 0 0 1 0 0 1 0 0 1 1 4 4 4 15 1 4 3 1 1 42 3 3 2 1 1 1 0 1 0 0 1 0 1 0 1 1 15 2 18 1 2 2 1 2 46 3 1 1 1 1 0 0 0 0 1 0 0 0 1 1 2 48 0 84 3 2 2 1 3 30 3 2 1 1 1 1 0 1 0 0 1 0 0 1 1 1 24 1 33 3 2 3 4 4 30 3 1 2 2 1 0 0 1 0 0 0 0 0 1 2 4 12 2 29 5 1 3 4 4 38 3 1 1 2 1 1 0 1 0 0 1 0 0 0 1 4 18 2 15 1 2 4 1 2 43 3 1 2 1 1 0 0 0 1 0 1 0 1 0 2 4 24 2 36 2 5 3 4 3 31 3 2 1 1 1 0 0 1 0 0 1 0 0 1 2 2 18 4 36 1 1 4 3 3 40 3 3 2 2 1 0 0 1 0 0 1 1 0 0 1 1 36 3 21 1 4 3 1 3 24 3 2 1 2 1 0 0 1 0 0 1 0 0 1 2 2 24 2 41 3 2 2 4 3 28 3 1 1 1 1 0 1 1 0 1 0 0 0 1 2 4 36 2 110 1 1 2 2 3 26 3 2 1 2 1 0 0 1 0 0 1 0 0 0 2 1 12 2 19 1 3 2 4 2 29 3 1 1 2 1 1 0 0 0 0 1 0 0 1 1 1 24 4 12 4 5 2 4 2 57 3 2 1 2 1 0 0 1 0 1 0 0 0 0 1 3 30 4 37 5 5 3 4 2 49 2 2 1 1 1 0 0 1 0 0 1 0 1 0 1 2 9 4 12 1 5 3 4 1 37 3 3 1 1 1 0 0 1 0 0 1 0 1 0 1 1 28 2 40 1 3 3 2 3 45 3 1 1 1 1 1 0 1 0 0 1 0 1 0 2 2 24 2 31 2 5 3 4 4 30 3 1 1 1 1 0 0 1 0 0 0 0 0 1 1 4 6 4 17 1 5 4 2 1 30 3 2 1 1 1 0 0 1 0 1 0 0 0 1 1 2 21 3 24 1 3 1 4 2 47 3 2 1 1 1 1 0 1 0 0 1 0 0 1 1 4 15 2 36 5 3 3 2 4 29 3 1 1 1 1 1 0 1 0 0 1 0 0 1 1 4 24 2 24 3 5 3 2 3 35 1 2 1 2 1 0 0 1 0 0 1 0 0 1 2 2 6 2 5 1 2 4 1 2 22 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 2 30 2 17 5 3 2 1 3 26 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 2 27 4 25 3 3 3 2 2 23 3 2 1 1 1 0 0 1 0 0 1 0 1 0 2 4 15 2 36 1 5 2 2 3 54 1 1 1 2 1 0 0 1 0 1 0 0 0 0 1 4 42 2 72 5 4 4 4 2 29 3 1 1 2 1 0 0 1 0 1 0 0 0 1 1 1 11 4 39 1 3 3 2 1 40 3 2 2 1 1 1 0 1 0 0 1 0 1 0 1 2 15 2 15 2 3 3 2 1 22 3 1 1 1 1 0 0 0 0 0 1 0 0 1 1 4 24 2 74 1 3 3 4 2 43 3 1 2 1 1 1 0 1 0 0 1 0 1 0 1 1 24 1 12 1 1 2 4 4 29 3 2 1 1 1 1 0 0 1 1 0 1 0 0 2 1 60 2 73 1 5 3 4 4 36 3 1 1 1 1 0 0 0 1 1 0 0 0 1 2 4 30 4 28 1 3 2 2 3 33 3 1 1 2 1 0 0 1 0 0 1 0 0 1 1 3 24 2 13 3 3 2 3 3 57 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 2 6 2 8 1 3 2 3 1 64 3 1 1 1 1 0 0 0 0 0 1 0 0 1 1 2 18 3 24 5 5 3 2 2 42 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 24 3 25 1 5 3 4 3 47 3 2 2 1 1 1 0 1 0 0 1 0 1 0 2 2 15 1 13 2 3 4 2 2 25 3 1 1 1 1 1 0 1 0 1 0 0 0 1 2 2 30 4 84 1 4 3 2 2 49 3 1 1 1 1 0 0 1 0 0 1 0 0 1 2 4 48 2 48 1 1 3 2 3 33 1 1 1 2 1 0 0 1 0 1 0 0 0 0 2 3 21 2 29 2 3 2 1 3 28 1 1 1 2 1 1 0 1 0 0 1 0 0 0 1 1 36 2 82 1 3 3 2 2 26 3 1 2 1 1 0 1 1 0 0 1 0 0 1 2 4 24 4 20 1 4 3 2 2 30 3 2 1 1 1 0 0 1 0 0 1 0 1 0 1 1 15 4 14 1 3 2 3 2 25 3 2 1 1 1 0 0 1 0 1 0 0 0 1 1 3 42 0 63 1 2 1 1 2 33 3 2 1 1 1 0 0 1 0 0 1 0 0 1 1 4 13 2 14 2 1 2 4 1 64 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 24 2 66 1 1 3 2 4 29 3 1 1 2 1 0 1 1 0 0 0 0 0 0 1 2 24 4 17 1 5 3 2 2 48 3 2 1 1 1 0 0 1 0 0 1 0 1 0 1 4 12 4 36 5 2 3 1 2 37 3 2 2 1 1 0 0 1 0 0 1 0 1 0 1 4 15 1 16 2 5 3 4 3 34 1 1 2 1 1 0 0 1 0 0 1 0 1 0 1 1 18 2 19 5 4 4 4 3 23 3 2 1 1 1 0 0 1 0 1 0 0 1 0 1 1 36 2 40 1 1 3 3 2 30 3 1 1 2 1 0 0 1 0 0 1 0 0 0 1 4 12 2 24 5 5 3 3 3 50 3 1 1 2 1 1 0 1 0 0 1 0 0 1 1 4 12 2 17 1 4 2 4 1 31 3 1 1 1 1 0 0 1 0 0 1 0 1 0 1 1 30 2 39 1 3 1 4 2 40 3 1 1 2 1 0 1 1 0 0 1 0 0 0 1 4 12 2 8 1 5 3 4 3 38 3 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 45 2 18 1 3 3 4 4 23 3 1 1 2 1 0 0 1 0 0 0 0 0 1 2 2 45 4 46 2 1 3 4 3 27 3 1 1 1 1 0 1 1 0 0 1 0 0 1 1 foreach/inst/examples/pi.R0000644000176200001440000000031711472542406015215 0ustar liggesuserslibrary(foreach) w <- getDoParWorkers() n <- 10000000 h <- 1 / n pi <- foreach(i=1:w, .combine='+') %dopar% { x <- h * (seq(i, n, by=w) - 0.5) h * sum(4 / (1 + x * x)) } cat(sprintf('pi = %f\n', pi)) foreach/inst/examples/bootpar.R0000644000176200001440000000104411472542406016251 0ustar liggesusers# foreach version based on for-loop version from Wikipedia # http://en.wikipedia.org/wiki/Bootstrapping_(statistics) library(foreach) data(iris) x <- iris[which(iris[,5] != "setosa"), c(1,5)] trials <- 10000 opts <- list(chunkSize=150) print(system.time( r <- foreach(icount(trials), .combine=cbind, .options.nws=opts, .options.smp=opts) %dopar% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } )) hist(r[1,], breaks=40) dev.new() hist(r[2,], breaks=40) foreach/inst/examples/for.R0000644000176200001440000000557311472542406015404 0ustar liggesuserslibrary(foreach) n <- 10 nrows <- 5 ncols <- 5 # vector example set.seed(17) x <- numeric(n) for (i in seq(along=x)) x[i] <- rnorm(1) set.seed(17) y <- foreach(icount(n), .combine='c') %do% rnorm(1) cat('results of vector example:\n') print(identical(x, y)) # list example set.seed(17) x <- vector('list', length=n) for (i in seq(length=n)) x[i] <- list(rnorm(10)) set.seed(17) y <- foreach(icount(n)) %do% rnorm(10) cat('results of list example:\n') print(identical(x, y)) # matrix example set.seed(17) cols <- vector('list', length=ncols) for (i in seq(along=cols)) cols[i] <- list(rnorm(nrows)) x <- do.call('cbind', cols) set.seed(17) y <- foreach(icount(ncols), .combine='cbind') %do% rnorm(nrows) cat('results of matrix example:\n') dimnames(y) <- NULL print(identical(x, y)) # another matrix example set.seed(17) cols <- vector('list', length=ncols) for (i in seq(along=cols)) { r <- numeric(nrows) for (j in seq(along=r)) r[j] <- rnorm(1) cols[i] <- list(r) } x <- do.call('cbind', cols) set.seed(17) y <- foreach(icount(ncols), .combine='cbind') %:% foreach(icount(nrows), .combine='c') %do% rnorm(1) cat('results of another matrix example:\n') dimnames(y) <- NULL print(identical(x, y)) # ragged matrix example set.seed(17) x <- vector('list', length=ncols) for (i in seq(along=x)) x[i] <- list(rnorm(i)) set.seed(17) y <- foreach(i=icount(ncols)) %do% rnorm(i) cat('results of ragged matrix example:\n') print(identical(x, y)) # another ragged matrix example set.seed(17) x <- vector('list', length=ncols) for (i in seq(along=x)) { r <- numeric(i) for (j in seq(along=r)) r[j] <- rnorm(1) x[i] <- list(r) } set.seed(17) y <- foreach(i=icount(ncols)) %:% foreach(icount(i), .combine='c') %do% rnorm(1) cat('results of another ragged matrix example:\n') print(identical(x, y)) # filtering example set.seed(17) a <- rnorm(10) # C-style approach x <- numeric(length(a)) n <- 0 for (i in a) { if (i > 0) { n <- n + 1 x[n] <- i } } length(x) <- n # Vector approach y <- a[a > 0] # foreach approach z <- foreach(i=a, .combine='c') %:% when(i > 0) %do% i cat('results of filtering example:\n') print(identical(x, y)) print(identical(x, z)) # Define a function that creates an iterator that returns chunks of a vecto ivector <- function(x, chunksize) { n <- length(x) i <- 1 nextEl <- function() { if (n <= 0) stop('StopIteration') chunks <- ceiling(n / chunksize) m <- ceiling(n / chunks) r <- seq(i, length=m) i <<- i + m n <<- n - m x[r] } obj <- list(nextElem=nextEl) class(obj) <- c('abstractiter', 'iter') obj } # another filtering example set.seed(17) a <- rnorm(10000) # Vector approach x <- a[a > 0] # foreach with vectorization, limiting vector lengths to 1000 y <- foreach(a=ivector(a, 1000), .combine='c') %do% a[a > 0] cat('results of another filtering example:\n') print(identical(x, y)) foreach/inst/examples/output.R0000644000176200001440000000154211472542406016146 0ustar liggesuserslibrary(foreach) # define a combine function that writes the results to a file. # note that the first argument is not a result, but the file # object, and must be specified via the .init argument and # returned as the value of this function. output <- function(fobj, ...) { lines <- list(...) cat(sprintf('writing %d line(s)\n', length(lines))) writeLines(unlist(lines), con=fobj) fobj } # create a temporary file to write the results to fname <- tempfile('foreach') fobj <- file(fname, 'w') # use ireadLines to create an iterator over the lines of the input file, # which are converted to upper case, and processed by the output function foreach(input=ireadLines('output.R'), .combine=output, .init=fobj, .multicombine=TRUE, .maxcombine=5) %do% toupper(input) # display the results and clean up close(fobj) file.show(fname) file.remove(fname) foreach/inst/examples/bootseq.R0000644000176200001440000000100211472542406016251 0ustar liggesusers# for-loop version from Wikipedia # http://en.wikipedia.org/wiki/Bootstrapping_(statistics) data(iris) x <- iris[which(iris[,5] != "setosa"), c(1,5)] trials <- 10000 intercept1 <- rep(0, trials) slope1 <- rep(0, trials) print(system.time( for (B in 1:trials) { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) intercept1[B] <- coefficients(result1)[1] slope1[B] <- coefficients(result1)[2] } )) hist(intercept1, breaks=40) dev.new() hist(slope1, breaks=40) foreach/inst/examples/sqlite.R0000644000176200001440000000202511472542406016104 0ustar liggesuserslibrary(foreach) library(RSQLite) # Define a simple iterator for a query result, which is # just a wrapper around the fetch function iquery <- function(con, statement, ..., n=1) { rs <- dbSendQuery(con, statement, ...) nextEl <- function() { r <- fetch(rs, n) if (nrow(r) == 0) { dbClearResult(rs) stop('StopIteration') } r } obj <- list(nextElem=nextEl) class(obj) <- c('abstractiter', 'iter') obj } # create a SQLite instance and create one connection. m <- dbDriver('SQLite') # initialize a new database to a tempfile and copy some data.frame # from the base package into it tfile <- tempfile() con <- dbConnect(m, dbname=tfile) data(USArrests) dbWriteTable(con, 'USArrests', USArrests) # issue the query, and then iterate over the results it <- iquery(con, 'select * from USArrests', n=10) r <- foreach(r=it, .combine='rbind') %do% { state <- r$row_names crime <- r$Murder + r$Assault + r$Rape data.frame(state=state, crime=crime) } print(r) # clean up dbDisconnect(con) file.remove(tfile) foreach/inst/examples/comprehensions.R0000644000176200001440000000132311472542406017637 0ustar liggesuserslibrary(foreach) a <- foreach(x=1:4, .combine='c') %do% (x + 2 * x + x / 2) print(a) a <- foreach(x=1:9, .combine='c') %do% (x %% 2 == 1) print(a) a <- foreach(x=1:4, .combine='c') %:% foreach(y=c(3,5,7,9), .combine='c') %do% (x * y) print(a) a <- foreach(x=c(1,5,12,3,23,11,7,2), .combine='c') %:% when(x > 10) %do% x print(a) a <- foreach(x=c(1,3,5), .combine='c') %:% foreach(y=c(2,4,6)) %:% when(x < y) %do% c(x, y) print(a) n <- 30 s <- seq(length=n) a <- foreach(x=s, .combine='c') %:% foreach(y=s, .combine='c') %:% foreach(z=s) %:% when(x + y + z <= n) %:% when(x * x + y * y == z * z) %do% c(x, y, z) print(a) foreach/inst/examples/feapply.R0000644000176200001440000000114111472542406016241 0ustar liggesuserslibrary(foreach) feapply <- function(X, MARGIN, FUN, ...) { FUN <- match.fun(FUN) r <- foreach(x=iapply(X, MARGIN)) %do% { x <- FUN(x, ...) dim(x) <- NULL x } n <- unlist(lapply(r, length)) if (all(n[1] == n)) { r <- unlist(r) dim(r) <- if (n[1] == 1) dim(X)[MARGIN] else c(n[1], dim(X)[MARGIN]) } else if (length(MARGIN) > 1) { dim(r) <- dim(X)[MARGIN] } r } a <- array(rnorm(24), c(2, 3, 4)) m <- diag(2, 3, 2) MARGIN <- 3 fun <- function(x, m) x %*% m expected <- apply(a, MARGIN, fun, m) actual <- feapply(a, MARGIN, fun, m) print(identical(expected, actual)) foreach/inst/examples/tuneRF.R0000644000176200001440000000231011472542406016003 0ustar liggesusers# tuning random forest over mtry parameter in parallel library(foreach) library(randomForest) # a simple iterator over different values for the mtry argument mtryiter <- function(from, to, stepFactor=2) { nextEl <- function() { if (from > to) stop('StopIteration') i <- from from <<- ceiling(from * stepFactor) i } obj <- list(nextElem=nextEl) class(obj) <- c('abstractiter', 'iter') obj } # vector of ntree values that we're interested in vntree <- c(25, 50, 100, 200, 500, 1000) # function that gets random forest error information for different values of mtry tune <- function(x, y, ntree=vntree, mtry=NULL, keep.forest=FALSE, ...) { comb <- if (is.factor(y)) function(a, b) rbind(a, data.frame(ntree=ntree, mtry=b$mtry, error=b$err.rate[ntree, 1])) else function(a, b) rbind(a, data.frame(ntree=ntree, mtry=b$mtry, error=b$mse[ntree])) foreach(mtry=mtryiter(1, ncol(x)), .combine=comb, .init=NULL, .packages='randomForest') %dopar% { randomForest(x, y, ntree=max(ntree), mtry=mtry, keep.forest=FALSE, ...) } } # generate the inputs x <- matrix(runif(2000), 100) y <- gl(2, 50) # execute randomForest results <- tune(x, y) # print the result print(results) foreach/inst/examples/bootpar2.R0000644000176200001440000000121711472542406016335 0ustar liggesusers# foreach version based on for-loop version from Wikipedia # http://en.wikipedia.org/wiki/Bootstrapping_(statistics) library(foreach) data(iris) x <- iris[which(iris[,5] != "setosa"), c(1,5)] trials <- 10000 nwsopts <- list(chunkSize=150) # Can use the following "final" function instead of # using cbind as the "combine" function. final <- function(a) do.call('cbind', a) print(system.time( r <- foreach(icount(trials), .final=final, .options.nws=nwsopts) %dopar% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } )) hist(r[1,], breaks=40) dev.new() hist(r[2,], breaks=40) foreach/inst/examples/matmul2.R0000644000176200001440000000142511472542406016167 0ustar liggesusers# Less inefficient parallel matrix multiply using custom matrix iterator library(foreach) iblkcol <- function(a, chunks) { n <- ncol(a) i <- 1 nextEl <- function() { if (chunks <= 0 || n <= 0) stop('StopIteration') m <- ceiling(n / chunks) r <- seq(i, length=m) i <<- i + m n <<- n - m chunks <<- chunks - 1 a[,r, drop=FALSE] } obj <- list(nextElem=nextEl) class(obj) <- c('abstractiter', 'iter') obj } # generate the input matrices x <- matrix(rnorm(100), 10) y <- matrix(rnorm(100), 10) # multiply the matrices nw <- getDoParWorkers() cat(sprintf('Running with %d worker(s)\n', nw)) mit <- iblkcol(y, nw) z <- foreach(y=mit, .combine=cbind) %dopar% (x %*% y) # print the results print(z) # check the results print(all.equal(z, x %*% y)) foreach/inst/examples/cross.R0000644000176200001440000000144711472542406015743 0ustar liggesuserslibrary(foreach) NUMROWS <- 500 NUMCOLS <- 100 NUMFOLDS <- 10 CHUNKSIZE <- 50 nwsopts <- list(chunkSize=CHUNKSIZE) xv <- matrix(rnorm(NUMROWS * NUMCOLS), NUMROWS, NUMCOLS) beta <- c(rnorm(NUMCOLS / 2, 0, 5), rnorm(NUMCOLS / 2, 0, 0.25)) yv <- xv %*% beta + rnorm(NUMROWS, 0, 20) dat <- data.frame(y=yv, x=xv) fold <- sample(rep(1:NUMFOLDS, length=NUMROWS)) # the variables dat, fold, and NUMCOLS are automatically exported print(system.time( prss <- foreach(foldnumber=1:NUMFOLDS, .combine='c', .options.nws=nwsopts) %:% foreach(i=2:NUMCOLS, .combine='c', .final=mean) %dopar% { glmfit <- glm(y ~ ., data=dat[fold != foldnumber, 1:i]) yhat <- predict(glmfit, newdata=dat[fold == foldnumber, 1:i]) sum((yhat - dat[fold == foldnumber, 1]) ^ 2) } )) cat('Results:', prss, '\n') foreach/inst/examples/matmul.R0000644000176200001440000000050611472542406016104 0ustar liggesusers# simple (and inefficient) parallel matrix multiply library(foreach) # generate the input matrices x <- matrix(rnorm(16), 4) y <- matrix(rnorm(16), 4) # multiply the matrices z <- foreach(y=iter(y, by='col'), .combine=cbind) %dopar% (x %*% y) # print the results print(z) # check the results print(all.equal(z, x %*% y)) foreach/inst/examples/apply.R0000644000176200001440000001066511472542406015741 0ustar liggesusers# File src/library/base/R/apply.R # Part of the R package, http://www.R-project.org # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # http://www.r-project.org/Licenses/ applyPar <- function(X, MARGIN, FUN, ...) { FUN <- match.fun(FUN) ## Ensure that X is an array object d <- dim(X) dl <- length(d) if(dl == 0) stop("dim(X) must have a positive length") ds <- 1:dl if(length(oldClass(X)) > 0) X <- if(dl == 2) as.matrix(X) else as.array(X) ## now recompute things as coercion can change dims ## (e.g. when a data frame contains a matrix). d <- dim(X) dn <- dimnames(X) ## Extract the margins and associated dimnames s.call <- ds[-MARGIN] s.ans <- ds[MARGIN] d.call <- d[-MARGIN] d.ans <- d[MARGIN] dn.call<- dn[-MARGIN] dn.ans <- dn[MARGIN] ## dimnames(X) <- NULL ## do the calls d2 <- prod(d.ans) if(d2 == 0) { ## arrays with some 0 extents: return ``empty result'' trying ## to use proper mode and dimension: ## The following is still a bit `hackish': use non-empty X newX <- array(vector(typeof(X), 1), dim = c(prod(d.call), 1)) ans <- FUN(if(length(d.call) < 2) newX[,1] else array(newX[,1], d.call, dn.call), ...) return(if(is.null(ans)) ans else if(length(d.ans) < 2) ans[1][-1] else array(ans, d.ans, dn.ans)) } ## else newX <- aperm(X, c(s.call, s.ans)) dim(newX) <- c(prod(d.call), d2) #### ans <- vector("list", d2) nw <- getDoParWorkers() if(length(d.call) < 2) {# vector if (length(dn.call)) dimnames(newX) <- c(dn.call, list(NULL)) #### for(i in 1:d2) { #### tmp <- FUN(newX[,i], ...) #### if(!is.null(tmp)) ans[[i]] <- tmp #### } ans <- foreach(x=iblkcol(newX, nw), .combine='c', .packages='foreach') %dopar% { foreach(i=1:ncol(x)) %do% FUN(x[,i], ...) } } else { #### for(i in 1:d2) { #### tmp <- FUN(array(newX[,i], d.call, dn.call), ...) #### if(!is.null(tmp)) ans[[i]] <- tmp #### } ans <- foreach(x=iblkcol(newX, nw), .combine='c', .packages='foreach') %dopar% { foreach(y=1:ncol(x)) %do% FUN(array(x[,i], d.call, dn.call), ...) } } ## answer dims and dimnames ans.list <- is.recursive(ans[[1]]) l.ans <- length(ans[[1]]) ans.names <- names(ans[[1]]) if(!ans.list) ans.list <- any(unlist(lapply(ans, length)) != l.ans) if(!ans.list && length(ans.names)) { all.same <- sapply(ans, function(x) identical(names(x), ans.names)) if (!all(all.same)) ans.names <- NULL } len.a <- if(ans.list) d2 else length(ans <- unlist(ans, recursive = FALSE)) if(length(MARGIN) == 1 && len.a == d2) { names(ans) <- if(length(dn.ans[[1]])) dn.ans[[1]] # else NULL return(ans) } if(len.a == d2) return(array(ans, d.ans, dn.ans)) if(len.a > 0 && len.a %% d2 == 0) { if(is.null(dn.ans)) dn.ans <- vector(mode="list", length(d.ans)) dn.ans <- c(list(ans.names), dn.ans) return(array(ans, c(len.a %/% d2, d.ans), if(!all(sapply(dn.ans, is.null))) dn.ans)) } return(ans) } ############################################################################## # # Something like this will be added to the iterators package. # This creates an iterator over block columns of a matrix. iblkcol <- function(a, chunks) { n <- ncol(a) i <- 1 nextEl <- function() { if (chunks <= 0 || n <= 0) stop('StopIteration') m <- ceiling(n / chunks) r <- seq(i, length=m) i <<- i + m n <<- n - m chunks <<- chunks - 1 a[,r, drop=FALSE] } obj <- list(nextElem=nextEl) class(obj) <- c('abstractiter', 'iter') obj } # Simple test program for applyPar library(foreach) x <- matrix(rnorm(16000000), 4000) actual <- applyPar(x, 2, mean) expected <- apply(x, 2, mean) cat(sprintf('Result correct: %s\n', identical(actual, expected))) foreach/inst/examples/bigmean2.R0000644000176200001440000000157411472542406016277 0ustar liggesuserslibrary(foreach) # Define a combine function for the partial results comb <- function(...) { n <- foreach(a=list(...), .combine='+') %do% a$n means <- foreach(a=list(...), .combine='+') %do% ((a$n / n) * a$means) list(n=n, means=means) } # initialize some parameters datafile <- 'germandata.txt' nrows <- 100 # germandata.txt only has 1000 rows of data # create an iterator over the data in the file it <- iread.table(datafile, nrows=nrows, header=FALSE, row.names=NULL) # Compute the mean of each of those fields, nrows records at a time print(system.time( r <- foreach(d=it, .combine=comb, .multicombine=TRUE, .final=function(a) a$mean) %do% list(n=nrow(d), means=mean(d)) )) print(r) # This is faster for small problems (when it may not matter), # but becomes slower (or fails) for big problems print(system.time({ d <- read.table(datafile) r <- mean(d) })) print(r) foreach/inst/examples/bigmean.R0000644000176200001440000000255611472542406016216 0ustar liggesuserslibrary(foreach) library(RSQLite) # Define a simple iterator for a query result, which is # just a wrapper around the fetch function iquery <- function(con, statement, ..., n=1) { rs <- dbSendQuery(con, statement, ...) nextEl <- function() { d <- fetch(rs, n) if (nrow(d) == 0) { dbClearResult(rs) stop('StopIteration') } d } obj <- list(nextElem=nextEl) class(obj) <- c('abstractiter', 'iter') obj } # Create an SQLite instance m <- dbDriver('SQLite') # Initialize a new database to a tempfile and copy a data frame # into it repeatedly to get more data to process tfile <- tempfile() con <- dbConnect(m, dbname=tfile) data(USArrests) dbWriteTable(con, 'USArrests', USArrests) for (i in 1:99) dbWriteTable(con, 'USArrests', USArrests, append=TRUE) # Create an iterator to issue the query, selecting the fields of interest qit <- iquery(con, 'select Murder, Assault, Rape from USArrests', n=50) # Define a combine function for the partial results comb <- function(...) { n <- foreach(a=list(...), .combine='+') %do% a$n means <- foreach(a=list(...), .combine='+') %do% ((a$n / n) * a$means) list(n=n, means=means) } # Compute the mean of each of those fields, 50 records at a time r <- foreach(d=qit, .combine=comb, .multicombine=TRUE) %dopar% list(n=nrow(d), means=mean(d)) print(r) # Clean up dbDisconnect(con) file.remove(tfile) foreach/inst/examples/bigmax.R0000644000176200001440000000227111472542406016055 0ustar liggesuserslibrary(foreach) library(RSQLite) # Define a simple iterator for a query result, which is # just a wrapper around the fetch function. iquery <- function(con, statement, ..., n=1) { rs <- dbSendQuery(con, statement, ...) nextEl <- function() { d <- fetch(rs, n) if (nrow(d) == 0) { dbClearResult(rs) stop('StopIteration') } d } obj <- list(nextElem=nextEl) class(obj) <- c('abstractiter', 'iter') obj } # Create an SQLite instance. m <- dbDriver('SQLite') # Initialize a new database to a tempfile and copy a data frame # into it repeatedly to get more data to process. tfile <- tempfile() con <- dbConnect(m, dbname=tfile) data(USArrests) dbWriteTable(con, 'USArrests', USArrests) for (i in 1:99) dbWriteTable(con, 'USArrests', USArrests, append=TRUE) # Create an iterator to issue the query, selecting the fields of interest. # We then compute the maximum of each of those fields, 100 records at a time. qit <- iquery(con, 'select Murder, Assault, Rape from USArrests', n=100) r <- foreach(d=qit, .combine='pmax', .packages='foreach') %dopar% { foreach(x=iter(d, by='col'), .combine='c') %do% max(x) } print(r) # Clean up dbDisconnect(con) file.remove(tfile) foreach/inst/examples/isplit.R0000644000176200001440000000156211472542406016114 0ustar liggesusers# iterator for splitting data using a factor library(foreach) # let's use isplit on a data frame a <- foreach(i=isplit(airquality, airquality$Month), .combine=rbind) %do% quantile(i$value, na.rm=TRUE) # make it pretty and print it rownames(a) <- levels(as.factor(airquality$Month)) print(a) # use a list of factors to do an aggregated operation it <- isplit(as.data.frame(state.x77), list(Region=state.region, Cold=state.x77[,'Frost'] > 130), drop=TRUE) a <- foreach(i=it, .combine=rbind) %do% { x <- mean(i$value) dim(x) <- c(1, length(x)) colnames(x) <- names(i$value) cbind(i$key, as.data.frame(x)) } print(a) # compare with the standard aggregate function b <- aggregate(state.x77, list(Region=state.region, Cold=state.x77[,'Frost'] > 130), mean) print(b) cat('results identical:\n') print(identical(a, b)) foreach/inst/examples/sinc.R0000644000176200001440000000123311472542406015537 0ustar liggesusers# simple foreach example that plots the sinc function library(foreach) # Define the coordinate grid to use x <- seq(-10, 10, by=0.1) # Compute starting indices for each task nw <- getDoParWorkers() cat(sprintf('Running with %d worker(s)\n', nw)) n <- ceiling(length(x) / nw) ind <- seq(by=n, length=nw) # Compute the value of the sinc function at each point in the grid z <- foreach(i=ind, .combine=cbind) %dopar% { j <- min(i + n - 1, length(x)) d <- expand.grid(x=x, y=x[i:j]) r <- sqrt(d$x^2 + d$y^2) matrix(10 * sin(r) / r, length(x)) } # Plot the results as a perspective plot persp(x, x, z, ylab='y', theta=30, phi=30, expand=0.5, col="lightblue") foreach/inst/examples/rf.R0000644000176200001440000000116011472542406015211 0ustar liggesusers# a simple parallel random forest library(foreach) library(randomForest) # generate the inputs nr <- 1000 x <- matrix(runif(100000), nr) y <- gl(2, nr/2) # split the total number of trees by the number of parallel execution workers nw <- getDoParWorkers() cat(sprintf('Running with %d worker(s)\n', nw)) it <- idiv(1000, chunks=nw) # run the randomForest jobs, and combine the results print(system.time({ rf <- foreach(ntree=it, .combine=combine, .multicombine=TRUE, .inorder=FALSE, .packages='randomForest') %dopar% { randomForest(x, y, ntree=ntree, importance=TRUE) } })) # print the result print(rf) foreach/inst/examples/colMeans.R0000644000176200001440000000076211472542406016352 0ustar liggesusers# compute the mean of the columns and the rows of a matrix library(foreach) # generate the input matrix x <- matrix(rnorm(100 * 100), 100) # compute the mean of each column of x cmeans <- foreach(i=1:ncol(x), .combine=c) %do% mean(x[,i]) # check the results expected <- colMeans(x) print(all.equal(cmeans, expected)) # compute the mean of each row of x rmeans <- foreach(i=1:nrow(x), .combine=c) %do% mean(x[i,]) # check the results expected <- rowMeans(x) print(all.equal(rmeans, expected)) foreach/inst/examples/sinc2.R0000644000176200001440000000165011472542406015624 0ustar liggesuserslibrary(foreach) # Define a function that creates an iterator that returns subvectors ivector <- function(x, chunks) { n <- length(x) i <- 1 nextEl <- function() { if (chunks <= 0 || n <= 0) stop('StopIteration') m <- ceiling(n / chunks) r <- seq(i, length=m) i <<- i + m n <<- n - m chunks <<- chunks - 1 x[r] } obj <- list(nextElem=nextEl) class(obj) <- c('abstractiter', 'iter') obj } # Define the coordinate grid and figure out how to split up the work x <- seq(-10, 10, by=0.1) nw <- getDoParWorkers() cat(sprintf('Running with %d worker(s)\n', nw)) # Compute the value of the sinc function at each point in the grid z <- foreach(y=ivector(x, nw), .combine=cbind) %dopar% { y <- rep(y, each=length(x)) r <- sqrt(x ^ 2 + y ^ 2) matrix(10 * sin(r) / r, length(x)) } # Plot the results as a perspective plot persp(x, x, z, ylab='y', theta=30, phi=30, expand=0.5, col="lightblue") foreach/inst/examples/qsort.R0000644000176200001440000000055711472542406015763 0ustar liggesuserslibrary(foreach) qsort <- function(x) { n <- length(x) if (n == 0) { x } else { p <- sample(n, 1) smaller <- foreach(y=x[-p], .combine=c) %:% when(y <= x[p]) %do% y larger <- foreach(y=x[-p], .combine=c) %:% when(y > x[p]) %do% y c(qsort(smaller), x[p], qsort(larger)) } } x <- runif(100) a <- qsort(x) b <- sort(x) print(all(a == b)) foreach/inst/doc/0000755000176200001440000000000013212620533013400 5ustar liggesusersforeach/inst/doc/nested.Rnw0000644000176200001440000003250011741344141015355 0ustar liggesusers% \VignetteIndexEntry{Nesting Foreach Loops} % \VignetteDepends{foreach} % \VignettePackage{foreach} \documentclass[12pt]{article} \usepackage{amsmath} \usepackage[pdftex]{graphicx} \usepackage{color} \usepackage{xspace} \usepackage{fancyvrb} \usepackage{fancyhdr} \usepackage[ colorlinks=true, linkcolor=blue, citecolor=blue, urlcolor=blue] {hyperref} \usepackage{lscape} \usepackage{Sweave} \usepackage{float} \floatstyle{plain} \newfloat{example}{thp}{lop} \floatname{example}{Example} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % define new colors for use \definecolor{darkgreen}{rgb}{0,0.6,0} \definecolor{darkred}{rgb}{0.6,0.0,0} \definecolor{lightbrown}{rgb}{1,0.9,0.8} \definecolor{brown}{rgb}{0.6,0.3,0.3} \definecolor{darkblue}{rgb}{0,0,0.8} \definecolor{darkmagenta}{rgb}{0.5,0,0.5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\bld}[1]{\mbox{\boldmath $#1$}} \newcommand{\shell}[1]{\mbox{$#1$}} \renewcommand{\vec}[1]{\mbox{\bf {#1}}} \newcommand{\ReallySmallSpacing}{\renewcommand{\baselinestretch}{.6}\Large\normalsize} \newcommand{\SmallSpacing}{\renewcommand{\baselinestretch}{1.1}\Large\normalsize} \newcommand{\halfs}{\frac{1}{2}} \setlength{\oddsidemargin}{-.25 truein} \setlength{\evensidemargin}{0truein} \setlength{\topmargin}{-0.2truein} \setlength{\textwidth}{7 truein} \setlength{\textheight}{8.5 truein} \setlength{\parindent}{0.20truein} \setlength{\parskip}{0.10truein} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagestyle{fancy} \lhead{} \chead{Nesting {\tt Foreach} Loops} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Nesting {\tt Foreach} Loops} \author{Steve Weston \\ doc@revolutionanalytics.com} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} <>= library(foreach) registerDoSEQ() @ The \texttt{foreach} package provides a looping construct for executing R code repeatedly. It is similar to the standard \texttt{for} loop, which makes it easy to convert a \texttt{for} loop to a \texttt{foreach} loop. Unlike many parallel programming packages for R, \texttt{foreach} doesn't require the body of the \texttt{for} loop to be turned into a function. \texttt{foreach} differs from a \texttt{for} loop in that its return is a list of values, whereas a \texttt{for} loop has no value and uses side effects to convey its result. Because of this, \texttt{foreach} loops have a few advantages over \texttt{for} loops when the purpose of the loop is to create a data structure such as a vector, list, or matrix: First, there is less code duplication, and hence, less chance for an error because the initialization of the vector or matrix is unnecessary. Second, a \texttt{foreach} loop may be easily parallelized by changing only a single keyword. \section{The nesting operator: \%:\%} An important feature of \texttt{foreach} is the \texttt{\%:\%} operator. I call this the {\em nesting} operator because it is used to create nested \texttt{foreach} loops. Like the \texttt{\%do\%} and \texttt{\%dopar\%} operators, it is a binary operator, but it operates on two \texttt{foreach} objects. It also returns a \texttt{foreach} object, which is essentially a special merger of its operands. Let's say that we want to perform a Monte Carlo simulation using a function called \texttt{sim}.\footnote{Remember that \texttt{sim} needs to be rather compute intensive to be worth executing in parallel.} The \texttt{sim} function takes two arguments, and we want to call it with all combinations of the values that are stored in the vectors \texttt{avec} and \texttt{bvec}. The following doubly-nested \texttt{for} loop does that. For testing purposes, the \texttt{sim} function is defined to return $10 a + b$:\footnote{Of course, an operation this trivial is not worth executing in parallel.} <>= sim <- function(a, b) 10 * a + b avec <- 1:2 bvec <- 1:4 @ <>= x <- matrix(0, length(avec), length(bvec)) for (j in 1:length(bvec)) { for (i in 1:length(avec)) { x[i,j] <- sim(avec[i], bvec[j]) } } x @ In this case, it makes sense to store the results in a matrix, so we create one of the proper size called \texttt{x}, and assign the return value of \texttt{sim} to the appropriate element of \texttt{x} each time through the inner loop. When using \texttt{foreach}, we don't create a matrix and assign values into it. Instead, the inner loop returns the columns of the result matrix as vectors, which are combined in the outer loop into a matrix. Here's how to do that using the \texttt{\%:\%} operator:\footnote{Due to operator precedence, you cannot put braces around the inner \texttt{foreach} loop. Unfortunately, that causes Sweave to format this example rather badly, in my opinion.} <>= x <- foreach(b=bvec, .combine='cbind') %:% foreach(a=avec, .combine='c') %do% { sim(a, b) } x @ This is structured very much like the nested \texttt{for} loop. The outer \texttt{foreach} is iterating over the values in ``bvec'', passing them to the inner \texttt{foreach}, which iterates over the values in ``avec'' for each value of ``bvec''. Thus, the ``sim'' function is called in the same way in both cases. The code is slightly cleaner in this version, and has the advantage of being easily parallelized. \section{Using \texttt{\%:\%} with \texttt{\%dopar\%}} When parallelizing nested \texttt{for} loops, there is always a question of which loop to parallelize. The standard advice is to parallelize the outer loop. This results in larger individual tasks, and larger tasks can often be performed more efficiently than smaller tasks. However, if the outer loop doesn't have many iterations and the tasks are already large, parallelizing the outer loop results in a small number of huge tasks, which may not allow you to use all of your processors, and can also result in load balancing problems. You could parallelize an inner loop instead, but that could be inefficient because you're repeatedly waiting for all the results to be returned every time through the outer loop. And if the tasks and number of iterations vary in size, then it's really hard to know which loop to parallelize. But in our Monte Carlo example, all of the tasks are completely independent of each other, and so they can all be executed in parallel. You really want to think of the loops as specifying a single stream of tasks. You just need to be careful to process all of the results correctly, depending on which iteration of the inner loop they came from. That is exactly what the \texttt{\%:\%} operator does: it turns multiple \texttt{foreach} loops into a single loop. That is why there is only one \texttt{\%do\%} operator in the example above. And when we parallelize that nested \texttt{foreach} loop by changing the \texttt{\%do\%} into a \texttt{\%dopar\%}, we are creating a single stream of tasks that can all be executed in parallel: <>= x <- foreach(b=bvec, .combine='cbind') %:% foreach(a=avec, .combine='c') %dopar% { sim(a, b) } x @ Of course, we'll actually only run as many tasks in parallel as we have processors, but the parallel backend takes care of all that. The point is that the \texttt{\%:\%} operator makes it easy to specify the stream of tasks to be executed, and the \texttt{.combine} argument to \texttt{foreach} allows us to specify how the results should be processed. The backend handles executing the tasks in parallel. \section{Chunking tasks} Of course, there has to be a snag to this somewhere. What if the tasks are quite small, so that you really might want to execute the entire inner loop as a single task? Well, small tasks are a problem even for a singly-nested loop. The solution to this problem, whether you have a single loop or nested loops, is to use {\em task chunking}. Task chunking allows you to send multiple tasks to the workers at once. This can be much more efficient, especially for short tasks. Currently, only the \texttt{doNWS} backend supports task chunking. Here's how it's done with \texttt{doNWS}: <>= opts <- list(chunkSize=2) x <- foreach(b=bvec, .combine='cbind', .options.nws=opts) %:% foreach(a=avec, .combine='c') %dopar% { sim(a, b) } x @ If you're not using \texttt{doNWS}, then this argument is ignored, which allows you to write code that is backend-independent. You can also specify options for multiple backends, and only the option list that matches the registered backend will be used. It would be nice if the chunk size could be picked automatically, but I haven't figured out a good, safe way to do that. So for now, you need to specify the chunk size manually.\footnote{In the future, the backend might decide that it will execute the tasks in parallel. That could be very useful when running on a cluster with multiprocessor nodes. Multiple tasks are sent across the network to each node, which then executes them in parallel on its cores. Maybe in the next release...} The point is that by using the \texttt{\%:\%} operator, you can convert a nested \texttt{for} loop to a nested \texttt{foreach} loop, use \texttt{\%dopar\%} to run in parallel, and then tune the size of the tasks using the ``chunkSize'' option so that they are big enough to be executed efficiently, but not so big that they cause load balancing problems. You don't have to worry about which loop to parallelize, because you're turning the nested loops into a single stream of tasks that can all be executed in parallel by the parallel backend. \section{Another example} Now let's imagine that the ``sim'' function returns a object that includes an error estimate. We want to return the result with the lowest error for each value of b, along with the arguments that generated that result. Here's how that might be done with nested \texttt{for} loops: <>= sim <- function(a, b) { x <- 10 * a + b err <- abs(a - b) list(x=x, err=err) } @ <>= n <- length(bvec) d <- data.frame(x=numeric(n), a=numeric(n), b=numeric(n), err=numeric(n)) for (j in 1:n) { err <- Inf best <- NULL for (i in 1:length(avec)) { obj <- sim(avec[i], bvec[j]) if (obj$err < err) { err <- obj$err best <- data.frame(x=obj$x, a=avec[i], b=bvec[j], err=obj$err) } } d[j,] <- best } d @ This is also quite simple to convert to \texttt{foreach}. We just need to supply the appropriate ``.combine'' functions. For the outer \texttt{foreach}, we can use the standard ``rbind'' function which can be used with data frames. For the inner \texttt{foreach}, we write a function that compares two data frames, each with a single row, returning the one with a smaller error estimate: <>= comb <- function(d1, d2) if (d1$err < d2$err) d1 else d2 @ Now we specify it with the ``.combine'' argument to the inner \texttt{foreach}: <>= opts <- list(chunkSize=2) d <- foreach(b=bvec, .combine='rbind', .options.nws=opts) %:% foreach(a=avec, .combine='comb', .inorder=FALSE) %dopar% { obj <- sim(a, b) data.frame(x=obj$x, a=a, b=b, err=obj$err) } d @ Note that since the order of the arguments to the ``comb'' function is unimportant, I have set the ``.inorder'' argument to \texttt{FALSE}. This reduces the number of results that need to be saved on the master before they can be combined in case they are returned out of order. But even with niceties such as parallelization, backend-specific options, and the ``.inorder'' argument, the nested \texttt{foreach} version is quite readable. But what if we would like to return the indices into ``avec'' and ``bvec'', rather than the data itself? A simple way to do that is to create a couple of counting iterators that we pass to the \texttt{foreach} functions:\footnote{It is very important that the call to icount is passed as the argument to \texttt{foreach}. If the iterators were created and passed to \texttt{foreach} using a variable, for example, we would not get the desired effect. This is not a bug or a limitation, but an important aspect of the design of the \texttt{foreach} function.} <>= library(iterators) opts <- list(chunkSize=2) d <- foreach(b=bvec, j=icount(), .combine='rbind', .options.nws=opts) %:% foreach(a=avec, i=icount(), .combine='comb', .inorder=FALSE) %dopar% { obj <- sim(a, b) data.frame(x=obj$x, i=i, j=j, err=obj$err) } d @ These new iterators are infinite iterators, but that's no problem since we have ``bvec'' and ``avec'' to control the number of iterations of the loops. Making them infinite means we don't have to keep them in sync with ``bvec'' and ``avec''. \section{Conclusion} Nested \texttt{for} loops are a common construct, and are often the most time consuming part of R scripts, so they are prime candidates for parallelization. The usual approach is to parallelize the outer loop, but as we've seen, that can lead to suboptimal performance due to an imbalance between the size and the number of tasks. By using the \texttt{\%:\%} operator with \texttt{foreach}, and by using chunking techniques, many of these problems can be overcome. The resulting code is often clearer and more readable than the original R code, since \texttt{foreach} was designed to deal with exactly this kind of problem. \end{document} foreach/inst/doc/nested.R0000644000176200001440000000616713212620533015017 0ustar liggesusers### R code from vignette source 'nested.Rnw' ################################################### ### code chunk number 1: loadLibs ################################################### library(foreach) registerDoSEQ() ################################################### ### code chunk number 2: init1 ################################################### sim <- function(a, b) 10 * a + b avec <- 1:2 bvec <- 1:4 ################################################### ### code chunk number 3: for1 ################################################### x <- matrix(0, length(avec), length(bvec)) for (j in 1:length(bvec)) { for (i in 1:length(avec)) { x[i,j] <- sim(avec[i], bvec[j]) } } x ################################################### ### code chunk number 4: foreach1 ################################################### x <- foreach(b=bvec, .combine='cbind') %:% foreach(a=avec, .combine='c') %do% { sim(a, b) } x ################################################### ### code chunk number 5: foreach2 ################################################### x <- foreach(b=bvec, .combine='cbind') %:% foreach(a=avec, .combine='c') %dopar% { sim(a, b) } x ################################################### ### code chunk number 6: foreach3 ################################################### opts <- list(chunkSize=2) x <- foreach(b=bvec, .combine='cbind', .options.nws=opts) %:% foreach(a=avec, .combine='c') %dopar% { sim(a, b) } x ################################################### ### code chunk number 7: init2 ################################################### sim <- function(a, b) { x <- 10 * a + b err <- abs(a - b) list(x=x, err=err) } ################################################### ### code chunk number 8: for2 ################################################### n <- length(bvec) d <- data.frame(x=numeric(n), a=numeric(n), b=numeric(n), err=numeric(n)) for (j in 1:n) { err <- Inf best <- NULL for (i in 1:length(avec)) { obj <- sim(avec[i], bvec[j]) if (obj$err < err) { err <- obj$err best <- data.frame(x=obj$x, a=avec[i], b=bvec[j], err=obj$err) } } d[j,] <- best } d ################################################### ### code chunk number 9: innercombine ################################################### comb <- function(d1, d2) if (d1$err < d2$err) d1 else d2 ################################################### ### code chunk number 10: foreach4 ################################################### opts <- list(chunkSize=2) d <- foreach(b=bvec, .combine='rbind', .options.nws=opts) %:% foreach(a=avec, .combine='comb', .inorder=FALSE) %dopar% { obj <- sim(a, b) data.frame(x=obj$x, a=a, b=b, err=obj$err) } d ################################################### ### code chunk number 11: foreach5 ################################################### library(iterators) opts <- list(chunkSize=2) d <- foreach(b=bvec, j=icount(), .combine='rbind', .options.nws=opts) %:% foreach(a=avec, i=icount(), .combine='comb', .inorder=FALSE) %dopar% { obj <- sim(a, b) data.frame(x=obj$x, i=i, j=j, err=obj$err) } d foreach/inst/doc/nested.pdf0000644000176200001440000043162013212620533015363 0ustar liggesusers%PDF-1.5 % 31 0 obj << /Length 2619 /Filter /FlateDecode >> stream xڭrŵ`c{J6TlrLBbק_ڲ<{ UMQ_Tg]]tma*彩kzFWoB~wwWVU `%lgg>4V6-.O]hO,;l犥3ʷ| ´XZ-Z hpQZwR7/W6;1~wsLDsX50;9 N\re+6PrÈ}:x obH;~%Wv dMHקgҠzͼN!6ѩDO,(SOmA$c'[H;B#@d*$PҝJ4m3 _*m6G:(6P8C@SVKXQc1Eכr6n3^#ƻt B0LW4f5uGQx"YJ9^@ge`XH)%-kކ+ C4Zu8 8y6Jaq|"jה ^,Brl?ǐBb;a[|ӆch;3&.{ 3MpsfWYq;&6 vǽ8Ma`4" 'L@pϏYL`YfjXX1U4x`LI?^j4y$hP &L |9*gneHxCMGyY$;r,XeX2_"`Ȯ7+&dbqeTMyL7:mjU ,DhU=x mNsrE)\~ync0GKA#D_0Rtw{K[ 3 `UθxJ$ozqSQP)m:xa;iF z;IVc1)QJMϏ1n䵰T͕|?#ea5u1$غ8|:O;P%xӶ!x؋ιuR1M\'X .F,¦ O%!܎v15_}t'z8F &n(͹C*ճ1b ӴXul%ChN5>QU**4ja׉V%`3[)g苳snW% 4y |SQx"~紧44@=Ԯhg餔Yv<Ɵ7TYH5ҁmkjS5;K?ySazOlWcI&$NK'p"VEP Iw`bs4 njIF3ݕ>VP0['Uy/M@g g<#"gRՋӧ8AS>P3+N[}Su``&ep8MqZD@N98R].x >:=_ .d;w!di2hRwR~Fӗƶs„ٚ'T%a8׭y]14ݙ͐QPjN8Fپ*6q3Ͽ^]v Thr_b ?x_<Үma*jkMA\ׅoP]7Y(xuTRB**:-`>6cy&PP'X =A qkb\ 5ocBa*%曛`?gϾHV\rbRZU8Q PTA4X[F}'AThl.ӎOw!3y ]1!e4%]!{~|% /QȜSFpf endstream endobj 50 0 obj << /Length 1984 /Filter /FlateDecode >> stream xڭYKo7W,PsACѺMPhLJZpfV o2d'/ʔs:;gB"+,Yv:Yojt <㳓/I7Z-rY[q dij36uJWi<U[x~O'(ʜ U l88= _gRTU#"su(S,/p! O64pCoIQ^CGCю˖3c)MGo>ތ?`(8DYam9Wȧ8^J tf:ϳ{W[CWXapj=n[ ZX=!G$ pbCoXoB7]iLEq޴*paWVqP.YҔ &M2s>)0\W|/CC'kF] ByR.8)ٴE{{g`dz Ȫ~nas趥r8bY0Ck-]]j;+} qۆVÚ:+ru<*w1ejlMWՒ vQ|ȻQ0ފLpzNJ+!o8Pex#Diɪ!CQzϹ :%(w(/1̯IN 51j XO, ̸2i!0Ё̢UҎpEJg9ۆ!Nڴ4a-nU9E} .D`<͌VCI-ZlY! j5nJҺjM/Xjkv^ uȚҲC}DN*XxDN}u*&HgSG A;4T>(<5~(JiVn2xnEy PIލTφ%֟eZp| _k'te# V`\>@F8L (rc+}CkقIlۃVgR-"~l7`nv4 ;mR't`V_tNOH~݄ X[ϼp&)ĂkfOC-$ hmpY۲&Nt^ܻD8RUb>l˲Jo'ߢx#6DQxv{F-G@t]䣷X:$#gc9J"@oakee}_=;H] S@ִE21ւ}7 (S^h{hc=ӭ@UdPuӷug!0aA^G!DTs #hzeMC m\ّuDPD4uFLr-JOUO?x9CU!D!,`;0L2DC/b;ǚMspu/%[J2-9*$ ǀ-cں@F0^`}щ! zQk,B1^»0@ K?ae endstream endobj 57 0 obj << /Length 2806 /Filter /FlateDecode >> stream xڭZo_kHCC(PVb7kɥE΋J-!E g#Y9۫o>h5Shճ6(u=)O]\vwt7lO4p4k"|qњj&E*~rA`sKPyUMRH V8>`Om|][#IfQ2y~N \Mu (UUL":K y_&~>@oS;mn0z ,rGwΝ?kZy'x9IBq73+Y z 'Lmly;\IiٛS2a[S`$C4e5iHNzi;YlNWv9PO06 O@wBӖ9ŮfXeNiyv9v|^FPEe'k(geU'1)$(QOe7 3U|Ώəͨb.J\)$!žZ~L_?wNc TCkԦJu9$@$ct 2[Si+|cJZjkl]Aa=1y Fq*i*+EN?[00xEa c}mQWj|C$|+r_khp4)9 |(Wm厭_8,֮&Оzqs ]4ʚRE{WڨƒCA|-?|$˲Nz2 tS2,% ^S.$6t}eeϙ{9tt]Fh3?~ ./֊M4#dw?濒烐-9% y :C,U}ڗ+!d9bbI؞-P pj[mL;H_X+Oѡ&wrh%"%)]ΜZ\:!N5gL`4)OTrʐ;GUwI~PA׵ i37!@bpK=~9eTwDC>upѢ? dI&$$:)A3鍊7Y7 ۨA @a`c>G,Yv9r`#Di& kaI^ace+x4I%^|X endstream endobj 62 0 obj << /Length 2809 /Filter /FlateDecode >> stream xڭZ۸p@3hC/@EZ[k֒VM~%r8iN䧋\^|mt$׉ 2)MLU%ms=uk=x׹fFilik ;mg ׆ Z78h0%-\/4PN,)uHd?'"#}wɻ^Uimx(g}N=LTofv}$Ri*p-…4خt'+-J|zv!rwI4(Hx_\~{yݑ6N~.J?;5k.3`Mn`@ ,+X3 ~k, qdD؊Z67VTe$7 rs>l)k,jem(ZBW ǣc٢/#CeÖȮ(HLdh(T8j+fr@>=CV,[!=ds' &=WrN43™PVPS4uW8)90 dIs7{hYg[FNbRh< s֨j'h#a|}+#wWlkt6S֪oUU B9WLRV1BX86Sy]2X_D_G_=9΃܁;Zip.g*Q٩EG=xL=tQG]46s9=0{OM-YXDc5vgco]s'k2֣` W3T~#ϼ(i@Dzcƈtw'(Ln( S!p֖ W- ܺܪܚ?  jW M d+Yi x͆v[ ?WL !ݓiaK$'ğYۼy! !7b7y}l!Z; =T!ya/"4vng2+3>qlI c 8kDˏu -R_Sbo[(ŊIG$8ʣIZ>yE?DQd X{GKS (A|}#Jv(WHӸ]žU%z*3ږdNp™\$n$GeƓ[t]DHsp1l\9\.^iRL5y|ȉJ'$3uqX(v0}HLRpgB"@D1Ǯ+#|dbZV>opZcؑ|i4ls|t 0L͸ QR'gUnYwd"Mǒ* Bnã6@d:iE{`tUR[<,RblCe_hN∆cC.#!b_(~!Y~i(m1mݨ:Y4b eGy Sc7x*As-$i]Ci5r l?#ǥ '\kGɺALf ˼u)Yw#I ;a۬?HGJ kzR˅)ĸxq,Iz[76@ vWӞEWEƎ11s:.QiwpO2wEc(J4vgdpY=7]wyC݄;ІWz#slm4a@NT:(Pق`}!l5xgX 4|HˣϣFB8`(d9bQfr@ABY)᫮UiH > stream xڵko6P,,zK hE!?cgqJΜnߑ(dk։cr| Ђ[ L?Cբ4H0M` S4pI"eППrtL`,`TFx#3d\-cOY O^gQ 0ޣWĿouRzS6`T)o> stream xَDq@F7utwє4jȈtf{hq 3/':3=pU؏10uƳ? /}y7H/ `}Dx$dz|Eh XFLmlY.H.%]N~bLԍpF7/+Q+ѾEIk/=%T^h|NhLk5}B qa|dDOLO$Vh䑹c[c#MSbH={됗N2' Mj~'@d=IR1gE>qGѪ*B#&6coȀGA>V7՘q'_-ˣTnU.|BR̽(\KC%1o"3َWR퓢S(zQ4>L^:wk01Cj6z:ɕ%s @6KbNd.يA_|IN糙/Q'ی*9!?}[K2,okZ0W=9dPވ$ӎ?D]ևY'cO~0坐R;^MRd3??g'уsxtU 3Akbv +Lzl䄵bº[%=\9^Yh0$?pҎ:3vsg٠OګĄ,&OIr$yx$$q)(c +8?M'+0sHrTl*TؿwP*v5=煅I @GGDC}Z-ch)"5Hs <ޱ4>B,zdj*ȉJUIdzM.UEE\x6Ne UIS]L~&8{I/ܶDb0xV}y#¯#q~9!o=h?nT֜LDgNqaa!x^]'JXbߍ}qL~\ij O0Au]`+:7;TNc[&C]?X*CB(I@h~ /0PyQCɎayQ<Ŝa/1$;>6n\^YZ]H#h!ܴ"=\FF\Ƅը x^nΡƖ=ehjg|>4 > ]#d/mpVí%i ?w endstream endobj 77 0 obj << /Length 985 /Filter /FlateDecode >> stream xڕVɎF+bF޸ $CR#8L&_ښf;TkyuF=+~X}خ?:e:)2m\r+ mԧ䧶69uyyc<Võgl.:NnztZ}]}]Y2ʪ4ܖ:OOjGetYfꕬN*5G留WY^1lօ;p˦|6߰6KXYQɒr| Kjy;^b*`pI[ RԖ3׎8upLI)8}bR3 ҆ɇr`A!1}}/d0IKؠCHX p/)(Bo೒mώ˪gHl{^Aze0+a@yh9&p4}kŏoɵa _]GXss endstream endobj 93 0 obj << /Length1 1846 /Length2 11740 /Length3 0 /Length 12900 /Filter /FlateDecode >> stream xڍT- !8ww kp瑙3s굺]ήsNnRB9E~Ck}= -='@PZ@@ODKOGJdjoTdkgjm/-hfڿ&+''==?Dk[N M  Z۸ؚؿGp%hڛ,V4Z LA.ކɉhiGkmkCA p27(@ C2@K_‘LLt(Z;mA7-d x[(.YI@ ks +w"S?֖6@+S+c +"EklO Z&-⁎@S @<V_ؚڙZwm2Y'dj 2xw?w6tV_@BqLp،Azzz6V+l`B{%N3iXDP4x0(H37(TpLn%Jv$Xx(#$0 "%CtyZ_+ 7t}'# H,۰P2t1\CKgRmxOc,yYz9Nlr]k̏#?%{>w_v 4AfV%C*4zQxGJ} ,O AWrxc5S  c'ŋ&NtI#ҊTc;iG&.%h1XfjymȱKd|$ lkuޘd R%*8چ{!=*C+K2u& ?.]gt\m|[K\n=< 9 )nˆYߩ̦NP|Ȏ4cʔL%{7bN~;f >mM87ad;b}/D¥º"<\ >MQ5V$6sm C0M\ern'C1EA6RC#?2gW\2P,*)p&^ H !ٞWOѓ$p/CdK>;*r T %?c =(k!7fYjO~"9G% [Spi\xDiST5`?AYҴQowl0硑,ƩiД't%ͨ.I&Ԗ#f5ez*9U3GzS>1ALBSs7Q `22U c›B@Y4[Dwj}od:g935HF 9'L ̞ꍰؖIE^rfcx(mx1@փ-F%4;,))\MDKށamcwS:6C-YS<Se͓=fh: ?Lwƻ(d40^ӑ5Q-9 p((bKdr7&{@DhrO{,s\YkjE,j)P7mZ 3jhXM 5e)O 3#8긵4<6l7 RM5 ?=-KBP rF9|Ƅhp+ǨΡ9TmsGeu[l`_ށ|-8%Q xkFg;1꧁'L\a4G%kAe!JY5DKT߷V)6^o BS8 5UN lOPWr6$dtAཧ5>6mNW9s25$ s5Z.TcN"7qOR]pp{Aָ~x}K Bg¬5H;FQ)E\i飌O`K_%,p%Y̱Q#,}8dzBS}V'7~$.2G$90u)w;F}TW >V9۞^)~jK}NHVZ3P*ރ 6UauփcnXV:r!jH*|M!\dtm<}]}b j_s ]FCmvg*, "*=QV()sq7^$-{6@U0jם&ټ1ۥX=bP ]xG"%]QCl\>e6J4_I%(x{]3@}}CbnUcR'Gjl@>C:t(> .^=X0% nܣ`B-<֟@K)6Li@H|r1R%76DԆ]?kLzPbJ-H2"lmefjij@^a ō.aJ=܅JS6!V@J]gY#G 3V]}Z1S Kls0 0fRE@,d^5r6uyrQ@A1X2^qE+LJ{dKV:<"22hR{yܵ9I*E I$4*_1`GحOE<^ y -],So^}>D$6^a)P8&\ cۙ-+1N+263`C.f~V]h{ 1@LVPKOs{Ɩb7.-GW52"[mK6@ݶ8 :HB#nQDx0CK`xy˪YYO D#TAޔ a뻮@dRu-}ݴ6y)wue- cg[4} _g_ECp}MiJ%ĨJcKJQ88^i # (QE|;5|ٙS sw0D5F|qʵLqdYAp(O[{* uS*~DA"QOMد#kF̢:#%1n{ݣ+p0I/k4 O>O#&vT(cY^!}v)?0.&Gl_Ik.DssB?gI{,, 0 k:rkȏvg-;d`~-2zG`8>K~ xoNKZXRӸf$3E~}(&FBibԪNuV$U M9ɥkmfRkIxVI^R _Qc^i:8=FJ ،N4Xcwu 1K#); M %5:OA>0QߚKg1ºspnToX:^]E#d{;_4o6 Ku7ûU\ M*ѹ (6\ض> ,`n~Nn3˶?n!NpʪKf0:x6H<|8bW1r" ?i2[3ds `5E+” E(Ԫ ΏZ>\|) I ~9zH_( 9 OrOݹk[:D0~mAj,{8&2S@䅪Bpȭ9G(cG=ofj6h#—ZN-YfV6םppL _.54B$b6Q5nm[ZQI[ #X(+/QPޕ|'Y&‰ݓ#@Xԋ)-rG6O{c%7wN?k@'pӪ=Er&{ Ra2CSJHP|q{9Z"xNx(CLE.2ekY"G/#nn> IMgz4InnWkX'du5@RcCDf(}Iՙ# !jqvO^vv`$@Ƥ'k-n| d*:AmA@0fW 7ɗ{\%R4iNc t;u`bf;?!7`ٗz\dátQIa24͊GLp9V4K< ټH̃J FQnoE×[t-QߤrQYfk|W&ZqJ{B{JadgJ7䭹-Z4;ȯWKR?HPF!_\CEXLZ%K;q»"e69a17qOe3WΘȵX\Oݥ\9Wa+YA@4̩&Fئ@,_^;Dhv{arJ'fobQI^LHEz$1 'e&Xd.6fT+u?<Le2Ɗ]Zu_yin> = ? Fբ]G4 {UTQu-, QYL }bD>1$=i@nɐbC8av|. 2 J(wύK]J)7,45wDvZ6৙=-Oirm*4wJhktjcfq֡PS4Ћ,V}4׃\>ԟ '.YOg:? wj"O~0wfS@@>0DQ%cm/x;'ċ @~/-Y _y։m6R&"[/g1mZ ^tVêsw.>R@չ~UGtI q9t1pV 6L GZԓ 8 ̤{l&{k~(2iʶj"ZvNrp7d'I*mzq V6;9oKzY3 u\]%Y{_K e=kӖtהˣan>+a)F4uM'ݐ(kY ~13hnq),-2r43" T&ZOH!Yk_/NΗ-G~O]t]C}8߅7Z01BgϩtXooM~(zoH)5a>0ҘB͔V_hu%r52 @gjm%rSWr*Y: ޣ1m {I+߁+?F) O+z⫆;\L P@-dRj\& q,/mpN݅tc#%*Z\:t6/tl-pC/!EN tax5Uޮ7dD@9 !!8iz@xƸ0{N+mS2S=q1!9>r |P'}/\^sF>Շ P Vu ߴ[G/P0ZjjTv| ʝLPf{oB$at5 C[yr~Z!@@+7 R{ha)ꙴ*| ȹש("TN]E.^in6Mi^+䤹sU?~!v#E4#sA=^1uH;˺J{`l=N~L!\A9:6hv |ʺwXpuQm>2&qC䡹-Iσ:;tٍh!#Y^8l0K3ua8R͐FeNG s |g5‡&ܿY'\)ET VWh{U0Ӧ*BWpvlZ2S`lEd]zJhYS1|Z >K!+{ݐPwSp}0G!۪y}Q!|M1 h(=Kf> .xRs"ClzTč!ԬM[NyΆ*dyj:Y إы,U4}MVs5l4&7 _D;wN$Mrx0󲷋D7b*3 'Uwr{ q[SA Ww8T½Y+O$ y]ZbSX¿K#Kz`Grޛͮ/v2 Є0Ohd$ Z>x|z[SD#kkfuӕv 0,`uqi865V 5htJ_~-vKtÖ106wSpؒc1/M`!aI܋>~a*u9j=(ك7ku۷3gRG3o%_ -(Q>$EL7@}만uE0 i B˨E~"(屛.l%Gy5,,rg@\ 5 }':t߆Y 豭S`(=x',Ε"^dmWD*a(]- xcpĝ_fk ;oon:r-f{ ~#{pk]>ؿ61Rpb"[ g\Idh }6RO?Z50*d TdhU"lU&D)hCwE?[jb.xXP(JƘ<4Ga w iD^zp7͑ݔn[`/4l)&=N^ nK(Sd FN FvjQj7kP>e%!V7L{R 4LBnJnÞ <{*үhMσ"| !))`I }nק ZP9ɱ.F!PgtN cޣyT4ά1g]Vs#bd?@b-tu<"K>GUd;f^HSst71H4{^U&=E0Ҁ}jzg0[8czh"b#籖9"9~f;R3YƈRar.|[39w2n H#oqHc(lcYHc 2킌ت_E3G[ޏ|u[~3Ceb rg_ vHȼ~ɣ0/gq GjsxnKo/V Bk$VCL=`xALY.!vTέ?Vr0&)[PDBav-pD'ūUŖ ϶Jj̬t6\$V?x? s=z9.n~vLr\ Xӑ/--F2wV)YuC",e?u?)Ikq+bOxW"^[L 'S:A-dlFPz#]"5|"\x] |N94ͭOЃU+12U(P}7֏v)c^lㄘ%69TX6~)_Х9vE&CY#lru|^°{lw\vSlIw"X]KUՇ =ؚf@᡹(e(n4VTAq+MMrc*!%^˓{ϦRFAs k:1§k|Sj ͨ3uԈ/+ dx^[,{lU+גyVPO*SScfMk"LnJ w\H<铦G܇jq,夁Lȹ4^# p2G,")FL) ]dFylN0˗I!]Z9+Y:.ȥgܬiTTb[5t$OS1dÚ4 b>K m׊rqśB\1|'+g6 ݀Y2hD7左-Zmwl5oY0dů2m8rDL/;sʼ$4K^y5t u^w K̏3։bOg6sɯ3TC;WekXo(ݡpzh%\GDV}dcr"ki@θ@C#_X4m2ǧg z48B!I(*BO7t֝2Stt 3‘1jn'o6~,ˈ}>Y(r<[& $c] &@$ 8~$5A;'tG dI3~$cU& "=s @TKa]̰ C~q+Ugpg9C;ܛ1.$&)ڂToAƂeπ:kzgHٗsvIBe).P2wg9ق/ш(ηXݻiPi'^ɒf*!uvF:, e_GXvδ̭Ѧ1A#[ϟ&pO\X}HE"sk v[eNw]abwЇ]oS1 EҒR2r,XuZz_E@!]do'v|SWQAA#ǽ,ؚ,U$=vՇGL9D;7Hqհpj H'O7;;3Q?SwR${Q!I@~ڔ>1g)L]4t_*(;A*d,$W8K|/'1"/54tŽGBŴakO8O{_z૷:Quy§xך7fUi&ǫGRw9qp?ѢyRMFIFf68-ahc:8%4Is~ "S/YբW⻔[s :_[oW~-,BQT-#r2EW!|sMU6z|X\5Gvof,dIȥ֬yP;`tY3 GIB{úWc93._)dtKSTw ޾a+SՂJ̼=F[}kBA4GL59fXhGffqͷ`|NW:0D6"K_0sl3б*K%U\VS*"@h?/u~@y)`ީV Q+(@Wa͆hZ=kGBƿzP$gmUc2<VL]$)Jb?$Rϒ@xv {&a[̉pI[q~lT|tV&;@7e&~k2LX6 TGTr `?]'lt'0_#-_3!|o'.\\=g,"VA`'tʁ]ه^eqH{:Usd-xh(8] RkV@;g %֌I0w2]JIW/)!ٞI`>RP8F W#Tĥ+y":sps-I~02a} зpR``h'g*2ܷѢg,8rqf |&.ȍ> $veq*]cLJoC6Չgw^@ISH?3[cMW>GzW`)P y5mLKo plB_>f![ɛVœs\vVS.FUӺN»UcYr<n{x`3vb][B]߮D[GDy c'Tt ́EiwRw}>6uM}DsM|S_Р$y)cVƑ|pш.:Կ]~e4k$V endstream endobj 95 0 obj << /Length1 1407 /Length2 7301 /Length3 0 /Length 8265 /Filter /FlateDecode >> stream xڍtTk6(RJ#C))Ht 0 tww " ) ! 9kyN]CnÐܜ@7yH[~lG_iGy!*p@ <@@@ p0InFޝ+d8B @ݝ`(bH ' wga@M  5'6@Ђ["]@ w)N0 #t2@V`u9nN+W!(w2 ك`nPj )s"]d僜AP[w t7_!P{$5#ׯ2w, A`HdݽqW0 o 5= Q sgABB u=wn/{=n r9CHG'X@H9 bǾۿ#`77;YanKWWYS_<8x<@7G x: _}UY2{wQ R Twԅa{pw濪?93q/uw2P߉P]@,NvU@ 47'B,ԡH-Q#>1wY@T~uAqO"ِ;QYnK}<# nw?NpqȻ^K#E @\,!o_͎q`JIJA{gz<&.ZiJrSr&6U'-p:8C۠(zyc2*4ܢNyDHþq0TdR{027d}]yt~2YC,=i0`qgQUb?d_ S>ח)2%m/71iprNRg'?N:h',c^#dTY[2 H4X GHSC+c:<(APm]1/ã!)aǚh^*X쇣t"q)dV^aP7\'"J1|V5]nک* K9ꌟY|UhQ֞;Xsp+T=&Tf3`J'=J|_H됡 'RdʍF7ՕۖujJNZySRbw_u\]<}F lZ'!N9)?":)G*ݬ4mUC ,uY2 yzO8]ևzťn .ef^5%oZ6jCՂm&f2;T!Kń(A1,RvN_6םP_*aj8G?[@{P/95+ifV_l}Z>6 ^s&~R}cb˼lf x e |-plLehFT}ĒFhvz-l9dP4'\K&~:D?Yc0?%s}/5>ercXG/=7+~=ܙ> s)/{kќ;f :kzy"= eiO=bΘ\q8a\Llih%$̵(+m?]QkPEd㕋p}t9,)igz[7'"X8T,/a*97nn5WȍTr$vNJƟaڥS9!H[`bj-އWbaϒHh9 |-~;MB1!QQedf#h=>'' ie.]I*€ >U9YIo JĘN.qxϷ yjk#7^Dv8!2RϘgILS6O3f"?7d߶]tNaRA-e h>_xOCCB󓭓9ڣ!Ag}#Lk` FK`ӏ{*m%R Ǽ0$);m_" ǾYrjxeYq nV K81EJڃ y0vNbV] 3k%ӖrQ'cmTq4;(7蒻+/H@P^:XWay0ZjuO_9!ɋ3^ϤYr*>v˽J7ϘG@O9÷bÚF=}0*xU~`KBޣFJ.}y !+dWH()LDohX)ݮtްjkƮQ0њ.ڙ23w~?3jL΁QQYv\?qpz}5hN[R$'ޓjo: t}՟6@pGy:Z6UbcO{M)AÀ/SUu؋ xj L!LIAvsM>[ ?7s'pO EFO7D7 p JED3:n]T-}IL,=9._2;vf\O0.\*.E`"$+mhI-bi16/ENn{h [a9v<-[ϱL¡]4pwZ k˷Ѧ"pzg&Ȥڲ?(|FլDO{חA_pvBqDi4o\tyF a@VvQ$siL90! ryaơZ|l+~5G:T;(E`ZjUחL(7rٯOm&VMUIW%4.ւkA{&tys:# X)'N\.櫂)mO2K 5 fwv(n+W |uM>J6N^'k'b ?hZmUnߊrz0%7WJ[~!N]:qzl Gc3s@X8b /.s lq.xFi6Z7i_Q4c6𥎈}Wy+pYji(n/4v"&=/ (gn\̤C j`b ~fr@v˗_KM,x;H-@(%ZSZR#(~ hdpL 0FBIF;g';XBazV͏XCofWOeOϡP'8YuRnsBE"U΅NؾsϽnȷEO8hg @Y2wfQApݑ7 1A4~G \'.{MOR.IÄ5bSFomt;l㾌"4G=ZUTr8^Cs~1¦h@CphjLΊQk)AP}$ܱVIP*1˩j<Q>-GX˄F7 CՈc2GAUNc(  t-G(?' w a~Fhϖ-9 ڜCA6-WL/sA˶u8[&6´̊Eh7SNd=M3CB=5lccӋu[3z*+Zi}(*X!2>! ;Jo)<4tM)WZS /ю]hPH&uo )t ~-_u%^WOxl'1/v]͛HFo]э}`AnږQNZnRU6g&4M%!3Ef*^-Gs z/c"9+Ӗm]1Qq3٣XKnKFOI’,>T(7|~x۵&t[8 _`ɼMwqJ_kǥsB}E2?YD07z8|; =LqN`\A>{:)EN7?e$i5z; ʓ 5o\=ݟVP _[D1vM &\'gu7sNy*X.{$z9w7|(Yf`25ngXKwwwrg!dhUޣu,S3r獤of}9M05Ի܎k%n^n鬯E]_FOQk-~܌jz}-rŕ9(vJyn&ZPDTzkN,$z8Ai>W/2u4Kwٌժ"??T_un9~?OAu4` omȎ[?}h᧺DGIluR:-*$5g.to, 9AJyߦ(L!?#{m-DeEW_vޮzΟe=+][ߐUIgO%!cpwYvi8 dv~L.CVB2&t^*h]xowjM馐hBm {Lڃ ўp4y, &ʾ=酢-c`%P5dS%*uM*l.ߘgK|*Nn |BOuVd ݕ\NUǖȃ=44_sͮ=Of4fF.2s6+9 -a"g0=2ʗ-/wN.e+"Qo:}sm `zE~ǮdgzWȹxJ~WdU(mp4 By1VJ=k" bL|Tm=y?p3'[@2h9czb!,\_ l- \4@F@.FHuVqpV]f`dNrƠLU_1=W_Rxb"fWP6-%xz5':6EPFl#'uJY2kptڣbh^~t ;F:]ϥ\?2A!Mc)Z8b[*^n''u~^{ _W裡xJT:p9>ŤąK)j@Y#Gxs]2Pn|v \y:͐t'jʹ-GۍOu*mCeL.jB{/%6=mg4UBBy<]܇+oz?)u&kOO]3FNT?f&SKp4*qW_L<6L?Vq=`vPf^w2t; L7pXOmH5uz!&D-ݘ3a4g|j'6ժ@#TUCR! 1J֓BYG⠷'Ym_1X'=OĽPd{$DYK=`"/Xq |VN1~u:; {Yc;SE;vd,E)Y׉בas 21]Ϥ0p:&[߭߶~CmӠ,ar^7]Ey=y$|cgA7/[4 71v BԚ| Uh e!X5GSq,̷i~X)&+nrX,@EM4 Rk.2/V|1m#S"qݮuRQX*ͅˈ-NXJTSb Evѫ{, ژ 9.75x>ya&8SmfucyONKZgeL3q$>5{Fp]IiFX`c:Ȗyii, GK{n-BZ՜ٸZg%FGpqz79,5ݩ,1=}gkH/V/5[_l#FfmkZ(jKv[Q] ,&Qu-ѿ/>] E@4[Y 1%h  } 8 L xGrL}-*,C0D0m;[X&vH}`<|`#Q#3)x^`0E~k@2,aY<lݕ֡(\[`m_)/w8 z_-_uSdi6M'`Ȍj@es$ baՕbiX2 =n8Dc?]IztQ^,2mXDf/+.,TvX(~[js4U=q}Y*c} Ų[| OI9 endstream endobj 97 0 obj << /Length1 1855 /Length2 14761 /Length3 0 /Length 15916 /Filter /FlateDecode >> stream xڍP[Ӯ %]w~{WSSzF= =+8BzNiXcyY [L z&@ˏ ,@JAe`AKLgiOcmgCNp6u0(vN@Cd,UFK P21ˮhmg|,L VV@;Eq) /g ?#՟z֖6zVV#S @VDŁ geGß".iHqV֖@+{?  >ݕ5vrL (цV(.ˇ 1LGG.&WrHOwkG@OS#`t,==46'h\ @t|^VyJb*U5k;5@G~κ*1w`aE$q8Hw/[[piLBDsZafU]4FOӇWYTcG(^ѬPh=h3XmS42K>Unr\c:8G}0X?ZؙBD#te#7aS*P j' ^\:lݠ#_Ϙ3=.#=j/d6f-QXd/.rMue wdEsVkgi/60h\b.EwC5}]shTʔs vN¨Gj}z JJU/ʜ#7XB3:eE>ov;Up"BTU~q*"&[< XZ͇r[P*@ i527z˷/8J6@F '-4 z`1$)doF k5K_+Sg'#ߠZxNE֤(Ͷ5nJ5;Aօx`&^X~fLf[ऄbVŧOJ1`Vj l '7 P68@%EJT@c"D&ExG@Xp(!vgf2=q<;'6wF[4 2oL(|LQc-5?7UǕGOW|hy^Skmb-TAl]kքc 8Lml.r\Lb K9Y<$SA LS0jʪ&=\޼ 5mϽ5d4RuśWW}[-xP+rrgYNJ||˰L!dOSRY:$t . L*I K7X".GDd|T@сu< {-92O@l_t/1Lh%]Ѓ4BLs;{X:oOd<9qC ovxͳұsk^ Q`Cjؒ8_* -T6 m7_)]lz#}7qOY &uq:\Wd KLz!h޷ci +KʊYʙxwEC!ikS͜, !L`´6dPȲ^u6 +rEn1 I7'+n=;͢XN!O\Q@vX0?g>͂}[ӂd,!tH?‚u,rg&َ'}p:sӉo_cZ?HxdVj9CgѦ\1}K6@fY6.ŢK"*s_<|Eq`*g\#Y$U.U |<KGcLM%F>Ⳓ_#,p*m鋟8Ghp]J /@h>#L/brzNnʣ:3FQGTDISxr3bp.dO#|F)M0jac+; 0#xyPNiS 0.L[ҟ*X%h8(M|}c=(a߲Uk(kfFZ!tBCr}Jw֊D( .sj ee'2}#_0ٴ`q ⒄=͕r 6eM_;_C84GґM# xFO51]rO%/7 JsҸ@XVo?NOip(=~2*4R KLSIj삍% ,\>r5Cg1A~Л ޢu^w͑ڑl{隇`$1usz ]/6*A:2&Ev y2P뛛VbU4仅B;"tu2AbCol 2A3aA39s:f,|D eCA976 JOAcː^)ZB~nwsՊF} P96h!FɳkٚDATJ8r/>~=ž=Tw ݒ#L|ɀm|=>/m\&g" 7=s*ՀYv]B ԡQn U|]pJxM]8"+J2;Ci]@Ebj&I֨ hJ ԗ^Su[gKW 1PeiIYDpҪZ|c9; :4 Y{H^2MƬ+Igꔺ/I~̬'ZX€&KH-u]_6O_:8Օт^Umu Fq:Z_ifO"jg~f:Er3wu*>{4 ~;4u'x{tVp6rIDԓwc3$R\6( ^5lO4= uFcnN~:UnCA7 N3-А[n烺@rذgs-a `XwE`\.2>%=ZX '9=ԇ¯? i=ȹ0yd{Ap.͡!2 0/^=liNh@>'%0<0J4 ^ӂS!8hoƉ6p+k?Yb: uݩI(h*YTdΫqT1KT-BF6!(|5 ]"\Ӎ?;"Q=P3'H)^8 [c`fQ%߂z]͉ՊO6ٗm~jV a:k:h^}Qx'N %.X=u+1 <61_JLw֥=]FpB)bk7r8KTT щq5/~,7W"mHGL状űZqqS0~Iﱝ pT#G0 X" 4ӂr 8(Kki#, ^^X K(8]۳}S $NPyrH0*=[8-I|`'\p-8"Iv=݄l0!(eRNh S-c^4>IW \Z_YP6Ҷ=JM\EEָybE'IB7WhrTzmq>E1w3pOWmbk2~WזmiJt _q鷹MZ#OmBѢ}R#iI|5UWϗm8yb~0YwH|Ǻ0΃1[ NYU>Z+`IMx}^qOw^ŕaxS%0 F~ 4ǩN4(]B#/Xqseu:Pψ3po#[L!eV:B<6{F&DOZ|ҏ Sw%;vFȦ];W'S(vHBwQKxP y`8~dch*4&&qvwh},vXl%"=5g:Y?O.a8~9d -fHR&xD1nB[]9{s{ѷ_ZXv:>}^z>|PҧĂsF:w?9Tb,IwmD8=K'ĉ|۞镔?&A].{uPɻVAItVߋܮ~4쳝PKM =Q|0{gUcf*KNJZWJR>ϋ`9!˽NNTXJx.E*hl.vkSkl}u1_M ihcBbYcIĹg\E xʒfh%]"*/J!ߖʥߙ ySAIN`JQQcأnh6tށ">>~+u*rgfH/sHg{m7NU$f==' B0^?%yrBNHMQʬGz= 3H Yq]u"4Mq@[C$>5G>2qD -P/\;5.lߍ-<[Zi`mHY"HT2$E2Wb37J| "2pPjt\&s>LF"B&Q4 Jȵ!&=_4OTéE(@kݺf.[4aN7u0EtR]:#=HbkEX4Wx^8Ut? SybLj/C3*/]:2Y [/"fC}QL^~a:n;ñah-b=ʶ.WgFXXI0Q֨m2O{OWn9=R5yFų-]Qsp =1sՆ q/4W1ʾ^a,ay<"z@;O۽wLaH8uQI{\TY*_ƥܩwi׀xTyE@=48{Waꎶ~j/42Y =4wgoTB%E 9 :I߇.~=gUE..mԝj/q<2 K:5eR~skCU^!,֎_8h{.=~iN^F]zQ@ Ϸj< ^tN,jqwA)DڅK5EER` L!S*Tս;&I\Fp8>{ лaz^UߔuH}-.!|'fS(nYzj)ek|GխףW_XHpVV`Vڹ'. a??39k}UMY:#$z~&6?]ߒ8e6"iGG +Y8t cf Ȣ4-z_[isv\C]!T$Hq#SӋc'D3sGU\N=%&L=tljyS%>9?joKZB_vF۪Ў6ளηZ~%R2VIľ( kVN)C^ KT7qTAW!!ԁauA$'fe詒:miwn C *ka(LgYa ɮ>0@$3+]ZiA|*oqOd)v Cct&Q69\\p^!ag>=rg5. Rs fڡJ|p;ɂE?=b,]ȊThqgĻI=/GmXנʍ39= p>hYxğ5w!I6יL8 )\YpxPݨєYR_}9+5=ʦ.-|~U:$%MTp:đ#9f[i9.+ WPw!t琊+C䚉1(M鏫oU5P`moboTsPzJe/lRb+(K7C@F=KƠ7d*˗׶'s0i  |ztq=\Z y,8- b#Mdz4y>F{w1t\t+9;6_Rb;U+GFr"j8;5ʀ63"W-/w&#΀TaiKS4yJ\("Eù-fp'*WϢggvB #ᬳ?c_jSk}[,")fAvDíRwZvatl闩yVY KoUpO<7[.͘X, %(ն#8h.$oTDZXRpWp$l5(ױ8,NdHΊDŽVODz=0Sm$)*4 §;V7Ԯ{ +9lд@_H56z&VG;B$p^o4ns=S !|Ȯ{M2~i;ZёO.6I)Sy\b{4 *Wg( F3M͌˕AI٥OLAzVm5NWgh p›m:p*q:s+UP#f!2tQf{2zGҊDѼӛgvhUOEi2dQeW8_ oʆFϥ?ֵ+ws#<eƐ+M+ ̀^OMBc]?h]o521W*OS_MPˤȇlR[`rl/5%KmzBpMKy$ՠLi l~74pOp+ 3(RG8v[7_Ĩ,T/, $F "M/= zQٜL lb\R|m;ȇޠJ2WL Gx( p^*vхuT,KY/!22Į-xNXDyI%ݛ2 u7j@\L*0r X>I ^FÙCmjˠegZNR=)+#@GByQBQ,5M9/6g br鰿)Ijj, 1^%Z[g-VpvpsQ0+/qaǁ9I50qSP&=2P~,x $EBB23qJo7qx__B%=,Ы0K6(:=C+% L#^1tU78[M]#U("qt,?.{ p %RAS@p {Coo]RηM[0!C c&diѯi="cBsw!U)JAiSx"pqjT3U0^mU>PcWpg f.`$D?kC(4vJ饋kd\>PiV:yVxP("}B3,)Vf ƳPZDc˷jeqU(  N R0-kg)c;+=Ȣd>`qﻹmq`-蠭K!&>w/&+BS%Hed}{t1exwE?xCLFF! inYd}\٤xma}.9Wp6Hm9,b$~kFO%ڔ!G,H6ƁX],>+Q)=Bl6m܅Ƃ=F*H=vaF g}; 9AncM2Toǒߎi҉h/Wrq(AB)YQ2V=ϴѪDKVE!%!3L6'1EY&@=G{6.y6 V8$LV ]nf'Cy9/; Os2~ӸgkX|f~hYԀ\Gk:ڠ%64x >3WE|K1d[PCySyMD 3#\)2:t̓x "i0PbDA *T+'j<$AQfqjs\oĺteoov} Aw'd%P'zYa @g89Cem?2ȇxaiٳZ|$S뇗_{ t{AV8^:S~Ps_Ij2vAK[ 31fQ 1KE9Gʺxl궏ǹBh3 @KIH@I 2O,G_A.O|vH ϰ l1*K+Ҽf2~{z [^7> )Ʒ"pƹbo#eÌ`2)O{[svd`Pl֎ӜJzݥ5 US!:Icb.eQ XḆ ǎj 鈨 L]~Y1裺iYѣoP WѴ3$)WkMp[o?P,]P2Y&>Mnh'smC ͺZˈ-d}+|FeʃJ'@}cJ6boB 3P}<1CUA)hR O<ŲjMlw, 7|_d9@etz? ܶ2}XXR)5e&X )C?tauIE!N܁TF{4l4C` %%إN!-#Z YZDytL(ٽnӬʆ]nrOvW]ОB!e)vYC4p(Fj@tvşs# ZKOA[MLб=e#IU RQex1 |W5 w{d~+eє٧j%_L, ԾdvDko2W=74kN`f=^=vgD7DEuW׶(O|pk)OÀ8 w9%?oStgҮ=|f߈l56Q.IbGZ:faT7IhBLybK)IR20b,Ó9[smS n/ Ad4}@av0wU5qT'oF}ChG7;hɄ: o\l j x?pѵ(CΤƟӒ)8o~8=Dݮar>Ȍ$MIjP~(Ap-do]1}IoMgڈԐy)Fk8PRW![pJdq/w~M ͵V-̈116:il{زϤގȕ9e;ܒIztM3Dv䇃.Zλ ! ~n0ݍK^|;!iY/9 G\SNQc@K<~B__rwRkʪr~`9j , }J[g Dm\fUXB =DT*JrtIdQ橬[@'8=YbUWfGR ȷؾ_8yNQbbЇ< w=όT:QIp'WskTqKEek -{}Y6fv9$$9i0zFlYO0=M l;GgE,`/XHdD?`^k{!WmGuiwgv ӂPz}d,>QA${/n$W`RN4S"E0pfYݳjԓ| ;H1L.ok)KK.aa|} ,l-r55l nCjV'} eiB?\ [F玬k)rV$+o_)L `=_M9" ):Y4uQonA\ wLc7vNUQZ=X!\:==6Bz %K^-\bH8}NPN.s3(0 K¯H+n C sگ `ZގD!prSeR[wв?{6Hhu2uNDw󯬡 ]?vУ/ Xa2WIT3C(zf0$Fǟ{k@wty"<>4$~YI[NnM0o_qbz2n*>݁2koE.HZD>-~zW0^xY߽ +kMaRdz6|&a CreRxl&w?wS$usk3ƓWK<.8gݤ% Z\2GT{MKW , )kSAK:'o~[1$,JvRa~⪨Ï՞4X)19cK/Am%1vvcW,>Jt]:NNY=-ͫ!#^@Q]c[ӆ?!R4UlܢwVEb< =&{O|j).pndMA;$B2TшYj$b(0#Vds_}|om]`V7 ֟uI0~;Ԝ]&+X?Aj ˩.h`)S;FRޫ_Gt1~bFAcf\@ҔZd/Ɋ=t/.wh'ҬއD砷e 3EPq"ЧH&c;Pg_Ӏl?Ykn߽Hp {e58=p"O;=9bVg[rZMM0 _4dM \6A[-y_|!8jҶ⛱R1fpe4?wK@5:Qz99P9L$۴7n9]I^1ϸD:<ꜦhNSzĶuSZa:n›?,zfxMgVx!Օ4R#eTPKk# 1w$ ~' ([a`V jsNA{[nX}gFA#U[KJ=.j %EW}Ab;%_>6vIgBK^ /w;"aJḐJeKsP,sr8^Ǿ#x\RS6;ǣM)ƠpӓJyD MvV.6؄d_Y/hJ<Onn3W.E󭮱㾆`cHEs'$<U EP˓gkq|\%܄yXQV!֕F(4S^ z&F'hVld&ʙC@қĈ-S\2R>ȶ?'LCR~3ȹ}]5䂠g |26$~o#5Mwl;gȫwH1Z"> stream xڌP-;ݝ5;w5kdf^սEd7d t&vF@1;[g:&zFn3LL dag/aGLN b `b0s3qp32Α bjaH`Ʉ=-̝ߟJc*_A-@h5@_ nnn6Nvfhn%h0@wfds vn@hbkt?Pm6ۀOmLL7_Άv6fS k @^Lݙ`hk bIىw iޫ,jk"lgcuv# w`jakb; {U[ ?&"?233tݍ~ӫxR2geog0}Oca |d 8;}o00v,la;Zg ?t_ePTU;脄^t,:f6&'', DUwU]??Ao.9(̸#/Iof$bm/Gmhca̺8ϿoSu;+ 4pZIg=5O-,܁& rKfma Ts}UtLKYV}"R翟53alCGGCXAbfcx1 099(;Ao`8 'A? 1$ )sArA?SzTX *{ ;׻OF,AAl:c;.1 2JAm~\Enb/Nh' {؛me.׃m|տ{űW.af{w}ߓ̻ߓ~0)%{n.Nry8iotk@B;g5O_hwwUj7lN{Jޏ #_|ݿK/^}05*z_ * t:$._+?m h `gdYP+F77KFELUx'<ҋ#Jy+B:-QE?^izvi sp` >x+hND|~qձ=vih(9',E^Z1*N=88Z෨c^B)RX^Ec[6ILև{rJGWzdܔ8 蒑Qm 6% PkRWFN o lJp\{ߞr<)15C1lB @s ̆^~ _GojB4%h6˪w?ZW!Ys s=ڡF1δw2M&kj ;mKl&pjŃč񥕥InH_~'UfaCzj`M,B ؘfЭqL-n[Ra1(Cիzǻu y͔嬓дrdgbqHQCzyVBDi7pr:>uZ2ꥺLWEwt{a?ƒ5pni_Y'vG y/ g+G&Q4G*̚}e(^?,voR۷siiJ 𖘐wkPANKe`o`u? mjvI [1.]yxIXǯQ:><3Ƴ(. -(c_13_*W! nb?֒$T!H4 cGIu]CzP\lG4Q]R5 &5}&͆>L9Y>axR:?SmE)W |-."n3-yYMНztx͌H [OGȩ ?uqr4*=zJ?G"WD_*V"_RԌ92snx*`z{ 73T ߌǫ7GJ|g3!a7r6]Uo2;ɨԆZm.+ PQ; a*1ob҂ !=b|qs rXJBc 16 p `R&wƉ rf)+gvhܓ]5|B#PXPDS6Q^/9nGl #eZ \* [A|shkU ;M61kCr7׊'cH!5UiEjjaO cV {z-0*2h>;PN~J -o{ކ JUև#GZMYۈf u2~\$EN7q3_<p&EP-k`q[_Uo]zطӄ"p4Un)np-g@rdm}d~Ҁ\$rjb3<͝amiE &45cĔTL¹{='+ik$^P5>S#u`J({ʇo4Ou7)8?X URV!)-i:"fqR Cj*uji4*_}6{I;/eȽzXmbwXpi:rk C4u= GBsg ~n"er镠ryPASH8Vs}Am̘zjNJMA0& 8*xY11[(:5T]>Қy54M& E2j :PUZ܁}D Ul(xBlR7m;>(}j$E]=k]1,oqڍ}VxbsS6&j>cıޫ>a6qFJfk|g*g-҉jue>-Q`UT>Pm$GzЦ_}-XXt `)Txi-Â}IR|9K>Nn(h(MC8i4yew,%KQFߚv=>.b(@qn 9{V(U']#xPh:{ʕ1{4åH;SLCIWûPj=ɗ䢢`_WS98 I!jd]7 1ɝ&5>ښLj'R,Ǥݗ$1#𮷗À!|C# uփ&5Q9Z@~o H?r3RksZn$n`6+\xAg/E\76vL#jZWeB$ٰdjmg &&/L)'XDžew>>F #KXmř G.fA2F{PRBZxwEFQ7H?]Яb=ˢ*h6J0Ž,C? M!#1@V7KRՍar=9vjJnKZ|p>+ǴANlyA_m@.}D C7sMཏE9ԑi뫟bgf: [")vX'>vb Ӟx$\'Sh J GI5lHDK.cBOh #d~Nz6RcGU<}VKZPL>E ~8@d jbZK@HOZ ی!Ů$zqm,nc_{n n%O˚>М-:A0#`8bddCT'7;g" 7sLOB- e\=g䌱eY ȒUOmz>O!&2B.-niyq)j.hFoCaA" (?i9i5돁?j {-8!C#Y8"O9GOB٬>sq'౼x0PV XG?&*\oV#JNI9+$!a")R³ LbtH)]C@,A~ѻz%\!D =THIUoRVUFij<۸6- =G6~\KHŵ,+7RCBf$?Q6wyzg5IԘRob@Tf)ҹUS"-ņ=^0[H IT m+2 X.qtJL}L,(8Ԭ s<(_Ya4 Xg΋ \r6%%;e;jǶ | &˨kdӛn>X sB A@RC / ba\59@QоDJIۛ9M=TFZ}~;φ.rBH' 1XjQs k_SU.Nƞ]崰~{Zq0B,+)/T=6dx;_ƺ3t M]q W~))A-jeCTX`S㪰M&^󲳧MToK+ۺmm!hid!7x@dsdٵ::A)ljEڌg<,ґ8} 2lOWs|]!]cC?騶FHM{x!y:ÿVcm`hT;  )cV'h97R*P\O8RϢl/~W"Z: w ȍ uXkh ?nck|t{FV驙 o}_{ ߽&\Үc j 7Z-B_J5z z~8\+, a/a*x*j#Utv ?<7rE \!ı򍮊w c禺l_m\"-:nUch"%F#۝zWf8{(o _a܁PJ^umm 4* ^ H0VYV̂qM,g4`|3;s 0n}k0} tn\nĕ\Dw4[}c1RD$XU>R-X$vo%oWvce6 WuD12 @K]8V,!e_Q8 Țȇl0˘ӷ ӷݢ"lqXlFC4Wnž;_F毩i֪\M)]"\īTB"nN砽XsFa!wKʷTҀ?%]mU\u0Whj$p(=0 bq/ ttg KVdL7eWxM%U("Ry0|\'-BaBdH1+@`h4{*$ʽ6 H&ǑQF-A5GILmd&[)!%C8B)ca"4>jF I'FNaACY1zP9g hI d7vfk٧LKdJ|bkۄПcAHwڰ P y7\ңGJ9=%>@:8@ VC`{T ,]*aؑDO|^jUu޲̾*ŗ73h 7Wdk!a;:5P4A, oU L04(S1#%LL !epai0EhZٵp)@Zftyy+/EZS;J\ o9di˯aO7Nʭ㫠L<;2 S|#2Jf+[ㆲZۏۈcR|IenXkЯ6mr=uQ{ 2n+\oO:36rG(my*d 1NwX,rxy9W̌jk9m :tH8X+~uxrL,~06?afP/EG"VlȜVsѶB[txp[dPY)ܰy.FOw0Suw6,F4VJH h,Qȫ X=xllv; |ۥyhd[LƢAUz9 !0&~ qϼ^-\deONcY*,U^>Ci׻O~w-y=g&M>prMA`yr'r"7V5 :Hm#auk;wt0ͦ9"\g7ܧmfYit-s#P/:rVHoh'gSU Cg:ݪ7C^8}b%ui1I%8eC?R94Ǥ|/,Y3Y($[֔0A goaҹ,IJa]{H8()SժzR[ɨ}>nfn6{''©δ_-?3tL:vnI^#o+'.L<&T^yw|c"QF 9H`KEGA1薤qLGwDQzI".-vۥSJ qe778dٓ cD>Fse PٳՔL4?c8vͯ&45"䆜77jT/-I)c )Ҡ %q]&"1 =]s*/7Xd ֞D^P15n$H?J<@Ss+.wlگTWܠx t-uK>xY* hLҝd} n<\uUluV!(Ό '^Z}D`c-UwQ(NE./$v-'m,-NRhEr|US7ۃm[W䆜5CKa|a(CBtN'qYwdh,7܍?5se!+7X0ݩr0h_ٵ%֕4J W d(.Dnפds&S^;66)lC{!sD^᭕pxdPdH/^3>(>yN k s{:l~uϛn:X"&`HoX">-dzl9^:b7j3 -SWn#xIw/ʆnID|E#?kg ~J5QjaPZxuY; `+L{`3K~ Q۲oTU ɼ&П96uR~h|±!g7tWD1Iu|*-`pDY:ߚLG"I mNLw":O Gb*%@Zy%G@=D08ڏ9Ue t@nyR0.WKʘ7-4L*#HXYL6XR Rڢ"LAFұ:Lng-k\2j Ȓ,ǏP@M7g* ҜP7^5-:=1GArG,/tK!;T}  p0 1˥“mhNm+c7 3{|$LWw3?",l@%HTjHCi;aN |xL^%?wM%X=IM|뿹N=V =Є:?x,ncʸ/tp2WT IHns0č)g tD +`K( Lnusnxql~~ߝ\`{ F$'Uюex=+֗9wY8@9F}wKFfXdi&H&1:YDnp~>q?dY2$ӡ1ʲnS׀Jr5J V,Q~:JvƆآ h .v?E5k .J/NvA%+ˠa &'4%{Bq=?wBQe,)H.'&覺%ܠF T“mR (ƽ axYNODD#b3I="*GtL6'~{C cÁ:N" N@,6O;Զ 40OfA5q8\@6d0q.tD"+tXZK3~/vCLw63)g[HZB| +$&Zx9UDF>>J1B뚚0 i NYO)~˩ U=k4jПC-ғ(Hq=%-X4`f<'$}7Y18Yp"]q}6撆6Fbds͓W|"XK& Z$/Nͺ.p|Ɠ qe,J; 3G$d!nh]^i4uG9,vj'b7kO" ˕{Y3fu6g[o^ĵ:tAEڗ`k*Xjj!?#}5^}x7.P'8٣5ߎɠ:1/?L VJO2rz(\spRmyjWw o=3v1R8-ͧ͠aܴxǰRި"C$gs7N4xT]lUm:;n5 x'Mñ,S⍵/$ K z2ї CZ߄ ~fO5NF\CzR'Ml~N4T鉆ӈY!{cI(uf/I!)Q6qOя@(zՈs1J֤C ?V=Xs FX-N%Yvj9V9OبYYE,:P"M UQѻAo7*(_ &'VxGكnXoHC*`h>[(ͲWP aq#yoFOg2᝟O`QhG<]wk2'~X.m"E PGR}lʰ޶ wNl;=~;\U'6lz6Zu'5,cQ7 gQHx{M,<oiLwzR?14٪nׂIPk=-HŤsk5쌝 =Ra#|K/;Th#Z)ta gQk5ꅛ)Ѓ'tk1duqe_n;X ˛)5Dr*%8\Y {[Y~)ppwgr3WjrG=$svl!|}rGxQBeOL3|ط10Tv2֓"DD,IH5ʫ-Kt,SmՉ7Ers,ȎanlQ]3oѵ+>ҾS>:ZCz@C5G+2%4}~ҫ˶vLr^I4"MQ&ϱ+@߆Zc1u:_M]]u6-[_EV) ^S.fsONC$"P*/yc)`S9-ݵ 2=!14oz/yԕT#>̩Gf XcEx|"̽S0N_}Ǚb3ݪq1r&Z o҇gzx6WCLx~Hs'sтGMip0@a/ I0vNHp&nKZH2bnps ޼#U(<^D-f=jqEB.? rz>1i8{yfT_`!>q# &4Q3tܮi&XuDrhIȇo~Ni̟i4ߤʓ7}`>w'|x4RB_ϱ"W(·%qjDs0ŕԇrnLZy"C$7O_Xӳ ҃ȧ+wUdpZ"ɜݗ0dżdwtCI_"4Fc@?h0n/* Ch)J~eVp;F$PɉXU WdxQL{,[~Y t3h\pe&}ܱRR ?x $]ud`OS|Re 2f j٠FTcuİtPf?| ֎0Y{wq;Vؠ.ԟ~{\)s/@H(W؇'WW J@ I-Mai3[INww]`e&݌Q-{'a Pȁ*3V*D)O ƃu OG{v/$~qMNn~${8~C~% H>kI7}r!S/Q%(AY؜S|'жb![uJFǧ)>SVqmܾTYIQTH$r$0|E/VZ΢;jGݘpI.yM>ѹN)S}bGrq3v??#!v߶B A7NL}Q.=}v1u֥DEǷ!zo`4gPIZ?UkE3SU 8J)?61?rOC,R7\u!DR4{Op^qX޳(P=U#t})I?&j$5R :(S3tw=!RP+[Ai*>]R% c*O71f.?Ouӭ̺X2ވLAe0v8dc,b9 t2"fCǁ(u'(wծV@iZؼKp;褵xm4OϪícwO3$$aANo @큒aӜxdϔ5%hR׀EPx~.j6'ڀ_&.>9AygG\)]DD!gfA;,,㔯V'jP ([ X(WN(iP M] Pwǎe`n)ѥqA#]x90dXeq0 @]H)T VBEc!벰4]R7P7D:@0-z^'=g&,j UP~}5A-&@rHz#h(l<M`78.v2$t Dp>,>uJDv"@S}¿AgX5BfLEyʈBIhek76ڬ9 CJ.Mc,.΂L0Ntd|B/ʖ{޳D)셣Ґ) yLAk oȑ JE[^cJࠓ_q-dW~r3gKă&j ѧFj`?JBFf'֬i<Z*q ?{Fb~Il0e[{D)iN!n R}{魰 $igub=QuriL? MUa2]iott`Kxk"ida+O^ɄCS/pك@y&6.q9 k!^ qg%;V'l\ !\ %tUEczVo((!k[6n!lP kOH؞IC87>1?,~+pI!lٵaDG ^cK{e%Dj䄿5גyqO5~5wi)ތ]\ ChEt(:-Fe~`-2 d'

J?5J+Vo qxk] s-%Q[jL++^0:{7Fh ܡUx/<2 g0]7 4VJ'Qcʵ4m/6뒸I!8IEX؏TσWfjGvp5)GɊslg$>6pW94xƹ"XIs?0[-HGCڷu~\,?g{3| (@@;[>0~bRuug?y ^\=W#BeK^@i* =fp8I%eN;-%:( -q. N5":6-"4KZzR%EMt[&N+9{j3MXcR3j@|BEs)Dqs@l`W{2.U|)6tS]4LqW M##8(ހR˯gɦJ{pCRqʅVZsBb{?ȶ?1jg谔/,[+ 9DiJ4ސ.C,ཙШ/h$Jז,Ζ!# 1?nG&4{t#%z8f DžEk@CeiiGWc]yL||{'P;!4إJ?)?1B #3Pr\RP)5<\kӉnhd>h10@g52s\q1 WlvkR/,31. 8aUd|{ w F>;tQMDeݚYtqPZ_:p"DM.Vb%gO]&፰&֜pI yK)Ф' .l~*ټk%)م;hiKHpw5oo+H8%r,M󻎔Iِ]lӟԿyRD(pgr6YMBv:fnm?Ky_Ek_JR_WXHVOuD# I > Fx@GM.1/G*")c3Q˂"M1`1s3ں"~HX vu34}]퀑_P٤8XwvzeO+M'oIB)CPRɑgs@=;L # j ĭ;e$28#4phy5PsWݲJ>yPl-*FiRS)`2+18z HT݊aU(zƲp\ Ye·FXaw)6$t ]|@ qa8B<'Ұނma\'Lb%sz*ab^G_L4rOӺi8NsDr]eiU> I$? 1ͪl}_ф/Ȳ LkaE[|u B712̮3Ч9Bh6JEmC(TWU @ Ğ{eNvu/_6Hthq"ŵ]6N~{稉ZZ[fh_߳3vTi7rih`Rwn\0+LTv#~<S/@PPRo8#x)5Tdyc}̀HD~Usse` O}ɠǗ$ |X𒽘K] *D*4!()G:LWٰ֎UQ,|*9$R`rيK~ vC9-dh})A[ c,p.V-Y?ƺ#؟ߥ9˧?׎OlKN5tOUV{lHO|gA-4û<-+ -S @@cGXs[_s~fl+.AiLC̃#fvON͌f(xE±C]>Ya~"P@b ĂB<{p !u>+NQAݘz#x -uJŮ=M/c2rv|,*KETOHP+m*"?D ,>FT\mAu?-ő5M;qϼ% QTaYL!?Jw_W0SWlf<_o}P~)!vSӺi-t0Q}A c7)u2HP|БM-t4g endstream endobj 101 0 obj << /Length1 1496 /Length2 7645 /Length3 0 /Length 8641 /Filter /FlateDecode >> stream xڍT[6tIKH 0tww =tJwKIwI"%ysk}z֚u5 460+ Hjq @^N AedaPH,l2q0(@p?<@aKO @0a>`;{e `fp NH:\֖P=aEkK@f 0'Nvh@ /5K'f {6x0@ C xXPwA `7nN+W!0w5l@]N۝` h q=[zZ!V;Ij,E.BmaNN d msP/` "ḁ xe y0am@?y[s* e~` s>mA/L?7KOOǿ&77lفW0lw{=2} ;r)JIa_ |BWѰTE- ه]OÞ?_w-5؃hA5nZ?p?+wUi@~?nK'0節z?_0 YU s wnr`oXu  in7?ɲv|9z/) 0gKWWKLx~ha'xb:Qg._?H_7.? /r\\? ! _=\]K@ o5,yCuXe$ö~: ߂k5Z ˇUsɔOxKgw~ߛj"_iܼ5OԚn'+.YKA#ŝ `GGJ .8^=5e#f5|xu[6k\2P`3CJAJp;}v>E7vOȆhՌr['=)%Nɜ_F!;ӽhy%f~]h2{kpFoPDЗ T#_VZ/]NOֈxF/.g<&J2VA+MO\ӈ0r=狻ڏ e{]? IjL/|h]&fc 9Se쬜͘RUu #dXJ ;Gĉg~w\~QbZWD݌3g|;|u^ΏDreg yHv<3')RqކƗtMU>ֳ߮7džP[[pآ?gPBa)-Fѩ"-rtQȑ|PK z nsI4^`JNY_5ܾ>GrКw-|_Ho aۤڰ|C hb7U#0u+nW "*DlbMc6.֔iyrh҇uU\~b~+!A-AD#Z5^鈩Uҡm|^9*%gZj)g47yPyrZfŏZ,͕+x%-QdgnD9ԭy!zZ\3_=Ao# l Ky\V7XⅻB8IqwS".]\[^gUt1Yj{ܲ*Q rbXX':LU ԡ:!YB 󹮘yɶĢןZRJJ uWB7i~`Cce5h>s|E]{*l)]#q]f?ӉkxAI)]o&a-Kc䪻7в=HVZE \WATᱥc_hQ.*H؇!_]~f- *DdêY :Yҙ =LrD8Qg':u,)*$ i[YAΚNJ@~7;uRUp)B-2g:eT|ݎ eȳ2w31# G]NTOcǸ uȞiIqya{]_TC.e?j:@:Kw۩f6%ە_jrW X! M~ o! 14Yr-OTWj$l'P5&raf6@Ad } 7ZEFiej&P~ڛD)$Saߦ~cF g=39hѢ0KؒLaÛm7Re> Ѡ ^-˂C莴ݗvr-D^m)&LHEkzZ7gFL<4{w#IUkm03ں5zv1W,Z r 7YyGD@X1~Vv#<ף`TT v2mQu%\bV wL_P٣۰vũab "&5w 'Il@QY2V";QH-2UWkaqDSڇBpg X(ݘ2'֜Hf4N-*%˃$p$Nc%b( `H6I؆r`-ݩb4G7||e|a l*OL}aӌnn=JwЭ0jF''54'\T1mHP]yBysQ$*3% l3=+mЎAe]hTrYeyuIt9cf@&TY[wElHiW},r,(T7 p<ʰO^#_q]%H.LF~_Qz.Y+3043`@->BZEP" QSyu]>O2&ஆwiijim3FdՑP?٭?R$k`g=PcZƫU\:Lc%F(Zvx]ӚZv0,eLHjًV,A[+Rf}o0d3|F#gŇeybHQf;y1DE~| 1ty鬙7nzշE՛&W'2\ǁ#},H ذTݡ^9xFWY3nͦ"8׵d4vgZef4_0,J@v@,p2O,'|sDx(]KɻMr9F8up{w0jEΠ鞀NeuZWLSAagJWA7~HۏFO_fvcYaP*ҾxzYI\SLgdՂ!O6w0VȨΖQn3:sfm*"sY[R=,b*}سIlޝFQ#zUwDҚW} U[KE+}(Wtsi̤BO&zyHͤVxkv>ݔ|bհj . ~T'-93y.Iw<|\N`˱!E̴W s[i"\KVaQU(1Oޑ)3,F^jsv$m9ݝk/0B xhomo 2}a1kBABHO|NMjr{10 #}K{x8{ {i'A|k10(Ve}YB_j/L(;2rRyV$* HOQW9:aǸ cC*No~e Vq…3EHM0RxGD] l !Jg< Yҝy%oUjusTZbN9!p{)?*]Ÿ|rֹø*tq?aЭ\x1.> UX:gtg]c[dpaČXw%^=ӕvu='3h{NE:%I$)ee2]e`? k%(ᓩLe4,[27dd2u𤉖*}=Ƃ"fg8|Nq{8?m|upwX@/ᘇk0YM L/ͩڰ$KW1f)-qJeuAD&G-"T.k0Tg: P"ۀT\'λXh*L8TSe .3.G˂5KH-t1ɨ?lO|?(-w%2cg"dz)PE # %VE /]}Y҂l$Ym:?:v+d1GG G"Ea7aK soB,t :x rSi?9zy&- [ WTA-<7RC#) A]gtno--|[oAqTIq 5JAb6NTv+H݈e ͅ WC ]qP#C3,&(p̮&e+^VSP2f2+jC<>Q3j:plZ2n\?'e+'{bV}'[Wï4;;Q 3XxLq̍L^Cx3g&na-H%>;>v T IJ፱7缔S`~]j)c* n8ϟuHW?25b>y2l>9\N\f=_R4c\`+ڣ):t~"V 񌫳{ϳBqGR[kxMx%Rqk ;{dd,\RK͗b}k6U'HԒ+#`\^Ku endstream endobj 103 0 obj << /Length1 1425 /Length2 6643 /Length3 0 /Length 7613 /Filter /FlateDecode >> stream xڍvTڲ6MJ@:%RNBUzBJB(M&T({iRTHE={Z73{f7{熡D` YD<';h 4@u Xpy Gv@HOG00# ~B<8/qNP6BpU7 Ga*w'U' O Aq g G89*%b{A1(d@@u4M($ + w~Xo/ AIsNp(s#G0?{\p]Nx` +[7WR_\MwTT@PHTEERE?BeW IwKJ5|G -pe_Qw>>Y_B<8`pC&ߦ?sx7f@K{kaNp Tf"/7UPwܣo "~M$FCv@,7N0 # W^0꧄P,߀ Ppm`\Ѱ@@8{>h4n4L!﻽pT'/?̳bO;n9$I{<|}F={4qݨ}OUdTtfh> )5naffb'<4t[j6o'?FlV3dlLJ.(Vƪf^ftds{e(յ3AV=m{1m;泗RG%cBnJE?PgN-)rNg97EYP :μ32$AmDv5FFd?*] 6 vo &+艆^LB(ZD'e&>kag''{ޞuur~ UT>ŔJ{ NdSv(DzwpiWQS~O8FN1og+ZPpeV3>$J]r7}燭S-5=qu!;___Qs{lDzlm#NY6_07,wgc"8Qz<|0~kj4([kWm{?els:9mIН׋ʓsecu X9>U~[N';(gJ %O~ mF-l;KSZH%)E:PGx aZ~#ǮQDԼŷϝ]˼s[;uu$WhٌfcMu=E>~5Pg\-G߫ }Uh {/49}6, z,g$>UTm+nސ"H߹3l5~ոo2/P^8{p}qfc /Wkj͋G%lB9م[@駏%!ʞ['畡 ѷêOζT9Qlp0VD^lҭl@`Z(́N_X\#dYn)_{f@I.gKNWTG9M*nk &OlX. tZ2TuK$Q dO<ݡvgU|1Mefs$f83y2UQ}ΏI:N2{!X 64>zʹž71_fz)mʑr MRNE+ ɌBn]>_[>StSJtm*3[A/ #mRYևYp=wP:ɔ[0KN֋s:&WxݮИEzɂ"1d9fu'GyUJt<<~iDcdvS$luOf;MWnqbӍy^D' IloOn#EX)hVή>,OOGc37nj=řVy2j=@zńYS 6xh:9Vf+`eEp \@Tnch27n؆=ri:Y+\z$KPlsRnHHlܕT !O feԓ9Md2y89% _^lAw"pp^G)A63YIjKs]s̝|LMѪZLΓ< G4BF x-Ҙ>)F/dܒ.ɎK2c{m$de,͆ns.\;^wk C"U _pfƐnsZI&% HY+Nl28gS=AiZ;=UV"V̵ʂv^od#VҔ{휚B'jƏQJP/QF=rjFC ;8 a@U{^yqhiU٭<+r+BujVqOW!UlFp(ʷ+n5rGӔZ]{CNz Oiኖ#f1?a-L#պIN}{4#x_ W\UڱVغ/ux5U59%pqb\*ۺ}H=Rw \g9Ph8N#I{NPjBk\ 1KAj0A5K5 2P>c+~s H$^utBEnQeCǀ,riu#j$Af.0IwDnOkLB}cߺ 0evu,t/y+?7YFwcTElO :`v`gW|RɪN͝%ܑ!Z]kՍ0o L|\>yu~\jO`V1YSJU-!6SSKn@Cs9&B9h/?Tevk=2nuOR\L @bCªjM8ٛyF5/uO b⢦hu{-SUZ}%h1MNdIV/bGCB=\VцV^Utmά YbfL#I'$>17*&cX r;V RJsX~b[pvcԨ(뻞CӄD! 0Ŕmd)1n.qwҦ{}$*3ms\DW9?)4BLV.N:vQFĐnlmE$ n*,TgzLjZݙNNО8IJ3T&1'LΣ3{br묅(uc5ӗʗzaFVlmco7˾,sbؼf5j8+YcFyQQrf Ģ;t u\fKR &!O|N$C:rkLZD&"q۽L7=h-)ro: 2zfcе v/MO8ÀJFc=D>B49xMB {2uJuPx0λxA(=:2X>;,'[Tȑ0ܪA7{wka0/6rw;™9cHU# S63v=oZꇑ&z)X%B{ A3l_ ƾhs rBN~=@ u)e($#j :U@2$u4wo pv]tObf!׳orӣwǬmU&gL _aE6c1GK(2 ,@(݄;ʻ dOBetrx@ 5Fg2,ZL|W/ ϿE\~g>B}dO +9Ѫ*oQ\'@'Yh\OJXߎ,E-,eqry>)jdyG\@o!o 8p7#tcwnMC` OR@ Zte%kԴdfCndv'k=q[_8umXGTɷ_`P@*+@l)81hZެ\sW>7Rfj5jCV?ɁAD:`:DWQ $?ÄJ+:"4CLx3gTtd Y7 7kNC9XxC =E{-*݊ ڛ9bWL'SJWO_P'L*GZS[৩;?,06q?? lюp`\iPNPS.]pIh:O{ʶĭ7ZMRTM #yHA geWyYĢmXf.)w7gpdf+5(7r)bROy ˩QHXJ]uUd<-ᔱ{6%+,6c7ܔue.Sk`=HɦI$L~S@3U";kh2xDV~qcxD%tFq_ Q lL{"9~(p; )]r|^@f/U#jh-$H_ :͔TҚ2(Y'ƭGXI 2u핌1݌b"Яc[x:go*/9(q9UmrKnx'=4hͷܕMҿËoZAwʷÝ*ZF`8&\@1HgYa{He ;e;wx|C, )uk<{.3O IY_,=Nxڋ`_sy"aØHG-dJ3 -0TR>Հ^ùMZ]`Y6U4w< s.jM+q('|e6bjNє@ J;0դ,YcM1FTobd[bh7 m*a-]OS"D%@o6F!##x׊`/ʮI)oPN|ɑZ'p1uDl~zh~ e0gge-Sa)|qf]'.g"nFCh`Js/^l7? NT>Cyjr٣P9>1I(:Eư݉GnFjMm aow=ɑ,[\?>Og';)B ]6{E(b+Kh;6:'}2ջ <2y =<?=T%=E1 GurQsk9BDxH`>0A/ftnXu6$8HNT˻54ʹ>`QjbUdӸVw2=nw*b|Eљ,uUVjl}q]uWSpdd3;qd;+kѸvV o"&ݙf;4iÔeyW͐50e0= s˲*>T?5 I+ ʲ5=e9X縺u}$u5 &47<>fJ8}wW]c(7FMqZɔZn&])Kv@;B?MzLԶ8\>ЧzCvg.pKhtp$Kd`*1|Fp!6׎I-!5y %8Wj>fHyo򓷼)"an}f(5߉zooF#tolFKIsEAhۗ9$zXrwJix`8i`wϘ~7ri/ӧECM?3I(ܗ9V Z ⷎPg3E,Z)? "JF*/s*7-?]-~Y)5Yג\,l_MRHZq|g6:[6Y\Df/㊅;4kݜc>*Te#I?؇*E G/]<h`av5t8IG`G2ZfyRu V:b J6dă1r^RAC$Ǎ\{5Gik*KoY2 ɋDx8U@$ՏhIAo*rڰ#KW T-rIC|/wWIrO1T[pŮJM譔CC^Kz]EI2Z2\1wp[s endstream endobj 105 0 obj << /Length1 1425 /Length2 6638 /Length3 0 /Length 7608 /Filter /FlateDecode >> stream xڍtT>]%)Cw ) ) 30 "%" ])!Ht# JK}Z߷fߜ<{>:0k  H5XY jaP +SB 4aP;E%bA+-@Xa.pyʿNP\\;@XAV3D+@f!"g?x=*e ]+և!< m@P7; j]@? x] wC;[]`= 4^ C(U psC~U+ 0gg+?0duomu<v`ݯl] `Ww_Ho WƁWpoo7CہxnV O;< ` AA`(ё0y8 `* 9R[0(oW3Q7~Srr0//(WPD!c+ }Uv0d=>_ g,-R 7A~gvWE;E?3ԫ;}Mrmg\5A`wfUVC}`7%Vq#? ׃ *'o .AQn升l1r'"[~>( t x)"#%DH7 ,G>\8?$ Gr6p8r4 d77|XZ֓wsDju+N^9xOBTΪ3ԁ_9Nen|6a7'\][&o}-*[KKk wgބڡƚP'³G٫ta(lfSwJTuoaYpi*&,/=$;Dnn,&T觤Clr;/]MS :!;>ZzlT1*IEIXG_ԖT5Yh'!b5=㵯D%R?e5V#Hx:U=Ԣz*3w% !b;[e TJJHq8VBz%6 0O%RFBv\Qz7Cbᨅ< K*uTN7Nnhug\d1jŶH>d>Q"5NLhB`ghIXRrzVC8!61 5=.ЋYg{L<?)X^DhOZTQ3- V'XKhj {8S34&l2FlD$ m[gafNW:;c5}Кnᷥ<4#1ELI(DjOKOG-E4Qa䠠ѕ̧*t;K 헼`ٿhoZ+&3"֛ TqVO2DjAwlо8AJCۨeϡol$?Z.Wn7>WС:s0M4=Dduu3N<40n'՘3],9e͹9[:wF,R(a3q׏[,{F[w{\@p9ҞؼWб݇ZuraW>2y] }HCϞBAڜ1bD5c.䢝郬+N53! <b~qn^k!&' bhٳ{ B>ӫMtoo'Kh o \~v"f"[^ o[N'oS2bMig1,Kf+.pOb3AHDnS(нpԅ-cJںcVMιzMkR;eMŽft ԩ00W z[עtF2'{5뮩V}6C_q$pGQBO)HwBǪ] Q5̂e2/˱&z4O5RCae 4ۣ#'Xo L6<Ƞ@Qe5G%,m{c9|ί%;D{ňv:'Rb)E+j{sTr.|Im<Іnz,D3Zqf5jm~9GxL '0L*`]z-@v"ME8GΎ3e֚=9]g=F_#[D*ƽyyygݳ U:z0}[1c+o M"C7L}e;aP¥/ d{]ԁ}͖nw" ?٥חqoA;]?O0[9]N&*۱z}pfAEa w}Jj>RBoqE,79B֜,-jAt8(>X?J6ge{0 19;J)܊JgS{rPDN45ȳqQߜp_ulka8+.\ oBjB[Ŏ.q oaRQ8CF,<'/qg/ŇtYɤ󿕵i#C)2Ԛb;xs!rZѩQ5'h$w=zEO~::O /!uMR8zI.-/ra1s<ŸYY}˽"dk{׈>tg`ȭRlg}LYV '_Ysi>/n%4Y~MoP.pޅv&ɽ_λaF e32={f߽' 机$vPA`MDEY—{<55R7jD!O*}zžЋwѲ-圏m^1OFiPSLYUe9"e5q",(a3UX#glݠ)ۣƕZM+xv٫?Yfa8˛y_W[Pj /\9y랑e'ٻՠch~jyg|зQruŢFQǩb*a4iTm XiA|3%{v9m]yL r3 c5yzm gvh #17~nW{QX ^F]YlZ<905 Q0* ;f.}$ʠ)MeQ5r#4kfbl}igGQ/Bʃ3 IKBҳ}ؘ3ddn =FYbIW?=Fqn/:~)AӁ@JǬs_gJcȉ ^5΂y%:ߌ_^N*orK'NE&[\ Pв/(4o' _]]z_*# l`lr*u1Vz[SR|hf@荠ɠSam|ǁo9n^f{jm QNp8>E+ǐç3a&oNnLB&Cmq 'ޜLXR.ѰXfSJӯ|FgW>E2V)0kp%V|F4<;lVbي-Q~*թz۳Aqt,V؜V31qBٽ՛&ԘPaYE\ =M^XŒXoa}mFz~r0;<5R\j 5~&8{`px U,j0Ju[RsdJd1r0򧌩یJ๰Zˑ v(s?桏/M-&ml[̬M.tkù$? * %?QJCn;٤=qm?GIڮN?<<#ΨB )y_8viݟT$vkvBUHri&Tn|&X*yFj 6Hti R$jh0pM> y2x=ۼI@+j6}rqDy7OVp\`&%ɹ cQ@ Uhx_^YH 7g " 4Bܥ 36&S~s-\ы{Ǿ\' -Dv $ ;EzTcҝyd&>ŻMvFhY|ŝ l(d<9t(Dk^/LU%?~ofm8`i3kϝPG/xU%PO2/~(lu>zC1IfOXQ}z{ҊrGA ).P"[rt|#yqo.5ELw$$IB0V3cRVRuibNE7 Hg7dnjB(tb /_s&U bGp*ǒiEQaZ[Ѷ#%xwarywt˂Lߔ Գ*4vKx[vyٮŋpnn N,s\ڱ[c\(c)k[_N7uZuvpGBj Oԛ*iϾ`[Q0͘y W+܇l./^ʉ )id;-Ғ*uY-'1u#6ԐOK#f 2Xc2Mao,)DG5gRMl5y0FH P9>+ahHvmX" '1+l6<[q'/g]Y-E4GcRDYpE yo# W뢆%CJvhCu͡km "fNdpn#i tܞF[CNgW"2$\r&(zvq\[ y ༹ fBH^HT;?}x]޷݋os 4Ɂt }`g_F{}Xn&΃;xOt\}'4!InRL.EgLzE@ȡB]@vs/6T@ׯE}├~WD}q6} 1J|# I@Xup K.`*lkZb Y퉷LFTQFIh,ɣuϬ ~ZaF#OݝD+V)ḔWKmM[bVw%3/ ӫo~ٳ$K%Acg86H8-byh]h.CF@_0s hir 麱r~QxI{R 誌QI[Ź(d\:z p<01'*^0vp\=5Z="Wơ)peb'ۣAxRjȩnL\Q*UF 5oj8f:3n15XPPst OMe/ڐ;|Pt`م{p`.[HX`_o,RR6n'H$,OoQTڧ7Dn|n)5!Bj(Mzj,]ry_oU5~bI+anZ>n, j}QLd]zuW*'\Ntu?BK˸BMY#;0iĒ^KaOzNSڃUdMՏJ%p[Ѵ9Ygj6Zڥəy3sckՅĴ I \jg20Se0+g-ᔒ?Iخd%Zrn#Or_+ endstream endobj 107 0 obj << /Length1 2234 /Length2 13568 /Length3 0 /Length 14895 /Filter /FlateDecode >> stream xڍuT!SkpP\ +N).ŭ(Zf}n?ZIgޏBUEl;J@ r hظك~ki@.6`G?8. S7L BU;vv^ vHzXX `G+2$  v~~^ sSG56y z!k77'66OOOVSWV3 rY*l8Vd?*u ۘ]!F $>@]^rYu8mljnvp2uqX؃*2n^nSG`wq5)TjbjcWl4ZBrtsE+?)9l#7q w'6MGgwXo   r̭ [R ` )oc zn. ?6n3#o1 />2_BhAɩKkh1[j `xyH?a*h /Q?@=a/e0dAnCO&_sqA_a`cd ,jb%ʻBB 2,\xvRߏS}I@^ sE`mCX]8'$g͋;9r=+erbk)1k}X%XDb8^O;~NVa䢉NYP O_b $)*otiD$'^GqIU* TB ϏtImC"QgPOo;_,,KqG"50#-x|#\xvY69Z؅W s KjG| sԁ99h6^ qz8*d&Y8U:Z%}"#Lt>)q p&.sy Ϗ.lX<  ++Yl4c ?*/&PbOt$Q~M{#DўX cڳIӋf*$Aܛ˯wV$<"QqhjZ~3[F,iޣyf87?JHCj1o:H |KAV9u]zo ۝ҊI0Y3إ/*p/Mv M@ONAPR/|vz1JV6M~b"};:]8+]o[]9ZM׷+KztK|k`#%0!fh<fx|XC,㢵 :=H #@Ƨ* ʛ&C>fE6c-}䕤DWXllPW*MB)Jz~Yi˕rg[IhsE/7bIT+U0[>eø;t9QW M0~fƳprbUS DWfxˣ˙"pKH7Ł[\^c3 ݟ 1MjlXUWVz˪jm("ZGC)Tw2qԢ‘pz沊?) J nة 0D1cAd]N]+:ϛwM*k3K3Y WftoOX}p`a osjTn^}gEL>VZ󘹭 9#XZ&̣~AQs"=k cǒbj?xܬeЍS&byKVymRWhCu`Z$iZEVȋ4t.sDU/J-TY?yx/5L$u^ axy-s/qx3ӫ/aSQY׸X03^HZ)7*|aP~5w nKG;Gς'U*Gmv*QSG-h#~E~4Tnj83O0 $;hp̊L =s23luF-<;JRD\6x8mysSx 19/]QR13pB7]SdJϏ2SfYG~aI+28py ׇ@}Ma?񉮦`MfeeqqkUnz9V15x-Z岄4}3;`髱F҂kh`ʧ~ 5}O>3>K*]9W"rR5݇fK=*o/H[:K/)\e?7޳E G/Ko7cc`XG7dQ-jdq)C'Й ) +0DX9`71αL6GMZ$D2-.NkD?$>uAidڷ]PL`)^<[yE3 .5խY Ww ݘ-vBw[{1Ӏikd@ctd9cNءf%1/iSwFtfEdR'Lq%b) RVf<ɩmaB"]ΏYXb`#Tu`*0c䆒V4ɊY3 &h7zPzvwm1',m\):77`r!ֵJ[fR+8 "L}j{C<&&tn,eBS{ kW=Q#f7nm1( o6*dOHwmTc ޙ}`Y1Kd B3M ]^u2Ub#Ğdp4nHb63^nHsYd ;02!5qrHNNܡ˾[LH4$/RT^8ap!feҙ ?8qљ˔-Q/Pm .t*ߟ;MInu?g 2.T3fGcsfըzh:y!]]$qy9l2qu.ͫTY4!!T߽n$@3ۄ:*어h)ʗ2T [,:V~gmW~)ӪXg7褧Wpv+ v_zѲ;o@a!?ЎMI. {/SttZ^vVeONjY\ ע vc\sGjj.]r8U`/!ipژ-rDkmEt[˱.P i\YJ>B=FIO^"8cI:tI̧ݢr cXsR@˞yVN$ <qT<4;OpIg{E Z2K5٢1-&G뷙oz"88%9%z:2pɵVowQ'Dq6H].^O_&_ѶmVk[px96;+xbt7C%srH^wFU&lYO"qnN*.^Dzd1ؾV꙱ Hk1@=W7<|Krsf񭶉d52Vt%MZ4]Qq^bmjg`ޯW0q`|n5Z¯P;} u."Up=ſd/yO:Ծ0.RjIbs0jA$Łj"tyil̷t^P9x+hʛGǵ+tkyd$^G.!E  Ǜ;+q{̊JOq.Jj]PG]\on_"Yuː3ંL֍/^j HfH-lΩȎ gjR-MEomL3sEi֍="l}_5y>F. ׈ZuM0(l/@ɕ;w͜h1˧GV~uK=jַ4"7qmVN|")_WxJ,xUvh~LxE[;;J޲f/ja3c k*9iɞz7·Z)/ca ӆB'pZa22^K礯pX}~ R9OyuŢlPpC @\Ou|t1-9I˺j"ܽ6_̢QmRIÁ\K&h_91״uq7)+.QVl9[=jBϷK8!:0cE(%q}R)R$X-OZx N>dH~_>k 4!F#M5s!oj9$?Ԡ6kX Lx?x1<ўRqG[QWRzn3v\%"XɆ)I,DiJe eU .lh.Zt$8X$JGLkQ:gJ4<4u>Opr\OɈ]$vҊz V:Xt^| _x[Bo<+wTSxZ֣3XAF+L&ZfB^sSƿe%-\Ȝ 31xlN'}Ya%gEY'ʪlOmvX9WFͯu ^Kl{e);[0$}Y^+3V%)w\1?wכ%Kx,q(R^ޕWZ16zBwMcK z#T{6bdk&.LL:/OCuMyNs{@*޻NP)HB#Ư ihqtDU7w1) >輧y486>K;Kȶpz[g6N*IKD2-<0@=v8YtFo"-+;E)(c$1fu5|8}W-5?*1Gq}ʫOUp"z&  ޤ7 u{CjiB_F=qCuzI][Z?bi2Ҟs V gty))lC[@J◸9<3\]WܪA.N, m$IO;x$ȸ8+ ۭut^׼z?OPuXMt-|D(7xSDV޼.m Hpy4C8{&*KIP-(rOZdbd[_YtJk:zF 7'zpDxL ~ghHW(,:f}}RfG _ |~y4% e]^gTqͿ.aûck$>y)#%?SYI,fѓf3,oR۩4]|9wl[f~@$Fwb'#hIuRh8i^k64sMv]O$U:у]j*FLu+/L'ݐnvnܰ5Aׁ*-☡ƣZA;t.Z&:!1Rz).jlIɔ@NI%π\5V^Q$yV`d"7 O&#õ1*iK#*$C҇s׌]^MBhS2{<ߟO޺tteEwl}v+_Ij>%+d!g]O͉fY[0.GW'Ǿ:ͽ =?~gu}D 3Law{HmQ\ =EIԟϯ+hb[' |TC{sy,49A]'qyY1jh4%=k~}-hHxt6Jc:^oŤdձob[,oZգmOT_ϵv|ݰc*X ͭ36=aT |tnL*qWy.Ic\y\j6N%{p9=@&-R՞ܗYYxݍ]aP;zeL4_i FCdТ$~.pD/})d%ĴkmQea%הR$iYƬapcAuU[5ȑWOhV(RHodXa{jvS߿%<<+r"I& ٖ}4&yc壓airp$˥B)sH@rMɹ&i @,$^#sa4PeP5a/VDz}2ILGۘnu1T|#u!Ic]:#ha cj\My-bيLoӾj2i P|z Bx̅֟-'N25_%6%ayl]/263mBMO? κIٛR[j 춇'z1_`)+n11蚱~poGulPk'A"Z`YiNܨ48S6V̷Nj% :)%hLŇES)Ly%l * #I)y4*ͽ*;{#&Nm<2D'L'(`|/!3z܎BM%Rp6pŮxPrl%Ґ`K0,xdr{besٍq# H- 0K)nv Nug:C]Rco ﳖ/4o;x9y8Hyrw" bGÀgI^c^Gog>bDi"#zAG/,[HDz,I5=" uid$KũHժ ">rR4U3Ǯ8Vy1ҮtSP1G,:w6iD(#!yX(ZSk) 6/2?[~둭'*G'5w9ɶ{fM]7g5fesȈOupΖ&r Tx_pU? pI=̷lixaOk@ ?bG~nsk}R@xp+'Mh&<9}4~DV/E/K{L?fƀ҉Mt^_|و'_q֩95Bk< Zm#ʹ}˻ ,wY;oؠmićҢAs0ygdYM)ΈqCKv$.#6i)w-V Ɔcibj]QeXl:Ɗl$)Aꛩ^ͲeHvx }"L4O2 Ӊ*6+@ĖW.>j@!PG NoY>' oʯK|<-┋19.M1I'SHslN2LTDM$~z_&>\ֹ{."(*5-8yK3A(L{/P*D,1Zb̈́ލ;ZY$r)EBȞ.#J/Q"ctc"|džhXXf4B*O&rxR}qbxH5ڋ+ co :L9Db7;:4mLn R1N4^?8 U=~H,t r0Ϩ~뾌2)2w"9*n7mb\D-9pQFGQqllMr1a5\M=}j׃vX[ $dV9VfL z^NYsLd^U6(q^BĤ".v[Uq+e>mw/-WRDf= 3?q0AQj*$v@ Wx;zT4oƍiQ3`υnͨH\\xٍ2򜊫ZcRG(U_#";.D~8\E4|,Y%"\VRieEg"=V!Sҕ>%2޲$^nrTk,.b3㜯BъALs A^,L}UGI1vī y$ɫa fi%j0 K7|1p~A^V~E`j1)̗(܂p-A$ɇϱhI]| 6)uɪb4 bW1F{NiNK[Y.SwP|tqEJCd2{(NY^J|S//SD_SjQ|;d=)fEAKVip,N@z~ giwUJ+es\VCl<@fg=!p&e_!+EOF/ ډf#|C j}0ri ?z4ZR<4o;).!{I><A pf`JrG93^,bysr[>Y^tB2{3D>F` i\e WcB4Pf5Wnʖ.Tҁ޴^ld0@'CfёGJz#HЙY4rGNcM]Ά^k¬W-m'PM6?oF^a ݄6NTE[|jG]~~r_cbza/lQx\GQ󡟄;jQcQ mKt|ˆBᨓEU܆hvJnvQyl͞xQݘ,هPw%Lyv&1C:g+_{ znQjU2,L}[Ͽ*|(n~el5iiVmX-u[jHH}cWJ:NBAHJ_V"*p1f_ɟ| K~AcYunCp6XsR.. W*hE]ATFN6r7eUnYVbn f\b?8X}n!ۑ"莡І0٨p 7Z]}趾˩2D/bΤ"7DFl))ͅd2 r}lڰоO3~Z˔Gpu߮-ҧדs?3GSJo;lQa(pOMn׶ Kլt&"׹s^i3>@4I{6*xbHޣHh&|NmټNTC["5S<*lgZ(v~~.bU޾ ~GOo$I_D5WV:uPJ-Ζ~d!ufo[v@o_7Ghў}^,rraEh<۳~Moe#Z[da_eFcǰI]@c`i2YT>f]Sj"~[?!5;2zb c@7ԂM149ŵgf1*Kᨇ$/mO0.y\4/;l^ }T2Y[jmٟhl*!| _ .H\xg'BMv:Yf ¦1퉷*(xDMw$'xe-C*cxIOg;lN3F&GCbXG:1v{Fڽf[V;`[N'm{w'aP_?UO=G`^u Q\gU"UW,fq*+J]1XT{$ 6% 1NNG[f qiHngDNPM{Z+y-WG6U!$KuheZi>:<:ژpDZY` zV:kʘ`\Ԯ0"= ^֌5Q?Ki4^UW7KPOy+XErnsKQsZ|*,$C~ltEE$~FRyEIVX" {ƑN'MBIK3bY9jagGZP0榉pv Dӳ16@a,|ZCJ"д7+\ذ6ҏgvyCBb7Y&UEsrfD㝨2ǒIJ2bdP_m Kp F Y4eNAKX@BhOf/5t(_Dg5]x5QG3@кsp x 哷 ]yReQZu\>F(a-12/C5\-SnV+;dmNĠ5~g7jQ0MFzݪJti.@=МD,;r%~׊yݜvc/9wLU*(C8*kO̓bDZ\lmϠ( I_*H‹6b'gb,Zݻ0*Ϝ+sue㝌fDExख٭?XHsQU6{΋aP~ki9b}_3عHH|_N/|-?%uu9/tk(Otrl@Z(u%- /*)C\iBKaGځ̧/"^&'ZDX_ LU}P}N<_(vqP^$ 67#Yc/|{eQ``~02@l= y/Z4 u9*lq1a26$-ȠB{:U]3[(Q"뀿jtg&[5Tvu^=:9 x,C&vKqVV^-IqQRң)yi q#Mk0aIKkڄp#wBh;/&VBzUSrpxn```\M×rzy_;o endstream endobj 109 0 obj << /Length1 1525 /Length2 7891 /Length3 0 /Length 8910 /Filter /FlateDecode >> stream xڍ4]6hѻe-0Qf0]Bh[t"A.ZD'Oy}[}}}>^ k#[C0$?/Pe/y@C( ) $Pp6Eݝ~ ~Q  MIAP0@A8, po7=~6~qqQ?r7 !!+ڀp(_)إH >>OOO^3f' "n r/ aEz {C܇75M 'YO7'_ѿAall. 7f:A:ʚH/$7&x'Q:,wW7 :wmV>E~߽:\G75ſ8&lv$@  = ] 8{ulۀCm!?8ts ;( fݠ^sߟ}b ?'#E|X?jv?~#2gv n#Pz^%ؓ~Q Ǧ^ű`~̌\F2ɮ@] _Fl]+.B]`C lGA8%ɬm)gXl {xhCq1X*'՘GO~$*o_d|^+FdO6" ʧۘrRJI~R R&Wb;DS7w ڳ=%2<.*S qttHdzhRj"dKnWSUu"wEyV皧F5EdM>HY|˂'02C.'.>9+_THՂXLl*qvhzH^ٙjv^H/o /Ŗ[ʊ-Y~(ˉqܭ#-PD!QfU8\fِBqV˄GCS2>)H+O2I": }Q.z~c>_?/aN'] ~=:e #L?-Q*1}l0;V6_r0 P[tgJ= VL=3lY  Xav2_ٝN(UHR,4ueEE mdt)ri`ETP^<1k]ۗ66}/tkihxח)\`J~5|3죐آE[. {OjpL^UdЦ6"2us@pI 0t6ȼd'BdN<$+s\Q̫T$ޟsIXA -o~`5Lި|GV=ʠrD)\y yF7`J6d&%-!@AyƊjE eugx-ĿB { VJ .+7N>l؅Xg|\Iɤu4@v*V=WYJgypokӰ23EwR`y7g%bm؛z>/fڛ wJ61Y۾%+h(4Xԏt?5 $2.Zԏ5i:FzHAq]#$Ume)6ˇD"}j(;,6PW,.jv% K7{WOML?+fM챒,F^Iӿ%Z'!v8n9S tZTftN6*Zށ;FF1_tC)sZqxpDg/VFz(| ȪY'.H#&)rEE!Z{-!v 𤚄'hڃ)w6rcV~-,vBR74)Wę[9k9 յ 9n#ѻβ;C7nc7SU*lX?w FkȮל7۔b^{cjB.tLpD@MUױU.yh^4+ h+S阣E,A>*4!Yϙ2QlϽ #^`8BX (eͼ->5Fi`vą#Wݱ-tpɗʱ ';τʵu9M6~UQ[l "+S'+XE QaJE4Dkag;bA}9o^,`jQUH" }@j5&S;<_yyxZqrd}`Ja:碼ir!#v#"XotѧGqi4mQh U{`޿cH4u8j_+}F T(},F. 8ևg)_6FߒVQO\t%̦*Iq .&s狨t <8V%3&iVs1u%EqoKX,AM]#I(@ͣ%Dot~{9qX)RkjQa"VWS1`LtQGO&*smt8elrw8r6 . ~DHD-urwpZ[KW1bb2>V ޮ!{W2K宗]gjK=;9Eׅ}T%3w߱z8;?Hv!DRݡ>!%B4|vҨFC [){p1ٳAK{X= GFG,7$>qKxh6?;f@_I\꽶y.;O3,!x1hAmo[kW8h?_x+G8oj@oDɃ藮R%֗HҩEQإ@KɠtZ:+J-J5w:}aJ*+? dz}=;2ONC% Ww}ܡA ly9?ʟeyQ?[6=y)Fb@F0+?!6(R=؄ГPVޒ^~r'7mS|ٮ_؜TR#(IEsB&6aմN?WTF32'qKvusCRGΤ岄Dur g㍢w 婮(4X}^XznPOZDV|C<,3 Sz6~3U}|@Ē>F<~;NIORo+i,DQhm4ZJJ0׭}0WX:6kiY~`.u]omw^ZIs>Ƨ+SZQvTOyj)W&S*M=yr &JȢj$a)+>Npm*!n:< #Ò~Z  Uq0l|_/4bjՐ+&Sߐ޿;iZр-Mel;!x%KJpx̞.|Y^g"(MH\=M(>9fGYSXB5o l}zrkW$g!@JB_xzF9)7L52@s֧K7IuUkGb^i%^p,oTghZNA2YOUTfLmWӇ_+W{[,Oj 5{c~R&t2w})%M2.Z+qآBXS}6kpmIYjwL}.":8 :`py`# YpXG|[(yY֮Bd*U] ||G NN .=ʔMzx Ss<;lqOV@ j*LQӨh4Uq8 %ㅕӎ<^(-z8W_yՒӻy }#: C uKJ0TiڌEM`&[ OYv-(,-s$lN5.,y(i/Pˤqͻ.b zQq/!G,(kYoCGkpE9_o~"DR|:":*.hԍ:PP:~Jw)') ]x3&RVC;31 &Aj^~qƍ0"Hm P<[ 6xl黜ZjXA v>+qb9s&L>м| O(p^ה[ԓTJ,Z b^QE ,p~  OTAyfGYz:wx 1ń<,49nQ2}YAN=Ԇ,\Qqd:Vs&ޚP7̭yQ֖ WMf6 ӵhf!>AgD*ZI=FvZ}^pMҳm4OWߺTnJj맿`6Ǿ؋1<y}6{8׸`T@I3(_wc|^DTI0]wي[on*lV)]SkbcE$Iiwr ~ݎe Ӕ8&`EfYTKr(zy%\Z^ yIvBT#_hsJv?P{z ISgY3Noo˴@48㢖-S'U:gohp},U?^?dޚoWDC7H[EE|B$cbB[C XqG\A<!5]1+mq ,aqSAN]d^jwQuQ!)>)3 KG2&_`])g ;YH Z|> stream xڍT6L(Hw])0  Ct7HwHI#ݩH#_֬s}}}_aᐱY`P'(@N]W͋Ȩ A8d] 0?rp0{D<aP#(#$ A(sCl b)8 P"+FxW fq;Iݝ J!;6 w[~KhKdA\Jl@8pPW5xXtC"E`}8Nw#O19:-h*q"< 7{!@Ÿ 2/s!NNo\<^q^@ '; y؀0]n` g&B(?6C<&pa0P<ߒy9||>! h!P@>ҿ6Ҁ= `MAg).W\"@Gߌߺ"f@0 \u5,@m}Z _as`._7 `?)P p8Ioi{11 C<l`pW*"D\#qy\6.@`Z?ā\ >'`e xY-Cα9&1͸izR?I[ܐg>^\"V{rIxL'j *]-_>P;Ts]q/{=>~ |U%u[:iP4Øk9KF~Jp;sv>M=~Oˆ{x7jk\ץܘ`dN wqa|7 ''Z&j/"# u\=O126u,Xkql4 {ͷB1.ln5<־<:3?S^;n5dbN(W/:-Ni-2CWLT\<‚Bg5U"VH],& z_9OxS5x:$* X4ڃbआ e ֈ^>Vj])=٪p<}eQ{c̖z_qGr?ьqf(Я1ـ*\(\IkaCܸ` 7S<2 {9QX;ؑВp^4iTd0V)tKjԙי l}W^td'Y)#]Ɵ=<"kCk 0EJNа2+F/BFʷ=vgx6gik,*gaXa ewnpZqñid˨2hD`IXdGPl;{7Slg|H[` cùsE҈~oƼ_ KGeԙ |1 IB I ,hjsE/D* AB k|k.?ϻ~ou#p-7\@r[#-:3jrn֓1158Y!e35*c 5 ?u{p֛oߊ朔DMGڐ]h(@\X'wHgF^q"}LN8B<6˅4F8[s̓j\ʓƞ'!ɯU0זJL<.t& F7ϠDau*n.[7 ڛeyȹz# B#ЈebO L'o]oEĸ<V6 lm3[wRxSlc{{#9դaf.y7[;^vNg~q2ֹKsP/;[ jNh(+и0 k=SbLEBZ@帘RF[P~\:6̒\3[ 9EuF^yمvz{GUD&/ϰϲ'W+ZlŎt'I)9᷍ƝF_X,m/iVp%4o,/:м~h;L(dTU$Cۺ M滜/-i?ٓ9;Ÿ044ƽѝ]GikPvXspþfmK"Xki9]7`pUe(&\7-O}|N3ͧox:ܲՑ o??J@byQab7-׆£]KutMβ;|yN| %[l^“ l /"-:; kV#tN2s] +7jKvq'>ځwB"&|>QpnN}n> $P9P1{e-Q{|0ʽWcƎS1C/H V㍄E#<ZRsZga$$Xy5| +K6[]z"s3k" 0rQ׻8Itd؈ΗKupz(ZrݼIwbU{J]扭-;îOSd8@n?HvF{>!15B4p'Rx"Ӷ Ћ/>-IpEc_Te[Y. Zǁiv[$屮d ehگV`MJ+mI1DAt7Gsowu me~R%EO`d֍xi.sWXg\IlWrZT5J<(jXu=aB#ϡV"N ic4s*Ȃ&2&=,~1bU<>NX%&_ކ*"ΰyv{|>Y1^H/ࣧ'Rv,Gdx6AIt-a FuO^m<+ č7+_dzLZbB@a+UchD9M.V]"?B/{*0r̈-zlkcNe- df-+!c7V ͯ-s)wQN4`BT w73_M(a Jo Yko ;DcOɫ+HD]HhXGhRw%؉ ƳcQZ`X'9{@-_IB ؠ%mgrzVkL~:;$zPF H]$S{Lʑ-+.f|A ebL3,N/aݹ7).( fFZ NԎ k^$56%W] nUDu({-`6l -ʽKWXa껴 GbUj{fJ>:5ggEǗE՝}8gW`AcpaWY#][Gh h5$q֙cB 6DO./J(h:'KpIμ5+wCKP\->Qqp@Y{yz 2ƣuABgғT̡Z2J r"s>=BZW*eݽut=f0σ/njW(|db֌ ?P) e'b(2ה9$F/_!/Ee/6[,x`djzŗ7 ;p5M,kCz:N|SJM@v*{5M.<&KQ6bdaHed3EuKO_Ž !)PIiBkXt²CmȃOQ`g4$ an:ROͳ`(ksG a@*F6 :UqGf(O[nɢzzrOu\eu#ggN wri1[_90T@.0_z MaJ/RݼN?þ,X]H3U=iv`"Pߔ2{F>#W"=9df\Z@-aY_Cd6A'YTwo?F|#W/*@C}ǵ\SP+ҶARa%oTuAS69!IW+vK~n c)Oٰ}5h"/L(eV= A-F c0sJo gM("‘4I߾4S^f`uoaYGLj!q9mce_JbþWϻ2k5K88 47:^D̓{Y.tR/Fl%콥)dwd:!?(||.D"B;@s#ypvyq_v"Q[лH4ĸWIb&{G9^* !ǍM(| v{=,u,'mtbk0ΆL<nghSm #'klm F&|h*})TgrG0 c 3 ȾM0w$jdOoY%gGH3pĢA'UYpOYZe SK+:G-dei6tq"ny5 ޮ%*^LP!Xlj=TY~qi;3zf߮MnegߘH;]2PM(6 #X֪_mou;%-^`|\"e.͵@;(Ld,""پJ_X6 `닿a7kOj8ʞ:b6E |,ؗX,Y)L\Vkd9O:=(GqJsikHnwZӨS;yqƥbf((ӵJ ʍCLUEdi^a̭[ݧsvj̈jڒjOFH86UKDr eVzN#rNB/.HAƲ%ikG~ ާ$^ >- BvZ4$O{}adϹ, nD5}")EI +,OjhQ02 1`|$񜑬]-.݌@^q6A 7c%_*~:ɥZFΞ L&GkーxHtXMc%%tbF d𬾩lI.& E\e=b5M ع~ohV& g{"7̏lյ[ m3PZ_=+ ݛܛa{Chк[,I!VS֫{lK1u ,K\93->ݍYHɕ>^7vOGl{VvH37h6lTQv-YŜl(['E@5We9:M_΄'˓>:NRhGU׬ݰ$ܽIw^pQR}M$̿zSg껿L^_r}b jDn  JIZE;Y>eNʉPn:{"k_=R<|.wb֞Tn_3)6x1嚏\$H!9 \,p!!p%bWѡBY  \',!ŠsGfCm^7I}7_R9-XODR:|;M~"ygˑ>ұ򴚀01dom8QV$Z6(ID֙=K+>~ϟ";İXkqw |!_Q|wH\RE"ৡ]+BQ3:?!FĻ.tTdSoxS$Ɓ趙A42 ϖ/swY^bwm ݌Tf{4n$\79cdt_Cis7U#[\#ígQs ST݄ 0qm%xt*VCI](}")ta[. dUe/Zʑ@,!p])t0qㆎeou0=A,f 6Lً?9ɵ6ա\$vVEV\_y+m$S] K8/eOs=m I*D2JZU KjS`0¡s~AFl;8]D?_B2;emww?uęR O|`]yW|PqṛۡR+y'W|ĺ* 0u2]Do=}rY_GuzlH]CP:+Xf}$,2eVQcg+pfy^QZɍGTJ- @_Q TBm\br3IKJT+%q;,|>*+)IY>>+^Ÿ뼍8Or" 4hq?صe}ɀH{/]l0ð$*op-\7[m6D))ةߤG!aXORIΝE **pÁ !y*׷W R,1O?%fpaA~1b:P wI›MS@l"ĶMqoiE?Ћ=lֆ^Oo1.I{\/Ѡ(n@0Zzz-c0:h Zl'jwBbL],@V_63\A"\Rӥ4MK^LF!M W(̤jU9v(ɩ' endstream endobj 113 0 obj << /Length1 1957 /Length2 6403 /Length3 0 /Length 7586 /Filter /FlateDecode >> stream xڍTk6 " -R0  Cw(HI*HIw#J ( R "79z_֬53׮2!l*8W_P64YY a(g?v|Vc(KQhF g@@-@JJ`Oh Pw|VEB_ Ȼ@0hQP3`(rD\%@ ///>; xP>?Zt.߭0_= h3 S0Pt]_Zx-;G!g2A>0`s*Z|(o;#`O0lI A\Q|0=~AYnpqQ?)Pz> ap;my07 Dń8~` aFpm@`P; E l08h3F?$0GO%Zavϟd` oWDQq U,d/)C8~'Z:n[C_bU2_F*??~ wZ(h#Лл_ yWF8N$G**~!q/T Q 2n"q4A p8ڤLy#G*O dM垩t2 !q՟0D>VcG,Nej5 /ʃgg ?`ۚ1<2>dUФb})(ojR2'CݔL\^1RQU=>{XRHIt8u8#P-%{4K8an"9d=|}fk0zwr'Gט,mMqG&Iit*7sxn}e[)zTb]r$X"AIpYT3ʥz2yVYES@*yx?i)Hd& {zs["9F"c5IZlqr<8dc֣zO0w+JO9lS*4[*vdw5jރhD_3+ӌ銏5vG_UV3krJʐ>ոuTD4CbW۹ O 8͂9h&=Mߤ/[gEibgs޷DZ6kk!Xs'lq^dGkx(۱}0{( ~]-CIS5ŢA>b['wyYt'oG|-j6-^(5 +V|adm'ètH“vVyY°c[>"17G ժJsmyils S;i@#s]Pjy#/i: 8k[;+,ǯD~)$a9R&ܜs_ꂘAܟ4[ d"?隵8kv5 |Uxk3 mNt?]{Bs?P:Tehe5iڴXGޛK ˳N VLؗ[؃&#'lcVf%~5KbՠƯE#:kuZwmk3lq+*P<㢸6#5DUٚaI!-+c* -+>:nsQ)gǍzIo],Bpj^lHd֓j <IVsJmyB/Yn*Jq׌cZjSIԖ(c-l7ڞLǍ3uKA]IbԇX+QF2W=$m= qڗFL]X,{X"nhHD)XA[< Mi.SZjDy6yLzTP12xzIwSn/Otiۘ8d.wL>$-Վ?i:TVxXJ;&!Wᚿh/#d]s}R*s-Ob^ W>ݜcpHT_N)_3ꤹ_۞?h7Q qYU۴5xnflwt]23жczAmF}X6i6IRGQS:1:|Eݰ~Q zS>F(xIHhZh䄩.$eSZ9iKVݡJ+]F6]Aȵ$G|"j1Y |p9d I6`zj}/o40iwvtrYGapI_[OdN4`fщ ['|sAgzE},ʽ"rΨFwK;I>!l4AU*z^g/$VB`M}r nnehӕ\qfakGV4-y!V9'h[?RSoe0>9tZ꞊^1YNND9y[y+La-ŇXWzw}WIO)#-c> `߈yMf7(9-cEzuR #ȨBFq+NK 6 -~1bk\m%ӟs<+#-;kŎX #0 t$pzD%6 h x?UɩTDrphf[Ez3LD>ʪ ]`St%<*=f2͔iXٮR+#MDؖօ :(\"JCBT]Ԭ:>ӲMGf|fqVLX9 "၅JUc'PfLWO_=$خ2IL}iz儓h-Y}T)t+>wSÎFψb#lAG,wp<ʠqe)sfR*eiCU[᥌Kv `1d25b?$h[׎ u `\28]%9e5[+ 6] -+p"?Ⱅ QΌ Җy܅r5!]8}mʻ9ilYO5RZۗ7X0Ԩ[|PgvJ›ŗ6%yN/Ƒ;b eHv{2,|uXwH8,+TM$=eJE"QϲιWڑjg'汞ޒr?=%o>a)IDKhD64ew+}̦t/@7c["{*^]WF\7*!:շOUٛVy4$TZ|wK|;ǜb9mSvR(t1492)E&{^RA hPyUoX,wu`i:iU^ŮGc4q)B>{-.տ)8qƋYUε{CKQbl(pa $iinvR>?n'阧&G}'%y+wtB CmFW 5i|2zj8>j|cT+VF:O^}1>EuӁtN2+BJ8߳qD:zP ,$&-T|W=y]#WQSQe^G AO$E{ 9ou<8bTacʤ}Н"ku TJ9,[Q}x~ /(&^qX$1gC1z/&϶3|Cki2~~Sq^B7OK'x=_QoUaVV%V/xˍku"%Oߛ# 'ڗ]g1-whR, ('j<Jl[yP&oex1,՚9;u%]94˼M(QDwt칤G:|7: u:=1zq{oq.NČ~ɐGrЦͣHs{+-ሂdE6C0sݕ, e) }{#3$Ń=V z@3IQMhq "!-"~R֠!UzbϛaoJ!M7T۟ր3A\CsqI+PLtNqZd5[+-jWhn ͹4s_7=Ƀ.pUE.SZ"Ԝvel8 \kZN?pO 8q R_^>=]Uv>!-"Sfbځu  wRz}8b(u{ 3h_.}ϭ M|C{Ev^-ĕA^ߌ7yV1'y㈌U@k [ %:L&*o1h?"!+KAuѸBd8;/okX.c e2Vvc!V-wC2%n^kg٣6 [>8Hu?77|ɖӤ'wy*Ͱ5ʒDř]X-pX̞]F2@ܢDV~UnHgܲ't6qq\N>G endstream endobj 115 0 obj << /Length1 737 /Length2 969 /Length3 0 /Length 1537 /Filter /FlateDecode >> stream xmT{4i\Q/1eBAE̋>f\:BrdS˶tR)*E-V)%i?t=?{}ykbA >"V< 8l[ (J @ S $E3!kAbTI0bB \.^.I 6]! |{='?xBŘxcBK! D$+ $p6Iʞ !I"HB||pY xE{]SR: xw>iMF8f aB H gXGN d_C4!)F2J 0hIC qcIl 8TKҢ⑴V\;%I=8((Z{A% s"L&Q^i} \U7B{ZDȟֳ:v?ZQś1ZͅWni|Rdj c6uQiy.COUwhan+JnYmPT5$VY.va;CJ~t쩢)Q:{O>XqkIkF6]^8UXy[s6!%l;._.6~^dc뱪Ϫ fF Ӂs1Q>QX03L8 u' 2Ɲ$YbݦZɖfgg v}5G]ߜ+IӼ蔿nm<`~e!i_Z <\m?_-[[\+kě5?:6xtvX0eƅ&eft*G~غd*#R /)xi`7ovmLsä.|ղ)C* endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 798 /Length 3315 /Filter /FlateDecode >> stream x[[s۶~ׯc<d:KIIAi['Ht[HJ-}:D . arfʙeڰa"<4dgR*&FdQLZ:e3m 9S9ŜL1y#{Z2D$41ctcBjό/^3f4KvAs ) 1yx1L’4m#F%x9PZPHdi I -9LJ9;(r$ PJ D= <0 h cJ@fuM<rX# 4Xz`zOvo@91d\$={1A 8a^cA&Fg%p'h{(Lv#(V`[soЃ L<"ʊ "t v`x؁)]t\jX`JM1m$1 Yt@}%&4K޳g3`{2-Nx /'/Gd|z6V|pQQ1-s6*&r<7g*VWi)͜?ElQbzjp7G򢘰GjXdx=]#G1;( ٳ?`mq-Q9E`+I1{^; {@0L9SvDH"עz|K{ONIğ%>A HUfnC82ɺZzq6VTn(|(2/:Ff( ZnbD6iXgӚ4]ǫ` Afr9-`J,GLDJ* lw݅EbA^J~ibIu0[cYP+U_;p) V;"gGuNX/,{xP*Ϡ-<(£Ȱ↪:4- @VeVUfnafX{ 94fsaBDk60lCv6#Z4+J\̣ ZbF;L vĀĀw& %ry3,yL9MoM!%!t_X{ϰzӹ:7N ݴ 1pr?ŻMǻ]-q[k3SۚjenexnBU]2C_'u,:aj0J'ҹ [P; cI^`^uFI ̼քRg*#Xe.VTxJbYte֐`E8eE`CN a/έ+K3+&ivFPV sA "zzeS9Q´ ţAIT% |lyyҭqF%mү|V-\+#o k8]\T+[cjVK#)+Ԓb؛Skҗ la=fSi^V}993W<i=uFW@ꭎpDX+j*w3NSM(eh;>y >੷?E^{Ulnc}ǒb<x煍?>>jlE|k t5D3]ꏸ]=ksm |L~ߖ CRZ%cJ2"m*Δ1'A!R54-)Ց+v0n-B15Hs$ۤ8cj#>Kz*#˿W ˜w("ݓ[:qtNiV FSj$Ɠ/ԛ= )=4)޷`?NRþFs8#HH:Տ:*ӓOM#o>}C!10ON[T'>ѧ(f8= _(hzKƞ |Y`9eqΜ=~XM8.:<| ?#~ ~6G/~/C~G|ǣ_bBdOt/kdgT޻O/WH RQ[TnRSk%YБM4fi6^|4D\!mJQv`7WF~yOfgg OK;R[G)x *eu dy7`8{ϛ>OREQـ͈A)r4@44z5o5}o82g1!S+Uc߁1*_d2QXD/oي&r+Lw6Ya"&ʛ&ڃI uP#ܰ)vf;$ ɤ"RH(VGm1flVW~' :qijob{*)Ap6$%!5gJ);CCNϑ;^F'ݯrIAk)l(gݨnb9 }>a't{M(4o2k2_LrD7-IG'S@/G*4/j]:aǭK<-MQgw04SXUbJ&ݣDMiiw6ҾK"!۴x'9v.q=̉ ;'.'ui/x ڴn'wuI;v^u/ji]9{hw@'5uw.uy j}UK./.5] GZh ~3_Ӫ?NW.au׬U][ 7`7Mu5%3~.8O+ݰPta?]arUtS}i@M HV&k9ijj_Cxaфn"HfZˑĉ@-~ٟ'da-rdө6GSoП7t:Bt)7.Z]vĖ؊mpdDMFP6XqANaTDV9c endstream endobj 127 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.18)/Keywords() /CreationDate (D:20171209003347+01'00') /ModDate (D:20171209003347+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) kpathsea version 6.2.3) >> endobj 122 0 obj << /Type /ObjStm /N 5 /First 38 /Length 234 /Filter /FlateDecode >> stream xmMo0 >H4P i7 '!mE~N?P8yڎm1JM@x_("aYZL Q/f<`RF9;[c@D($2%TG'Wfݰ@uby>4@XڜT6bg[}IJy=?*K;}-/oi&`%7j-ih^]jӋ)2g\]?K} endstream endobj 128 0 obj << /Type /XRef /Index [0 129] /Size 129 /W [1 3 1] /Root 126 0 R /Info 127 0 R /ID [<3AF050730C7FD437E827323656173606> <3AF050730C7FD437E827323656173606>] /Length 313 /Filter /FlateDecode >> stream x%ҹ2Cqs{=A[.ܗPQ+UVz`&=|g~s#"vDQ'@\@x!r 'PPJ@)lA6a `aajJ%>_4Bٞ Z!6H܆vPQأ p00($` aB%fߛTyRVXͨ[ͪ&>TV1՗oEկՒղ:u:h'.rM.7zyͬ}):+g endstream endobj startxref 143703 %%EOF foreach/inst/doc/foreach.R0000644000176200001440000001532113212620531015132 0ustar liggesusers### R code from vignette source 'foreach.Rnw' ################################################### ### code chunk number 1: loadLibs ################################################### library(foreach) ################################################### ### code chunk number 2: ex1 ################################################### x <- foreach(i=1:3) %do% sqrt(i) x ################################################### ### code chunk number 3: ex2 ################################################### x <- foreach(a=1:3, b=rep(10, 3)) %do% (a + b) x ################################################### ### code chunk number 4: ex3 ################################################### x <- foreach(a=1:3, b=rep(10, 3)) %do% { a + b } x ################################################### ### code chunk number 5: ex4 ################################################### x <- foreach(a=1:1000, b=rep(10, 2)) %do% { a + b } x ################################################### ### code chunk number 6: ex5 ################################################### x <- foreach(i=1:3, .combine='c') %do% exp(i) x ################################################### ### code chunk number 7: ex6 ################################################### x <- foreach(i=1:4, .combine='cbind') %do% rnorm(4) x ################################################### ### code chunk number 8: ex7 ################################################### x <- foreach(i=1:4, .combine='+') %do% rnorm(4) x ################################################### ### code chunk number 9: ex7.1 ################################################### cfun <- function(a, b) NULL x <- foreach(i=1:4, .combine='cfun') %do% rnorm(4) x ################################################### ### code chunk number 10: ex7.2 ################################################### cfun <- function(...) NULL x <- foreach(i=1:4, .combine='cfun', .multicombine=TRUE) %do% rnorm(4) x ################################################### ### code chunk number 11: ex7.2 ################################################### cfun <- function(...) NULL x <- foreach(i=1:4, .combine='cfun', .multicombine=TRUE, .maxcombine=10) %do% rnorm(4) x ################################################### ### code chunk number 12: ex7.3 ################################################### foreach(i=4:1, .combine='c') %dopar% { Sys.sleep(3 * i) i } foreach(i=4:1, .combine='c', .inorder=FALSE) %dopar% { Sys.sleep(3 * i) i } ################################################### ### code chunk number 13: ex8 ################################################### library(iterators) x <- foreach(a=irnorm(4, count=4), .combine='cbind') %do% a x ################################################### ### code chunk number 14: ex9 ################################################### set.seed(123) x <- foreach(a=irnorm(4, count=1000), .combine='+') %do% a x ################################################### ### code chunk number 15: ex10 ################################################### set.seed(123) x <- numeric(4) i <- 0 while (i < 1000) { x <- x + rnorm(4) i <- i + 1 } x ################################################### ### code chunk number 16: ex11 ################################################### set.seed(123) x <- foreach(icount(1000), .combine='+') %do% rnorm(4) x ################################################### ### code chunk number 17: ex12.data ################################################### x <- matrix(runif(500), 100) y <- gl(2, 50) ################################################### ### code chunk number 18: ex12.load ################################################### library(randomForest) ################################################### ### code chunk number 19: ex12.seq ################################################### rf <- foreach(ntree=rep(250, 4), .combine=combine) %do% randomForest(x, y, ntree=ntree) rf ################################################### ### code chunk number 20: ex12.par ################################################### rf <- foreach(ntree=rep(250, 4), .combine=combine, .packages='randomForest') %dopar% randomForest(x, y, ntree=ntree) rf ################################################### ### code chunk number 21: ex13.orig ################################################### applyKernel <- function(newX, FUN, d2, d.call, dn.call=NULL, ...) { ans <- vector("list", d2) for(i in 1:d2) { tmp <- FUN(array(newX[,i], d.call, dn.call), ...) if(!is.null(tmp)) ans[[i]] <- tmp } ans } applyKernel(matrix(1:16, 4), mean, 4, 4) ################################################### ### code chunk number 22: ex13.first ################################################### applyKernel <- function(newX, FUN, d2, d.call, dn.call=NULL, ...) { foreach(i=1:d2) %dopar% FUN(array(newX[,i], d.call, dn.call), ...) } applyKernel(matrix(1:16, 4), mean, 4, 4) ################################################### ### code chunk number 23: ex13.second ################################################### applyKernel <- function(newX, FUN, d2, d.call, dn.call=NULL, ...) { foreach(x=iter(newX, by='col')) %dopar% FUN(array(x, d.call, dn.call), ...) } applyKernel(matrix(1:16, 4), mean, 4, 4) ################################################### ### code chunk number 24: ex13.iter ################################################### iblkcol <- function(a, chunks) { n <- ncol(a) i <- 1 nextElem <- function() { if (chunks <= 0 || n <= 0) stop('StopIteration') m <- ceiling(n / chunks) r <- seq(i, length=m) i <<- i + m n <<- n - m chunks <<- chunks - 1 a[,r, drop=FALSE] } structure(list(nextElem=nextElem), class=c('iblkcol', 'iter')) } nextElem.iblkcol <- function(obj) obj$nextElem() ################################################### ### code chunk number 25: ex13.third ################################################### applyKernel <- function(newX, FUN, d2, d.call, dn.call=NULL, ...) { foreach(x=iblkcol(newX, 3), .combine='c', .packages='foreach') %dopar% { foreach(i=1:ncol(x)) %do% FUN(array(x[,i], d.call, dn.call), ...) } } applyKernel(matrix(1:16, 4), mean, 4, 4) ################################################### ### code chunk number 26: when ################################################### x <- foreach(a=irnorm(1, count=10), .combine='c') %:% when(a >= 0) %do% sqrt(a) x ################################################### ### code chunk number 27: qsort ################################################### qsort <- function(x) { n <- length(x) if (n == 0) { x } else { p <- sample(n, 1) smaller <- foreach(y=x[-p], .combine=c) %:% when(y <= x[p]) %do% y larger <- foreach(y=x[-p], .combine=c) %:% when(y > x[p]) %do% y c(qsort(smaller), x[p], qsort(larger)) } } qsort(runif(12)) foreach/inst/doc/foreach.pdf0000644000176200001440000044420613212620531015512 0ustar liggesusers%PDF-1.5 % 41 0 obj << /Length 2520 /Filter /FlateDecode >> stream xڭZOۺ Sxz<+$RҭiI/o;gזkٗo_%)[viYS #%[<-_e7~?>06 ȩvd(ƣIސ9"%QyI4yI/_afpqЃ!rI@ )*dlk۲ѿ]U 1H)m6bKS=F+*`6MJ0< md/w k0ĸ8 Y O=_.o ⲄdĆqV:;maլ/hb`{JpTΞg[xG>L.Zui-ÇCSDj)0iAǧOt0$8˱|;R]kLrdw=zbp mp ܀z)Hce&Nͨ|W"å hYC{w㠤1ˢJI |:1L MhCQuDȊX|kLr< 9=@XuyM#YX4D`6qNOS5A}X TF.]SʤD?9%$ \;Qe &:={a}S} ؍ElR2U9+'ih!՞D>Dy`5.*>x y[o#.5e}g-[b"a*LzOX;<ݸI DU!=^dfF1XBARLJogQ:ÂN#UYVFCI5It78L1]Pqfs B!\[,k$q0,+5R͑d{^D~%B?Pqb[d|XytǾVKGc|纱F)<i ܍ؾۇ ;NiJ׿Ѭ#?tFzw%A蠥&C:frS'n8k͛rCv@qYMyW8g!ۨ"1fQI4|dy$;lI#&nM|^9oQDVDj&BSx(mBSaǴ4E1#cJ@ij6iiBZA CJa;ًܼ֕ MK|ݲKm-9HAqŕ&{j&F iXtkJWRcKens.y`(7?\  hkCMO2wuOyE@֤|]{w:MJ+1(1{O^W/ endstream endobj 53 0 obj << /Length 2301 /Filter /FlateDecode >> stream xڥn=_Ee "h A;(fNe,g<﹑œilJ_(d:{wٛdƨ{]\g9UiUPu!g0=nKg}~7o]jt i5u{mo-oZ&cæ,l3<<|\x7ἳ\}:33"L _f:[OVMSfG˼.`er_fWvLGX/l~ &Lia뼃G~Ghϸ[,'718pɿQ"NcEfwa"tCXE"2?G4AGD.4vG?z7 -( 4*TQF c-)A枅hrvS+e 4JØbi-wp 2'sFpaaz wv#~ kd)_kx2V7T劰AzZ,K?}RjX e>x5$;K+?)`Eq2?6o)DA?]w<ĹZ.B6?/:BV'Z"DYb (ac+x68?#ˠ>l I Ss2 a&CܠGq8!D/mf-b|ZԖ h# I%Az`q`w~$* ?2yp߷OCzx'L o }wĴh&8n86Hs ϻX}kMA郕j*mpW grN}\+=3.|>Y%$?#K~J"?P4 f;QDO O$7#\=f\^0a\:xGd}ٯ %k%u$! $hOr=o*oxcÕwZ xLb} Zلj_)fD(S y?x-Wou P qĝ vVU>K =)#̀"ԁӚw#"%PkƖsȔjw*~$+9=sIribn!cMBӫvغ{9t" zVE54}ҟҐ&gFuT @}#Loi.L@$8ҹi>0jrC z@5 0Rk\N> ],`vM+nyO{AZ$܏2 Av/TSJ`\c=ob1s *J9^i2 ,Xmz/| (uV5'oxҖ|PP8UQ߹+VeQGؤ?;ʓ^Xl 0D/1n3p AhS*z9 endstream endobj 63 0 obj << /Length 1112 /Filter /FlateDecode >> stream xnFK 6#h{(ɡhQ=8:P2e EWA3|(#$HC%n?~XΞ4Zh- XnVfʈ8i\,ou{|aOw/m:,T ܑp h1sGDcDM>,{Q쯙\%NdΧbs?^)qBɢH[ĺ^9o_gjhzTw"ͭT!=/;| ,hVۦ7+}<+^Q~1-A3ݰ7 seTkJ^j5)6ѝ,ģ&(j8)Sp*BTL86cw q=6f5Kd8i[S>8C gn/Mq)nZwɖcL7<_[NW2MBw7cK4Տo#%CݵqvWC8%qWP #*P6읨@+`$F 5:C{JNٱ5j JNtba߹q +>t+2 TzÂ"R$5ЭRCl{("Td`y#3*>@6{C²k%8 qN Rtnlr^|OPL5/њn=f0&E ˶JF!9C:2{Kh]9 PGg6ްov҃m>9d_d;v~_dI:h"m:&bOy@3AjN\hvɓzh( `Ni%\OvTjh } N$pL!8I s(Hhp=@wB7[ߎno$XC/qԧ§ \?xw endstream endobj 67 0 obj << /Length 2086 /Filter /FlateDecode >> stream xڽYI6ׯ.` d9$3I9tUU=r:>o#EvQC_}}s7Tƨ.[W9h[5+۶ͺz]4Yzŵy~q{߸Xꇨ:atRepYzP26)sa"z TWZm^j VZu]^Hj[ᾩ~ו.~bblUx spřAx}:W;,/5uۃұ_\{GR¶_z$Щ \[oQ7fjܟ'yὮZJuQ6_ɶ> @[㰯5GY4] {rq2a#e'c?QNۮ_QN^Q![yX vK!_L49pqCƍAސ!A-#?#lAPԁ "),A&z+Cz,W}q eǵqmv2*0'" `Z1f&H;lY%D'Hb"%n۰-nbPX u֣g#ŸIQށ+<'r#X1ፓ>J#y< 'd98 !m6Hv`{y nqm܋>Bj $F.D?7C>׃1bxcws0 ȚN~nl}CZtɉ7qF\kY&5r9;yv~-IOC1&̞FI/"*Wb»S29%Ko( a\|滶ya)`@fاD^p>B 5k$Sߦ]:޵)(RJuf7$˅r.%mDdu̔<3!bT91~UH~JPƀ, IiVwʺr8O48C罬Hy,;@e0I+$oeJj]oؾ^6g%`~_NT%I l 2]"2c~]͍IbOɟrZNX3 ƪ& jALAkt5尥pL-{\q<& `rSȅ 4Pr>?i~3EBYRievm;٬TĒ0w؜ 8Z[M)(bqQd~)9Dc7[U c/ol&6Di&)(KJ0ᙶSA45q"`hubY'A3|Q.(6^;I. .'{-HR(Q$z/eJڻˮ4PO7 Z&CbR)JN@4@'3:͌*"TJ\PY@%ϥ cQRK6MfCAt~6 yӤ7MHn53"Kբݔv8"L*Tvwc/8?qTg4%EEɧEjbʌ”ޯp 98VJ4H݁GgfM a=߶2>fO\?/\%ORoQ̟^8΍r?bUt8> stream xZ[o7~(";ͥ.6Ţm܇"̓,b#j:{npƔ)vԐsxQY+ogߟ}BkzoMaUui8e8_ofWs=Ay7_XgPoRmYwirɃƓ:M􏹩gLsgwagi- ]xWԺUWj{mYEڶ*nj[x}ϳ2]zՌDwEXU|፝}_@WiUPhaPo/ 9VBP.|'ܾe m*nmTiWJ{(qܣ<,E_XkK~uW5/FUì sD*aL j-k;Ө;ҪבEXZy,QxKKx+.d,5q3_8[VKձz sTnf3-p5=gtrC3WG!bsLz<7")vj]={Erw{>.ARbȞzK q !o{Ɨ%5`w6ڂ(RP~{"s!U,ܯw/^O S嗲t_.ce8J_?gͧC؄-xm~B'3]ّVN6FU6b~[̎({ @i$ml-c w}`׍SrOkUO=[EUFz,~s/OX5] F,|ES1e hiB[׆R.^v|P-r!$%: ,@p0 W՗ >tdܦUU39 \.1M28VVP-AfsNCW%}@Q`pT.5rкoXT3{ɢ^՟|A};|Ak91Z8hyM<df0Mz c wrang(1 #qrC «CV7 |֣Fi}ׇ. ;= ||=){J7ޚ$u5lɌVXk5YR*2U#==[ZTPmqcxkhI 0rh漅 fMV|ù9Sv_+KFŵ>p}.kA-,/JU揑 :xᎹf;Jn$1Sb7O Uti8<ήxS < endstream endobj 76 0 obj << /Length 2119 /Filter /FlateDecode >> stream xnF_"T7b8WE[ EH@K-TQc+9 5̙sUVfߝ}s~51E/3\Q6/l]gmKY|blϯ[;!M;ma[Ys͛D=l2V7saEy{ξ=?{fL|V!fl ?de41',mOge*z',֮(||XXxH xFILkJP;_K]4bBw+GդhT!/fm,LPX$1gZ8yQxwĔ-Mm -x##biBeBƭ ZQcC4JA7ő2c%VAߢq`0<1_3$Wka R5꡾V5PѡH[_J>ؔ~8XL6~NSnܰ8銀`bfMb b}u2~ŢǢ#{e𚿉#?Hx8׭S{kEgc x*s¦Mfބir*C٠CG`}IpSX y⁙" ׯyBV (܎7Mk$*"z iuPӧ'Q;_YJ(GXS?%gPkYuvPM#"Qp?2S!kl4wekQJAkdN3(g&!=;K[W*b[$OIMuTo-BrxXUI5M3fPm Pcg~VTFJɏ]/C<O|Β lK2c!?i\c8z6;[Υv*lE #[1]塚?$lFLTxyZH+ZX~OlL(ie014?%xD"b4uk^4^Jw8N"I$Jc '-/r~Ns3~r3[}tG' 9Dabnڌz3Hli[t R:MmG ݳ|s-rP&hX%̝jyBO}> stream xXI6W")hz(ɩ{Jsڞ36J'hm$m|%$K~0=it3tFof_'*ju6eGet2WYe؎g!:=R3?2E2rh,hh=PN r;oq#]Gfa}BBq/Gf"k[.%oE܋i/8E. mԯ] C22=YM?8xkFLU8;@Br\%ivIL6!v-ZYtzqH5VR*;|n7ǘ_12ԅ2`ݗ o^jf .|i(:IMqlGGBt/iX:L n cDQh=(#tqe4AN/.*Zm HҰt _n;QNViZ0yF YTxxc 7n?}|ю*S:ӱ^k2.u.w-^]2nS9T]WHP#-%w*ԁ* @_Xb>d͙Uouh1%:.. :H/s25aN~jx6j=k$Ho#CMa a@! ,ȎK[m-.}_\C9_O[nH,f9*8W7Y endstream endobj 85 0 obj << /Length 2233 /Filter /FlateDecode >> stream xڥY[s~JC/3M'IӴ;}H KXGϹDM888*۬qWɌ[mvlYuaں6Mv=~nǓXV~_mQwڸioK?&cuӿǶ1= ޏzշW]-2yզ͝_lgE޶UHTW*Rsk ),O) ɳkh0)k?O>{8v! lu5s295`5ĞP=}0&G7ҀN433QH<gG^]Ev+ wcیe jp+lP\`u{xю=<*!u?6/efrDYk ntd ;p[1^>c 7mTmb3J,Y>I;9Y螐DE-t.h)O}i-(/$,i?L|Jb 1zFW:4Sȣ!ӘܵNhwCbC2>BUZhx݄/74Sjl)f0M ѶE-\4ȯ$d}/"#ҽO P|25To3Dgq)G^4vע9x/RM(xAAKd\upE <=! 2$E.>uU6/5VsHw$cZߩ*<%~F|V ؈RܫhNjUU%ˠ9M?J}4;'o+XJ.$bn##3%n2vH; Y|1VU&Bދ`a+g]0i읤d F-CZbDk݆q3ahSko`'DeDT#:Z`|Z/pC,pZ(,qV+Oy.,LgcBb >@Ҙ}TsNJ-i!2.encǃ Rbg7(Pi:7N1,7), |C-qEK<ֶy8JNC(8AJxm&- v/&SgOV~4QA$B[ܞCC E!z@bTT`4[Lr OC"R/c*/h#w!VfI)&b_ &< =ɕG{".aFSK4+3}O3n%A}7X,hM_yś,lg_|^veWA'q"T|"!ún΋?I[k٠X,TZ?^k`cWv07 (܏ܘZ[A6SUR׿!OS|iR+# gj?*iʏ3/8HhtaQIt߁.lCjQu,a0IH}vM'}p7,VYpnm@/ _TPlTΧ!EZaE/;Uޥ= ,g{9 } xz\^-%&~qԲ=wzzc!N&W+k^h9_"Ud}T(աRVߊPCc<"cq.͂v)0R}vQ#tsI\-+{JgJ&/(&~n@rkGpwiO}чϝ,6{R]/0`gp-3I^ ;{];ԹhCK (:P}ܘUF5y<ΰ]3IɤUt1\'P <%nxmzؤ9mOsG6A%yKE0~3։qzwC??(KOҨ!rctx@`xAC3fu%MMKvz[U q=}ͪzf n5}N NESDcpAOs)cW•}?"]熿{L7UD$߂m]nNn8Dh,@11*,+,WK_£eE#k endstream endobj 89 0 obj << /Length 2395 /Filter /FlateDecode >> stream xڭَ}1X>xq$k㌁yVEiw%JAb~ۛZ"ΩJ۬uβ،688[na<~[WR5tp۶{~|4CC?m504.Q/7dEUQyQf;`L)Gڵ s72ersJ7)@xbf\I z ^ӁP-jW"nGݜh>зB S wkrUAo t[T+|L'B'8Ull4m*rk_o-EG,(RPnL66 d7O[c6D乇:QITqNuh9 4_JV"jo{gȋM?IK.7b Dr[xf`ތ^bV(x5`G0ɝV4%8[% vP|WVD0c+9py¿Q]v>`X@};'~)Q%+Hy@!,Ne3rU񤰎.xGNxW4>3.\d Iwq_?ͱj^$n0൲#P$7*`~_T٧%t=]b}UL6>&Z{50WSTT >E?%'>'gQ[-kp2q8yq#4)Lagd+~nCd=˺T6}nwxt+ZNHȯi%v->K@"\'Cp+d:-\پm]7U}hHB\+V\J&sr'侣%$h? dC; ȕ%hBV;yq7`_ qp۵8b^%_ ._ngR{0E;|VqÅwQKٷ!D$TgW]a8C/IK}=dpN"еHh+8Å3TnBA<P'.}DsױgҌEvt!;w ,5Tc}V%CJҜdRVHm*o}Pe`y~W{> s6BٻDW=>ũ{b 1dHbơ>irӽdɂ_D\{edD;J%7p#Ruw}e)Mvd"l{ ( o_R]K}gzeBcb8T|)JkǤ=eh!Ut*o*Qn9MhqLJxtItmsRx'y0h۾WuFB~}\ ׏ 6Me${SPHOC*iyj%*kL!]^rGi(.A9jVYG?c|}ٟj0oUA2J-#hzC%Oq't)/c9pI_(y0E\R0l$i&MvHӰ\iy)X͕5J%y/{_fQÁfdǿ$z{ >IL|iP>$fCǯa-9e[3QܲO#h|1LK Y>06a4r1g6qTNWN*a]I [{4{dDS +;IpC)}?F^`@d5Vg}ƾUe<" hǝПu fK2~ fj:햝p<lB%qoUL{G8` =3^Oh遤*"߱3CI#4y-fͅ-`D%O #ƼD›g[Eg.߳_ǿ8dqhe@fK_$OyK$X$lV.h=ɬ_tz ERhD cecdMY}zw&ꊕy&8 :dCZ+).{{gy:@o<=s-Ad$N:pAxY+~eP0 )JUk endstream endobj 93 0 obj << /Length 1189 /Filter /FlateDecode >> stream xn6_A ("a*R"%  ,a-Abv0wsHQxhЧ=P&s e qzwGzO)U*S(xNNC߄QM Գmj-0 ZP"`8kVpHW;<W7ܽJxjhW`_#ZGvl38GR:6Ԑ9=J$ɠPQ?f{"]XOہ,R@J㪕u8? >la-QOs Q"54?z.~֔/X14wp[#OT} ~icL+O[ +"L 9=TI#.s"siFOJSn|*-tې+" gx1qx?hMŮFD3?GtErDkxl_[/_ʛh<qR:|NE}I$tT_C;KhM0g#bC9SeK}Ӕ׮޹$HT1&Ҁ:ey\Ijްm{8'HfxfM0mv{"+o;NH"d<QgZ>!#Ӝ^=Gwj0;W5g)HJ@Zjn B(O}-\c!1+pcq] I dkUCatZm$Mny2_[3I .l&t'9.nl謐"UѐF;;KV; w^KW*Ocsi z)HL iܐ_8rgՐ[U\=#)q^fӢY.D> wBÚt> stream xn7]_/WXQ4}PHpH+Yб$6{+QR}%.9 y2OxcͰZDVi-,Jˤe M~tc(-hյC|@"1L`"RiHB:_H&˾x~ HtbΓɺw3&UU#Zf+)vc䀬3x܎!Kkoy L8(#_=w~ɤ dD;`{s56 ~AhP+ _1C$t!kH}.*+ʊ>uTMthꔸPYer&ĈLlwv4S"eE#B#.qP{K.o(ޱw8|bQF%}V"V"F%olKV/nF DU1\Qd> stream xɎ_ABFt\ld1bÎۧ8lv`-=!mET/@.9P޾ի'$*7_3::7ub e¸̔ery|HV nY,-}1ϳJ@lG>xni6Dž)RާMwˋ`UBWyl.>|T䞠6W?]Xu4h $/m*r䋥ƥF;x|oQ |[Ԩj&S &ztZ)SD: ]YɁvxA- mu/x` Ek%,v0 .:1[…߿f"n4y4G #Tϙj9_tE NsK[Ȅ ;vb6HgL988*BpG˽Up%~Uڶ ,TP=s'iplI\u ~j7Ue !DJeE.>%(nP<'[U;6Ťr]<ǯv0Nkd8r3³wPfS%rPd{琢}L!H[aJ -g*. R^ PJg>~0ّ3V٩<f}w`Ahq`mB#6pŵ` H_u+,/ӿbC(e1?gj(0 dq>odU=䖁 M-JCdc510߅z-Gф3cMEkP`CZ0VDM2<8؍Lq!RൖH7>] $X= L"X2P'M-X]Du(k&)"JN3zXzc/w]u[n( Tذ q92/P'CIĨgqjZ~ׇ>W }VZ+z ڄ6 LRJkȤlYU35]ӆBR˨4w|AOxsSڏ~ ys|:tL )Iw:Ap91N(YqC$Ga_rKϝ p*AGϠc>iHh;wi Cu>ΦTNO{?=ݧg6'%G̨c4{pG4Fa┴!ˌ1·в-.{Fۄ+bUD9#\rd;WDjܜ)Q"։:p,Mdbr\Pbaum"k8l0b1q2lM֭23~v2_f:2¥MGKm,y]fR1h!oɂ8̡C+x^55@Ǩg߸Jbe!0ԄpdLPBԒk> stream xڕUn0+x)"5U5@S uClɎrI3!Aۃ!5{á dtymZ1 c,qT6>,smYck|6&7׶8Uރ'm5瞌:0&}M>YF&Ǒ]%Nb)P +ߕ6:RΊJUk~ƸX@R.|lVgo~G cM W[OY[~mU7|xTXcy TV)C6^/~ W:Z7!?#]܋ ׳Z$4+RClK }:[,*63p,X3VYCh@p Dg1:{'k GEr.á_ZjOW*%U&.2F%<* ,$e':u4w )@F1]/h֠ȼI\s'W,(6{s2ˁR, w|> stream xڍP-ww݂;w > `pw`]'8 Gɹ*նW^ZJ5MV {3=ąC ,fBղvǎLrr+B tyI]^!W['7O_!@{'A4Pi<-\^G9#S@t(]@v/'m * l sfwed[X4@ '7*@;߭!rhڃ]܁N q~IqX/4 _JrgQg2Xֶ  #hltZ^J/ݟ3=Qe2 ){;;~N {}6{wb Wvm+H^o%'9@V_o{ 58|o 6w,!ȿA;Y{ 8^ OF/ z٥TUn r|os!`{_t_nkaw- naY*W/#YW[? @;k[Ͽ#^/P]_+iok>y.H@,mB/ecl! 5{g?+'^p~.2s{?trz"sH ?U `gػ^흐Q>^~#?.q~#no`W^^TQK߈xa^jſ 7?E`k^ۻ:+%_dY  P 9_@_y^b_ ~27W//\ŔN@ 7y__^ /5]~_X95.JxoW9R[;"?~d4oo.&Jĝuw\dvW7{ɩ':B2c姠 mke':DGxVI/G}dHZ{>O>:6Н َrq{)XD+- ݋|[pu Y(1MŤT膼Q|̭2H:˔4-S,D7[^ު MOGnQ)i3%_2y2FEZZ3[71+mtG>B,p1Uh!QJԭ` Fw7VC̩ڿ+/hvNnnꪰI3Lf4qcJ]ښ`:w+5ޖtx5=6;;a}5p%sQRqugTq* _iV2.%llEa-f[!.~N쵫.37J>9Ɩ4gRF!=[X_8o1Wqe6zK=mYbB%y.4$Zq\nssZ'^8} 2;s yC00?HZ M6!X 5@g?嵱. hX!a=`G|sݏҩODEj3b]Lq8I"[!P׿-g| %A0HF"g`SK#Z]6P_zԐz>zTˉ_FyH̠}uEyDG|jhMձ m+޾1n[x56)xShF3e!8im7IAktשB)`N;2^P6E*C 0U;ER|S. ܐȓF Ȭ@xwOdE*,Ư¸tZ[ {ݏA\+Il8G8tLN(>Qu[jvqv i|-$In"V2]&z qa*w ą¹z<%p8zRU2 71Fz9-)uKLM$oIYEIoZ?H^_EbZq~d d@n_>| HV`;$WQ߰E)DȼWz6P/qvirnS>&#OxYA佋7 VCF*[j=GM'ʬ=oHPFݱm #L67NhwtV"<^}Ub |IoXȖ9/J{KvNW"1JSK/:%U$Ȥ &QdU=iŌlzJ*ai YҿNKma:faRlP-21H K҇_*?G(B]$9! y^~/5/f)HP?0q%Q =&2j`&w[|CT I92 :8$'%6:k8U͝D^zF5dY8=;=V=g'e'Cʺ9Gc&0!s%DD0 *7v׶5I3GmA'!|(& UjCS9'18[ {Imã% lmBɆm y@ZmPgr1&Y$%8mYE,EM|:{'E3LY&_!,>nƈ!lYpEl gu;4{w[.k3x`m>g냥iHpV[jQkd]A㻟uXU`(v}K`{Lg`Y7y/[ eo*!Ve$-AwN*;2fg}e k@, &>+ ,hhY#݈@eՇ6FK(_ȗ0 *-=Yv6Pp@DWYn^+L"ynnevvC&hqٺmrZ07 ų4$1jcJC|.u[j1܅8p㷸T)k*5gxЩBoQ*:mdKXn> г;:WGJEU-\jp {5y_ԒF6͠:uUl;4]"%wƲ8Ld)H'!λuwB.aA67U6N~!P21vWnf,=%AoCS9*4v4͗c6KРۑu1^@먣Db t݀[2! J"9*uz;uRPY@crX[j=_ܢjfuǹ ѽ*O*OOvg%6KbI>}#dA Ӹzf=_O'{ ]V,[[b'xkY8bٴG}_k[*kQ_3dʣsmDI.I%}򓑳3*6Sn& ϥZ?d<|m7G)ˏe%l~u S6Y1d خql{ ς>XLzR9uL,Jns\W)g[UAAZ O,n7m;b-DM6QG7Z|/hzκ`f4~b&޲[Svu-R:>#ۤsѯmeL[ TglG~iwtaKZHIPJ$*r~"v`υV:gNg'=4󰅮_E''Y).\~ u)>>&f<m\"E6 |&tȪ}~PǏ#`ǐ]v~28]q܌Ιn'n>uPiSj* jP2[V꽑YP&oUVWlIw՝OvmGY ̪d\(EW!i WGFh)Q1lӕ lBw;^Q nSIFT¡0$5h%_Hؕwi+Ό*YYTBqt,)e=՝@OgkgJE8[sslΜiS u?LQ\R: HN{9I^-=FPeӦ(G ʙj5bCI]-V!oOb}>S~l`T\PcCUƵ;JuxFxU}{M{~jBP3ʀ  7ϔSaxT^k|0n['௪5N:jH ‰!S BvOn8g;q\T?-+Sk'@6x8qł0M?aO+ρ"ҰPT'0 ? l{zX]R+SVyKzo />+ngT"emB!$+ 9.,Akm`HM2:6);i/& ^]Cjh"wo}_85 lZv'&,(%kB2aˀ&vS:O:ءo^ \0daTisZί#l7>2+(MpN'Fk٧1LzW$D\weKȔmbȍG8l h,)uʨtqORZ2Z8N- :yUR|EnHd2r S(MTs@4זJyΤ7p ckoOK0<-+ {(x7ΆX?wޗk39stw#wD E1q"Z4(c Hm[crSGO4`BG{6ҦQy ( CthC}?kN. ބKtEUqz :-]$|!l|%|5W[UIwQPaNDa ;8;Lgn6#;p+Rp.mk !o}a~t gα upO1HqbĢWۃ\ȷ_pϯo˯Ā@Hw}aܕT5 LHKjL3cJAj]3uP'E[郏6I$mz{M*4 Pײ86bk:p4B$A&Ard jz$,%I^rݷJ3)egԵQX"Xǒ`">LPN,J~,+:!y Gcޤd<$ >3xWGcȖ,Zy&qaNI^OM((OߖS1kp\RFC>v'QXWFÕtn7Sje*%I 1v1Io2fGQxD)Tp .36 L1RS`kpTs͕ŸG-fcC;/_8*=]@P8%ʁAXFieda_<H}wy_4'طgNZVE]\3"CJajyݎ67ƕkY[53fV)ۉV.Uk*\U,[U1Y*w^}Ng>>iҞ ;3>$N~tPcki'xT_7!tӅUǵmZ_$"eњj5Mr{>#W/=ILd\¢:#1x 8! )'})̟_0)sCGv%?NEh ^9!ކ\{WNZ1GvR+X.]^bso`/OcOYㄆbqnmfDWvZxCFN)Vz]εҭO5E/-@I)ɟ{)O1Ρۑ=2}xI$CYqEiVW24~a IQ$6n،׷A'R0 GxPB9(Um]==$G㡯o-VƐ򳷻o(BM}eacbS7k骨Ș=lVb Ax5_9uTfP 2(yq+ WV"2,"!{whrxAJ|J!bz|(PpqT~ρ)ޢbךյd)cl mPzhӡ 0L f9g0iV>y+%8C,m;C[g(a9G 6׏xlate%9ǯ!Z>RV&:Up46JCef L&kzcBYFrZJmÇ- nZM7t$S 8ZȬg z) 䈟KJY_#HT5דNoM2U:L.fZmy|Ʊ"!yU6T?O=4U8&nd|_ 3F8cU}LeW)R-2Qo7RK]4[m8Җ`bC>οNӐϒ{Gݘ J+pʛJ!q1ݯpXёJ2U[/ʪ)OsNpj^RYZZ&y֡ϭ:YB^;c̜C[Lv+#9$$%F>[q^L}Kʮ$$k*Xzla&tX찄;R+|K@ Ąv!R08]Z[RRCdy3(wWCRgddiV4+lγZ> bBЩUM|niA ,'x5k?w(\*PN@!pk^~/"dLUOfB}V {eMdʇw{z˻'s>F=T ijd \nm.j;3^uʵjuU\wU|wš}\f*/MH]i΋B>8ya wj^(D Rx|e#Vݫ0i?[4,Ų~"PRَ?2INݝuo:sk}]PCb_Z3X4F`vpS 5<CJ.+Xeկ–s}7-se45"POj2x8ږМj£97|*zNYK}XVW8Ի6t\MSRFNլo[|A="3YH>S#Addn~9⃼CbwsLOaS):j[V9JDfFcmK'.a_W gJi($T9](6)k-x5"Na5Lcj<ȧꝁÒ^KeyKo$b--&[Bphc|zuf:\y>\Z,]|2E.Vt'mZ뒤Ass7ɩQY:i@2vJn6Webo0 Dń(ƲK)؍Te*I#E&J* aI[r#;,ǜ@Ǵş7f0iaZ)$w^½y-ɟL] XgLY2EO=k]oWA&x;DL P\^5"-E:-.rn/2wx<2IS T"V_fW1\YfhiaeVvR Z]5?"ukf #PX{'pRߞH`k~8*A4V2'_l}`+\kܱD'Qd3 t'jm2qnVE\i6uL8@$_7׆|;أ_} **0,gYx(B `# b_MI5@<NSp[DW ǐ%ʞ_JGOƓ:[_#dLdډZqth["Y͠i^ #KaY(%⃞1Ѥ2 ̑˞ +vF1>I*@ܪ/C` υK%;㼤W'nO 3 /C>4Pew|1=X$[jdڼT,GRV ~\i11$FPJbp;2zGW(b k~PyD= CuJ3NvOr.=B?ԧrH#⦀v g[ j&k?]Yҭԑ7ݠVCB wrފ#d/gzY _x2}a01uSn56_3aqw"^ 䰶 ";PQ^T"k咥:5곏!UGI۬{1'o7f1%$gax>RI|y1jH%=bU9UٲwN\oLY/DL |-2Sa?x/eGqibRQKw:Ec^m2fup\SD\ɿ:P5?EVeJ7CŧvnAk0yuV#zo Qd{!ν44ۃVAh'Srڟht[1\b0屵&D1dkڥH3}ċ3Yȕgn?6$Ho81{مvcK/~9l%hyY S; > stream xڍP۶-Ӹwwqw@$$܂Cr{Uߘ\s̯Tԙ,̀R 7&6fV~+JJ jW =NsqظxYY쬬|`acPd9TN.6Vn#֜g:@bcn (YO47;ݼ? '+0#tx-4 P2u3@/ n1\3A@uYW_rgQg)dݼ ?M]M=LmMdn S7w{.6Nn̮6G[YH8:8An`4vo&kr ,m@4aĢ qv~;݄ bee@/sk?kx;ta~ `j}o1wl@T7-w賾k ?Op{|Y$Uu?>qqG//'+x4+ t{9]K]@?"7`b5b) Mn?uw{_E5Pm_Kqw^Y7EYm\l*6n/[fo8Z0W.?]#%A;7} @?E `a9X: 1Qnn?E?bzqr{A6 _b/`|/g/`|'b/ `/~?k쮝zxĐ7SԾr ^͂YȌVИӪlԢA=5Kl;_a4;5%X.Uјn5v@K[.KoD|?ȺGAM]OukCLw5owkYyKZG.ub1.{|}6  $`ge%:_QԱ9`aʭfy>5IGڜ4ɮO9q4R %ޤ [\= CQ!޶|y̧Z_TvC{n-nč;j=WxF}C-(U9EZ,n{ތDC܃̡1U[Cq{ٓTMbo%=A8nkەi>S@R5j]kRl,LmLmSWq6bR R6hc^-5=ꖉjfǃPX2uL- GҸ&JWu2!N]pʍ"{_sTAeQ;6UTId S `5td1:!pp`ۂs4Xqj*9daL54蛯b(rUKr`rn`=<0_k(&{&;eYJQ<ɥ_ۨW__]&2o"rœ|h< KEmJm^lY;Eޝ7SM*N[EԌ7k9 YAK2~lKnُg=h KE,]8_ yKP*9dRƴ<<]#itf; -J<veoܲ*O˛q7;fcCp TVIfU>wr)x> )}eSo|?Nj7DzpF&~[eUPl~hy'Qf[(H4/+Oh{:)XLWn:i \?&t8[+=(cPA*x9`CvR+:6j}˯pX5b]MhzۛbyӓaN"ɞO%F.'XsʅY*)qa/P;҉HKѲ I 뫶蘀իKc}a&(稈h9?M}({G;,ƨ-NT(%L4Û"eUQqaROeMҡg"F*þ[N%-N俯EjU}p1,xL  U*v]%]j*X\G+wZ5 YC#48̘Lhؔs%,Ƅޗz7X@fCc_s ۸:k _tg *Na)裀Z(|p*΁bNX 2F2r c/o]pyD >K] rKC=>tD+JQ*ؼR'-Zs{GI)_ +>mK_PG4<Jݙ,xNeYv7$@)GfjZscs(@r`S_d7Lb0* >֮! 08{zcnI#qIV$bce6'K:DK"d߈9uf|pDx%,p3T7EZ95}~CMkt!>K~}*ܐ'[eržbfqOؠ&] ^R Qb^I;hjD`GZBp_O' hmQ9_00K!]; %$Mµ~ZoRa&K8nMR~i'hS[;֋u1ٮ A>vY~WJ*8tHj$ EJ7"^ f(Aܣe>ì\ ?V3{%W.0\c)4.QJ2PM(E_js{`0S4 NCE' A-eXߥ yPDVHT}x0.){|s>#9*CS[/ *:*Fީ_LKm=@K3bݠsA82}SAMELEW"X97K3[(T­k7>Gbxl)lr&^} tq{;uu ۀOi*v9wL2G# 5ck8>#c!n9[|d2MVt фjV{<ԛ`9>]J˸Vܧr8"5l UBDi/\BJ,=ϮaExDJŃDx 2և( S{/ llCX:iy,4]Lrk_23e0l)'\J|NppyIBt]撌f|} Z CP~vSfR@%G6^12_J5!<)X?6tV7!'TuHP8C!㡾%VVɨ JV˫G$-x 3璁$; L4L/΄`7{ D^7^`I6 uN<:"G\pW{ڋzJ8.< 0ʏgeq4J&bSy=Vg_~u1 &`l$Y!,,ܬnL<ՁydU1SҨ!a: jeT_u.nH˫)@QEWdnR*d W ':\+(amc>=^1'q背mD.ڶ+ vj2s|UU΄ݷe^* K:˩)4ƁFmYs0Qud7趄S(38C*`[ʴBۻmb+Ӝ,:9lBu/K䴣mrd}KE)YRm&X#Ġ*۱2he7Ϥ 㗁[rM9(K+4"\)ax/ĭ'#]xuALX)bQ;j)^5Q,Lt}mWL8!<+MZhd_7kvsnfT}ra$ ;!/Z)Ad4m;?"U{R\&]}uG7wa {Y3x$F U\iKlOn,1[j*@O`,K) ELo`=Zvd]Ċ9,B6tm˃vz.ۧΎ1t]~友] U+\$#1~aĢj1-jޚӟ-rSOCՐ/1աJlP߂&t󆒥M~kER(*4&餌9ųU7\lw"/e}p^{~5.h%{<p9Jj< dcT23ۓ ؔ)gR4 vzH)/j׿/ uL6e;+^D*0Fp> `䙼0$9tkHHk'_Jf +maKEm>SWVVc;IeO`ϿJ}Ʉh)!ᣚ ۋbnaГue^IRqQ2 /rzue]*83db%9$ȟͭpB7J9(V*qM<JZhI+32bKo48@ ݂[?<葔}(qEbe(. j[(E -nh}Ң?U$5ۯ1(6xh=/!I_:|Mvb<^#E`h6Q P 7Y}Me;M*ǠEgR+RQR[3&7xXtbn|/f6az H.4I)4F%bL(%.KٱIN E3}7DXu5rVMyvNfq+̋?4 ԡHA/zJMؓUwjzsiEW_\&qRi^]~4: aҢhܲ)aCZOCs|83例pg>C;R閐K7*t_"yQC5 =*ϭ0Fg7-l) V#a \E!y+T'# Jwz>~!y suQAsmEbgqB?, VT]/=?uزMFaWvNUyt3ʓ_օO|Z%sjX꺠f?T9-f R몸:Ю౥=?4~hSbR| 4a G`s_DsЏ3/iDUJӄ>#S)sI]$^4\%(˓CY F|R-_@F۷'2.OY2Ib*)w\s_>ȃ]92^[ğ~ԂSǁhǿZS*N$G](Wh6F0=kA'fx-mt!_vIQWQrL},Z Fg(@gpJ̻cSVI|ڴ8ѷm^kq-3yjXOp(6{Ce1r-צ"aHETEʩQӖ"NÎ vPԕdrd`6a+D۪SxIo/3̱̋6Ȓ/yHx@kMUK8V;cS XWYAs0| ֗r^5n + ]|/t:_u3?1 uO9lr1z'\&:K:ҭJ6hJ!nTÿ;FD2SC爷)CQAL I~$,Q]Cm1"xa}+m5 71׆f#@Er3uI>W꘢u|kr;򍈢o+?1%l귲QaHEY`bƪLѴig CQcKؐdt:]NȨt҉n}fH뛧G s`@gT@qI=6 {—ΙlV|n/.KL@_,h͘,b7K"x4"vY^0x${;orӍjzφRBɜJdX]kod$ZšW[>t گ~&OBGN=Cak+zH>6`%82WȜƷ9toб+a(~)D>7V X9~ֽP '&U~I!lӥGT*8!N)!~) ֮5uzpoOpC^:F}f8I)"ͭmq%T{a-ce"ح=khYyMVJ {sθGcB2u(|\#-77կ+հi! 97[YQwr.L{Pzti ?l~?ڊBH]3E6D\plP?H5uBW{j 6qp}7[X/&` #[Ivw\#52=P5ȥfxtK*bEjr՜;f!!03_w5&AP^!=$RfSK&PA#K7(vN1UÖYM1  dCx#Sĸ8H9(Ùw_Yӫ?&5]$u*y&Mn]`՛6ȓLA.AsWr DKKT`ñFㅇ!3퍋J Bl؉+˳KSO u;:. e]= Ps|݆G;pp=?iͦ)D-JBא.XY]Eؽz73^ }Z8:a_Dz"w͞x]q+! t5dELb{gu D/ DHK]WZHv{ ətat?lɍ4w>ZJ6\skźW:r6L^7PFoٖfe;0,+h9Ɏd!t g)$7UFutGTꞬ|S3#^V,]K03@ZFf2 B%J+u Gop!{-!чP8y5cP'="55 [%ǵ)B)`?)Cͺ{o`TN4^8g+wV{ +|[biL}׼ hἫYF&$Dl uK8;(x#i.TbZ)&ds?G4QG.μ5 4?wkD|C =p~hݽ]oR.E@Teҗw ̕0{9&iKUCn7 ,9GkGλk|@OsIZ8]KucF]ߐkjLZ;eOTM * :1{@1Z;,rwv+]ť[>>0ƫ~[n9v&ypO'sn?i)Qbȳe  ~*Pnw SsJzVl(*~.BG\᪬uRt7AH`(b2.F/VX9S3w v!X>~4ƅ\8xUqeڟ֚bz&b%/9X]=[ע` nvS ${-"z:By[Ѧx0sf+ kHi[0|vA{s b6c2fbzT$ly"3 TBgqwW?d@FLs?[/] Ra6RWA׫㽺+ Ŵw{=S>7- X3'gt65ώds؁_JL<)]^n1z:N9R[gH{lQAfƇgw!pys=)-ͧgU&j]M6AsRD)<׮FTAywhK@-ϓgQ3cP?zb7٢4B@h sY"ÿh @%p@p8NX[ԽǬkS1ذSI;/9,@mx y*7^׶%{)\":dL`\D ;-:+WL㸂5id:ƘbNB^u`n oM] 3vA/c' ax2OEyaGK.6ʕk >K[,N4e#f' a̷ŋb ҿĞcF.ZK =mp%yNK>+"~ X׾A+8Ǝ{zl%=}V&)lך՗sÖmBXW izgvdzM!YkO(i%δU}t 4pi~t|g iӸy͡}QcAxևږWR]+,)o󷇩ؾp \{\L*E¿^d\zK >@l=(Z*`2TP<ɭQO($§ d\Xc=P^aA!U b_ޙ/x6yJa]#GG.[-yޟuYJ./ҺgevhB]1z ws7w;<䯲~| Uʨ22"!CN!T, t e> 7".aBc>HT6pu-wb{%'yՁAtl1va5*~xPyS ‘ ppK{]Z .ͤ|F[yuJWpɊE?(\e| JtORF Z@$5.+.M 7鈗+Qlkli[|t'\.⋸@%KrͻvΖboshJ?w>Ul"y= dzw[4& D^cz"'wz`Ѫ/ E> l)]HL,"_,3)|&(_ FڂSРVH`r<˭G 8\ bחk80;Ps + FxB={(B~WGHKdw =vy|فF~:**B$d+QK&hQv<)ݽ6wWT}h:(Y3خR>OЍ8ttA܇>E.rR'tR#dC [{T32pkhP޾=@]g)HSij<.VI,-P=!]*N:W~g"nw]I_CFY{=:ll:ji Ž/JY';>hK 0zsAɛwXBi4RCUƀ(p0AoYjq օ}<Wz*DH`c-%P .{Ji$КT<-$˅[vאH.b'F_NI |n)˹='{7SUԆz/\M…iɾ=oR3|W{OP ?}}򠸮}d+4`gxbJ{ YOǦp2_糅-UE  9L}]uɣGpt9M3mGجa!=.$zjN6ris[޷Z4lΠeLfiO[01[ o0ɖ^@k; F͕K;I?~Ok. endstream endobj 124 0 obj << /Length1 2470 /Length2 18863 /Length3 0 /Length 20291 /Filter /FlateDecode >> stream xڌP-3;;Agpwwww@ 9|7~_^QZV{TdJL I{;&6fV> ;JJlioq'˛흑[@`cceO)@ korFwt4py+?&t6^^nƿ 'K#; @_..|,,FNBtwK 2 P0 fa] x3X2\LANU9`Yldbbo`diig0%]<\Fvl܌,m:@RT`&y&N.Ζ6%y버-Y:LdfvfE:Y:dfBc3ܼ#ab^MM  pqrz `ji0[!a3ow貾>齭ˢ*/=L&v  d7?`*cgfo]3࿹ߖX&o7} IWܴ?n#[Kvmn}gA+bvDmFKgIK]%);[~ULlvL^緍z8]R cr<Xx]ES_; `awyK;!("7A<wAܬ? "X )qX /E?筞VAzqX7E[=?譂7#?ηAo&A7bk0YL֔7OB?-_7@?op{WU{ 0|歅 EUMտ[+d/=I{f[ۮaޒ&dlXo@NoT fian\Alo Jqx{ [7kpxlcl/7M ,.N[\/6?k޲==- 7=U&Noq aqބ?Ī!NНi Վf:S l ]mvкӍhʗ~m k%g&$G'N8ÓGCDLj">ώ>֐ིT<(JwRCas;ʻ\*bԣ?R#qa"8@ț|%M`@=(`Z܇OG y1>E-*;]V4{b6fkGABjKcztm)Y" gي캇w3b嫢 w#PwC^>,-v}vJ#0<%h|)wÈ*Vs/q{wyv{ٗQsYmz+, gS[|} w qs]ox b(R39G vj;"*+^Ekyыab[!7'\qo[ߔ} +Ԭ<+bb`0WCERIU;)6 `%= X `\}tbO8JmPz88?GEڥ jG~aa-PU7nSZѥ)༷-vԇ0PsdP)}0!TE@,rio%#^*mw|K}wnE-ѹhRMv]:qfsT?&_҅- |i4c@!&ChZ98*ykZ7}cavXpgTIAGm`6g{;c l~N,_9S圤^X#lc:K ˄{i+8Y:ti/ ʃ4\ 20F<;4!IX2'MWRGK<[NE?5Ll02X0GB{"}.]d)jHFh`m[67Q4.[ze &i#3eEUԃ~rlŜTO:@_؉F0ͧŪ)vsLefPA$$:vqT c,n-kY*ddK)O>Y$ů&5(_lf7-2uכœl_ent)Pi؞uWc`Rw!U\87$f@{/xp 6厥q[<7aE>R!ps"ar&u1 LN[8TMo3xMh5G@G̗\0OOy A[fYÌ.09tL^E;_>DG9%`+a鄭OfI*jLSYT7c3JLЯG@bVE8D+"}%ƌ'qkK!=i] wZ-"oMӐJU]Ü8 Ѵmf~)I}ڵk+]|#5U4X|KYK3˸HLL6ζئJY1㣔F?ꤱEYqd/a|N`g8jE m~s%ѺrKek}TNU!a&ʀ &;NJ5R mM^*PeI3D,34^ph ZbT¹Ia*ڶ{93RxEro8u;aGx]:JoDxY&bs0c=,}󍹕N a7a>EOjB 2wGSNIfoMLQVaALmo i۵C\YuvWVuj?S+yvfr#xgqTЊ1=}tP{%}i}͎$d1Qx=!ȸ|ϱӍ~~qPXh1)+:%_7IOK#c6Sg@qT,7Ck?@dJ֭Lw7Wf)A1e݃HXK*&4(]-S¨ EQ9nSHxDa? IJ&ܪ㩵]FW5"2P~<dKz'4pZ9v4*e!q+ B7UJ2=Mȟ}69J,(|6] ˽15(,P2c+N?uJԣh.12*KFO5bN+J,Wmzy; g)ij2ict-)=j|LTt(q17Ś;P9H`DC"Lp4rD/P{HCՀsvA-C霐ɚGa V ag,L|*H?@z&hВG B;a-BYҫPG>KzXnQBКb]fDKsrkfԩ)q1iZBa%;J|իUXy4#BҺ+?ɉUNbPlo>|8o#veŞ`} @Oxϭ#ܨ(lWHxe  mLTA, X3W~x:@0CAC .#w*`Dm'o׀Lԧ'tBhd*'1y8I ^- vR͸B**w6џ 0})y-&hx(swXHi# L#Pn밇ć8>΃ߐj)L'uц.Ʀړޖ'۳l vVCD F G辪֥4}v3v4=`5غdȼ'n <$99D֜n~QX% EDңoj[9pOAQbzDMMppZҝ݁Nʇm(ziw gOJ5WiZIF: . 9~B$1|RLz؇+Ffe٢7*hyb(;i&>e ĔMNS5vM{@"ƍM3}'~0r¼%lpmvyZw،h&W/,m Z3~lq%}l{ f\N7u0ƙZḓLgul3$ WAG$N=x|4$ߒۡ%%HYءTdNEm0űGQ+#WEV ̖4*1xY,fv4,(Ss"'vٗ-򤛵bz ̭+t^Hgćb\ Y|@>[H*B^P_p;WɕbȊ^ߠ_gپrVû)maJ>m(Q6Q)ǵl٘uZn`} l&m0lm~.Ģ+6P=PK%} \, ԐHO`Dτa? p*# >x쾹fG+` 0emB9cn%LQ)͐SRb7A|iFOJtKKsg795C)Խ[ʦ" /yaKF>ۑk8 g:(7Y.}UZ 7jv|.n6]06ImBLlibJ!Cw"Aw*Z@VRS~!oJns[^"먎9b6d@vKB0;ݿic۱yM-Tr6(mb)A,++ܡXyDdj~歒wcR)] 5&%~vauY:s:'H.<*(!)ŕ>׌(AHHJKk} BZnZųsWhw Q؞'$ǯŃvƔ5n'O_x<'o"hD?Dʱrda#F$/W|NJ ꐳk7ߨ]ғt/tGۣR-M2b&&êrx mc0zoU BvW8XY9F]kb{ApI XA+oI( No(WG¾]h/ MVLĪȕ RŴBZTӘsP I)E>t Zɪz @~ӗ?HӞaVSgb# NjTzU~3[< r)^`V.-:>Cr4DG^ 3dYBB(Nb(F>#{5q8 O088n Lն7hyl&(78rZEcb|6N&ӮAWߞzeڌ9gJ΃X+ʉI1՘*j;g3!!ߗ^\?cqu^ |LoUlvV)[KE9jbJ,3Z68/ s り]^R|mee]FƏL,VI6ӵ%Ԅsĩ*P|RPL@?̅5q  ULS}-fX#ia =c0+k6@Io1tpN/#\`@ u6yI5ˏW7OԄ_[X~)dn0x GZqӗ\n5CN]*9u8l4oqpaj0H5I4R)JYX1.› v5Je-F Nib95zj8_yXdB2FB\$t0mP017!'7ȏd$wHCy6@yu"%>pD9X/1m(UCznpEyq^"O'M`gdP3MHRbY)AU|*+vQ0#kLKcRt+^d/Z)Y%ՌChӍ+_D4TQjJT^; e:K w(}Ke=(dD$ܺ&|uROn]ĖE X"Ɓ5@[ZSY3 6\Zbh2~J@ףS:)^V+1B|r0Qߑ^ ejy]cCVSeV3*X HS/&YZqW}ͨY"u7qQ >`Aֲ-X5"_xEqI<,ţ-A~8(aa:'{WO!ޓ@\ uBCd{&yU|!TkwV.㟯Qx`z,c@Hb4[sa-\bGnZux$ eFVk0xv(u~>8m5o'/`Δ]S1\)8\]*@w\@hmRM911 TxN X3kH:zjHV G,/i5B^ͣ` DOzM%c`fz-*蚌 xy@3|$"/"30ϯ؀Q<]>422э8}+bf9\{=L y{9_ρۯ`8jTrnQE8/xVDƦyP )Q5Ÿv?Wya]]]<)y<XC*G+{( AD%ԐMR$A٣"sRd^f7^3#mjV OkSNglؖ jd ͘GyňKQ@npFn6RT `:f`yUЁBOH0w  ,"/[Kص(VR!)Ӹ [uELIcHcdYtMOLn۾1~\^%u;FdzN8 (uj]L&T#ΖhI_)^:8I<hp}-DѤuڏ)ߏlP !k)iD2>(panb٨"^W@$Qy鹱wȧ ķkW[SS& w?^=jU^?b\7],-΅ob` )>\ &$93R:O; 9l$ڞȜX]jt{hSha}K#w`crA'u؍[P+s$J\wn]~2~ݣr\C-rX۹8~-__[ T%"(@[T)L;҉X~Vt&;QMJZLWUVe)6| 7̌9%$=kw `֒"\W)ѧ6 _zZ3ow;gU1fK~AAF=N9㣶BGu*4$W!.@Ot;){^rЇR?`N5RHeG( >ͧ) 0'R@؜oc~Q3d.g2etcVlVŎSrn,;ْv' b( Ջ`O|'R3pp]ijгc+}G󌇍%5n,-ߴ(Du{M}ou$ I87*V \,y;?-#=(GJ"6;y?IT.Mx:-KrTh?5͆]Ҳ[owp >8@庠 IfvfSȺ"&ɈZzkoUN8Ux)6/jܔ99bd5g#;TfRAY1?*X çzA qeKŸ¯B(6Rj=QMOW'{D!JP2CyycN)ws5]BdP}&oj-0i P)nl) FunX6'M.aNt)݅bB_OjȮE6P,X= 0 !ĵn9xw.IR榚iR͡#QmR峙 7e*`@ }=&Xp@>Ɖ617r+^V_uXN}E˂Q=U}$_15=81k.JC%g3k"v؛IQ`Q0a˷~1~ %7w  ]RFRNҁRrjV0ߜboeԐ=cBQcERߗ8pMbG5lCfUZ8;><K%ۏbFJlΝ`CaЅL"f+7d]GԊ(Jo"cb:q8ڝ-˔c ~?W ^؞j캕1zn~T_f ~ B Uֺ\e{, ݜV[e+܅ CzATJGϽ84j>L=+@d:#@{155ȡ΁W ;RaepFU\:*G[UJ(f#EmF,<yWmaIOTu{} wV = -{-E1zg0O{rϩK倲B!N=5` ?yvD; i8v,K=GisoTzO1^c}Wjk;O̤O齣)% Y!P|O#}V{ kdw P}3'B7٥s,`rrV?kN`\M_q ."wu f> suT'wEǴqaA0oX,>.f4[Ǥ\X>}1t2kSߘȄcW>_+WGq>Kb` /s_-S3jpnzuڛ/,zz%hC~ڧ<}K0 %U_;1#Bh UVy^FLx7ȖT:IX_aeq?o(|OPIZܫsqjL}zL 6KMS%=&\䣮*5Nhu:>d5Qo {9ݼx+0Q&$V ?4ί#c GڱM 4\03'8ե+L6hσESDG"[`KluJ 2wB+:3ͲܗDpFe+>}K O߻|uZ- ]虃R6N!,PTix\J c`tǛ' t [.12?iӋl$JsAjDf]mYՄib Dkm ,ȽII1`TGMMW?6XO0hj.f۸Ldm/WLȞkkڏ |y/CM9;Dg㓘mlRۖ_ro*ܡ]ͧU]Z = ʂI)s_((0x\ q陟o1{>r=jw/G%*ߪ _n gS律-߇Oſ=1|,ab-wԤ3$eR rkK̑ө0F""s.ܻcDܺBG#z/7\nQ2,&)XIo&,Sϧ^_~n[7u^ @j >Yu$XNѣ 0|d6N7"[')4Ykc= %ű=HgD==(eqL&!W &yg54m)"ìWKw~T+Q׵9dRFiz}KZjsq㇞W^U *l&p?GpBHS%p/6xά=6D{$r)CW`cPat9RSθVklEdC czD@6m w1%wIRCBu9؄NC}a@)Q wsUD.֦F"GUqT(6"P;%3>BHj6fUɨԙ m E\vGQ;A56geV;t*-A4o+%GoOc +(ֶfig9H\]iŘ?n18,reJtn]k K?I 瞙dmz,ҝ(һ^ l7.w[m莠Ǣvؽa>"9ГPOPVvBue$2ˇ$?H%-2 d?%h63U}A6+-R;$>Dwˆ%"~,gD^f%:^f-R1Nw !?ގ!;AndGR)~9 {ܭ̓2 3:ŋ  OvNg^"lYχzxV:w8PbxQ'u)Bl؉#:{kr#J(,!߇`E2ހA`ҤhJk{ֻV A)^TU@38&x ӡuġǥeh{$^F ЬH$D%C)*kAѰ-~cfq5Q<ma60t~4l*Py̠k3Ի!fǮ6yv֟3_haAJr&fb 2Qw~ {-nP!0#ćjBYaS38YU/5涶JrGh5SL"FAK0{"Sˬn}nGu\| ĎQ#w_&fnZG Kew{" K8YcZ@FA©?>27*F4;XBW: Xuzse-4ܻS*|fԞ]wc3D-RNDCzz2$W1T06g8F:7IAgUTimIre-Oލ2uF_y[ NM_L sq?ƴtwjXh9bCbIDw\''. ;`w~RyUy Q `)~``Wǘ͒ nE)臽j]jx}(!k랼'CIfḼ,:%Ivnn.詾Y|i 5,$rxx˝L`2Uܵ0"9X2o"㗘4~ qڬzflmC0؊BوYP9RXm*W>!/8ޜd'|ӌ>{v%ģf&_S hL=Ei2E:[ +}!r!"vDx0=lE0}ѤQU5O573rO:G?9^U9} [? pt'E4g4#Q!rcK/@[EIBG{^ B„OXFBkiܵJNdI Ti kh2~l% /%Ыϖo޹[7-r͙)ϪrrK2RulonqpUT-|•D#W@ED85tt-lSlW (z<v pBr[GyxkβHR/FqguI)nU3$>d唣*5NzmOemʲ_osn+^; JƧg8V8C܋`.qXvN r Ldث1_VLih~&s <`2̮gxv@aâ%k6!6PqYzSגŁ|[$F2~r-J*^F 1\""76p̻zOA a=G,#؝BģoX V bQ{OUrTܸSG]0yj!lb[\u4FJQ6:Qc cA ~ݹBEoWoK8?]P/\|W\^06d2e~( gטH$kCvN_)A ]OW[ؗɳg"qB_d!NWN'uaPH3 QM+ ĭ7I%dDF8C#4TWf;YҾA Sl4q9[Y,?Q1&M{hrj_BL/z%yW"7 6nf"Ω>I[Z|-^ߚA& ,( rO2k $7 )7e~B{uiȜNͶ*\mϣ D.ۮRTN]X>:V6f$Ip]´jm,d'DrUzNٶU+'xT;3+;N0[4yTa얀3F V.cRdUy1 DU$*7இ*|ZyU;|$dZ皾/xp#f (֚֐-.uݖѓʹ`q<0y!3NvsSģD+BIB RI[A43wFkp}Mc}zV Йӆ0u}G2T*5q[L/+^߁}pVd'1 ~2>Xe-}.#;N.7?򺖽wOKTRQ8ŗtͥ8?ѣIR DKSqlI@IFf B) dړ< De;Op%^ȟWڕ|W͆1 =aNp&8o",F]2@0"1`G3$På0ЧSub&DzGኍ#V7=gf|W@ԥK-ކi"]6N8ߚZ ylչRO<2LMKtChF}6K;/d0C7=]UN)~i! ͜c0dAML: ;orf_*Q ]6H^>%>&,`Izrhא ]@y+͟ CSEWC gbRES+[{~W@VO,4A@i&##$.޼8wY$ 53>]S@9[D"yzysP»r!T<+&'3*"gwR$Bl@a>`si26ZW@L(ƏUOiv܀}3d8@Șh!]}G=oˇл4O):"fЧN}/lMVrƓ%Fyͮs7ޔ"AR@-H+ eΕq >4??2 g:ۖǵjHA9M /dD> stream xڍT[-C 8XpN@#ݸ !=y$ܙ[Vvթ:gZEEfAYY E5v rk@mN?`S'Oȹ9oy@/"̑ i 1(`P:bi̿ F;p2MvO+Lm0_)XMXaŒ7@ vt~7 P2+:=@ ]ff<l! 0)jv<-PU(ۃ"0;+;'ٛB= PK PV`uvwfBMm`O񦮦[S'ŸMbӧn wvbunw]KPg'IBm`dm075݄=&dBf vp@>nvYNadm~fxj?{9Ύ.`t7BggC@3%O'3/tw>I{Ͽ ezCslz2>qq; qqx>EwBe0_>ҿ v FR= `G@n YB;M[7mjY'+žTm_36WiĠF4lqY%욿 o ;?<NO? /)O:IH/Q40 s~ <9>Q^ M/`q4xl >߈Il6Oi>|JldW Gģ̌Ms̀`, $l]rS)FƲ=*4ErsF.M)KEG/aM jㄽcb5=Y4Dwl8b߸u˸~VFt%F3 h>,sř ;^/*>18bog/G`zTUj-;8uh퇧tD-ZԎv{P*9,iw}3r$7QF1|}LU>_2O'+o..ʔ{żo*4A 7w wj|p?;ԣk_g[.$ d#Z&e,Y Ba*eyx6Y{>+hgY%x]J=.5'2^t+}ôY+VGb9J'S՟YFrcK٪r4p)YbHU{&M;rl*x,){ޤFK/.=er-Ew?KV]ݾurKzKħ88IP*}Yѳ.hQjc>!XC Lk-B.b+į$بϋ7ٔ~쓱|)r@QLw8M^fEA.8ouk#?ۯ5p0ބP@A3Tm2$!MhV1֘/@*Qd 'fouF%Ȉ^ca'h~_VѵL}==jyq[ʃI*lǚY}*r)E%qM{W:}1;,yl5_/)&CKzg[kY?-m`xJg .8%m#Z{v=#->>m dFjFbLI iŸ?-5'$,xYk0e^+}2Ӆ!I{ū#GBHiQp7W./5%#WRfFz~tN۵eU:RXc yӪ,BF#W{P+ dtm% ?lgPi峷QlɶWe?GZ 4kֺDBE Š$ k~tS7wY%'"O|1 ؅Vܷk$h#$͒r+ zf5~2D/Czt{7p{1=Pߴ"򏃩nPlYN% \:B_˼Ch64]7ҳ9 |7V_ ^!3%iéop\۳KX&l8 %1ICJ6͏.|K9~ee\/WY._tF`&E+Z3Mل=x_Yʒ0GAa{\]mS46C#߅ I121$/[ 2ͪ/Ýd#|g=fq@}MN ZaVG˾MkvD3*&J bHp_c=>u cSLnAhXÒ4f@[u:l7:$Ҳt6i:KRs٤!nƺIT J{YDINrͨ!q<HW '?^FuC9[TgjOGO$.(tE뷕Yɧ%s1(tS'G%g}!f&[k7MVe;x~Jqܘ2︬]e A oK ު}yҧr>|uu?wY\GݥRv zPdq#5fK16Ky?:W,# pjU0g^g? ȯYHU]jB_eǹKhrl_F&$G~OuUMLc3e`lI2T(pxXCy~e;x(3Ho )NE)dto8_$*$yiƴY.>)H|K|V%|)xYOww4*#R1F{TUoN\MׇA7Lq](@#u'^zv;ipK_|#S%$Į4Tobxnw"L[jϐ4#-ЯSfk'؇ygDhbzʼn ]Jd6ke:hMW"kC m$,Fe'YPEDjؖdHu:#2ԩN~C7]Qva1vx mFGʻgHSN}@rbeQE(9KMܑg1bQC!ۧ;͍ud|53۶^x1"ޛb\@`esIZF';t͗H&5?sLqf+${MԹݥ>%ϲ dV8/^zTx0FןqżixZC,d^4AP!M-?Rl5kE I8MMb?774-}J6IO\(?B\o;WESI;hlѡ6xO؃6~b.<ظ(Gk6g8WK+L.(4G%_Hbӌ.:1LV! WM J wqtR{'QL^]GWA~}ܧE[!\J@6{HmQ?`M&ѳ㛜7 PB㮤5BjuvD-k8#*|ҡqN;G. !Y e%[gxq~b%8QdhQOY`P&O͸"~NZ;{ۮlnBtJ8!2<'?:/8+u3JENf'ߐ&Qua;|47[VGN/B.7K<ԡuMI"Sogj'*.r#S'YK _K"#1_gByU+x=T;GN췐1z]i!WD3oQ#'&fPڟ?S9zDTw >KҮLOB VkX_ n;8a!>8fyM(rm?Gc>3>I*fXdAVIn}D 㷟.R./C+m& *pcPv6ɦL8^+mãX mo{jJBs0v>㮴^w姷/%#1>T)QmHAX }&HZz|* *uPIEbv+NKєmP` t$oZd{iuDza}N~E6@@v7SёM8RLoɤ LXkvJke>jZE+!HFZDhY Ț;.H\ l#dH >ie5 T0fx̖/> pTNJUGk_2Rq M6$tskCjCeȶZ;bĬW3CD$IS4pChW dx]A2Җ<[6u "p$.80/$kIXo?'퉺Āt vOwNcWs->s,z(=83$h/-1Pa.l/h5=0禼 X Ȍ|3LI|fʃaCP,\5Mo |ϵv׏g>dsmL\AޫjǸ)Kg&m^hRVw' DIJL_e_UI{2"_q*_B==)[`gjV_`ѐh 8cP0Ate90(Y%Yꢇh0U8t%eԅ;1lz}3y YL0_kZ֝3n摄uvX4^LP?3Y\]+yxÒ=?3wx/bNj녥lF8&9Τ*lEHkcM"Ȼ fB:%CdG~۞EwWH/@zuz]?I ho; OKbVhJ&|@+kWRAؐ`kఠTZBՌUAR,藬^G.:, :5[4ўɚq/jy^`VH!u耻l|E)a;"XN?CG  8ҭ[ܩMC1U񬘩l)t"IUe ?Bqk,݅Rk DCvKop-Su[1_>0%&5ΪLj1ςXhAgQ-G}1_%7!w~G3xIdnݼjRu` z:k̏hDž<rMÇ\ZmtRؒ 9@0Ix6 Y/!3;b#:P{IMIMSv1 Cۺ|*{3vG 2E%.P;hDS4ŋ9A QN~X MBF+u/UHW:Y7m_2N-^׷5Ơ~N{j7XHl[%~bu7??C) 0S+D {ctָ ǯ]_ Ƚ[b< %4D|M^㰔s>_hN4%yeqk|x%9jܛd0+FU,?U;n_ rw]2p? >;yz]~j endstream endobj 128 0 obj << /Length1 1357 /Length2 5946 /Length3 0 /Length 6879 /Filter /FlateDecode >> stream xڍVT۲I HG~)JOBޫT)B PHQ MQK'"MJQ HE=w{kV|3g|^>oj!qA`8ID 46W )D$,ly#XAX?$pM,#ڴ`81 {P*UP@iD_ @R kb|Hw-(UTTX$a8x" X`H.)Dxp>J`p`` 'JH`C`v 1)0`caX@4x#1ij }#菃P)+;cP>0t0!U#)\N]9¼0xX s!:.訛0bu"}p~R~H_!^6UB!8?ЯXxcBc?k7$W >`+4rDA |D+e7e&naH7 ?w (pEq hF'E!DAȯϿWDnb.X@Hw440A^RZP4@\3) Wcn@O[WM_/ae!2Mp{Ni;c,oߨ/0;/Wj#Wc+>FԀ:ߗA!\M8[70!=($*#7 Gj_꒖`X,,D1q'D"~3K18b@l/ p`A)/#X,QVO<_F p~˛*y%J'M Tiϳfi=LEv&bRC͇AoWhx%-ՖB}CEzד_b0g "M[4[z.oH{T^U}dpQNJ$V0K)A8(lL!nVhȧ~\B\v|;,.5V 8>K Fe>8膏(\ F&_zM~~}Z m]/ZB7b2ұD 2#NN _KK' {0<ϭs1 {{2_e_w+| ߌ^U8 :#--pYږ2cU#ѸH8Wᢐpr,spp^-Q:Ly5p͖%'ՈNzRЪEq))飷Y[ȋhxu/%9߱{V޾gBO.֧VMyJ9uњiNH>~[ҥ y\iƈ< +PvQ)ݵVWrg6r+Q j-ZO mSuѦ= EaNB_kŌ5ಳp [. j-j2ٿry?g3畦1Y"s6|4~qjhiY!}SU,)+ׂڃkjӯGXf ="6O*{OVTbjL¸4LAیyy>HJʙs<;ߍDyfV5~`lsVUʫ)"Ž%M`kuu܏'t}ZGm6p5pQa5+ t4BmIw?57>pܘEa8㗺 vnYںM~:YW9OFU&5ZV(S7 ;~Ig,H!,B{=X@ 6_XPUmKog~|J2/:H{}{R \Ń(q^D:2wQ97K.VSU+(kMzVؙ<1  lP=!f!*7B6G qaQ<:Y] yO+QW9z\≀v%F]%f8& O:d 6M5=S'u E[!.òi6s>-p;bW.c<-rHrB*lsH:'n9ŗj>Űmܽp-$+!{ϷLsrvJ.j#ɽ]џ򹜑_.A[h*YH^ęう8vD# <+s-1{S%ޟt#PՔgWQO"Ǭ$hȘu=9U}Nc ;eMZ=d2[剦ܮ)j+(ȨfoG]nqJYތ$? )/(\c#/}H^VD_TnQϭgeW>h|gjƭILdfDHY3e Le-9SKs$ \UX ٫;>}O43uF})b t]aTnHpi/mC7)Ӟ `N;xubȃ]e^S׿2o={M5nC6ژyZ=Wo1WGF[1ϧ  c4M*be>ހFˢ\Fa#;A(T9e1^zmKeKrוu5#_ 0o=@qe,BvrPSʕe:Y(sMgeB \k>4su_f&Ukz9 ;Z\oipTlw^-]Y廦Z$-}l,q9+m̐x|Y(Q=˳sVzm2wAM2kMƈGm\M+ԫ/=Ż滺SRo-9 61^+ Fv0xz`t9 R]i^rf Vy\S G"-c&f:ƁG +2{R:N|6y:a5ɘUFC.Q.Hn`{{> -QMPTڪ7t0 >3Z4rƾF68JPSDxO_)Py7a)jN6v'"ldhz!ծ/l[:G&ԪlhFG>A*^M;ժ 7ZCHщk]1]z:҆4~z_w&n0!-(",adg#Llm' [qto_7/NNsUaj{[F>ʰ~,jn(WWX"&^ॠNadΓb\d\.4Itzy4p'-̉pus&k@) ^$}kK"/ NEBc}~ӗ^ӈ/|OOC>PîuԸ_CpT+F2 )Em9Qq(>Χ։'uHyg<'R q?K947-D.rZGf5f5#ǵzW ҂1Zbk-* ҮfnZURCyz.,vj Oj2+ӖZwWQ`g?Lf12Χ}Q5Ѵc%\&~tU-7cKKUA:_wզjuuxK 1V[/1"kMSɁO]1{CwJwa'%oM-kٜq+DQ}*EF_O{ǎ.F0 ^|R-hxv#Ua عyFbgCRn!!%VXpK}>n)-)``uGܟ{vaIc̐Kȑ.!cuQ%[2HytI) M *kO?mfRtV &:wFR2VGL6za˴48S]e'''MJnfzBesc.7)$]c@q+)/sBcE&B.>}jX@{KtV.v}${P7mTeK=>iOb0Ib21"1M;0bI<:7tg9%f.Ht[ lz+G3iv_Y = ݔq3EKe f]Z4}F6+5Gh7L VNr+*PZŸ4ҦC8u}}y4+3кx9.p9s>ǩ>۔2wN'(tw |cꂝI$eW5.0)<ۅ"mxҵ &6 N*Q i>+ù;8 X)|8j~I9)É>%w|TwﲿU ǖ! &jHЅ/`^wعbԇHxpWu@gw7U5շ\\"F +-8ku >;o3{|2~)h~?_G1dMj}gVVeiv0!<,/qNCLudSV6bb^d;fTrÐƌ䔀S=rS)A]Jat'@jY5v?YaY+S%cNҽ՞eW;Z?$,ZL<M3(2Ŕ[3ti5 [>3Jh2̝W\֫Q6ZRlA=G'[S. f"X+ʝ$@"_}$ gswVh7oUݶT`rZLBIi5b<1 BƳMCݴ%DT٬،4C|ޖsKuntd“مW#5,ݧ+o1D4pĔ:}i05j0ugMi8o50]n,gS z2޵?٬P?p XXϳ[&F\857Yw<)>gWBu4 gS,"8AV+BÊ);AŖ$|?ɽ+V%V~bCSE"^Ε/jQJ{ Թ>yXVUȭh;dtW?.$AKY?xɁŤVq^_~<7AV/=U"Jc3rB{7`B{p?CkGW7IsO gŋ {sM> `Sqf]sUE'ZxS o<`9jޏ1fޡPvySO\X4d{!"D]#MR6grh0A ɢvl( 8`Oe V}oJM}oDksKOQ2N1Wx]Rdg`\30@B@QMl/:oW1 endstream endobj 130 0 obj << /Length1 1357 /Length2 5943 /Length3 0 /Length 6878 /Filter /FlateDecode >> stream xڍTT]sI``[DR.iw޵];g}>y!REm 0!H&pEB۔@(6pP\JP $((/G8B pIȦwF@QSpr⼿.`hP` (n # *% rAx##`hU: $!0Z48\fƷb0meh%Y18Elbg⤣TYjTKr)bISɫхW[w8ռhAIo~K NG{{hD w=XfBn@{tj W^EʍV:ޡXSu"CSL@`^k*.U U&=_:Y GHr|NmGr-EKqM#ZV k Nl*.EYgj{M2d~E~aD >NAu-pAT &"b8.fSo/lx2yšq4AWHXb. TW}jb/6T8Shf>q.@|S݋z\‘լVqI+wʓ#GFPToG[Ls*6ҧd~Wi6{!t᭟.Mʂ5V$&ÛpiWƄ}y岄[,=y"cIp]!F.ڑzBPCV&7"7ke sM.@iX2:[HRg1"%<\S.5a„t`!P5[Qm5V'ټua*^eK[ǁ3j.;Ʌ(+,M1Tjz!نa齙5l`h:tqLC*⭱l1{'Ǒv16;[\Z8w.UkPJ9QjH4j僝SV߾cL/2H" t6&6VJ8ЩOo)&.2ta ? =Vj~>3J*ȩ2p7;ց\9rYrz:GOvU,'g# (T?{f{@Lgj%D y;j>.eHW88)+5 n& d&bŲ+~hJɀ+4"71 ^jg7 u5Y-cJ޼i}>= d5 ѫ@w= "ۍ2k}aa-/fj 6Fcc z4+"j/i|7֒B_pR+hG0dB[Ȑtm2 VbZjZRfwi%iǥ˘_zi5FGߵ iJI)9_*7Qw7!W~ٓ~BDyLM pd ͰvuyCk)zf#EZnF.Ne6]R9+]&(!_JIVv9u>T9qlKY˻XWd)K_3m=WsKރFW;u4̮SrV]'u,&8yFV{|yβ1?gL$HrM+8oƻ.Z:wI~- - ~ !Wvct5ǺV\=bB(c2xc=\JJ{!Q)J4{Ȱ:f,/ Z*.|f  huW*:Dpv>8?*ul"yV_ݞ& +>&mNc7:wL25&. W :TvͻaSSSw`}h/7p"J69cy ű939*ڈJu`xu,hrwwВ#pGmto{4;.R ihBfHPɁ-׻ls 2^jv)atgLǓHfܘ8@;RJZ^6rR`wX0IL2쾺=*_kת옕a1ݚ\`~t0\&8HikGG4Kz(c5IeSŎ(RUx P9nFW`. z4t$:3CՃ$?K1VD =u.n."iC  fS/qwQeTnx9RVv@l>jR#3~~d\eɥK6dËpu &]GUK[$|9 Q2FW[sd1Fb=)Mj stK5w{7j"n^x~c$ 8#5[ɺ ?hS3,>[[ b*v^ɇp3}03}?"ƾFZ[agY;".D͓-(Dז %56;  ]5!'lwY_ A!Y]y%2YA"<$n=YD3Qcf<䃶: ˄/mqT}~ϗaĎhtZ*2zN]^gCț1k'&>߬Vߨ~/-w\]/&0uX\-^>mޱQ"tm{i떥TϫQ\L܎L~rbP Wn`;N .Ny3?=^Y\- lQ(-3Tз,w7EJZ~ߖМkn;UL2h[[;>_άHگ#2 Ň5S=&'3uxe21jI`,9!H59;}rP`ŰWH*'G[5xc+i>ޛy>#bOpR\ ~K{jCܭ1q'H e zPv{*32SxXVu7q$#et#kxϧrxnsN}H;mz3zODwd1Ŭ&/ W3&' N.(NIT:bT[?xI<;uw²M{z 5W0?p[wLQ[ #WĿp@3I4slDp^`*Wy´w9e=IDlJt5kz= N)*R5 8}<i\'bDPo٣=XU$Q&`(FjSx<XcZ* P׈哇VwrB( 0O)mpXMRzJ.Qݪ1_ÄYtE Ŗz&c]z&?#ۄ0# btgmɇl6eǜ_Ƽُs6S(m ],GW&?0~gacok1k3W ^j)fV#c5]z1'?EQcs xmU'ׇ!7Tt.uݾJO`'gAyqzwRq_gGS`YLwv@*Y 7b5==&ge?tƵ& h]eVt@vWWgcpY"l0hٔ}f۰>L%!~* 5*n\J?{[r}}5%-QT6 {qiPQCR鋙NK඄U$kONv?Kfzb7?6cWД  PN.-)Hs3$aTEM7dGz+tEج'p#)<̐GC/rhp Y'vLJ"ˣ37wY"0ץnsIV^#`)J.`}|.2[a;WM{;BGP?XT5/*jPgI +?'_|3.v_Qh̾e^. Ni"7~&Uov-QBtMk8U[!BeWtrC:(鐘SsGomyJ5{3T:Q>]u>Ag>9NI쵷Qx_tח[ 0ݦh(t&x7!CHzR攕u]8@} 9Xu haҋy(,FQb;>q*.i]:}G:̢_pܭ$BߕzE|rc[gU̶=iTұe\  .|T#"fphh]Jɒ v{#+r&1-3"(i aN/J){g9enُnECjD~iժTP4?IO _^~%ј=&c0(DtaLM5^ x6G-i`x F&x "np5lgobjk郷 ] KJڨBOjuYj/'VjxC]#! aFǙr?6ы4n)?>)6Ө{99.Pu:ŨJ0gYx懍 *:siӹ9Acrΐ΢r3SJww?Ms:J;zeٵuz]njbxgX˿Vl7}*UfA $Eu*۞ [4hNOnL.\.VH6\6u1sа]y|= QT 8̊|ە9)g endstream endobj 132 0 obj << /Length1 2371 /Length2 14887 /Length3 0 /Length 16281 /Filter /FlateDecode >> stream xڍeTw[ZCp$ ݆~ZEss- Ea1H֙ *" `ffcdffPpS,ly:dbFoT9;[5 `ef/Α fj1dlANvfo@mB` lr019l"YTL,@=/ = r9ـ-jnJxX[lތ\l G[|,@dY=?0?9 `ja (H2:;l\,'oV L-읝,/7o؀lOdyGlekfZM*bϤfkM[frp033s 3D/[>^vӷR@>^NF O"x` 2M 2m;@m YMmπvIXDNR^ߢUعX llN.'')Y'?LmM<֨E9/y.3kcoN.3K1l,=y[a gv(l/U)-\lVXۚ6#;?b ' wP5Gױ)9YuXX]'No v73 0rt4g~[*Vg B#_x[D $1?F&߈$/f0)Fl&߈T޼hxLF"7FNopMy30E2v42YLsGNk ?|9&"&vos7E$66kL?[Hf\vc6+k#?l 7aj _j;? (fz@R25[=A0dYXj5[o[(VbMd;Coۓe?3bg'=i:doGo;o7oqpsI![~{xS:ݿoa'v29;[]nv|kKnX{.,L\zvZ@ Y;`n ;?z9n^]c!X_s) @ApYt2 cCHE36|E<?gKIt 1 uJRyE! :jGxOTYX ?KÃKAWz{e`XLw=6B-Fu'lt$s1V9oh7yG.őyT{od!}D\%I̞_K(ٻ M"[™K*?9%E} }b!'XacfR!m-Ǹ7 ; pZO3ɃC2{h' zw b=St NƩ3G?n̾P`i3rOޢZ(5t>ڭm`K(;]@p>%C&AFŴoUe9:9E쟒i{A%P`VO'{? \4y\y8@ J69Ƭ_y2VH ICOw|)sncdu"x }EI:n̥h<eL뙡ka8{tmg:`xIlJ!uIs%]& |yqt~ѮK5)1}c5y <-34C%~$Ny:kOtLNu (he#DI+ ّdYlSe1'r} r(۟!18z8*clT(Bmhk|͆x-"S &Sհgݸ箷4O2JU2i-?26f|>1 .m8]DH\ĕ}r5drT{uaZa>SU"ۘgq{^c@VozH"v,E=5M:<Ă֌k&1rfSNGhb}rmlڷ G+;!qGō^t t+S$V㷿ǣH -:oW*f+^T.Gά蠱2XV*ڢn>L+i9#A &rqk%@3 #]D *3D#~rhR.w%Ěq59V%hMpҨ1Aގw1hw*Xb\G`ԙ->(*]^ˍ#dhvu@@xe)- Np#j<и vhE<|#۟$8qTܽn=J1m~ՑJ qXTw~:$ z84"c(}6=jChwW^+j5ԆS|ݟFONt<>KAR tjRBoĕmlDF}qNXr~2qAHN/O@P rˀpٮ; ȣZޖ^:[29?ȁN|p戉Hx`NWbŋZbeٵ@*Kpҡa_H.hG"INS]Qai T֏'fpHP.lCaj3׏ЪGdh>:%}wZPlF eVk99 "?cѫ;H?Ά$鱹S)ĩUAB6ӑr!u_ 1*~;&륂R0cy-Ҍ,Nv "Dy.5LQ PV68阳>KR3CnWGx1p_GW.[ /)[\,k[seuVpFjjIdc %L$X7)ńe\i]M);{erxUɠ 8,uK_avIX bxQ6xitͽiO|A.ǑsbH\e82/8K NP}Þn~)Z/򕙶 @Z=rW?O6Ҡah"r FzEzBqn|-E tPe}W96UMĎkc "f:q2`ҳplu+KV2LAxP7{cӦvT/GI]ȓX7,.{F\׆|S=tLxw tΦ&:2h׹r#'@~vɨXK$kqtS:lBm:O2Hk'fXAUB퐭\ 3OM)HP# ~imk(䬽ҭ}[•z_6y2D, Հm{#v+_jWA8M]Qgc>) \ƒ=Ζ챨ˌeϾ/3S=}VeZ–Cx_rX:z K׎IQ0XNI5}\,(Ƅ 81 k*򼥘''A#4wAK (/Òj` LL8ɩdiD-_jr(i8Ap%H,55iu)vVʨB^k*xl\eIHH# ~%rt1*3|qpⶓ:ٌ Nc=dy([8#ˀ+\oɏJ׿ +^'aP9vfmyda+#~ i]7;!F\ f@jlN# a }["נЅͳm@lMx"Tb0RՁ1BHu7Zh6^DM0/n<. D@j?r~]V))0ucDt9r5s)UyҦҝؤ4礢VZk< U~ : .r(s;anCrr=R 3K8QB` ⶘dgm]y-EBtJ7UdűAvQ'$+E9{^$b`],h?3<̅)l{8Aa_PfV.U# NGq͌ *UfEo/!!vyo% km8kFN~E vDgųy$/ڌwl!ٍOSPronҼk-"6b}?؃)9HvO  CS/6ƶ>P!^\' Q KW{.r32U$WZd= Dcr.]M~dػls..P=HKQ&*h\NPba^-7xw˕7B 5 ]m3Qdk%$hU^O<x Sϧ쒫Ж;s;VH[c|?6 P_WE,% M9U(J"6!o 9A+: fŲ]k& >FX| (隿 ٌOq<1:Z256^-94M=2t=8YEۄn ݑ'6+{ ~,\ON 77"Mch{]绠2dNUS{ "+"iIw )\/uc|Lɳ%L^eiiX=){blg4pNj Pz17tX-Z U%( nuܓO+*f+G"_G-^cKW=Kĸ]/T(6P+]PED.&\{5ݘʴT-4%śL &Z¥W;1&~OL@V>{:a5A-yfUY5EhB|1mNXv=LvH.T ;ǭ6"x̪Dُ`4sȇ$W=QqFckˊOHWPk90 预@3ȳǡIdؐ*~ mGeX!@F[O@vD#J|f fڥuK k_XS1xzYN5r3!$T}V&Prb% H+:¡1*DȽ ~s;(ʎ?!$dsidjnCo,Z3KZ=H@3'>mBt툟'V͛"W+/8_ėNb,(Dm5+WA<ǺW50p]XӜ4K̓_6.W?t5@tQY}@u`vj8|N`۱Q{vH#TM Y$ ^u/[u“_?t N%w_p3]4oPԽ5o*n'J;# 7BUV V$P̄RC)e*Մ_4nl&ʼn}uh3UCQK_K|p`oQ]8sN,pu>[\(,rKYwţ4tt E[SlK̂5rKeP쌑,}/f@)=5@jq #T$ =gk|ULPsH!ސ+hZƋ/RdP_Y:|0j)+#ntO;v{k.#,x9S{Uwm'&@B+eOwzGGI5''x&:|lbnrq4%8ѸYXQ;k_2m8}G#u# {,|MD0CFhH8<'}y[|o%ʣ@f9 mFEݶ/MP&pmͱ/ 7rJ"':ji0ϐJHu9E9m\6'IObDuf{5| f<nvxI[6JlY½p"*mP H *y?锛]ec?m-Wto6޼ 15#2C%О8ҷd.?X1g=GTh0v1`mo,{u *]W'ZlwЩi9SbJ` V%@n$UTe)Tگ r!oCH^ fI]X1 4iP hoݹQ@"ra4:<dnwqUCe05)-Msp"Yq]d1-x^ԫDZ^9z7e[$KABOT}^RQ4L+8&>MAP )԰fN}O!p |\gyG~|TNF^b.鉮|0ǭ$.ў[)8UtD [՛V6R1ǝ\ؠp eTDQ",(bkD<1Bg*ΜF1 25/)'*2aKp:(Yܥa+Q5<:mpv-NЃzV= |Gvg ~e`YT3Hq(_ 4ޡxP ף2o/Ƞ29| +8: k5F°&U /|,u+ # ˜!!aBIIh8}[,+[%3QG\i2*SO,S"^'u8^pEngUE1fpVFT KVln6 o5?E~q1fAC={bIbē؄#M}`49H#e(t?X6sT> Γr?qt'Q%UPߏʺI ۡNh^ט*9妦bkw0h~Fs[㧒TGSdzhĔ"dI{XtWl˜h\Dmı(E[hp(T)+)70՘' ihp6zհR8~QdP~bX8xrG᳞9K=w003w󸢈"C~t cZU8 fVɈepF %_mpb 'qQ*ۊAy T]vs5>?xkIRYLWE^ T7>L p6v[Z4yxDk^&k$'Lr~[~K {=甫F=^[Q(̶ԂM V!xSeVk[Wɝ1_!g/S/[le8Թ`j8 ݊&'(Muqvw o3l)]YE\ *b\[Jz&%Wygzn/]֠S3$~GӐD{r`MHѯ,9~,Eu"OЎLB;1ޓ{ჺtdm"O *Lꔃ"As@ Y K%rG_aq/3Ea|T$%qPl2V}:拂 ?Q0lRQ][?jеx ]cMPcĈ}bάiKWӸpt؜FaP N4/KK.m nmIP;wmLA4a"W)B},íyΜs OT/[.SxپA 7Z`qU/q"lPv`߯' b3GBvfOe,\knnI#JᶷW@bc(Duo?a7DH[M&3gJ9F+ LR\kcԛQ8Ei*^㻜S{C ,KŢʏ"[Hl?t4H&R:~CP;MX;Te}RFX$ -dhgHv?RNy+b1ҦGwmڧӓP@* x C+7 GU<˝;u\[cY[Gu,YYskވ7R"~̳qxN1}#dTenU,gєE ;vxE*'xq5c X{a0?,vdV޲?JJ396S\wl_ Zټj2 ]1":=GQwUP NOG[$w*vi=-3ĂF,(ap{''6x[ǪJv_A1tWP MА6ɍו ?))<<!Ĉc8* q a"A*]ͣvKxIM175#\ EbҒ6OJ2Nk# dzB 6nQiTrć̞-9YK}dmgEujw*>L-&"_>T6G̢dT7jp3YM6p|" L|Vcv:NZi.%o4-}ޯiHKOs`VPMk\Hs*cL/gwry3тD5R':I/_to|6-}!=R'!%O<\{g| &f)ݕm<@k/kveJRK]Cdɪd+ULwi|ݛeϞ:CuI 5"[Y)R=}>2}]Me![ZSVo'6qt5S_*k,#ɖ`ޡ5PpR{?"785^7uPZQǀEHvʰ1+!,^o_o@;m<SIL'NY-oW;i5W' $/> {|XhQLz)a~f.a6-BF~F3BVnd! ᯚ!WSE`O"Hwբ>e@jKH>:ʽj2BxuSdUpMQetUpk"壧u^}=x.nS-ZYqxzxx?d2: endstream endobj 134 0 obj << /Length1 1614 /Length2 8978 /Length3 0 /Length 10029 /Filter /FlateDecode >> stream xڍTk6LtHww(ݍC !!- - ))H+͇'s5s= 5u8l V@y- QUpsqrsb00N @W+(?Ae7'GPGH-!U kq!` Ar `fr-5K=1@b ½+=tqB\^<@p{6tu~ Pt'@S{X'5 {tq]:J (쀿Op8C-^ hȫr=KoCK'dihGy)-cvA0Nw\P`d ||a,݁ߊF<<5`1( 0~/G@N^q\Ҋںl4'p~GW*m!?}%߱!!)3pc(WoEnNN4-AN^Y<2 j]UڀܜW|)#9x9` O&nm'k7' ~0^{\2k[H?Tr`keXZzap?2W@6@? C.W+"- A". Gr\.пc$P@n_12_|L//( >/X?1hx @O54Z,ġ*Rƒck4`S}G+HF//zVmr;j;oC!1oz(\M(wJk+>Qvǹ T枂8c}2'LXHñOHB2˥?KML(N%һy{AkPow;U^&6;Ho072[kks&iTzUfI;I4 ^Yia_3y%U=?˰;F(QGKϬcd/`UQ,hťu̲SdhԃQӴ}/ֹ?euY+N[MBvح]seD3MEj]@ubz&/VIRK0Ԕ]y5O}&%Sߗj@@EC8 --~'Zj.́j,uT<ɟJ y26)+*!iM QwJG],\6K/?IxE)AI_quIƢ|$kX?vuC_VLL搀XC아`ݥ<_(5n|:E&E*b| Ib?F\i3P7h ~|rSҺy?gCjUhYrcRr M~9jOzjD*3BX'ts8mwdtS\ 6z f"|p ⓪0g :W\!q;m h0!W| L/G>EMaOdoʜ&'u0r|*[>=~`Qhz<Ӣ.='k_ G,,`,N~FD{YڳP0yOϢH1N ȹ ?32=֥Dϻ|NiwԣAL$H"KQyJm W@g+(5a rZě1"xǥU, tFi= 0hErPQ }B^|1H_ EVA׺8%qHWbX멎pА ^NgNz1>f\`w5yQ78"AFj?BD- jntT4@m/n1[>638rg{dGcv~^k=CHZRH.xёVeX8܉ˡd=%v>"dJ@Pc N:Nr>S~}YC2U^KJ'q)г+913Rom0گReӛt E7$U>Cw!#ohgB58+ ~QbZPsHd7V#6\C =1h{' *EM? tX|NB\ft׻ZP.|G%%2sƉRgs#bZ vםG\$0-WVN+x$3r y4B`J#j(E0[ fc۔O1 xYĮ:2= PNtiwzOP oʞ1- w߇F2U\dpLL-8Tn/e_|>& [zɀRfOOE^KC; ˕1Ry3Rpj[cAV,]]C##|`l^_ ^C/NQi۩Á5hc=D` %8XWzGl Aӻt~h-ލ=&%k faOYv^ ߉-2Rz,Jjg6՝8 Vv݋vtmr.Ɓ;Me8  pUTlzofnyZmY|9/D ʫ4Dֆ=qƨ~ a"; 4]g8{n٫yz6HX̸P'#0<18m0@ŏidq݉z Ԓb*g$D+\ se M,53n$OqtҡAXTX Q \,T%6صͱ-;՚ r n* i{ f쯻]ج cg)1;2DIM.-500(X"Nߠ+uEjm|Yƨiԗ=j˝}z$]6 xZz<)Lfr*l<0:$}{|ݦe- АD;dR 4(pO^P}(zu_XLgZ[Ql]\7r!Zվ aPe Ml!>OrhGD }皘':8iY@mP=FF+Wb= 7Bw @)o2ܩZu‰ecq~jb;:'c"Y QȲk_/Hz=N/ ;YV F c:jgNtO덤36&eBX&V7a e _K f{( 0;"%=5p>$ËRu/\;6Ii3|>5!!(ƎrSb;.ULmPij#*EURExv>8 e,_vV3~D Xdu`cL0&T9XDؿ-*E:7.!f&YN2Cvn aF0IRzzUNncB4Z9}F=8*ﳫ<Q%*{W#ijTv"Rjz^; \Ծ)JW ֦EuDqBYan䂷Z_nWǦ"j;YR1YJu']gʷgg_1_HuRo')v[@s9鼳fn{"d7l!=[ڽ暁ʼn!*9o=o,n@0p?|vsUT`XtHw[, "Ѯ1p:CM.FF=3~ ݍtl0< ?3RDS: o[z9wyKo鋫dۗ8yXp\ _!?fKz&=~ĝReBj9xҡ&Pc5Z`W"<~.kûVi7C10w }S2ugMtÝ؟+K_ YCɰEd "}ŢBt*BQUxM_)߅y/romY-icFpT#X̂&JׂU僶 GW% `/_A۪ZgL]E7t^{lzZ+&5ú]bubJ ɋڐL뺨{raDsF911B$pɽrE,뭐A¦@wB)s3r*c3J}}\!\o׺uHxa䫩Ո818#{Q(`P7Ή(.M@/̍*hkt&"EZʩLRH0˞+ me۳t{0Iγ|e1?՗PK3}C^YsaTy6%l FJB 8@Wy(;7hJsC2 dJƥ Qcv8+'Bm뺸bXw"bu1plPI~-#n' lM-nzsWfyQx6Jf-:o'`8F_zKhh@Moė zoCpQ"X:kX,mP`7VWD&h8'{sC:* 1TU?G;1 6ܳ`*Ξs ml]굸EvZ@8ה/^I7d>t>b囹J;s|Vo!K57ЋA%oo3aF_݉Aӷ^} |r1έ1 f XL` G8hQXzg.$ͯBdKd /Sj8L]-?_82TU&fF'()N q|not@Y6>ǎYDz tvZdAk g#ezdJIs0kx |&z 7 H͔6k'ޱXi^˄+ "$o<úYawY+լ~2OVvUBbK*Jb~M{%XD^XckU* " Y{8Ec[hqYzhuaӅ )1}HN#Uɣ>Wtw]V*t0ާD1?LK?C5&0 y9;Q> 4-̏s(H+8DPA]xSKwܖ|WP4#Exm>:y.޸ʮca ?w'E F7X$UD+o"KD :O3k#@=M#m j;(ךBV*L{]_%d$4XfK+$}?)Nzጾ2&GCucC`8VYFgh0|Kk=G:Y'AUZ&{&CD6~c~JR d31J2N0[#sRR'2Ѭ,]8#J'YM.Qϼkvؼ1>_;ٰ1d ̌;Qֵ.6 *2c>V5_[m J ݫ)ɧ[y>QWo3}qthUm5fCu$[Rpz4B˂4(`l_ࡿoG$P̳7CmVMcWnU\PSzu:uA~SoV{eĈ96?&naRPbv<&l*D{Y@=/G]}_#%L!n,4ACGo[EĠtwHȏ_ަ8.e_u'vI=kdctP_m&O T>6wr62qO r|JpP!L-p" ϯGdK&_yZI G ܇փF8+!Cz$bSJ۳^2/ <,b10v=xC4$&C9lS^;r;wǚgA Hj!K6m-xp(nAZ[ĉ)/]ujrz d]v4/u'Ko`J~M;ݧڦ]^d(7w}b^͟^$ hEF5>aq51ݔ=[9M}2@yIBv H}-g_D/oh͚o1^yKlfP;Il3ߦLA/b BlRۼKMݏ[&J0?Dqދ & 2J9'e#$1C.L?}?my'Jdcl8=|33;)oHyیBQĘk"udFTSAwR-[tH *ooUVK*=SZ'=VЪDwmTލrsب\"H!cǶT27I'L{pXܛ'%JH,lSvܩV?E KҶ/B th[, lm8lln糊8'Ly?1 Y N-SS`wSbEk.v¦Q їA&Ȋ W䫮-+4h<&F/V祕-J_ayhlz4B7GU* 1Zj 3>L^'NgSakIF_D⒊.+up3e&0K>WM8Dtb)']!T_CilYI~ ,~66EPڑقFJΎߖ^ g|?E*rW$C7(>csgZx n(ly? S锫wC˪suQ{;Y2E 7&cyU&nBǠ3U;|Nd)} xjտ"a7f?&3-q Oiyųb3wVu*-X&Vk}w?3CR =/DE](/{}O> stream xڍT]6L=tIwKHI C%4 RRJׇO{kk9>kh59ps<ȨܼZB^X^N W sfPwRaAO$ > pY>  r| #\N.?࿚pA &=t7:@!X3p /Rn#/&6RY8.WI,+3Kŗ 4^{ 5 /oL7HzF0)9t$o_ۢ6 *38j'pRp.^ |U.x#J7CgtTY N& Giذ|x?zD_N{.8ѓ>B=%gL:Ub6ie{)b^Xaާ_3sŚaw{]&[}a6k SSUFFXK˲>Dj蔿ڼl2+:mF&ݷܵ{J\p0 2ǝV,n2G|bO xu#w0UH͍.q4_ߜ"!q) nZ8{`vLJsIE'&}avk0s+M ~Oѣ W?% W7Z3ڝLB!7hp1'JI3oxϬl-ԍ2HoN;$TNJiOj|nNj)xh3a޸!v9Ȫ^=FY FiQ:aʦ`MKq HT "M2l+d-R~4ɖ!%N&aildv;Q]k1΋-G_+TP3LH#{w/PIiXN獕WyDQPDGPjIZC7S4z96Rq _%SEem*7RBobҗpmMQ(>n dŴi#}7w<_&>DdJXJ lv:OBhN x+. 縈%[wh/ҒP68 EiF&/luy6 {Pu>|2A.10rݥ1`hD{I~@U&Zޝt;ad^Gηyrs?J\y)wXss0`j+>}iYoF ĎgdJ$zLnnDqu>CCFɫ(fj׭N{K$${<8N^3:ҶC}._'=]jAh(=0?=SRlY.׸|NZ^Ũ(rfT[Ϋ$4xMtp5]+*6wKϵ2e><2)~KDR/ˮd|H;j(ҝtB16"~H'7$i/Hj6Sߑ9 yի"Cqq3j椲I&t+'*Lx*8Lr"j߽µyxp%^gJpMG1-~?'tND;7>  ͫu.0++&\͔Hj܍v={SD"Rly@#/'׭){^#HUkl[ݷ'9fg3~gBj\J [g%ost[K 5t)tpCU߷+vsLSm7ބw*3/;'+q4* ua N0]{+gQZ~[]LPQ81?ްv5'5 B.kU>pvVSoL$B`k͜M,G?m_0fC~ z>{*S ܐT5jL>p]Cγ''Lg3nOe8~Df[we Om'0X8(f¨YQs+ŷԉ{u1y{hbV5xܨ?z0VR)eUD{-0"J%Rx(({rg~Wdj1z;66'ct(,9ﱘWWW, kmxty720>z{D_W]^X8{fJӚḴe+ ozrvw0lD1K up Jc+vd/~p@R>_ݷ(AbG! }VKFo})(]&|'ᡀyqCU+W3Xȼ=08͙Z |Mh1)Asqr]F%TD>w g٣#}7BK Y__6*bcz-xViGЉr"k ɛOISwH04'YkB<ӳ!H>k+}lTA]A.y恘ݘPe3"#mWi ,fT?P{W ٦AK^Gx׳Yp$|'ZcJtlݏ2l̳9EK2)9#PR[x/x[#2CjNs:+&,܎4D.<>KU8~^/,J> WW`$2uM o}:>gA<TSJ cs'O>QTMq836[|~:'We aBk$τc^7x_.g9Oh':w/PvNԢ\\$}5`|oDFAS[a=,&X4LS{1zv#_f[ZEæ5[ |z̩HmUJKEjUbcWǃB5m[tseU ZM!]wyv\ÖKlDMs1+7Q)q*/7Xay~ӊNקK=\'C(]&FђM0RI!Ld?A=m3Ks? dn#6 jQ1|G öyo2t!ނo/[gID.XCЍHXdTM.P-o~nXuDh2}FYQ sՖQr^o8O53=9mJŁT嵂7D FݢZn+ re$6D?) D$0WIRō\yC5EgMf*^lM\'?;5S&3ѩf֚BFdc!H%dS!53L %?T I4G!s.aOGIj]\Tꃴ% ŊdPfq ɛz?6LZܖU1{(+na:jNeR:lm'~i%)y\L&[W;z2>Q3Kwq|CeXuvFw$l/ƬwRd~(Q~DL6Lٛ&BmSFO'N#2P^tLx `_M]Or+U+qߑL'* C3 ӔbPWFW,X ˈ`5Q-4sM2m S+5[~Cx|eavueNҕ S7s{aOsJS7lQ%PS@a\fx#;<[0w>-f2Ze|ol[H|V l)V"&ydsWՓa侱HCj2R=vƊgr_uLLXF?̓c2Ő6̴5ojU$s xx Z?4dmepDpyaqlS5<5\4q:uSe芅u0YR'T lHqMblK R ֽ+#r)T1oj=aH\c/Y+3UXS`ʛGb~BdmԟOk ѣI`)E;`"{d:sS>)Yz3Ȋml7/"p&dĖ#T #I'L+]zHJsbblEr,Jg8B%i,v>m~S0BMXLP#HyU-ݸ(\4L 3?I2[c{CEߩ%S(ԳiDte>RaҥDreh4y1r#F:.6ci)A*?ɘ  oBkо';=jH(_{h)AT}z%9uB{ۀbmqٰ{#&ӻ:w-7'<]+ma6Ȯ8A8Et:d7•.L4CJBͲW"Z@~zFayIvA.jY81?Cql|$k#|wZW\_L>?~rb u({23.J04a'S`^$UCi+u1}ZE0GhX`nGp㫵=!i hE/nN:6΅|9`-=*eO83ᆹ6W )\>qP$!Qs3{| .L ک_=*Z,hR<]f}~w"d;7wžBbcYr0BsGPI@S2c"wʀ8ǣ5[ NsSQ'!3 >vM6iȤ8goqxҴIY_DW/dl)po+X% z e[6M Rh#OjL7tINm$?dT2!sLЍ޳O*ԗ})5ҋ4nJvxr=-w R]LҔ  qJ/C6Iy<(75E Q?=EilUL;!6͝D܋TנϏ$/ hh%K^g;2UϢ@ ☄Qo‰W鶭1yφyRZ,~˾?r"cjK!C4J&PfMpǙhs\A M}2JS 3*Z P11`iA7"rriLss,is P衤#]7οpER~^o:o)1(j,$~ʙde~{ C7L-'ͻVR|+`}J4+>n|6 {(I?K.}Zn!m] nd|TvXg ZUm+! =ӫ ۶'>;eLUߜ*1 F9~(+~r@n䥑hX#E\٘)f_# Fk ~l*֑}Ni{1 |,A S^qT~{3ez!j?bvn~;.~fyP Nbbc[jFE'&DS& kn\c K@oo}hEyK5 H\ 1=|M7~sŤ2C+^pdiLAíIy^E[][?FoGƙgtsMG}njr;Rfεq,0Bvo9^4ұu}!tX#yoLw8c5)Y̗tmnaĝ(MR(#oq®=" $Ts2.%f]HOJ1}4qh78%CECGt* endstream endobj 138 0 obj << /Length1 2300 /Length2 9372 /Length3 0 /Length 10719 /Filter /FlateDecode >> stream xڍT "ݍ CwK ҍ 1CtKI% HK )t9wo]sv{FZ mN+Xuttxx@ ȋȨqsOvqXȹAnpSP ;x<aV0_G\I"?%y|8y|^~, ?Y<0»=փ_0܂,cnZ¿x?_.f7ߌҳm9Bϭ|`M_S}ߋ;_ 2P qUx4 nb{5`7 ?:rYoWHw塖0K+ 1I 07 ^H2E#!pn$V}@ [u<DเEpN+X &pG. K{02v{+{U ,a7&oCO ~`~pbo5Cz;قXe? @x@%w= Ct3?jxNj8q#ac9]?LA`-wp =07UޡG CZkǩ+uo7 #/`KY}Kwx_/[0 l17  myɹ>ˏ{u&O,'~/?zVFw$@{e߷Ѣ$sum(?8|G $v\Uy7uvAlHIO7[)&>ɓ]dzXiSX7Ӆ4լ)}--1.u+fc΅;*VѲۀ&n)j_֦b@U:GǠzdzFwϏ'P~Okʒ$?d? UլU;چc+9K,^(o4qyy FlUu&aQ^d #LV)旅бQ1"T:]6&CӯEkد lȏ<M -6M06c7\H9Au8}}!G kY ^ǫdZUwUO"}CwH}ldW@mR+^>-Qw|DͤB ~ݘd 3 DB_aΘ3DpEΘ3&p,7;Ԏ7oO\NѦ)TE3vi T :]ybzhc rg}SaS V xR˹7J%9~5SqAzeSjN ͗u4wLˢ{6e(4})1M˕6cۅU:""n8-sޒٍ=j|dอvSdץPyEzק)Y# cg'R]шO%T6c s#Ф9=26O2=NO iMH٭f]Rimҵ8/n/*rx/mG9weT+^dɄ>~zsCɷVnr* j=b+OZWfJ1۝$)tDCOi!w̦GHA>-3!a)wO㠵>sD}ힾC:ƤSh|dҦ@PVIP1%.PBwb}%'ODa~֭DGSƭ] 'Fc+r$KSAy&9^M::T Lc\L>B!$ ^ 7O U -U&qtNnb&;IU_Ar/ƅF9d,a&ĝΦ~֞B˟}fA w'vGM,SZsҼLQ>u<}I5JP j0: (yk}+$4Bj9.Wޖ_Xh탴Eޯw]^3.#/s?@Y3Wds 9J70֩3h݅D aE>AF?Y7"x##Ƿa qeOzwq%\’b ڲjj_5G&Վ9Q/sm띍h1Ȥ<ΈN%#Kq8+=Czc}u!>v9$0Ԕ8apokOB.GU*VkS"">Ta/ܟ6{,,y k3B֋n>4x!JbE"6^5nء.nzj#P`T"U @RZhK`S.M@,͗+d.8B>! "-n-i\}M]Fg+%M|VDwbz:AueM >CTMj>( ½ҭvS.zTyU=(aRK\TAi6Uq촄*z9t>E?ޤ9">O[]ˆ$xia}Eu#!d_{y?MxevY_vEzxk(&:!{dHڋуWpؒAk Ԥ}sWq@hQo¦^J]1,(Ӥ}cMtwgN207^ͻ'nGގDWj5PHD$ e_Ʀ N>>6[තeGvsag6j#gg4<鞠W0gYRo7Vˀ-b5֬Tb;e(_.9|?49&x)/|$Dή%2|գG7oZ ͆cJy& x]lf|@]I<~?x9Xu}쪫crG{g+~_L07" ~ݔ?`?ОaVڿe_*2kۢGeDe/bϟK714B˧V:C2?M3$M,C;,}hbGAh\GkC.?zl.؞޴vnA ϽO@m = T?6{M}*r$^T5G^~būı#[ݗ?{X h %$n}JD\%,[lk[ΪXr2uW$_⛃A%*,]#^?u'1ٵ$0< *S.m2 I`ⶉ|bnתu.HA~Ӱ)`W^n;$9 Jn<`GW_ǹB\|w8ţ?-8(~]btb[^s˜51ɡ3k?9aRgW+P Ul%<R4Pη3g2Yv~2^i0 -!ag@ I}uAa$ŐЈ:Ub'u \p*ȨƋ|?YyL(Y"UWs}9r':sI* e:<.ɐ8)j2D_m{bcԟ1^s2wHrT9AuVoNPC䫨rjK9Q>uX98+P8" 0ԓnȞ9Ȥ|F>=A`χܗCtH#I紲d歳wKc+wC*2ZcH0OS_\[ϞU%Id,\78$ʪQ>DCEB*UGUz.-fx-tc<6ͪ) YX&z:I-rV.HVQwω9|v5ZF|Ww-㩆1j-6zEV tz؞YqB9:H[⟬%Ⲵѓ>*2/K!?Pt$BP11lAd|Kn[g3FU'Q(pNg^Z\z8Z}-aʔ~-*k%aH!2(D)@yg&T.8 g`(L:hhAb{Lӟ/%ϼ*rۦSVk(w~H&5GS8%WH,_kּ M'(#\og,,3\9pßJ>m]IеK˽=>}fB""ﳲOuA҉  24w0!S[vYTW2K=Io>%)ւNcU q\};D|žIUr?L#\wd7bNųJ# )XLǒ%gCU2G G~VUǴDynT&:h1Y%64m7\^(&Q $oAwnf2A^ּ/jkJm >V5IDH-f1z`Irz ׂ'~+ ǫDΧIo i̯6 8 wSJ2!?` ~TKd5;r82|p:+ ;mҪ/;&)HG9Xa`{ԕܥI7z)ASl@=ǝ 1J(Q[YmìM1R?uO&9UNj3Gw~FEHʹyɭ)QCgr.I^bK44Cl;c;ҜK̙1se#Œ$Yꮲ}k=)WaW .WU* < ,$ @0u)OM1>BFԬM/TF9-W59||fr1"f%o_HJSdB^W;ٴP F{'3\bY' j3m Kø 1ƌx4ĩ6- VSHU6v1}C3Yڿ*` ; 7oD~ j\p u7Nrζ+ $K jJ<wa3%eZxmln:wd~*OwRl$4V2Y+w6Wlc#֗3OA~[1Sd[oNt(DJ mFx:EP\ `Ԉq}ZZ AZpA}ǜo1Q'n|<9XICϻ1{-澳[唕y,ҰY ! z*bkRCV8zK5v~~mg!4!) F&TtY7Es8 @k} YQQ{u(oN9: Ogf~^MJ Fyt*m5ކӫ|qdf֙w3Th;˯/<ԕjVBĻٰRq[%#5_OneJhGo14ՙer< \BNBpS"U^xxj|ZȽyy+fߋhżUbn:3f^_€ϐh^zz*Svw]lV*r|M)2rm!ƎE` u?zY ɶӛ5`3؛ gR/Yx|+Y{\R^ WN&Պ*1CcS4Qrj0{®}EqfTxBRAb0’G2kƼKeNء; _maP􃚻ᝆ'm jCPnqWa1hwL[H>Gk7sҋJ3!FP 9|Xt˧%:v1'0^I*y`Kcm{F+uS& qN('v~(:Hߒ-=٪|][&k'0xŐ?## /Zا- Ej6%(%EO-]'΄ gL6B\[k[&A/ %AEx/ӝ&[ǜ֟ѩ4M Rd͚[$b2|%Hٕư&qQ%ґOEZH lAic:WY\FUi_Cz_,h)™Xe?30E4@_͚G~ E Ark RKWN5ׇ2?:{D诤{cUˊFr@f mN(-(0z5;d! '9ՙg#CW߷;)}iD=Ff+D᫭YonjnWI~\ ".wGKq_QxySsnM"{nb0))SZ:){]>%2a!Fi0'tGБQә X"(EAj4SC{,H93@0A7/)kߌ[~RgQuii^}$y_m`k3L8y35ko'Rh0e $˛Fj}!YͺUqYb3 ,j >yG6l\4J7]L/*Ӵb$}cajInk#:0qnSLPr&tefNU+nBqW9Rcqm;ZJEf8ҭb Rhf 5Qg+fAtz;֍Y!WyjYyF5=Z,6wssrYanSrreI)ǁl}ff mǔDcqC' 7Gg$3#'8F.ĘmH;tVaAH>q 7-?/;A?hy'%Y'DuTF4JUy1N=3 2J6i/8d噊Z.oŐJ!5 !. ΰ"37=w qsMMN94< ^fbYXuw+vY`jSA"b?RV4vc7sEd?(uBG(}IaS!ꪶH࣍.DM8#Y endstream endobj 140 0 obj << /Length1 737 /Length2 969 /Length3 0 /Length 1537 /Filter /FlateDecode >> stream xmT{4i\Q/1eBAE̋>f\:BrdS˶tR)*E-V)%i?t=?{}ykbA >"V< 8l[ (J @ S $E3!kAbTI0bB \.^.I 6]! |{='?xBŘxcBK! D$+ $p6Iʞ !I"HB||pY xE{]SR: xw>iMF8f aB H gXGN d_C4!)F2J 0hIC qcIl 8TKҢ⑴V\;%I=8((Z{A% s"L&Q^i} \U7B{ZDȟֳ:v?ZQś1ZͅWni|Rdj c6uQiy.COUwhan+JnYmPT5$VY.va;CJ~t쩢)Q:{O>XqkIkF6]^8UXy[s6!%l;._.6~^dc뱪Ϫ fF Ӂs1Q>QX03L8 u' 2Ɲ$YbݦZɖfgg v}5G]ߜ+IӼ蔿nm<`~e!i_Z <\m?_-[[\+kě5?:6xtvX0eƅ&eft*G~غd*#R /)xi`7ovmLsä.|ղ)C* endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 798 /Length 2861 /Filter /FlateDecode >> stream xZ[o~ׯc"  Nq4iyP䵭YJ?ߐ+i%Yd}( qg ZI&eZ0njeyˤ`Q3>.ϔwbJ,S^3嘊LkMT0#ӞK`2udQ:9Z 'f1 3HRb-kW;Na!b>$s7XsLZ+`+q0&{dB6ktǓW*lpZ`c>;F\|ޓ9#vMsdbDl}|_擴;'qdccn3N4 /!i-So3u6fƫB5mxH"@Wa`.z#'>d!blf;kƛ4Ͱz|W 5So$zn2Ղ 3fւ9G`Us!AyܙCG StLCZـL6iBDB?}(ț8b~^OIs*Wcp6eСӸum5 1pOӴt 0R&ހT" x HO⎔ $%X~'T9PTPs]J*ݴ*V7|6P,*mŻfnOqӹmGcёf~xrjOGK{wO{ow?Ja|LMgg8?S*AΤO'y׻:( 2=4 dûuyF$ 7||!ˏy)/O4x_x5**ǃꔏO? nxqY_lJFͯg*}hrml ~uy4|0KU "65pſP`}sX9R "A=OW a5j$3 xP v4MRЍYѳ<3d C9!_i&OZ<'b)ɋ7r\-l7/v?}~\׸R簎Ǎ]i׸+Eە(Y4E6e{|H歱N&i)"RE,1/{ȔQnZxSƦjWGaJx]9UTN|NzZH` άQJ-Z,nPNwhV7>R՘PBNv|eJD4%[YϺA[*׽!/o%nv>.{Ӯ5TidmPiדTnraɅde+\[Ïǯnnzǎ3if~kKE\8\6Ec{y]&GՏM\#`ho'M۪Jz}M[GI?ҏ؏7<M.;[:C.dۃ[ms}m y矺]J Di qkYb]ٴb~ h‚E_gg%7':|YEWD&ez)Zaz+?OjZ53{ ;i}1IX w_|$X֮븠]/—e픙klk_:7.kڃhk=n}X< > endobj 142 0 obj << /Type /ObjStm /N 25 /First 195 /Length 808 /Filter /FlateDecode >> stream xڝV_O0ϧG*;Xh6&BHAm:m~8 NC~|(5x$A14Q282 %" 6<Lc*880`\$'aHh6 cTOi Pje(#ARA8Bx/ 2I “d}<\Oȃ4]MS/RD|\d F0,faErGGo>9\Y y['.?|;՛My![GO>~v|>&yֱ~[g>-,[nvtU5SeJOv Ol?ܺiUPa׎=n(]q"Ɖ cKXQ dur] <446417DE2B0ED449A7856B10F4DC53F3>] /Length 396 /Filter /FlateDecode >> stream xM7UaکPp8:H9R$GZ&&{o`Z͚%LM~~$" %AuNz$H Kwt>]"\^P Ct+PtHW1ػ OPV~zhfE 6YW _8dIWh6(j|m[PV2vhw)2yw,>Q~C+3 (Ƴ>1c0(t W{S0XHEeifߩ,8HKN_N?9}RRuY@Ӛ-U.eR"e,R!eROv3d#_<9 endstream endobj startxref 148986 %%EOF foreach/inst/doc/foreach.Rnw0000644000176200001440000004775711741344141015526 0ustar liggesusers% \VignetteIndexEntry{foreach Manual} % \VignetteDepends{foreach} % \VignettePackage{foreach} \documentclass[12pt]{article} \usepackage{amsmath} \usepackage[pdftex]{graphicx} \usepackage{color} \usepackage{xspace} \usepackage{fancyvrb} \usepackage{fancyhdr} \usepackage[ colorlinks=true, linkcolor=blue, citecolor=blue, urlcolor=blue] {hyperref} \usepackage{lscape} \usepackage{Sweave} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % define new colors for use \definecolor{darkgreen}{rgb}{0,0.6,0} \definecolor{darkred}{rgb}{0.6,0.0,0} \definecolor{lightbrown}{rgb}{1,0.9,0.8} \definecolor{brown}{rgb}{0.6,0.3,0.3} \definecolor{darkblue}{rgb}{0,0,0.8} \definecolor{darkmagenta}{rgb}{0.5,0,0.5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\bld}[1]{\mbox{\boldmath $#1$}} \newcommand{\shell}[1]{\mbox{$#1$}} \renewcommand{\vec}[1]{\mbox{\bf {#1}}} \newcommand{\ReallySmallSpacing}{\renewcommand{\baselinestretch}{.6}\Large\normalsize} \newcommand{\SmallSpacing}{\renewcommand{\baselinestretch}{1.1}\Large\normalsize} \newcommand{\halfs}{\frac{1}{2}} \setlength{\oddsidemargin}{-.25 truein} \setlength{\evensidemargin}{0truein} \setlength{\topmargin}{-0.2truein} \setlength{\textwidth}{7 truein} \setlength{\textheight}{8.5 truein} \setlength{\parindent}{0.20truein} \setlength{\parskip}{0.10truein} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagestyle{fancy} \lhead{} \chead{Using The {\tt foreach} Package} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Using The {\tt foreach} Package} \author{Steve Weston \\ doc@revolutionanalytics.com} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} One of R's most useful features is its interactive interpreter. This makes it very easy to learn and experiment with R. It allows you to use R like a calculator to perform arithmetic operations, display data sets, generate plots, and create models. Before too long, new R users will find a need to perform some operation repeatedly. Perhaps they want to run a simulation repeatedly in order to find the distribution of the results. Perhaps they need to execute a function with a variety a different arguments passed to it. Or maybe they need to create a model for many different data sets. Repeated executions can be done manually, but it becomes quite tedious to execute repeated operations, even with the use of command line editing. Fortunately, R is much more than an interactive calculator. It has its own built-in language that is intended to automate tedious tasks, such as repeatedly executing R calculations. R comes with various looping constructs that solve this problem. The \texttt{for} loop is one of the more common looping constructs, but the \texttt{repeat} and \texttt{while} statements are also quite useful. In addition, there is the family of ``apply'' functions, which includes \texttt{apply}, \texttt{lapply}, \texttt{sapply}, \texttt{eapply}, \texttt{mapply}, \texttt{rapply}, and others. The \texttt{foreach} package provides a new looping construct for executing R code repeatedly. With the bewildering variety of existing looping constructs, you may doubt that there is a need for yet another construct. The main reason for using the \texttt{foreach} package is that it supports {\em parallel execution}, that is, it can execute those repeated operations on multiple processors/cores on your computer, or on multiple nodes of a cluster. If each operation takes over a minute, and you want to execute it hundreds of times, the overall runtime can take hours. But using \texttt{foreach}, that operation can be executed in parallel on hundreds of processors on a cluster, reducing the execution time back down to minutes. But parallel execution is not the only reason for using the \texttt{foreach} package. There are other reasons that you might choose to use it to execute quick executing operations, as we will see later in the document. \section{Getting Started} Let's take a look at a simple example use of the \texttt{foreach} package. Assuming that you have the \texttt{foreach} package installed, you first need to load it: <>= library(foreach) @ Note that all of the packages that \texttt{foreach} depends on will be loaded as well. Now I can use \texttt{foreach} to execute the \texttt{sqrt} function repeatedly, passing it the values 1 through 3, and returning the results in a list, called \texttt{x}\footnote{Of course, \texttt{sqrt} is a vectorized function, so you would never really do this. But later, we'll see how to take advantage of vectorized functions with \texttt{foreach}.}: <>= x <- foreach(i=1:3) %do% sqrt(i) x @ This is a bit odd looking, because it looks vaguely like a \texttt{for} loop, but is implemented using a binary operator, called \texttt{\%do\%}. Also, unlike a \texttt{for} loop, it returns a value. This is quite important. The purpose of this statement is to compute the list of results. Generally, \texttt{foreach} with \texttt{\%do\%} is used to execute an R expression repeatedly, and return the results in some data structure or object, which is a list by default. You will note in the previous example that we used a variable \texttt{i} as the argument to the \texttt{sqrt} function. We specified the values of the \texttt{i} variable using a named argument to the \texttt{foreach} function. We could have called that variable anything we wanted, for example, \texttt{a}, or \texttt{b}. We could also specify other variables to be used in the R expression, as in the following example: <>= x <- foreach(a=1:3, b=rep(10, 3)) %do% (a + b) x @ Note that parentheses are needed here. We can also use braces: <>= x <- foreach(a=1:3, b=rep(10, 3)) %do% { a + b } x @ We call \texttt{a} and \texttt{b} the {\em iteration variables}, since those are the variables that are changing during the multiple executions. Note that we are iterating over them in parallel, that is, they are both changing at the same time. In this case, the same number of values are being specified for both iteration variables, but that need not be the case. If we only supplied two values for \texttt{b}, the result would be a list of length two, even if we specified a thousand values for \texttt{a}: <>= x <- foreach(a=1:1000, b=rep(10, 2)) %do% { a + b } x @ Note that you can put multiple statements between the braces, and you can use assignment statements to save intermediate values of computations. However, if you use an assignment as a way of communicating between the different executions of your loop, then your code won't work correctly in parallel, which we will discuss later. \section{The \texttt{.combine} Option} So far, all of our examples have returned a list of results. This is a good default, since a list can contain any R object. But sometimes we'd like the results to be returned in a numeric vector, for example. This can be done by using the \texttt{.combine} option to \texttt{foreach}: <>= x <- foreach(i=1:3, .combine='c') %do% exp(i) x @ The result is returned as a numeric vector, because the standard R \texttt{c} function is being used to concatenate all the results. Since the \texttt{exp} function returns numeric values, concatenating them with the \texttt{c} function will result in a numeric vector of length three. What if the R expression returns a vector, and we want to combine those vectors into a matrix? One way to do that is with the \texttt{cbind} function: <>= x <- foreach(i=1:4, .combine='cbind') %do% rnorm(4) x @ This generates four vectors of four random numbers, and combines them by column to produce a 4 by 4 matrix. We can also use the \texttt{"+"} or \texttt{"*"} functions to combine our results: <>= x <- foreach(i=1:4, .combine='+') %do% rnorm(4) x @ You can also specify a user-written function to combine the results. Here's an example that throws away the results: <>= cfun <- function(a, b) NULL x <- foreach(i=1:4, .combine='cfun') %do% rnorm(4) x @ Note that this \texttt{cfun} function takes two arguments. The \texttt{foreach} function knows that the functions \texttt{c}, \texttt{cbind}, and \texttt{rbind} take many arguments, and will call them with up to 100 arguments (by default) in order to improve performance. But if any other function is specified (such as \texttt{"+"}), it assumes that it only takes two arguments. If the function does allow many arguments, you can specify that using the \texttt{.multicombine} argument: <>= cfun <- function(...) NULL x <- foreach(i=1:4, .combine='cfun', .multicombine=TRUE) %do% rnorm(4) x @ If you want the combine function to be called with no more than 10 arguments, you can specify that using the \texttt{.maxcombine} option: <>= cfun <- function(...) NULL x <- foreach(i=1:4, .combine='cfun', .multicombine=TRUE, .maxcombine=10) %do% rnorm(4) x @ The \texttt{.inorder} option is used to specify whether the order in which the arguments are combined is important. The default value is \texttt{TRUE}, but if the combine function is \texttt{"+"}, you could specify \texttt{.inorder} to be \texttt{FALSE}. Actually, this option is important only when executing the R expression in parallel, since results are always computed in order when running sequentially. This is not necessarily true when executing in parallel, however. In fact, if the expressions take very different lengths of time to execute, the results could be returned in any order. Here's a contrived example, that executes the tasks in parallel to demonstrate the difference. The example uses the \texttt{Sys.sleep} function to cause the earlier tasks to take longer to execute: <>= foreach(i=4:1, .combine='c') %dopar% { Sys.sleep(3 * i) i } foreach(i=4:1, .combine='c', .inorder=FALSE) %dopar% { Sys.sleep(3 * i) i } @ The results of the first of these two examples is guaranteed to be the vector c(4, 3, 2, 1). The second example will return the same values, but they will probably be in a different order. \section{Iterators} The values for the iteration variables don't have to be specified with only vectors or lists. They can be specified with an {\em iterator}, many of which come with the \texttt{iterators} package. An iterator is an abstract source of data. A vector isn't itself an iterator, but the \texttt{foreach} function automatically creates an iterator from a vector, list, matrix, or data frame, for example. You can also create an iterator from a file or a data base query, which are natural sources of data. The \texttt{iterators} package supplies a function called \texttt{irnorm} which can return a specified number of random numbers for each time it is called. For example: <>= library(iterators) x <- foreach(a=irnorm(4, count=4), .combine='cbind') %do% a x @ This becomes useful when dealing with large amounts of data. Iterators allow the data to be generated on-the-fly, as it is needed by your operations, rather than requiring all of the data to be generated at the beginning. For example, let's say that we want to sum together a thousand random vectors: <>= set.seed(123) x <- foreach(a=irnorm(4, count=1000), .combine='+') %do% a x @ This uses very little memory, since it is equivalent to the following \texttt{while} loop: <>= set.seed(123) x <- numeric(4) i <- 0 while (i < 1000) { x <- x + rnorm(4) i <- i + 1 } x @ This could have been done using the \texttt{icount} function, which generates the values from one to 1000: <>= set.seed(123) x <- foreach(icount(1000), .combine='+') %do% rnorm(4) x @ but sometimes it's preferable to generate the actual data with the iterator (as we'll see later when we execute in parallel). In addition to introducing the \texttt{icount} function from the \texttt{iterators} package, the last example also used an unnamed argument to the \texttt{foreach} function. This can be useful when we're not intending to generate variable values, but only controlling the number of times that the R expression is executed. There's a lot more that I could say about iterators, but for now, let's move on to parallel execution. \section{Parallel Execution} Although \texttt{foreach} can be a useful construct in its own right, the real point of the \texttt{foreach} package is to do parallel computing. To make any of the previous examples run in parallel, all you have to do is to replace \texttt{\%do\%} with \texttt{\%dopar\%}. But for the kinds of quick running operations that we've been doing, there wouldn't be much point to executing them in parallel. Running many tiny tasks in parallel will usually take more time to execute than running them sequentially, and if it already runs fast, there's no motivation to make it run faster anyway. But if the operation that we're executing in parallel takes a minute or longer, there starts to be some motivation. \subsection{Parallel Random Forest} Let's take random forest as an example of an operation that can take a while to execute. Let's say our inputs are the matrix \texttt{x}, and the factor \texttt{y}: <>= x <- matrix(runif(500), 100) y <- gl(2, 50) @ We've already loaded the \texttt{foreach} package, but we'll also need to load the \texttt{randomForest} package: <>= library(randomForest) @ If we want want to create a random forest model with a 1000 trees, and our computer has four cores in it, we can split up the problem into four pieces by executing the \texttt{randomForest} function four times, with the \texttt{ntree} argument set to 250. Of course, we have to combine the resulting \texttt{randomForest} objects, but the \texttt{randomForest} package comes with a function called \texttt{combine} that does just that. Let's do that, but first, we'll do the work sequentially: <>= rf <- foreach(ntree=rep(250, 4), .combine=combine) %do% randomForest(x, y, ntree=ntree) rf @ To run this in parallel, we need to change \texttt{\%do\%}, but we also need to use another \texttt{foreach} option called \texttt{.packages} to tell the \texttt{foreach} package that the R expression needs to have the \texttt{randomForest} package loaded in order to execute successfully. Here's the parallel version: <>= rf <- foreach(ntree=rep(250, 4), .combine=combine, .packages='randomForest') %dopar% randomForest(x, y, ntree=ntree) rf @ If you've done any parallel computing, particularly on a cluster, you may wonder why I didn't have to do anything special to handle \texttt{x} and \texttt{y}. The reason is that the \texttt{\%dopar\%} function noticed that those variables were referenced, and that they were defined in the current environment. In that case \text{\%dopar\%} will automatically export them to the parallel execution workers once, and use them for all of the expression evaluations for that \texttt{foreach} execution. That is true for functions that are defined in the current environment as well, but in this case, the function is defined in a package, so we had to specify the package to load with the \texttt{.packages} option instead. \subsection{Parallel Apply} Now let's take a look at how to make a parallel version of the standard R \texttt{apply} function. The \texttt{apply} function is written in R, and although it's only about 100 lines of code, it's a bit difficult to understand on a first reading. However, it all really comes down two \texttt{for} loops, the slightly more complicated of which looks like: <>= applyKernel <- function(newX, FUN, d2, d.call, dn.call=NULL, ...) { ans <- vector("list", d2) for(i in 1:d2) { tmp <- FUN(array(newX[,i], d.call, dn.call), ...) if(!is.null(tmp)) ans[[i]] <- tmp } ans } applyKernel(matrix(1:16, 4), mean, 4, 4) @ I've turned this into a function, because otherwise, R will complain that I'm using ``...'' in an invalid context. This could be executed using \texttt{foreach} as follows: <>= applyKernel <- function(newX, FUN, d2, d.call, dn.call=NULL, ...) { foreach(i=1:d2) %dopar% FUN(array(newX[,i], d.call, dn.call), ...) } applyKernel(matrix(1:16, 4), mean, 4, 4) @ But this approach will cause the entire \texttt{newX} array to be sent to each of the parallel execution workers. Since each task needs only one column of the array, we'd like to avoid this extra data communication. One way to solve this problem is to use an iterator that iterates over the matrix by column: <>= applyKernel <- function(newX, FUN, d2, d.call, dn.call=NULL, ...) { foreach(x=iter(newX, by='col')) %dopar% FUN(array(x, d.call, dn.call), ...) } applyKernel(matrix(1:16, 4), mean, 4, 4) @ Now we're only sending any given column of the matrix to one parallel execution worker. But it would be even more efficient if we sent the matrix in bigger chunks. To do that, we use a function called \texttt{iblkcol} that returns an iterator that will return multiple columns of the original matrix. That means that the R expression will need to execute the user's function once for every column in its submatrix. <>= iblkcol <- function(a, chunks) { n <- ncol(a) i <- 1 nextElem <- function() { if (chunks <= 0 || n <= 0) stop('StopIteration') m <- ceiling(n / chunks) r <- seq(i, length=m) i <<- i + m n <<- n - m chunks <<- chunks - 1 a[,r, drop=FALSE] } structure(list(nextElem=nextElem), class=c('iblkcol', 'iter')) } nextElem.iblkcol <- function(obj) obj$nextElem() @ <>= applyKernel <- function(newX, FUN, d2, d.call, dn.call=NULL, ...) { foreach(x=iblkcol(newX, 3), .combine='c', .packages='foreach') %dopar% { foreach(i=1:ncol(x)) %do% FUN(array(x[,i], d.call, dn.call), ...) } } applyKernel(matrix(1:16, 4), mean, 4, 4) @ Note the use of the \texttt{\%do\%} inside the \texttt{\%dopar\%} to call the function on the columns of the submatrix \texttt{x}. Now that we're using \texttt{\%do\%} again, it makes sense for the iterator to be an index into the matrix \texttt{x}, since \texttt{\%do\%} doesn't need to copy \texttt{x} the way that \texttt{\%dopar\%} does. \section{List Comprehensions} If you're familar with the Python programming language, it may have occurred to you that the \texttt{foreach} package provides something that is not too different from Python's {\em list comprehensions}. In fact, the \texttt{foreach} package also includes a function called \texttt{when} which can prevent some of the evaluations from happening, very much like the ``if'' clause in Python's list comprehensions. For example, you could filter out negative values of an iterator using \texttt{when} as follows: <>= x <- foreach(a=irnorm(1, count=10), .combine='c') %:% when(a >= 0) %do% sqrt(a) x @ I won't say much on this topic, but I can't help showing how \texttt{foreach} with \texttt{when} can be used to write a simple quick sort function, in the classic Haskell fashion: <>= qsort <- function(x) { n <- length(x) if (n == 0) { x } else { p <- sample(n, 1) smaller <- foreach(y=x[-p], .combine=c) %:% when(y <= x[p]) %do% y larger <- foreach(y=x[-p], .combine=c) %:% when(y > x[p]) %do% y c(qsort(smaller), x[p], qsort(larger)) } } qsort(runif(12)) @ Not that I recommend this over the standard R \texttt{sort} function. But it's a pretty interesting example use of \texttt{foreach}. \section{Conclusion} Much of parallel computing comes to doing three things: splitting the problem into pieces, executing the pieces in parallel, and combining the results back together. Using the \texttt{foreach} package, the iterators help you to split the problem into pieces, the \texttt{\%dopar\%} function executes the pieces in parallel, and the specified \texttt{.combine} function puts the results back together. We've demonstrated how simple things can be done in parallel quite easily using the \texttt{foreach} package, and given some ideas about how more complex problems can be solved. But it's a fairly new package, and we will continue to work on ways of making it a more powerful system for doing parallel computing. \end{document} foreach/inst/unitTests/0000755000176200001440000000000013212617760014645 5ustar liggesusersforeach/inst/unitTests/iteratorTest.R0000644000176200001440000000376211472542406017471 0ustar liggesusers# test matrix iterator with foreach test01 <- function() { m <- matrix(rnorm(25 * 16), 25) x <- foreach(col=iter(m, by='col'), .combine='cbind') %do% col checkEquals(m, x) x <- foreach(col=iter(m, by='col'), .combine='cbind') %dopar% col checkEquals(m, x) x <- foreach(row=iter(m, by='row'), .combine='rbind') %do% row checkEquals(m, x) x <- foreach(row=iter(m, by='row'), .combine='rbind') %dopar% row checkEquals(m, x) } # test data.frame iterator with foreach test02 <- function() { d <- data.frame(a=1:10,b=11:20,c=21:30) ed <- data.matrix(d) x <- foreach(col=iter(d, by='col'), .combine='cbind') %do% col colnames(x) <- colnames(ed) checkEquals(ed, x) x <- foreach(col=iter(d, by='col'), .combine='cbind') %dopar% col colnames(x) <- colnames(ed) checkEquals(ed, x) x <- foreach(row=iter(d, by='row'), .combine='rbind') %do% row checkEquals(d, x) x <- foreach(row=iter(d, by='row'), .combine='rbind') %dopar% row checkEquals(d, x) } # test function iterator with foreach and %do% test03 <- function() { func <- function() { y = NULL repeat { x = rnorm(1) if (x < -3.0) stop('StopIteration') if (10 == length(y)) break else if (0 < x) y = c(y, x) } y } ## XXX mean is not a reasonable combine function ## XXX removed this for the moment - sbw ## r <- foreach(v=iter(func), .combine='mean') %do% mean(v) ## 'r' is NULL if iteration stops early. ## checkTrue(is.null(r) || 0 < r) } # test function iterator with foreach and %dopar% test04 <- function() { func <- function() { y = NULL repeat { x = rnorm(1) if (x < -3.0) stop('StopIteration') if (10 == length(y)) break else if (0 < x) y = c(y, x) } y } ## XXX mean is not a reasonable combine function ## XXX removed this for the moment - sbw ## r <- foreach(v=iter(func), .combine='mean') %dopar% mean(v) ## 'r' is NULL if iteration stops early. ## checkTrue(is.null(r) || 0 < r) } foreach/inst/unitTests/mergeTest.R0000644000176200001440000000260311472542406016730 0ustar liggesuserstest01 <- function() { f <- foreach(i=1:3, .packages='foo') %:% foreach(j=1:3, .packages='bar') checkEquals(sort(f$packages), c('bar', 'foo')) f <- foreach(i=1:3, .packages='foo') %:% foreach(j=1:3, .packages=c('bar', 'foo')) checkEquals(sort(f$packages), c('bar', 'foo')) f <- foreach(i=1:3, .packages='foo') %:% foreach(j=1:3, .packages=c('bar', 'baz')) checkEquals(sort(f$packages), c('bar', 'baz', 'foo')) f <- foreach(i=1:3, .packages='foo') %:% foreach(j=1:3) checkEquals(sort(f$packages), c('foo')) } test02 <- function() { f <- foreach(i=1:3, .export='foo') %:% foreach(j=1:3, .export='bar') checkEquals(sort(f$export), c('bar', 'foo')) f <- foreach(i=1:3, .export='foo') %:% foreach(j=1:3, .export=c('bar', 'foo')) checkEquals(sort(f$export), c('bar', 'foo')) f <- foreach(i=1:3, .export='foo') %:% foreach(j=1:3, .export=c('bar', 'baz')) checkEquals(sort(f$export), c('bar', 'baz', 'foo')) f <- foreach(i=1:3, .export='foo') %:% foreach(j=1:3) checkEquals(sort(f$export), c('foo')) f <- foreach(i=1:3, .noexport='foo') %:% foreach(j=1:3, .noexport=c('bar', 'foo')) checkEquals(sort(f$noexport), c('bar', 'foo')) f <- foreach(i=1:3, .noexport='foo') %:% foreach(j=1:3, .noexport=c('bar', 'baz')) checkEquals(sort(f$noexport), c('bar', 'baz', 'foo')) f <- foreach(i=1:3, .noexport='foo') %:% foreach(j=1:3) checkEquals(sort(f$noexport), c('foo')) } foreach/inst/unitTests/errorTest.R0000644000176200001440000000162011472542406016760 0ustar liggesuserstest01 <- function() { x <- 1:3 checkException(foreach(i=x) %do% if (i == 2) stop('error') else i) checkException( foreach(i=x, .errorhandling='stop') %do% if (i == 2) stop('error') else i) } test02 <- function() { x <- 1:3 actual <- foreach(i=x, .errorhandling='remove') %do% if (i == 2) stop('error') else i checkEquals(actual, list(1L, 3L)) actual <- foreach(i=x, .errorhandling='remove') %do% stop('remove') checkEquals(actual, list()) } test03 <- function() { x <- 1:3 actual <- foreach(i=x, .errorhandling='pass') %do% if (i == 2) stop('error') else i checkEquals(1L, actual[[1]]) checkTrue(inherits(actual[[2]], 'simpleError')) checkEquals(3L, actual[[3]]) } test04 <- function() { n <- 3 actual <- foreach(icount(n)) %:% foreach(icount(10), .errorhandling='remove') %do% stop('hello') checkEquals(actual, lapply(1:n, function(i) list())) } foreach/inst/unitTests/loadFactorTest.R0000644000176200001440000000071011472542406017704 0ustar liggesuserstest01 <- function() { x <- c(1,10, 100, 1000, 10000) y <- c(1,10, 100, 1000, 10000) d <- expand.grid(x=x, y=y) foreach (i=seq_along(d$x), .combine='c') %do% { r <- foreach(icount(10), .combine='c') %do% (3 + 8) foreach(i=seq_along(r)) %do% checkEquals(r[i], 11L) } foreach (i=seq_along(d$x), .combine='c') %do% { r <- foreach(icount(10), .combine='c') %dopar% (3 + 8) foreach(i=seq_along(r)) %do% checkEquals(r[i], 11L) } } foreach/inst/unitTests/nestedTest.R0000644000176200001440000000461011472542406017113 0ustar liggesusers# Test nesting of "%do% and %dopar% in 01, 02, 03, and 04. test01 <- function() { y <- foreach(j=seq(0,90,by=10), .combine='c', .packages='foreach') %do% { foreach(k=seq(1,10), .combine='c') %do% { (j+k) } } checkEquals(y,1:100) } test02 <- function() { y <- foreach(j=seq(0,90,by=10), .combine='c', .packages='foreach') %do% { foreach(k=seq(1,10), .combine='c') %dopar% { (j+k) } } checkEquals(y,1:100) } test03 <- function() { y <- foreach(j=seq(0,90,by=10), .combine='c', .packages='foreach') %dopar% { foreach(k=seq(1,10), .combine='c') %do% { (j+k) } } checkEquals(y,1:100) } test04 <- function() { y <- foreach(j=seq(0,90,by=10), .combine='c', .packages='foreach') %dopar% { foreach(k=seq(1,10), .combine='c') %dopar% { (j+k) } } checkEquals(y,1:100) } # test05 <- function() { # s <- getSleigh() # y <- eachWorker(s, eo=list(closure=TRUE), # function() { # library('foreach') # foreach(j=seq(0,90,by=10), .combine='c') %do% { # foreach(k=seq(1,10), .combine='c') %do% { # (j+k) # } # } # }) # wc <- workerCount(s) # checkEquals(length(y), wc) # foreach(i=1:wc) %do% checkEquals(y[[i]],1:100) # } # test06 <- function() { # s <- getSleigh() # y <- eachWorker(s, eo=list(closure=TRUE), # function() { # library('foreach') # foreach(j=seq(0,90,by=10), .combine='c') %do% { # foreach(k=seq(1,10), .combine='c') %dopar% { # (j+k) # } # } # }) # wc <- workerCount(s) # checkEquals(length(y), wc) # foreach(i=1:wc) %do% checkEquals(y[[i]],1:100) # } # test07 <- function() { # s <- getSleigh() # y <- eachWorker(s, eo=list(closure=TRUE), # function() { # library('foreach') # foreach(j=seq(0,90,by=10), .combine='c', .packages='foreach') %dopar% { # foreach(k=seq(1,10), .combine='c') %do% { # (j+k) # } # } # }) # wc <- workerCount(s) # checkEquals(length(y), wc) # foreach(i=1:wc) %do% checkEquals(y[[i]],1:100) # } foreach/inst/unitTests/combineTest.R0000644000176200001440000000245311472542406017250 0ustar liggesusers# test cbind and rbind via .combine option test01 <- function() { m <- matrix(rnorm(25 * 16), 25) x <- foreach(i=1:ncol(m), .combine='cbind') %do% m[,i] dimnames(x) <- NULL checkEquals(m, x) x <- foreach(i=1:ncol(m), .combine='cbind') %dopar% m[,i] dimnames(x) <- NULL checkEquals(m, x) x <- foreach(i=1:nrow(m), .combine='rbind') %do% m[i,] dimnames(x) <- NULL checkEquals(m, x) x <- foreach(i=1:nrow(m), .combine='rbind') %dopar% m[i,] dimnames(x) <- NULL checkEquals(m, x) } # test arithmetic operations via .combine option test02 <- function() { x <- rnorm(100) d <- foreach(i=x, .combine='+') %do% i checkEquals(d, sum(x)) d <- foreach(i=x, .combine='+') %dopar% i checkEquals(d, sum(x)) d <- foreach(i=x, .combine='*') %do% i checkEquals(d, prod(x)) d <- foreach(i=x, .combine='*') %dopar% i checkEquals(d, prod(x)) } test03 <- function() { x <- 1:10 adder <- function(...) { sum(...) } d <- foreach(i=x, .combine=adder, .multicombine=TRUE) %dopar% i checkEquals(d, sum(x)) d <- foreach(i=x, .combine=adder, .multicombine=FALSE) %dopar% i checkEquals(d, sum(x)) d <- foreach(i=x, .combine=adder, .multicombine=TRUE) %do% i checkEquals(d, sum(x)) d <- foreach(i=x, .combine=adder, .multicombine=FALSE) %do% i checkEquals(d, sum(x)) } foreach/inst/unitTests/stressTest.R0000644000176200001440000000042711472542406017156 0ustar liggesuserstest01 <- function() { m <- 1000 # number of vectors for (n in c(100, 1000, 4000, 10000)) { r <- foreach(x=irnorm(n, mean=1000, count=m), .combine='+') %dopar% sqrt(x) checkTrue(is.atomic(r)) checkTrue(inherits(r, 'numeric')) checkTrue(length(r) == n) } } foreach/inst/unitTests/packagesTest.R0000644000176200001440000000065711472542406017416 0ustar liggesusers# Try loading thye package splines and running a function from it. test01 <- function() { # First unload the package if it is already loaded. # eachWorker(getSleigh(), # function() { # pkg <- "package:splines" # if(pkg %in% search()) detach(pkg)}) d <- foreach(1:10, .packages='splines', .combine='c') %dopar% xyVector(c(1:3),c(4:6))[[1]] checkTrue(all(c(1:3)==d)) } foreach/inst/unitTests/foreachTest.R0000644000176200001440000000075311472542406017244 0ustar liggesuserstest01 <- function() { x <- 1:3 actual <- foreach(i=x) %do% i checkEquals(actual, as.list(x)) actual <- foreach(i=x, .combine='c') %do% i checkEquals(actual, x) } test02 <- function() { x <- 1:101 actual <- foreach(i=x, .combine='+') %dopar% i checkEquals(actual, sum(x)) } test03 <- function() { x <- 1:3 y <- 2:0 for (i in 1:3) { actual <- foreach(i=x, .combine='c', .inorder=TRUE) %dopar% { Sys.sleep(y[i]) i } checkEquals(actual, x) } } foreach/inst/unitTests/whenTest.R0000644000176200001440000000203611472542406016572 0ustar liggesuserstest01 <- function() { actual <- foreach(i=1:5) %:% when(i %% 2 == 1) %:% foreach(j=1:5) %:% when(j %% 2 == 1 && i != j) %do% c(i, j) expected <- list(list(c(1, 3), c(1, 5)), list(c(3, 1), c(3, 5)), list(c(5, 1), c(5, 3))) checkEquals(actual, expected) actual <- foreach(i=1:5, .combine='c') %:% when(i %% 2 == 1) %:% foreach(j=1:5) %:% when(j %% 2 == 1 && i != j) %do% c(i, j) expected <- list(c(1, 3), c(1, 5), c(3, 1), c(3, 5), c(5, 1), c(5, 3)) checkEquals(actual, expected) } test02 <- function() { qsort <- function(x) { n <- length(x) if (n == 0) { x } else { p <- sample(n, 1) smaller <- foreach(y=x[-p], .combine=c) %:% when(y <= x[p]) %do% y larger <- foreach(y=x[-p], .combine=c) %:% when(y > x[p]) %do% y c(qsort(smaller), x[p], qsort(larger)) } } x <- runif(100) a <- qsort(x) b <- sort(x) checkEquals(a, b) } foreach/inst/unitTests/runTestSuite.sh0000644000176200001440000000320211741344141017647 0ustar liggesusers#!/bin/sh LOGFILE=test.log R --vanilla --slave > ${LOGFILE} 2>&1 <<'EOF' library(foreach) library(RUnit) verbose <- as.logical(Sys.getenv('FOREACH_VERBOSE', 'FALSE')) method <- Sys.getenv('FOREACH_BACKEND', 'SEQ') if (method == 'SNOW') { cat('** Using SNOW backend\n') library(doSNOW) cl <- makeSOCKcluster(3) .Last <- function() { cat('shutting down SOCK cluster...\n') stopCluster(cl) cat('shutdown complete\n') } registerDoSNOW(cl) } else if (method == 'NWS') { cat('** Using NWS backend\n') library(doNWS) registerDoNWS() } else if (method == 'MC') { cat('** Using multicore backend\n') library(doMC) registerDoMC() } else if (method == 'SEQ') { cat('** Using sequential backend\n') registerDoSEQ() } else { stop('illegal backend specified: ', method) } options(warn=1) options(showWarnCalls=TRUE) cat('Starting test at', date(), '\n') cat(sprintf('doPar backend name: %s, version: %s\n', getDoParName(), getDoParVersion())) cat(sprintf('Running with %d worker(s)\n', getDoParWorkers())) tests <- c('foreachTest.R', 'errorTest.R', 'combineTest.R', 'iteratorTest.R', 'loadFactorTest.R', 'nestedTest.R', 'packagesTest.R', 'mergeTest.R', 'whenTest.R', 'stressTest.R') errcase <- list() for (f in tests) { cat('\nRunning test file:', f, '\n') t <- runTestFile(f) e <- getErrors(t) if (e$nErr + e$nFail > 0) { errcase <- c(errcase, t) print(t) } } if (length(errcase) == 0) { cat('*** Ran all tests successfully ***\n') } else { cat('!!! Encountered', length(errcase), 'problems !!!\n') for (t in errcase) { print(t) } } cat('Finished test at', date(), '\n') EOF foreach/tests/0000755000176200001440000000000013212617760013030 5ustar liggesusersforeach/tests/doRUnit.R0000644000176200001440000000634613212615543014545 0ustar liggesusers## unit tests will not be done if RUnit is not available if(require("RUnit", quietly=TRUE)) { ## --- Setup --- pkg <- "foreach" # <-- Change to package name! if(Sys.getenv("RCMDCHECK") == "FALSE") { ## Path to unit tests for standalone running under Makefile (not R CMD check) ## PKG/tests/../inst/unitTests path <- file.path(getwd(), "..", "inst", "unitTests") } else { ## Path to unit tests for R CMD check ## PKG.Rcheck/tests/../PKG/unitTests path <- system.file(package=pkg, "unitTests") } cat("\nRunning unit tests\n") print(list(pkg=pkg, getwd=getwd(), pathToUnitTests=path)) library(package=pkg, character.only=TRUE) ################################################################ ## BEGIN PACKAGE SPECIFIC CONFIGURATION # ################################################################ if (!identical(system.file("DESCRIPTION", package="doParallel") , "")){ library(doParallel) w <- makeCluster(2) .Last <- function(){ cat('shutting down cluster...\n') stopCluster(w) cat('shutdown complete\n') } registerDoParallel(cl=w) } else if (!identical(system.file("DESCRIPTION", package="doMC") , "")) { library(doMC) registerDoMC(2) } else { # default to sequential library(iterators) registerDoSEQ() } ################################################################ ## END PACKAGE SPECIFIC CONFIGURATION # ################################################################ ## If desired, load the name space to allow testing of private functions ## if (is.element(pkg, loadedNamespaces())) ## attach(loadNamespace(pkg), name=paste("namespace", pkg, sep=":"), pos=3) ## ## or simply call PKG:::myPrivateFunction() in tests ## --- Testing --- ## Define tests testSuite <- defineTestSuite(name=paste(pkg, "unit testing"), dirs=path, testFileRegexp = "^.+Test\\.R$") ## Run tests <- runTestSuite(testSuite) ## Default report name pathReport <- file.path(tempdir(), "report") ## Report to stdout and text files cat("------------------- UNIT TEST SUMMARY ---------------------\n\n") printTextProtocol(tests, showDetails=FALSE) printTextProtocol(tests, showDetails=FALSE, fileName=paste(pathReport, "Summary.txt", sep="")) printTextProtocol(tests, showDetails=TRUE, fileName=paste(pathReport, ".txt", sep="")) ## Report to HTML file printHTMLProtocol(tests, fileName=paste(pathReport, ".html", sep="")) # printHTMLProtocol(tests, fileName=file.path(dirname(dirname(getwd())),pkg,"gsDesign-RUnit-Test-Summary.html")) #paste(pathReport, ".html", sep="")) ## Return stop() to cause R CMD check stop in case of ## - failures i.e. FALSE to unit tests or ## - errors i.e. R errors tmp <- getErrors(tests) if(tmp$nFail > 0 | tmp$nErr > 0) { stop(paste("\n\nunit testing failed (#test failures: ", tmp$nFail, ", #R errors: ", tmp$nErr, ")\n\n", sep="")) } } else { warning("cannot run unit tests -- package RUnit is not available") } foreach/NAMESPACE0000644000176200001440000000211113024623260013071 0ustar liggesusersexport(foreach, when, times, "%do%", "%dopar%", "%:%", registerDoSEQ, getDoSeqRegistered, getDoSeqWorkers, getDoSeqName, getDoSeqVersion, setDoSeq, getDoParRegistered, getDoParWorkers, getDoParName, getDoParVersion, setDoPar, getResult, getErrorValue, getErrorIndex, accumulate, makeAccum, getexports) S3method("iter", "foreach") S3method("iter", "filteredforeach") S3method("iter", "xforeach") S3method("nextElem", "iforeach") S3method("nextElem", "ifilteredforeach") S3method("nextElem", "ixforeach") S3method("getResult", "iforeach") S3method("getResult", "ifilteredforeach") S3method("getResult", "ixforeach") S3method("getErrorValue", "iforeach") S3method("getErrorValue", "ifilteredforeach") S3method("getErrorValue", "ixforeach") S3method("getErrorIndex", "iforeach") S3method("getErrorIndex", "ifilteredforeach") S3method("getErrorIndex", "ixforeach") S3method("accumulate", "iforeach") S3method("accumulate", "ifilteredforeach") S3method("accumulate", "ixforeach") import(iterators) importFrom(codetools, "findGlobals") importFrom(utils, "packageDescription") foreach/demo/0000755000176200001440000000000013212617760012612 5ustar liggesusersforeach/demo/00Index0000644000176200001440000000006111472542406013741 0ustar liggesuserssincSEQ computation of the sinc function foreach/demo/sincSEQ.R0000644000176200001440000000161311472542406014243 0ustar liggesuserslibrary(foreach) # Define a function that creates an iterator that returns subvectors ivector <- function(x, chunks) { n <- length(x) i <- 1 nextEl <- function() { if (chunks <= 0 || n <= 0) stop('StopIteration') m <- ceiling(n / chunks) r <- seq(i, length=m) i <<- i + m n <<- n - m chunks <<- chunks - 1 x[r] } obj <- list(nextElem=nextEl) class(obj) <- c('abstractiter', 'iter') obj } # Define the coordinate grid and figure out how to split up the work x <- seq(-10, 10, by=0.1) cat('Running sequentially\n') ntasks <- 4 # Compute the value of the sinc function at each point in the grid z <- foreach(y=ivector(x, ntasks), .combine=cbind) %do% { y <- rep(y, each=length(x)) r <- sqrt(x ^ 2 + y ^ 2) matrix(10 * sin(r) / r, length(x)) } # Plot the results as a perspective plot persp(x, x, z, ylab='y', theta=30, phi=30, expand=0.5, col="lightblue") foreach/NEWS0000644000176200001440000000316413212615543012366 0ustar liggesusersNEWS/ChangeLog for foreach -------------------------- 1.4.4 2017-12-08 o Changed test report path for compliance with CRAN policies. o Removed startup message. o Changed seq(along=tags) call in makeAccum to seq(along.with=tags); request of Henrik Bengtsson. o Updated foreach help to describe effect of multiple arguments; request of David Winsemius. 1.4.3 2015-10-12 o Updated maintainer address 1.4.2 2014-04-10 o Unwound circular dependency chain with iterators package. 1.4.1 2013-05-29 o Improved handling of implicitly exported objects, courtesy of Steve Weston. 1.4.0 2012-04-11 o Removed spurious warning from getDoSEQ. Bug report from Ben Barnes. o Moved welcome message from .onLoad to .onAttach. Bug report from Benilton Carvalho. o Modified setDoPar and setDoSeq to undo changes to .foreachGlobals on error. Bug report from Benilton Carvalho. o Moved vignettes from inst/doc to vignettes. o Modified DESCRIPTION file by moving codetools, iterators, and utils from Depends to Imports. Bug report from Suraj Gupta. 1.3.5 2012-03-14 o Cleanup from previous patch. Bug report from Brian Ripley. 1.3.4 2012-03-12 o Added support for multiple sequential backends. (Idea and patch from Tyler Pirtle, Matt Furia, and Joseph Hellerstein.) o Modified doRUnit.R to use no more than two cores during R CMD check. 1.3.2 2011-05-08 o Regularized unit tests so they can run through R CMD check o Added support for compiler package of 2.13.0 and later. 1.3.1 2010-11-22 o First R-forge release. foreach/R/0000755000176200001440000000000013212617760012067 5ustar liggesusersforeach/R/acc.R0000644000176200001440000000177513024617205012745 0ustar liggesusers# # Copyright (c) Microsoft. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # makeAccum <- function(it) { # define and return the accumulator function that will be # passed to eachElem function(results, tags) { if (identical(it$error.handling, 'stop') && !is.null(it$state$errorValue)) return(invisible(NULL)) for (i in seq(along.with=tags)) { if (it$verbose) cat(sprintf('got results for task %d\n', tags[i])) accumulate(it, results[[i]], tags[i]) } } } foreach/R/foreach.R0000644000176200001440000004531113024617205013620 0ustar liggesusers# # Copyright (c) Microsoft. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # accumulate <- function(obj, result, tag, ...) { UseMethod('accumulate') } getResult <- function(obj, ...) { UseMethod('getResult') } getErrorValue <- function(obj, ...) { UseMethod('getErrorValue') } getErrorIndex <- function(obj, ...) { UseMethod('getErrorIndex') } defcombine <- function(a, ...) c(a, list(...)) foreach <- function(..., .combine, .init, .final=NULL, .inorder=TRUE, .multicombine=FALSE, .maxcombine=if (.multicombine) 100 else 2, .errorhandling=c('stop', 'remove', 'pass'), .packages=NULL, .export=NULL, .noexport=NULL, .verbose=FALSE) { if (missing(.combine)) { if (!missing(.init)) stop('if .init is specified, then .combine must also be specified') .combine <- defcombine hasInit <- TRUE init <- quote(list()) } else { .combine <- match.fun(.combine) if (missing(.init)) { hasInit <- FALSE init <- NULL } else { hasInit <- TRUE init <- substitute(.init) } } # .multicombine defaults to TRUE if the .combine function is known to # take multiple arguments if (missing(.multicombine) && (identical(.combine, cbind) || identical(.combine, rbind) || identical(.combine, c) || identical(.combine, defcombine))) .multicombine <- TRUE # sanity check the arguments if (!is.null(.final) && !is.function(.final)) stop('.final must be a function') if (!is.logical(.inorder) || length(.inorder) > 1) stop('.inorder must be a logical value') if (!is.logical(.multicombine) || length(.multicombine) > 1) stop('.multicombine must be a logical value') if (!is.numeric(.maxcombine) || length(.maxcombine) > 1 || .maxcombine < 2) stop('.maxcombine must be a numeric value >= 2') if (!is.character(.errorhandling)) stop('.errorhandling must be a character string') if (!is.null(.packages) && !is.character(.packages)) stop('.packages must be a character vector') if (!is.null(.export) && !is.character(.export)) stop('.export must be a character vector') if (!is.null(.noexport) && !is.character(.noexport)) stop('.noexport must be a character vector') if (!is.logical(.verbose) || length(.verbose) > 1) stop('.verbose must be a logical value') specified <- c('errorHandling', 'verbose') specified <- specified[c(!missing(.errorhandling), !missing(.verbose))] args <- substitute(list(...))[-1] if (length(args) == 0) stop('no iteration arguments specified') argnames <- names(args) if (is.null(argnames)) argnames <- rep('', length(args)) # check for backend-specific options options <- list() opts <- grep('^\\.options\\.[A-Za-z][A-Za-z]*$', argnames) if (length(opts) > 0) { # put the specified options objects into the options list for (i in opts) { bname <- substr(argnames[i], 10, 100) options[[bname]] <- list(...)[[i]] } # remove the specified options objects from args and argnames args <- args[-opts] argnames <- argnames[-opts] } # check for arguments that start with a '.', and issue an error, # assuming that these are misspelled options unrecog <- grep('^\\.', argnames) if (length(unrecog) > 0) stop(sprintf('unrecognized argument(s): %s', paste(argnames[unrecog], collapse=', '))) # check for use of old-style arguments, and issue an error oldargs <- c('COMBINE', 'INIT', 'INORDER', 'MULTICOMBINE', 'MAXCOMBINE', 'ERRORHANDLING', 'PACKAGES', 'VERBOSE', 'EXPORT', 'NOEXPORT', 'LOADFACTOR', 'CHUNKSIZE') oldused <- argnames %in% oldargs if (any(oldused)) stop(sprintf('old style argument(s) specified: %s', paste(argnames[oldused], collapse=', '))) .errorhandling <- match.arg(.errorhandling) combineInfo <- list(fun=.combine, in.order=.inorder, has.init=hasInit, init=init, final=.final, multi.combine=.multicombine, max.combine=.maxcombine) iterable <- list(args=args, argnames=argnames, evalenv=parent.frame(), specified=specified, combineInfo=combineInfo, errorHandling=.errorhandling, packages=.packages, export=.export, noexport=.noexport, options=options, verbose=.verbose) class(iterable) <- 'foreach' iterable } iter.foreach <- function(obj, ..., extra=list()) { # evaluate the quoted iteration variables, and turn them into iterators iargs <- lapply(obj$args, function(a) iter(eval(a, envir=extra, enclos=obj$evalenv), ...)) # create the environment that will contain our dynamic state state <- new.env(parent=emptyenv()) # iterator state state$stopped <- FALSE state$numValues <- 0L # number of values that we've fired # accumulator state combineInfo <- obj$combineInfo if (combineInfo$has.init) { state$accum <- eval(combineInfo$init, envir=extra, enclos=obj$evalenv) state$first.time <- FALSE } else { state$accum <- NULL state$first.time <- TRUE } state$fun <- combineInfo$fun state$buffered <- rep(as.integer(NA), 2 * combineInfo$max.combine) state$next.tag <- 1L # only used when in.order is TRUE state$buf.off <- 0L # only used when in.order is TRUE state$nbuf <- 0L # only used when in.order is FALSE state$numResults <- 0L # number of results that we've received back state$errorValue <- NULL state$errorIndex <- -1L # package and return the iterator object iterator <- list(state=state, iargs=iargs, argnames=obj$argnames, combineInfo=combineInfo, errorHandling=obj$errorHandling, verbose=obj$verbose) class(iterator) <- c('iforeach', 'iter') iterator } nextElem.iforeach <- function(obj, ..., redo=FALSE) { if (redo) obj$state$numValues <- obj$state$numValues - 1L tryCatch({ # XXX this shouldn't be recomputed repeatedly ix <- which(!nzchar(obj$argnames)) elem <- if (length(ix) > 0) { lapply(obj$iargs[ix], nextElem) ix <- which(nzchar(obj$argnames)) if (length(ix) > 0) lapply(obj$iargs[ix], nextElem) else list() } else { lapply(obj$iargs, nextElem) } }, error=function(e) { if (identical(conditionMessage(e), 'StopIteration')) { obj$state$stopped <- TRUE if (complete(obj)) callCombine(obj, TRUE) } stop(e) }) obj$state$numValues <- obj$state$numValues + 1L elem } # XXX make this a method? complete <- function(obj) { stopifnot(class(obj)[1] == 'iforeach') if (obj$verbose) cat(sprintf('numValues: %d, numResults: %d, stopped: %s\n', obj$state$numValues, obj$state$numResults, obj$state$stopped)) obj$state$stopped && obj$state$numResults == obj$state$numValues } accumulate.iforeach <- function(obj, result, tag, ...) { obj$state$numResults <- obj$state$numResults + 1L # we can't receive more results than the number of tasks that we've fired stopifnot(obj$state$numResults <= obj$state$numValues) if (inherits(result, 'error') && is.null(obj$state$errorValue) && obj$errorHandling %in% c('stop', 'remove')) { if (obj$verbose) cat('accumulate got an error result\n') obj$state$errorValue <- result obj$state$errorIndex <- tag } # we can already tell what our status is going to be status <- complete(obj) # put the result in our buffer cache name <- paste('result', tag, sep='.') assign(name, result, obj$state, inherits=FALSE) ibuf <- if (obj$combineInfo$in.order) { tag - obj$state$buf.off } else { obj$state$nbuf <- obj$state$nbuf + 1L } # make sure we always have trailing NA's blen <- length(obj$state$buffered) while (ibuf >= blen) { length(obj$state$buffered) <- 2 * blen blen <- length(obj$state$buffered) } obj$state$buffered[ibuf] <- if (inherits(result, 'error') && obj$errorHandling %in% c('stop', 'remove')) -tag else tag # do any combining that needs to be done callCombine(obj, status) # return with apprpriate status if (obj$verbose) cat(sprintf('returning status %s\n', status)) status } callCombine <- function(obj, status) { if (obj$combineInfo$in.order) { repeat { needed <- obj$combineInfo$max.combine if (!obj$state$first.time) needed <- needed - 1 n <- which(is.na(obj$state$buffered))[1] - 1L stopifnot(!is.na(n)) n <- min(n, needed) if (n == needed || (status && n > 0)) { # get the names of the objects to be combined ind <- 1:n # filter out any errors (if error handling isn't 'pass') b <- obj$state$buffered[ind] allsyms <- paste('result', abs(b), sep='.') args <- b[b > 0] args <- if (length(args) > 0) paste('result', args, sep='.') else character(0) # XXX these operations won't be efficient for small values of max.combine blen <- length(obj$state$buffered) obj$state$buffered <- obj$state$buffered[(n+1):blen] length(obj$state$buffered) <- blen # XXX put this off? obj$state$buf.off <- obj$state$buf.off + n # create the call object to call the combine function callobj <- if (obj$state$first.time) { if (length(args) > 0) { if (obj$verbose) cat('first call to combine function\n') # not always true obj$state$first.time <- FALSE if (length(args) > 1) as.call(lapply(c('fun', args), as.name)) else as.name(args) # this evaluates to the value of the result } else { if (obj$verbose) cat('not calling combine function due to errors\n') NULL } } else { if (length(args) > 0) { if (obj$verbose) cat('calling combine function\n') as.call(lapply(c('fun', 'accum', args), as.name)) } else { if (obj$verbose) cat('not calling combine function due to errors\n') NULL } } # call the combine function if (!is.null(callobj)) { if (obj$verbose) { cat('evaluating call object to combine results:\n ') print(callobj) } obj$state$accum <- eval(callobj, obj$state) } # remove objects from buffer cache that we just processed # and all error objects remove(list=allsyms, pos=obj$state) } else { break } } } else { needed <- obj$combineInfo$max.combine if (!obj$state$first.time) needed <- needed - 1 stopifnot(obj$state$nbuf <= needed) # check if it's time to combine if (obj$state$nbuf == needed || (status && obj$state$nbuf > 0)) { # get the names of the objects to be combined ind <- 1:obj$state$nbuf # filter out any errors (if error handling isn't 'pass') b <- obj$state$buffered[ind] allsyms <- paste('result', abs(b), sep='.') args <- b[b > 0] args <- if (length(args) > 0) paste('result', args, sep='.') else character(0) obj$state$buffered[ind] <- as.integer(NA) obj$state$nbuf <- 0L # create the call object to call the combine function callobj <- if (obj$state$first.time) { if (length(args) > 0) { if (obj$verbose) cat('first call to combine function\n') obj$state$first.time <- FALSE if (length(args) > 1) as.call(lapply(c('fun', args), as.name)) else as.name(args) # this evaluates to the value of the result } else { if (obj$verbose) cat('not calling combine function due to errors\n') NULL } } else { if (length(args) > 0) { if (obj$verbose) cat('calling combine function\n') as.call(lapply(c('fun', 'accum', args), as.name)) } else { if (obj$verbose) cat('not calling combine function due to errors\n') NULL } } # call the combine function if (!is.null(callobj)) { if (obj$verbose) { cat('evaluating call object to combine results:\n ') print(callobj) } obj$state$accum <- eval(callobj, obj$state) } # remove objects from buffer cache that we just processed remove(list=allsyms, pos=obj$state) } } } getResult.iforeach <- function(obj, ...) { if (is.null(obj$combineInfo$final)) obj$state$accum else obj$combineInfo$final(obj$state$accum) } getErrorValue.iforeach <- function(obj, ...) { obj$state$errorValue } getErrorIndex.iforeach <- function(obj, ...) { obj$state$errorIndex } '%:%' <- function(e1, e2) { if (!inherits(e1, 'foreach')) stop('"%:%" was passed an illegal right operand') if (inherits(e2, 'foreach')) makeMerged(e1, e2) else if (inherits(e2, 'foreachCondition')) makeFiltered(e1, e2) else stop('"%:%" was passed an illegal right operand') } makeMerged <- function(e1, e2) { specified <- union(e1$specified, e2$specified) argnames <- union(e1$argnames, e2$argnames) packages <- union(e1$packages, e2$packages) export <- union(e1$export, e2$export) noexport <- union(e1$noexport, e2$noexport) options <- c(e1$options, e2$options) iterable <- list(e1=e1, e2=e2, specified=specified, argnames=argnames, packages=packages, export=export, noexport=noexport, options=options) # this gives precedence to the outer foreach inherit <- c('errorHandling', 'verbose') iterable[inherit] <- e2[inherit] iterable[e1$specified] <- e1[e1$specified] class(iterable) <- c('xforeach', 'foreach') iterable } iter.xforeach <- function(obj, ...) { state <- new.env(parent=emptyenv()) state$stopped <- FALSE state$fired <- integer(0) state$ie2 <- list() state$errorValue <- NULL state$errorIndex <- -1L ie1 <- iter(obj$e1, ...) iterator <- list(state=state, ie1=ie1, e2=obj$e2, argnames=obj$argnames, errorHandling=obj$errorHandling, verbose=obj$verbose) class(iterator) <- c('ixforeach', 'iter') iterator } nextElem.ixforeach <- function(obj, ..., redo=FALSE) { if (obj$verbose) cat(sprintf('nextElem.ixforeach called with redo %s\n', redo)) if (redo) { i <- length(obj$state$fired) if (obj$verbose) { cat('refiring iterator - fired was:\n') print(obj$state$fired) } obj$state$fired[i] <- obj$state$fired[i] - 1L if (obj$verbose) { cat('fired is now:\n') print(obj$state$fired) } } repeat { if (!exists('nextval', obj$state, inherits=FALSE)) { tryCatch({ obj$state$nextval <- nextElem(obj$ie1) }, error=function(e) { if (identical(conditionMessage(e), 'StopIteration')) obj$state$stopped <- TRUE stop(e) }) obj$state$ie2 <- c(obj$state$ie2, list(iter(obj$e2, extra=obj$state$nextval))) obj$state$fired <- c(obj$state$fired, 0L) } tryCatch({ i <- length(obj$state$fired) v2 <- nextElem(obj$state$ie2[[i]], redo=redo) obj$state$fired[i] <- obj$state$fired[i] + 1L break }, error=function(e) { if (!identical(conditionMessage(e), 'StopIteration')) stop(e) remove('nextval', pos=obj$state) if (complete(obj$state$ie2[[i]])) { callCombine(obj$state$ie2[[i]], TRUE) if (is.null(obj$state$errorValue)) { obj$state$errorValue <- getErrorValue(obj$state$ie2[[i]]) obj$state$errorIndex <- getErrorIndex(obj$state$ie2[[i]]) } accum <- getResult(obj$state$ie2[[i]]) if (obj$verbose) { cat('propagating accumulated result up to the next level from nextElem\n') print(accum) } accumulate(obj$ie1, accum, i) # XXX error handling? } }) redo <- FALSE } c(obj$state$nextval, v2) } accumulate.ixforeach <- function(obj, result, tag, ...) { if (obj$verbose) { cat(sprintf('accumulating result with tag %d\n', tag)) cat('fired:\n') print(obj$state$fired) } s <- cumsum(obj$state$fired) j <- 1L while (tag > s[[j]]) j <- j + 1L i <- if (j > 1) as.integer(tag) - s[[j - 1]] else as.integer(tag) ie2 <- obj$state$ie2[[j]] if (accumulate(ie2, result, i)) { if (is.null(obj$state$errorValue)) { obj$state$errorValue <- getErrorValue(ie2) obj$state$errorIndex <- getErrorIndex(ie2) } accum <- getResult(ie2) if (obj$verbose) { cat('propagating accumulated result up to the next level from accumulate\n') print(accum) } accumulate(obj$ie1, accum, j) # XXX error handling? } } getResult.ixforeach <- function(obj, ...) { getResult(obj$ie1, ...) } getErrorValue.ixforeach <- function(obj, ...) { obj$state$errorValue } getErrorIndex.ixforeach <- function(obj, ...) { obj$state$errorIndex } '%if%' <- function(e1, cond) { stop('obsolete') } when <- function(cond) { obj <- list(qcond=substitute(cond), evalenv=parent.frame()) class(obj) <- 'foreachCondition' obj } makeFiltered <- function(e1, cond) { iterable <- c(list(e1=e1), cond) inherit <- c('argnames', 'specified', 'errorHandling', 'packages', 'export', 'noexport', 'options', 'verbose') iterable[inherit] <- e1[inherit] class(iterable) <- c('filteredforeach', 'foreach') iterable } iter.filteredforeach <- function(obj, ...) { ie1 <- iter(obj$e1, ...) iterator <- list(ie1=ie1, qcond=obj$qcond, evalenv=obj$evalenv, argnames=obj$argnames, errorHandling=obj$errorHandling, verbose=obj$verbose) class(iterator) <- c('ifilteredforeach', 'iter') iterator } nextElem.ifilteredforeach <- function(obj, ..., redo=FALSE) { repeat { elem <- nextElem(obj$ie1, ..., redo=redo) if (eval(obj$qcond, envir=elem, enclos=obj$evalenv)) break redo <- TRUE } elem } accumulate.ifilteredforeach <- function(obj, result, tag, ...) { accumulate(obj$ie1, result, tag, ...) } getResult.ifilteredforeach <- function(obj, ...) { getResult(obj$ie1, ...) } getErrorValue.ifilteredforeach <- function(obj, ...) { getErrorValue(obj$ie1, ...) } getErrorIndex.ifilteredforeach <- function(obj, ...) { getErrorIndex(obj$ie1, ...) } foreach/R/do.R0000644000176200001440000001624013024617205012612 0ustar liggesusers# # Copyright (c) Microsoft. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # .foreachGlobals <- new.env(parent=emptyenv()) # this is called to register a parallel backend setDoPar <- function(fun, data=NULL, info=function(data, item) NULL) { tryCatch( { assign('fun', fun, pos=.foreachGlobals, inherits=FALSE) assign('data', data, pos=.foreachGlobals, inherits=FALSE) assign('info', info, pos=.foreachGlobals, inherits=FALSE) }, error = function(e) { if (exists('fun', where=.foreachGlobals, inherits=FALSE)) remove('fun', envir=.foreachGlobals) if (exists('data', where=.foreachGlobals, inherits=FALSE)) remove('data', envir=.foreachGlobals) if (exists('info', where=.foreachGlobals, inherits=FALSE)) remove('info', envir=.foreachGlobals) e }) } # this is called to register a sequential backend setDoSeq <- function(fun, data=NULL, info=function(data, item) NULL) { tryCatch( { assign('seqFun', fun, pos=.foreachGlobals, inherits=FALSE) assign('seqData', data, pos=.foreachGlobals, inherits=FALSE) assign('seqInfo', info, pos=.foreachGlobals, inherits=FALSE) }, error = function(e) { if (exists('fun', where=.foreachGlobals, inherits=FALSE)) remove('fun', envir = .foreachGlobals) if (exists('data', where=.foreachGlobals, inherits=FALSE)) remove('data', envir = .foreachGlobals) if (exists('info', where=.foreachGlobals, inherits=FALSE)) remove('info', envir = .foreachGlobals) e }) } # this explicitly registers a sequential backend for do and dopar. registerDoSEQ <- function() { setDoPar(doSEQ, NULL, info) setDoSeq(doSEQ, NULL, info) } # passed to setDoPar via registerDoSEQ, and called by getDoSeqWorkers, etc info <- function(data, item) { switch(item, workers=1L, name='doSEQ', version=packageDescription('foreach', fields='Version'), NULL) } # this returns a logical value indicating if a sequential backend # has been registered or not getDoSeqRegistered <- function() { exists('seqFun', where=.foreachGlobals, inherits=FALSE) } # this returns a logical value indicating if a parallel backend # has been registered or not getDoParRegistered <- function() { exists('fun', where=.foreachGlobals, inherits=FALSE) } # this returns the number of workers used by the currently registered # sequential backend getDoSeqWorkers <- function() { wc <- if (exists('seqInfo', where=.foreachGlobals, inherits=FALSE)) .foreachGlobals$seqInfo(.foreachGlobals$seqData, 'workers') else NULL # interpret a NULL as a single worker, but the backend # can return NA without interference if (is.null(wc)) 1L else wc } # this returns the number of workers used by the currently registered # parallel backend getDoParWorkers <- function() { wc <- if (exists('info', where=.foreachGlobals, inherits=FALSE)) .foreachGlobals$info(.foreachGlobals$data, 'workers') else NULL # interpret a NULL as a single worker, but the backend # can return NA without interference if (is.null(wc)) 1L else wc } # this returns the name of the currently registered sequential backend getDoSeqName <- function() { if (exists('seqInfo', where=.foreachGlobals, inherits=FALSE)) .foreachGlobals$seqInfo(.foreachGlobals$seqData, 'name') else NULL } # this returns the name of the currently registered parallel backend getDoParName <- function() { if (exists('info', where=.foreachGlobals, inherits=FALSE)) .foreachGlobals$info(.foreachGlobals$data, 'name') else NULL } # this returns the version of the currently registered sequential backend getDoSeqVersion <- function() { if (exists('seqInfo', where=.foreachGlobals, inherits=FALSE)) .foreachGlobals$seqInfo(.foreachGlobals$seqData, 'version') else NULL } # this returns the version of the currently registered parallel backend getDoParVersion <- function() { if (exists('info', where=.foreachGlobals, inherits=FALSE)) .foreachGlobals$info(.foreachGlobals$data, 'version') else NULL } # used internally to get the currently registered parallel backend getDoSeq <- function() { if (exists('seqFun', where=.foreachGlobals, inherits=FALSE)) { list(fun=.foreachGlobals$seqFun, data=.foreachGlobals$seqdata) } else { list(fun=doSEQ, data=NULL) } } # used internally to get the currently registered parallel backend getDoPar <- function() { if (exists('fun', where=.foreachGlobals, inherits=FALSE)) { list(fun=.foreachGlobals$fun, data=.foreachGlobals$data) } else { if (!exists('parWarningIssued', where=.foreachGlobals, inherits=FALSE)) { warning('executing %dopar% sequentially: no parallel backend registered', call.=FALSE) assign('parWarningIssued', TRUE, pos=.foreachGlobals, inherits=FALSE) } list(fun=doSEQ, data=NULL) } } '%do%' <- function(obj, ex) { e <- getDoSeq() e$fun(obj, substitute(ex), parent.frame(), e$data) } '%dopar%' <- function(obj, ex) { e <- getDoPar() e$fun(obj, substitute(ex), parent.frame(), e$data) } comp <- if (getRversion() < "2.13.0") { function(expr, ...) expr } else { compiler::compile } doSEQ <- function(obj, expr, envir, data) { # note that the "data" argument isn't used if (!inherits(obj, 'foreach')) stop('obj must be a foreach object') it <- iter(obj) accumulator <- makeAccum(it) for (p in obj$packages) library(p, character.only=TRUE) # compile the expression if we're using R 2.13.0 or greater xpr <- comp(expr, env=envir, options=list(suppressUndefined=TRUE)) i <- 1 tryCatch({ repeat { # get the next set of arguments args <- nextElem(it) if (obj$verbose) { cat(sprintf('evaluation # %d:\n', i)) print(args) } # assign arguments to local environment for (a in names(args)) assign(a, args[[a]], pos=envir, inherits=FALSE) # evaluate the expression r <- tryCatch(eval(xpr, envir=envir), error=function(e) e) if (obj$verbose) { cat('result of evaluating expression:\n') print(r) } # process the results tryCatch(accumulator(list(r), i), error=function(e) { cat('error calling combine function:\n') print(e) NULL }) i <- i + 1 } }, error=function(e) { if (!identical(conditionMessage(e), 'StopIteration')) stop(simpleError(conditionMessage(e), expr)) }) errorValue <- getErrorValue(it) errorIndex <- getErrorIndex(it) if (identical(obj$errorHandling, 'stop') && !is.null(errorValue)) { msg <- sprintf('task %d failed - "%s"', errorIndex, conditionMessage(errorValue)) stop(simpleError(msg, call=expr)) } else { getResult(it) } } foreach/R/getsyms.R0000644000176200001440000000562113024617205013704 0ustar liggesusers# # Copyright (c) Microsoft. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # getsyms <- function(ex) { fun <- function(x) { if (is.symbol(x)) as.character(x) else if (is.call(x)) getsyms(x) else NULL } unlist(lapply(ex, fun)) } gather <- function(x) { fun <- function(a, b) unique(c(a, b)) accum <- list(good=character(0), bad=character(0)) for (e in x) { accum <- mapply(fun, e, accum, SIMPLIFY=FALSE) } accum } expandsyms <- function(syms, env, good, bad) { fun <- function(sym, good, bad) { if (sym %in% c(good, bad)) { # we already saw this symbol list(good=good, bad=bad) } else if (!nzchar(sym)) { # apparently a symbol can be converted into an empty string, # but it's an error to call "exists" with an empty string, # so we just declare it to be bad here list(good=good, bad=c(sym, bad)) } else if (exists(sym, env, mode='function', inherits=FALSE)) { # this is a function defined in this environment good <- c(sym, good) f <- get(sym, env, mode='function', inherits=FALSE) if (identical(environment(f), env)) { # it's a local function globs <- findGlobals(f) if (length(globs) > 0) { # it's got free variables, so let's check them out gather(lapply(globs, fun, good, bad)) } else { # it doesn't have free variables, so we're done list(good=good, bad=bad) } } else { # it's not a local function, so we're done list(good=good, bad=bad) } } else if (exists(sym, env, inherits=FALSE)) { # it's not a function, but it's defined in this environment list(good=c(sym, good), bad=bad) } else { # it's not defined in this environment list(good=good, bad=c(sym, bad)) } } gather(lapply(syms, fun, good, bad))$good } getexports <- function(ex, e, env, good=character(0), bad=character(0)) { syms <- getsyms(ex) syms <- expandsyms(syms, env, good, bad) for (s in syms) { if (s != '...') { val <- get(s, env, inherits=FALSE) # if this is a function, check if we should change the # enclosing environment to be this new environment fenv <- environment(val) if (is.function(val) && (identical(fenv, env) || identical(fenv, .GlobalEnv))) environment(val) <- e assign(s, val, e) } } invisible(NULL) } foreach/R/times.R0000644000176200001440000000151713024617205013332 0ustar liggesusers# # Copyright (c) Microsoft. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # a simple convenience function for use with %do% and %dopar% # inspired by Daniel Kaplan of Macalester College times <- function(n) { if (!is.numeric(n) || length(n) != 1) stop('n must be a numeric value') foreach(icount(n), .combine='c') } foreach/vignettes/0000755000176200001440000000000013212620533013666 5ustar liggesusersforeach/vignettes/nested.Rnw0000644000176200001440000003250011741344141015643 0ustar liggesusers% \VignetteIndexEntry{Nesting Foreach Loops} % \VignetteDepends{foreach} % \VignettePackage{foreach} \documentclass[12pt]{article} \usepackage{amsmath} \usepackage[pdftex]{graphicx} \usepackage{color} \usepackage{xspace} \usepackage{fancyvrb} \usepackage{fancyhdr} \usepackage[ colorlinks=true, linkcolor=blue, citecolor=blue, urlcolor=blue] {hyperref} \usepackage{lscape} \usepackage{Sweave} \usepackage{float} \floatstyle{plain} \newfloat{example}{thp}{lop} \floatname{example}{Example} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % define new colors for use \definecolor{darkgreen}{rgb}{0,0.6,0} \definecolor{darkred}{rgb}{0.6,0.0,0} \definecolor{lightbrown}{rgb}{1,0.9,0.8} \definecolor{brown}{rgb}{0.6,0.3,0.3} \definecolor{darkblue}{rgb}{0,0,0.8} \definecolor{darkmagenta}{rgb}{0.5,0,0.5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\bld}[1]{\mbox{\boldmath $#1$}} \newcommand{\shell}[1]{\mbox{$#1$}} \renewcommand{\vec}[1]{\mbox{\bf {#1}}} \newcommand{\ReallySmallSpacing}{\renewcommand{\baselinestretch}{.6}\Large\normalsize} \newcommand{\SmallSpacing}{\renewcommand{\baselinestretch}{1.1}\Large\normalsize} \newcommand{\halfs}{\frac{1}{2}} \setlength{\oddsidemargin}{-.25 truein} \setlength{\evensidemargin}{0truein} \setlength{\topmargin}{-0.2truein} \setlength{\textwidth}{7 truein} \setlength{\textheight}{8.5 truein} \setlength{\parindent}{0.20truein} \setlength{\parskip}{0.10truein} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagestyle{fancy} \lhead{} \chead{Nesting {\tt Foreach} Loops} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Nesting {\tt Foreach} Loops} \author{Steve Weston \\ doc@revolutionanalytics.com} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} <>= library(foreach) registerDoSEQ() @ The \texttt{foreach} package provides a looping construct for executing R code repeatedly. It is similar to the standard \texttt{for} loop, which makes it easy to convert a \texttt{for} loop to a \texttt{foreach} loop. Unlike many parallel programming packages for R, \texttt{foreach} doesn't require the body of the \texttt{for} loop to be turned into a function. \texttt{foreach} differs from a \texttt{for} loop in that its return is a list of values, whereas a \texttt{for} loop has no value and uses side effects to convey its result. Because of this, \texttt{foreach} loops have a few advantages over \texttt{for} loops when the purpose of the loop is to create a data structure such as a vector, list, or matrix: First, there is less code duplication, and hence, less chance for an error because the initialization of the vector or matrix is unnecessary. Second, a \texttt{foreach} loop may be easily parallelized by changing only a single keyword. \section{The nesting operator: \%:\%} An important feature of \texttt{foreach} is the \texttt{\%:\%} operator. I call this the {\em nesting} operator because it is used to create nested \texttt{foreach} loops. Like the \texttt{\%do\%} and \texttt{\%dopar\%} operators, it is a binary operator, but it operates on two \texttt{foreach} objects. It also returns a \texttt{foreach} object, which is essentially a special merger of its operands. Let's say that we want to perform a Monte Carlo simulation using a function called \texttt{sim}.\footnote{Remember that \texttt{sim} needs to be rather compute intensive to be worth executing in parallel.} The \texttt{sim} function takes two arguments, and we want to call it with all combinations of the values that are stored in the vectors \texttt{avec} and \texttt{bvec}. The following doubly-nested \texttt{for} loop does that. For testing purposes, the \texttt{sim} function is defined to return $10 a + b$:\footnote{Of course, an operation this trivial is not worth executing in parallel.} <>= sim <- function(a, b) 10 * a + b avec <- 1:2 bvec <- 1:4 @ <>= x <- matrix(0, length(avec), length(bvec)) for (j in 1:length(bvec)) { for (i in 1:length(avec)) { x[i,j] <- sim(avec[i], bvec[j]) } } x @ In this case, it makes sense to store the results in a matrix, so we create one of the proper size called \texttt{x}, and assign the return value of \texttt{sim} to the appropriate element of \texttt{x} each time through the inner loop. When using \texttt{foreach}, we don't create a matrix and assign values into it. Instead, the inner loop returns the columns of the result matrix as vectors, which are combined in the outer loop into a matrix. Here's how to do that using the \texttt{\%:\%} operator:\footnote{Due to operator precedence, you cannot put braces around the inner \texttt{foreach} loop. Unfortunately, that causes Sweave to format this example rather badly, in my opinion.} <>= x <- foreach(b=bvec, .combine='cbind') %:% foreach(a=avec, .combine='c') %do% { sim(a, b) } x @ This is structured very much like the nested \texttt{for} loop. The outer \texttt{foreach} is iterating over the values in ``bvec'', passing them to the inner \texttt{foreach}, which iterates over the values in ``avec'' for each value of ``bvec''. Thus, the ``sim'' function is called in the same way in both cases. The code is slightly cleaner in this version, and has the advantage of being easily parallelized. \section{Using \texttt{\%:\%} with \texttt{\%dopar\%}} When parallelizing nested \texttt{for} loops, there is always a question of which loop to parallelize. The standard advice is to parallelize the outer loop. This results in larger individual tasks, and larger tasks can often be performed more efficiently than smaller tasks. However, if the outer loop doesn't have many iterations and the tasks are already large, parallelizing the outer loop results in a small number of huge tasks, which may not allow you to use all of your processors, and can also result in load balancing problems. You could parallelize an inner loop instead, but that could be inefficient because you're repeatedly waiting for all the results to be returned every time through the outer loop. And if the tasks and number of iterations vary in size, then it's really hard to know which loop to parallelize. But in our Monte Carlo example, all of the tasks are completely independent of each other, and so they can all be executed in parallel. You really want to think of the loops as specifying a single stream of tasks. You just need to be careful to process all of the results correctly, depending on which iteration of the inner loop they came from. That is exactly what the \texttt{\%:\%} operator does: it turns multiple \texttt{foreach} loops into a single loop. That is why there is only one \texttt{\%do\%} operator in the example above. And when we parallelize that nested \texttt{foreach} loop by changing the \texttt{\%do\%} into a \texttt{\%dopar\%}, we are creating a single stream of tasks that can all be executed in parallel: <>= x <- foreach(b=bvec, .combine='cbind') %:% foreach(a=avec, .combine='c') %dopar% { sim(a, b) } x @ Of course, we'll actually only run as many tasks in parallel as we have processors, but the parallel backend takes care of all that. The point is that the \texttt{\%:\%} operator makes it easy to specify the stream of tasks to be executed, and the \texttt{.combine} argument to \texttt{foreach} allows us to specify how the results should be processed. The backend handles executing the tasks in parallel. \section{Chunking tasks} Of course, there has to be a snag to this somewhere. What if the tasks are quite small, so that you really might want to execute the entire inner loop as a single task? Well, small tasks are a problem even for a singly-nested loop. The solution to this problem, whether you have a single loop or nested loops, is to use {\em task chunking}. Task chunking allows you to send multiple tasks to the workers at once. This can be much more efficient, especially for short tasks. Currently, only the \texttt{doNWS} backend supports task chunking. Here's how it's done with \texttt{doNWS}: <>= opts <- list(chunkSize=2) x <- foreach(b=bvec, .combine='cbind', .options.nws=opts) %:% foreach(a=avec, .combine='c') %dopar% { sim(a, b) } x @ If you're not using \texttt{doNWS}, then this argument is ignored, which allows you to write code that is backend-independent. You can also specify options for multiple backends, and only the option list that matches the registered backend will be used. It would be nice if the chunk size could be picked automatically, but I haven't figured out a good, safe way to do that. So for now, you need to specify the chunk size manually.\footnote{In the future, the backend might decide that it will execute the tasks in parallel. That could be very useful when running on a cluster with multiprocessor nodes. Multiple tasks are sent across the network to each node, which then executes them in parallel on its cores. Maybe in the next release...} The point is that by using the \texttt{\%:\%} operator, you can convert a nested \texttt{for} loop to a nested \texttt{foreach} loop, use \texttt{\%dopar\%} to run in parallel, and then tune the size of the tasks using the ``chunkSize'' option so that they are big enough to be executed efficiently, but not so big that they cause load balancing problems. You don't have to worry about which loop to parallelize, because you're turning the nested loops into a single stream of tasks that can all be executed in parallel by the parallel backend. \section{Another example} Now let's imagine that the ``sim'' function returns a object that includes an error estimate. We want to return the result with the lowest error for each value of b, along with the arguments that generated that result. Here's how that might be done with nested \texttt{for} loops: <>= sim <- function(a, b) { x <- 10 * a + b err <- abs(a - b) list(x=x, err=err) } @ <>= n <- length(bvec) d <- data.frame(x=numeric(n), a=numeric(n), b=numeric(n), err=numeric(n)) for (j in 1:n) { err <- Inf best <- NULL for (i in 1:length(avec)) { obj <- sim(avec[i], bvec[j]) if (obj$err < err) { err <- obj$err best <- data.frame(x=obj$x, a=avec[i], b=bvec[j], err=obj$err) } } d[j,] <- best } d @ This is also quite simple to convert to \texttt{foreach}. We just need to supply the appropriate ``.combine'' functions. For the outer \texttt{foreach}, we can use the standard ``rbind'' function which can be used with data frames. For the inner \texttt{foreach}, we write a function that compares two data frames, each with a single row, returning the one with a smaller error estimate: <>= comb <- function(d1, d2) if (d1$err < d2$err) d1 else d2 @ Now we specify it with the ``.combine'' argument to the inner \texttt{foreach}: <>= opts <- list(chunkSize=2) d <- foreach(b=bvec, .combine='rbind', .options.nws=opts) %:% foreach(a=avec, .combine='comb', .inorder=FALSE) %dopar% { obj <- sim(a, b) data.frame(x=obj$x, a=a, b=b, err=obj$err) } d @ Note that since the order of the arguments to the ``comb'' function is unimportant, I have set the ``.inorder'' argument to \texttt{FALSE}. This reduces the number of results that need to be saved on the master before they can be combined in case they are returned out of order. But even with niceties such as parallelization, backend-specific options, and the ``.inorder'' argument, the nested \texttt{foreach} version is quite readable. But what if we would like to return the indices into ``avec'' and ``bvec'', rather than the data itself? A simple way to do that is to create a couple of counting iterators that we pass to the \texttt{foreach} functions:\footnote{It is very important that the call to icount is passed as the argument to \texttt{foreach}. If the iterators were created and passed to \texttt{foreach} using a variable, for example, we would not get the desired effect. This is not a bug or a limitation, but an important aspect of the design of the \texttt{foreach} function.} <>= library(iterators) opts <- list(chunkSize=2) d <- foreach(b=bvec, j=icount(), .combine='rbind', .options.nws=opts) %:% foreach(a=avec, i=icount(), .combine='comb', .inorder=FALSE) %dopar% { obj <- sim(a, b) data.frame(x=obj$x, i=i, j=j, err=obj$err) } d @ These new iterators are infinite iterators, but that's no problem since we have ``bvec'' and ``avec'' to control the number of iterations of the loops. Making them infinite means we don't have to keep them in sync with ``bvec'' and ``avec''. \section{Conclusion} Nested \texttt{for} loops are a common construct, and are often the most time consuming part of R scripts, so they are prime candidates for parallelization. The usual approach is to parallelize the outer loop, but as we've seen, that can lead to suboptimal performance due to an imbalance between the size and the number of tasks. By using the \texttt{\%:\%} operator with \texttt{foreach}, and by using chunking techniques, many of these problems can be overcome. The resulting code is often clearer and more readable than the original R code, since \texttt{foreach} was designed to deal with exactly this kind of problem. \end{document} foreach/vignettes/foreach.Rnw0000644000176200001440000004775711741344141016014 0ustar liggesusers% \VignetteIndexEntry{foreach Manual} % \VignetteDepends{foreach} % \VignettePackage{foreach} \documentclass[12pt]{article} \usepackage{amsmath} \usepackage[pdftex]{graphicx} \usepackage{color} \usepackage{xspace} \usepackage{fancyvrb} \usepackage{fancyhdr} \usepackage[ colorlinks=true, linkcolor=blue, citecolor=blue, urlcolor=blue] {hyperref} \usepackage{lscape} \usepackage{Sweave} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % define new colors for use \definecolor{darkgreen}{rgb}{0,0.6,0} \definecolor{darkred}{rgb}{0.6,0.0,0} \definecolor{lightbrown}{rgb}{1,0.9,0.8} \definecolor{brown}{rgb}{0.6,0.3,0.3} \definecolor{darkblue}{rgb}{0,0,0.8} \definecolor{darkmagenta}{rgb}{0.5,0,0.5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\bld}[1]{\mbox{\boldmath $#1$}} \newcommand{\shell}[1]{\mbox{$#1$}} \renewcommand{\vec}[1]{\mbox{\bf {#1}}} \newcommand{\ReallySmallSpacing}{\renewcommand{\baselinestretch}{.6}\Large\normalsize} \newcommand{\SmallSpacing}{\renewcommand{\baselinestretch}{1.1}\Large\normalsize} \newcommand{\halfs}{\frac{1}{2}} \setlength{\oddsidemargin}{-.25 truein} \setlength{\evensidemargin}{0truein} \setlength{\topmargin}{-0.2truein} \setlength{\textwidth}{7 truein} \setlength{\textheight}{8.5 truein} \setlength{\parindent}{0.20truein} \setlength{\parskip}{0.10truein} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagestyle{fancy} \lhead{} \chead{Using The {\tt foreach} Package} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Using The {\tt foreach} Package} \author{Steve Weston \\ doc@revolutionanalytics.com} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} One of R's most useful features is its interactive interpreter. This makes it very easy to learn and experiment with R. It allows you to use R like a calculator to perform arithmetic operations, display data sets, generate plots, and create models. Before too long, new R users will find a need to perform some operation repeatedly. Perhaps they want to run a simulation repeatedly in order to find the distribution of the results. Perhaps they need to execute a function with a variety a different arguments passed to it. Or maybe they need to create a model for many different data sets. Repeated executions can be done manually, but it becomes quite tedious to execute repeated operations, even with the use of command line editing. Fortunately, R is much more than an interactive calculator. It has its own built-in language that is intended to automate tedious tasks, such as repeatedly executing R calculations. R comes with various looping constructs that solve this problem. The \texttt{for} loop is one of the more common looping constructs, but the \texttt{repeat} and \texttt{while} statements are also quite useful. In addition, there is the family of ``apply'' functions, which includes \texttt{apply}, \texttt{lapply}, \texttt{sapply}, \texttt{eapply}, \texttt{mapply}, \texttt{rapply}, and others. The \texttt{foreach} package provides a new looping construct for executing R code repeatedly. With the bewildering variety of existing looping constructs, you may doubt that there is a need for yet another construct. The main reason for using the \texttt{foreach} package is that it supports {\em parallel execution}, that is, it can execute those repeated operations on multiple processors/cores on your computer, or on multiple nodes of a cluster. If each operation takes over a minute, and you want to execute it hundreds of times, the overall runtime can take hours. But using \texttt{foreach}, that operation can be executed in parallel on hundreds of processors on a cluster, reducing the execution time back down to minutes. But parallel execution is not the only reason for using the \texttt{foreach} package. There are other reasons that you might choose to use it to execute quick executing operations, as we will see later in the document. \section{Getting Started} Let's take a look at a simple example use of the \texttt{foreach} package. Assuming that you have the \texttt{foreach} package installed, you first need to load it: <>= library(foreach) @ Note that all of the packages that \texttt{foreach} depends on will be loaded as well. Now I can use \texttt{foreach} to execute the \texttt{sqrt} function repeatedly, passing it the values 1 through 3, and returning the results in a list, called \texttt{x}\footnote{Of course, \texttt{sqrt} is a vectorized function, so you would never really do this. But later, we'll see how to take advantage of vectorized functions with \texttt{foreach}.}: <>= x <- foreach(i=1:3) %do% sqrt(i) x @ This is a bit odd looking, because it looks vaguely like a \texttt{for} loop, but is implemented using a binary operator, called \texttt{\%do\%}. Also, unlike a \texttt{for} loop, it returns a value. This is quite important. The purpose of this statement is to compute the list of results. Generally, \texttt{foreach} with \texttt{\%do\%} is used to execute an R expression repeatedly, and return the results in some data structure or object, which is a list by default. You will note in the previous example that we used a variable \texttt{i} as the argument to the \texttt{sqrt} function. We specified the values of the \texttt{i} variable using a named argument to the \texttt{foreach} function. We could have called that variable anything we wanted, for example, \texttt{a}, or \texttt{b}. We could also specify other variables to be used in the R expression, as in the following example: <>= x <- foreach(a=1:3, b=rep(10, 3)) %do% (a + b) x @ Note that parentheses are needed here. We can also use braces: <>= x <- foreach(a=1:3, b=rep(10, 3)) %do% { a + b } x @ We call \texttt{a} and \texttt{b} the {\em iteration variables}, since those are the variables that are changing during the multiple executions. Note that we are iterating over them in parallel, that is, they are both changing at the same time. In this case, the same number of values are being specified for both iteration variables, but that need not be the case. If we only supplied two values for \texttt{b}, the result would be a list of length two, even if we specified a thousand values for \texttt{a}: <>= x <- foreach(a=1:1000, b=rep(10, 2)) %do% { a + b } x @ Note that you can put multiple statements between the braces, and you can use assignment statements to save intermediate values of computations. However, if you use an assignment as a way of communicating between the different executions of your loop, then your code won't work correctly in parallel, which we will discuss later. \section{The \texttt{.combine} Option} So far, all of our examples have returned a list of results. This is a good default, since a list can contain any R object. But sometimes we'd like the results to be returned in a numeric vector, for example. This can be done by using the \texttt{.combine} option to \texttt{foreach}: <>= x <- foreach(i=1:3, .combine='c') %do% exp(i) x @ The result is returned as a numeric vector, because the standard R \texttt{c} function is being used to concatenate all the results. Since the \texttt{exp} function returns numeric values, concatenating them with the \texttt{c} function will result in a numeric vector of length three. What if the R expression returns a vector, and we want to combine those vectors into a matrix? One way to do that is with the \texttt{cbind} function: <>= x <- foreach(i=1:4, .combine='cbind') %do% rnorm(4) x @ This generates four vectors of four random numbers, and combines them by column to produce a 4 by 4 matrix. We can also use the \texttt{"+"} or \texttt{"*"} functions to combine our results: <>= x <- foreach(i=1:4, .combine='+') %do% rnorm(4) x @ You can also specify a user-written function to combine the results. Here's an example that throws away the results: <>= cfun <- function(a, b) NULL x <- foreach(i=1:4, .combine='cfun') %do% rnorm(4) x @ Note that this \texttt{cfun} function takes two arguments. The \texttt{foreach} function knows that the functions \texttt{c}, \texttt{cbind}, and \texttt{rbind} take many arguments, and will call them with up to 100 arguments (by default) in order to improve performance. But if any other function is specified (such as \texttt{"+"}), it assumes that it only takes two arguments. If the function does allow many arguments, you can specify that using the \texttt{.multicombine} argument: <>= cfun <- function(...) NULL x <- foreach(i=1:4, .combine='cfun', .multicombine=TRUE) %do% rnorm(4) x @ If you want the combine function to be called with no more than 10 arguments, you can specify that using the \texttt{.maxcombine} option: <>= cfun <- function(...) NULL x <- foreach(i=1:4, .combine='cfun', .multicombine=TRUE, .maxcombine=10) %do% rnorm(4) x @ The \texttt{.inorder} option is used to specify whether the order in which the arguments are combined is important. The default value is \texttt{TRUE}, but if the combine function is \texttt{"+"}, you could specify \texttt{.inorder} to be \texttt{FALSE}. Actually, this option is important only when executing the R expression in parallel, since results are always computed in order when running sequentially. This is not necessarily true when executing in parallel, however. In fact, if the expressions take very different lengths of time to execute, the results could be returned in any order. Here's a contrived example, that executes the tasks in parallel to demonstrate the difference. The example uses the \texttt{Sys.sleep} function to cause the earlier tasks to take longer to execute: <>= foreach(i=4:1, .combine='c') %dopar% { Sys.sleep(3 * i) i } foreach(i=4:1, .combine='c', .inorder=FALSE) %dopar% { Sys.sleep(3 * i) i } @ The results of the first of these two examples is guaranteed to be the vector c(4, 3, 2, 1). The second example will return the same values, but they will probably be in a different order. \section{Iterators} The values for the iteration variables don't have to be specified with only vectors or lists. They can be specified with an {\em iterator}, many of which come with the \texttt{iterators} package. An iterator is an abstract source of data. A vector isn't itself an iterator, but the \texttt{foreach} function automatically creates an iterator from a vector, list, matrix, or data frame, for example. You can also create an iterator from a file or a data base query, which are natural sources of data. The \texttt{iterators} package supplies a function called \texttt{irnorm} which can return a specified number of random numbers for each time it is called. For example: <>= library(iterators) x <- foreach(a=irnorm(4, count=4), .combine='cbind') %do% a x @ This becomes useful when dealing with large amounts of data. Iterators allow the data to be generated on-the-fly, as it is needed by your operations, rather than requiring all of the data to be generated at the beginning. For example, let's say that we want to sum together a thousand random vectors: <>= set.seed(123) x <- foreach(a=irnorm(4, count=1000), .combine='+') %do% a x @ This uses very little memory, since it is equivalent to the following \texttt{while} loop: <>= set.seed(123) x <- numeric(4) i <- 0 while (i < 1000) { x <- x + rnorm(4) i <- i + 1 } x @ This could have been done using the \texttt{icount} function, which generates the values from one to 1000: <>= set.seed(123) x <- foreach(icount(1000), .combine='+') %do% rnorm(4) x @ but sometimes it's preferable to generate the actual data with the iterator (as we'll see later when we execute in parallel). In addition to introducing the \texttt{icount} function from the \texttt{iterators} package, the last example also used an unnamed argument to the \texttt{foreach} function. This can be useful when we're not intending to generate variable values, but only controlling the number of times that the R expression is executed. There's a lot more that I could say about iterators, but for now, let's move on to parallel execution. \section{Parallel Execution} Although \texttt{foreach} can be a useful construct in its own right, the real point of the \texttt{foreach} package is to do parallel computing. To make any of the previous examples run in parallel, all you have to do is to replace \texttt{\%do\%} with \texttt{\%dopar\%}. But for the kinds of quick running operations that we've been doing, there wouldn't be much point to executing them in parallel. Running many tiny tasks in parallel will usually take more time to execute than running them sequentially, and if it already runs fast, there's no motivation to make it run faster anyway. But if the operation that we're executing in parallel takes a minute or longer, there starts to be some motivation. \subsection{Parallel Random Forest} Let's take random forest as an example of an operation that can take a while to execute. Let's say our inputs are the matrix \texttt{x}, and the factor \texttt{y}: <>= x <- matrix(runif(500), 100) y <- gl(2, 50) @ We've already loaded the \texttt{foreach} package, but we'll also need to load the \texttt{randomForest} package: <>= library(randomForest) @ If we want want to create a random forest model with a 1000 trees, and our computer has four cores in it, we can split up the problem into four pieces by executing the \texttt{randomForest} function four times, with the \texttt{ntree} argument set to 250. Of course, we have to combine the resulting \texttt{randomForest} objects, but the \texttt{randomForest} package comes with a function called \texttt{combine} that does just that. Let's do that, but first, we'll do the work sequentially: <>= rf <- foreach(ntree=rep(250, 4), .combine=combine) %do% randomForest(x, y, ntree=ntree) rf @ To run this in parallel, we need to change \texttt{\%do\%}, but we also need to use another \texttt{foreach} option called \texttt{.packages} to tell the \texttt{foreach} package that the R expression needs to have the \texttt{randomForest} package loaded in order to execute successfully. Here's the parallel version: <>= rf <- foreach(ntree=rep(250, 4), .combine=combine, .packages='randomForest') %dopar% randomForest(x, y, ntree=ntree) rf @ If you've done any parallel computing, particularly on a cluster, you may wonder why I didn't have to do anything special to handle \texttt{x} and \texttt{y}. The reason is that the \texttt{\%dopar\%} function noticed that those variables were referenced, and that they were defined in the current environment. In that case \text{\%dopar\%} will automatically export them to the parallel execution workers once, and use them for all of the expression evaluations for that \texttt{foreach} execution. That is true for functions that are defined in the current environment as well, but in this case, the function is defined in a package, so we had to specify the package to load with the \texttt{.packages} option instead. \subsection{Parallel Apply} Now let's take a look at how to make a parallel version of the standard R \texttt{apply} function. The \texttt{apply} function is written in R, and although it's only about 100 lines of code, it's a bit difficult to understand on a first reading. However, it all really comes down two \texttt{for} loops, the slightly more complicated of which looks like: <>= applyKernel <- function(newX, FUN, d2, d.call, dn.call=NULL, ...) { ans <- vector("list", d2) for(i in 1:d2) { tmp <- FUN(array(newX[,i], d.call, dn.call), ...) if(!is.null(tmp)) ans[[i]] <- tmp } ans } applyKernel(matrix(1:16, 4), mean, 4, 4) @ I've turned this into a function, because otherwise, R will complain that I'm using ``...'' in an invalid context. This could be executed using \texttt{foreach} as follows: <>= applyKernel <- function(newX, FUN, d2, d.call, dn.call=NULL, ...) { foreach(i=1:d2) %dopar% FUN(array(newX[,i], d.call, dn.call), ...) } applyKernel(matrix(1:16, 4), mean, 4, 4) @ But this approach will cause the entire \texttt{newX} array to be sent to each of the parallel execution workers. Since each task needs only one column of the array, we'd like to avoid this extra data communication. One way to solve this problem is to use an iterator that iterates over the matrix by column: <>= applyKernel <- function(newX, FUN, d2, d.call, dn.call=NULL, ...) { foreach(x=iter(newX, by='col')) %dopar% FUN(array(x, d.call, dn.call), ...) } applyKernel(matrix(1:16, 4), mean, 4, 4) @ Now we're only sending any given column of the matrix to one parallel execution worker. But it would be even more efficient if we sent the matrix in bigger chunks. To do that, we use a function called \texttt{iblkcol} that returns an iterator that will return multiple columns of the original matrix. That means that the R expression will need to execute the user's function once for every column in its submatrix. <>= iblkcol <- function(a, chunks) { n <- ncol(a) i <- 1 nextElem <- function() { if (chunks <= 0 || n <= 0) stop('StopIteration') m <- ceiling(n / chunks) r <- seq(i, length=m) i <<- i + m n <<- n - m chunks <<- chunks - 1 a[,r, drop=FALSE] } structure(list(nextElem=nextElem), class=c('iblkcol', 'iter')) } nextElem.iblkcol <- function(obj) obj$nextElem() @ <>= applyKernel <- function(newX, FUN, d2, d.call, dn.call=NULL, ...) { foreach(x=iblkcol(newX, 3), .combine='c', .packages='foreach') %dopar% { foreach(i=1:ncol(x)) %do% FUN(array(x[,i], d.call, dn.call), ...) } } applyKernel(matrix(1:16, 4), mean, 4, 4) @ Note the use of the \texttt{\%do\%} inside the \texttt{\%dopar\%} to call the function on the columns of the submatrix \texttt{x}. Now that we're using \texttt{\%do\%} again, it makes sense for the iterator to be an index into the matrix \texttt{x}, since \texttt{\%do\%} doesn't need to copy \texttt{x} the way that \texttt{\%dopar\%} does. \section{List Comprehensions} If you're familar with the Python programming language, it may have occurred to you that the \texttt{foreach} package provides something that is not too different from Python's {\em list comprehensions}. In fact, the \texttt{foreach} package also includes a function called \texttt{when} which can prevent some of the evaluations from happening, very much like the ``if'' clause in Python's list comprehensions. For example, you could filter out negative values of an iterator using \texttt{when} as follows: <>= x <- foreach(a=irnorm(1, count=10), .combine='c') %:% when(a >= 0) %do% sqrt(a) x @ I won't say much on this topic, but I can't help showing how \texttt{foreach} with \texttt{when} can be used to write a simple quick sort function, in the classic Haskell fashion: <>= qsort <- function(x) { n <- length(x) if (n == 0) { x } else { p <- sample(n, 1) smaller <- foreach(y=x[-p], .combine=c) %:% when(y <= x[p]) %do% y larger <- foreach(y=x[-p], .combine=c) %:% when(y > x[p]) %do% y c(qsort(smaller), x[p], qsort(larger)) } } qsort(runif(12)) @ Not that I recommend this over the standard R \texttt{sort} function. But it's a pretty interesting example use of \texttt{foreach}. \section{Conclusion} Much of parallel computing comes to doing three things: splitting the problem into pieces, executing the pieces in parallel, and combining the results back together. Using the \texttt{foreach} package, the iterators help you to split the problem into pieces, the \texttt{\%dopar\%} function executes the pieces in parallel, and the specified \texttt{.combine} function puts the results back together. We've demonstrated how simple things can be done in parallel quite easily using the \texttt{foreach} package, and given some ideas about how more complex problems can be solved. But it's a fairly new package, and we will continue to work on ways of making it a more powerful system for doing parallel computing. \end{document} foreach/MD50000644000176200001440000000662413214055060012175 0ustar liggesusersa42f52bb7b8fe88b9df566a0923667b6 *DESCRIPTION 40a625f9c00c16cae197a17ae8cedc42 *NAMESPACE 676572e5505286cf2f81facfd3f08f71 *NEWS a7bd1616106d04fd03a94885b01042ff *R/acc.R afaad4ca2db59c1288057fc4313011e1 *R/do.R bf0e759668c8c949394fac6663d82b65 *R/foreach.R 9491666ee248849d5d62f4b6d3bae332 *R/getsyms.R 14e3d76b3f88d4c126c5c95592ad660c *R/times.R 62c3b5a350bc1ff83aa0ed5b8fcc5075 *build/vignette.rds caa28a573b448cbd60f22052c2bca7a3 *demo/00Index 515798525e9e08e68a66ab24df3d17a0 *demo/sincSEQ.R 114454e06e155812fbd7de0001ef5dc2 *inst/doc/foreach.R f8ac22a80a28c04f29ae2a88686d07b7 *inst/doc/foreach.Rnw a2b2e691c72df3fbd217ce0a64e688e2 *inst/doc/foreach.pdf 509eb035fb2bee0b47433e2a00960b50 *inst/doc/nested.R b58f77e7ee3b70d93050f5bb19502b5a *inst/doc/nested.Rnw b43ae3a52ffd513339ba2e20d2ff67cd *inst/doc/nested.pdf 3380c6bfe2789c1316d36c368d968bc1 *inst/examples/apply.R 500fc0fa2cb4b07b809e974bc99ba4b9 *inst/examples/bigmax.R 4549e5165479d323e9348b2d726de9da *inst/examples/bigmean.R 31be8c935f6fef084c3b9f69148d9d95 *inst/examples/bigmean2.R 20be562ced9134739ff69cbe09a20b7c *inst/examples/bootpar.R 53e2a90eb9cf9eb9f6a02f1658b87b7c *inst/examples/bootpar2.R 00f17395946b1090a308985cbca56515 *inst/examples/bootseq.R e0be352dcb9674bd2e97f522ae9a4bf6 *inst/examples/colMeans.R 40c1d5c69df84a9d96c21091999335bb *inst/examples/comprehensions.R 684705c4a63eeadc8cc37f25a2606269 *inst/examples/cross.R 4fb83e90b01ab5da4e25805cce489393 *inst/examples/feapply.R f99bbd4ecd00c5558e4c130c6b453161 *inst/examples/for.R dd6d1bd8f4bcc4555b900b9c00955c33 *inst/examples/germandata.txt b0684796a1576e974134f62b8fc5e6fc *inst/examples/isplit.R f0e946d73e7dea4c65dcd1d2754b7ad5 *inst/examples/matmul.R abf01cf248cf054f26c0a29ced984e8a *inst/examples/matmul2.R cadff38eb4c9fc2fa385d600e42046b3 *inst/examples/output.R acd652ebc9903fb4a039b09f3ac102a9 *inst/examples/pi.R 62900b80c46aa3fa40b69edef2e51291 *inst/examples/qsort.R 81fecace2a92963972db2adb2fc9fed7 *inst/examples/rf.R db5fcdbddb502aab39e82d17a10b0c1a *inst/examples/sinc.R 23d155b4116b87e6304a954d630371d3 *inst/examples/sinc2.R 4aaa9d9782f8d0b331e3dcc021bd9c14 *inst/examples/sqlite.R 80d22f8c75b2d99335d8f09c9c22dc34 *inst/examples/tuneRF.R 3d981a90b7471c26347ec0593ca55167 *inst/unitTests/combineTest.R bdc6faf27f9438670191fb0e9571bd01 *inst/unitTests/errorTest.R ff12ff3dd5c50845c81e15178de13b36 *inst/unitTests/foreachTest.R 1f4ee6f110624a1678ba8976ba7aec1d *inst/unitTests/iteratorTest.R c14fa871ff9d9fc719fdce467f0d717d *inst/unitTests/loadFactorTest.R 9321ccd8b46047e704893cab4c5c6795 *inst/unitTests/mergeTest.R e8cdce27b2b33bd51fcb021f9034d276 *inst/unitTests/nestedTest.R ddcfe0035e22f2d6c2f9e454b439cffa *inst/unitTests/packagesTest.R d96e58771409bee69f000df068219695 *inst/unitTests/runTestSuite.sh fb0831e84e6f8d7b062bc7d2c3cbd892 *inst/unitTests/stressTest.R 802149beb60028bba88d9206d6056118 *inst/unitTests/whenTest.R 3f8eb3a21cfa4ca1720d247a89dd671b *man/foreach-ext.Rd 6d93867afe82453e171d5dbea2814347 *man/foreach-package.Rd f4c5bd628cb087c3ff54fa420aa99e98 *man/foreach.Rd ccb36ea1d3b7a8df1b3507663fc2a8b8 *man/getDoParWorkers.Rd 649d347d1fc6c8bfcce655b70e7ff43d *man/getDoSeqWorkers.Rd 807d977bb241d21ac67742178d24c4e0 *man/registerDoSEQ.Rd a2b2665ab547a5ceb315dd36a5dcdffa *man/setDoPar.Rd 6c3efff477172db6a6b8ac789c125f74 *man/setDoSeq.Rd 74413bcadc07a504e78a298e5356f390 *tests/doRUnit.R f8ac22a80a28c04f29ae2a88686d07b7 *vignettes/foreach.Rnw b58f77e7ee3b70d93050f5bb19502b5a *vignettes/nested.Rnw foreach/build/0000755000176200001440000000000013212620533012755 5ustar liggesusersforeach/build/vignette.rds0000644000176200001440000000034513212620533015316 0ustar liggesusersu0E 0/+ 1ƅF`KZ q痃NLXt:s=PFK (Cx3?r @Kar5+xS=y]*;YݩIW}C!H/~~vܖ| ]C,LRa$ulZdBFވg4CVE`Md/(UU.)76~s0o'Eforeach/DESCRIPTION0000644000176200001440000000247713214055060013375 0ustar liggesusersPackage: foreach Type: Package Title: Provides Foreach Looping Construct for R Version: 1.4.4 Authors@R: c(person("Rich", "Calaway", role="cre", email="richcala@microsoft.com"), person("Microsoft", role=c("aut", "cph")), person("Steve", "Weston", role="aut")) Description: Support for the foreach looping construct. Foreach is an idiom that allows for iterating over elements in a collection, without the use of an explicit loop counter. This package in particular is intended to be used for its return value, rather than for its side effects. In that sense, it is similar to the standard lapply function, but doesn't require the evaluation of a function. Using foreach without side effects also facilitates executing the loop in parallel. Depends: R (>= 2.5.0) Imports: codetools, utils, iterators Suggests: randomForest Enhances: compiler, doMC, RUnit, doParallel License: Apache License (== 2.0) Author: Rich Calaway [cre], Microsoft [aut, cph], Steve Weston [aut] Maintainer: Rich Calaway Repository: CRAN Repository/R-Forge/Project: foreach Repository/R-Forge/Revision: 31 Repository/R-Forge/DateTimeStamp: 2017-12-08 23:08:19 Date/Publication: 2017-12-12 22:37:36 UTC NeedsCompilation: no Packaged: 2017-12-08 23:33:48 UTC; rforge foreach/man/0000755000176200001440000000000013212617760012441 5ustar liggesusersforeach/man/registerDoSEQ.Rd0000644000176200001440000000101111472542406015401 0ustar liggesusers\name{registerDoSEQ} \alias{registerDoSEQ} \title{registerDoSEQ} \description{ The \code{registerDoSEQ} function is used to explicitly register a sequential parallel backend with the foreach package. This will prevent a warning message from being issued if the \code{\%dopar\%} function is called and no parallel backend has been registered. } \usage{ registerDoSEQ() } \seealso{ \code{\link[doSNOW]{registerDoSNOW}} } \examples{ # specify that \%dopar\% should run sequentially registerDoSEQ() } \keyword{utilities} foreach/man/setDoSeq.Rd0000644000176200001440000000131311716316520014452 0ustar liggesusers\name{setDoSeq} \alias{setDoSeq} \title{setDoSeq} \description{ The \code{setDoSeq} function is used to register a sequential backend with the foreach package. This isn't normally executed by the user. Instead, packages that provide a sequential backend provide a function named \code{registerDoSeq} that calls \code{setDoSeq} using the appropriate arguments. } \usage{ setDoSeq(fun, data=NULL, info=function(data, item) NULL) } \arguments{ \item{fun}{A function that implements the functionality of \code{\%dopar\%}.} \item{data}{Data to be passed to the registered function.} \item{info}{Function that retrieves information about the backend.} } \seealso{ \code{\link{\%dopar\%}} } \keyword{utilities} foreach/man/getDoParWorkers.Rd0000644000176200001440000000237511472542406016021 0ustar liggesusers\name{getDoParWorkers} \alias{getDoParWorkers} \alias{getDoParRegistered} \alias{getDoParName} \alias{getDoParVersion} \title{Functions Providing Information on the doPar Backend} \description{ The \code{getDoParWorkers} function returns the number of execution workers there are in the currently registered doPar backend. It can be useful when determining how to split up the work to be executed in parallel. A \code{1} is returned by default. The \code{getDoParRegistered} function returns TRUE if a doPar backend has been registered, otherwise FALSE. The \code{getDoParName} function returns the name of the currently registered doPar backend. A \code{NULL} is returned if no backend is registered. The \code{getDoParVersion} function returns the version of the currently registered doPar backend. A \code{NULL} is returned if no backend is registered. } \usage{ getDoParWorkers() getDoParRegistered() getDoParName() getDoParVersion() } \examples{ cat(sprintf('\%s backend is registered\n', if(getDoParRegistered()) 'A' else 'No')) cat(sprintf('Running with \%d worker(s)\n', getDoParWorkers())) (name <- getDoParName()) (ver <- getDoParVersion()) if (getDoParRegistered()) cat(sprintf('Currently using \%s [\%s]\n', name, ver)) } \keyword{utilities} foreach/man/foreach-ext.Rd0000644000176200001440000000231711472542406015140 0ustar liggesusers\name{foreach-ext} \alias{foreach-ext} \alias{makeAccum} \alias{accumulate} \alias{getexports} \alias{getResult} \alias{getErrorValue} \alias{getErrorIndex} \title{Foreach Extension Functions} \description{ These functions are used to write parallel backends for the \code{foreach} package. They should not be used from normal scripts or packages that use the \code{foreach} package. } \usage{ makeAccum(it) accumulate(obj, result, tag, ...) getexports(ex, e, env, good=character(0), bad=character(0)) getResult(obj, \dots) getErrorValue(obj, \dots) getErrorIndex(obj, \dots) } \arguments{ \item{it}{foreach iterator.} \item{ex}{call object to analyze.} \item{e}{local environment of the call object.} \item{env}{exported environment in which call object will be evaluated.} \item{good}{names of symbols that are being exported.} \item{bad}{names of symbols that are not being exported.} \item{obj}{foreach iterator object.} \item{result}{task result to accumulate.} \item{tag}{tag of task result to accumulate.} \item{\dots}{unused.} } \note{ These functions are likely to change in future versions of the \code{foreach} package. When they become more stable, they will be documented. } \keyword{utilities} foreach/man/foreach-package.Rd0000644000176200001440000000264211472542406015734 0ustar liggesusers\name{foreach-package} \alias{foreach-package} \docType{package} \title{ The Foreach Package } \description{ The foreach package provides a new looping construct for executing R code repeatedly. The main reason for using the foreach package is that it supports parallel execution. The foreach package can be used with a variety of different parallel computing systems, include NetWorkSpaces and snow. In addition, foreach can be used with iterators, which allows the data to specified in a very flexible way. } \details{ Further information is available in the following help topics: \tabular{ll}{ \code{foreach} \tab Specify the variables to iterate over\cr \code{\%do\%} \tab Execute the R expression sequentially\cr \code{\%dopar\%} \tab Execute the R expression using the currently registered backend\cr } To see a tutorial introduction to the foreach package, use \code{vignette("foreach")}. To see a demo of foreach computing the sinc function, use \code{demo(sincSEQ)}. Some examples (in addition to those in the help pages) are included in the ``examples'' directory of the foreach package. To list the files in the examples directory, use \code{list.files(system.file("examples", package="foreach"))}. To run the bootstrap example, use \code{source(system.file("examples", "bootseq.R", package="foreach"))}. For a complete list of functions with individual help pages, use \code{library(help="foreach")}. } \keyword{package} foreach/man/setDoPar.Rd0000644000176200001440000000130411472542406014447 0ustar liggesusers\name{setDoPar} \alias{setDoPar} \title{setDoPar} \description{ The \code{setDoPar} function is used to register a parallel backend with the foreach package. This isn't normally executed by the user. Instead, packages that provide a parallel backend provide a function named \code{registerDoPar} that calls \code{setDoPar} using the appropriate arguments. } \usage{ setDoPar(fun, data=NULL, info=function(data, item) NULL) } \arguments{ \item{fun}{A function that implements the functionality of \code{\%dopar\%}.} \item{data}{Data to passed to the registered function.} \item{info}{Function that retrieves information about the backend.} } \seealso{ \code{\link{\%dopar\%}} } \keyword{utilities} foreach/man/foreach.Rd0000644000176200001440000001714613042437466014354 0ustar liggesusers\name{foreach} \alias{foreach} \alias{when} \alias{times} \alias{\%:\%} \alias{\%do\%} \alias{\%dopar\%} \title{foreach} \description{ \code{\%do\%} and \code{\%dopar\%} are binary operators that operate on a \code{foreach} object and an \code{R} expression. The expression, \code{ex}, is evaluated multiple times in an environment that is created by the \code{foreach} object, and that environment is modified for each evaluation as specified by the \code{foreach} object. \code{\%do\%} evaluates the expression sequentially, while \code{\%dopar\%} evalutes it in parallel. The results of evaluating \code{ex} are returned as a list by default, but this can be modified by means of the \code{.combine} argument. } \usage{ foreach(..., .combine, .init, .final=NULL, .inorder=TRUE, .multicombine=FALSE, .maxcombine=if (.multicombine) 100 else 2, .errorhandling=c('stop', 'remove', 'pass'), .packages=NULL, .export=NULL, .noexport=NULL, .verbose=FALSE) when(cond) e1 \%:\% e2 obj \%do\% ex obj \%dopar\% ex times(n) } \arguments{ \item{\dots}{one or more arguments that control how \code{ex} is evaluated. Named arguments specify the name and values of variables to be defined in the evaluation environment. An unnamed argument can be used to specify the number of times that \code{ex} should be evaluated. At least one argument must be specified in order to define the number of times \code{ex} should be executed. If multiple arguments are supplied, the number of times \code{ex} is evaluated is equal to the smallest number of iterations among the supplied arguments. See the examples.} \item{.combine}{function that is used to process the tasks results as they generated. This can be specified as either a function or a non-empty character string naming the function. Specifying 'c' is useful for concatenating the results into a vector, for example. The values 'cbind' and 'rbind' can combine vectors into a matrix. The values '+' and '*' can be used to process numeric data. By default, the results are returned in a list.} \item{.init}{initial value to pass as the first argument of the \code{.combine} function. This should not be specified unless \code{.combine} is also specified.} \item{.final}{function of one argument that is called to return final result.} \item{.inorder}{logical flag indicating whether the \code{.combine} function requires the task results to be combined in the same order that they were submitted. If the order is not important, then it setting \code{.inorder} to \code{FALSE} can give improved performance. The default value is \code{TRUE}.} \item{.multicombine}{logical flag indicating whether the \code{.combine} function can accept more than two arguments. If an arbitrary \code{.combine} function is specified, by default, that function will always be called with two arguments. If it can take more than two arguments, then setting \code{.multicombine} to \code{TRUE} could improve the performance. The default value is \code{FALSE} unless the \code{.combine} function is \code{cbind}, \code{rbind}, or \code{c}, which are known to take more than two arguments.} \item{.maxcombine}{maximum number of arguments to pass to the combine function. This is only relevant if \code{.multicombine} is \code{TRUE}.} \item{.errorhandling}{specifies how a task evalution error should be handled. If the value is "stop", then execution will be stopped via the \code{stop} function if an error occurs. If the value is "remove", the result for that task will not be returned, or passed to the \code{.combine} function. If it is "pass", then the error object generated by task evaluation will be included with the rest of the results. It is assumed that the combine function (if specified) will be able to deal with the error object. The default value is "stop".} \item{.packages}{character vector of packages that the tasks depend on. If \code{ex} requires a \code{R} package to be loaded, this option can be used to load that package on each of the workers. Ignored when used with \code{\%do\%}.} \item{.export}{character vector of variables to export. This can be useful when accessing a variable that isn't defined in the current environment. The default value in \code{NULL}.} \item{.noexport}{character vector of variables to exclude from exporting. This can be useful to prevent variables from being exported that aren't actually needed, perhaps because the symbol is used in a model formula. The default value in \code{NULL}.} \item{.verbose}{logical flag enabling verbose messages. This can be very useful for trouble shooting.} \item{obj}{\code{foreach} object used to control the evaluation of \code{ex}.} \item{e1}{\code{foreach} object to merge.} \item{e2}{\code{foreach} object to merge.} \item{ex}{the \code{R} expression to evaluate.} \item{cond}{condition to evaluate.} \item{n}{number of times to evaluate the \code{R} expression.} } \details{ The \code{foreach} and \code{\%do\%}/\code{\%dopar\%} operators provide a looping construct that can be viewed as a hybrid of the standard \code{for} loop and \code{lapply} function. It looks similar to the \code{for} loop, and it evaluates an expression, rather than a function (as in \code{lapply}), but it's purpose is to return a value (a list, by default), rather than to cause side-effects. This faciliates parallelization, but looks more natural to people that prefer \code{for} loops to \code{lapply}. The \code{\%:\%} operator is the \emph{nesting} operator, used for creating nested foreach loops. Type \code{vignette("nested")} at the R prompt for more details. Parallel computation depends upon a \emph{parallel backend} that must be registered before performing the computation. The parallel backends available will be system-specific, but include \code{doParallel}, which uses R's built-in \pkg{parallel} package. Each parallel backend has a specific registration function, such as \code{registerDoParallel}. The \code{times} function is a simple convenience function that calls \code{foreach}. It is useful for evaluating an \code{R} expression multiple times when there are no varying arguments. This can be convenient for resampling, for example. } \seealso{ \code{\link[iterators]{iter}} } \examples{ # equivalent to rnorm(3) times(3) \%do\% rnorm(1) # equivalent to lapply(1:3, sqrt) foreach(i=1:3) \%do\% sqrt(i) # multiple ... arguments foreach(i=1:4, j=1:10) \%do\% sqrt(i+j) # equivalent to colMeans(m) m <- matrix(rnorm(9), 3, 3) foreach(i=1:ncol(m), .combine=c) \%do\% mean(m[,i]) # normalize the rows of a matrix in parallel, with parenthesis used to # force proper operator precedence # Need to register a parallel backend before this example will run # in parallel foreach(i=1:nrow(m), .combine=rbind) \%dopar\% (m[i,] / mean(m[i,])) # simple (and inefficient) parallel matrix multiply library(iterators) a <- matrix(1:16, 4, 4) b <- t(a) foreach(b=iter(b, by='col'), .combine=cbind) \%dopar\% (a \%*\% b) # split a data frame by row, and put them back together again without # changing anything d <- data.frame(x=1:10, y=rnorm(10)) s <- foreach(d=iter(d, by='row'), .combine=rbind) \%dopar\% d identical(s, d) # a quick sort function qsort <- function(x) { n <- length(x) if (n == 0) { x } else { p <- sample(n, 1) smaller <- foreach(y=x[-p], .combine=c) \%:\% when(y <= x[p]) \%do\% y larger <- foreach(y=x[-p], .combine=c) \%:\% when(y > x[p]) \%do\% y c(qsort(smaller), x[p], qsort(larger)) } } qsort(runif(12)) } \keyword{utilities} foreach/man/getDoSeqWorkers.Rd0000644000176200001440000000224511716316520016020 0ustar liggesusers\name{getDoSeqWorkers} \alias{getDoSeqWorkers} \alias{getDoSeqRegistered} \alias{getDoSeqName} \alias{getDoSeqVersion} \title{Functions Providing Information on the doSeq Backend} \description{ The \code{getDoSeqWorkers} function returns the number of execution workers there are in the currently registered doSeq backend. A \code{1} is returned by default. The \code{getDoSeqRegistered} function returns TRUE if a doSeq backend has been registered, otherwise FALSE. The \code{getDoSeqName} function returns the name of the currently registered doSeq backend. A \code{NULL} is returned if no backend is registered. The \code{getDoSeqVersion} function returns the version of the currently registered doSeq backend. A \code{NULL} is returned if no backend is registered. } \usage{ getDoSeqWorkers() getDoSeqRegistered() getDoSeqName() getDoSeqVersion() } \examples{ cat(sprintf('\%s backend is registered\n', if(getDoSeqRegistered()) 'A' else 'No')) cat(sprintf('Running with \%d worker(s)\n', getDoSeqWorkers())) (name <- getDoSeqName()) (ver <- getDoSeqVersion()) if (getDoSeqRegistered()) cat(sprintf('Currently using \%s [\%s]\n', name, ver)) } \keyword{utilities}