doParallel/0000755000176200001440000000000013163221107012325 5ustar liggesusersdoParallel/inst/0000755000176200001440000000000013160055274013311 5ustar liggesusersdoParallel/inst/examples/0000755000176200001440000000000013160055076015127 5ustar liggesusersdoParallel/inst/examples/bootParallel.R0000644000176200001440000000471712154216423017700 0ustar liggesuserssuppressMessages(library(doParallel)) cl <- makePSOCKcluster(4) registerDoParallel(cl) cat(sprintf('doParallel %s\n', packageVersion('doParallel'))) junk <- matrix(0, 1000000, 8) cat(sprintf('Size of extra junk data: %d bytes\n', object.size(junk))) x <- iris[which(iris[,5] != "setosa"), c(1,5)] trials <- 10000 ptime <- system.time({ r <- foreach(icount(trials), .combine=cbind, .export='junk') %dopar% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] cat(sprintf('parallel foreach: %6.1f sec\n', ptime)) ptime2 <- system.time({ snowopts <- list(preschedule=TRUE) r <- foreach(icount(trials), .combine=cbind, .export='junk', .options.snow=snowopts) %dopar% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] cat(sprintf('parallel foreach with prescheduling: %6.1f sec\n', ptime2)) ptime3 <- system.time({ chunks <- getDoParWorkers() r <- foreach(n=idiv(trials, chunks=chunks), .combine=cbind, .export='junk') %dopar% { y <- lapply(seq_len(n), function(i) { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) }) do.call('cbind', y) } })[3] cat(sprintf('chunked parallel foreach: %6.1f sec\n', ptime3)) ptime4 <- system.time({ mkworker <- function(x, junk) { force(x) force(junk) function(i) { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } } y <- parLapply(cl, seq_len(trials), mkworker(x, junk)) r <- do.call('cbind', y) })[3] cat(sprintf('parLapply: %6.1f sec\n', ptime4)) stime <- system.time({ y <- lapply(seq_len(trials), function(i) { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) }) r <- do.call('cbind', y) })[3] cat(sprintf('sequential lapply: %6.1f sec\n', stime)) stime2 <- system.time({ r <- foreach(icount(trials), .combine=cbind) %do% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] cat(sprintf('sequential foreach: %6.1f sec\n', stime2)) stopCluster(cl) doParallel/inst/doc/0000755000176200001440000000000013160055274014056 5ustar liggesusersdoParallel/inst/doc/gettingstartedParallel.R0000644000176200001440000000375013160055274020713 0ustar liggesusers### R code from vignette source 'gettingstartedParallel.Rnw' ################################################### ### code chunk number 1: loadLibs ################################################### library(doParallel) cl <- makeCluster(2) registerDoParallel(cl) foreach(i=1:3) %dopar% sqrt(i) ################################################### ### code chunk number 2: gettingstartedParallel.Rnw:149-150 ################################################### stopCluster(cl) ################################################### ### code chunk number 3: gettingstartedParallel.Rnw:193-196 ################################################### library(doParallel) cl <- makeCluster(2) registerDoParallel(cl) ################################################### ### code chunk number 4: bootpar ################################################### x <- iris[which(iris[,5] != "setosa"), c(1,5)] trials <- 10000 ptime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %dopar% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] ptime ################################################### ### code chunk number 5: bootseq ################################################### stime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %do% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] stime ################################################### ### code chunk number 6: getDoParWorkers ################################################### getDoParWorkers() ################################################### ### code chunk number 7: getDoParName ################################################### getDoParName() getDoParVersion() ################################################### ### code chunk number 8: gettingstartedParallel.Rnw:274-275 ################################################### stopCluster(cl) doParallel/inst/doc/gettingstartedParallel.Rnw0000644000176200001440000003167012303167501021255 0ustar liggesusers% \VignetteIndexEntry{Getting Started with doParallel and foreach} % \VignetteDepends{doParallel} % \VignetteDepends{foreach} % \VignettePackage{doParallel} \documentclass[12pt]{article} \usepackage{amsmath} \usepackage[pdftex]{graphicx} \usepackage{color} \usepackage{xspace} \usepackage{url} \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{Getting Started with doParallel and foreach} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Getting Started with doParallel and foreach} \author{Steve Weston\footnote{Steve Weston wrote the original version of this vignette for the doMC package. Rich Calaway adapted the vignette for doParallel.} and Rich Calaway \\ doc@revolutionanalytics.com} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} The \texttt{doParallel} package is a ``parallel backend'' for the \texttt{foreach} package. It provides a mechanism needed to execute \texttt{foreach} loops in parallel. The \texttt{foreach} package must be used in conjunction with a package such as \texttt{doParallel} in order to execute code in parallel. The user must register a parallel backend to use, otherwise \texttt{foreach} will execute tasks sequentially, even when the \%dopar\% operator is used.\footnote{\texttt{foreach} will issue a warning that it is running sequentially if no parallel backend has been registered. It will only issue this warning once, however.} The \texttt{doParallel} package acts as an interface between \texttt{foreach} and the \texttt{parallel} package of R 2.14.0 and later. The \texttt{parallel} package is essentially a merger of the \texttt{multicore} package, which was written by Simon Urbanek, and the \texttt{snow} package, which was written by Luke Tierney and others. The \texttt{multicore} functionality supports multiple workers only on those operating systems that support the \texttt{fork} system call; this excludes Windows. By default, \texttt{doParallel} uses \texttt{multicore} functionality on Unix-like systems and \texttt{snow} functionality on Windows. Note that the \texttt{multicore} functionality only runs tasks on a single computer, not a cluster of computers. However, you can use the \texttt{snow} functionality to execute on a cluster, using Unix-like operating systems, Windows, or even a combination. It is pointless to use \texttt{doParallel} and \texttt{parallel} on a machine with only one processor with a single core. To get a speed improvement, it must run on a machine with multiple processors, multiple cores, or both. \section{A word of caution} Because the \texttt{parallel} package in \texttt{multicore} mode starts its workers using \texttt{fork} without doing a subsequent \texttt{exec}, it has some limitations. Some operations cannot be performed properly by forked processes. For example, connection objects very likely won't work. In some cases, this could cause an object to become corrupted, and the R session to crash. \section{Registering the \texttt{doParallel} parallel backend} To register \texttt{doParallel} to be used with \texttt{foreach}, you must call the \texttt{registerDoParallel} function. If you call this with no arguments, on Windows you will get three workers and on Unix-like systems you will get a number of workers equal to approximately half the number of cores on your system. You can also specify a cluster (as created by the \texttt{makeCluster} function) or a number of cores. The \texttt{cores} argument specifies the number of worker processes that \texttt{doParallel} will use to execute tasks, which will by default be equal to one-half the total number of cores on the machine. You don't need to specify a value for it, however. By default, \texttt{doParallel} will use the value of the ``cores'' option, as specified with the standard ``options'' function. If that isn't set, then \texttt{doParallel} will try to detect the number of cores, and use one-half that many workers. Remember: unless \texttt{registerDoMC} is called, \texttt{foreach} will {\em not} run in parallel. Simply loading the \texttt{doParallel} package is not enough. \section{An example \texttt{doParallel} session} Before we go any further, let's load \texttt{doParallel}, register it, and use it with \texttt{foreach}. We will use \texttt{snow}-like functionality in this vignette, so we start by loading the package and starting a cluster: <>= library(doParallel) cl <- makeCluster(2) registerDoParallel(cl) foreach(i=1:3) %dopar% sqrt(i) @ <>= stopCluster(cl) @ To use \texttt{multicore}-like functionality, we would specify the number of cores to use instead (but note that on Windows, attempting to use more than one core with \texttt{parallel} results in an error): \begin{verbatim} library(doParallel} registerDoParallel(cores=2) foreach(i=1:3) %dopar% sqrt(i) \end{verbatim} \begin{quote} Note well that this is {\em not} a practical use of \texttt{doParallel}. This is our ``Hello, world'' program for parallel computing. It tests that everything is installed and set up properly, but don't expect it to run faster than a sequential \texttt{for} loop, because it won't! \texttt{sqrt} executes far too quickly to be worth executing in parallel, even with a large number of iterations. With small tasks, the overhead of scheduling the task and returning the result can be greater than the time to execute the task itself, resulting in poor performance. In addition, this example doesn't make use of the vector capabilities of \texttt{sqrt}, which it must to get decent performance. This is just a test and a pedagogical example, {\em not} a benchmark. \end{quote} But returning to the point of this example, you can see that it is very simple to load \texttt{doParallel} with all of its dependencies (\texttt{foreach}, \texttt{iterators}, \texttt{parallel}, etc), and to register it. For the rest of the R session, whenever you execute \texttt{foreach} with \texttt{\%dopar\%}, the tasks will be executed using \texttt{doParallel} and \texttt{parallel}. Note that you can register a different parallel backend later, or deregister \texttt{doParallel} by registering the sequential backend by calling the \texttt{registerDoSEQ} function. \section{A more serious example} Now that we've gotten our feet wet, let's do something a bit less trivial. One good example is bootstrapping. Let's see how long it takes to run 10,000 bootstrap iterations in parallel on \Sexpr{getDoParWorkers()} cores: <>= library(doParallel) cl <- makeCluster(2) registerDoParallel(cl) @ <>= x <- iris[which(iris[,5] != "setosa"), c(1,5)] trials <- 10000 ptime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %dopar% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] ptime @ Using \texttt{doParallel} and \texttt{parallel} we were able to perform 10,000 bootstrap iterations in \Sexpr{ptime} seconds on \Sexpr{getDoParWorkers()} cores. By changing the \texttt{\%dopar\%} to \texttt{\%do\%}, we can run the same code sequentially to determine the performance improvement: <>= stime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %do% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] stime @ The sequential version ran in \Sexpr{stime} seconds, which means the speed up is about \Sexpr{round(stime / ptime, digits=1)} on \Sexpr{getDoParWorkers()} workers.\footnote{If you build this vignette yourself, you can see how well this problem runs on your hardware. None of the times are hardcoded in this document. You can also run the same example which is in the examples directory of the \texttt{doParallel} distribution.} Ideally, the speed up would be \Sexpr{getDoParWorkers()}, but no multicore CPUs are ideal, and neither are the operating systems and software that run on them. At any rate, this is a more realistic example that is worth executing in parallel. We do not explain what it's doing or how it works here. We just want to give you something more substantial than the \texttt{sqrt} example in case you want to run some benchmarks yourself. You can also run this example on a cluster by simply reregistering with a cluster object that specifies the nodes to use. (See the \texttt{makeCluster} help file for more details.) \section{Getting information about the parallel backend} To find out how many workers \texttt{foreach} is going to use, you can use the \texttt{getDoParWorkers} function: <>= getDoParWorkers() @ This is a useful sanity check that you're actually running in parallel. If you haven't registered a parallel backend, or if your machine only has one core, \texttt{getDoParWorkers} will return one. In either case, don't expect a speed improvement. \texttt{foreach} is clever, but it isn't magic. The \texttt{getDoParWorkers} function is also useful when you want the number of tasks to be equal to the number of workers. You may want to pass this value to an iterator constructor, for example. You can also get the name and version of the currently registered backend: <>= getDoParName() getDoParVersion() @ <>= stopCluster(cl) @ This is mostly useful for documentation purposes, or for checking that you have the most recent version of \texttt{doParallel}. \section{Specifying multicore options} When using \texttt{multicore}-like functionality, the \texttt{doParallel} package allows you to specify various options when running \texttt{foreach} that are supported by the underlying \texttt{mclapply} function: ``preschedule'', ``set.seed'', ``silent'', and ``cores''. You can learn about these options from the \texttt{mclapply} man page. They are set using the \texttt{foreach} \texttt{.options.multicore} argument. Here's an example of how to do that: \begin{verbatim} mcoptions <- list(preschedule=FALSE, set.seed=FALSE) foreach(i=1:3, .options.multicore=mcoptions) %dopar% sqrt(i) \end{verbatim} The ``cores'' options allows you to temporarily override the number of workers to use for a single \texttt{foreach} operation. This is more convenient than having to re-register \texttt{doParallel}. Although if no value of ``cores'' was specified when \texttt{doParallel} was registered, you can also change this value dynamically using the \texttt{options} function: \begin{verbatim} options(cores=2) getDoParWorkers() options(cores=3) getDoParWorkers() \end{verbatim} If you did specify the number of cores when registering \texttt{doParallel}, the ``cores'' option is ignored: \begin{verbatim} registerDoParallel(4) options(cores=2) getDoParWorkers() \end{verbatim} As you can see, there are a number of options for controlling the number of workers to use with \texttt{parallel}, but the default behaviour usually does what you want. \section{Stopping your cluster} If you are using \texttt{snow}-like functionality, you will want to stop your cluster when you are done using it. The \texttt{doParallel} package's \texttt{.onUnload} function will do this automatically if the cluster was created automatically by \texttt{registerDoParallel}, but if you created the cluster manually you should stop it using the \texttt{stopCluster} function: \begin{verbatim} stopCluster(cl) \end{verbatim} \section{Conclusion} The \texttt{doParallel} and \texttt{parallel} packages provide a nice, efficient parallel programming platform for multiprocessor/multicore computers running operating systems such as Linux and Mac OS X. It is very easy to install, and very easy to use. In short order, an average R programmer can start executing parallel programs, without any previous experience in parallel computing. \end{document} doParallel/inst/doc/gettingstartedParallel.pdf0000644000176200001440000044751513160055274021276 0ustar liggesusers%PDF-1.5 % 42 0 obj << /Length 2405 /Filter /FlateDecode >> stream xKo_A@Y{\,-"8CVmն(^Ce^;D ~.pٝ8*5 06(pM?#_r]sw'dtP6 5KL%4Se옒n&S|Tx8w AΑlΫۡ]Jo% Qr_ASՇWY1nȲ)Fq!.JlMgx<.wjɆa{2 ą|?d579h|DZ&QTLS ը%rpsK$2rEyQUQQb}=A'( r{s{bϝK*`3 Vis. 9[ {|:q[^ UF[J&5P6{k0& Vu<{M. r`($I49olj̓`(vtylW@F>M &8D?y pK:tR3  TZpw#-fJ wd2c6:^flBRY@Y4GaG,<=Sl6rbse.fF Є"eI$Rl IE2' XY_2PsbbpuTVa8FIBJ=C!f8j czyM$mdioʔdnQI #ACpÒ; jebD}ǒ,>o^pDe&|v!=EIn&͈7|x56~P-@7zgr# fϦ2e0դuӓ'Z:Q[W-oN~`0WM՞v@ʓ\W?XA0B>Ι [҇qRA|8rP|% .Y0KUJ8AxK M T 7V/|Bx$㩼ͿoGD]T]B/Tb> stream xڝYmo8_!,Xy$Eew{ksX,|pl9նRn3r4٢Dg3ϼHgW~={}~_ΌQ6;_g)TQNٺW039^7pບ wxv^0^m3[ 6|0kԙȺÉ->]g:?tf;.L/VL);ͼvޝL̦R~+_Al;c]O`f͉UxЭKx@xT͋B*}ݢ@#()+ D7)ҫ@܊'U~yPհ}8؉}t)4((nH.Q*}fs[)yH N|.q[`_*m)mĂiL5H2;  ͍SΕVk/[dӑ4m $&]za~!dہW :[M/pw۠|l؝X$>: DOaxK'ڒ-ƥ>L[S1Sa]YYoKp-?x"{Z[YcΏO%҅sYmrnIn;@E rK Zޑ}]:aLw8 nQomR9_R}#X0Fj֥\"#!<;t}"y!cpH"mxgy>xBXFr2 Á\*b%큚U%IGnTo cN02F`e@S[MA(]+mGQ|Vӯ}GA[~*hL,NQ|*.$A WFB\4. -tctc=X MHO`Ţ!z^7g:<[v]۱{FGS$Gi\61D>8-]ϛ!;1Wî1Sr3Imy>>C) dXHyu ["GS-c_ץļ)?a9ao =k/Zf5b+28^?#J!M>6r DQ-I=m-gKu}xF=f ""1fH.IRI +8)/*ם6n?ѓ©|R&M{Qf|4 )9 . W|bD{96 3ۑ-Mj8|LBⴇD3KZch!Xm5jTRNO9f"}EmȊK_2?ٟ&0ht[kKFLx>icA$B+1)*r 8 d'9/3e&;nI1 h\d( }Ttj4'^]LMh'1) Rm]?*cSj cKB7| !2%ɨR'4\͹XHj;bbFf'[5N[eˋO"( sYBTc?yH0*cH*Ś/Êr?R0 vбIy]t+$(TNPdo%!lǜG8"N>(MpL*)ѫn&McOt-ۨww л5mriaxtCo/QUkeǹ; L?x}d_0gp.́lm5?ACwe6`xӀ\wIF#ܹ$iNvG x}#aU9E M+08㑡~P#NvCP7Cg9a]k'A(,KˡDѠpӞӠp%}d;&j,teNGZS|ͽ-.YB>T:o{L$ 5 ?a&J#z1@̏^{^uOL狤w&%]LUv.RBf E,o־QO %4SCSS63E S*n c|}QWt'cß*|=2( endstream endobj 65 0 obj << /Length 2728 /Filter /FlateDecode >> stream xڝZs_d樉_$u&i2IDD|o.viN,~t1/w(ϝӓDMn*5u]Oi2|๝Όv/.iawNuE <~ Q5:/#a w7۫ 'N*5ϭ+'b'E>OfOEzv7Oɋcs};ôeVәS&S9T  C8xad繶մFLUf0#>wK ?m d(ڋ8ƙMˍ9۰Mu Ϋ{B)8uv :{^39rYwt 瑈4\ 91;^fOxZbIgI)\o7(9Lun̼ Ԓ%X'z`8xP4fL:aOK#@?tX;zxx1 Oo̔[2b&q1;p"=Ottġ}=2NA ~-.)Cvgf*U憶6<6#+xIfL*4$^':î<n-x7GF6Yma-@FCL+Wl|⓬ Bh#ԻO*9whTgJ ;%Y] zq D͜y6;D|k rZ,"54'I_<5,P;ٌi{0_gp6u!PГ $ !{ mc>vu pF;C)_ڌ˕KVf /oh 't2۽~EFd(RBJIXmqe$rD~מ6 KpҚ. mR#8+5XV&4^6ٲ ,E[^}{)`I Ab k 2/Bl c5 hbM#lҽ|sv]9k4WWܗDgDUVRt5`# 2?7)mgGt}K{Lh)Ķu19j_ċq_'j k_Sx<^ ;"Muն5Nrf+lvMuFܻ!i׍.$։U!y{O2̎oD.SMX$tƒ/p=|X=&ДEa%;jĆnEMI $;\(K*_ oQMR$"mcXsvhGCc:CY>ojm?Jr l8(M~f\'W/-W#(!bxM+~72|i>\"neh&+f1Qh2> stream xڕYK#ϯd?؀ 1ECȖgՒǃ'걓C(UŪ5iK͗7~ZSKnMJWU&yxӞvv˕w'nNh7<񴗁{oҕLw=0U#܅ɶCG׸~oo>XN,)mmHǛd%"y"cn~Iu|v`VTޤc(أ$HfyɲI-L8j!Tq9W}Ҋ<dJI߫I}͊uי]3e)c 29VUOhVi.N2)3:;PqrŢ-!825ԡ;Z_d՟e![WP@2 |,&*S}V6aUR~SXN5.:Yr2lav*栺f fkv!+5؈^,+T 0<3WgYBZi_\وRNQ4A- kv `Aq:Ȥ}X'ADt{t&+ʱec1pНwnkt_Q(+c=$~|Vjx&WJs.xMIZreCOW;l%l bVpP'zeZofl-]mDL.g2o qx%#44>k [G\D<5A)R)U{ zyӐʯ-DJDs%}?@cMtu₟ME4jv ;>gZPAMlSۇ{,aǗ[ҝIT:O/LĂ/I? D;xx!$ %qXǙS3Cs AȠ]g=8˲}'GHFA(MrK. TY(r#x%;%3 `Y(NoTz@Ϧ.SKiZ&f;Y0tjUVaڪLY}Q<$;Hqj4h C É"lxNTH8tEQ8 ȏ]"1aD{z8#A)yMNգer )U'/5=/6؜ Ø= XSd {v|~c[YJ:&j6sepf*lll8*de`1;HY QN<_[V驩,t$#' i@ES='5=L8~ A[8\ɟ/ L7ȠI<eaj;A/}0B B[k~?a'Ȼ8$TXv Cw$)(s>s|_Q!گln>4y&Ppy%^z.q6X n Jc- Q"H֥r;~ , ʋǟyrk;~:y\O6sB썦[\+W֪+I殄KدF=>MAI^* e1K(bZa^f B)`w̃ce8,窔ssQaU"5!yNw.J{ @x4unr\Eu(l-` ͖Dv BEy <Оog]A`W'}Z~}5-?{].R4Kxո%,c> stream xڵY[oF~  9ئbvacEEdHT\pHӎlH z;4ZGi?.{mȘvFWY&*mتOM731>xg̺RGi4{Q%9$-3~u#<lI7/<и?}m6ݩOAn!#u3XR72pJ&(U) 1b,ļHjctw"^i8 D]Ox<cY2aMiROBQ)jpD&2^ŢV{:5d LXfrZ" G=U;.u)x 3{8d 7^I׋)ү!2 ) N yS|ӓ< lCج*&'Vլ6S8=+h<1 ,Xh$^NtthsS{9z>EhiC3 Va _x, OGOMA>|"36VוmdX%*9d*< 6+R+Hor+s`[Ӓqqd?L+F3-3{5MW( ed璌Z9I_`"/EblUߣ/`6ӥat8>!wwp(@K<m6ʊ +(/7\cu~r`]PxЋW}/oYqVn8E8piw/=L*n? ⠈~xMRsPSܺ"~MsCᵈ/0\ڡ2qSC;B8*`#5)he)䩀\ aOQqy688* RU!ZQ+*vS} f6\pDaHfGf66`nt~PL~h07ΰ%eX3,~k )f PeuƵlOTɤ*+&)"msuOmKB 0~Dæ&&Zk&9J`TBT^$KOSRZd=im-ZN.xs^(#Џ6}.F*BKŻz wj_%)1YIy&ۗEzo]?^-Fr_8q)Iwt^<})[WFGouss@ gӇyI?J+D{U+FϦ&+WTI6$X 5N?ǩ endstream endobj 79 0 obj << /Length 1528 /Filter /FlateDecode >> stream xڝYD=GLgH<@U.8ۨI{kqֻxmF:z9fE#cT\ݬ"S*M'V%E,7871vH_quE䋻|-^ϓ+mlBd"`5}eߙA(7.;-H̢;FN[xn3Y,J +j5_$nreR]g7|ڃ-A/ q[aS ut*@]0  WZ%yԁҤyyA\@1ң^ 3zhHvM;(v'G~KK+,,r*[,:<4-D=ъ;DuF:dHDP$ʢ${ rN KP :VH :9h5C; j-<xK>&"FkLW}0*):.D|T6AInй%D,ҡS4#[*´j~܏QZ6J`6 XE]=[&ɝ0I_ߨvꝥ8IdrhQqase Y@ڛGʘz.-POE^6wq(AMISe :R[ن/HG ucGbtCN« *#~_=API^Dž 0#󜄫7DMKV2e RGg-[i{ax⒪:~ڈ,X%+ RJ |tǛ+'Iܼ&57nOCyRL!pɶ "RBr @Q KxKi=Ʃn|G|d:ec|fڧ3ϪVBwtoЕ]מYf ּ z-y, T7;QZpv^X/)Dy>º4~N ^{g~_zcS!QHuhQ~\|xPWi. 5O᫂ $a֒ nH)'Y凛PF_f{ <vһ?dh+ endstream endobj 93 0 obj << /Length1 1919 /Length2 12622 /Length3 0 /Length 13802 /Filter /FlateDecode >> stream xڍP-CN][ h<@` ᑙ3sUUk휵O5Td*Lb@3+3+?@BQ\ʎHEvǎHrv;! 2u}Irn67??++?Dg~;Pd9؃\$Vu@kN`a# frM]@vMm`ruuga`6savpcx]j ;=2@ḧT +˟u WSg` 6ٻA΀uY#OŸF_`cf;_ѿ657ws4[, +#hjon 55{%Ѻ)@ZL`:_;]]]gdvv {WIA;xY9hڃ@q^M,A.VVVn> 4b]@u?GG ?;"6w,d5,į 賾ʏ O :zCYddo'`cp;)>Xp9e4@ׂ;ërAnjYw#i7[??~S;_W庹n./U;'j b#E ]ͭ˟vߋf 8?-&6Vn?\R[ 0uv6Bd};u ?T `awp} ppF}\mX$Fǀg`׉]սjny9Xy<zq?+4]z)o0&f}Rp|J£,;L8kɺWƧ$vfUGms0ryٌ ]Tq+糜CDl\OT#lIBohE"Rh^D\{}L=QNx/e>_kk@RY|x$,&ү AKu 1Tl{C`80wVl4응{Ei[v9vrAO$U3R<`1yp3-~R0TLf=[F4_/;O g % i Δr;Z8ޢ΋\*4ߕ!uyY{l-vm7s#vUIQrs^Sr*[ZkU6*kn!GT2I?bv]n*?(|;)$Yls϶2wezQ\_3!0x?c p֭H_5χG)Zz]~iT3Di$5uM 5 WOc6B9fy&#Hyau}$. Z2vfu4cEmKɴg^Ȑ!Zж)|'Jsdr+5ޥ_iZ!Ñ7( O ^?} ]#SM",ʕZzLթUګ򩎍ȧ-MynwGl؉d?M3y8?u3 1iIq rԌ "YÞٶc#$|3m nUF?+Oπͱӭ%ٿLp9W)_}.kQ0C ,YG"FD6`yP' -*iŖe~_Iq6EaxYӰϛ(v`:I~%#0b_l9<+E5vHiL ˉakeN!%@͞5jV :g"{WW~UĆGZ'#+w?9R~hvw)j_r9}0X2i*15kLJ.Y\t;e6#0g/JiwR~e}DYOQ(<9M $*O !Y c<$aɌx J^jP? tR]*\h%|!QnI6AĪ)#7X >fܢ]92DrWp`#f.(Q9!Q a>El㱅u%YPelqσ;o ?5ɰMƜ^?!Qn#2Z͐[vuzF J?Ԝ2nɾ)(wL L>˽y(E@v)n8sS0IU\,"$ n{:2 2o Id8G^V#G@]FܺK$n> Zr'/Iņ|Uc;-e "R(vVܱtq俫5۷W*<2R )}\OA2reZ+FlQ[Ӗ ;~e:C@h*I /f *:߼Pr^Np-֫7J L N瀜K7dV [6ͺw'_7f>~tEqcm|lMj^}ň0T\"M.Sf LF}FB\ڸ*a[CoǠNk*-*%osqh]T!V1_)s"?˞FGOhN6g^VȮ'l1CZJSY用4 {Vjn(27 [0p T <ަV ;0QFmڧɉ7ApY`Ih,"$SS~ K&{W|ه/A^&&g 4YŃPfR=tU0=l 3'cz ͒MHG]J*s-2ˌ<>,,(5%47clMȤԧJFn7?C^YKɑ }U7RK3GBChaXowo||c7HCOxLJi4NRYQvˏ4s/!oǔoe3S}([ᦧ-X[Y,h;\.%,mlLmvðH>-F` @Q+Z"oq@ˌBOd'}i@3}!:p,frR^ 91y 횱[\HE *ؓ'yw ?X@@v&Hbh3 [aDni2F۬B>DLF#=''H<,SFTnUKM:}R=kzWqfwޤIU%dQ7ȓ1U&[,_g(zf!t絜oxStpo-qYS8o|/ !Whw=^YmاY5&ڜLC@1oR(#`֥F!]Lk0Jr@f5p>Wk5i5Gκ'EuJQ59MTW#:V6絧kV QeO`ܹg/NcGfK[qn}#iB#M\DmIXH VP$-X@1k}[ gCc o=$'Z2?FyHxA$^R,[㿰Ym!_ ,ğz5p<۝ 048=rI]\}+ޭ(c1k/HքmE7ʹ]f5hL[ ,D=8apvR=sJ !>jP%ȣ Цn+yc9C #kE QGkEILtÚVVInVRǙ[uo},C㭞5p}8HqC PvD~ }?~@]Ҩ_TiRx;m b7ؗg2=9*$yqϴm7/S% Us\E}m<#5{'G]6,"g=)Q 2雹oe7 DduT$;8$ ڒ .c@m:/6xr,xNXy:S}&gtDNr{)T B-RlfxI5`3ϫ#>m!Rlg8Xъ FwwVd74Zpؽ0櫙aU; tnqE^ny'*jlC9qeP&fG* M_;4ztAIJDS0 P4ҷn L 7C W0DzU~ xd,&uw׽A#-1]3V&&Cųm>G~C;\犆JQ&7vaK'#GO)KaMfW-O#IW;7=\5橵F.ұa[MFt',QLjV?ӊdR:^,!ia'R1Qpq^_:Z(}3;X84)%6倗~69EK,bҙ}6'=hFMQEO%a}~bi~;f`ŐOz02Bm!&[\·O= N0O>WkjUI'.ފ]Չ$(YHKYĞ}@.^eIx6o~b~Ⱦ9(5w !)%h^|¹RH _..1Mէs'c'X[~ wy6Zc2%XTȐ:Ģ^'kĊ(Uwa< 4{Ś@@x[p~(- 7v %뺸&=9?>(-HU7!HH?+]# 󇈉EREɛ!KD*|c/6Ju^%В >wp@8窨Gt j ηb%S?)::"*~ ;0|L)*C`z Rpr{qmGh#ږ$n֐Fqw:ATX) t'HKQI5x Ca3C*PA/̑9}}6 IDձvlZ.=a(8lxu̬z׆Fӂ ocșoƈ kL|fWp|kiJ@PV5Ƨ;;RKi18c.PE"XTo')lj|ηcc[$ ID-l+,R6@.(ovk>4ŧny4ί.x7hiSh"v+;Y >'}yƣ:c&eBAieQ[:=|x*7|cyhKQGiEM3]ζkR%'g֦WWz9$#,*CA݀JIrĴ$G6c~>)U!ƙ")}mtۦ5>vYw.*vg 5ݩnIAG= ʼngDBh(U#xg$uh2"Y30uڷGlbB?nTdJt{vqxLW:B%䌱&sS C0DzP;FB/Ϩr1Ywn (dˋE3j.ӆ7ĭ@h&yWO_}9"\e TYWe WeӜQi2jWvqЄrF+1r?4ނevm46aR;mT6)">{mYvuVKe;{~XM7/>Ҡw,4\3"_uvf ֥`})%÷g/vE9bj|#;m+TSgאkϹyL@.OI{jyqHZR (MrrAUnM" r5KɉܝiQ.j9)97M*D~EZqH{ӵ`͝ d-Յv^b]z\xX[ekC>,ׇaUD*??;uDJ0VjH~, |]!c076 &tܕZ?_y eSJ V$gufxnKMSJ^Zdi3 _I;;?UTCؘ֯%ߠ".m:$ɓ?-Ӥ*REAÉR<5xnfwGٰQ NCE tIzȗZwT5I9kMsAy%Qݍ61񭸔4H$rm\ RC#V&Q0lt5qDnY\ήx~0xUC%uE:SlOP}&ϲӸ)i^yWe0H:O   93o!v-Hc rvQtp{C'e35R [1ȄG,l(z-x niũl/әǹ z)kQ䇠u &BO m ʧ܊(jVj".j._SnRw|20eBDnYzrqc{; 覾7JKɯyc畕QXTG4k%DB+ygC/sWn>!&F0`wR =_1*1ZF%`7ۧa}Aig7v'L:t[V,m< 5&'ܡ*[:qNV4QشnޥЗ)>iË 3^K6{2{0`2D蜭JMbCKܘe`ͭ'1/BE'` \ gH}0OqoGFՠ -d'vxp=M#%j]NQZDC̺C3$eߦ(*QtE݌8tL8ЋJрOOH6^E߅2~ځj X#Θ!n$= ;`\SI$ CWО#ўF0y<~{~/_{9z|eՃ[re9?1?EJ^?E6%u2_ԍyp͎?#:ͬilgQt]g3WMfd.I6NbO5UO@`{?SX6FX/KD^XS8>rgC`DZ%uؽl>z(B"W͚e5b9Ջ]b=D]<1*tYu+iy樾T߁A`٬5{>;I+ mPʧ2 mT?J|qQ%R([91E @ɟ4+J|V#DX5t7?]WkQQw2:ⷫ|x:Nf?+"C48hu ej\l},xh < ׁY)p*ҚͫI, @󵏇m.L'FhFD%3ǫp+f%= u> \#hnrB&lS ʣ63.h|I[(sف(G>WVn(FzS5Zj#J2`yq#$Pu{{;wd:)ajQ]5@vㅟ "Cå>"}܀@oqj$Ars o\Q;v:3ʶN7 EOwwCӾj.Omr&TRRs4;\LsZLF % {rۦ"im16)'Ʋj`֏Y␈~Va[Q"ghI޵{W rE*ip ƍe\Ɣ1ΨFVj*WEbXÒ6𛗈# <"VQ+Fr{GB77D;5Rtb @^9*QSSi1M1n$+.$|!~nͨA[|1Gtk֛k YcQwr{q<6R$1S-DǤDՆWVKDRsXMK'3C6?-ǜxVϮ[9J}t]r9vD,]gPBAR畃?1c4@K}Ni9Ͼmkc8Z+Ǭ@u`mO!CA!rag?|FGsK(L8m3t8YbNh,Eӏ'aN$yCOpx`8)lB2VXT #ԋ`VF׸|ăݞ,ӡCaW8 9q>c)K>vkܱwr2JwɑJUqU l#F~R l>v_P)ڗfa>29V 1~4) (pZvАR/8l Z墤{wXʴIJnS=$s1@ex՗|Hg(2 *\h`8G!]AL ^!AvV[LbWդ95b"=W`7&oa0d]iTaT7(?;b?ݚK,.bfўWL=?n_J0#Wޜ]*Re-]͘ocy06*G̦wst7͓FW1uH@X*Uc7R9b;K8'jNz?ݤ9!֒8MK#RW2 sԷň1l qBs~ML$^\$W~|ͩ*XRmets+aS_Np`\ 누)DP#հRv021Gu]V4뻋| lnƀy&"MoB%'ѪBN9A4ƝFXLwux Ӣѩ_p'.{zj4!䉷R YȂeyJH&S.lCuګ%c`9w RwQ /46vv ?Y9&g SY119laz* 7tZDn c,Z'~B]̸Ǚzi@z_u/2(u,(>1?#z>z~\ TỤрAzk{$)2wX08eb(,?;灎?hN?skvP&(~1gsd{?1۠ySh7ZWplls5g>#2X{j\iD$&l9ZȞb+X_̝R1+$ = JK Y5JDZAi$X u2 'yՆxȲqbWL:R햒4*ɊX% F !1"G0m3x&KzQ?6fO7bڦ]'Zj!x &K[~¼C:B2vExq\_KԬyh)dgLm6`FjV񳠼>l_f.V+|@HA:3tp|^{Hu |X3|ImDE7ZOS! ܏C<ւբkZfm|gk-G4700юK('6&M*7[6|* ćTdVz8@Z*4fonT >9$d0J&> stream xڍP[Ӯ{РAwwwwwgN݃[pNpwn-߻9Ef@?s~_x/`nǍrpE0IF'qC\LFgQ޳hCFzz4i1 $&{:!;_.]Ϳ]?>k  xF22{PPP]]ǟ_ eNs߻84EX3 nF;?CJM D]x+4܃-Nu#LuR֚l2ۆ85X{?<>ОFg29.\Jyn}VBw9d˦գgsMpH` h/Qfongп|#E9f-`y\Pcq%!A9H^*)\Xto+$.e%J%[:ɼ4P[БD0ù3\dV:{`sS]hJpvf` 3n OA t8D&P#*ݲk3qW#Vt/{eOeÅB,ڂ~[›ɏ\KVqP /R*f/6*J=/ ٤%{w#=4*bwN"DBonE 04.*Ec68strRL(۞7!=Uq%m=UFW&-FNY$/{潤(V؋[/ɟC )u-ui O=s$}vU Jݱ&O&^BcîNG]GMegz 7Gqk x.q0=O-%0 J5R_sE'L,G-iddܼܧHd 7 įndov|)SF|YLpio|mM-/~W54d ^s&c!@&u^s+1\;[Fˑ(|. mU/\Y75sC8kJHpںǦJax'ݚWss`4iJ^A6SWW/uy^7tV\;,imYUYan:lY/pQB*Y^E*i%22NJf .Yp  EIg؝n|K/Y6=ʧ޸L &bRԻ\I!XFح#a,LAO9`bYvP&;t'cf ƨ!~ߏLڹvdw}?16mە _-GQ\rEl$`yJ<8$>ȁU(Jgj%=Kp(w^ڥ-vȩ̐rsV E]C$'G}BMs8&LK4Fǰ} 7Y6J,<Ԫ"r{|eXgewY6U^]TZ xHT`./Ex>5lC W?Yo;yDCMW;o9wDpBǹY`Diۦ( :/ko?$`mIzdP"_5E}5cVUVpr~c5cvIDBu(e1tAMCNhia^VΩv] rLxlNp 2ƒ* csI+Ny⪏c|8SLHS3^Uv?kl >R@Cw1}<|z"b];Wщv4ڮ$p⸬Xx24s3D$ci@B^j㉸G6ˢyQ2pmKX cd\F]ȣ,J>|8QO9M٪e0_( T\B,j8Z]Œ!~SmO{">Raݢvo puר٠9(ʺpe  g.j> PR-6qOZ%z#)#G,P3:P٠@%+Ѱra9WH:_nŸ@=9u\n}u/-7s*ۙSǞ+:$MZ݈ͅ]G!8yD8bQQH/lS8M?Ɠs=&l↉}Rml(f $ߌzGFZAO M:ϪoY]g` ozp lWp,ܖa9w%൅؉V$%g3=4EH$"?+K`zj>HD a;tw)G2S sϜ<1Zl/2J<;*ۙWj!Z/Gs.lcXƿZa;&>}T|vVJL6e`b17k+oaiHد `_c*Qu\3@eP<Ƭ+h^XU\J$g(Zk߃ĩ$Gx'Z1W bJ?Q\df:|-8ȉ2'hR w"'=EUi{} ,㈬2#I6T3 dpa]F[{vYNp`7u/ j6hu}K`>GNgfwKfʒW7>e,IWa^ϴY"*Yi:z䕴%K&y J"C֧3zŤP01Wz'竫s~NZH&_NROHxf5 6 mK JQ$AǟA]A`\Yzeƕ<3M/M~ʿd4a]O8-&,MFܧ4w%Tymhjk6@] $70gܼR2Sn-x<p&`!i̋~=l0hta7̀oXb.zBqfE|݈ۺ@`R\ 7|𱇡3/$#x,:0Z4ne/)p1f{L=_ }Э@5q>1&gu%gc=R?,玲w sIe {!Wz^G&G 4sMQ ?A K{~ ; =ǜQ,Q01]imGT9umqd1nR/3׋\V1 H1dq&ŢV">pn= LU?E+8(NfCT sz18~p--;<4s r-RIq2&qd/ ̊*'rײ6a5%$-mp7 duxjh_HWpR&3~Rޞ>I`iHc9aVHl06:B ߂[FT<<Vx: !3/ XSiZȷ - n7N5dSZ[P|E#Ԇq^ R|x#HfeogH'r%^ f y໼Tbz}\f9ޔ_&S)YLxIcXTxʬMNWțe`Fr2 5~״ PonzdDϝES(İ*ЫUP=I%s*(qսTWAf9f"!dua*=a1\GYsRw6b 4g}ZqU{+a{wtzw$V|`X<*4QZ3ϰİ\74L"&9ˎD9RAȍzxl8JzauՅF(,φ5iaK*f% bafxYHIί$ʓa{e+O'@>zUB9a,}q͚e2VcV_a,??xÌ:wZ3O d;F`VuMUɸy_ՇL\O[*pyEД|TmUD;>;xtY6I|_wR~8:2@L5fDTvGb^mBP l^a3iOF>pOQ+LY6<Yz܅5B]*2Iʠ>Gc,RJՄ;uq C"__)mAZln.zٻMY=Zq;&{*g .n|#Ս0&n%^_6OIzmjO]WJ ~}喒l}L/\Z9ܗI۟ dAЖ]5u b-!>v6~kZM,;|{@@$X^N/y7geH О}E׾ϯ/k'CUHBn6ϯoB_~7l:4we6TMݡ?ѨdUHeZL;Ebn N=+ W)QmC~ . qO(sJ+N{nyR虷Jͺ}p"4mXܞGw67p:7 8D3c%XUmn7 <.<^`RFAf͚xҊ^U¢.϶s,?*QFKl"҉V  Q-SPDz iPYT!& CW D ŬrÂu%me2hz ʚ\R q(MdnLSx-jޝ6$:VLԔG ߜmF '+?pICB;7sF _0Pw2?՚_ dl$uU7[:]tא<YNɲuI^\c Y`#~XZY谫AK+Gs)_!ԯ>;1TB)GGj \CdFR9xH#1Q3Y\0 eY/l#|nc>?~y\x1KOT ]^]2<^R˒1fh9zkt(%!YR|jb%w$+%WqU !\PAZ׽nT~De4%'\gRr'I#aG|b|A4|pP̺-*X_Ny kt8#V@j3 NW*T䀺*Vt瞖U.OϺyݛ QkÕq]--_r\Uνc/==" mfL; NcرJΧOIJ<;[ ON0/>rOh)8Ia%֖kcu9 Y5ք$v(|,տn5%//^hڡ:C۠;ݑ`eHsIQƶ5wp'ʍ +FC˱+ގ`ߧox]=y!ϸC4?JU堮<== vg3S@lP]uNdHSwusiR5At-I +kKx j\&0uGՎ]t~y{VoR=LC{;J󱝡4GC֥p1ҤP5\.濷 kw$pD=p/K[wk/tk2-A,?Rng8ͩJe.ɳXL gs'xf4yȡ,F'q-.׏riJa)Al]ҡ 0@H}2."(X5klԵhM",pd# ~3Y4AD56J¹ _@f;-wI98N{JoMG05*SH[{.hIg>J\tDLz{%M[-N]/\䞦V-LDŽ|7'm ݒ(G~{+[&ЎÖG)J[$FW^ .WKFZnVλ$?{XpF 86ɨ`r<1ӂ$5,k F{]2~:|RV7L~o#SEVSxXOԴfѲP~Fuߐ&]R[r8!̘p1Erņ-d 䃙JN\Z33'0.A|'#{=b#ˌZuA٧lOY%&euЉLF݁C ^2*sL!v%m̰}m48M:Ee?o_PQ.0X)ѪAIImB^;&uK+Z3A",D` uT\+"i0a6ɣ*&ƿcjcppd~t=^ЗqUXVH2ai3 '/Tx gn`!0rnBlTFM7~7;^\>T_=K|1fl>q16O"\^0%8Q܋I`OŲVڇɻ? kh.?s&=iڍڹV",l_VVd5AA/pn[Qr ,żT+&] r:Nbs9Zd$$V4O⾫y)Nas(NEw #ݏvPһy-{L6ʹz(ܒ2+!2 vל ?Q1``8 F#u8M† ) 3&ms ,9^ tejI[bAN gs|3a bp׍.㨰f.|,ͯ-Ԃo ,F7mw-ڧdVNskZc,U "G\Xr۾X e:NʃY.tfjָfԉ-݆YMW6N!븳C=ȥ:W84R~#^Gm'vc*|aVYiCיbrO}$ھz!ӌ6leDfsy|R2ƨ7lЩe{@LKTA;.h񂄢_+%x> $̅ |\'uitLLl+ϖN,VXSR]srglTi@Ҝ찲‰-1p1qh+8[cJA}NpkҌlttUפTE]m^[ ^֊T-F630iLKgY7!!vҸ!ah9q`T$gz7J1RCN8SnW$,EW'~':T#BT<)|; QLGbeЧIqlˇ qT[h?bH+yCy*8Wꪯ<̼2e]f kuM3n']r`qA dyeT -&ꞷa5y葤9Ae+M\, oJ3&%;zn,Kc?-n~eCȪ?>t JTޭ@)ե$ Sk,fadLzǞCХpJf:/,TqG5/iIvvqϽ!o󺷝i}4'C𥞂wry+oeC̭+܁ \;؍;Qo0n~0Tn74zV#CӭMê\/ZI"UmocS;O$߶>zv`ƫ0㊗ śfIPr/ O{8񚃶& ;'bwSϷ:5x-h2ϫ9}0|=b?c]V~Q(c-۵?θc# xR4Ny2FJlɆ T6=u49<.f .nuJY1S"1\J`(-ΚSx{3\=?ɗZնa;̈<0ka:/08_G.P ^zrc&ӯ)᛫ k M2Rl*ә¯gmZj-uIi `GU%ڞ'–h/daV8v']PBQ(Pנ}Ǹ&хkB-ZvT$c$^kj2ͷJXNO!8leJBn>\,N g1:̬`UPUY_:Å.+K_~IWvG@#r[/2† ˀ CO}bD`ocAb\sfBDbݯ'ׂ>N5t"Y;|WD0'j@I1pvii)\5|( &ũ{b3R+&v"",}Mԝ"=9IFr~-|R-_5Lq[㆑'#({jG0M2V3q-āT9ED{;L7W⥆bW@/?2 Or8΅B;p%'“ {jt nD\ ?=P ~4)! 9{˴&sJ(MG]4n.T6M&";9AXf.&f=ͻgE3"hBF2;{緼+6pff_eIP_kUM6u^Xʓ `Iiټ ?& yw `-$5 눫 6q-4bd関L#~1>u;A NU{; guD1 ӈ $ - &F2bw%&)gJM)w?/zM-Zį^nM ÎZ?Jʺ)4Q?DjҔ?|L-E:kז HiX{muq=1Iw=B5-oGf1yL_͟ͼƯBY*Gp/8\sR}jCO{QL'"AtLh=́I)Ͽiq~,נsHEK:X`%g oV[9VR6>O[E9pNn4_N~;VnG#pl<dzcU\Ow~/lFFkj9mK㿜zG c_.ڛ`Jzxkkŕ1ԙ5wN1Rƻ0;Ġ>3dTE Gz}LeXmLyX -|!M4{V(RДM"GPct7Ͱl شi)*mqv/~m c0nrF/U{ QkC!e1XRjmNHsgM'?A2kξ\]`̰P<䢇$q#bV4!"{^%®4~d6WCgn. -O B`A ލO|F,[asghx52 aG8I TU"Y,t ݷENsy5"srt 5tu*UXv}Ϣ4ӥủ`LgQ*k>~NjCg4vAA!"UR41ojlmsmH_2۱-RGN<}ߞtήh.P3d ͜R ~\M}:w*NxW>S1Xc% iY߾HW%Aq,sk$ 7P sKZvbN`ΌZk^iPL1aLbڨv4DR:VL "/CQ 0ZH!RP۴wMdQL?U,-WKKvda6 PE2F^aM#5Udw:#v>uh_& 6a MVT#bƓ"S-Pb)m]@ h΃- u kiXAzkhD_,]8bsᶲcOH/x'ut۷2(Ys7iXJ9Y48'jl2Çl1HdRfWպ9Yc)VU6+ k3NXA6DR(;?\ `dQu1q Nn\xF;(9)Z:i;N`BFNttiM=ҏi"$u14<5{ђ Ϗ_K+_m7ߔwp_2 MMvY摣1P endstream endobj 97 0 obj << /Length1 2471 /Length2 18849 /Length3 0 /Length 20276 /Filter /FlateDecode >> stream xڌT%l64S&۶m7vmOn&۶m6iu}fZv$J4F6@QkGZzN"#DDh`fc=P]&n'cc t00X98chc w63$m$B6nf&a#ܐF;@ hofo w4ZG4Է(іŅVʁބbh P:흁F [lj\ExX=% i-c @"2YV`lf ȉJ::R2Էtyw77x7;s}@s07utu0Dh޻,bm$dcevt+?a3{{ǿ"lT윀`Lzzz6ft54^/{^6"^f?@O#X#hbf ] 4}zX[6{tRb TT+@`gE^,JX8IK'lPK}i;EBoyv[Xo;u[Mַ2t}g_XoS5?gVhdd@?m4s5sɛ9,U:df@yn =ҽ,C}#V611`~0^XtN?@'1~#Fo9wN߈@'qFJ3N7zH7zSiq[S7zw4byXO$I~5Z:?{LRw{? _77da :w?;[hfk ]G@ߛg|o_ދ,Xɼ;w2h{^ J~X@Sֿef6M=vN6@#~Gqo1_c Mu݉w'/_6@?fN8,L ~/wkBww?mޮwzټ}"&࿿@CC@*\ Y}$ evǏ)*7o 튐x4A+>y>*N.Ma L|Q?|To$ɲsb(z'Z_:pP*\2CW8Gm>ʑ%ʹ+,Jd,H|-ƨy2eF.lblM,<iRIEMymo GǗ:$Xth_#6[ 㠘$7]%.ٚ ,jY83kݏk)CMѿXf֒~ 7|4\YGo'cVwL8:$1w!>|Kiv~mj3y0`dޟ稪{0Wt<[f\HHi)YLp5'pG.?vJTJ*˳Ӑ`ġBǝ0Ħ97PB%C^Ƀs{;δsiiKLe-jfHfGprJPBz| ,Pobg<ٵa$$(asai86AaU/3)VzErtm_ћ-zp[A3e&< x' >|7B˂HiFTUZ >xx f|Y hl:;7\e](#>um-{⇪Wl}.َg1MaøY?Orc&IB:e4M Z2!)P/w&.-gC?'.c$Q01\3w(1V-칐- 3yܧ6Z_qS2۲]*^5|_ǐ8ug3c(I/lw\#YY:JcQB::Pc^+ 4v-ӛ FppxC4Myt n VJ%lt̉+X,峾P *Ԣ<)"Q m>b*O}!$-DO9gEƫ>iQ)J_:iBMQE (irf>^eƩu'Ih+ N u HLk4y:0sST]$@AcCĥU0>& ߰7=OYĖ#ԃ#xm%0Iկy1qZ TJT#HHЎFJyܪeE"K>bZӳTo (EdeQ\M.RS@ɁH)c-w RdHġNv:ªp䂖v>'t2W37aеbd:cghPQV0h$[*[sK,{|SG >&N|e7R\dB[;U2=R *P5d'$v+QYI>pù E 6UruDZ¾?^ݟ.f56YW)5SPEDѸzp[Z$33.AO2[pvjR9II6^B7J\h2 +Ǧ N#YDoҳYAFpR}BS)/:80*P-zq U/KtLYⲡ}rЬd[ۓȖ9or?V\A`F3>Ӵ7J7jvo´jW//6?óLD Kױ/ۙV#WʓuLr͚x1b[:wrR>a !Q7D̷?~t4kڡO`g) '; eLǩD63b'boUbTyKJ#hWpC+ # *6E-8 GP[>b\k.Jy0eO-&,ے$FYdܥQ‹~cAUmۻ]6XEh36ۥԦZjmZEtoF8WR)utoJ gFW!_սȎ%y %<-.)4%/klh(ZgW첈2*㐕7LA=>I?!NdkR*HԪBǭzd5CX?}%LXZ\:(ՖK?t$JQ/">xy܃&_3^ooiqD?¤Ηh4rn53Q#B<P8H?n۳!n7*y[7YPO龄+,|뛄wy46W;RVg68<)p>.' IϩAE%Ynk ވ70|DZhHPKgL* $<}E* N܍蒬b#ukc!V{$73hey %ŔU_"( Mn,GQ8m5u lK+Hֲv!4bR(jw| #際HO rg^{ڸAbIVP'hyfZ z:0Em<=|Ջ!총ka9) 2a0W -T+SR$tJ&b7k:E B{jV,+W%_R&U!ꍕ+ Y~Uyw_X$Z'yҸMz'wx!3h?Twf J abѷ*%b*x8L7X0L!ՑtDK`$eC}ž .}s[]+UԕU*l1u+3~ ,cGj2߂y {Ymf E,O*x4 EaẄ`X}=1O0$ ctW324z[\2&ޗw/Ֆ6moPs~&8ɖ"?]|#|lVj-Ѣ՝r2 eaM3UuWfDk%ZPYn"ۈ~== Xg ʞ}N[j2J7-e"gK?4 FT}O:5G؊8ˆ}9E̞Ք9$0B$@9:eJB.>K@6_5%8AS۷2<gab/c iGu DkUb/چ\r0KG W7ܹn2;*IdEZ?(!L~RXitlٍ|et_qm֭"‘uGBUWxs? xr@bvq1=cT_qwӿTkn yj+0 qk'~a? 9\-N>B\'5g2&{ڲ-!ʹ6|NfHy3^j7V&f$85L4]„ Aw<|ek㢴7 Tp>5}ewjxsnA`ONpDa'S m~ gcOFG$";>ѿE\uz<)Vʱ#A7yb^b8nc ' f6̨ϑ:BR1נ&j0}Qe0_b_4FjbMNeK%mxy=m:ۧ(Ŕ|ĕbd'W{ BBqcIKljppbeMc~ܻ*7FӽeRNChDQg+iK< *Rcwcܫd3J $_:$"ȴ̄WL(E[dz\RY|BGHV-ܕtġ\TE |@ai(lG0LU\bYQtKݝV!Vm-Q7Rt'Dz,W \jwʁ,X~M<֦TO:T_vW\)iIŠʹ`Ŕ1U6P]2I?|^FVIF1BZÞ 9tЀ">6C/V鱦[p}bԝ"b2TJ\j c3ƺl+cP ѧ0v~;Ѷr7phu&)1:7Y }#†@}H_ITyU ݱOH6֯PinVZ$VJ$;¶jO,J]3}9t@ZdaEgZWa̗O+& )Vەf. C-괓.ʬ9^&#`rlvn+6.j]wbjB,/OBPqbxKg\<5'& )`=LFV$:GgiFsX64>pz;){uvPNKihPW֦Wk]0WʭJYv5@Ε>BG}а)7>)CE=ؘgSWv4A+>OuD1.?֤I.wɛԂ%I]}dp=qFnt09Z Raa% d`&I@R-KeƳy%K8xɒP,fI:KS^#oi:1ï4+DO[oB'؄[ÖXmTyF[DYiuJSใS76#:m~kA':|O*y剪g8qڱ&B _,TOKZ,IPO\nCLpVf;v諜3!yMQ<B"a^K :G*nxZWgAUe[R@ qu/#X:pXZnmLyrqbI`PC?~CpAXO܆lk2"lyR"Զ0a܆`oN.6QH9Y[/EZ8\ V3nRM_Ф.tyRA}QZYL]6+f`پNAeIxJx+|ML8y{QFE@A}98Ugv/b}'<|>|Vl8~ nR=Iyix]}I9Ɛ/uqF| yQhab+%#Zc_ַ$INlǨ\ M7ۿCInK],t/mkIlg-'Iֱ28B&,9p/#*lh!RЬ޿=BdQ|"es \s]SPz|k3Ϲn1]> K0ٰZ,BcS3)R ̒d,+qsO #zqMۻȍH*C@GRq\z_ Vb )cԫxh}wPOkeDrnfQ,:k 2um ftR&DENأ3F؍~֊p BDj6٘Qv1sS|Kf=; ? {rs!ʓM\mUf@ü*9_;'=8WXɴd_[ .B^qMN5h꣞%zr@'*rEb&qr_ۥpZ}kjwM4Ob<*j \8d= })kfuwW>)éUz$ZҪ{ʲ V\9QT=J>0TKhV[CL`vepmr{R ;y;؜{R d$()Zޑ8l"?f٘DjϬm4MF|/fxX0)ZDK Ȅ̬aQhT~ЈxqrIDkO3ƯEH=1d=hAВȴRrKh͏G ,˥v5g (ǿrҔe} u̝rYM?O~ F]7/F%‚zOz:y#Dd񇙢%(nO}ڹT%8. $9dZ+)Ƃ@ |q;<4LV1y1"h+g6ѳ -ЖǂKRX-zhaQ'N Y|*0Zd]#f)>ۂ*=)ƨth:\EIt%d6b dVÒ3ԧezhACa'L-n'vrf|FHPZri cjP8y  6.CV7=t/wurMܬ< qX^zoVV9^ <[pQ P&w jf, LzHȰ,@ЎidfW2X-&2kWT;ge?qR2*˟gYK#{ҤbtJ6)Ujq+Zwu<(;y{!Ǭe-6<,Z-/`o|+k韟#`k`kea]̕m*z',ڡkNy`ʚkzAILz6+aLԳybfȒ|yβ-m)( DƆ}I Dz$5"KXHum" -ԒY>]נ;򶦘U@ី?xp`}pEk~fd%otw" # M/B|5#%NeA|BdeorNKlfRp#c\KuAx 5אh>(EZU7}&zZuǯS _olOdC@꩘.;j}٥cݹ ˏ⩅ M6P `VE()nuh5)vZYcvW +:z'dLjoA)&\+(<.Zei1&VO?Yv Ff=4 ٤[76jc̊iKӫ֘p-Yi^?7nϜ R2{rb 7!O Mx\c:!OR[Wog#+~2:} < ba2{͑21ل'=D'Izv+W͔tD!tUP}n\aj4DZtw|1 E\t:3/.Aې<)r$!(Z۸<"BǔGL[ː,)O 38`q߿6-qfMav=gd?iLHXƴ[eVCc)9.qO* B!E%ANht>$O̫ۅr|v G*^8c:Q˛Qz NBQ/j ~薖HW G!Scɂ>Ez1[n˚ب'89vԢ{N]1SK(?{3 Wdq1LEh-bRI{m ⁩9ƂZ̀u1G 鼤BVEa6x/&P$D3~s٧ϔ6$?K>OLs 쭥7ޜubOP2U0F)n*9Jdzya!&[%*\֯ܟ7xNlv0'\+ҍՖ\ݫCCbx\]UKƅ1GE`"ЄawDs͹ `rSAtcZNP< yɠ XucdP?SؓR,,GHaGi3)63=-PYcv0C O+= %N[uUUSIo'4wt֩L.-UX =n(k88F2?9:`b@Utilb=(>Ê.>3Yy _i9K`AX3%gXЂ-=6B~L/x:+wM#c'*N?%ơL]LcſPo#L=f(OJԖ}֚M*+{zf;'aa2ړ'ҠCdvX,9"Gq\By$1͊טlAlp{k5Zbw}HqR\+?7d3c=Lrd[ `WJ#g1 Ԗ,9\;7uɫ=vl>񳃳xI/ݒ_YM%qˊzAS1xʝn#ܷ֘+NjYڰO0< >WX |Z%$ǒk3.m޲"=# ?9I#FͱPcPBguVɫiZ?yH41@8IU-M ؠzA.з ICUt`o3qTN.<9V!0 /#낗%QOA`r)~5v3{$SS77M}#I]KjAlu𸯭z68ăFV43UF4똠!w#ךAT%_2\;"2a2? M3,,-"$&姦L{EKo9H(n;:,SŒ ݔ"Qg}fLV*mb~%[J\* S){abGǀ &{mNjI=G&#F4s81ko*, K+CdW34ía2Bӷi½l{M˺l#ZNqnp[LȌ@/ Pd XLL 2;g!\`j.$ ȵMPVf%]~EH7WH[}_8($L\?IvgT_.b R^Z.@zCgkl#4U  YO<*R[/&[-;*ԪR_ m/r3ˑJ(JZi^`y*c7e\6cntC'&kZ4Ed^ӗwee;6\uu‘;c$*evܵT#KVqC gp(9 8a˷FdtAvgZ0,li[3/FQ;(20A$^Ϳ?H0g⽔戗@WDrY-Ogj\=P skhxVΘ99AjFv .d.ƅjA"$Jm]@DМ|:*ALEg7mL(քˋ)ֆ%K8)w4m7{xȚ?,~" FOby?4=Zxwb>]2W͋) amj8I:ĆBx@>:~wНu0 g֙A4KzPO<< _u;oe\1Fp9aռ31#.#N^/,] _ާRo=Zf l`QFE$%ԨFUy( lmmm$\5NNc2!i9Joag)Cg:dX8G6sC޿`p%^[o 99F0z]sق[{qR3 r&3/_dSBo [[@0Ji}!e>jLb}]FYPD$"Lh:a:݂nW$[ۜWÔʰ>]S`EYC J8pT~̜ ZdqI$^*d}R鶁Y}T Wt,ܱIXӺ+-_3ⓛv4(C :ܶ3ϏSGJ$oΜpѠ֐/2å D"GnHTkٻf ~ǯRJ% g;J] ;UP՘_shXrQr8Qp T̨8+c\Y^GMjɃ7p>1ڸLk"uA]&Zo8-  ^*sRjR``5ݜ$~zCO ?\#q׫27ώ:{sc`5mRtl\}"Sxb{P \o[4\1Q '\@Xp lp;Vc#qP(a{|k[xXHDEvoЧ4Ņkc݊q&9Ph& )cOR7z8gȾW~\k%طef-A+ Hɝ LձCLi$oH"6ӊJE)ŖjcœvgmDqtV,rdN _M})U'I+MܟL!{ *jW^&>6 tk+?R$tO4E1~Opij|]8᲋l?8O$ra^R7:<,yJS@\P1cX~!i*x)é%*l!XmN.*#X>,8zS6bcWޑ ő-! " 2lBb)YGCܰ%Jn<@7\A\hdsdU.ȁ] H3N@s8. 5,:ћzq f`߹;}gmfzv@q|aw3Wn$@qnP"Iц{S&Ϸ ~ZG|RDF:^,{eD8fen=Jw_Փx׏C;I* ^ܩALUu l8i!hB'V~|PQŦS.Uv&P Eu+t,xnTwׁHEa_jm)a__HAH14F5[dg[|ymb /!BCM\HW=}1yQͨ9ݰ|."@لkJk鼋'P(M},9ult3?˛tNH7)&n4=åQ)=T5D6vv#ySVo)@4ȚTЪ"sQG"LKҖB~ ]~>p)[#:b7{w55Wml.Wԕ2nZ0TbVJUu$6%^+PK۾&v螁/Dl 噡!rN;${.J<\GsNbr%HE2pTHH1[@,RڟSA#fu |yރ WuH/vGҤwUvlOu :j90pz=S͘ &;6LttiZzXD&Nગ΍C9C9gGR#EnAGJ:eS PGZ;I##qq+#fMzIô!'3i6Т:T*P׿:VD)t*pn+V V\M&G^8+lq#IXs}"nQfwͯm %{F#(҄ v|N+Bx`m𐮆ʟW̾ NufD@hY*d M7IE*Ț YjXǂX7qdkw _Mc6aA,FAM"7ڛU[g(uDd 8g{wFyj?&s max>^{j@I&zT.o. 3uYzeg{y|t& Tf.ly#} 18(mTnUȯW&|<-|H|'pc'ReN!qx#Dr7SéWx&*GSe I&̹:GRI 2רP/c z onHKqlwG>DliClKq#=Daxrs'wcb AD* h;qx2%fTOx 5=N  JK[Г ߬:\\˚]ĮDT4t$KC*'rB<]{ǂ@}"qZݡdRam"e91T\S yN`|caɭ{Q>pOe\[I:LpG7mn_k9Jq8Pץ\q_akS$ g.i}w k+`db@]RH{%G/CSDwp&k "b@ V/J7D.6jhhA0gkij}E4{F B]:it:~mrBXlѤYb!ՁJTE_{FxP9 ܛD6Zel uOOLG^k& AxI)Y74]0l0Ă^m_ H$:y"9T(ܔ|)SL' ?=B2L+xr|Ŗ(Nm*ߥVjf*L8mI> 7Rbu KPiLK,Ȭ+(l>x  XDn_lC)̫nG𼕸mA Aű 1{]#ķN3a3n FXIb]*,3"7W̜H 私k/uq!/'=o3`2 mI=0M@vQ5qTFܤa.WW .? "+ֲYvj"WB|ҢN9:@\1kx| c·z4oD䰛p)s6%J4P&W^ D ppp#oЉRnZᏜڞ>6oG@W|-Op4Wi,y<!$S'dH5Bds'm*vȒ8X?TdOhŔl൑iAC%hOUc{ D V":lN*${urDCδ@]تϋv=U+h|f,Sdzc~ ōUoǰ7/'%\Wh8vA !;`( s endstream endobj 99 0 obj << /Length1 1598 /Length2 8902 /Length3 0 /Length 9941 /Filter /FlateDecode >> stream xڍT6Lw!0tww7C! !)ҡR_֬s mvIkXugHjq89y8891t  z`W7 *iWLN(y8x\/89ܜ2 d,=!U v`9Blܟ bp qH:]! K(@dІ `w ,b,zyyqX:q\mX^w; nf3 /6 x8B@`ۓ xJVT;e{6.w %sr@#.Z6tt=[zZB- Tn X>5w{n Wwa, 99n듁AOcuPo`Zn xe6yaGf vqrr .7;3_g3 ?f z}oV`[?џ`BƜOp^0/PWEFW_['%ع8|~^AGѰ]\60_>M_{} cH 0&|3w 9G?j? g=ܟ {YU5O{ u!nrodY^2GsU\{,?*wJY(f{ø^,]]-}08zZEkP = sE'j A w@@n)? /hB@@DDP/@!C `o0cy 븮$bߛeda]v!'dR2}ouGBb{kjd[fߝy^;':_][ổ \<p4*?G,i~Rr=^7$l*wŝwr Z)aO*^n0z#:Ǿ\n@n(+IK!]v]{)MeC9[cfa0 U&yxk/vD~h279ИO_)*C߅KE9ώv2xa9)rU-i#4Џ8+[\Cl {oԵuV > KVm FJEأ)"y2 6m wŅ`өBXձA!  K][Ev\UPË|[cTS'\@٭zU}pd!&?gp*d[#gx[V;1+ǿ6I¦U f-)Ͱ/V a;I_;\HTq+U!#m*% g SjĵydzdAdј\QevlA";X^鄩 ұQt^K^E*첋lnbH Ykؘ"7yu4B)v_t6' \ $yM,\ B=f.^+z.I~ cH iX3u>@~:v͋f*M@UPutS0MktbJsC'4'mP^8-݃BR-Lnx`EY |;@%Tr2$%rpY|CQnyI!|A< vGl޳:Q-+]55 uKHʱR{+g`ΫSiCHdm\7UcAlTq5(VM`H7WXCs8d"ta֯;[ՙ=uF_8^QK-G=>}FBګp)B-2g:5|meȋne?]wG˧3N]y5T϶b:d;¤DX^WzP+;φnpp~1Wbr)&׏[v ı9IC@.b#9IYsE AU߻WI QS ˳+  "dhd2JFVKs$Lj!#;w>-zfrNѢa~]ĕe;s\ɼe,']0 l\kCs[(hzdoyL7aB,fMބ#-0b?pLZca5+X cxgXHnj'EEbCqeGl΢ z{@WMVyL_Pآ!{}靾.q b&5w; £1g+)/8EeY*YY42mEXn:r SS5|X,7pܐ[7*?TnM:avGkYm93IN$ΣrjI5HU/$q$=CS-,RS3 V $B==,i1\wz7~pFd/6ߏJ<3W*53 ohHf YQu6,*&xu=Fq^Jhk&Ic>Qn 86"S\(O(udu#5 BVI2n0}8zl?Gi*@ )ZfآOv"tưȦMbPO^)OmU$w|wavi#Y>ܥZyGDɾbA\:Nܜ!.ޠNޘ6wBZ'Qs#e)b]YMy6h\&RPI m(|eO.NOFŗa-ϱӧXgT }{O L޳#+aN8!U\x9>ثPmtov/}C8/sM^TMZ)5{bgz1OU1H3Ib߃r7`[W?aS#6{b߀t'^OD5AlY剩C5CcP mպ FHC46΍UYso"M+lHTCQUgdZ/4;"ԔO;EU* ?02I'r_{-ݹ+,~8q3"w"Lu:Ob9ϻ&,!sdak 4&sD4 gEÂ=m_Vp2E˫[Ww[ PhlAzl eh4e g\!p۾֪uty"$L|~nqn 6E&ԺɈ=6x^/ }">^@]:$6jr_ֹTu(ޑlFgdzuc&N]䏅(8:MWwHFbKQf5Q x_8s˷oC=4 U|*I~7<ۯ}D7·; bkp]}X.'v,NlesTՋÈ"c^lEvL T9G^iWh xF E En5$ae~gӓmDBFw> |[a̱xkDmwN^G;lxv~1Sk >&^SCjzRҝ~8VJɄfK% 6LO wk+.@l|e <뢬mxد)uzCuu/*5^rǐy~mMCrPfF. ,N iłvr_Lh_U1OfsyV5?l-O3k'ib^f~66 QlzPآhh3l}EC~zR,Uy[By1Jj%vJCU>H2,58r˖b%l9tAFW's%mkfys@NFujlu+EGv3KWM%8_{L1>!6K|AQ/zxDґWwz:럟mHTt"vQU WA/hHyn8K 'J88f@ˆM~.ph{e⟷XnSntaUID<(lm@a20B,E ¹"@`9YavY?E!#{2 .^6ί;*?T1+K0!=rTe9>õn }+uZ9nB0 ~ag/VzPg=HP(8D~J/~"GH}zBw-i†C@K Ẩ7N[垢YCeZa5)zؤd: U+B0X9R8F.xU)QeSHQdy(wńsJVxt6b} nHQuB0+j~&YY~9=;32ĻD9rui KIA~byS{N&,zYBqD!G_~~Nn~MYKW^ ^]B0u 2*"Ò7fJvh;2壍w\ދLb0_QOɠM0R): T>6d+!Gy\h4hxPZ82 `: 8X~>"7d* ^Gw\z]dLATcȥvJhzB}㠋LN`4*VK272%$Y m0rquԣOl3N봱}MӶ&,$ϩU$qLYh໑ O9+2s3RTi]H:dHM/%? DC4mj@]ph}kEr2^7Øa2-Q8rSꞐB-Qx#;q8MZ9$h2fD;XX_ ;\e PS!cnr]^5.?4H5V_%_5U r2K1-jը8{2V/"͔7DPU+Wo)Tc5<:fхC'k9Q1|Q3Oלc}S y31: vAa?5.goV^\.ȜL6樥wS加bq2cIFicyU oV$uE6cR>{R =H;hh>,%Wȧ/>'C?+~j'hM\ jL|#[I$Pq4:n4,e^MEWMe#!OSCd&%= 6uhlro#3:\[z6TqXT& %KA%H_O(Ix/;ٍPQиmЙ)Cu(OJX 3)&scv}cR^`ǼSZ'^9f%^Cہߥڽ]<ͽvƏNE8,w;):ņ .VP5 -ce&q]*Ϻd2QAX<˺P9׸NXnT6aBbm rh,U#&hfmc~z9zrl^_m+-,+oBU ?^mcq̃.|)K=VSRWvêIꖱWhDC_73 u;՝7KLEtYծSojoxe,FtT);?!ACoKX2?toKՓ7,W}A#A&>v2TsVQS.p>c /~yxLВNC~fSM?RʛA%_v@;ne4a}#BFex|%;qᚷm(־>u F<^~zrmLx\[|GkJދ+D0QE>yMz3 i0rH%MwY ﺬJ@l֘Hĥ3 ew.T QoV|_1VݩtilUIH)ݜM7f\Ej_ɩrSi{qbZjE`'ꁖ‚tDs18[_P ҢѠn bvcxB|͒u}[&thb,?y'@˜F9`\is0i2-IQyyfy&>Кs%e3vxsbDOJuyR}r𘓒ȟ]QQ)V(oJr__z㭃^y=C)㦛t}Bt7u+$ͧn4|{v4dB5l峭~Tlz(0~g箴L({XΎۉR8xT(=9Ջb#T~<9.A[=E%ǤɛIFCA9kcAx7zݕymXg?Dt7PBn)T~m=UD@ r8]F=gp咓:7:p$auz@NQo$LJ֩LHs(81_7H̋&mWs`(eڡT-uB # h/C4a=ZvtLn!Dܠ 0ra; 2+BTI1;+X8~64E^%[^]Ǜ 󯟹=W|Ǔ<év xz΄Q8~qe}:5L8m8M)o團@iվH ld mE5#ʶ5p4)g5A_C_T~uϮ%l : W:Enϰck‧4~5%O]Y(5y$2?oP:TSN<ȃdEeC#UcL\,eR*ݷfjǓ- AWmK,wCRbf&w)NB3lEWcaT%T306TtIלqyWaajrS!2nj:kh^'{hK(K$IvM_/ paCe^Yg=[{naT|>Y֣.x_wLID]1XMt}ji`5c#9[pr</vaYDqe2-IIc 3YY߸h *@rn1. v703G c{b2*6^Ղ*`L- (徆ep4-H`m@fKRLZ#V&c¢{Y>|U{Gڮ%NJ¨ʷذP]IL%06{AGCqye@\$)0!3y:"g}=Iu}ͬPRڮ]$-DyǍIdd5;gGQ7;w؊)%WMtdbnHvDvߚ7XV;u5<ۄN?G\ޏKܘ/p*IG5m\RKGix\{M5Nf"Ggqv9";-{*w+E:/=Kkih>uE:AlN^kT"|ޟE~,'*|ZCx*kF$~d_!%\ endstream endobj 101 0 obj << /Length1 1373 /Length2 6090 /Length3 0 /Length 7029 /Filter /FlateDecode >> stream xڍvTl7%1:I(nI 1 ch$$QA@$$.%E@RywW_}~uc3QUg\ ŠB@uCS ,!XO_Z8F/:uP,z!@.X(+<08rc@3]m/8/gD_ "w'BCa04 D\.O8𶖁6+;B=}x u;i R5B= <Oɚ(gu4 Ga}@`0G: P.GpY޾p]=*tp,P ȁpo << B{]#C.p_x) 3:](pd1]0x ';<(Y.HZ[B68Qqef1"X] (W[W~o_obG,(ۂ0BoGUBxb7DoWK_t5;#|mBPEz>Z1 s *-~}( /U0ODο%.% b0@~xI i ` H CB.h >% [Gab0x8 aI4=Wr)Zf 1-4d/s"1Gt5Uf/pobRMςRLGWS#mpQp_x߉ n$l1.d<驘=jRZhEmD8 VR(^C%^0 d+Qg t2幹O; +!Ç8 =O⹢q[ߒ8vڡK2 W}\nQ6 Dcf2]TUyIvp\ uyΟɨy|uI:.\:4=̃?nn jnj-7=. 5\<~UO9s}e}6aHB@: G!ZX1"-(q;E}Z5eРrz-i,l%mղݚr1SB sZmB8$)UrI1՝2v/GJފc{vmf |[˃(~)ҦPݯt/}5$Lȏ2l\}%6r:JGN~%@8>.X-z˰f7*sonή?,ʧ?tXFԐ!uxNMg@ϖFy=iK3n3CHxN~MsL`xm6agA8!ZЅ@q.ȧv!@+LkFm2~ϊe- ; , O}]F64]a4M:՛ @G+&IsFROr!_q*;0Z]ǹmUJM3 ΊMQc_SNF%ED"ߎ5+L㖷24jO+9kD 4w| $o"Dž8a#Ӌ؛zg]1<>^|HNTQ|ƽjHp8~D/g;oI*oސ^|bHC)پˡ3+~_: )Ip^ߓ{(Ux4ei zV[b[hwe9&Ӳ_>9.X4VwO&S ؜*> g}YsrN%XA{]c*cYJŏ4_^? AxBCy޷g{(rGBtY!NvV컘WCJ+ܒ7ȵ{1Ŷe4 %)Ԅ1jɰ|~̅o˃qlk]#fCpj7~`d.&sC'-M7-*2tS]mepWץ>D,OWniLT@FFD{kqOm.pf&P4J_M|EtjqAyM⊒UMTj~#.'1HcH,.[(vKl4i$1&DϘ)6< n˛][$g.7̓?>n~`Go*q/͎;*w5We`GuX5Zv("]zN|Hsu8nmrF^ɯs:Μ]~G[qU+ҟy ޥl]5jkܟ5ѻL&ܤҪ2#ygWxyAԶ._W}`2[hV%!Ҥׅx0;m lew|CwVs k1md!2U*f[GyYa;݌:# gD^`V gOl}wX`[^jo L6Zaumu}x_p$t\1x`Wcؓ`ܫ[l<{ySPen~ƀ(=4{ޕnһ6gצ,e9Ijl,_n Onkw^ޥ>Ǔt%G^w~_8?_֢[לT>͒@)5;J?v~ jcSۏ$SLʁJ5@+联Z=]Hxt50ꨢ\_|J>kdsۇEW*e'M}eRt8ݖ)"%W#_G|يVWlW;Q)zcK_ pu ;- D? gKB([;}r mEJ4>sYo0 ݼjl3r m#^lS4)JlٞPxy@c:xFf̽$K *!j eȀIe^+qzo3i);\bG?ӓ o*(>s?@2*1u>M NI6tB:S PBq3EKx_K^抠-/WCI\Ow8׼NK\AV EwMSG'gP;bەQ{m=X~y кDP˲B'XꝮVKZ&=߽'[vody_=0֛i27KUΝٵx/~MUCgiKyD%,, Wk;{ME^${3t\{͌TfKI{4'-Ʒ1Ē!ܳTŎFm`JHfj Ki Sh1z/>ɉ BJ{2 j~: 3WD m{1 ӷ1$桳! cR%0:߯:|^4ĵX: ;hFJMh(f7ɬE_6 鐤=!B(ټ nER 9N6 2_q|=9k^LuЉ#nf&/W6$~ ̣#̢{u=Gb# >=\/. ~esmZ ә[{wZ ~ p[<7?as:YgAh' {!Y/̻|,6nFdjxߨjK)q.יn9o gLvt옇麵j#ҫ3^4"rli ԣ3ˀkbgӃRk-ρu_2)K3&C)!1J66΁~ۅefR%|*\-ռJ՗ #^8UVWsJ`u T>&gb^pj娑dK{ugke"Kmi{ҷP_) EbVY-F] :qto/guxB3hFP%G`t0kˠ -䍝hFWeYOMTq:&[ovt% gu۬!'?gBCՊ.`)(p.iG:I4.#dŽdٖحbԝXpaAybFP,r%[L-x\^-eV吔UfޟIyM>ЪWgC?)$K|FTop\NSܳE}8 > ȅ9J*~|"UMcu%F%\A ]Uo*$Hh$ve{E6UY$erXIX!|?Fyj5`eBEd}Xܭr3Rl[5xZ=J?g^ 1JұI4B.c?3{ʽgìKmϝw#zQ.l[]\Rt|ҍKɭuB!,e>ʒ_%g>2>p |mS |^K-/kUj_[vd~Q36[Id<@ )=)5Vxv׫S(ȪpEHs\`~wdpu-.F>CY~MUq*kw ӚӖdZ,#9 wҎkz o~F_vzP܏X lzh׋LsNsig#:0{~D^ΌUP] Y,gu7]DhUrzb;@}M墄. _sO=yQ$% ewj:ԑ6#ٴ1+˥W|p{7UV^0k'لZNTC.#AlDu,"Gn,p|ωM0fy&)+n㽝pa+`Bե,S}w۷'[э/z!slUj944! JnX*ӝ}IP-GU):=@?[|;bL#Ykv/3|kWDtY h՗NZ!3k&5c:$j &.k@ǽVPfH)~ S#^ݭ*y}G$D B*^t7J5kǪ/q9:F1=P.O`$D,X-\:~⥙_mK BCL1+4:JJ9l7"P~g)8{n2ɞ N⑝4'B6RMT.XJVs09L,ųhnW'qG.Y,Dݟo;B=! &meE4E1RTmw$u[3xtGB<vMS㐟߹R.ѱ$CDE%~zKg?1P endstream endobj 103 0 obj << /Length1 1373 /Length2 6093 /Length3 0 /Length 7034 /Filter /FlateDecode >> stream xڍtT/]%Ȁ9H#) 00--J#tJK(ߨ9{Ͻkݻf<~mp/( P >"bc3?Z"6c0 $]:E ݡ#PT(&)(#! Py@Zu8 $bSz# (t\p Z #]m!`?Rp>vD\%<==A.H~8 /r胑`k\6{0~"6#GmGy`Z؂aHt;k 4:`g?;ѿA`ApWsC`&? ~9H8:@A6hߍrzzC" ($?54KV)]\0W} {|!0;_#ع  n`5ſ=*(vl~%7v6Vu#!`/`mD ( #OvlGFo dƖ *&yy(OHD̢ ݅b`pğfѷ=>36X0?7E0C,w?Po+/a@xuGG3߮OU Bs@%B/.e*Fp$׃ *[gD &?K*lv%$" ! o"ђ708 @#~SX ~~):(Ool4~ſߜDp[Pֳj9OQ)ͧ\|6 R4+>+q.0_~kÏhNkJҟl!8N7\m/!#ߵq3vf:[8nՙgWmopVƝI8XiW63tx(>&n/)ʗcIC6 nslj!v~ZIr `SĮ4&$ |R_R)dI@jHz&j3ڐR[iuӃr+Q^ujяza~(It)i/9K:*J(9镤+;xz$LiR8΀ہFmCRn|qnV.CǤ1K 2/tx;\<+1R]0sߕD55bM;EJp@*δ;3Ŧn(rD>IE7,(sA%V=0!J%a8.aS>h;Y&`=uʚK#H|!PSynf/1T4Shn^B!KIi!! 5J-#Q(ͼNqE3Ɠ#GZHLwW$wC>4l(B~ב:S6!U/~5&, YOlj hy̥U1 N\Id:v@ SQ/]tCG2uk@uѝ,$ ?c}Q0@u=44mg z{ I.DmX6WD(LkEhni(9}d{az 1,Ũe(ǻ3e,3&—$O^u'5oU;ЫM-([t` ?Rl}1Đ7N.ĩ2t7?ER=zYbf6]pD`@g31,ܹRo>3kMonFJy_^t.~X] |N"K#вMd Cb.ך"&z B##]],P A1±V^aV36~jzwQu0<~՚ζoULby[p#i:m:w \!ܾ-onVIz6(JhqSnuߧpk#Eq",_U@i CF)(؁XkaD5lPB- ^K=&j2}EHLjq2٩Y 13̾< fGSiU[x"5O-ݎ7u>1^E.)a&'ѩ' J:^DN.E\&mدg#bCbv^~v& -ޔ*,lc@+nNG)d_LQ0:}_U-!8]0ˎqksm1m 6. Ǒ$2Z{ګvZG7Ym&Ќw#0Gf}P${Ǖ])fDDzGbez"uO>sl"ɑÌxG^IĺO4Z >A[0OT_q"2Wng]ŸխTw ΧRټos`bA=swǴ-Wer{*RP)N{^Ou/|fYڏzΜ~4N NA)lV#xbg&G=We\[i3SSM/:Xа*s|^4OA#~kR2Vq`L׬=GY¨Eg dw%nMz.+1T SFv7rTr]LRSux·{pD+6:5YE#05.h߸=0п# lD)cZ͓_g)'IXg6}ܕM))=fL#C~}wiZ'I*屨{lּ.嵐]-u$#] pdi+t}%-ޮJ=ƭ? _(UwR&x@fTf֏;;Om-(a C䛨LQO'_y}#kjɔB̞UlU$uw:yx4tJlRB7Z+&2Y'cdy䴧}+ݔfmycj'DUzkɟX ܝ=XE-*b7x2G>[<9ЬOgș}u^=?XecYʀߨS0z@\)"Jҙ/~nwY1z:|wZpaťM*)j/b-HΫIƹ A’C _?cG>o\}ѭ$JrxdU=_!;YH}U, - o'PWoܳ L|] :Ut&UZl¥RFQ'iSW%bgGO i,CG_ޱwȓRi[J)`\R!zB+l[4Ct?4wSK5uƾ>VkS#9c^z`J"BNu0Y,e,5v;4fc>ج]™kXp8Hx>:4"9 P6!K@Hf./+w52:' 8G'0c@|#bySb?C(sv,l_}cu (g&1y6Qyt+z4TtHHVaGR#ikTʻe;m2 h v2\pI_c!@ڻ˛xԑm Pܽwyn@.=| joKLy[0c-lrF2[f1*1^5$WlyNvGZm A>Nh$!JRt6ܴѵ)cԄC]7ĔgWGScmVKZeWІI3/}FUTּXkꋪO%y~@5drjoSXz_yecvФ%^Fw ΂4:[Ay~Q5ewWHG)]3YgwIR!&y:gB;!]| +V\8t\GuX mz}mNv-N?(mۇS3o ;z?lt `VɊen" eԭ$ca~f6Us< /Gl#ڿhD;M2slFp^b*U yµR69 }$ܓlF_7(u"R%k9y:t5׼I bKc`UGܾ̃#-EKqiDr&"ViJ|Yςc9(C"U)7ݣ6%{5!9i!E͘0o"ؒ]3{Vp_} v Jv|'n`#uAAUcmͰw!}> _!1+m%O=XX%cpW/QjpAeRQ}zsJrKCy3PE5,('v\W`68cZ >,.hAQ Pgt}h=,J\"a.hR;LRXk:2#[\eCQiV[ٶ--dÛwQ+Bƒߕ^ȩԼUq)ey`ɖwڑ-^l7f@7-lHW0p+ YMyGQym!FF 2JcX>c3V<,oΦ jc-v/enHy.Qiʎ8UP*!ᅀfOnux\'x>|\vLgEO~ ͙T' CMk?n&_~5*^o5$ʽa]-M'}6qx,ez4rtxglޗt͛=!pk1!Z%xu@.;R Ϳ9sp Lo1;8!Z#xnÛxectk->g)6pzE ~F u`2٬ojrVS8tl-\5\KF PÑ4AM7=G6}S[C]IT"2VմV.^ۡ9 xW_-]` =1AD3M&ī^?-~){?g>cAM]Q?a|&_5jzhg4D\%&J=^Dt[)þN>ET mM$m}'݅{M0}C4C$M'{@͖L BN5S7R*9?ziZr. 8$x7{HH=5=ۊs]và)~YN8?S7 -) ʩb ?I#C>u"Љ*m9[OQE >OwmX3z`Ќ%}]nk;1Eq*- IuF%Jz{rAdEګgJ. Җ`^]e|lw3`(=y'Ǎ!գg'8Ы|[qM` e#&"VUp[&(D$_a1vy$ê endstream endobj 105 0 obj << /Length1 2312 /Length2 14244 /Length3 0 /Length 15618 /Filter /FlateDecode >> stream xڍeTӸkpנhq <&';kA]zi4٤A@y3S aFӱ;kPn g?82n@ 0D&kPUAeG_K@)_"M kio Pe((t2 7{[;0$?\BBnVU   }"nrgbxكZ@w'W5 'űtQil^n@Dhotvy8[m% ?Vbrd`c˫ g뿈 %wy)MTnfvgwwJ@-l-rr:QO hǿG;[U PI?,qrr B z[qD/1? R 0n <~*pqK3o1 7{o1'd2g gGCCCJQFߢUKK~lܜ6n?_4,J6 ?Bߜ=3&RA`=&|V_\oay9{8:`/Űpw2`: KXhmJ` ZH9BFM7Zle#k흁 w'Av :qL* d7XYpBYNk `w!&H_G/KpFBD/䄌o x:C7pF"!qqCV8Z yX@7 +#?_co +?X @/yCN ;{d+&-wT"¶ o $1iBabt!;I~HMo=1d y8 8@CW5$cj Yr# A[fv^H\=Hxsvi tC.H ;(R۹QH@HQ;H}n8p4 ~r@oJ$̡.Fԋmw_Ń%zћRR޼[ԏ#vUư rq^o;qpq`HNEՄ.'.9Hc? (S҉ˌhGߒ#RT"1  9SWt F%.UiAne'\4:ۙp݅%aph7OW]=Eѹ ׬E~,&Њ hG<ϝr*ũx0 ϡe8 x) Vd<3m?ݜfZ(AD;qCp]yf Ȇ) e}S +*l+ S ƬWsxr:Ƃ\) VSF{U>㪓\,' o)(a-`;%qIM"u ~^PG\|š5UȈA秦*7F‡"8.y e#HmoZH(T1L{ _O;{W0M5&sOXڽ?d91sbLݟe MTl] OYGN1;Re7G( Nq)|\2]aS])KP3NKJ_:[;>H4=!GƺdqAt:}p3^w~{]Wߠ&|NIar$DNg`st|v5y]LjfE;+Tzf.AM3 1Z 3 lQCJU*S\Ǧ0r0^^ dBVBWGfoܕQ b;.#L ,X cZՒWb olKLH#?}If``& \28x?Ncܳw^XaK)ykNYA58]tp/oI_O?T]_㈋~CI{d1-hpZ|/ZNw/g.]dID>j!iYة#V#u+H! &p,Fdjd=%5qn|̊V28A{Zؚ>2^ye:ƇVPX։:V6!A(>+I*2k n$Uvx UyJ>:e?-<;**k4A𩠹n_|8bu,Q?w4sf<þ>o_> '$TFٗ* K" )P/IBCh9Od CA}ɪ >/tJ5}D)dki7+8~P; Ǟ;7J{3+HLc9oq1F=e]a\Qw,Vs̙'f{X2.t5D OZ<լxfX;Βo#g=Ш"|&]6{ي-M|z ]LW,^.a[8bGֆpp-dZgYieUž~1'/y$-iM&CUѫ:aݨ^`qR9"ZJU1w#-4C6?KCxoe4J~rIPpEgRcۥA< ʯ9]>_S+ʊUqwX .Sm#h]&Z9Hme*~{Eަo̹Ȓ.Vx$لe9h"?f5C!BD>6qy@R88" VS"mj⃤2nqqvk5MsIsla&sfiL+swŨO&O i6P͕a5_*=ӛ|6" HgVl̮p[kVO@l;`V뮅ml!Oe[umCBq&F w&;a3̝w鬽Ya)NzĽKuQ{xh텞(%Qq?*vja<0ŝN}Eqzڶsh;Z ;Xj@D:-gAclĕ;U>f4a8o2[NFemޖ,ȼ9yѳ\D?51Y ~N-hXQsa%mIxPya28mwKNﯢ3yR8H RYU'vKs*6߻[γ)PN3鲭Hk6Vc.P?Qvyƍ4glyW&oFE ƒ \F tB#,+jc߸^1!U,ڍO틇8BX,uZ#3TpwZC1ArEw$1x۬a"+gq*h.y.^|V~k{<,td/X;i 6&B,?# ep㤈&KL^%to8! {|Yj[scP?{&Ф Voc4q @RU =+ﶄNψo/b`Vuo^}z?%b'c̓OqB =AC/ШӚIE;Հ6& N\?ezw*&%j^ze txI +m(M,[]~LzE%>}sF}ȃ7-cϵ陯r~dPiPfn[$<^X*Y>;pqAI6\X=ۗKqjt81T,[w9'FtirZ.]& *nV:Bb؍_ A*|yC/~i!Yi|5Xt*5eeJit肤o#uWH~e)^FB[]ҍ ŗkwl3pɔȄp2wh<+GNJ=zEb y&W͝w<0e=n)QD7>۠ͯTۭyljŧHBj\杮;aAIݰ+P{X۹~&B4X{ѸJ͓|Xw~a6;㐆gY2G"j v{ϳqUK0WsJ:X3qKra34Mvar}Z]X. \)PK{>sIfztsa!q޳@C>Pv3Oi$tzB^HPD_;_y؊.a8kVImxt!IZ\g&λu|c?wpTB HŽdϳ?Z{ M $:Eѝ'?4߸Ȧ+LnH3 ~Q\ĹX//f$tiJ:oPHV\,gn8IԈaP:,d^9e)dEuF#~y z;Lڰ`-laQd.#6j(o03*y)Y0cv ˚rs#J7lj:줔ĪGET/茅/=?IHsCi s"X<5`r{2D_6 }Lԏ \4ԴVZzB]t@sϭr/q&ybjk:UkSZj);N^?"q۝?<&ʾlIK^[qOBZAVR39a 6x#Qr( _jI7o=E*_HR Z*aȪrt)~J 'PZM 9jx5z$' 2M.AJ鎄dX!AhS!+H0"A[Rӱ広2c‡[ t| /K8n ӭt#`䱋=$2[M Yb?u[FJ` ;g~ YZ+#Klۙ֝7`5kI?6l'{)і _ nJTւ3ɼP`\2vc y]hBWwE!vOh1ZPHRS{oHvW+,qR%GMWTFu=J#?ȋ*0y5 r aB L50mVs }$+/C.̀Ш}/g9>y2MO4@;`OvK txg(Viɬ(cؔ?fPgKQp67`7G%X 0ƵP,t#6gF,od@e.Te%B ̏"%g ΧUTyF6k;n֏g9J•9$݄'mJwYzLzF`Cf ~ViIvD,yfݎiOT*dX1\5j\L;BB̮X7G˂Pl Q| ?bϮ_k&Ek&Z/מdBqTG,ò2G#'QݟgQC- >)KN";h..Z '_&4#ퟭ}=*MCJd}?vZM2ޞFi1A \YJuMjqf^L,۲2TJo8xg&8; w^"ޖ\o;QkA]auVC)Z6ǵ> #naĝG ZKr9CUDG/_WJ@i=7_az+O#x녡\},AKo^<8ErEr90Ht$M"՗w#>ڿ~Ba?'J&679 #eZүa)}Fډ?] BMT`/:r:o>SI1ډL5W1޲V.JKv/8K&`G6~>p*/eZwl/>@6%C_o ;A+߈x "V,?VDcgM/uSMOZ2 h/(p1G]uGn3?DMA<2pn6n4ei[WTKm@!%23ؓ.=%&![g^SA?.˦-ԝ鼟:ot[F(![vA-e臼?LLbz>ysF4ouo멬bǫȮdIxx :~b+i= \k=(lCF)׺h~B\BLJƱ; ^"OUHyky&JX_Q{X)ؒǏ .rmo<-Э\OYeAuYRM&fv$SĨ$Ch"gPKJ9p1Hv_zc Vŗ>&U?$B풂J~iQP}P (F^jp֖4pw)"tc\*X`{W'=\DepAH@۸sRߎ9Q4u;cLGRibR6t9#ou|fK<6KWwcٵt( 0 hT /-QN.( \xR7)chj8 2 3AABdh}2r2ef6")92(K܏ E8e_ntۧI< I}e#T֔&v|5̈U}kKcJ'yUߊ Rl▸nf25^.#5+5ﮜ!e60ۯuso೴#iw`:lXt9.'nm#p"iє>嗨cz"0ɬh#lr37J[Ҷ] D9iq]}JOj j! -dJ"6&F6q $)a0-I(z.1?DQm/;#2P韗;$\9Xˬ7ΙV9/Wz+~7VΣ>}jo-%Y:A$㈨Φ09j7O*ǖ0؟ 抜 e%Qwr$n78C~T`a6qɁnl9i,y6a0ꎝh!?vjZ<@a ][b=502ޘ\0P^ۘjRk)˰m ռ kYL +QڢM%c%nKK$t>A zˆjr`x.Jhdul[kkJ+BMe.EdM',*CxXA e[e{*_[8+ܒQ:a9>Zk{7qvDjheZ@O`zPlyi ]/႞TIߪ1u=3X ' j/0foXʰ Jxh[Qx}%n" K Ar4cV2, fJ8 Y\ɲ!U\n-E7B~U+2-d9cm`}ux(-F{3d7%;8 nF80qy:%.#)/p8rNf@ -y"Z< 6DU'(9.%\ʳq-[! &$OQ ~| Ov6eS\Xe*%N~b9¸7^QD\5/;=.Ǝa9 pG}ΨJ,I:|$?͎ ="sRpՉ;VHn`0rϬ֥G]QOx~H9h꛴F+1eCLu/TZrb5/*3ӑcJYh^щva8](2cJ xT|DymWjc76Lr QpHRatì3t9)Pue%p{az=J͒Sx=ClOC% >woJ ]ߠ<31{LJOGi#)Wg=ES|iB7$e^Ѽ5%5Ζ4&1#%8K nخ0n:ܥon #w}Tcg>(Vh'tye0(7ǘq$0w2F,56mo\Mad2BL|w1[;R1C_KLmtdVbؓ+t!Xw32yG31^$tݨUf-_>$YoT^YpaF;)Ԁ*~`#'ׄ˅+ŸA$J&8Us+iػLP͋7/(镖5Š|NYY1};?8$` *-_[zzBk}Щ:ݖ8UnlsHWLܑ|a:w]oF\w})z7CPp-g,4 &p=\6,Ӌ"ٷāzkEAX#C-R\I+q&YDXgqBY/ aStɸ!ʞ%k.wQw8M#{f(yy\ծv\_-T}zh q1t,6 x͆FY߆X,6ms7ϔfb0K0Ea;ZgިSՈStGٕ~ .Ʌh9r,YRұrRQ!UWlF _P \T+nޚq Em:!R,>s;I3oցf![q眯<&gl`j3:};KW/ɈY`} 5m#-[l2gX-xdq^\b7<L`B\ȿQay*0+B†Tz"키t(R[%|=#Zb}azm0إKf c"]"-Q[CY/fB*qLL(^S֯N*vPuMI[ b\̮>/B? џ۔OEnyXw;VܣTlL%VX)OS;EgqU1L"YX8&ȝ9XMFܼ1 vŽ.Ġ͊1f^*Hy3K6gCj\*7zޛǀ׻_4MmFgȪdZbW1¿]'!ݮeBf^L#cq c ^uv}3kG2$**8}K[EˣfSZq4SCizЛ^+FS04;o|qrʫ259ÜYjݒ6{f姨zl|WOMZLySī ݭm`ME^OK%}* p; gź9/psٍ- jldUڹSL(24&T`#J&z>]/W%v6H0%^}Xw1 e~Wҧ;!ӏ}ej*@Zv.4d]YyFT;T ,vpC[)p*l%\fB 6Gir-`} 0F'!mϩ`5\T)PV?QWdlQ218D ֓\g*=g=/a'~bϬĻ>ZH4iXćbtu ]ZMN=T[cP Xۊ. tt7y}=ْ.puq8v ZP=3R|؟I*a]uz%| ͘N h-J|_ p9PHHԑ^K`$h 0l]+>;7d+Dcsd3mLat)%7gý' <}zN65(Gj7Y[bM/+- Q"{s\BWʤ~eΔ`>ʴL^_'0K˒bː@}߁ޒ9S)(0/UGFYk,S&y-:zuS؉ zgz]mԅX^yu}kͱf3(!gDAUX˒#]8n(m3U (Y>+j6DlD߃vT:c52o8YCcᚲzfR<> p=-cmHd}b%< hMR<}O׵VQYu ڵf]N|6TYZҽst3΃OeS<}c9a ekB[lWg;53U'^Iщ>L ֡2PM*D2@(swV|ʛƟEFR?zw|Tv-^2tS3! (sU%d )*E zVyԿRcH(?8 H%/~L[UU ɤ\e$;l#gMX\R5P" ӟ cj\b٬"i+ ?zw,Eh3lA e/ӓf9i)a%3yKho"4G="yl&(*7P/kBPk>; O/>uR';AI VeQNy㝽oe{DklɰDݦuT1'U#.+?BCnr &3XN^"a-~R^^(KAcI?IMbn,&I5(TV|"kj:.Lq~-a[5K7ԯX~Ai}=՛I! Zx1e1ƂbwqxySAD73pIC^`9s:RI/I.lqHjȅbs#naCxۈm| ow#I8pJ֜_ufyǑ1p9Ex(  tiإFi+TJ"x[,V.Va=>F09*PMW9;+3T2Y#GnOww endstream endobj 107 0 obj << /Length1 1386 /Length2 6039 /Length3 0 /Length 6990 /Filter /FlateDecode >> stream xڍxTSۺ5Ҥ#H7 & wAjHB$t^7J](]zQA^x}kk͹d30T`($F$[ PT!4c$f04 T,PD@4HBRQU C!ahN% III(<0 8ܰ!`0H#K {{{ B('y^7 0a^0(=hB$g8/1 C!H(0Ðul$W?ѿ#p #H/ Fa^`8n PW2 cBh8׌¿`Y UA4ɯT0v}+{GBt6Ex´T`&ۜ`PJ\\ =| ¿ ~;31`pG 0@tsEps#Ik9ƞ`0( 7 iݷ43(@PJ@ 1@?X-# W}e?#^?s顰̅xMtk;_YWwGo?_v#| `UjPs_ՅAn€jPB:a-+Vp /e77 3@0( |XA\w4]0YW AAMDL`|~ ,Da!쌁GɯؙhW98rLV{[0 B2?Ȅ8UbP欁gՈ" zX]tQeg: MqDmLПg'Dl* XG.d44Zxzl.˞#wN+-n"7Z^w D8N$Ytfom%7k2SiCu&'NwiW`O4(4zgGl)ð {x1)QMmX㸅ȣc7RՙݵwۍF=UsRպ\RfAd'dPYcBA{hۊQK,Uw ^4mu gxš? D?|p{jn+Aݥң"ę7Ej:"v"7[Q$[>S 7;<Qdnef&NJ[DVҡ5r=gUw8(BJ3{9Πsuwo!!|_mTEQkWM%i݈{1:O;̴LVAOE;747LE?!һ$}MaR4͕zWd'~ 3C?~ՖSv[&-Nn䃼@jie5{左[F׽Ts UIȧFr):]JZY4%P!M?WșhϏ$ءaSzGQ4cQ˚]WV?X[t8 4"Se =y<#0lZp\7.E{:pU"U^hzzIǶHaITX>oxYPb'yq)F~Oi7&lT?ˮge(l~90qV9]\|>\*Zdxv]W}[?+gM)e Pjo}q}G.Aj`{ƴ5=G3WC*IDzZ3+W- u˳m7fHqw0LgJ+hR7RI[<]6C3WILggdgltyͱJR%5j0[0r'm>8i(s>{meǏlp|in|;ԙvgn]I0S? !0j)n-R}E:/!#G㨛U9:o۴?5f>b?^\sNMܥb=!ڌ8wnc\6΂'2,Uϼr`}Ʀk^%]q[9NJ [x;N&"- 5z.6B<{5B޾K~'\}BЄeG4lz}]g$-!JXo*T2.?`gl`)V !d~oѣnW?wݑH ]@ O7}oz]y)1X R|[727r4UE]zaEi-U'U7yYhc-b0kx'8tx.Dѳkx%{@! f njuɁby蕋Iv|Ho J8 3$%ͽl˾&wIbpa[rfR cG(]S6!bs~P^Ξ}<ѐ&A$㰓[v²s&>'+Su oR!Oωm") gK[A!ţըC~moC| [P輱:Rǯ.n"cd67wK6Ù_'Sp|,F|a.2))9 \++ĺ| ,"bBnUhME3ƢQ/~;XT悔 MqwQ,;[П!%7QM9J0XHtvdK.8JpS\dYiہQļ J)N|[!=͚QbY%F~=Q?cґF՛^gl᦭*Ҫd_-Ei;·'Mc]L]ecgz z 6R kSHXܕj^TQ J̐e4>c V/cbje`rbqؙaΌ O`kn_EkV2BDKW i7Y͎rK%ȑ/ɷkhԵW{|Czn,)v_-vwı{ e yѼ5OR d;, ]kA\8]vn>&אY8Ca"r7q֚啢s;<5 Ll@.Or%Ռǣ==+䂓6sS/n2~ }URڈV0fo0pj22fm˨@.g^pdt,Pb쎆DY0g+*mռ?sngS~)nFXN`fLe鳨N}t2m `^uyu'cS]0 `%O)Ĕ J(RK0)a䫌  "MO-5Y@+횃-aF $O8fh1*N>niȩ.38Ep:Z=g\P_kn+:Xh߄oqʑxXv:#-"]SY 4{r#}1E(BuY0ՊcyOB4/rky8H»rCo 27n'EPf^X|;8Ԃ&Q`YKFY4@F3nfyXܤE)b /c=u1r5|!*x]m:1LJukgsC:!a\ ݅xVfO^z3z:G/NT+t kNQg7ʯ62OWNm7w|PlU((?=$F_d2R^_EU\UE"||wp_*IA؅ӊ)AĨq\ݱD?jTI?"+!r S ;/B،1ПKfv#{POlduk"'r OP5KֺAyY9XbiD*NQz)hrM3Sv{COEW=U#sSc/$.gK!Aj Cb%\cV 1B&m.T 2@"fUR_B>kqQy'E w؋,%t=/齗AA]ޣߑRFɓfab<Șp[Ci$q6qnyQ 7(%CYFXfr9bR3ȓPW@яPHVrJU͋7p,lk_*Oh}'yIk|N-LKR}şua sjR8Ė8w_noUmNf S`{*js,W|ƩI)i"flvX=5S]j}1w,oPN5b* ]*"KzKM%)։u.MCI.LDb#P3pAk˪kSE]u.z_|>M`qX>u"9=zڳaz s}%p^5`,hoN~Jxd~;B jwgTFCVclSd,iRоTsIXa-s*:EG-t>ğJX"[ss=d_SK hǧ'y~{j2K` ÍexlTI&yʞZԁ~᪸ nUmV}BWQ9MD`Ͼqn /ο`i$TעKr3ݬk-=mxA] Hb`#b\ ^y)Dgw06|bNmP`f&2E%{ E{S0d3)Fy!Pש݆mO/O&h@*-.>͍$lmKPYg5PCk-Ǧ *\Z&_&FLX?o-X=8~8 .+"=`Yδߜ7W@Ce+37q㼮Tw;?Fz0| /|;ܘ:o) Ds =K-a鴨\gWE > stream xڍtT.(1( !!!ݍH C0tw#!%%*(% -({׺wZ|Ϯw?k'g*#(>~$@AD  @D0t! Qh"i!uw'@@TR@L@"EPGnD o$.W !!vw8@ApeuFW G .){E;#v20=@Ez@mh&' (O0 @`( "5M pnN7W"w0A80(kP`/ {aN`k4w`xn$s5"W-+mP8ʍW0$vo:p߿[6.Gp;TM/m"$DEPW b)ˌEBDn`(to?ODDɎ6CmG¼f 4_=Aw~F r&O^I1qA?a'V nH}M/\4k$Tc,/wCNN\ s @-CCV jswo Mf>a~;Mх (Ԝ`p. ۂˇpC ?*!_:H7M'AZ6PL:`@ZvC ssDo H$ZhyoUC^P8 ̡*{'bstIgsⅯ&sWy+rto"yzKSCa(u.8deA0 G/'1߶21xgX۵«fuSm3-/ۼkƾ51'K@e=Š%7_x/%ddwu h'ZAIOΖۗMO^)/r*5}ss՘{B=P'LFVihbCzV#0UsA6KzךUjV'R=&91t}m\ ysƱu.c?e&4HQ62֬"~?^3WJAApxm:f>,w0,/UE_B(\rMkY fWj6{_ĩT,f̯-3_^jf !ev孛*}V_)aVPuHR=?1F K1ܭf k(qiq]fOZT2U@k:S } p,OQ,l RVx{[GY7%\IG/.;9n3ȡ(V Ѯ y>eFܪS3d[L&$;|zY&IVw)B0D>Ēʭ)oE9xg!=ސӏɀuv/-4_?_9qE/֐ @"9ԡHꊫ]IuȩکvaF]#3. X-4Ms,~AnaQoΒPL,?q"n,+[D@n˫i^9$+9/FA>'O3/f¼g*s fGw.!8sw3o< ]6S{-7a&* #U ? uܔH6Fj=Vq='ky6@p,`{r14'YJ|WdGL@Si⥁buJRP_?K@Rΰ\{Qx)ժ"Sxߊt&(9$Ss}b HqA0Wi棏θ_ynj;^? >%J⣊ud^\5IVTo+OQwq{#:%s8[%?{ǽͦ=x;n:.f%4AfGK۸=Mԭ6gNfOa6ݲŁLorq#ҍV]&<*7m5RڤAOˣ.n)z!("Դ_Or~*4ȃ1,97;BM G掍t=~+sz(*`-UuI swVhR?y&<;?>d(} ]Rya(bU}H_+UfnmJdmHf-}5"$cc4!p-GʔbL#fON ag~az@Xφ$oDglA,-#:){=/XNv1w[DwA^OpCxɃ< >2oh=0]LTaȪ.Sfz8π_Ds{1ۺ0x v֬q%|ǭK{Dx9*c9oľ!T]8eWuԸiZxv|f;|wSFmbenQQt|_w+y +HpQ@DFD msmp~sj_ӗɎ9JI?(b qq K Owܴ ŷyJLqLsx}ϒ'zg̕~DR!]u-Oiuo_[t37VrZ\ nDFh;ùMeDm<3u>ǵ.0Q%4 Û'tkiFV#V[ڿ:$3|9q%nL/1\c tVUp1YO,MԔx'7&o=:+SPV,Zq!au`nlYױs3˅tq9|7뼌#6s xR<y#DxD_aKlL$%B̲ jȹ8iܔ7!0=8}qrwDMNnw_ 0 3  |!&ӂSA߇^k}a j|alyEV6\UH5\J!MG-S9oSW/rq*5buGpLwq3դ/֫>+?Ŏcμ_#>n⛘#~IA}8e\s x#\͸Ǘ1uݹ~3`@%B,I.#VmoBK7 :"uqL̍Y:~7vG,x+Ol &=N0;l;{0j.յYP3dZt9CT_f`m`ÿ=tztg[c{ 4# ϔk|r<[jw{=p@S _] hI|"dYudw>%NIMiw=E5SPsjeM֮7bCGqS e}3S ~O_PUn C%D~&=0Ircb\vZ#c4F|Ux_ظR VmŴ[ FMD4b'ii;H&W*LJ@)FZ&ŰWۼ=mj^ߖStٱ"Յ M^g e6=sEF84VlaXUQVب}4@9w SI`CN͞4uBP 0le'c>ڇcZ¢'ࡥb1ͱ?opcXf$ST-;YU{0|wz]z~ yꨏq2F5a˛G:HU/QD.et(BW2j]6M`ӅVYp~ZzM.a`t~7h-yZ<*Tm;$=AzG< @utA@& On/ߢ zFBÎ:Vyy:{6=eReı[ăl8d vaniO O3.pvQ~bz&x !V&Ӂ@[zXS˼6-G[= zzkMN\`P ` poÙ#U:8O1$-bÞIiF!T%mj}::>Ow]F~щY,]:tK}f6g^,>)4_khZLNanKEvGiA;QӼ Iq-< oBo xN)^$7ge4^ l6Ig 9?榅F!JM^f87H'ȉ2yHy!|n!"jU嶓;}}^Y2I({51V-Kw {҃Ń 6smGVZ/ tCM7q)[c/&(Q鷊eӢ`3`w~1a_kiç}ߞ:VcUi+ep|rAO[ӨRYy9)e$5'PcGGAy )"Sqdy @=ȲX)㷨ӦC3s &zKNb߂6/B4D|as7~tYKiqzֶ;6 䶂&! {jZ\l%@PY-ADm=[;.K8N:2OÛ5L$y,Feٟ$in]^튰Qe!W:RMkj6#S)dR{G<πպk;+V - ''.BPUZܰ6ǻ?><"~mUΉ;wj95f|i" =W;g(v0J*3~(,mw`yбw2 2Gq]3^A<Cz+tFY|*jCZ+լd XjH(ps Y902F)LP 6V~?$>WH;lSvL759="zYYݒughԗi~'NU]-ocPS]K cm wŏC?jcxp{RI9_?ZIgkΪ\ >$jE;jD?[׌qiyki0rrē+w (Hb.UV P\Ϯwiٟ:|I)f1+i舠㷰S3񻕼)b^V={޿|j =!N9چwyQzV~.xY8 ?]ǚaz!ŷP>7d-Avv+۩.T_WI/&> 1RI_O8Qs{BΤ\:r_r(>"b*f "˼.y-IZEyN])н+G*>K5Y /:hm&"JrvT>+mg-e hn-Hwz)lOplK~q? 'ѩ(Roc endstream endobj 111 0 obj << /Length1 1407 /Length2 6266 /Length3 0 /Length 7225 /Filter /FlateDecode >> stream xڍuXm> %%H3RJ:  6ZNA$$FD[VZ}ǎc]u^u'=CEL A@e#X@$Fpo? }'DHB`}*P D5܀` X\,! A HOi j"04 2 wr`$ap{(8ܱn@C=G Yg %-$#uG "=y>p3yzVBaV$9 ' ua46 b !@= X/?;jotGA~pi b|1@(FbP =:b7 p_; *=fU2I~ͧcO">-G8^(!c QHsab HRX |흅~50C~PH,0 Z$`0nWǺa-@X_=YaD4!Fj&w "`PB  g{P9@΅ @Ş#{YKe. o[@/S,U%O;Cn~Xza*Abo /^`X5(" Djp_=8/7778vz`@aEf}a5Ͼ{/ P?Qbb0V0d "l c Ib !~`?Lq^X vz|a$SH{pƓJE~aQCbeUz5PeIy-u W2cij  R˝mWZZmEN; >[PzW~\C]-HKt[RR /I1\h3[*ifGbt)?.|!asu)Ae;\z<'1<k( QP;CæO2$)!"y'n^ʉE Ty?B u( >K3a7Cq^Gjx{-ayN-EYT>N'k!0r]Q6C嚡L)3Vp@gJO; YwߘWcѴGt_4f6`.|ME !<5cC߲QWJ3a {A b*u)Jxt5A. 7AGwKPJ͂YN=~p!Ĥ狗R\{9ۿ5-7>P h\wd9ȭ˝).i |#f4vl? !5,(~R!Rn$vc˨S3n6~X2 75,HS %ߟWΣ4R4p j{~mCT&PE7=`wZh^/{IɎ4<l0. ,6-{x. ;m .+,{RL#ܔ;G"_}oPe^apd[B` 3G4;@({nJ"K,n `"QvWĹMn~ݪV`U Cu:ֹ Z93kx5 &; LKw)Vn'L8Xpr.hzM/#4 )(C/n$99b6R ~#N_}u"YC"k % c(,[*0w[[ĶḙBɪF-~vؕ9gsѴiKZdm($nk7Tg͗:%>+ SAv7J,Ҏ!E o Z F 9hךyɡJK]VT" ,FOa*KSTTʩVN>0f#?ohvi;U UT/NZ4עE]4}>f9xDEQ0D-ݜ7|"pENLh(E )>H_vO\*8l"ќ2rSVguepG?. C} v~ɆD Nn)da'^E;(ڋ2MuJ\"̈{,EZ*TWHq@^Vƕehyչ[M*2w DI4+\U\Lmg-oSzvt%\Z9PV6'0Rn'VB8=(ssz7!0:sD"!S96nVSv45Aˋn/4dGOR/Hg[^I~̝p߾^Cz}CCc'-Wx.`āZYݠP<+>y9'` Rssթ!$[eL7;龸t,=)k S*U VzQLŅ*DX{>۪YsR 2ڻ;{ʹmOY!Yx%6xW8C|2Hf=bBnW/:- ^-ψXE0˕E=_/6j:"o[uh5V_.8i>&*@%oiVL# Gނ__ җ`u|tPٝ:Ȣ}|#.\|ncɂܕsⰰ{~j<G*(trZEJӇ0vע& Z#.¦; H-cަl0;mrgrL㹯ӵ$z픿6ձ#Vu-*&tvue GgV'xM!c@u= "±]"N\NӗM?p*'J~<;x,FyQnLKlkphT\)ٖYF! $^kY<}-g4m1/ݟ5 vGH1-)ؘI +]<>⻳мbJg!7'+,V~ Qn/"qqg7}/%% 0'<&hwd&[>gqWJQu9Q \NbӖѮz2O1x'42ytʨFpmy(cu.Nf>oV+?xW-LbBZL5뮸)_ 5Z5\V:TǚfWEm҆~?34\u vOdIq 277I)|ELtםILL2JHV3=cH[WO^wͽD;볣W9氙t$~| s) t:Tg(_D ~pe:.t aC_jP݈J:h)^PvPs#<ϱkr)@,Zkh O"ڠ&֘0l64c(^ˁUwgls󊹒;mzNWd=&/uc Ken+n֎yFjLE@mƭ&vjmQ5xo1J'8"[t$N?9:,cϲ;,jK\mI(_zu1|9^.uO?IW ZvֹAɒ1CR _%smzkө)H 3e 3gیꯪ<\m*8<-Q"lRlOh8+!b`„}.Fg!H"q}7Upp&jɢǶAif@}{YvOwƒ#Kw7-Eg~%6]Q :a` 3Y\*Uʔ; ,grT$%SEX=LcےyhV0 Wwiw6\@^eECsPIYጋQHqBV uw̒@q~-ɮ s_|1N+Z9Mz9[q !oT ZS8z4vVsu\<tږb8KUFjB\*a{u𵽫 ʉi zd]K&~ J^X?-s 7uUpn Fk-Ͼ|OGT㺿$LN=`Z\wH+p71)|~G(.EȀgE.+4>%@Pk.IHt^}Û;/}?~ )>P^yJ:fM"!p7$iJ 'esoN"n3qgu YvnY)ۤ(wm2.3Qѻ+"~;^CoOZ;{R:8hes@g 3Fu9]fo;5^bcw5f~)Lu"b? [G;P'w/Kjǫ>Ri/!ܮT-aɆ09IAeVvR͘2Ww;'Z+h#oi 0 0nNz r[ P5՘ٙ(*[>b騯Z];GOzke9jl4QG-9=+~\Fz,3*8JlKBXM蓂|2AzΛ\Bx/{lj.%% D!q봍f]?ecӈt $u[NF7]9DR_%&kXA,G$@5/jm ./_6qgQsƬQ_Ѣ6O w^_y.U&%x{)1E_0YC(Z䶟lW C4\@UtxH&A<똔RMH73ßna|ג$Dȭw`nM9հX0ѽд&w2:!ǐ@.RHixW|jI3IFWOOzhnl~F`sȚ^a. 38]t)Gqߛ,d ҽOdN=X%W,_TG0z*l_a endstream endobj 113 0 obj << /Length1 1501 /Length2 8402 /Length3 0 /Length 9409 /Filter /FlateDecode >> stream xڍT6L#- RCw ] 0PHHHtw7HI"({yo=k=s}}}׾YuyP' P!>A\VV  ;I6%0w9B$PLR@ ( /"! PìZ|uU셀"/ JH ;B0 FBWp ҶH$?ѕx=+n v.+d sˡFzP:އ9YAjg_dͿ<7;ѿ!3 d9@:*|HO$dvpǃ0=O`Sÿs `HW>Wfe'+E# >% w/ /d s݆3 7ބ  @]PO-@^?No}~>pg}P?5 v7?p@ XBm`N~oZ^aVp'1H]TP{|xBB!1(￳aWH5'k8@bw_ǃ߹8#"YB4;U[?_sq[7 h'пW jss_|? N6H j CBlh/9s9Au᮰7 ( ?[2AQ{ +IPDF+}w~k8 u 1??H7]? [ m'# @7/6B=98D*Ԯ&{yӬۆ霼>V+BΪ5ę|`Õ-eS%_>_#\ޘ'Mn.LP|ár}dބڮΚ&NOzijty$|nNMoA̋ טAwr83[a3\ ^oQQ]v]Z;lƠPE;19 ֵ.aԫ!nX7R~5ovz*ϻ1||+p#/J@qS+5VX13+è;l&ȉԥ1uY?3-6nXqYDt2_J=d =.|Uk0yW%ƚ벌Typ*(qyf菏4 ىu~ݥQlsRNFQ&\"LW7S r@5*fz)'].fY1h\@]X啬D'm^[;]KÎt9}Jfk =nwJwÓ4c;~* 愯f!iߌ s,ޱWLod]_Kf: p>^z `2=z~<\O/T"Y/ _7es%HqG*>)ŧE$Sf)`D <Żlʔ2ݎ[֯J,d',Q8R*ٱ34؉46 eruy$|ʉY>kF<=py4@6܈&!\Z1]iVC>qhɫ\ ճU{1s!c2#`Y\bC+L.!O(F$!lTC"S}SfF\>r;.w&u7EV"Ö.&\,dodM-q\/sP,3>b/-(F#|ؗ*;]*Z꽥Q)vB%dS[ֻ/2[,w` AeA`7m@rj/Fk0I%-:Jf7TWa n]'PBD7BGs8Za:foW>+_-jȒfj~o|lc>O'7|Rapw >llnxP}>NQj ΰkwg^ s(fp]ހFԨM41y[hx ~Iq"ɮ۵5 ( MBNyo9[`'D8Par]ꙺMc)+4Fz7mv-k>Ft1Vʁz,imBgXGbqxlw6p+$Izhӫ<;֑ɡ, [u*fV8PEMxA\_b'P,صqU<:EZ+gba>/bKkQgZ,xރ",k)6Bί~hrH,YAK7w+pE:Pz h &\ E}_W -q=݃7I<>W.KjzĉguMcH kT%PהuB6f/Y 'i@63;)lR!g|lf^weOG/Uq6 kU ǰrM)M)6QP9Q0?К-gڕ!>U؃ОCPQSox9^goL†إ% T;<"[j2!~D?зBm-̂tj^3[{ )ޅ鄊Z%{$|GeY|1hi.?e(e=y|G!MQxeCx}irjhE< EGje3T̫A! yl񡜅ruzMHrUzrͧTD|hy]t,4` p M7cUFKej> =6+͐V(XtrUI*^l@H:1sSDݔa26b+Yh-2|}Bw=bvms@o؅R&.u֚Ĩ3}0xT4y# W$bksu%[9h}XֿZ> BYȫ(R` %4F땲L.>S@)8 bSN08:N[XZFY5qALc]~j%p5d7tx4K 2Q O3zNd<>&zO7&mMl.,u.V>SEAD BBxz+Nv&_CcЃ UMA11+;C.ꪕ 7\LZ#X^vj/0DbmgWx_$E]~֤!䩲qb'(d|<.EwDlg Svi.,ASrLOi=2ɓfmkO'0 ]9~\u< ?40Xq;|at)[cچgxמ7m ({biP3Ieo$O|=LTO"9a$ B7J:_#)L}V{]jOJ`mmp |ҬU[iZg{Y-AsGZXvZ16F~˦ ]q'Ы/k|ȓ'韤@oN$+J9"0}5$?\JF#n?H(ybSW_婻eis(Li81LֺA>mqS],MnPW?BB-qk( B;r z`+$K nqAv\G?zB}?ta(LâCQk 'xl b/Ӫo#c*4i'֑>"XkWy+p7PjRM[,Zs4VQ{?]c}sz \<(X7˖=c{~'CmVT2T` 5sL_rqה4#o!彈f'-bb5^[do(+,uoljqaՀ^Wk \- Ĩ+*NVZ~zFn w!6Z"*gڐ)ptʵOdfn꿌F<-O߲4ES'mEOYGj[8cm Ћ8&=r[Rk(`SPFQ((:g/4(޵P7WZ-q9'g;ii:/?ʹlO.ҠNX52v& B46t'B zm.tدJvPjs^`/@6ѱ&kvᴕooE ٵ="Y%cpBKJ6RF,jϫ'GG%L0GNCtřB;]1Љw6} B,z w9+WU9R`kA\zI!Ex)CLg"T>dWWZ-Q4wܲ  /<3Y7<(fA> OwB&o|>IKg4QxE9Nx"1DUĔe1?Q:`jJ575#vuK inBb!`_fΛ@/8౹fmjs^?f(y;3(+|MQk&4AL]9s!!aUbrUmRĪGΩ]h™M|Vbh]_߫N/L1Uݵ; lK4~%ٶ"!_.~!Ků? 2~itsIcZq,3Sdb~К>9i)zSm)̀YWKVl p`)7œ8H}/NS K8< =aET(?v89/|JwE߯(Y9{DB4УSWiruj2o՝uzU;4ЅzI1H*GXLYګ޹횏kTO} 1=) WVZ7hv~gc-dvvax5Oi B]Cv9xggf7V cJdר4 ;xI*S5qPl_d(WDiݾ}[N= Ǥbl7d-уB<8ʋ2olJBA˲Ňƹ*!̘$-;7ࡽQK.g7/0񻙽zۤ%\Yg;g5Bɩ]M7GC 7B}TגI-9Ǔ\YzTĝ>&l߫\$2X@eH=4:< @Woj21*xM,X5ާta̵cj~:hJUJ mB +j+U0{ Ĉ'Z19p3 .'}@ X?a] ¿W,A(Xm9ifye#9q1]\:vI1*H8Ȧ$ Mu U/p'Y.ŨfDTnzU^og+ظ$Ӕ^e{ɅgbԓEAʁ]x+-ZzفwLSBKڈ/,-9- Lcicf?0&MO3lLLZ|D[!-̞]]\*&kk}:J[W\eflXw~':_pA'0𑊄խ6wT,G0,y&yk[CށƩ4$AGpf4s>YkY ؖqIóR+]4>NٲB\a^`ۘ-Й&YzIZK EAٸxp]äw Ca^ӏqkT2]lXxC bJbq{ -$nSb6_\Yk%c̯ ;Dk^ 1=)lKn:!߱p@G~fPĥhNbCȮH^e*H{EkSFyh0wbwѓݢ\<m5x'w0ƚí z ~)#C1h`"pBW"7#SNO,s:SҔf҉@(*An^Y;G@r/kSdN!ͷF[G_֩"zTowзb&:~ jqR2f`xg6eeHD:_dVC'^%~*ZڟDVuB,R@9O`7ZxWK X͚:qmFj%;-+[J@_'T)S7FlPeYF+M.UZ E:7H)a"eQX?ـU)Kq8k?\~p.2=>b1l@;HiM[bP+h*Fi dw8'De`1n^pȽg{\UI"!~xCClQ9%b*?&?g.{Ӄ}9#ɡ.6Ohq`9fЇ.[nZ痢SCP=V=iRHQ(9,pHf?Lm{G?>JRHx#O"[Ŝ5r3՛F: 1DNx+LPN!$ H[]D(86| $}!#F%V!Y+pHMowT^*F|3ۉ a3u+Rqx }Vҋ+ō+gAKtwIFznL.{rHo/ovdfp76l}/OtbW9jNA{x4ƾ)+3UyݚhV.BXZj+OۗZb#,_Pȧ[֚&)o6c @b0{;:8q!-\M7HǸ/vv0?=Dg G'9qBZv ~tMii? `kc޽u&E#JA@ endstream endobj 115 0 obj << /Length1 2296 /Length2 9330 /Length3 0 /Length 10666 /Filter /FlateDecode >> stream xڍT6 "-) " 03"ҒJ( -)ݍ{_֬53we疵>)A!|~///?39B`A6H; >c1^^?/P@lA! 7fy(vptG_-;OT1_Ylkhڸ;\mmP[0\I8Ā@OOO7(A vw@pw-?0 n+6p)pۂ nH U50o.?ߎmlm.07;J<^\oioavy$ @IV`l`wnmVC]\@w7) [d߽ Ca !`WHURs'sxyyE W;7 Y/ #A_7oۺ;H1o<8 `΋?>Ͽ,f8{:b ?%z|!~A؀ɂRb,KI `g=K [n-xxm_|ߌH oGov[;r4M/jժ wAo#nJ`/[l{Ϝ fp\N 9@[%68I!<;`>Ra!PoC"Ey@;$ j!;u^E"H/:wԽCBixEHdsO6'_b'C. AlSDP. "C"GB 3{YVC? ? 2ǻ;zA?HlY]:ޝ;ȇ$B G=B]:HcHg0[Gg!oTd`G>@;+d{\Pw?·R>dJ@.*F;AwOd@d<O$}W@|@"Ȯu3#Z d3={V,' ^,E uycܘ)ck1EuN&dNV ~1bd՟.s K^ni [[͞@=OdFqT`/Y渏ZLrše4}kQer;MQڼH9S̅ ^JƒْJ"Ld0ʼE*-SX0S~|AJ{|6CX0~rEeyD@oqy*Vy8-V' SnŨ9ogҌn2٪&Cl|vmI'{9Уb..d2Քj{ oޥyOMxM~̾q|)0 zE4@b9gHx^G׎reQ.%Mx z<\0sF`qx\}U(s}^l Zޘ lHܙn#V3ԶN[5j/3|xmRA9H5򕣏ٳYU{9q$DP^`ʼn=2ik{7RetP aaAQ9bfg GmH[4j~OgWXYR6l8x]F|Iz`g>J;wkIj%M%rW{v^ipv6˥)9UύWFIs79A=kkfgڮGž\X^Kf²Jo޽/*+fmj)d1)^˿:rT?y% b|ILz~sbM4"qC3 NJU$uޱwhsYc⻩}w6Sl7Q!zY_ʪVG\]]=%MFiP~+f~QQ%q!bT/h9L4' ne-L-m⨁euTwQPR\3b؎{]gz=H0oG_/j8B6KNG p:95 'wfʡœ~q˜Lh3JӞ"i"nyaR+`PKB^JQZ$/>ldN`t-FZm971GO0Ȕ7>'t %Sܯ*ݐuZsl} ;MNo- "he]PKђ\EsDI7O{?/yӖ`Fzs O6zDe]Bd>J8 IKI [;SVeBw6Aفq:0|s<aAї7>jv~qG˙Pi54fKIǣAoo%GbY%yeDl'$'l'@C_2 &Z7Qv#?X^ۑ!DeE=܁vjniύ(σMѽyT1i#1Txz夊wOe{ԦjbקTB{J1UYbQI'zpU_Y\`0nbT0$NsW-rH\~n^GZzcht@'Uԭj&V߅'BCqöhnEuӮ]=ƢjUku޷I6emlW|k$E:x&^^Y Mk8[):eyiGgʡ'n{ĊchF0ayWqzI>h*09,oyO(Gr%M6;{Njޮ鶞\=\o֘)>v]?K9g+w<>76R ZDk*hh0+f`:ij} `!81AH; ;’ׄ߻_?})>MGT^^*GĵM)o360@}iEv &\YfUbvGE>h^saTP0hpg\h5q%޺j2VΣcPZJu?T4.6ifUwܙ[p5lɚ0Bi@ +nPᐬ0a*BF,tbg:e@7]~ɋ y U9OET{:ⷼ=$=| nn)>{ˬ3+BN|xD"E[KWs}\s=hWufP'nN2ϣ9>z)Rh^*)I?6go1Z͒&mFHh2g\l}u+Ij 1433|~F,56m#l7ą]tjY8\ k{u/0nKyZ Qc"FRpOszBS< M~Lv=tmo)%H\B&>WsL#/-{UGɨtnrrX7v|MXe>ϻ樰z-;'ɶ=\lYP7GC7\[-kP63eCzBMТߡ>kn8_vsZ/jIW*L*w(w[$NMq}[8Y:aiPWyn3ݛz#QGPu^, L.*42GxҘ>luizɫ{<0Ѷ_=Pb;b_1 "kv)f5i]-qօUF%&G#ҍ2_jp]Ҝ.UBkɫŮIuCm这U֮dfB)'TVk mmGEL֭]*UHph>EzL̛jhf]0cBJtb+6d=Lᝈk-ʮ5/]cэ7c?+-?LF%u3֭(hb VCD{C@[lMRuҦ/h=y^=,vأ^vDsZ}GB#*zLt3RIYKiy(ܥ 11=sdىo)ZRKrI1$tvk)ʍH}[p dcAû7ܿ'K_(6va zϟԢ$&TpM;/X!s1 wVG#'diP{{^(ECz#_T.zp`99q p-/WV‘' 愣$tޜ{D,yJ G>?n27*<~Ȏ G:ݭclwBUQ}˖m5E"gZذ c<iqR1^2ElL9I Gω_ͯ5k==*1S &$.t_(A}eah^sGbЧ:]861WXgD *~"߽(K\̿<9t*8O+SCiDdW7&sF5u_w%&"bc wrUx#6}9R[ g(~c-m?W̳vꗸҘ͌׈+.%m$GOmGI)_*|sD5:*n3*Npӏ5nq :8#.#n-נ|4.âmc$x\e~xb_31fZ"-R( gMWN~2j:,f((#Y+Gk—xWlC j,x-.i[$pKz]6 k&_}nOMhx^%ӵ:H7D7~}3ˁKR_MʆzQv?7?sUr4CX Ӧvhk1tIio^^8Tv-@a,ˉs87ݵ__eu%FItN |0Ӟ|m v-eSূOc-ַ(H͌@c;so1nf[ʐ۞E`:ttЄU'fQ4_H; du\LM<"vDHY|czI|,R8=fuQYVwXK/me*(1:mQJ^h—â:7%N4-"1<[GNZp+4,|57Q6;.\YQӼ B.¨L%0gĪ^%96,+Oh'$ Pu&x,vł"ljm[D}ͦLbĸ\ɵ]YK^I΍*ߙhUVL`BnmBwq).g:_xwLȵI?OuT(|^E('q9Ddn.*^|3CnĖc |r Q~j(c}커:X_VY,OQ_43BǾ_ST9T}2hoěƮM&ی;YiZ85=qc#!: oxlk=y)N&KRx9fCQ~-f w0p { sjƷ4}k7DLB +qsK9o 2M`xM[#{q~Z"Yw?sTK`6iS#a`c<9 WlqL*bnjO S |Q{٣4g}LT~jxh?R@Yu A=AϹ4;s~l47(%a~vfD=g9uob J\fB *gW&5#59HM_{و:\U]U\-znvW.1 nPq;!??ԍ6?>O@l_ma[YtEZoL+՟tVQmMC8fs=E{{`O`*wQ c 1|IJ}ghO6m'd ISMsƸ>"TpNhvѾ A몂R nܺ3D$Q ZPأ|*@JǝOznW UR_3 bDlL~RŤ\>&+_ӳ3 +:6V]_d2_Vyً|7ѝ?uTrLj8vx͑n7&ٗ H9l=ȊJlt +6eY10{up3%FakҲMmFem[XY|Pqwjt|=ߨ>Mag7n4 ICUDN&&RP!t5+qcҐt+EX CK 8ђbYN~>T6ZԳ 19`2OgMBи ԧOBBԧeKL2 olp$Z6劗*&i0x +?!~gq+;0?%z?9)Q; lu*RuX*ih'PHLQY)F Bب<2DUҗhSWDIH endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 789 /Length 3199 /Filter /FlateDecode >> stream xZ[o8~cEM.4mf:m&Iyp%ֱ<)ےvR,a&s!iQf63gHGL8/ ~R&bR0iUOJ&S`<=LYy#Z G3J3?)343c\OCMV,M Ӛ$,M3y Fy+6fˑ 铞 !ݠ_s& _a*X } >d's`_"MLJ1Y0 [5p0JzL@.R)z5Ђ^)QF2(wӥ~lꁕ=`~B x͌x4RH"* z9y "xAW  ,AX(4X!&:YX4yBtƖ*R "O9%P1z 69AAq |,&OdXFE F$m4F("={9/#̆U^bKɸWзXF}^ #TqeM n3vU(ɼi0ҵ1˾ &2+ˍw44/fa6{U)݀bVsEvl_'wQIbB$i=*&Mp4#d׏qa1&0LyuIϞI&qqU"ae%dY=71aH"^^`l<.#Iyk {| Ws ڲi`\~A +Q(O}\ #S -~"YEQA\VρZ?E3)l<.!z7? >#o$s-c8"rO *)Y,VCuq%X5:2,=Y3ӓ1/R)HMɏғ'뷘w$V{lwDŽ1;;uvi9xU ƭLI඙= t#ZbPVR{`uۤXɝ=)/ʧ-8&_mt+؟/mIcJ֑}zC}n68YPj_!kU'4@# S}al]Ya DDg( eb4[k@iu/)jc\HfI)(8v^4$W J%Q0eJ4J-/ź݈N5%=E}M18S`;DsMԞ@} Mcgߐu D̷) Ty<,hIV:,6K$XdDH_AsVi\zzr5Œ6>׆:ԗTYD(CII*ż:|SSNP~L[֔veNqwHs4%ޓc#HڲPOy/Il<Sεo%g2X$HA2LT)C>Rs~qd[҂B׼Ja|2][MtDzt#.]kMЇ lR7֗ϢJcT E`"0p8'rS)@! bit7BccY8{͞Y'<ͺD2H[4vao!c<l`e8ANIUL'ޜBhpS2)¹)JO[ ?CrH Ay8[4SsA=f'* l:v0] 9O|ȯx)_o-g>w|8/PN̾dc^xūikg+ƿEs(U#޽~{|pDr?X:!h[,XM5? hjĆ v<kpɗ{P1ۇTքJ!zYS@1kAADԼ !oԠbٷhpGFO3nOnZ97(bm"IKUviHZ#.J.c Nd^ɦE˕nW}uJƕ*ȵoJƕF5]4]n,0l(mwËo5fJWcz}3B֭8pb]9}32']5;OK.9)͞LFz:d}~ׇwk];݉Ι;DSZ ›ݠm۵SjHnGi|&>IL#|D^#ЊM'Qg؄sfq 7X܃bq?0))Oj0*;rY{Ż-O&,DU6i]is#vNuU-=fBm{h7n=vR`Tj.A/z-# endstream endobj 125 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.15)/Keywords() /CreationDate (D:20170919014604+02'00') /ModDate (D:20170919014604+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2015/dev/Debian) kpathsea version 6.2.1dev) >> endobj 121 0 obj << /Type /ObjStm /N 4 /First 30 /Length 211 /Filter /FlateDecode >> stream xmK 0{M71mDo>q Vl<]S+F<-|b@!ISfJpR_L Nmrg׏y6A DIDA!J !"!d|n/hOقT-_ rU:}ss&٫ p:1'C%^Www%Ĵ!M]<Ua6lWSzY &Xi endstream endobj 126 0 obj << /Type /XRef /Index [0 127] /Size 127 /W [1 3 1] /Root 124 0 R /Info 125 0 R /ID [ ] /Length 311 /Filter /FlateDecode >> stream xҷJqsbhEc7kc1Mঃ goCWYRCJ ߧWU+ endstream endobj startxref 150806 %%EOF doParallel/inst/unitTests/0000755000176200001440000000000013160055076015313 5ustar liggesusersdoParallel/inst/unitTests/options.R0000644000176200001440000000463113160053133017125 0ustar liggesuserstest.preschedule <- function() { x <- list(1:3, 1:9, 1:19) cs <- 1:20 dpn <- getDoParName() for (chunkSize in cs) { ## preschedule is TRUE for MC by default and ## FALSE for SNOW, so we test by setting them otherwise if (identical(dpn, "doParallelMC")) { opts <- list(preschedule=FALSE) } else { opts <- list(preschedule=TRUE) } for (y in x) { if (identical(dpn, "doParallelMC")) { actual <- foreach(i=y, .options.multicore=opts) %dopar% i } else { actual <- foreach(i=y, .options.snow=opts) %dopar% i } checkEquals(actual, as.list(y)) if (identical(dpn, "doParallelMC")) { actual <- foreach(i=y, .combine="c", .options.multicore=opts) %dopar% i } else { actual <- foreach(i=y, .combine="c", .options.snow=opts) %dopar% i } checkEquals(actual, y) } } } test.attach <- function() { if (identical(getDoParName(), "doParallelMC")) { return(TRUE) } else { myFun <- function(x){ myFun1(x+1) } myFun1 <- function(x){ 2*x } testFun <- function(){ inRes1 <- checkTrue("exportEnv" %in% search()) if (!inRes1) { stop("Attaching exportEnv failed") } inRes2 <- checkTrue(exists("myFun1", where=2)) if (!inRes1) { stop("myFun1 not found in exportEnv") } myFun(1) } res <- suppressWarnings(foreach(i=1:4, .combine="c", .packages="RUnit", .export="myFun1", .options.snow=list(attachExportEnv=TRUE)) %dopar% testFun()) checkEquals(res, c(4,4, 4, 4)) } } pkgname.test.stress <- function() { if (!require(caret, quietly=TRUE)) { return(TRUE) } else { library(mlbench) data(BostonHousing) lmFit <- train(medv ~ . + rm:lstat, data = BostonHousing, "lm") library(rpart) rpartFit <- train(medv ~ ., data = BostonHousing, "rpart", tuneLength = 9) } } "test.pkgname.test.stress" <- function() { DEACTIVATED("Pending fix for caret issue.") res <- try(pkgname.test.stress()) checkTrue(!is(res, "try-error"), msg="pkgname stress test failed") }doParallel/inst/unitTests/runTestSuite.sh0000644000176200001440000000160012210726132020313 0ustar liggesusers#!/bin/sh LOGFILE=test.log R --vanilla --slave > ${LOGFILE} 2>&1 <<'EOF' library(doParallel) library(RUnit) verbose <- as.logical(Sys.getenv('FOREACH_VERBOSE', 'FALSE')) library(doParallel) registerDoParallel() options(warn=1) options(showWarnCalls=TRUE) cat('Starting test at', date(), '\n') cat(sprintf('doParallel version: %s\n', getDoParVersion())) cat(sprintf('Running with %d worker(s)\n', getDoParWorkers())) tests <- c('options.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) } } stopImplicitCluster() cat('Finished test at', date(), '\n') EOF doParallel/tests/0000755000176200001440000000000013160055076013476 5ustar liggesusersdoParallel/tests/doRUnit.R0000644000176200001440000000535212277005521015210 0ustar liggesusers## unit tests will not be done if RUnit is not available if(require("RUnit", quietly=TRUE)) { ## --- Setup --- pkg <- "doParallel" # <-- 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 # ################################################################ registerDoParallel(2) ################################################################ ## 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 = "^options\\.R$") ## Run tests <- runTestSuite(testSuite) ## Default report name pathReport <- file.path(path, "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") } doParallel/NAMESPACE0000644000176200001440000000024412607265032013553 0ustar liggesusersexport(registerDoParallel) export(stopImplicitCluster) importFrom("utils", "packageDescription", "packageName") import(foreach) import(iterators) import(parallel) doParallel/demo/0000755000176200001440000000000013160055076013260 5ustar liggesusersdoParallel/demo/sincParallel.R0000644000176200001440000000170011664512336016016 0ustar liggesuserslibrary(doParallel) registerDoParallel() # 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") doParallel/demo/00Index0000644000176200001440000000006611667450313014417 0ustar liggesuserssincParallel computation of the sinc function doParallel/NEWS0000644000176200001440000000215412603351207013031 0ustar liggesusersNEWS/ChangeLog for doParallel ----------------------------- 1.0.9 2015-09-21 o Bug fixes to stopImplicitCluster functionality, courtesy of Dan Tenenbaum. 1.0.8 2014-02-25 o Modified vignette to use no more than two workers. 1.0.7 2014-02-01 o Modified to work better when a foreach loop is executed in a package (courtesy of Steve Weston) o Added unit tests and a minimal working example 1.0.6 2013-10-25 o Changed foreach, iterators, and parallel from Depends to Imports (request of Steve Weston and Stefan Schlager) 1.0.4 2013-09-01 o New attachExportEnv option for doParallelSNOW o New function stopImplicitCluster to stop the implicitly created socket cluster. o Updated inst/unitTests/runTestSuite.sh, bug report from Michael Cheng 1.0.3 2013-06-06 o New preschedule option for doParallelSNOW, courtesy of Steve Weston o Removed assignment into global environment to meet CRAN standards. 1.0.2 2013-05-29 o Efficiency improvements courtesy of Steve Weston 1.0.1 2012-04-09 o Updated to support RevoScaleR's rxExec function doParallel/R/0000755000176200001440000000000013160055076012535 5ustar liggesusersdoParallel/R/doParallel.R0000644000176200001440000003765612603351207014754 0ustar liggesusers# # Copyright (c) 2008-2010, Revolution Analytics # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License (version 2) as # published by the Free Software Foundation. # # 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/ # .options <- new.env(parent=emptyenv()) .revoDoParCluster <- NULL # this explicitly registers a multicore parallel backend registerDoParallel <- function(cl, cores=NULL, ...) { opts <- list(...) optnames <- names(opts) if (is.null(optnames)) optnames <- rep('', length(opts)) # filter out unnamed arguments with a warning unnamed <- ! nzchar(optnames) if (any(unnamed)) { warning('ignoring doParallel package option(s) specified with unnamed argument') opts <- opts[!unnamed] optnames <- optnames[!unnamed] } # filter out unrecognized options with a warning recog <- optnames %in% c('nocompile') if (any(!recog)) { warning(sprintf('ignoring unrecognized doParallel package option(s): %s', paste(optnames[!recog], collapse=', ')), call.=FALSE) opts <- opts[recog] optnames <- optnames[recog] } # clear .options in case registerDoParallel is called multiple times old.optnames <- ls(.options, all.names=TRUE) rm(list=old.optnames, pos=.options) # set new options for (i in seq(along=opts)) { assign(optnames[i], opts[[i]], pos=.options) } if (missing(cl) || is.numeric(cl)) { if (.Platform$OS.type == "windows") { if (!missing(cl) && is.numeric(cl)) { cl <- makeCluster(cl) } else { if (!missing(cores) && is.numeric(cores)){ cl <- makeCluster(cores) } else { cl <- makeCluster(3) } } assign(".revoDoParCluster", cl, pos=.options) reg.finalizer(.options, function(e){ stopImplicitCluster() }, onexit = TRUE) setDoPar(doParallelSNOW, cl, snowinfo) } else { if (!missing(cl) && is.numeric(cl)) { cores <- cl } # register multicore backend setDoPar(doParallelMC, cores, mcinfo) } } else { setDoPar(doParallelSNOW, cl, snowinfo) } } "stopImplicitCluster" <- function() { if (exists(".revoDoParCluster", where=.options) && !is.null(.options[['.revoDoParCluster']])) { stopCluster(.options[['.revoDoParCluster']]) remove(".revoDoParCluster", envir=.options) } } # internal function that determines the number of workers to use workers <- function(data) { if ("cluster" %in% class(data)) { length(data) } else { cores <- data if (!is.null(cores)) { # use the number specified when registering doMC cores } else { cores <- getOption('cores') if (!is.null(cores)) { # use the number specified via the 'cores' option cores } else { # use 1/2 the number detected by parallel cores <- parallel::detectCores() if (cores > 2) { cores <- ceiling(cores/2) } cores } } } } # passed to setDoPar via registerDoParallel, and called by getDoParWorkers, etc mcinfo <- function(data, item) { switch(item, workers=workers(data), name='doParallelMC', version=packageDescription('doParallel', fields='Version'), NULL) } # passed to setDoPar via registerDoParallel, and called by getDoParWorkers, etc snowinfo <- function(data, item) { switch(item, workers=workers(data), name='doParallelSNOW', version=packageDescription('doParallel', fields='Version'), NULL) } comp <- if (getRversion() < "2.13.0") { function(expr, ...) expr } else { function(expr, ...) { if (isTRUE(.options$nocompile)) expr else compiler::compile(expr, ...) } } parSpl <- try(parallel::splitList, silent=TRUE) ## Use the "splitList" function from parallel if it's exported ## Otherwise, use the definition it had in R 3.0.2. "splitList" <- if (inherits(parSpl, "try-error")) { function (x, ncl) lapply(splitIndices(length(x), ncl), function(i) x[i]) } else { parSpl } doParallelMC <- function(obj, expr, envir, data) { # set the default mclapply options preschedule <- TRUE set.seed <- TRUE silent <- FALSE cores <- workers(data) if (!inherits(obj, 'foreach')) stop('obj must be a foreach object') it <- iter(obj) argsList <- as.list(it) accumulator <- makeAccum(it) # make sure all of the necessary libraries have been loaded for (p in obj$packages) library(p, character.only=TRUE) # check for multicore-specific options options <- obj$options$multicore if (!is.null(options)) { nms <- names(options) recog <- nms %in% c('preschedule', 'set.seed', 'silent', 'cores') if (any(!recog)) warning(sprintf('ignoring unrecognized multicore option(s): %s', paste(nms[!recog], collapse=', ')), call.=FALSE) if (!is.null(options$preschedule)) { if (!is.logical(options$preschedule) || length(options$preschedule) != 1) { warning('preschedule must be logical value', call.=FALSE) } else { if (obj$verbose) cat(sprintf('setting mc.preschedule option to %d\n', options$preschedule)) preschedule <- options$preschedule } } if (!is.null(options$set.seed)) { if (!is.logical(options$set.seed) || length(options$set.seed) != 1) { warning('set.seed must be logical value', call.=FALSE) } else { if (obj$verbose) cat(sprintf('setting mc.set.seed option to %d\n', options$set.seed)) set.seed <- options$set.seed } } if (!is.null(options$silent)) { if (!is.logical(options$silent) || length(options$silent) != 1) { warning('silent must be logical value', call.=FALSE) } else { if (obj$verbose) cat(sprintf('setting mc.silent option to %d\n', options$silent)) silent <- options$silent } } if (!is.null(options$cores)) { if (!is.numeric(options$cores) || length(options$cores) != 1 || options$cores < 1) { warning('cores must be numeric value >= 1', call.=FALSE) } else { if (obj$verbose) cat(sprintf('setting mc.cores option to %d\n', options$cores)) cores <- options$cores } } } # define the "worker" function, compiling expr if possible c.expr <- comp(expr, env=envir, options=list(suppressUndefined=TRUE)) FUN <- function(args) tryCatch(eval(c.expr, envir=args, enclos=envir), error=function(e) e) # execute the tasks results <- mclapply(argsList, FUN, mc.preschedule=preschedule, mc.set.seed=set.seed, mc.silent=silent, mc.cores=cores) # call the accumulator with all of the results tryCatch(accumulator(results, seq(along=results)), error=function(e) { cat('error calling combine function:\n') print(e) NULL }) # check for errors errorValue <- getErrorValue(it) errorIndex <- getErrorIndex(it) # throw an error or return the combined results 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) } } makeDotsEnv <- function(...) { list(...) function() NULL } .doSnowGlobals <- new.env(parent=emptyenv()) getparentenv <- function(pkgname) { parenv <- NULL # if anything goes wrong, print the error object and return # the global environment tryCatch({ # pkgname is NULL in many cases, as when the foreach loop # is executed interactively or in an R script if (is.character(pkgname)) { # load the specified package if (require(pkgname, character.only=TRUE)) { # search for any function in the package pkgenv <- as.environment(paste0('package:', pkgname)) for (sym in ls(pkgenv)) { fun <- get(sym, pkgenv, inherits=FALSE) if (is.function(fun)) { env <- environment(fun) if (is.environment(env)) { parenv <- env break } } } if (is.null(parenv)) { stop('loaded ', pkgname, ', but parent search failed', call.=FALSE) } else { message('loaded ', pkgname, ' and set parent environment') } } } }, error=function(e) { cat(sprintf('Error getting parent environment: %s\n', conditionMessage(e))) }) # return the global environment by default if (is.null(parenv)) globalenv() else parenv } workerInit <- function(expr, exportenv, pkgname, packages, attach=FALSE) { assign('expr', expr, .doSnowGlobals) assign('exportenv', exportenv, .doSnowGlobals) exportEnv <- .doSnowGlobals$exportenv parent.env(exportEnv) <- getparentenv(pkgname) if (attach) { attach(exportEnv) } tryCatch({ for (p in packages) library(p, character.only=TRUE) NULL # indicates success }, error=function(e) { # a character string indicates an error conditionMessage(e) }) } workerCleanup <- function() { if ("exportEnv" %in% search()) { detach(exportEnv) } } evalWrapper <- function(args) { lapply(names(args), function(n) assign(n, args[[n]], pos=.doSnowGlobals$exportenv)) tryCatch(eval(.doSnowGlobals$expr, envir=.doSnowGlobals$exportenv), error=function(e) e) } # This function takes the place of workerInit and evalWrapper when # preschedule is enabled. It is executed by the master via clusterApply # such that there is a single chunked task for each worker in the # cluster, rather than using clusterCall to initialize the workers and # clusterApplyLB to compute the tasks one-by-one. This strategy can be # significantly more efficient when there are many small tasks, and is # very similar to the default behavior of mclapply. workerPreschedule <- function(largs, expr, exportenv, pkgname, packages) { parent.env(exportenv) <- getparentenv(pkgname) task <- function(args) { lapply(names(args), function(n) assign(n, args[[n]], pos=exportenv)) eval(expr, envir=exportenv) } tryCatch({ # load all necessary packages for (p in packages) library(p, character.only=TRUE) # execute all of the tasks lapply(largs, task) }, error=function(e) { # only one exception was thrown, but we don't know which one, # so we'll return it for all of the tasks lapply(seq_along(largs), function(i) e) }) } doParallelSNOW <- function(obj, expr, envir, data) { cl <- data preschedule <- FALSE attachExportEnv <- FALSE if (!inherits(obj, 'foreach')) stop('obj must be a foreach object') it <- iter(obj) accumulator <- makeAccum(it) # check for snow-specific options options <- obj$options$snow if (!is.null(options)) { nms <- names(options) recog <- nms %in% c('preschedule', 'attachExportEnv') if (any(!recog)) warning(sprintf('ignoring unrecognized snow option(s): %s', paste(nms[!recog], collapse=', ')), call.=FALSE) if (!is.null(options$preschedule)) { if (!is.logical(options$preschedule) || length(options$preschedule) != 1) { warning('preschedule must be logical value', call.=FALSE) } else { if (obj$verbose) cat(sprintf('bundling all tasks into %d chunks\n', length(cl))) preschedule <- options$preschedule } } if (!is.null(options$attachExportEnv)) { if (!is.logical(options$attachExportEnv) || length(options$attachExportEnv) != 1) { warning('attachExportEnv must be logical value', call.=FALSE) } else { if (obj$verbose) cat("attaching export environment\n") attachExportEnv <- options$attachExportEnv } } } # setup the parent environment by first attempting to create an environment # that has '...' defined in it with the appropriate values exportenv <- tryCatch({ qargs <- quote(list(...)) args <- eval(qargs, envir) environment(do.call(makeDotsEnv, args)) }, error=function(e) { new.env(parent=emptyenv()) }) noexport <- union(obj$noexport, obj$argnames) getexports(expr, exportenv, envir, bad=noexport) vars <- ls(exportenv) if (obj$verbose) { if (length(vars) > 0) { cat('automatically exporting the following variables', 'from the local environment:\n') cat(' ', paste(vars, collapse=', '), '\n') } else { cat('no variables are automatically exported\n') } } # compute list of variables to export export <- unique(obj$export) ignore <- intersect(export, vars) if (length(ignore) > 0) { warning(sprintf('already exporting variable(s): %s', paste(ignore, collapse=', '))) export <- setdiff(export, ignore) } # add explicitly exported variables to exportenv if (length(export) > 0) { if (obj$verbose) cat(sprintf('explicitly exporting variables(s): %s\n', paste(export, collapse=', '))) for (sym in export) { if (!exists(sym, envir, inherits=TRUE)) stop(sprintf('unable to find variable "%s"', sym)) val <- get(sym, envir, inherits=TRUE) if (is.function(val) && (identical(environment(val), .GlobalEnv) || identical(environment(val), envir))) { # Changing this function's environment to exportenv allows it to # access/execute any other functions defined in exportenv. This # has always been done for auto-exported functions, and not # doing so for explicitly exported functions results in # functions defined in exportenv that can't call each other. environment(val) <- exportenv } assign(sym, val, pos=exportenv, inherits=FALSE) } } # send exports to workers c.expr <- comp(expr, env=envir, options=list(suppressUndefined=TRUE)) # packageName function added in R 3.0.0 pkgname <- if (exists('packageName', mode='function')) packageName(envir) else NULL if (! preschedule) { # send exports to workers r <- clusterCall(cl, workerInit, c.expr, exportenv, pkgname, obj$packages, attachExportEnv) for (emsg in r) { if (!is.null(emsg)) stop('worker initialization failed: ', emsg) } # execute the tasks argsList <- as.list(it) results <- clusterApplyLB(cl, argsList, evalWrapper) # clean up the workers if (attachExportEnv){ clusterCall(cl, workerCleanup) } } else { # convert argument iterator into a list of lists argsList <- splitList(as.list(it), length(cl)) # execute the tasks results <- do.call(c, clusterApply(cl, argsList, workerPreschedule, c.expr, exportenv, pkgname, obj$packages)) } # call the accumulator with all of the results tryCatch(accumulator(results, seq(along=results)), error=function(e) { cat('error calling combine function:\n') print(e) }) # check for errors errorValue <- getErrorValue(it) errorIndex <- getErrorIndex(it) # throw an error or return the combined results 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) } } doParallel/R/zzz.R0000644000176200001440000000007712210726132013512 0ustar liggesusers".onUnload" <- function(libpath) { stopImplicitCluster() } doParallel/vignettes/0000755000176200001440000000000013160055274014344 5ustar liggesusersdoParallel/vignettes/gettingstartedParallel.Rnw0000644000176200001440000003167012303167501021543 0ustar liggesusers% \VignetteIndexEntry{Getting Started with doParallel and foreach} % \VignetteDepends{doParallel} % \VignetteDepends{foreach} % \VignettePackage{doParallel} \documentclass[12pt]{article} \usepackage{amsmath} \usepackage[pdftex]{graphicx} \usepackage{color} \usepackage{xspace} \usepackage{url} \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{Getting Started with doParallel and foreach} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Getting Started with doParallel and foreach} \author{Steve Weston\footnote{Steve Weston wrote the original version of this vignette for the doMC package. Rich Calaway adapted the vignette for doParallel.} and Rich Calaway \\ doc@revolutionanalytics.com} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} The \texttt{doParallel} package is a ``parallel backend'' for the \texttt{foreach} package. It provides a mechanism needed to execute \texttt{foreach} loops in parallel. The \texttt{foreach} package must be used in conjunction with a package such as \texttt{doParallel} in order to execute code in parallel. The user must register a parallel backend to use, otherwise \texttt{foreach} will execute tasks sequentially, even when the \%dopar\% operator is used.\footnote{\texttt{foreach} will issue a warning that it is running sequentially if no parallel backend has been registered. It will only issue this warning once, however.} The \texttt{doParallel} package acts as an interface between \texttt{foreach} and the \texttt{parallel} package of R 2.14.0 and later. The \texttt{parallel} package is essentially a merger of the \texttt{multicore} package, which was written by Simon Urbanek, and the \texttt{snow} package, which was written by Luke Tierney and others. The \texttt{multicore} functionality supports multiple workers only on those operating systems that support the \texttt{fork} system call; this excludes Windows. By default, \texttt{doParallel} uses \texttt{multicore} functionality on Unix-like systems and \texttt{snow} functionality on Windows. Note that the \texttt{multicore} functionality only runs tasks on a single computer, not a cluster of computers. However, you can use the \texttt{snow} functionality to execute on a cluster, using Unix-like operating systems, Windows, or even a combination. It is pointless to use \texttt{doParallel} and \texttt{parallel} on a machine with only one processor with a single core. To get a speed improvement, it must run on a machine with multiple processors, multiple cores, or both. \section{A word of caution} Because the \texttt{parallel} package in \texttt{multicore} mode starts its workers using \texttt{fork} without doing a subsequent \texttt{exec}, it has some limitations. Some operations cannot be performed properly by forked processes. For example, connection objects very likely won't work. In some cases, this could cause an object to become corrupted, and the R session to crash. \section{Registering the \texttt{doParallel} parallel backend} To register \texttt{doParallel} to be used with \texttt{foreach}, you must call the \texttt{registerDoParallel} function. If you call this with no arguments, on Windows you will get three workers and on Unix-like systems you will get a number of workers equal to approximately half the number of cores on your system. You can also specify a cluster (as created by the \texttt{makeCluster} function) or a number of cores. The \texttt{cores} argument specifies the number of worker processes that \texttt{doParallel} will use to execute tasks, which will by default be equal to one-half the total number of cores on the machine. You don't need to specify a value for it, however. By default, \texttt{doParallel} will use the value of the ``cores'' option, as specified with the standard ``options'' function. If that isn't set, then \texttt{doParallel} will try to detect the number of cores, and use one-half that many workers. Remember: unless \texttt{registerDoMC} is called, \texttt{foreach} will {\em not} run in parallel. Simply loading the \texttt{doParallel} package is not enough. \section{An example \texttt{doParallel} session} Before we go any further, let's load \texttt{doParallel}, register it, and use it with \texttt{foreach}. We will use \texttt{snow}-like functionality in this vignette, so we start by loading the package and starting a cluster: <>= library(doParallel) cl <- makeCluster(2) registerDoParallel(cl) foreach(i=1:3) %dopar% sqrt(i) @ <>= stopCluster(cl) @ To use \texttt{multicore}-like functionality, we would specify the number of cores to use instead (but note that on Windows, attempting to use more than one core with \texttt{parallel} results in an error): \begin{verbatim} library(doParallel} registerDoParallel(cores=2) foreach(i=1:3) %dopar% sqrt(i) \end{verbatim} \begin{quote} Note well that this is {\em not} a practical use of \texttt{doParallel}. This is our ``Hello, world'' program for parallel computing. It tests that everything is installed and set up properly, but don't expect it to run faster than a sequential \texttt{for} loop, because it won't! \texttt{sqrt} executes far too quickly to be worth executing in parallel, even with a large number of iterations. With small tasks, the overhead of scheduling the task and returning the result can be greater than the time to execute the task itself, resulting in poor performance. In addition, this example doesn't make use of the vector capabilities of \texttt{sqrt}, which it must to get decent performance. This is just a test and a pedagogical example, {\em not} a benchmark. \end{quote} But returning to the point of this example, you can see that it is very simple to load \texttt{doParallel} with all of its dependencies (\texttt{foreach}, \texttt{iterators}, \texttt{parallel}, etc), and to register it. For the rest of the R session, whenever you execute \texttt{foreach} with \texttt{\%dopar\%}, the tasks will be executed using \texttt{doParallel} and \texttt{parallel}. Note that you can register a different parallel backend later, or deregister \texttt{doParallel} by registering the sequential backend by calling the \texttt{registerDoSEQ} function. \section{A more serious example} Now that we've gotten our feet wet, let's do something a bit less trivial. One good example is bootstrapping. Let's see how long it takes to run 10,000 bootstrap iterations in parallel on \Sexpr{getDoParWorkers()} cores: <>= library(doParallel) cl <- makeCluster(2) registerDoParallel(cl) @ <>= x <- iris[which(iris[,5] != "setosa"), c(1,5)] trials <- 10000 ptime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %dopar% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] ptime @ Using \texttt{doParallel} and \texttt{parallel} we were able to perform 10,000 bootstrap iterations in \Sexpr{ptime} seconds on \Sexpr{getDoParWorkers()} cores. By changing the \texttt{\%dopar\%} to \texttt{\%do\%}, we can run the same code sequentially to determine the performance improvement: <>= stime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %do% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] stime @ The sequential version ran in \Sexpr{stime} seconds, which means the speed up is about \Sexpr{round(stime / ptime, digits=1)} on \Sexpr{getDoParWorkers()} workers.\footnote{If you build this vignette yourself, you can see how well this problem runs on your hardware. None of the times are hardcoded in this document. You can also run the same example which is in the examples directory of the \texttt{doParallel} distribution.} Ideally, the speed up would be \Sexpr{getDoParWorkers()}, but no multicore CPUs are ideal, and neither are the operating systems and software that run on them. At any rate, this is a more realistic example that is worth executing in parallel. We do not explain what it's doing or how it works here. We just want to give you something more substantial than the \texttt{sqrt} example in case you want to run some benchmarks yourself. You can also run this example on a cluster by simply reregistering with a cluster object that specifies the nodes to use. (See the \texttt{makeCluster} help file for more details.) \section{Getting information about the parallel backend} To find out how many workers \texttt{foreach} is going to use, you can use the \texttt{getDoParWorkers} function: <>= getDoParWorkers() @ This is a useful sanity check that you're actually running in parallel. If you haven't registered a parallel backend, or if your machine only has one core, \texttt{getDoParWorkers} will return one. In either case, don't expect a speed improvement. \texttt{foreach} is clever, but it isn't magic. The \texttt{getDoParWorkers} function is also useful when you want the number of tasks to be equal to the number of workers. You may want to pass this value to an iterator constructor, for example. You can also get the name and version of the currently registered backend: <>= getDoParName() getDoParVersion() @ <>= stopCluster(cl) @ This is mostly useful for documentation purposes, or for checking that you have the most recent version of \texttt{doParallel}. \section{Specifying multicore options} When using \texttt{multicore}-like functionality, the \texttt{doParallel} package allows you to specify various options when running \texttt{foreach} that are supported by the underlying \texttt{mclapply} function: ``preschedule'', ``set.seed'', ``silent'', and ``cores''. You can learn about these options from the \texttt{mclapply} man page. They are set using the \texttt{foreach} \texttt{.options.multicore} argument. Here's an example of how to do that: \begin{verbatim} mcoptions <- list(preschedule=FALSE, set.seed=FALSE) foreach(i=1:3, .options.multicore=mcoptions) %dopar% sqrt(i) \end{verbatim} The ``cores'' options allows you to temporarily override the number of workers to use for a single \texttt{foreach} operation. This is more convenient than having to re-register \texttt{doParallel}. Although if no value of ``cores'' was specified when \texttt{doParallel} was registered, you can also change this value dynamically using the \texttt{options} function: \begin{verbatim} options(cores=2) getDoParWorkers() options(cores=3) getDoParWorkers() \end{verbatim} If you did specify the number of cores when registering \texttt{doParallel}, the ``cores'' option is ignored: \begin{verbatim} registerDoParallel(4) options(cores=2) getDoParWorkers() \end{verbatim} As you can see, there are a number of options for controlling the number of workers to use with \texttt{parallel}, but the default behaviour usually does what you want. \section{Stopping your cluster} If you are using \texttt{snow}-like functionality, you will want to stop your cluster when you are done using it. The \texttt{doParallel} package's \texttt{.onUnload} function will do this automatically if the cluster was created automatically by \texttt{registerDoParallel}, but if you created the cluster manually you should stop it using the \texttt{stopCluster} function: \begin{verbatim} stopCluster(cl) \end{verbatim} \section{Conclusion} The \texttt{doParallel} and \texttt{parallel} packages provide a nice, efficient parallel programming platform for multiprocessor/multicore computers running operating systems such as Linux and Mac OS X. It is very easy to install, and very easy to use. In short order, an average R programmer can start executing parallel programs, without any previous experience in parallel computing. \end{document} doParallel/MD50000644000176200001440000000176213163221107012643 0ustar liggesusersa056991edec77d1c3a181368ede12640 *DESCRIPTION 16c1196e34ef2f64277123d8d53442f5 *NAMESPACE d98f2f0bd408746894779f617982fdbe *NEWS 614375f4652288a8c2ed615b3a53f188 *R/doParallel.R 86f0e4745e79399332a21f661de57bbb *R/zzz.R 8cf2bee4846b91ffb4efeb5a0a53ac94 *build/vignette.rds ad6e7aeda54fa895a60fd8c0c92a39bf *demo/00Index acd97a961dc67743d9ae85b28aa8fec1 *demo/sincParallel.R d1d107a8aed2c92fe6efa71cbc691831 *inst/doc/gettingstartedParallel.R bf3cfed8a81605cf697c7e1e95bd856c *inst/doc/gettingstartedParallel.Rnw d25ccebc88aee016e38b5e1ae4e90389 *inst/doc/gettingstartedParallel.pdf 0a17c88eb4ddb5c75a71bd940627f1b1 *inst/examples/bootParallel.R 5ba3eee5cca8c148b7621cac3b4378bb *inst/unitTests/options.R 59ecbac80339ba8a55adc7ec51ced837 *inst/unitTests/runTestSuite.sh 127e4697324d014bdf67e3e3c9ddf80f *man/doParallel-package.Rd 8f2ff4e8944398c34a7add4667cec738 *man/registerDoParallel.Rd 8a0378f6fce59830532f2880723693f0 *tests/doRUnit.R bf3cfed8a81605cf697c7e1e95bd856c *vignettes/gettingstartedParallel.Rnw doParallel/build/0000755000176200001440000000000013160055274013433 5ustar liggesusersdoParallel/build/vignette.rds0000644000176200001440000000035313160055274015773 0ustar liggesusers= 0~E aSI_^U rI7w/GCc]#0uN ƒ\AH]:lYb[QȼR$!<,rCN~NOGlsx{s:yjww$]4}1"Se +6n_'<\k4h1N 뫾%1N doParallel/DESCRIPTION0000644000176200001440000000177313163221107014043 0ustar liggesusersPackage: doParallel Type: Package Title: Foreach Parallel Adaptor for the 'parallel' Package Version: 1.0.11 Authors@R: c(person("Rich", "Calaway", role="cre", email="richcala@microsoft.com"), person("Microsoft", "Corporation", role=c("aut", "cph")), person("Steve", "Weston", role="aut"), person("Dan", "Tenenbaum", role="ctb")) Description: Provides a parallel backend for the %dopar% function using the parallel package. Depends: R (>= 2.14.0), foreach(>= 1.2.0), iterators(>= 1.0.0), parallel, utils Suggests: caret, mlbench, rpart Enhances: compiler, RUnit License: GPL-2 Author: Rich Calaway [cre], Microsoft Corporation [aut, cph], Steve Weston [aut], Dan Tenenbaum [ctb] Maintainer: Rich Calaway Repository: CRAN Repository/R-Forge/Project: doparallel Repository/R-Forge/Revision: 16 Repository/R-Forge/DateTimeStamp: 2017-09-18 23:27:23 Date/Publication: 2017-09-28 16:24:39 UTC NeedsCompilation: no Packaged: 2017-09-18 23:46:05 UTC; rforge doParallel/man/0000755000176200001440000000000013160055076013107 5ustar liggesusersdoParallel/man/doParallel-package.Rd0000644000176200001440000000264311667450313017056 0ustar liggesusers\name{doParallel-package} \alias{doParallel-package} \alias{doParallel} \docType{package} \title{ The doParallel Package } \description{ The doParallel package provides a parallel backend for the foreach/\%dopar\% function using the \code{parallel} package of R 2.14.0 and later. } \details{ Further information is available in the following help topics: \tabular{ll}{ \code{registerDoParallel} \tab register doParallel to be used by foreach/\%dopar\%\cr } To see a tutorial introduction to the doParallel package, use \code{vignette("gettingstartedParallel")}. To see a tutorial introduction to the foreach package, use \code{vignette("foreach")}. To see a demo of doParallel computing the sinc function, use \code{demo(sincParallel)}. Some examples (in addition to those in the help pages) are included in the ``examples'' directory of the doParallel package. To list the files in the examples directory, use \code{list.files(system.file("examples", package="doParallel"))}. To run the bootstrap example, use \code{source(system.file("examples", "bootParallel.R", package="doParallel"))}. This is a simple benchmark, executing both sequentally and in parallel. There are many more examples that come with the foreach package, which will work with the doParallel package if it is registered as the parallel backend. For a complete list of functions with individual help pages, use \code{library(help="doParallel")}. } \keyword{package} doParallel/man/registerDoParallel.Rd0000644000176200001440000000532212277005521017162 0ustar liggesusers\name{registerDoParallel} \alias{registerDoParallel} \alias{stopImplicitCluster} \title{registerDoParallel} \description{ The \code{registerDoParallel} function is used to register the parallel backend with the \code{foreach} package. } \usage{ registerDoParallel(cl, cores=NULL, \dots) stopImplicitCluster() } \arguments{ \item{cl}{A cluster object as returned by \code{makeCluster}, or the number of nodes to be created in the cluster. If not specified, on Windows a three worker cluster is created and used.} \item{cores}{The number of cores to use for parallel execution. If not specified, the number of cores is set to the value of \code{options("cores")}, if specified, or to one-half the number of cores detected by the \code{parallel} package.} \item{\dots}{Package options. Currently, only the \code{nocompile} option is supported. If \code{nocompile} is set to \code{TRUE}, compiler support is disabled.} } \details{ The \code{parallel} package from R 2.14.0 and later provides functions for parallel execution of R code on machines with multiple cores or processors or multiple computers. It is essentially a blend of the \code{snow} and \code{multicore} packages. By default, the \code{doParallel} package uses \code{snow}-like functionality. The \code{snow}-like functionality should work fine on Unix-like systems, but the \code{multicore}-like functionality is limited to a single sequential worker on Windows systems. On workstations with multiple cores running Unix-like operating systems, the system \code{fork} call is used to spawn copies of the current process. The \code{doParallel} backend supports both multicore and snow options passed through the \code{foreach} function. The supported multicore options are \code{preschedule}, \code{set.seed}, \code{silent}, and \code{cores}, which are analogous to the similarly named arguments to \code{\link{mclapply}}, and are passed using the \code{.options.multicore} argument to \code{foreach}. The supported snow options are \code{preschedule}, which like its multicore analog can be used to chunk the tasks so that each worker gets a prescheduled chunk of tasks, and \code{attachExportEnv}, which can be used to attach the export environment in certain cases where R's lexical scoping is unable to find a needed export. The snow options are passed to \code{foreach} using the \code{.options.snow} argument. The function \code{stopImplicitCluster} can be used in vignettes and other places where it is important to explicitly close the implicitly created cluster. } \examples{ cl <- makePSOCKcluster(2) registerDoParallel(cl) m <- matrix(rnorm(9), 3, 3) foreach(i=1:nrow(m), .combine=rbind) %dopar% (m[i,] / mean(m[i,])) stopCluster(cl) } \keyword{utilities}