doParallel/0000755000176200001440000000000014200212572012324 5ustar liggesusersdoParallel/NAMESPACE0000644000176200001440000000024414170722056013554 0ustar liggesusersexport(registerDoParallel) export(stopImplicitCluster) importFrom("utils", "packageDescription", "packageName") import(foreach) import(iterators) import(parallel) doParallel/demo/0000755000176200001440000000000014170722056013261 5ustar liggesusersdoParallel/demo/00Index0000644000176200001440000000006614170722056014415 0ustar liggesuserssincParallel computation of the sinc function doParallel/demo/sincParallel.R0000644000176200001440000000170014170722056016013 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/man/0000755000176200001440000000000014170722056013110 5ustar liggesusersdoParallel/man/doParallel-package.Rd0000644000176200001440000000264314170722056017054 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.Rd0000644000176200001440000000532214170722056017165 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} doParallel/DESCRIPTION0000644000176200001440000000203314200212572014030 0ustar liggesusersPackage: doParallel Type: Package Title: Foreach Parallel Adaptor for the 'parallel' Package Version: 1.0.17 Authors@R: c(person("Folashade", "Daniel", role="cre", email="fdaniel@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, RUnit Enhances: compiler License: GPL-2 URL: https://github.com/RevolutionAnalytics/doparallel BugReports: https://github.com/RevolutionAnalytics/doparallel/issues NeedsCompilation: no Packaged: 2022-01-16 17:54:13 UTC; folashade Author: Folashade Daniel [cre], Microsoft Corporation [aut, cph], Steve Weston [aut], Dan Tenenbaum [ctb] Maintainer: Folashade Daniel Repository: CRAN Date/Publication: 2022-02-07 12:50:02 UTC doParallel/build/0000755000176200001440000000000014171055705013435 5ustar liggesusersdoParallel/build/vignette.rds0000644000176200001440000000035314171055705015775 0ustar liggesusers; 0ǯ_ApB?"zb*iիj#\dp ٵl}'kS-Kr"tᐓyEu"!Z"PKdpwI&9O2|pM>z#ޙ҉,NF͑tt.2SkLɄTQ]w!XNg[=|o3Y3˟r)A#İpk doParallel/tests/0000755000176200001440000000000014170722056013477 5ustar liggesusersdoParallel/tests/doRUnit.R0000644000176200001440000000535714170722056015220 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(tempdir(), "report") ## Report to stdout and text files cat("------------------- UNIT TEST SUMMARY ---------------------\n\n") printTextProtocol(tests, showDetails=FALSE) printTextProtocol(tests, showDetails=FALSE, fileName=paste(pathReport, "Summary.txt", sep="")) printTextProtocol(tests, showDetails=TRUE, fileName=paste(pathReport, ".txt", sep="")) ## Report to HTML file printHTMLProtocol(tests, fileName=paste(pathReport, ".html", sep="")) # printHTMLProtocol(tests, fileName=file.path(dirname(dirname(getwd())),pkg,"gsDesign-RUnit-Test-Summary.html")) #paste(pathReport, ".html", sep="")) ## Return stop() to cause R CMD check stop in case of ## - failures i.e. FALSE to unit tests or ## - errors i.e. R errors tmp <- getErrors(tests) if(tmp$nFail > 0 | tmp$nErr > 0) { stop(paste("\n\nunit testing failed (#test failures: ", tmp$nFail, ", #R errors: ", tmp$nErr, ")\n\n", sep="")) } } else { warning("cannot run unit tests -- package RUnit is not available") } doParallel/vignettes/0000755000176200001440000000000014171055705014346 5ustar liggesusersdoParallel/vignettes/gettingstartedParallel.Rnw0000644000176200001440000003163114170722056021546 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} \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/NEWS0000644000176200001440000000322114171055503013027 0ustar liggesusersNEWS/ChangeLog for doParallel ----------------------------- 1.0.17 2022-01-16 o Maintainer change (Folashade Daniel; fdaniel@microsoft.com). 1.0.16 2020-10-12 o Maintainer change (Michelle Wallig; Michelle.Wallig@microsoft.com). 1.0.15 2019-08-02 o Maintainer change (Hong Ooi; hongooi@microsoft.com). 1.0.14 2018-09-24 o Re-enabled tests. o Moved RUnit from Enhances to Suggests (request of Kurt Hornik) 1.0.13 2018-04-04 o Changes to support enhanced exports via future (if available). 1.0.12 2017-12-08 o Change test report path for compliance with CRAN policies. 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/0000755000176200001440000000000014170722056012536 5ustar liggesusersdoParallel/R/doParallel.R0000644000176200001440000004033014170722056014740 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) packages <- getexports(expr, exportenv, envir, bad=noexport) if(obj$verbose) cat(sprintf('discovered package(s): %s\n', paste(packages, collapse=', '))) 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 packages = c(packages, obj$packages) if (obj$verbose) { cat(sprintf('explicitly exporting package(s): %s\n', paste(packages, collapse=', '))) } if (! preschedule) { # send exports to workers r <- clusterCall(cl, workerInit, c.expr, exportenv, pkgname, 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, 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.R0000644000176200001440000000007714170722056013522 0ustar liggesusers".onUnload" <- function(libpath) { stopImplicitCluster() } doParallel/MD50000644000176200001440000000176214200212572012642 0ustar liggesusersf551bbe84661c46cdb82f554171be6f4 *DESCRIPTION 16c1196e34ef2f64277123d8d53442f5 *NAMESPACE 427f56d5caabfe2c8b9bf12b7a95caa2 *NEWS 3557e2d9a3559635f173a7be632fbfe9 *R/doParallel.R 86f0e4745e79399332a21f661de57bbb *R/zzz.R 5c15b9946210cbae2bdf51d46b2a8a85 *build/vignette.rds ad6e7aeda54fa895a60fd8c0c92a39bf *demo/00Index acd97a961dc67743d9ae85b28aa8fec1 *demo/sincParallel.R d1d107a8aed2c92fe6efa71cbc691831 *inst/doc/gettingstartedParallel.R ea5d01de6d686a485e65dd1266ae12e3 *inst/doc/gettingstartedParallel.Rnw b1826aa73459563f836488d935904cdc *inst/doc/gettingstartedParallel.pdf 0a17c88eb4ddb5c75a71bd940627f1b1 *inst/examples/bootParallel.R f2621d4a791a20471698dfe4ceb351eb *inst/unitTests/options.R 59ecbac80339ba8a55adc7ec51ced837 *inst/unitTests/runTestSuite.sh 127e4697324d014bdf67e3e3c9ddf80f *man/doParallel-package.Rd 8f2ff4e8944398c34a7add4667cec738 *man/registerDoParallel.Rd c839b703f8dc3cb5c79d48385effe11c *tests/doRUnit.R ea5d01de6d686a485e65dd1266ae12e3 *vignettes/gettingstartedParallel.Rnw doParallel/inst/0000755000176200001440000000000014171055705013313 5ustar liggesusersdoParallel/inst/examples/0000755000176200001440000000000014170722056015130 5ustar liggesusersdoParallel/inst/examples/bootParallel.R0000644000176200001440000000471714170722056017704 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/0000755000176200001440000000000014171055705014060 5ustar liggesusersdoParallel/inst/doc/gettingstartedParallel.pdf0000644000176200001440000046547514171055704021304 0ustar liggesusers%PDF-1.5 % 1 0 obj << /S /GoTo /D (section.1) >> endobj 4 0 obj (\376\377\000I\000n\000t\000r\000o\000d\000u\000c\000t\000i\000o\000n) endobj 5 0 obj << /S /GoTo /D (section.2) >> endobj 8 0 obj (\376\377\000A\000\040\000w\000o\000r\000d\000\040\000o\000f\000\040\000c\000a\000u\000t\000i\000o\000n) endobj 9 0 obj << /S /GoTo /D (section.3) >> endobj 12 0 obj (\376\377\000R\000e\000g\000i\000s\000t\000e\000r\000i\000n\000g\000\040\000t\000h\000e\000\040\000d\000o\000P\000a\000r\000a\000l\000l\000e\000l\000\040\000p\000a\000r\000a\000l\000l\000e\000l\000\040\000b\000a\000c\000k\000e\000n\000d) endobj 13 0 obj << /S /GoTo /D (section.4) >> endobj 16 0 obj (\376\377\000A\000n\000\040\000e\000x\000a\000m\000p\000l\000e\000\040\000d\000o\000P\000a\000r\000a\000l\000l\000e\000l\000\040\000s\000e\000s\000s\000i\000o\000n) endobj 17 0 obj << /S /GoTo /D (section.5) >> endobj 20 0 obj (\376\377\000A\000\040\000m\000o\000r\000e\000\040\000s\000e\000r\000i\000o\000u\000s\000\040\000e\000x\000a\000m\000p\000l\000e) endobj 21 0 obj << /S /GoTo /D (section.6) >> endobj 24 0 obj (\376\377\000G\000e\000t\000t\000i\000n\000g\000\040\000i\000n\000f\000o\000r\000m\000a\000t\000i\000o\000n\000\040\000a\000b\000o\000u\000t\000\040\000t\000h\000e\000\040\000p\000a\000r\000a\000l\000l\000e\000l\000\040\000b\000a\000c\000k\000e\000n\000d) endobj 25 0 obj << /S /GoTo /D (section.7) >> endobj 28 0 obj (\376\377\000S\000p\000e\000c\000i\000f\000y\000i\000n\000g\000\040\000m\000u\000l\000t\000i\000c\000o\000r\000e\000\040\000o\000p\000t\000i\000o\000n\000s) endobj 29 0 obj << /S /GoTo /D (section.8) >> endobj 32 0 obj (\376\377\000S\000t\000o\000p\000p\000i\000n\000g\000\040\000y\000o\000u\000r\000\040\000c\000l\000u\000s\000t\000e\000r) endobj 33 0 obj << /S /GoTo /D (section.9) >> endobj 36 0 obj (\376\377\000C\000o\000n\000c\000l\000u\000s\000i\000o\000n) endobj 37 0 obj << /S /GoTo /D [38 0 R /Fit] >> endobj 41 0 obj << /Length 2361 /Filter /FlateDecode >> stream xYKoFW 2ؙL]d' ˴-z(9֫ekrE'Ⲩ'ߝ}T*ӋBt4EQC3vVU3,_myhoK ?L(i_sKkxI\MWOxB;e]0^2ա;B;b13l j.Tpj-qG,ef\w+@fŚ0K֨J{Syf5M`YMSl^RG{>"^țnlDz|}TFUJSzT 5kJy#'O*J907^ gWLgW'kyf+j#ͮIn4yAHi8dG7ڬGHL_Ϻ1ίg#0+5pO٤lS$B. D?dC^N^W6rψ6ͦA؞Y\6bi0^ ҅GV$t3eb*GD̓J$E|k@f^@% G +J(\/YNkv73n~VAFeCOaX#vTbj *!Y 3dTt3GRj*D콝W }スHF36rARlj }DnȲ)M+ 8Vx]Jvܰ7eu|IU$-g q*@Co0c7J *CHZ7 z!>XXn[ɝ`Y&Z.P7QyW:K, A7C5T镱کXNS{\R"cze$wg" OL*}smW  ju %k/0lʎȵw ,dq)6[ld&|v!E \f޼M?@GJE^[i = oQfGSIdw75yרq֛GjҺɗ- =8q\:;Zu [+OrS|_tL0B>.9. *h7ǟ]wIL8ϳd92 FHqH@ynssIEBUjD ֞!tk8NraWveo7* "\.,ǢHEw|qs.gZlF` c5rCT4_ (@u~In2 X}#h =ԧIx ,gKA0G'M@&)D 'R? F1&qcD^ZN槟=[ƝW aGm(dC:s,͊<2a Cohev,`[lXw!yz_BC% endstream endobj 38 0 obj << /Type /Page /Contents 41 0 R /Resources 40 0 R /MediaBox [0 0 612 792] /Parent 55 0 R /Annots [ 39 0 R ] >> endobj 39 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [137.873 387.235 144.595 400.954] /A << /S /GoTo /D (Hfootnote.1) >> >> endobj 42 0 obj << /D [38 0 R /XYZ 53 735.4 null] >> endobj 43 0 obj << /D [38 0 R /XYZ 54 697.538 null] >> endobj 2 0 obj << /D [38 0 R /XYZ 54 508.138 null] >> endobj 53 0 obj << /D [38 0 R /XYZ 71.933 191.043 null] >> endobj 40 0 obj << /Font << /F60 44 0 R /F33 45 0 R /F39 46 0 R /F67 47 0 R /F73 48 0 R /F46 49 0 R /F42 50 0 R /F19 51 0 R /F18 52 0 R /F81 54 0 R >> /ProcSet [ /PDF /Text ] >> endobj 58 0 obj << /Length 2409 /Filter /FlateDecode >> stream xڝYmo6_!(*kIz)^8͡8bI.p%٢Dg3ϼH%WJ~9{{~<:3&uNJc3SU::=\Wen\?n|Ӯ~pk}aJ?kWD6Nl ]/.;٧3 D'&3d;p5<-QY]=%NY&LŲeh oQU,Z)Mz<K_ƿX5'ET*y-=ٷ- DkzC"P.+Kth83*QlLBcN[v'YxeXL7Hʀ9qr{r-Pw~K,ryL頸0|;ǰ27`ot~cY$5@0Rq%r:p '/d4l[XT\^x}y&n֙-@$CdZwt-bXz85^3u''ZEsfU\]n*U56U`gW*3qQ1pȀJSA%)]FWװ#Q>{4 7,g`@ .REOs%6`sL>Ěk[`sտmAef[ xcfb[˵#Wܡ:+`>uk@.3-%|x6ak >k^ XYb$Gosds"&q<2TW[ڏjsM@8# `fP~'?߰s69]'xÅi107zaƐSL{X?6p35~JդZ\X:]"郯=Up*:[)UgRji-o}+}[&.J$CM*O/IJFn>] .M9NP##mE}_"h gSTCS?s6y5UV&Zow33`Nɸ4U]|ڗ~۝ %gɎSc3t endstream endobj 57 0 obj << /Type /Page /Contents 58 0 R /Resources 56 0 R /MediaBox [0 0 612 792] /Parent 55 0 R >> endobj 59 0 obj << /D [57 0 R /XYZ 71 735.4 null] >> endobj 6 0 obj << /D [57 0 R /XYZ 54 697.538 null] >> endobj 10 0 obj << /D [57 0 R /XYZ 54 588.464 null] >> endobj 14 0 obj << /D [57 0 R /XYZ 54 356.225 null] >> endobj 56 0 obj << /Font << /F33 45 0 R /F67 47 0 R /F73 48 0 R /F88 60 0 R /F90 61 0 R >> /ProcSet [ /PDF /Text ] >> endobj 64 0 obj << /Length 2727 /Filter /FlateDecode >> stream xڝ]oݿB p8 XI I\Zlut>H{gvfv4Krwfvvgbr?)&]}}so(ϝӓDMn*5u]Onwi2|๟Όv<y.iqLuE <~ A5L7?\}ssJDMTj[WN۫d ?L|>/'j;qU@]jC~ 5we\VәS&S9T  KL?y-or3Q43S:<23u^Lx-Qv8FKc6wS]yuf/D{=BA OZg׀V#N0G$?38rYwt D_DdJpw[Α8̞cZbIgI .\ow(9Lun̼ Ԓ%X'z_`?v(mF\EUİ'R0,!΢^^ 3%XAI(Ȧ#kOAobtV?l_έHiSun3,^!>aFEA` #>rUe.{@usAͧgnV!8XWqE0|8gQSH2HUt`9|nx܃XZgNS3:5رs9.;!V,iMH{(+\M!~Ŵ4W>,YIA0O;ZNj$32}~Vn!H )M&amĕd=m< HiMaMl6VR+5XFc);iɕ8ÖIp'v>&3Yú]N-oǞP>+ $&=>:-) ȸ-t(cKKTJ8[4wfpK)̕ʫ ᑥƮbl3/sJNd b_VқZ:G9s,zZ b? -Ӷ=Bݑ^ Cq+&-?UMBXMzZ3Kmgqtêk+t.z % %t&xx5)S)j0@j`Kό\p㈌vmۧ!B5 C''蒸8']|BAcęϪgrQ&[V!ᘥhZ«/9e,:k+\ Bl c= 4hbMW '٤EEڿsP< h0d ny.(yz-K9({٬ 픭P$^m _"[.DvV{-O*xS奱@e9G \~$h.ѦMz6 omj[q-D(p Z~Л@o'Xnj\EebR^s\L- i`@ <ǫ+Jk-m\nqNPe^r5nTT!W~\.l)y dJ?A#Tlgn^l=eIj~c [ח7?ɤymCt>'䲚*YʝHà-_LE [Omrl `\‚MCĖ[F!h+5^_#M@6|]mI 3د98[xTwC@wx)~x#|X'Nη{O3̑8\{@$tƒos=|X=**(K JпoK)%9ɹМȑU1?^'*ߢ 9=I\8ʅǰ"Ў|! eT~(*lx^ l8-^0~pσIվ\؏-Qohe2(= 78|O&EF%dv요ZrJ43e/(P|gϸ; ؆@mpU{Dgꐯ9TOqy\.C mr E^OP|ؑc!/[jP[*k_R>s' BK O!,dIx͟n 0aqpJΔ*j 07.[%gRp})}|:T+}5xYx/ /QDQtYs_ F1)c)}nr4Pz endstream endobj 63 0 obj << /Type /Page /Contents 64 0 R /Resources 62 0 R /MediaBox [0 0 612 792] /Parent 55 0 R >> endobj 65 0 obj << /D [63 0 R /XYZ 53 735.4 null] >> endobj 18 0 obj << /D [63 0 R /XYZ 54 319.173 null] >> endobj 62 0 obj << /Font << /F33 45 0 R /F73 48 0 R /F88 60 0 R /F67 47 0 R /F90 61 0 R >> /ProcSet [ /PDF /Text ] >> endobj 69 0 obj << /Length 2308 /Filter /FlateDecode >> stream xڍY[~_EmtE]@&!eb[d%g2(ߞs%)YƼGNl4ys:XkȒMbg\e*MV:yx Ko|ˊ/2ܞѭyi/;yeV1u ATp&v8u击otcA4I'mL^xCa$5MS&ODuL4CO7i|jtv`Vօ)jP NŬ"ḗA6iZ=O[ mDL.eKʅ8vVzYi˜VȞ5)A!U2Pa}ʯ-DJȿ~T| !(t_Nsh"A2=oB1ւjb#Î/+ﳊITArT#U͐3w ^ 6+ZKC$ܤn?$e5H?]F*XH2LhRPKijbӕWz𫬱7%FZ~T'YD 8JF܉K. TZ a.0Tk{RLe!$`4UjPK$7Ή3YBMc2X[ђ֪P@.,e=*We!D!hY4<Κq(EQ8 ȏ8l wkDo{^#Ljq?@Y?\ Z3/ԝ$G2bG=%Gm"# ?HØL bFTáO;>s?,% 1=D͖͌:E{=:vϖ>Q'&;0f̎29RqqV~kA(?yjjNcq VVq4WxBZ{<TI͝b U10)p9'x8xoA#ogbw^r9MSzs?+u6 [r 2Qh[`޸&g?M|˲f쀓>?$ G`>B@Zd#@*Nѣi3] [1`NaSu H_ Q\r.p^^ B&]:n1HɣN{|T$|B#g5Q#y WE3OcHکmЩ(9z_D{׬oyv (_ **# ~ T,Dt'TK endstream endobj 68 0 obj << /Type /Page /Contents 69 0 R /Resources 67 0 R /MediaBox [0 0 612 792] /Parent 55 0 R /Annots [ 66 0 R ] >> endobj 66 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [552.274 384.973 558.996 398.692] /A << /S /GoTo /D (Hfootnote.2) >> >> endobj 70 0 obj << /D [68 0 R /XYZ 71 735.4 null] >> endobj 22 0 obj << /D [68 0 R /XYZ 54 258.986 null] >> endobj 71 0 obj << /D [68 0 R /XYZ 71.933 122.026 null] >> endobj 67 0 obj << /Font << /F33 45 0 R /F73 48 0 R /F90 61 0 R /F46 49 0 R /F67 47 0 R /F18 52 0 R /F19 51 0 R /F81 54 0 R >> /ProcSet [ /PDF /Text ] >> endobj 74 0 obj << /Length 2190 /Filter /FlateDecode >> stream xڭY[۸~_!X \)ih^PȠAh.ۚXοPF \s]dWYxZiLv~*[22u_dBṁgbiqjύo㚾/󯅩h ?fxw л9˙Lg*ݨl=.PM{\Q&{wi}Jx9jK_3}L+9bPyyDf0BRhـЪ[ڃD"9PC ~ ϾcAHe@{%D&tҚ˔#":jwLa8AUXX ̖9$hYڢ? 6L5`Y{N DX< EdZv [~]:$<}Y2CCDЅA>76liM6N>nnaC"w13BmP%a<UtJY#4h-ƃMčǣ[B8{DnǖT-jV8'Xmrʏ #B,jEщ}F;'Ұgv?PIHar׊jRV^βfUmd|ZADUEZ8!t_~J@!k{UlCQ ]V@ԡd_6D "\%X[qJ 1Kɞ1|@}5Ξa]Ԛ!Q8aҀJt} ]A8_Rd|]GnjQ%$-% ďWŽ UԄyܔNijCX ӘI}zjAG3yt}Cb`tC;d''k8YʊAbDAߍY7x~},\A?z`i98rM7K;$Aht,ᥫb{bQjVWC|'Z)jҠR$΀`",K.9<]9>I34qH3:KU+{:j`%t1Fȓ6Ihb z \WhHѯS %2bz#b_yDtd֔%aPB,ͪ7t{ |)b?mFD)] A#ǁ휲E\IǏ.6˲Ld` ETSؗ)ի6n  Ҟ]qOnƢ1s ^A^dpf!QP504!-8hnϙfe~UmN(:]jȔ8r;LGh'pcd刷9SMj+$Cx^?O=CH]PGؤhGtBׯYWUHS͆|K8A4[5!DĔVH%MoY]XcԾA$Rt8[aP$itK Ք5d@gul5r٘D.@sI&fϜ% T4( Tym<(;U'K*9MXf4܄MB:^doxlN&HrM gC'ȕh fOlZHR7pPf <\ԕl#&IuI[I̸`$#d[s*H)|;Xjw ҏy Jf +}̓k/*UOxXX,4I[(=7vrI|d ]m/½qVxejjc<'}N\jon>P'I0uU(G5s3~Tسì endstream endobj 73 0 obj << /Type /Page /Contents 74 0 R /Resources 72 0 R /MediaBox [0 0 612 792] /Parent 55 0 R >> endobj 75 0 obj << /D [73 0 R /XYZ 53 735.4 null] >> endobj 26 0 obj << /D [73 0 R /XYZ 54 404.44 null] >> endobj 72 0 obj << /Font << /F33 45 0 R /F73 48 0 R /F90 61 0 R /F67 47 0 R >> /ProcSet [ /PDF /Text ] >> endobj 78 0 obj << /Length 1516 /Filter /FlateDecode >> stream xڝIV_aRG~ ~Q6k6 U u!j>_z=w@~ Mܕ&I޾_֔e6HmMfޯ{VR1+b5_DiQ'˚Ļn,lj9^q[^@-.>0΁)¦F Uq&1a0ГgH(M4Dx>#/ "$IW D|\=4^aX~Dž?Qk1x*EbRB-LGOυ,?rn D=ъ;DuF:"(eX'ܡq̙#=3JfU f?R=c)uvd:>0nT kMqDEXZMc*™RQXoDH?eLH86I>Tۄ `A,bcS`ИS̡ .4\9$4?yQ4BL! *P,߈ qlQ4yf`gQNrNqF+M}+}z7Ś`MCqT2E5d׍2FO*SOpN#GXO1&Mz"q/@ &VRE*#šKR>J],4l9Eh]8g,ߢ ^**T)B)>{twjΚ~u + .z 72kqہ`P;:Kvc[KqFj Sd0vyrOU:!USi7a2ZDy1^!6<4DVz4RSkN $͢[3%69b7p dYʈE9 'RLiV(lYٚ[ 7(//\Z)l+?/F '(9oRM5iICz+3Pt|k,1+N~ `6jB*j twv ]y%J^|D/rCoȰ~PGˤCs?K*g'gJ1DyZ"IŎ;)yA#T$W S!FGV$*X)6_>M>ُǐ{|cr?PK(aA8ȫIE=ìE2|JDu66q3Xe_q&`OHa]ruj_ endstream endobj 77 0 obj << /Type /Page /Contents 78 0 R /Resources 76 0 R /MediaBox [0 0 612 792] /Parent 55 0 R >> endobj 79 0 obj << /D [77 0 R /XYZ 71 735.4 null] >> endobj 30 0 obj << /D [77 0 R /XYZ 54 552.404 null] >> endobj 34 0 obj << /D [77 0 R /XYZ 54 393.888 null] >> endobj 76 0 obj << /Font << /F33 45 0 R /F73 48 0 R /F67 47 0 R >> /ProcSet [ /PDF /Text ] >> endobj 80 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 81 0 obj [550 500 500 450 412.5 400 325] endobj 82 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 83 0 obj [569.5 569.5] endobj 84 0 obj [277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8] endobj 85 0 obj << /Length 136 /Filter /FlateDecode >> stream x363P0P0Q0R0P02WH1*22(%s<=\ %E\N \. ц \.  (燅w`?C "@q,P P%^.WO@. ) endstream endobj 50 0 obj << /Type /Font /Subtype /Type3 /Name /F42 /FontMatrix [0.01721 0 0 0.01721 0 0] /FontBBox [ 4 2 28 27 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 42 /LastChar 42 /Widths 86 0 R /Encoding 87 0 R /CharProcs 88 0 R >> endobj 86 0 obj [33.08 ] endobj 87 0 obj << /Type /Encoding /Differences [42/a42] >> endobj 88 0 obj << /a42 85 0 R >> endobj 89 0 obj [531.3 531.3] endobj 90 0 obj [514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6] endobj 91 0 obj [500 500 500 500 500 500 500 500 500 277.8 277.8 305.6 777.8 472.2 472.2 777.8 755.6 711.1 722.2 766.7 655.6 627.8 786.1 783.3 397.2 516.7 783.3 600 950 783.3 750 683.3 750 759.7 555.6 694.4 769.4 755.6 1033.3 755.6 755.6 611.1 280 544.4 280 500 277.8 277.8 486.1 555.6 444.4 555.6 466.7 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 427.8 394.4 390.3 555.6 527.8 722.2 527.8 527.8] endobj 92 0 obj << /Length 163 /Filter /FlateDecode >> stream x3135R0P0U0V06W0TH1*26(%s< =\ %E\N @QhX.O8qs憺 ꛛn 10`` 6P $RR  2d>@nr ED endstream endobj 46 0 obj << /Type /Font /Subtype /Type3 /Name /F39 /FontMatrix [0.01204 0 0 0.01204 0 0] /FontBBox [ 5 3 37 39 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 42 /LastChar 42 /Widths 93 0 R /Encoding 94 0 R /CharProcs 95 0 R >> endobj 93 0 obj [41.52 ] endobj 94 0 obj << /Type /Encoding /Differences [42/a42] >> endobj 95 0 obj << /a42 92 0 R >> endobj 96 0 obj [571.2 544 544 816 816 272 299.2 489.6 489.6 489.6 489.6 489.6 734 435.2 489.6 707.2 761.6 489.6 883.8 992.6 761.6 272 272 489.6 816 489.6 816 761.6 272 380.8 380.8 489.6 761.6 272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8 707.2 516.8 516.8] endobj 97 0 obj [726.3 693.3 327.6 471.5 719.4 576 850 693.3 719.8 628.2 719.8 680.5 510.9 667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1 510.9 484.7 667.6] endobj 98 0 obj << /Length1 1911 /Length2 12604 /Length3 0 /Length 13780 /Filter /FlateDecode >> stream xڍP\k.  %]dpww.A ,Xpw~rUTͬi}5JLfv&@);33+@\AʎHMr-F::|";do<;0@`cceΑ a 2(0@'Djq;{G[yКxy4A`%- @t/|,,nnnƶNvBt7%@tt(Wë5K_rU;sg7cG M`2,\f@G[p<@,wollq@?MMl d(J3;;3fm]A6&o?37H* <'SGYpeI-G~ G[=X:Yko`Q=:&BGftprs%<*Ueog0+2 z9Ύ.@+!@71/v w.XIm6<_EIemI*NL`bd~{o7JƠ,Wom]ڿ߾>ٽM-@ϐr}?&ې\llTmA6ކmVd@la&@@3%_\JvN?.+ҽ-6o{!%vf,;''m̀0lfx+`nyrqXD,AlE?zөy1XLA?*f1||+fCx k-9_\eF`|/[6o6O7SۉKV7cRj/ؿf{K +_No?oOo[lWg޲uv[.oO_gvy9M?z h0kglUvW#Jƴ3*8EN B5+pF4e}yKZd밥.{raN+8nXѡ^b&5P-ry.jP*;3 fw`Qu溙f:h}!B]&mTM9XfM $QMԂ4ch"<:Q``AWDn|2%Q,cBI? =̗(aeD^^b^2}G3\%rr^llkLzj#$Rw\ߗ[`nڌ{bP|ƥV]Rli>vG+~hº痻0Z&#䧀hť ߘmM;וVJ+OzZܕwe{ 8UDO)zQ>i=ֱwD9#fs>ݫ8h4rw.}H|JK.A0_reA;:_tf%r`仲+QKiVֿǗP(k#fA?`LTbK0, M^RQۏ{\XJ\Kρ%+[UC>HFʈrW,EԹ.㳍iaSerzu9=q ډϨXҊf$( >s|ƒog@>P{+0&˝䠚&`ya斚loSi+ X8nED)_PR-m?r~ v_R`5& |cH+ ymWiݹgpYMZBDJ[GFqqаg <!2(VYob@w~(e-IO1z&*3Gtugڵ1YMvC>"R)&/1.|@oecR}:۴X )!0-b*Rz~9j#LvXПa~<çv&pzĚl:qMuY|uk;)0FЕ&KWJ5J{&T 5׊و5v^Z"dcݺ׌N2m;$S ѝ2 ʀ\嚯&cUdKl 'ڜh4`~EO8FDӟ VZ&$s:u#;S"{DcK|5Y5/`ބ&BlD6GkDWMUlQX#@o@_ b5gkԕg :,n:jSNzӳBtXKn<`{H#FŧENXe^+C*BVsmh~%\|.d=j;T^ ,bku<xϵ^NK 8&՜`Ew={XS\NPYx;Q>G"u_%R./M3:M% u% a|#m20*a6"ۃڇ6#< tÊeG$ F, 25lmy63F F9SSE0e xQ4 [5R? %w zNmq{trbDO)`$7%tC=q-BƊLu;Vba4-H6E^mCr̆ RO%bdIH(k)-(Inuv?QcMa.R,&Ϣ) eg%R@)h7wJ̢=:/%9eRNLQR0~bZX $ݸUE)(lʹ  =H*A<:a6.q Vyִvīp՘ASKNw-"JC ɱ*vͨH(gpЍ{!IcRk?#uE(^7ZnUZnDK(^T]OO׍ͱ*1\G-OY?.Y;w4^ o?pCib)_^N' CO" Dd9ptۈ U3]a 0W^/3vk }0KaJ1j#Rﭼ:nQK n0Gnu.R O#GZЮY]d O*xY9n1bxe:HaGC* OBfhJ YS[8i-QnՈ];o2߲ڍH25DNx %gN aJ?/1KInf(Uk-a^t*\OPaB9` GV"K̅&[R$<~ U( >$ #V7ŽX 8`!KC[ґdJg\>,qe ˙qmIn4 W7b r*jf4Exh> 6_"v?$|NJS Z zxjk#_vKM|螛b4@*YR9{< YȠ fZ#;U 9sxq.fpKS[S{[nv]ma}z*͹U6EI5w.dzGhHoξX!ZS >k}Q7<(0F~x@s3f8] 4u)<߻_{> 7`ѽ&0~DCYrTsxSD*qPd ]Ma] 1ޘ4c ltφCW:ցIdG6lBs|A_ fc8 ~R6EHu~4;f˱PF<:DE=, &Nig7mgܒۧ4+YpN@m˨y[8=JFU"&aYPyjߺ'Fz*C14t_8X M"Nx Equ]D7rWA)l~ Q"m$C[AGm2'Z{)![D=}S]cr_򊰧dj:*fN#F\M'ݦ(K G ~Z1D\]a~\ aeni~.ij=ĉ(W%C(S==>y4>,< |wS6]$s)^vnlQh1iܓf1:kc\w,>#"[1 -q,ИiW ޑbI/^j\|G{S W_#;>0hU"z-V1Q}--څΧYNԒ?e2<[;BV)35 e~5,d#XdWQU^6=nAQ D^&|@~\eCkM&Pg Y-_6&/%Fy~E`O(mXqpz(/ZDB$4+fRd).psu0,a5d ^]fM,zӐ%+5o"eǓȜ|0~sjK`%Z c34&-kzTed_NM72i+aa}:ןO&8rMLQjbtwZR)4 g`QFpWasB2zvU=yԱE$M7pT+ŨyϴƝ3(uUjK_IN^T̙싣ƕ9얶 uR׿ut! bNՆ$q}@лqU+9(fU :QtEgudĝwZ. wJğ̊h©2 a"~#I ڸ٥[| 5Uۿ{0(`аg>G¸oQ!G N5}^zL6Tܔ&X}QDrnAGNZ ~WKI[B 4.֋͹ZLօΝvpu!H@TpbGЄ ݎvTUբd|j_iLN6TW>K.-"2E5meee7H8">aC CbJDa!| ?!T)NDRW%;[1X׀jXɩOԪë{ ILCoSS)Y۽ii噑TICD0)(Ʈ3 j*1F{RެKXytvDGbW3ݤ"Be k}>3'l%pi S|"Y; y241<vF$+$(-~72!;YC}n+dyXØSɀxN$9R#V^RBlJ]וP]ke]>'ԥ?i`ET;:ϑj`Xq/Nч-%&G:FMt,XXw.]b*iَ҄&͕*rWŞS1b`yc8/VJPk9~d(Yv\UM3 ^w& S˻ %(kDJ/n4UM<P|iPM(@?r,N;̚XtͮOqLi⢱@rӆoβW^AE+C2-%"AWp}=Ch;…((V)uD0\wg qKID03&?ڈ -0*eExdq<5;odfk?Ywܞ 1")&++؅R;Bid?DD ;--8FKkMē{)[-ǁT5aNH<];mew|V7) MD~6R0k㵅 8`j5,0Al5*jBߙy zv9usNnjS{W6fL\,ՁC({5@})nv9)[zXZW.7驥=#! ^k^p ͨq3 PՓ~=dIpGM`F<ʜ%s4z'nxelNw=zۍ4E+=Úf8f.L?k,^:,{ȿK\UXR˯d;"7Oܒ^1]_/~TA33uFE|z$px$Lr;7-jtX.=xPu*$];Vjz\3Dwج΄?~}< ,8"Ҷa ] 5FJY wiȗ1H Z6 T/i5S깰FM -Hk[u@7S疭Ci{`螁o'iJeI;?z~F.v6U}~( *~G: w=E+}]wU}{HYș›Yvf\a=9@bHI!蹍)Y+~*C *IrY)mƩ V S0iw01eIkPZ8O ikh&J)I^|4aKfpy01wwMő= E't]r]mXVySE7O6+ތPC_:("2D r4]}AI[z 2&{?}-F,B>xYd6Peăe3~eISR=`.S֩̈fJK9lA"kgp؞&pغ/qƄBw{#xynޡ9`W"1v e&.)Q?\zf[ur';\[!ٯy?Yxx$uL[Rֲ@OL။7#oj$Pzl-AR~fTcnҧSDDrK_4.: _ѳ5F+&0ts%&zQ~ LќWWD7gbe}_(xYrtd'ʋ2l8uxY=,g U9$smj+{H$ib,Vrx_e5> v-k~?18:zvy=<^kN%^}"O1ɬֽ}1lęmC [g~!}rZ_VA%% ^5R75 ?cea(s~>2c,kN(mVg+,<I\QX&ڦEGIXDStzTļ"a+c(H/ KN.qum2ۆYUˮi]n]۞9?qEٛL<_^g{9thJlu]!<1Q(1w#Ɔ.:htwtX:osӯ܋³, $刖FI9cxwVfʓ4,|;h{rǑbw)w6]dAJc1 mѤax><+ђu% Z& "ӳ%X xTev$ }]`9e"@tDMHiߊ&GO/ E' =vc,ZmxGȶy GId%'BiXK?1\bճ|%sSPD"}of2\3p=SHU 6:PPd nbF/eT47kadƘ/QiVŪ!_Z" 4]+sJ7OmdsϮ{ ?E׏2|(ayQHXQ;V:ö)=F A>Fa1L. ^;%B*2Ð+:i`+rP޻ԁ1D+g+ɺ!>9ܯ"zrnGіP-Igei|&Į4?%𖵋ˈ&21!sb֐ݐė<}Xdrb5)ْG9T>~ }2C6Oq8:y:FQLмj.JВﮎb+("p^M˒յ a/rbeXo>RIl?ɭF}QfՓ4*|_Z` +_c> jk{Pť&sr_ի̒z-' L0Wq +䤹ػ֑͑~&}(ckr)2LfWKQtʑ7 GA.eG BV :[h_hpN,v-\+}m:Yxw]3\c U,)]UqY;? D9ݫ)Va{">(uf,fASR{r[!EJن&2to{< PY)O=8ănk$JQZwj4iT{WBb qT+ 1Bjuڶ;ȠHٔVivCL:MnT0/ ~c𬲇h' B2]y'o,wYx.ʉmj},gcP &Pv]PȰj/^#2.4ܓ;;9P7cfN sW>ޏ~NM<2Dzi ,eu 2CIji m$@Vs7Yjo]S0Cy:wӀCPG> چF&2 fƄ[3dw]\Zi8M (fK 6?N A-R5v4rmVߖ&U^7s4 mN%-֜K)>,bPXe\::z{8>>y,%I:*Figcs+5\H݅ުK2aVDm}*_6j0{g6/HWa%[X@Cݣ^f!jB|n~!Q/Y8ҋ Yb;4DR " endstream endobj 99 0 obj << /Type /FontDescriptor /FontName /ZOEQYE+CMB10 /Flags 4 /FontBBox [-62 -250 1011 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 108 /XHeight 444 /CharSet (/A/C/G/I/R/S/a/b/c/d/e/eight/f/five/four/g/h/i/k/l/m/n/nine/o/one/p/r/s/seven/six/t/three/two/u/w/x/y) /FontFile 98 0 R >> endobj 100 0 obj << /Length1 1869 /Length2 15170 /Length3 0 /Length 16331 /Filter /FlateDecode >> 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 101 0 obj << /Type /FontDescriptor /FontName /WNUFBD+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/C/I/M/N/P/R/S/W/Y/a/b/c/comma/d/e/f/g/h/i/k/l/m/n/o/p/period/q/r/s/t/u/v/w/x/y) /FontFile 100 0 R >> endobj 102 0 obj << /Length1 2452 /Length2 18630 /Length3 0 /Length 20049 /Filter /FlateDecode >> stream xڌPܲ-=%[ KܓUT1W{!#RP21X;13rDd,̰dd*fŰdj@{3k?"@}w;O d `b0s3qp32hc w63md"6nf&a'Ґ A9@ hofo w4ZG4Է(%-7  ?-t; ӷS=,@=.43Z;[8YR2y[?d{`grdf wtu[EԷtyw77x'>@\H^9ڛ::;YU"_n޻,fm$bcevt+?Q3{{ǿ"lT윀RREe&@G###+h2^/{^6"^f/X}g ,`41] 4}}K}l-~/'U yI*NXA cfcpqr8^EA,JYIKlPۗw #Mojʿۿur|YS`ά,kρh n 4R0s44gYu,ͬ 6f*:&F{?Y7F)fmhc cfc2/3(]a =oO7zޙ;?]ghc>%md>"K}?|? _7`Kodwݡ{ffk .# ݲޯ?JczolXɼwg%_?hPAe[ffxޟt~hd42(7+׿35?Tߝx7rZ28K}?ܼ;hjc=rt݇}\<\حwk?{ټ_{~:o al yk\'fS<۝*37{v(oWyliIPl}|эSo],)TۏNE󗝧x3h4Y'BڃKkmX¾A%'(/~EsdPtQ/\nfQ'h`NX =TpHqoQǦ== 7ǒ1Ƿ2YQ)=_鐓MrS`3KEDnH[Cf^IoJ]q48Ǜ[rԲ)qw?e׺ASbhP(b$Zfג# Dam|4\YGoBon1ɨq;^W!^sv u>ޥD1L<w0M$;jIwjƃč"IHifWծ G^ycDM<3F:&,d{ Sbj[t5d[:428Zz\;DY ^+V|ln4W]/+wѧjH3qX70Joɂ&Nֳ]9NϤW S㠰63a7a[&<0L5C&?e*PAo]%F}>>VP.cIOA&lIC $M}#'OxY:K{Ad#n;vy](ruD"3%ꔭ\ 1gӟ3#doWy#Ϝ)̚2I; ߛ8Ubl8B?%^<#d[)RR<Ɛ3{/"aO CGA2ė-*]vxIP-V<:<3ij56 ;8cG@13Oo*7J}{I*OsB4lP1r)ǤѺq `I[ùзi=[.46cDiHJxsM/I}.ʩccK' wm{gjci<NAVxkto#JxƮtVdP6UDJi>24|հ^_nQl_/UZb)ҿp%N;J Rn*cK*|,QV9U= %\6l&JǑ2C% ^(a3'ICg"=4O!\Wk(] =z BU +6-|gL!?0/oOejm9ޤX)xQ 6!Z],f⣢aHG:ħBE,zz(Ee$ 'pKBa0'G{)"K`|J 0N5cJa[6K<\#1""ϝS;KMzid'ȉ1EJT'сZilmV~i w O0DTlI,dHodMVZne(ZWX9NVOo ?-~?JEc{*MAYF u=2\$EN |W68B5qf_ ׷N];)" d*J73 6 L%^214  czٳ ìMuҰcCU0Bq>&R_qy7x=yO١$4#clɪ( 4nG8@-K*?T|HJNFI{ڪeǸH9ŲgA@Y];Mis7X47$Z(Z]+e#t}V&L{1v"}G x0IQ:6]er;J"#JW@яΤ.ל9_?SFZ&s^4)lBd # B+!I ,MȇgHGIlFhb0lժ*O8Ν\xTs8c"i?i(daV"msG EZsvӣj|+84()Cq+ѾX FGoۡ|AA5˺I3h_pC-}QLkv:U8 OX[>f όS` 0u˺][LT፿%H.uzdܥYgAU"mۻ]6k۱>H 6gd_QbK0#xM.|kq̨tZ2#-1a܁ص<&IT&|[,,Fq:ȄF4*J'-Qb)s掽Ü RY+P #8!)45YK~|u>\RDQrrBaIP<&qQt2܇ e+chKIw\^ Au%^e 4"c#.<Ë&rp .BT:oBYD9_AgBbm49e/Ϛ2h9:fΆH7 3.zk XhAn$0WXNϤF*?gz<Ÿ\ Zc҆ӘM. ^ًV SVq}75.A[Y>wˋa }2a;Uqt{[!^qB˾Y YVHI= K ,S[[g-|ZnerQs&2.!At/˹wU׌a.葡Ph DhgEᇅ.xrCg#ns m7*y[7dQO>+,zߗ蛄+ty4W5W?RQgp`ne ƒMve7 YϩQU5E~k ?0|X#IK4$ꋍslZbE2w>bUP'F iv%仑gZ,t2>5]9_h?yRI팊 -qw0τ8Y@"O)Xk _[ ؐ{*oĴeY U%~-:^OF2NM.)Cy ij(FO#B3HOr)?S+7 zs9!>桹OrDr6V Yxsg_V A#$9ؖ#xVi(qNrrI}3]enWMJvҘz3?zbE79CmܙΥz_i)&:_-Y^qPNO|o`f{$upA9x&mt ы?(Nұ_0U2Td3ʫmBs#=^)3B]1haGxxҖ6-$s2{HUc;cXw>L%ߩ:|Nmr64\0v.\D F@RA / 1m,enHW))Bh4]dCp5 ;2n%'5V_O~n7(2wc{|tõ猬S#^$V%w'^+{MSj+J79?TK1Ʀ@HZ KQ 'B, ffY0`9~5pqaLiUÕY(YZ5F.T[6_zxjO BB}e򍶊gߴcl!_Ul5:nEck_\QTPxEݣgaF8\E LPIy izAqQ(*`%-eR3C/A}'7u!o' &E#{2O,AI߿S>xr=q=cdv2 qž/^JS@ڎdxj N}Jk&R۱JL0C,]r$TiHmM7?8+J[i] T%~Cߐ{]vqw|@q5 L}S˟*b.Da̛ZO SN$Gj7ݕiK'Qh{ofn: +&_g }$b}Yu?w w3^Ag%Ө"\k| S\p@C 8te$p :)Y 1"{#||srj~ZkyGf"0'&ae|o.>X \ˡ-a &<~E-6-yz܀JeΗm|4za+О2I&*0H5Dv;!ٿE\mz<9V ʱ#Q7eRAr$nc'f.ߑ= zkP-Q03<Ϛ L5qm?sJbmh?{{ =m:p)ا)ǖ"ɟv ^aQrXRn7\@lIx/{W姱x|r#5o)) "~h7ΓX}̿1U2R(SMdZNaB/XK[dz\ZEȭ|BGD,YsqvRZ&P>Jf>(M4k6b ( K {V\8Rw0.QkS,Jɧ/:N0qpy2V:S,C,2U9(٣ѵi1 =a ;ƀ&mJ0oqzs5ƵsWI/]r݃?,чzy^;A `C>BׄM}~l]5h@܏B>6!w}s%YG_%`> ZQ$ʧ,` pޑݟɍ~04Y+No'9#HڋVLwuYۃ D`.5>zHyf#H/S>YCG%I**F^\~ us&?ĸ&Rһ'J sINBf4EMg{#NpZdq{fؐLH:Ys~ALv:g72/D2Ҧ_K)>%ĝ}p~fvrg(ֿ$JhAemmpD;  `>cKʈ2P)BAhSruz'j5A48rTD] 7׫ҵ)#'K.rz<1ZH!KP[FiLLw662<2B(H5}[1K3Qv,n‹L\ Ȯ]zo!k!\^Kub"1T5F!nb* B:NITC |S[LRcЊثpVt̴& @{(UB?7^a_0ѳۧjs9[4iB(4FK1v K|١EIivezFZt:ߏx)xZ}@7)#c_R?mIYR|22f,w['R'2B { :p0xHG1iBs=YHR}`X"y!,jl-Y{oùj}$8T:V%*X%r,h܈3c _ɉTQE<7"ߺ8v#l:*:?UsH(G$. l#IV]UnxD/Zmr8Kɩʵh?=ipOSXOjh8&Ja3%q5ۈVH3DqfD-g%CS}La\bo3bc਑Kq6)bW\wӂ;AxUBR#{m2ļ$Ǽ89/Դ#v`6{jStJ jn˄SsEg^&XDEĦhkC7Iq>IʌM3̮s: su[Z%ɕ)dE&Mo)V=j66l,Ѭ:zl7ET>@csiÈ~YV{꧚%҇C 2'a'DOJ<0 hYe=h&S/e%&9z悲 UmbB U\anF}XgС˔y%d5 ׁkBW U(" L'-cT:؞uꅾy=zk&peDr?4ATcnJ~+g FH1 f K\qPn$VqwE7і_:?+<{P ݒ^WfF xup./MX9ĿZ:RɅToBԯSfy(SWg&n'b(HƊ{`s[|{ܙɨԯ Vk>x=+bh݃?$b1\S~ԌT)TE(L<MD;xZq"`lƙ Qie5P1~QˢGtLc[ۧTTCB)_Dn..[u!| bm3A;Q{PFDw~'Xv8dʮpt o\9i]f@'e5A Jp݈$ k~*W?VdMi(UJ ,ԈZLQC">هo؈?І }&bCkK-)X=*n1U޽+a$uB= _E:ɖYn=Ӷz#pJ1eSMtl+o!CWԞAa]v}OpL ņ۟6Bl5[P2/׊LI䇔)W1x^y*?#pp*[ 9<~BhO\K iş.t?bC_:}R[80JSLŞ%)æ$MOW#m: ԋ]: ^bÅfS5+zX1hd+VӪq]v,ƛI}'dщl'z'ʿ@J_ޠiDJ,z+ܬ6 9>;bY~>mWJn +|@ʂpcA35! 8ɮrmPDl'Jzb>X|3UaFv.{,=11% mTLJg 9GI8N'JI 7bQqϊUc$n(L$zZB%G5XNNû`&=yͭ^txS[3(2Q襃(Q|W$IZ@8bl NR},P@S_ZJG +Q/gawA-T6g?ke xH~NzI:]て%8/+:hy:S6)SRX4qHn} C0ӟC4̉B0%.#fL[zU@/~H&AzP>0ՌZ'N'W&pAN<~5ZM)*,komP/ iN= >c﹬Z4/gR0/.N3@V}x hPXEhXvbj{R7o>QCdqU8J r:[ ̃nlJ?^vHV_b+<^?0IkgbI5F~X;O,CSHjU };S@YЯa']* %09IM>%|֐T-+/JM{YI^[ >[bsx )ښʼU3PvPTI K4<)Jޅo_ > /۳H2.$NSmePߞHF.rAǚUuVPS@ON!t[G~%<[W (K[dgM[GsS2Do(AYƄm ʯh~l~<&ܯUҴH=>le2eSe@P7ǝx nYјg@Jf.?d)"6?bUl"gQmΝw#RM~喺+"&Y>;ģD^gyE=g@ "cHrk ·O #L # YANЋ$_Ag$ؗq䖜۰rR;ȒM!?\Rp,Rgt]inH S⫤SAZHayD@ "sTݗ-}ߏ( #FytrZ9QhM)h{ _W X p?&s '=G9>:H| h ՜|kۈ3*=USW @X{, I洆yԙ_" 6Gt|7d=t9otuI޲D$W"EnLK*U mEn-;zs8r)lRdyDEͣ<5Dl"H'-a@8J&r- x\B:І:,4+lF8V1G7eXi4xgPKb ĚV_4S0|6%"3&~Qq=)gǎFZ0^dz}S:(xMܠVh+V$ǂrr^uUZpE{wo+Z@9Gɴ}=d*_/ˤ,s~Fhj {/@Zx{vR|džg "gPGg#o~oɈ%ʟ30(m+)}>#uȣ^(B <["A[4Igb,G_0-lQT&zTB * 6eHf& YXYczMt')edW|Ƚ D:;0Tj"Vxb}@,3"vr(!??7yу/+%iQ (xSصSIq<@E}p&(Kb=Iz!q(t_ƒkygC}1H&Y.$ K7 =hĕi\ 9/A@E5[4'W+39)!<ض%"ʷԹx <k/<괭,:79-ڔIP򯦜)Hxq+0"52[rmy.Z>A47ӂ{6dfI z(|u҅QQal>?a{`:ML<Ɍ?g_ ͪ-㙗pJjw1fJE~zTjgҍ -e? uC!^$= W#K:w_Ya=\ $Ψe<ȓiJ}[@& n}j4&HTQx͓]Sq~0=/.32N[iLy&v}y+{V5"[[UD]ɢv=? E>gέtZpl(Ios& -^%čxL=I5LͅrCk%;Dcw\e䰬&H X)T\#;jҜZ"e(vj]T$r8R׻T=l0|T@tl)br9fbƴR` OۼX^%PlrŲ6a~];x҈=1޵rjk]51.Q~I&PkFqht*83>{ӧ/i~|s|:nbY=d+k/a􋼌xJ)Fiv[F!APbI+ZoAgd\z׈?8יi; MU-@~v$)qOkdWMMTo==VZ7 B5&DY~6PhCه g5&f]m?JhE?^:LmfXGl:W(XEb*h̓ʹU46tjY$b\xWk{KX~ՙ2urYڄ#iW2~=_KO=9{;.åC}YfL;D1G EcT>ECF j'D V[?-*W׹;#3Kꕷ48K< 8'E^fJK;`S5`km0,sg1(1! FR)$oR{hciA WAO}s!UVkg10mtKfd(6e 89x=I#u4KU vٕq^q0J@wҙ;{p$!KGÙMPu#tsa&˷\l _f\ɊG6$j[&1uF;\Muf*\ȴ G)=$eI׏"ۈɋ/np>ա;ʼnЛ m&q}Z,I>.'.iШyja`עm/~Khb&G/`לf'|+SgTP6Jcc@dC̨d!hhӖTKf' x4&=-i^[)9_~_LQXud4 64HiDlNFG +$i^ zWH_xźQO$ejTAܰfv%JÉ;PPLV>*=t/xM}[* QSaP!N1Lӷ5Muxfe%B {+H=%ʟpz} ~?o@:8(#a_ua_4 ^N3;Q!>ZDXs{u_ A?;,jI40hWKk|=AoRA(1^wyin|@ϬRp &JPE&0#ŴG ǧ82!.zt2 sƴ@ YI PB5yB ѧ a(ҭB҂\;Qƾ 0?Ύ/~1Ƨ>j?u(uXCMT|1+ Wg7zOՁv(Đ }iSWH!ئ >,yQmZKQ}ņ6AU]'{şF?YM{ i[H*҂9Z8`o* "Ru]AmŠ >>o\#6"vC$)S;+_HJ=ն ΉQ wݯNk$IUI #%[Xk2AnlاIGh"1snt]0Q1=iOAДi}(BYr~'$}v(U'V"8B0wzcVl/qќrga.CҤZ:*1*4RqQIYm84s'/m~3& uB;F ys.7wJ(ĞjД@Gتjt !.G5*TJGۏp=obWK2w`"uł Cu xwt v[y)yܳ{^1MO` pH|b䐂ۡy_g!S zԄ0Sqy5>*8zgNli\kSiؐ %yj^q'`p8b0K_7]"R0{Pw d=(ڰp"]gVIRIͳ Q'/3e H[15Ǽt /$#>cKtRnaT&Ⱦ6/26`lqFl.`ȵP1 ʡi'^ڣᘄݔ3P &VP92MJq:՞z5`SWCAdtR YrW}1xSXdvJI;] [O`?p>!K"a]E:ֿTZ˒X|{Uc5\1MI]oRKAϪ޲-)Ad&^-88eV,یi8#!Swa2{)ӛFH;˚]҄ڗϴF:<.z&?ߡp04SS93Num9 w횶Vc =-Lu0"_BktN5hAq3cdki Ӓ;j"îdWy;h'-54^=gV2 M9/VT*g8x6%mF4O)a.OG:i>7/o(ӆ<\vdzÄc9]@/IIbbf*s֛ۡNj?[Ie<Ɲ[U~7T(#90+֎oħOR֩`H`_DY~`X%MO)eP").A_<nk(atH- Mnfos.v=:t`4vEvkN"%3#yc5uU,ԠNIlSQ7N,'+Kl)`]5-Dh0 x 053@ PҊ2P_͹5eL)Ɓ@ÂK$ Iۦ[8=C"]h+ﯟc}=B3Pn<0 8f!^vi)TNi^e=(f1 VZ\P9kh zl)f Dl9wJKV[[ Eֆ1slv0.N2x`Zwg(/$n0 XWy1K~ԼKuYxÐ(m%' l\_ HF+p+TVEYT;\Dߙ; g Vui7sO\"`a)E-ʲn %ĠqŜ\Fyn9B6ԋ꙰TSW{vPek5߿Li䪼{ː>8^㳀~K}zDH5s9TvRxM 7g%= 2"᳟3ͥbއXYpZe~F|r⁍|ѯ0f endstream endobj 103 0 obj << /Type /FontDescriptor /FontName /KLUXOH+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/A/B/C/F/G/H/I/J/L/M/N/O/P/R/S/T/U/W/X/Y/a/b/c/colon/comma/d/e/exclam/f/ff/ffi/fi/five/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/percent/period/q/quotedblleft/quotedblright/quoteright/r/s/semicolon/six/slash/t/three/two/u/v/w/x/y/zero) /FontFile 102 0 R >> endobj 104 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 105 0 obj << /Type /FontDescriptor /FontName /ULDUEX+CMR17 /Flags 4 /FontBBox [-33 -250 945 749] /Ascent 694 /CapHeight 683 /Descent -195 /ItalicAngle 0 /StemV 53 /XHeight 430 /CharSet (/G/P/S/a/c/d/e/f/g/h/i/l/n/o/r/t/w) /FontFile 104 0 R >> endobj 106 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 107 0 obj << /Type /FontDescriptor /FontName /FYGEPU+CMR7 /Flags 4 /FontBBox [-27 -250 1122 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 79 /XHeight 431 /CharSet (/one/two) /FontFile 106 0 R >> endobj 108 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 109 0 obj << /Type /FontDescriptor /FontName /PXOHER+CMR8 /Flags 4 /FontBBox [-36 -250 1070 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 76 /XHeight 431 /CharSet (/one/two) /FontFile 108 0 R >> endobj 110 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 111 0 obj << /Type /FontDescriptor /FontName /PPAHCI+CMSLTT10 /Flags 4 /FontBBox [-20 -233 617 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle -9 /StemV 69 /XHeight 431 /CharSet (/C/D/E/N/P/R/T/U/V/W/a/asciitilde/b/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/e/equal/exclam/f/five/g/greater/h/hyphen/i/k/l/less/m/n/o/one/p/parenleft/parenright/percent/period/plus/q/quotedbl/r/s/t/three/two/u/w/x/y/zero) /FontFile 110 0 R >> endobj 112 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 << /Type /FontDescriptor /FontName /JIQTFW+CMTI12 /Flags 4 /FontBBox [-36 -251 1103 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 63 /XHeight 431 /CharSet (/n/o/t) /FontFile 112 0 R >> endobj 114 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 << /Type /FontDescriptor /FontName /EBOTJN+CMTT10 /Flags 4 /FontBBox [-4 -233 537 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/P/a/c/d/e/f/h/l/o/r) /FontFile 114 0 R >> endobj 116 0 obj << /Length1 2271 /Length2 9165 /Length3 0 /Length 10487 /Filter /FlateDecode >> stream xڍT\.L4(#-3twww C -)%HJ(HtK#!"7{׬53γ9O4Yŭ``#H*ki8@ 'ȁEO;c]\!0G?.`s8B&eGa7  "E e(``W,zI _S9@ vX;`("@f ýIw`g`3\lD< p[*b]=@Bf 0w%ahv 4N`ǿJX7bo_ --aP'sG/ (=,sG_DsW`n N #0GTw}.'++W ,h% BpW_IA\{}0G5WVnNڎg7Nf@ '' {Zڲ #jq9e}!`;wq/VK8lqĺˆwx >3FL$5u]J '`pspxf; 5 W.z<ח 1`ݘ/6_^cɸ983E͡u#v@Z\e Zy9bmm$U R-m_b_{q\!n+b,+b$oDiGKկ%{a ! {l08` su<v_/]إ?]_ !BxQC/*wE_ćv@v; `׼C<""Bp1#nxk__#忈8$\\$P]_nDߵrvCLn}5΂bD`{3^N`?hQ]:<~؝!F^찻.}CNuB<1i>o[ωH xJA`4;Y!,1! DC*tAwE\wwY ..v CBaH@΁uW#<.9v[ }#V==X30K`Ƌ2q ֍A.S ui2- Io9㛑˄{?kMF L(|Ʊb`heNTl) DƎC]GCtƚl(Q||(MM%ct'bdv.S;8WfX!+8N")dZ9~~I,SAf9~BڻzisB?h}8F<;{s<*!ORAʯ VAR.4)¯L"J5Ay/K$}[`}Ñ-"zٚ7w<ԥt.Ԥx#N|)j%7r1LݏESi ,yy)~s!%ղtR!9L$[og\,JIՑ[.eT٨B,q yLjH8"H -$:-Aex"6cz}1Vfi 7Ir,~@7_b&Lh*wەu=4Ga!#ceAŒ=W*ܕJ!@ aS3Vu%]Nowow&&5g~fXP~_޹$"S+ٱ>YÕ6A*c}}/H cKfWPt_iSFV|{Pvx߽zuh*\KkȲxh]6O%NlOD" C5֮/ܫݍ@m+RF%d#8hYgJ ;rF^k@LcdLY gyv预%N>O]P錮}m "J+:z*|dyxYjh  r9mK•A#NI|eݰlj믵}ɕ%/T&4T gN4&Qz55ZCB&pJD?|DWq e1X5m [:`ÏK$"Q3H8*/%IVY!/\_z$b)[IF1L)kF{Rϵ?4s׃Tۛ$'*z>z mh AZW7fEQv_)VqF\pjxCA*Kߚ!t|A.k>Fk]>S~k $:4ĈA;ŲREO.yzɩKesѪ\TS6cf}[/_zթ#o ӼlONUfGeeLc"mJ@;͵ezaMYN%@T[Aћ耢|1m!68=gbT> !o60OI]j?ȓ%~ԥ7kVYE8)2볿)С5s"^QV oGЕs[VF JXփuNn}JэjYI7FRfy“feJ--9WL?:'מP^{R=QV^;0(]\3*^$I\7C. _Q\qq_l^ƣC%ex3|}`u'2Lpi/cDK{i[J %,@^>)TsL5b+%}] UC]a? 2 L&WߌISP_#撝ލU ZxЂwYEF'fzSW u[ç-Iv GoۄL?4ͦBG FTg\3iOf?,o3򧇞gE{h弹ljYk*f |񎢺}ÓAZC<3BCa]FZEIm/@)45n*xG٣DV:#x\~-b{i~Ka]i2?R>=:DvȊGKD7yp<VmrVp#7dȐ>"wq]Lxvʃ7Q5^6IFcZ(p Fd[!P%2t}<?@f%fU| Խ|OdhW&^9&VIine z?CѬ}k>S1N7 eh@=ZuϺ\WlڲՍ Y@$ϋiJ9k!nyNI! MɧOzTZ<8~#m}*{;/T+ ZUAR*b1Ɇj/2$niOˍ"ɚ&Cr U!h4?fp-l>ŭ#(Gy) \w[E .ViZd#K>PHЈaYttT&Z<[H:3mRbf-mr6'ӎ Ơ"F_6ZQ$:[Fv,6/uϑTݲiҪ0tSlpv-6 ]ӽX |ʘf s*;yj>\D.@5 :q#UcE6fK2}AÒ4fsd|+ztck>з9ϵ)#Cp "כ8<Q˦-9sS7>{lFsᶻZJF$ma<Qs ] BbUOFxnĠz3SVJ }MgQ&5 $v=lj]Y$}K4RT.08[㼮ʹQx)rٲ)} dǙH F7w< hhe`#!:r CW Ox~s98'%$8QrG\?5Yq/_j n^st=Z8"(%*# !q2&ZMo{*~۸AݜXɍN"PL\ҫXt՗-(` rԚt[!GCXر#lB ]wK 28(n6/Edk? ﹍XsK-55cLg`)-ZPYyXx,.=~RP\ᒠD=3H%ʞ`}tިkXsAIR>b65Lmg_j۸.]~;d]b`'!j}3yCU9@ȮB.XZަKB|sLN^ݚ$,IV7 ]sORv8683;ɍ֣0H0D HwgO[>ӱMnMF"6(P_\X[, gH@#k6,d{5~C~tjg3)#Wn"^cň%ο '$ZZr諻Y)n)/Kj)ߔ0XR%ZЮ k>NE䊄._ vҲ,I&CG%cT*%$^5T hS>x[e _XN V#Ei,DяV 3]Y4teҢ-g{6]%7(M4H;,BW5#a%i7:vһ{fi=kyӴMw0!TSVw!'HP,vVQu!UYZK+W/ =-'lG#udb*v[|Bv@$mWHTՃ:r']S(sߍ%6&Ym \睤߈\Wx"‘l}a4C<:&nl ˡ=PvzK> 偶[MҲ׌fGQ'Dd4,dԑ4 bٔC=jRI`~k"HJ.j]voK#vՋ(:ebh(c~ɠv,Wej?7{ᴚqjwdqS̷}AϧQ_VhHkȻ 8@YgidzA!! qjK@Τ=' Ozb]^%EA-ރ4FMeAЯ_ۊq,oC@u 03sGqub2t-'ˠ\K1U) 0:Os!c%:x<&ݑ6ҭ.{_އm݄,؍֚]FF 4Fl+ ;8P~@K$.>*@pd[jVǞ4+7>a%lȬ۝)&ɄxZq.)$p?}  p6[T+ʤΎ;{ Q׼c\5g[ޛT~Wn-\RJ)t-j#Ts2`{YgQM ߞ)%^?> -lŎ<0D΍K rS: P}l󬢩@0+"rס5?fc\.%%kY6oŻ -,ah { ̴PnW{>qQX-^eNu}=XByLXZ8!iͯ{.k+ :hYWG/\D+ɧ 8S23H/F_dt3`)sCl8~|bנHx|+QD+0-S[̼Z82~c{cwk22*5FEﺞ *}h\MW7o*gups=XҵR Tٻ4\$V*d~6-ƘJ rZkR21aG?o6wE^9})!;r:l u2ձ$c-6Gd]}} eA#ΛLafkTmY!HPQttZ&$!aA9ۆi² #bȸm{XqRLErecqV:߮Q7wy\+UyRJ[3L!utͪ78<\Z_A{xx.Mmj"ȹHS#Ugo ucō₫ϋn(#8 S4l爧t DϬOA0TGy)kW 94,oi;k'8?a$G++C|N;PB2ejKvݿ׎13 vVEܼTR&)ߓ:UӭƘ=Dge;q\vZ~21zy˄,QTEzW;R8b?"%Qm 4sUMYZ Ŋ~t2G~=+D [PM&vh67 &i_;5сQ0ꚳ_\~v+УS KvuR\n{\o*g1DUFU/Q\$3fl?3.mÙH=|i9Ӑ*ױ$Єk2 k[.>L]e[lgCu Ϝ$FD (Dآi؋bd7N-VSQ'6w=TtR 6Ku^v&c9d+/n-ݺ|NZ`F6%sYaY]?$&ǁi7QCb-/v j~Ss e[AS~.P&)I L'4{[nLSdV%@8H.&#[6YXGes럈~)}S̜zxLhZz{M> bH[TN'ó]*+SHcrȪhdq}[B"Y|Eq&!tw~BQQ7 uCsSS" Ibjqr,bn'e%>|I5ꬳ3a N^T ~{ }t4|܏%.zd8U:|4tM^苦!do*t񧅆#Y73AI5[˪9B5*# HeoӟfmExQRj{S1CȟsV@BHCvzqېJR'$M iCΫʔ/^7cr~*#/`0l+eZ5D*9옶zMj>ľ~)*HAzѝB:;KU|} 9[[ѱ,mj$"79NzOGAQWS54*8LTD?:q=XiGXZ_mv;oY6MU-Gr-)򑼜y"nh1KѵeqͥB-O-1 )H掼Gfg.nW[<,RpO؋W.}4C G8󡠼g ]Qg2lkxCe4h^FE+_gf>PD]#yQuĈoUә*iX*ЀdXErKip{Ri$$1&{;Ponjsҟ[j: UK$nx#=7݊W3]f` endstream endobj 117 0 obj << /Type /FontDescriptor /FontName /HBIRKV+CMTT12 /Flags 4 /FontBBox [-1 -234 524 695] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/A/C/D/E/F/L/M/N/O/P/Q/S/U/W/a/b/bracketleft/bracketright/c/colon/comma/d/e/equal/f/five/four/g/h/hyphen/i/k/l/less/m/n/o/one/p/parenleft/parenright/percent/period/q/quotedbl/r/s/seven/six/t/three/two/u/w/x/y/zero) /FontFile 116 0 R >> endobj 118 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=['sv}o|7lԘ[kxBYwS0`Qٮi"m!-M5\F:i0U4e7;yO!(37Px\lCys0l+htcA620Ae L[7Њn& U RZ,cŶPSan aiqD4',IF\Bbu /y2RXR xHXc®eg:'c|0xq?S΃qI&'g΃y9 C :sǡ;(E8o"AJ'Ođ+6KIט'; ztFzKp&q"pBCT/9!ɩ~B}Rq҉TFIܨύ|nTs|neEAxwIyRm4͓_Oyf;s|KۄwU羷{lC'i=>vGr_$Ԩ endstream endobj 47 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZOEQYE+CMB10 /FontDescriptor 99 0 R /FirstChar 49 /LastChar 121 /Widths 91 0 R /ToUnicode 118 0 R >> endobj 119 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> endobj 120 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> endobj 121 0 obj << /Length 740 /Filter /FlateDecode >> stream xmUMo0WxvH UdCmU^!1HDI8߯-@=ۙڽ١=?w]pwdV^ڑݧl#oxdGa0NiqF?Sր'YNR}{f{x2A! u xk={Exo"}Rɑ#x۠_J B C쩁b8!=%p&r"D9 Qg̑Tu+gGNN8O-(7ZRntH ʍ(7:hEњr1+w(O:͓.ndm'#Ʉ'> endobj 122 0 obj << /Length 740 /Filter /FlateDecode >> stream xmUMo0WxvH UdC۪TBb B8߯{ .@=/ۙڽs{K;K.k6/k+[M'ҷ>dyӔKe'$cS`vfSfK}fƁVGGf\bu<19w|擬CTAW $rG]IyMsh$aW7y̟u? sK-`θtJ!'c83?NaO<Dg!;IX 0z)rЃ@kpBQ]^Z7! / U <ɉ#W m/%]cX! gȀhID8QN~ACT/sQQRs 穅ύ>7: F+}n4eE=zG~<6OɈy2kLd>O&y2ϓQ>OfdV>OF<dR'<>O)yJS*}𗏿tx>z{O->tՍ]*3>cC~ endstream endobj 52 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FYGEPU+CMR7 /FontDescriptor 107 0 R /FirstChar 49 /LastChar 50 /Widths 83 0 R /ToUnicode 122 0 R >> endobj 123 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdC۪TBb A!Gp?gxYOTm$|՜s_Iss :L;268{zb/}WUjWm?fd}Oi=7gRd{nCN8oͰof-%6'&9Pu`L/"tkں(a[ duS $xqa MN{}m}gىx` tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> endobj 124 0 obj << /Length 675 /Filter /FlateDecode >> stream xuAo0 R{HcIE H9l[5j 8] CfUmóٟۃŏ١.rn|vxb}[6ߺf|歫NNhYgy8å9q7۾q0_f_ дGι/63Dk 6"WT#!YT XF{޺cl_c9K_۾qk8rw麓 G ylIo2"dݾ}hrYWydͼ//V&ZKLxY juwԯx2$OAPyt4sk)$Q "7A?g@c(3jok9E u9/d86dq/@cNiЃ9eyDH{f@/Z`~G. И!`DoSc_ BZ }%m<;4x{[W<Q $R1R R2R:dA3NUAUI5'ZG-^GGGG$zE"ZGmΉ..h$q41q1//fm|T ֵiKN" endstream endobj 61 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PPAHCI+CMSLTT10 /FontDescriptor 111 0 R /FirstChar 33 /LastChar 126 /Widths 80 0 R /ToUnicode 124 0 R >> endobj 125 0 obj << /Length 750 /Filter /FlateDecode >> stream xmUMo0Wx$*B!qض*jn$H$3Ch<~3~~~ngjv9{C{K;K.k6㳵ችm#O7٦4\ =؏8ݿ߳4B8͌>sIvdXC6OLx9im$l6Dl_7ڞhz*{pɲ2kAʶC+mk>lpfIQTT?LA>J e .1PbpqH I$\kL8Hb،Shąr =z51XQg_s2Ē+ sC:CQ}.'c-BbOEu+Xg~:?aj B.U $,ĨAA 2A%%" 19hM_)ELN 1sR3fg =傸aCYjV^w&L= 3nqFyDŽϠOL5'pZx?i^x?IGO:~I4ϼt~3][gF~Qgf}fB3y,h3cL}f23{,g>KYN0`^ay{7)q W7:*ሟS`R$m endstream endobj 60 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JIQTFW+CMTI12 /FontDescriptor 113 0 R /FirstChar 110 /LastChar 116 /Widths 81 0 R /ToUnicode 125 0 R >> endobj 126 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 M endstream endobj 54 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EBOTJN+CMTT10 /FontDescriptor 115 0 R /FirstChar 80 /LastChar 114 /Widths 82 0 R /ToUnicode 126 0 R >> endobj 127 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 ᫄ endstream endobj 48 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HBIRKV+CMTT12 /FontDescriptor 117 0 R /FirstChar 34 /LastChar 121 /Widths 90 0 R /ToUnicode 127 0 R >> endobj 55 0 obj << /Type /Pages /Count 6 /Kids [38 0 R 57 0 R 63 0 R 68 0 R 73 0 R 77 0 R] >> endobj 128 0 obj << /Type /Outlines /First 3 0 R /Last 35 0 R /Count 9 >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 128 0 R /Prev 31 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 128 0 R /Prev 27 0 R /Next 35 0 R >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 128 0 R /Prev 23 0 R /Next 31 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 128 0 R /Prev 19 0 R /Next 27 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 128 0 R /Prev 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 128 0 R /Prev 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 128 0 R /Prev 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 128 0 R /Prev 3 0 R /Next 11 0 R >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 128 0 R /Next 7 0 R >> endobj 129 0 obj << /Names [(Doc-Start) 43 0 R (Hfootnote.1) 53 0 R (Hfootnote.2) 71 0 R (page.1) 42 0 R (page.2) 59 0 R (page.3) 65 0 R] /Limits [(Doc-Start) (page.3)] >> endobj 130 0 obj << /Names [(page.4) 70 0 R (page.5) 75 0 R (page.6) 79 0 R (section.1) 2 0 R (section.2) 6 0 R (section.3) 10 0 R] /Limits [(page.4) (section.3)] >> endobj 131 0 obj << /Names [(section.4) 14 0 R (section.5) 18 0 R (section.6) 22 0 R (section.7) 26 0 R (section.8) 30 0 R (section.9) 34 0 R] /Limits [(section.4) (section.9)] >> endobj 132 0 obj << /Kids [129 0 R 130 0 R 131 0 R] /Limits [(Doc-Start) (section.9)] >> endobj 133 0 obj << /Dests 132 0 R >> endobj 134 0 obj << /Type /Catalog /Pages 55 0 R /Outlines 128 0 R /Names 133 0 R /PageMode/UseOutlines /OpenAction 37 0 R >> endobj 135 0 obj << /Producer (MiKTeX pdfTeX-1.40.24) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20220116095412-08'00') /ModDate (D:20220116095412-08'00') /Trapped /False /PTEX.Fullbanner (This is MiKTeX-pdfTeX 4.10.0 (1.40.24)) >> endobj xref 0 136 0000000000 65535 f 0000000015 00000 n 0000004750 00000 n 0000154527 00000 n 0000000060 00000 n 0000000146 00000 n 0000007691 00000 n 0000154443 00000 n 0000000191 00000 n 0000000311 00000 n 0000007745 00000 n 0000154357 00000 n 0000000356 00000 n 0000000610 00000 n 0000007800 00000 n 0000154269 00000 n 0000000656 00000 n 0000000837 00000 n 0000010941 00000 n 0000154181 00000 n 0000000883 00000 n 0000001029 00000 n 0000013835 00000 n 0000154093 00000 n 0000001075 00000 n 0000001347 00000 n 0000016534 00000 n 0000154005 00000 n 0000001393 00000 n 0000001566 00000 n 0000018451 00000 n 0000153917 00000 n 0000001612 00000 n 0000001750 00000 n 0000018506 00000 n 0000153842 00000 n 0000001796 00000 n 0000001873 00000 n 0000004362 00000 n 0000004489 00000 n 0000004863 00000 n 0000001921 00000 n 0000004642 00000 n 0000004695 00000 n 0000147817 00000 n 0000146836 00000 n 0000021542 00000 n 0000144877 00000 n 0000153513 00000 n 0000149776 00000 n 0000019940 00000 n 0000145856 00000 n 0000148798 00000 n 0000004804 00000 n 0000152599 00000 n 0000153674 00000 n 0000007855 00000 n 0000007530 00000 n 0000005041 00000 n 0000007638 00000 n 0000151684 00000 n 0000150690 00000 n 0000010996 00000 n 0000010780 00000 n 0000007973 00000 n 0000010888 00000 n 0000013629 00000 n 0000013949 00000 n 0000013502 00000 n 0000011114 00000 n 0000013782 00000 n 0000013890 00000 n 0000016588 00000 n 0000016373 00000 n 0000014103 00000 n 0000016481 00000 n 0000018561 00000 n 0000018290 00000 n 0000016694 00000 n 0000018398 00000 n 0000018655 00000 n 0000019049 00000 n 0000019097 00000 n 0000019255 00000 n 0000019285 00000 n 0000019724 00000 n 0000020183 00000 n 0000020208 00000 n 0000020268 00000 n 0000020302 00000 n 0000020332 00000 n 0000020878 00000 n 0000021299 00000 n 0000021785 00000 n 0000021810 00000 n 0000021870 00000 n 0000021904 00000 n 0000022509 00000 n 0000022817 00000 n 0000036717 00000 n 0000037034 00000 n 0000053486 00000 n 0000053782 00000 n 0000073952 00000 n 0000074422 00000 n 0000084483 00000 n 0000084733 00000 n 0000091882 00000 n 0000092106 00000 n 0000099260 00000 n 0000099484 00000 n 0000115223 00000 n 0000115685 00000 n 0000123030 00000 n 0000123256 00000 n 0000132785 00000 n 0000133021 00000 n 0000143628 00000 n 0000144057 00000 n 0000145036 00000 n 0000146016 00000 n 0000146996 00000 n 0000147977 00000 n 0000148956 00000 n 0000149934 00000 n 0000150853 00000 n 0000151846 00000 n 0000152760 00000 n 0000153768 00000 n 0000154598 00000 n 0000154770 00000 n 0000154936 00000 n 0000155116 00000 n 0000155205 00000 n 0000155243 00000 n 0000155369 00000 n trailer << /Size 136 /Root 134 0 R /Info 135 0 R /ID [<8B0B78FF6752C6F2E8E8C0CE0017D626> <8B0B78FF6752C6F2E8E8C0CE0017D626>] >> startxref 155643 %%EOF doParallel/inst/doc/gettingstartedParallel.R0000644000176200001440000000375014171055705020715 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.Rnw0000644000176200001440000003163114170722056021260 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} \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/unitTests/0000755000176200001440000000000014170722056015314 5ustar liggesusersdoParallel/inst/unitTests/runTestSuite.sh0000644000176200001440000000160014170722056020323 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/inst/unitTests/options.R0000644000176200001440000000455414170722056017142 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() { res <- try(pkgname.test.stress()) checkTrue(!is(res, "try-error"), msg="pkgname stress test failed") }