doMC/0000755000176200001440000000000013517143412011075 5ustar liggesusersdoMC/NAMESPACE0000644000176200001440000000010313513447512012312 0ustar liggesusersexport(registerDoMC) import(foreach, iterators, parallel, utils) doMC/demo/0000755000176200001440000000000013513447512012025 5ustar liggesusersdoMC/demo/sincMC.R0000644000176200001440000000173113513447512013326 0ustar liggesuserslibrary(doMC) registerDoMC() # 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") doMC/demo/00Index0000644000176200001440000000006213513447512013155 0ustar liggesuserssincMC computation of the sinc function doMC/man/0000755000176200001440000000000013513447512011654 5ustar liggesusersdoMC/man/doMC-package.Rd0000644000176200001440000000254613513447512014365 0ustar liggesusers\name{doMC-package} \alias{doMC-package} \alias{doMC} \docType{package} \title{ The doMC Package } \description{ The doMC package provides a parallel backend for the foreach/\%dopar\% function using the multicore functionality of the parallel package. } \details{ Further information is available in the following help topics: \tabular{ll}{ \code{registerDoMC} \tab register doMC to be used by foreach/\%dopar\%\cr } To see a tutorial introduction to the doMC package, use \code{vignette("gettingstartedMC")}. To see a tutorial introduction to the foreach package, use \code{vignette("foreach")}. To see a demo of doMC computing the sinc function, use \code{demo(sincMC)}. Some examples (in addition to those in the help pages) are included in the ``examples'' directory of the doMC package. To list the files in the examples directory, use \code{list.files(system.file("examples", package="doMC"))}. To run the bootstrap example, use \code{source(system.file("examples", "bootMC.R", package="doMC"))}. 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 doMC package if it is registered as the parallel backend. For a complete list of functions with individual help pages, use \code{library(help="doMC")}. } \keyword{package} doMC/man/registerDoMC.Rd0000644000176200001440000000227713513447512014502 0ustar liggesusers\name{registerDoMC} \alias{registerDoMC} \title{registerDoMC} \description{ The \code{registerDoMC} function is used to register the multicore parallel backend with the \code{foreach} package. } \usage{ registerDoMC(cores=NULL, \dots) } \arguments{ \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 approximately 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{multicore} functionality, originally written by Simon Urbanek and subsumed in the \code{parallel} package in R 2.14.0, provides functions for parallel execution of R code on machines with multiple cores or processors, using the system \code{fork} call to spawn copies of the current process. The \code{multicore} functionality, and therefore \code{registerDoMC}, should not be used in a GUI environment, because multiple processes then share the same GUI. } \keyword{utilities} doMC/DESCRIPTION0000644000176200001440000000145713517143412012612 0ustar liggesusersPackage: doMC Type: Package Title: Foreach Parallel Adaptor for 'parallel' Version: 1.3.6 Authors@R: c(person("Hong", "Ooi", role="cre", email="hongooi@microsoft.com"), person("Revolution", "Analytics", role=c("aut", "cph")), person("Steve", "Weston", role="aut")) Description: Provides a parallel backend for the %dopar% function using the multicore functionality of the parallel package. Depends: R (>= 2.14.0), foreach(>= 1.2.0), iterators(>= 1.0.0), parallel Imports: utils Enhances: compiler, RUnit License: GPL-2 NeedsCompilation: no Packaged: 2019-07-16 22:48:17 UTC; richcala Author: Hong Ooi [cre], Revolution Analytics [aut, cph], Steve Weston [aut] Maintainer: Hong Ooi OS_type: unix Repository: CRAN Date/Publication: 2019-07-27 21:50:02 UTC doMC/build/0000755000176200001440000000000013513452060012172 5ustar liggesusersdoMC/build/vignette.rds0000644000176200001440000000034713513452060014535 0ustar liggesusersQ0,QHLx' x0$=xmhy$XHiB"blffg6:!tJÅ˂@hD6]Ƥ,xH"$żU0ÀBV 8#IwpMSc"^ [prc\f2 |S(#95EFK!RUZoahRF]ԡD/}"doMC/tests/0000755000176200001440000000000013513447512012243 5ustar liggesusersdoMC/tests/doRUnit.R0000644000176200001440000000535113513447512013756 0ustar liggesusers## unit tests will not be done if RUnit is not available if(require("RUnit", quietly=TRUE)) { ## --- Setup --- pkg <- "doMC" # <-- 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 # ################################################################ registerDoMC(cores=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") } doMC/vignettes/0000755000176200001440000000000013513452060013103 5ustar liggesusersdoMC/vignettes/gettingstartedMC.Rnw0000644000176200001440000002637313513447512017064 0ustar liggesusers% \VignetteIndexEntry{Getting Started with doMC and foreach} % \VignetteDepends{doMC} % \VignetteDepends{foreach} % \VignettePackage{doMC} \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 doMC and foreach} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Getting Started with doMC and foreach} \author{Steve Weston} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} The \texttt{doMC} 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{doMC} 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{doMC} package acts as an interface between \texttt{foreach} and the \texttt{multicore} functionality of the \texttt{parallel} package, originally written by Simon Urbanek and incorporated into \texttt{parallel} for R 2.14.0. The \texttt{multicore} functionality currently only works with operating systems that support the \texttt{fork} system call (which means that Windows isn't supported). Also, \texttt{multicore} only runs tasks on a single computer, not a cluster of computers. That means that it is pointless to use \texttt{doMC} and \texttt{multicore} 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{multicore} functionality 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. In addition, it usually isn't safe to run \texttt{doMC} and \texttt{multicore} from a GUI environment. \section{Registering the \texttt{doMC} parallel backend} To register \texttt{doMC} to be used with \texttt{foreach}, you must call the \texttt{registerDoMC} function. This function takes only one argument, named ``cores''. This specifies the number of worker processes that it will use to execute tasks, which will normally be equal to the total number of cores on the machine. You don't need to specify a value for it, however. By default, the \texttt{multicore} package will use the value of the ``cores'' option, as specified with the standard ``options'' function. If that isn't set, then \texttt{multicore} will try to detect the number of cores, and use approximately half that many workers. Remember: unless \texttt{registerDoMC} is called, \texttt{foreach} will {\em not} run in parallel. Simply loading the \texttt{doMC} package is not enough. \section{An example \texttt{doMC} session} Before we go any further, let's load \texttt{doMC}, register it, and use it with \texttt{foreach}: <>= library(doMC) registerDoMC(2) foreach(i=1:3) %dopar% sqrt(i) @ \begin{quote} Note well that this is {\em not} a practical use of \texttt{doMC}. This is my ``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{doMC} with all of its dependencies (\texttt{foreach}, \texttt{iterators}, \texttt{multicore}, 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{doMC} and \texttt{multicore}. Note that you can register a different parallel backend later, or deregister \texttt{doMC} 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: <>= 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{doMC} and \texttt{multicore} 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{doMC} 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. I'm not going to explain what it's doing or how it works here. I 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 registering a different parallel backend that supports clusters in order to take advantage of more processors. \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() @ This is mostly useful for documentation purposes, or for checking that you have the most recent version of \texttt{doMC}. \section{Specifying multicore options} The \texttt{doMC} 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: <>= mcoptions <- list(preschedule=FALSE, set.seed=FALSE) foreach(i=1:3, .options.multicore=mcoptions) %dopar% sqrt(i) @ 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{doMC}. Although if no value of ``cores'' was specified when \texttt{doMC} was registered, you can also change this value dynamically using the \texttt{options} function: \begin{verbatim} > registerDoMC() > getDoParWorkers() [1] 3 > options(cores=2) > getDoParWorkers() [1] 2 > options(cores=3) > getDoParWorkers() [1] 3 \end{verbatim} If you did specify the number of cores when registering \texttt{doMC}, the ``cores'' option is ignored: <>= registerDoMC(2) options(cores=4) getDoParWorkers() @ As you can see, there are a number of options for controlling the number of workers to use with \texttt{multicore}, but the default behaviour usually does what you want. \section{Conclusion} The \texttt{doMC} and \texttt{multicore} 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} doMC/NEWS0000644000176200001440000000402513513447512011601 0ustar liggesusers NEWS/ChangeLog for doMC ------------------------- 1.3.5 2017-12-08 o Change test report path for compliance with CRAN policies. 1.3.3 2014-02-25 o Modified so that vignette uses no more than two workers. 1.3.2 2013-11-18 o Modified to check for errors early to avoid calling combine function when errors occur. 1.3.1 2013-10-28 o Added iterators, parallel, and utils to NAMESPACE imports. o Removed restriction to Unix, since parallel exists on Windows. (However, as with parallel's multicore functionality, only one core is supported on Windows.) 1.3.0 2013-02-19 o Changed dependency on multicore package to parallel. 1.2.5 2012-04-11 o Moved vignettes to new preferred location. 1.2.4 2012-02-24 o Modified default cores computation to use parallel package tools from R 2.14.0 and later if possible. o Modified doRUnit.R to use two cores when run during R CMD check. 1.2.3 2011-08-15 o Added support for package options via registerDoMC o Added package option "nocompile" to disable compiler support 1.2.2 2011-05-16 o Added support for the compiler package in R 2.13.0 o Enhanced unit tests to enable running them under R CMD check. 1.2.1 2010-01-25 o Changed license to GPL-2 o Error handling for the doMC backend should now be correct. If .errorhandling is set to anything other than 'stop', it should return an array containing the results of all iterations which did not cause errors. (From a bug report by Brian Peterson) 1.2.0 2009-10-05 o added support for all of the mclapply options via the foreach .options.multicore argument o added a "Getting Started" vignette. o added examples directory 1.1.1 2009-06-29 o added cores option to registerDoMC o fixed bug that caused getDoParWorkers to report incorrect value 1.1.0 2009-06-26 o initial public release doMC/R/0000755000176200001440000000000013513447512011302 5ustar liggesusersdoMC/R/doMC.R0000644000176200001440000001472413513447512012257 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()) # this explicitly registers a multicore parallel backend registerDoMC <- function(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 doMC 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 doMC package option(s): %s', paste(optnames[!recog], collapse=', ')), call.=FALSE) opts <- opts[recog] optnames <- optnames[recog] } # clear .options in case registerDoMC 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) } # register multicore backend setDoPar(doMC, cores, info) } # internal function that determines the number of workers to use workers <- function(cores) { if (identical(.Platform$OS.type, "windows")){ return(1) } 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 the number detected by parallel cores <- parallel::detectCores() if (cores > 2) { # try to use about half the cores cores <- ceiling(cores/2) } cores } } } # passed to setDoPar via registerDoMC, and called by getDoParWorkers, etc info <- function(data, item) { switch(item, workers=workers(data), name='doMC', version=packageDescription('doMC', fields='Version'), NULL) } comp <- function(expr, ...) { if (isTRUE(.options$nocompile)) expr else compiler::compile(expr, ...) } doMC <- 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) # check for errors before calling combine function if error handling # is 'stop' so we can exit early if (identical(obj$errorHandling, 'stop')) { errorIndex <- 1 for (r in results) { if (inherits(r, 'error')) { msg <- sprintf('task %d failed - "%s"', errorIndex, conditionMessage(r)) stop(simpleError(msg, call=expr)) } errorIndex <- errorIndex + 1 } } # 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) } } doMC/MD50000644000176200001440000000162213517143412011406 0ustar liggesusers05ccadb3fb0bb8ce8f056d4d40d64a9a *DESCRIPTION 8496ae07f7f2e79ed4a024694752e33d *NAMESPACE 250e1452480edfc5d1647db37569b3d8 *NEWS 32dfc0390122f8f3211a9ad035402c3b *R/doMC.R d553f20d1919e861c861e47a9ab71690 *build/vignette.rds cbe8d063311771eec6bcdbcffe072a7f *demo/00Index 080127deb3e876e2055356498b58678c *demo/sincMC.R 8fcc0327de191a9c1cb7b0f95192f2fd *inst/doc/gettingstartedMC.R 86364149c8f84df69f301940708bf732 *inst/doc/gettingstartedMC.Rnw faf32f660a27718142ff17ae344d9c21 *inst/doc/gettingstartedMC.pdf b892b98d66abdf30fb09012b6f4d7ba2 *inst/examples/bootMC.R 2a8744b34d71be17ced7a9e6a324123f *inst/unitTests/options.R 2d875ff9f7508ba4081d0c8428c8df0a *inst/unitTests/runTestSuite.sh b714c95f9af29a012c300a20d676dee9 *man/doMC-package.Rd 4c50e2410fdf4a093f24ad8b962c1d99 *man/registerDoMC.Rd 4ea3d878f4f2fc4b3a78a48af9a2ba0c *tests/doRUnit.R 86364149c8f84df69f301940708bf732 *vignettes/gettingstartedMC.Rnw doMC/inst/0000755000176200001440000000000013513452060012050 5ustar liggesusersdoMC/inst/examples/0000755000176200001440000000000013513447512013674 5ustar liggesusersdoMC/inst/examples/bootMC.R0000644000176200001440000000146113513447512015204 0ustar liggesuserslibrary(doMC) registerDoMC() 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] cat(sprintf('Parallel time using doMC on %d workers: %f\n', getDoParWorkers(), ptime)) 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] cat(sprintf('Sequential time: %f\n', stime)) cat(sprintf('Speed up for %d workers: %f\n', getDoParWorkers(), round(stime / ptime, digits=2))) doMC/inst/doc/0000755000176200001440000000000013513452060012615 5ustar liggesusersdoMC/inst/doc/gettingstartedMC.pdf0000644000176200001440000043142713513452060016573 0ustar liggesusers%PDF-1.5 % 1 0 obj << /S /GoTo /D (section.1) >> endobj 4 0 obj (Introduction) endobj 5 0 obj << /S /GoTo /D (section.2) >> endobj 8 0 obj (A word of caution) endobj 9 0 obj << /S /GoTo /D (section.3) >> endobj 12 0 obj (Registering the doMC parallel backend) endobj 13 0 obj << /S /GoTo /D (section.4) >> endobj 16 0 obj (An example doMC session) endobj 17 0 obj << /S /GoTo /D (section.5) >> endobj 20 0 obj (A more serious example) endobj 21 0 obj << /S /GoTo /D (section.6) >> endobj 24 0 obj (Getting information about the parallel backend) endobj 25 0 obj << /S /GoTo /D (section.7) >> endobj 28 0 obj (Specifying multicore options) endobj 29 0 obj << /S /GoTo /D (section.8) >> endobj 32 0 obj (Conclusion) endobj 33 0 obj << /S /GoTo /D [34 0 R /Fit] >> endobj 37 0 obj << /Length 2306 /Filter /FlateDecode >> stream xڥKo6_!,P Y!: zؙ==(u"E9J&=آȏ~"pUYfΏ5fs['ioq  2̛B%{H/k=S~kțG6&D{^^+Ce@<&HjԅFتT DDևx;9dy5nt{Mj3rʑ$> ӊ"^0▎|ӻnPCZ/SȐ22C E{ʲQCH]=H%d'ڿ0JE .O5h/Cv5,58K/>"[! ǟfu&rp1E=^d~Pc]FۺCt?8 `IF 0iHX]Elm0:*dgH+c JVzHz*Ǧ,Vmf9 PbpeX2CA_>y\VxԞ=>xLp68=zIP^-|o6\BEpSPUB7W{Uq2xk-B*ߤ)v(Âx#yX6v0=tVRp*;.L9]_0#=\cRE0,*}+H8>Dl}PR&cI#KJcquk/6s??'8bCz&qϏ /Lɻ;^԰K(.F|jj!r5KѬkND ۿs#`us㚗cMeU2[F9v/|y1%Ձ\d`S +dVCڜ. $#nԢb;SH:7$ =`Ej롇Esd݊v&IpסE>Sl >-(#EUVc^KN$jtAy?˒: "o6TͷSHaD^ۄIbY(z3,D%S4E~j^-ĸ DۧT (咉"EUSCPxLAq3Fȳ\y؇-eఅuC|2 . FIx#tm"(FTn%G$ӜswP!jS16E̾W{m˫zcNB}:(Ԩ[WZM?5DPl"[<~ӱFiU6H&t_UgjjHA!JpT-7I ?JeWb6>݌H٩R6:hAL>3*CuNa>}Y?|şz3*ǮxF}[N>-oN|FlP/{Ca 38 6R?)\pʗkkwp"xsZy-+ endstream endobj 34 0 obj << /Type /Page /Contents 37 0 R /Resources 36 0 R /MediaBox [0 0 612 792] /Parent 49 0 R /Annots [ 35 0 R ] >> endobj 35 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [552.274 419.237 558.996 432.956] /A << /S /GoTo /D (Hfootnote.1) >> >> endobj 38 0 obj << /D [34 0 R /XYZ 53 735.4 null] >> endobj 39 0 obj << /D [34 0 R /XYZ 54 697.538 null] >> endobj 2 0 obj << /D [34 0 R /XYZ 54 525.694 null] >> endobj 6 0 obj << /D [34 0 R /XYZ 54 293.919 null] >> endobj 46 0 obj << /D [34 0 R /XYZ 71.933 159.175 null] >> endobj 36 0 obj << /Font << /F46 40 0 R /F20 41 0 R /F53 42 0 R /F60 43 0 R /F28 44 0 R /F7 45 0 R /F66 47 0 R /F8 48 0 R >> /ProcSet [ /PDF /Text ] >> endobj 52 0 obj << /Length 2557 /Filter /FlateDecode >> stream xڥZYoG~ׯ2qs: DbaLe(QaG~Y@q:*J.gjˋi]ޛzfu7kM.V7a+\>5- 0xUx+x𽩆@',_o˹iaۋuqL̻Yf9{VV0L}>ѪW7~9St[ d@Hte|qկ%2GG#yQֳ8#rUrrj[8?xqyu絬Cwgw 5xbju-jtkżCu/LWpu{]!m}?"‰trNwT#UuGdlbNmif678[+7Mu?7]=]u/GXF];3M1շuTsǡɰU 7"1Ri]]b&61p` Bڹ&p2{t-ȯ(uHI \<}[CP_51  w.` 4^]u+WFwLjsڮy'(2x. nirܓ 4+y4llaU6 =l/2'q=(i, 8vaw8dѹlϺp (*4s(W?fC6ּu)ZۂS dc](ԳBQ uᘃ˿ WX'#%DQ,it0ǹwQk%Fhآ&ȴƏ1A֗ @?#`b!M/uW!ı7M/\s2)] X SS_ZGN$t_d0]$3adEeV<]T(',zQ$U%ror{!2'!)E1;!VFܑÊL"Gb LE h.|86~ 6o& v{J<=ietl@u FT+|PoYR_E mDL:,h`,8@p}gT2xZx-$)lj\ǐ0 l(ۈi->rq;/JUhEuP9'K34ƚʃ~ 0Xie-RzLJrY@cl p3Y+SUnզ:^J(?_n0!.ېdžS6?qɺs2u0dD3 v>&dţ!'mS_z޶t;5 < :bUhXO!@q.)*MB^CrxyZqhTי4w_4rAl)MdmRjhooiӶw $-'i2$[<;/:*~J D (Q w^ 4a'֪ng$m7LSǰ̑nm2j ũ}.MX=J:G)6lA;"9oX5 A9^ٲp~q>%(E{ȵb%Jk>|Iݰ*!xmq7=kzLh17UV0p"JR`c(1x஭]gem诈 b "jQM21m&td*.k>+%b;гK =g]QE,e](tHx' B%\N\/C2X*!vRTc3bLII mӂÞ[z ܏ ;Qd&`H."|p-0,ܜGGjZuWJ2)˲uK$`Y`7܄L\ӥ6u9p1 sf6!M]Jbx5r( as9o:}SuI:C1#?KI&,!e֗&K>'MTK3 KͻlC RdOr>k&&o:uR/QdUlm[UD(o>8j4 CntΓ܎r aƒpȳJ| G}{_=t\ʐjgMSRJ[NצIKK_W!5%cX1& ?eѯ"@J)cl5/ݾVEF*{O_3 SMIhK;z5> endobj 53 0 obj << /D [51 0 R /XYZ 71 735.4 null] >> endobj 10 0 obj << /D [51 0 R /XYZ 54 697.538 null] >> endobj 14 0 obj << /D [51 0 R /XYZ 54 523.677 null] >> endobj 50 0 obj << /Font << /F20 41 0 R /F53 42 0 R /F60 43 0 R /F73 54 0 R /F75 55 0 R >> /ProcSet [ /PDF /Text ] >> endobj 59 0 obj << /Length 1621 /Filter /FlateDecode >> stream xX[o6~ XIQavmb5} ۲cԎȢs΅e/FONG8P**"бTd:t]ڏU x6|#N՜.W2qsziX !_ȠXgϑEA&A(i0یޝ_qTipIT Q|,M dMATG+MQ^t8W}sz>lsC;i"6n(p;[-0QYIXb;Rc&da\GxbEu~2SK"w--fN8!Vj/'qv#tfrt<JŘ*+hԏJG8ތ1biEx%ms(5;ҸH?uu0&C%Ӊ.Érڵ--|B+s^<>9*4?wS6B^]hM^d#/XJ6ȻK>f HgY{.g|.-'L@7/k{\9K^Ao^Yjܬo*oc,(i;tc^dMb&#zka_{:j畾 k0цȑKplf_Vٴs(_6^ Z¾k_{װZܧk&Ri|C;[[5*X"K endstream endobj 58 0 obj << /Type /Page /Contents 59 0 R /Resources 57 0 R /MediaBox [0 0 612 792] /Parent 49 0 R >> endobj 60 0 obj << /D [58 0 R /XYZ 53 735.4 null] >> endobj 18 0 obj << /D [58 0 R /XYZ 54 633.554 null] >> endobj 57 0 obj << /Font << /F20 41 0 R /F60 43 0 R /F53 42 0 R /F75 55 0 R >> /ProcSet [ /PDF /Text ] >> endobj 63 0 obj << /Length 2362 /Filter /FlateDecode >> stream xڭY[~_AZ9Z6 l[UW77{!E9Iùw&:Jw7y6M"c*nMӲٻ|kfoܦ'Oh<𴑎~_B{>e: .nV}w7o  F S.ˣ$ZBwQWU=Ѭ]%觛nLeI2wH7.vNd>6{wbYڢVgdO"=IŃ~"$&]d*g~?,i`ޡTF^y#ቲ86p,\N=|ڋQWQ|.2Mu.ioJmyEfn)N%`h}6C&ҕ-+̅|L=HBR.4q(*4Q cxZ@F'+ɓA I" ԕ &>M   /.a:):8D}+;}u?zb9~)a;3SLr@Klp4$hPxhV7jȡ=EEҀ5{xd@]Pw#|>0h9'3*pW1˞+`_ d[hܱ|C03N$:F  T2 }S^!-wgWpjĩ-+sbh@I7d0Rr\BW'҈-$P)*4Otg!}5GG#4 i410Iъߏŕ1#,F[AOI oBxlGRC)opԹ8/J僂k6.mg̯bwO&ạtRAd|} KIš#/)xǤGVcOE`-C[嬷8ЊCJ`IJNi |@ו"g]yN,G/ $#k[Ė S>5Y_Ckp{AXj5]D wo2KB@MXZ\t@喙$/3"l,h_Ap18]豝j8_Vʬשx±m9(T"pitL`3`bЙb\XV7bC.-N9pJ _?鬙_iņOv{98rblj>Pc2?1e endstream endobj 62 0 obj << /Type /Page /Contents 63 0 R /Resources 61 0 R /MediaBox [0 0 612 792] /Parent 49 0 R /Annots [ 56 0 R ] >> endobj 56 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [552.274 679.777 558.996 693.496] /A << /S /GoTo /D (Hfootnote.2) >> >> endobj 64 0 obj << /D [62 0 R /XYZ 71 735.4 null] >> endobj 22 0 obj << /D [62 0 R /XYZ 54 554.61 null] >> endobj 65 0 obj << /D [62 0 R /XYZ 71.933 118.913 null] >> endobj 61 0 obj << /Font << /F20 41 0 R /F28 44 0 R /F60 43 0 R /F53 42 0 R /F75 55 0 R /F7 45 0 R /F8 48 0 R /F66 47 0 R >> /ProcSet [ /PDF /Text ] >> endobj 68 0 obj << /Length 1622 /Filter /FlateDecode >> stream xXmo6_! (&W 뀮+!Q#ZNȱ1`y<=LLN~:|RrN'׉F2),"}[*g 43ڥxzA}ͼ|} _*ܙzSR!CDg J{.Y;ֿ7o@{52ND@êm{ / ,D҂y5$u#CjjSoKv:mz ;bLS)@zOrܨ#4OV5a?IuJup{J8Ng3l]E] ϐ1fOQy0mkx.7|J7ަ4>nvOm!py$YPSs&FӃDS:ހ6?ڧu.\' Ba?>{a73 pӚalNۺ>A3,?$7G4 z*CefڏG֯5|̼ BOT[YNe~z}/@{:m^K5^q ddIR* K SnbBP3.IH.#ehms_D׋.#\1b}N*7JS? |?_ endstream endobj 67 0 obj << /Type /Page /Contents 68 0 R /Resources 66 0 R /MediaBox [0 0 612 792] /Parent 49 0 R >> endobj 69 0 obj << /D [67 0 R /XYZ 53 735.4 null] >> endobj 26 0 obj << /D [67 0 R /XYZ 54 695.047 null] >> endobj 66 0 obj << /Font << /F20 41 0 R /F53 42 0 R /F60 43 0 R /F75 55 0 R >> /ProcSet [ /PDF /Text ] >> endobj 72 0 obj << /Length 915 /Filter /FlateDecode >> stream xڕVKs0W3FAfN2tЙ4jcScRcw_pL{H>}HZX}.>X[5[*;m25Yf u|* palaYvI`Z6xiia_V(yh'p~v=00 T>Q3ՉOռj*iT>NQd:pԲw܇7.0DE.~*tBk `ήѼ.1s1"{8Xҙ-k`0Ѫ%^D*ASLZV$s$̽6ٜ2Lob3ѿ\;+ l&._y'FL׎N9~l_Sb Ϧ5GGz7-Ȟ}kBi ]wEy.J8)\ǀi;e&[H\6ưYcaij3 J1dɄ:4Ng.k$gnsyNʹ+sb_͠= 5~ O"Ȕg9BAT ~&m8/6q'I g)_tbFX0\% Z24/rD K @3Gwꚤ_E%_uNPUmRHVF3$s!XҠ>4[vr }>_xwN "}W{;O XMQj*gu4wt mO1wC-IdX^\`nlpeA2jv'Kf iYZ ƿ7S[3z=; h|5zRt xNذRJ IM[ h\nujUUҁ 9}Ѥ6͙4 m~0*J endstream endobj 71 0 obj << /Type /Page /Contents 72 0 R /Resources 70 0 R /MediaBox [0 0 612 792] /Parent 49 0 R >> endobj 73 0 obj << /D [71 0 R /XYZ 71 735.4 null] >> endobj 30 0 obj << /D [71 0 R /XYZ 54 613.737 null] >> endobj 70 0 obj << /Font << /F20 41 0 R /F60 43 0 R /F53 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 74 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 75 0 obj [550 500 500 450 412.5 400 325] endobj 76 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 77 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] endobj 78 0 obj [569.5 569.5] endobj 79 0 obj [531.3 531.3] endobj 80 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 81 0 obj [562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.3 531.3 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.8 312.5 937.5 625 562.5 625 593.8 459.5 443.8 437.5 625 593.8 812.5 593.8 593.8] endobj 82 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 83 0 obj [667.6 706.6 628.2 602.1 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 84 0 obj << /Length1 1924 /Length2 12459 /Length3 0 /Length 13645 /Filter /FlateDecode >> stream xڍT #ŵNqwwmwEZ ŭ ŭK3gfֺwel}~RkJXBAPWVN6!>' VjV:! Ȥ/D@ pqpuH!6"J+urXY#)(9@ :T @;r ֮Bl@{6(# j A?JAƆJ жGzAb` rDh)(A!+9N6οe#ß@ # `C@5Ye6WOW"btB/?Sd%4 F?ܼYR jorpuA#?i3^ qQ# E  O k?h{9Tr!~A/>.@w o"TNN%`8E 3`2~?^?L%G̮& W+%%V^n+/'[_?w)UBʎ `(@?Etᅤ5  ##B_`g9x9,^8?/&f/3uSh2n/}Kg%vW | +qx,!‹s;HrrpYؾ\*./g RRjq@/Tp,%9@]_L/Pg?N.?.7_o$`F/^ ?Hn7bvKAi?/aY9b/`|/Kv/9_Rw|I7y|KKʒ%Ax}\柶3_xI/_rşןf6x?/}d:?xjSzS)A5*vK/g޹)"=xJ"q{iSR|砩)9AV 8Aط^r2VmmG'_ [&El'7L\r5ŋ3[|Jhœ1: hs3]YɑpN<.~d=S(~dFÝc{;\ILClHD3r}Euhy$.Jwu=THd&A }7b7io8Ws9.W.'a;ؘͩrх8 5pӚ2-Lrg[QXҢ 8%UoS[qtY'-9b#Dlbë!(j.J8bå*jB [Rd.=IcE:hD{= IO GaUK@ǜ%z _;#ن;f˧ȅU~SՉ:1LBNm0麲cNyx>D}3a&Ǡ;i|MaJB ۥH%\= U>az睠clߕF| uQtd|NsTiQC#Bg/Qo7ܥ;Wy![BpH-3#l'-< })&aH 6KUZJZ-3٠4!Jho"@(_Aw:af+[)M.];a!44*>h X>\&!!U611#X=̫ #ieXoaC)tB0,H'x$. c0* m}}~#7r|\&@̯(})ބFd2Bh_δٹƓG3YWڐ"_:dFc)m?0[‡Ɏ^$fb]YBm^!hֿZw$W[u W?0:Nr RhF,!3)6R*\ :+ǝ }%Un}"gVJZ$.%XLT}Y[U(v2nb}22OB+7NY51(iI?hkWIrYxfcS_nZS!۷0UE/zE KWbG6 awAI?~w4gWIFb$)!])Fhť;AחJCyx[ހm<7eGԜd}wd׻dEi *) l%['g;FNi l3Rnd:芷Y$&P5빡eIuDR|utwQOâ8&9yX"+~iX0RyȓLQ._~/8)b nnSf 7!Ϭ3P*@J5p[{/&[XLH.pƾ:]PTyzCu_)rMYuT<`lYQ*XAL4MۥM]\`q;RO4띖_^jhotIqo'*$}EIipT&M.dH|LƨB*16KX܉FLt3B7"zs(`@V)YCSJ =W~ F%ӗD4SWv=9D<J>"#0azҭ-Pa|" $%I<ηC)SB]h3?0b9萑PyN ƅ\`PՉ`=9d}8sC,imkG LV-}Ep"3mǽ[j3]/F" emED#!RQbz7*L#e9Xv@ +g(p2{ cCr;ظ0 t&{3Ϸ$iYYc/}Y@a~| ~x`֨r=+H(Am+ \U]V'cϰi%C?-ҐͲfmGC,PgU`NaeKF% uF[MYp+,ǯ_ekL dעrxs W0+56P-s^*?LdʺID(YO& 'm݉)+X=ϐK|B 4taAr|lӹT>G6^P7yF{C0;-!EfpM`Z ̇eak#/e?Vb~τuPSEpmO+МYCh8E2uc4- ¹lZ]UIe*jgL+?PRf1QHD~CgO:&xRGߤǽDHp#6mdOXYȫ_3_ߜrigg'NJ`emIoj*RjTDt䞯9 JmE`rT.7kO~{LzQ?Z>ucӺ Ãn#o~0/ mM.-eomed"W ؕv'u-[s`5Ų]e=? @ӢyE^ۺ{a?V| O]qzהOiPRjLK,Ul ΃FbNI(gɭ9KUT<Hy8k#g:\jggDh 9iń0gN8d4-_0l=pŒ3ugV璖٧UMKt-VN ;?5֞r?XaeD-sgI[1rv]=}{ i 5k?GʚMX^MEP8˽sşfJM\LvdgXR9ZG*'Ua էOvR^XKdOzӲj0x*)^exS;NmE ܰ ,!4&ϐ^$ H,+aZ.̔VdO j A嗭V0&3ZV8El#p>;IEAtΫ,*տB;T~2ҳ$c/Xύ GNhM>*FxMGMZ!D)\NSq0ќaVRT^"1':>7Jwq t=y+]T!m;"@U"NwD%+w@ Ou]6jl #0O<כh)>>1=+lDC? QjF̀V-曻JzS%:gWуW, qeNalbkx'3d?w5v6Z*B>Es8^X$n]@Xcdښx*]ҿǕ\ |"kynB}E6oh-GFdГЁ?\-I&圱||`.Pu !5ڲs)Fҗx K&\xkîSg*};OE4쫡x;H"<#L>3j#E>7[>f5dQ/mjp$SNWDX >:ODpHUNGiWͳ:Mu/0g6J,Z6oH^s&S&l褿z'/lܮI-KBI%F{-% GS*¢/J҃gjըʬz b+d~}:|sj;wkSz\U D7rjhLj^$cd⛇~K:&}?ðmNnF.#"ZIV&{*iyC`Ech9$'NP+r4LA7/5z!Tyw5~rڢj~e htn:pIZ\x0,*-f{eeB+LYo8 M-s/ Fxa C  ZXv-'";1ɇSsM$20rFؓ/@~}lthX=K=zE{KEc4)X lW*J5h BW]?Be5rV>$4[k!n/7=| -^>Qi-Mq cJZ=ۨ:b?MA+F L*X#/ m͆0Ԣ>v|v,n&6I/4䙼T>հ wI22.k~1R9!Ҁǭ&;ddz-wij^S] ]mIE+jX?q}iB\e3ʎ G$`3ԑV!-*_"Ʀ[MrHr:wǏn;X%w\ IϬa-2F/Q8Ľ? 0qf3\|8`E/Yz ]/.ӱuU=`.pg0a;ꃓ?tN̝~HLC%VfBm}|(q2̤ߞ&eUNp)3wXҪ&c|R_mfk$ 5[GqHS)f"RbXn6;yV0_%mŴ[GmEF19f+`8!<kfgt)c2Nwz(râgjX wmgE.\Ui~=$ Fij;J|DnpSϱJ.?7TÉQ]is,B/2@ˑ(Kzd_h^;{ Q-|:\JW-]:RM g㪒:~ދO T,P|cBmNfiv/nCJ7)ȃ5ʤ"w.0suIXҎV"a'ۄoD$jDUig`ZnJB3|#gy>z<>qMҩ&. ,P!xthLBͣ^(2w-rk1f^„btwghޜ-Ǵ{jsָa3DRK"Z)@ԧ/I~UX;3bZ0[X!Y9 3{qrqRw;}j6uù`Q"\mS%+n6 ϟ gKb s#cJg=54Ѯ 4?k`ܣL1ߍDjrh%iYrg 6Hh7WeN}}L3#PBI P{^ch7}Z/4_ + !ŽQ뱿YMb0_6P.TZ!b?=~!}</&jJٓoP=6sK7֒7_~Q ^A43wg4Q(J6fҬNI#"Ͻ{@go~L"PzPRYR?n;ng$N$c )aPDW>U_7Fr}LCuNROC`YV2jxS )C]POEX`UZeg:xbu5>ml1Ê릯\5է+bР7Ա24rъb'P{チDOqؗͅsU ?'hPas`ЗH75Vw!şJr'N`.yO(3]u?/}”`0=W$ RxאG|]V# ,•31w4>=Qou{eӊb' 7_X>T\0tojwC}"4/d~8+mb2%.K oUSO!Nto$lj>\ 1 &%MC*ԹKOO\L?0Mӕ8|" /`kM8*Gzlî[_6C7_Z%=n*_}sMK gMXK1O{΂iC薄92~/qw~cƐHA=P,4_Dn٨Hkqַkpf:@Z֚:+mPg{=soH{`[RF ʈ'Ysp3`{6}-MIe;vWr5jnM0kث9%"blz['1%R5-|Q|:p߭򓍄SYўkv*x}"T3U>x.*}%i w5z)"E|T}҇TJ YUW7QkǨޞKh|+Q)iSwv 5x;z95SmDIY[xdụGǎ (nH4Z랳߮ = wiIq$eNX܀\ P%b#LBG3LEP9 (ƛ-TVy8Zy;^QB0X(V>n)wYj HG0S)hf`WQ"S yW|s4WFm)>mNZr3Frx,@aLC3c,ɇm|J3e*sJS?϶wYͯ%`ynLu@LBo &+ŭpM4 %Z;yfѫÃ9KUN8C{(7i*}|C_ vW~bCR`Q_Ib+^F>L0Qb6vV6dhGY*ߦx\5 ̸\˾Q/ _@etVP@"1t@!{W^S(hGiР@1~!"jw;+`4Ȗ3u*U"m{X K3g0nuc@mBq$fc򵛎FD[Q;on餿,|DW|6?VoԚ@9J5>z5#T f5ڬt5/u$ٵ8dJmULOW+z%H49HjX"(<) ݃'lݍ[ m\MõYUrˤ"D9_~d x(@v{8\ \ŷ˳ʟ $1v:rzV p=xhM˚R#qYҨ}~G}lp 4 p;kϹ*R^+ͻ'Y,pw_w ߆܌$"b2(STUڛ'tDzUVg_24sׅl3EOX^hceHּES&l+ivߒոΩ7v,oB+y+l+2bff]cʹ5*|9g.Jm$Z}ʏML(CXU(^S8؇ɥĝ1*f)WM,ϱeG]vƉ wh-s;X?JT ƺ#6}@@AM% U@̭pu; [4sA=w׌5 nx-6+p/I[2K& E(t{L6y )Pe| ¹?#xA}4hB_}KvӑɬVu2GSնrcJOU]ſOTہRd Pc:x_۞aDLj5!$RQ ᚼmXM=bz1Mȃ[#~%y9kN)RDf`HEVG:ZO\fTؐka(*ʼnR7䷴iv6t̫@? u/X x?z 7z݀1JU%ݸS,a̙uŘt :`֓r>F6on/ʨ,2rIL.PB= Tk%Q7h nsʜ&%̜\Dp䢬fy - ^!Np߷MP$H(+{ũw'*҈ǭG[ccM{}`ȶv]umL ԻRNP~k~8]'fpʌEУgR!49DR.cWf[ am=~kmrԯVM;.6.Nj\t/+ 3+j(~f v uTa2]|ޒCC{ُ[x.I/[18P gG+JLq w<ŪlV!-u ju4_x=@j ӘͯE*sH2崟N-<#o߸˾"(Df7f(= }Su*;zP9չdK/+taڒ4B2=EiԵNY豢.8DE 6EQP3PAV[|oxOu*h@I5G.9ё|)i.}f+MPk!7S]YF};wn54OZ3I`+JȰt k$xH. TODKWN|iYQ3|: vU:9BGg0&_n\fJե;>xq12ݓgtuTnʯ(3arWa{FGԹ=4(>~)ٱH663&W@vNh[+})^/]}a&pmG0tu݇>R#^b{ɰ/֣c_> endobj 86 0 obj << /Length1 1807 /Length2 13749 /Length3 0 /Length 14884 /Filter /FlateDecode >> stream xڍP[ӆ Npwwwgpgpޯꜚ*湺{{g R%Ua3= * `ffcdffEPeF:X9 4ČAqW[ @g@ `tAuptoG) a;=@d {`jyO j>Kȑݝ΅Bn]n@3_Tƈ@PrǮ`r7v V@{f@gUi9#`: #k_^llj`hlieo0%A z_ƶ.݌lMVn V\LA..VWS7uڃ\'f 4}?vOn_`neofWfLVN@ik\lajWz5OGNz;:8ߋZ߿]݀+O 0ZX#7h_@X}^f ~Te%?>7;3Wq?o۪dl/qd7wpSF;(82@c`6}y^Wn?nc;+[+},އjeyJC?h"a4SZCV@%^6 ?3y.<f +'߉>f@[hz_x/`׍r2CL O&7i_z47ʘ@d0,t |e߅ߧ|poޠ~ `rߕ9\?].|_d} M]ߊ{g~@S9S`jawݟ)4 ދ`Te|^w6܃-N}#D}Rښl2ۆ0=0,\OOȠ&hC"\{>I/s{Uϥգf(rL2gq`@ Dp(37'Hd|O u6XcfVX]tp oǦ(Edp潋 V5Ţh?nw>ӗJQP,,/Ua4v(S!ePd-C~4nҸx!PU;k|ttj۶B iGI:vOjѼ.\DX>3\?ƌ)D _B&W@6e)H_WyRƯץ N.&~?/e2*,)9V0ݬ4(php`|TCI*Jl9 <5hThdPjEe~ɀJ({`r | Ԙ:%Hd* 1oN&~FSsg2"┑_#_&1 s\_ۡY}BڰZvza\CCuu0W16X6ΫOJ|,DW{)%d^Ԗf_gYWC4uQ0h4z)PEԴ'.ܫ)1޺Y^k"ntknY]3i$>:Q٥̃wmX7ou9^w426<;L_ڲ+G48#a:"YD"d*2Ok$WrJ+>>73$lvLJ#d)Y),MBdR]Yp\SCg8ih {˦޸,^˓M6;,َ~Q;vHk'6SmNx;7!TArɉTW6ñSԐP))s|v`E_ŏa,͵MV}u@ዠ(Ao p Ifp%CwDr% UY^GCT;c/ϖ s;),rnvXV ]Cd'Gv}BM_*p+VL(SiҎaroz3m;(Ysx5iTEJs`f eVzv!Rl]Ђ'K 䭲ݧCcya"/ h17Jׁ#P]cqg "Rd9a Ild$m"/??)ٯ iW5%n[PF##P Z!נ :lGsVt݌]&=Yڡx!5qUkSK# gZ9 YM-(8Bo؜}58ʈ|7P _j]m O}˰8N 1m`4zU<ݠc^1 e6 ޅ蕊YV>~ ίǿ!D&(+qcשcKmkQٝd"zt6ivTo]zPƽQ\4Vw19u1I [3G(內v^Q[ )/M.-gJ `Aio *+p' {4#,;%m.~ý|=O0ͥ ʮ\@Y+V/Wx,QO}^R</u=ZVA,®Hy &tPIo >%X*b?Y*)N/^$*xA:wÕ$Ɇjba$&,F+\\~o/=^ { OQ 8Ug{@1|FCd=sxniXB$凛\vٍI%.vY;˾Y[BTj&ؤBLl5x4o^Lm#5 BUD!8fky)x|:m{@aη~`RHBnXdQq\ˍ> ,償J}[ShA_;ȦOt]C+O4x N\oH`̃2 4WC(YKlgX50jWCNMv ckJ2yF) ')!-]Rþ>0PܚQPSh劭SI;u.HҾ8v,"D-h*=^#W=z: EmQ"yK-|ζiTwM5lӨ{A?doh RF.:Iv?{t2 A[Va}&dH*On8_=9 mLn}u/=%N7̞K{uH6stL!89D8RQQHoS8FMƓ3=f{  3r)۪3r|?ЛQl1|Z?<2%5ҙ,v "4 Umf>W 8lBr("),=׮EwԊ[xL7R懃H돿K׍u>+yHdcj>.Kajc\s,^=oJMܳ$L=5P.u`iyjpahA}]⁥L$[i_;^,t]yJ,~aUqD2$o pĭa]&;GY.p`MšqTRņNtkbLuh#pixU'O"c0,wWӭhtYj3~Su~4+iKNsCECLhaGqįOQ#g f5 IYn`9c}XIBcXʙI\LȷV} Jc>#n4$-m &*E f #0S3޶FM)[q0g64f)i9tg ׹M&s_m2ɒ$}*sy)-MۆfhĀy ARγHE7ÇHރڟq[2n9jW>"/–,SZ rVw_%Tf§0` F|9uqk*l4?imlc FTiJ%mQC[s33r❘ #^r1pX(w#R'Wrˤիo澦Ntݞ~/]'+;A4{VI͋>t)=XS.0bIm܍QhOF6~J v;L{li;"y)A/6*7/nTvT=bmc$\ عH7suv U ,O( ׍豭s  0'1_G=R nKr~p}3_-e0mP;NglŸ׵Ѭ\zVwz/;N~k;F/ê@AhH _1iZK[-&ug\TqedKw-t <" <ڭQ9JL|},Ķ0'ziGu<`q`"7r*?![ ;O0X$͔9dd|^8[3WxV^;~711Rמեq0HS^Įoޙf#4l}KL =U:%^WF#?82MQ=A )zrv)lum0{ǚ{Q,V01[n\ r ^,Ro87މZ/=׋\Z> H1dq.ŪX*m<7}2͠{IP~ztW?%pB3*e5 B[ +Ee0Ɇ[Z:<$c rmcPK( uhkVfYCג6q22E$-mpK7I 9njhq+L=}1Ӑv*|0`j.qG)x!. + !ҿ/ XiZȷ m7N5df}[[P|D#pԆq_ R|y#Ȧeo?Sn qrg0Iț s,:2B6d9Dut$$0;Yc-C]f{w~m$C'~Τ/*e1UI^r$IϩЂξ"V*s _9ML`yXe2B*q =bB8֤(u6b 4gBU{(G0ݣ;:R='J+a04XRE}SQ$5xVgX bX`V{A{ M}kbuG"rl1?FixFk'4XN3<f ZV,a 2]Zd!%b*|'C!Jw:^.>!}fU1" xKgڋzbUYt̚e2V갉+/MOpP|`FA,SίX]Sxc2n=$>!4־~@HyNW]YS!,hJwKQж"><4w/@}uDfS~@b@\ѫUW9WLZ),7j{2!ˎO;(ˀ7Y9^)\*IԇݷS7kLuaRJT{GsVb]\>n^?mH$|;9:+rޖ&IǥAoBG`"0G#8nquo{Q_NU+~%S5@rnQĝC"g)f|~%ξ,bh/hel. zOYsDN&,2R& >SU:e?N!~JFEpHj8z&Ziyѯ2bPʩ=|m' Yy/Wfgрq噶dY+%g*FIبB昣(~X;qgx!2]>iJP*0 З2֠$_ O6O_O|Tޥ=4%>8λX$.} zo!6uEPSNw_{=#\d6t|VZzM!`uыfg+ {H{HoҖhp ^(-Nnַ N,(`|cWiz$‡x^_Bcrjb *V  7:`ChзwpDHqnb7!v+$~ӅnPlWj Gȗfp+dfFxU,0<["۶7-(YHEhKj̭F]GE%ĚVKO+? ,- EN32{jϼ"iݗ쵓p&˅Sͺ[;呑 ^%zYBi8UFw*H4*^Rd_*.ι%kQ=u8eRvEu*#JmirAK(Qd@R=H6:o^0jK(0uJnC#oVQxҦ (G=:v7p &'.4|1vJ3繗w @X(Y[jw],|LX0WBأb;x.jTUs7o+Y#$圜 >MN &3͒SS&(F̑ NWy%:_HrGTISxU%l֡_)^]\ws%]Z$^ HPJ5sa0xX`89lC M#1GKij}P[?#tkFj,eGz#\%ľ_.f`Un4QP=nPrtI01gd/J?8a!رRa@@ 1=< <\#;u{OQ[,9'`,ݍBpPX858yTf%4;1(T n 9Cx, h+ ⨨zSX>R :R⺢pXhkNqmQ"0j$Z'Ά#cfX@BGtcyuj@Aŕxyrjuޠ9e13ᯣdM~kC(PR >ucq _IzYO!1qn!\:SX~CgMɄ  sWʪG{ib]ԅ.,)RnedDؗa/[cTkπ[{^  -f H3.^vw;ۋEbí5xu [ c/K6x,"Jx|=4|Ggʶ&Njܶs*dCN2 ۿk"$'|Ô,g}InPH IXssIMs7;I>#J 8ճ[p j\V:ÛG*%҈D#̘/qkʨy@?ؐlZřMVi2_[%M?A&SM5CIY:8L!~:ĕƾ?)J#bRWΈi~PbGA]1;o*3^;G3\f\ eםqω r{ehb\"\BtMcE'?H54i{/ VzlB9>ۣ)"B/,ÈC# WXbXRJ!"<4LmP+3P~``1/|P#9Q :ռSa|6܉`/zNnAXR /J=|OAWeE2VZ Cw®۵q%ͽxw@kI&F^vlZzaW"˸'{lp1 y_u;f㖱ۍi_5jpmZ  f=:; ӓb Ne<7U :dK'GwDQepF(VF^^MPq\ˢ,C 5li̷A[Ctw{kaJ,GSw8{S,cKPh!ޱ%̹UX214C#} 1d&; $$Im4Axk5Z]ie~&pМ޶]ܽ$luœ۽v/|;ʊ4 Ј_Vg43}ua=rq\oD9|.C_6HBk W 'khJ9/E7.y. 'qs1WFeʥ h-[kEbq*qѹsy-w  _>n~+c =^ɓxQ0m/aRo3cGwUe|u?MumBRk 5XʛxR.LG/P,~0mn[m1OG۳,Q}_X-.'0ZQV5M. ,-܁GV8VV6w&=X?kkPy P rP)3mfhpCv^`l9ո#l2}]+2@{1%CЊ sj.bepFd0]hL2{n c^wqЧtгX4em/ΐn5NKCkHi`~e,= k?|I+naT״e`mC|rjIEZ֪0 d X[.ʒ ^_o AQN\/R1x<{ex;&qFY*K ŧ~ihɭMdsNR(T{ zRUC,.i~~Z(.xWZm%P|",މ@+YTvc.n9SIVp1ֶaQ#,!YGdN%fkЇ2Ba!3j4p*;P Oqj1 ;Tw?`C= V5cP`F~$:l 7ÿkh5P"0O`,;u&fsDs4Tat#9KQ[}ɼ c: (z$ձ8.c 3g)367ً5]8)ixl<(/|'E+4w S4b`ʅ'SMvOiߔqh덵~DG\%\<K{yv^h`!.LX4!r kgJkQc?䑺AD&NҎGcRo*Sncv@:67/3;4#?!YK9J)rF?R~ŵ:nђmZQrv lߛn, ŐfgGyUEj JE4(%wa {| +^ޑq'u5~Ltg)يke"xW_9 ,by6ڟ*=cU/"@&cIX\Ipq+~Z+г~Yߨ||V 4cٖ4i _87 _v{<RB6+g܅PCH5uQ/[rM؎%S鮖sE5K\̈!ó :Yx:"BQb< -snyg&̐5 ˫*Q\]D߳/(}B_qTUI~Ci^|v9fSvR0]PI_mG[ HlgyVnQE42>!aq8>mEx]•7= ; K⦬J>DnodW'.GLhrhSc@n3χwɫ[&-&|DK.)eu_bvDiѷ{ yV7l81/{K8J=$.ܱ¾#͝ԑͳbS3'Vi3q>y+5"2ZnZC%eCw9 >-Tğ^/|v0b%??)ᐜ⾲.4Lٖ9هNER -{ZcC.?=¾&SX=̼7D4G֩Zk4;@os3Yp Aqf3KF<1iȧX;D{ۂʑ!qN"c>Vg  J$bQ@QE ..zgn<;aٞ0-YVB;T]~jF $!lHK"%BBnk΃pR碁b0%.?yŜn(`b16 |+);-LMŃM'&/^Af6}Ӯ),a9}hovdp"֕񈝷! # 0aLD2ͼS5Eȗj\+$ȕ~ &X=F*B{;SsU+.+:j !6AWÐ (6II|;emWo{3P+n~|e Iú{rb=~2G"&M_vqP0_5ςMK~>R+dxBZIԫHŖܾýJL*! 8A*w{ ĝImZzs!O' !ϧRJ^ [A>^-W+gE 漃A?;^Fj'PgJF A<Ɖ-_E&P\9+T%=Aq}g5 rF@g,x$ ǝފYF%(ģ-_u<-4W-Fە-"g}-[Cnpt)΃q{ ⭛G"R-6 4G}Bg Ek3܁8j(d}uTVA< N[I]LuxYiOV2)ĎU$5QQY!?Xà<뱣Ȳ3&+?E|[6*w8[vz⌇cðn7lS*^jprè> endobj 88 0 obj << /Length1 2488 /Length2 18812 /Length3 0 /Length 20236 /Filter /FlateDecode >> stream xڌt ilkm[mض8 ۶ض6'7/ic;2FgιJBFL'dbgucg*11YaT,aԀNv8 evvik C;Gn @ mg t%p03w~OJc*!-@hlglt nnn6NvfT7 gs 4E gh=,@#.0:{ؚR@?c@ 7&z@;zXؚL-yOδC[ ] -  .0|'/='cG {g'z' (2b&"v66@[g'ؿp݃Zڹz L-lML"abϠjk][ft122rp9_U<+3񲷳Xz9Ύ.@?`&#-b?}mc0Oebgk2(+j:aa;w + `co ;  C rv P|F6FoLokWX[[6}]OٰN,j Oh$n4Qp66g3@;'#ѽ7c}VSۙubz?&@7@okx0sklD vo`/`0FL߈ ~#VooA70F\" {>=oO7zSiF4- wK]glg>HXYk &Gx?k ;Y7|`d Zl,A?Rsq#=oF]47a.#!; ?{MwjL}п]̻Vl;a? =3߼UD\jW{S~w/tlNk}N~28;{px|p?w5ﮞ@b5e{;?@w1ʢ1Oe]p}$فz*׊c#"tUuF/o{bD/^[۟fa1 өz8xXvK8p"*ݻK.(V=EFϓe.`r#@z4k5{H:G4K6sÂF S)6- q4֒WIxfĎ&cJ9{Ǔ+=r)nJlptQ[m 6 P[RWFN olJp\ДuaJID}lafCX:C-\bfun'*#RҞ'{7v݇N&68zId|5mI٢p4x13 \~qAF$e崲4* |J>np8C/S-{@)yh ۙpD ۑy ͻVv=u}OK_f,/gM+K>\n WC+wL5Oq7j٢N֓C%^:ŁW 3 [<0Lu#BeP!2kF%/??^fP3A_s؇ |<.@s(ߩy*^lr0>EOԟoBx(rD]󛢲3%m;ܵ$`zΥ?g*N! ]i0gO$E"Q?,~gRӷwimF z{mPNNKe`ohu7 mbvI [>.]qxIX+V2>igoQ4*$cb*9f:+XVk ü8GHzkݡMF6ԂhsѶTIGa{Ty#O?^#oK)0/!k4E8%R:+89=⹘ -UN 㔕2'` k֜¾bv=uB'N8" (wJ^Slc\v5y+{0'V)JRYQu֥}7Ud3-M,H"lϧXDnFq;치 ֖riX`aä嚆 50B~fR_py7yR\yء%V4BwFb*j( 5n\F9|@˅eVA Q>$'&"Ӥ=nZc\S$|fY7Vo*CbgSZ!$M ;]z-sji0._{>wFފ<^u}6;+!yk u.iyˈfec0{A7N˫ڀry)iizŨ\sqxR6-sU&r$)_>*<w*~I Oḱ :R5AZM0"yT -sNf1goJʅ;KVJ7CSlLXɟbʫd}P;kl&nl؂,!֭\Z\o/}g;M"ypR`X\@xT|l6Q@Parڝ3/b} um*7Yd2;. "A0bڌ|dXRtlf6C-/PbaՎO03Nj/6fE6fcUIs}萳AB.czL'[IB8t.,363u=qJH,1?šUgN,dE/ iDq#`u}@ѻzWTИm,xa9b2} &4M:lT WR[ZC(C/ndHn p̖Y߶ֶW]|RwL'KD"wO|kky%#ჸ+ (BbZB3`̍V`d6Z4AD!*9tF⦩#Nbm3["v$X'>vb @ RaR( j G{Kk4l .DŽ0'.ul%_Gy|}JZPM#q?"'? uACZ>۹DfӠT$'-QumƐfWH5ڰ>j_Evמ]?[ ϼ>4orF} X+Y(|ɨh &g<= H(>g}+avGk6"K!xM_mKVQ7䓰K [9`AB|K9X}ЮB._FPN05;ziuCfM7E\P2<4ș BgcgaylV ܯny,/k +a& t4!kg䶱^Dj<}7]$IN(98H[ RXpf<lj^ O,0An>gЏos' R8/&ɲR襚O_n}mL]KD87FЂCTcPs,8˙?s 4cQ) jۄ pOap;Jo^ "',D"k@M #X}~t1vFqسﴒuqxuT4/S%r% C@c#A3 !;=~a/RPZmC;OPL%.Dށ6R.Ys_lin.*bvN#O`Tsd::Q $MZM.HRLOWs|]!]ccHчƪY<֎л%W(Ak65RBkEsǘծI>gYZ o TYs(;!K9p^tQM%3x׀P\՜y{&;,'s}m; ޳JtQx<쇲}fWw2Z+J73ܯbH?[zioLV5cE5\$Z e- 5 wV1[e$%\o_YN=p1a+$;V7xϸ0~VT>⫉K JH=_'_\j`0ҹ;sڸ;kUDD?~wJ3oJ36.U$S mGmPN0#53lF|)yo-y'h()rT`&㵠JF~M]ifX;tD8Q-uW*q rC*yyԂ xȷ)/l<|\ ZgX1 m(yD$SݛY m$R +V#.,IRV2(ׁ  ^Sbyb 2qDF6A)wrNKN.P`96FT7?gz6JG9~ vM̘iᅟښD-_na* Q"_Ny*:ØXFߕUq*( ]!8$`_gje:0 zά2Ill7k^WBݾɻP #ZGf~}S˟媐YH1xz#8&ar3O+^vUV*`Z&"+/pj'h"'dcĨdqE WJ>{΋E>7َf>11D48.{L)a!?Hsm+lJVJًSGH4HLd0t׳ZgDΧ~j #+*31:Nן|Nk=QD @$N GO_?a Q ]X֛RmvS\dsW⃔/eRAJ$^s7V.߱Ybr אZ0Co6c*`?$5Ƙ;ʕBK-j{x ?o9qU(8)U" Kk3q`:'W1A5:iŶ.浰[m'O` ))"~h7X}¿9S6Rp,"ļŒ_B$YTkH P(ѓD.W.J`nH ЂeYFQ:/ Akd?3nc89DHqc|@bc] l;I$Pi m@\[vG!'C$(ko*L/ɱ)G-2 o4csV&FMp jcYx S[6Qr~})J pskJtdq7T Y|&qPSgu߬=Yhm2-1Zh~a8cw䄼ġ{j#'訇jV5֌)͆zKS=iUWOP7/SѴL0t|agΔoPyr#Q>N. Ia T^r8}2"k<=ߔqo^ASb~BnYٜV=Jؔ! ?G}-Qr; lq[i M.3xKޛX=<*u 㯸/ ?WjܖA[jAAO?oj)KCB%SA#zj(Ƹ'iqwpsM"$(6٥ݦqے&Rۣ +^wEY`!M\4xWGQL3v^%_8~>~R:~Z$]GY*OЛ E9 W=f~X)@j8:#'đ5^nh kHd8ie&,Qv^o}r!DG[tnobLsԁ''W}~aҁS'ki"{4IhxsG|5}O0IeQK6ҿeF88ear&7P,"҃xO|tKɞڢg 3u~%\SouiK7Kk B=0,]g~{^E%՚vܦpU)qtu.;iof`h1D)̊2fE4B(!܎6 @YXԓ SoHSۄ[ :pX+ޒ-\錎(qifҥ#(߸BPqVJ =]Ωb|E$[7<۾UMOu @Ez_~5"TgY9: CAX&'9xf٢&++7\鞶HԏpO^uޣx,PTzȍeݎMتn הEttl(Tv³@s6pCYg 0wlr݇gM~T|E%|l: 5\&)1ܐ f׬~B]g83]ްH ry~{ _k0}z ^&'q*^sv&J55權[o7J s33qLr]>z/xskv[tlQ|g|Դll ԍqǍ W:7r1od9% ӨqҳDz_Z"djh[K*9h CQ+4R)TĈOT^"ToI/f(zC k VO{W[@ OC6W~i5FTz{2K#vDl{=0]"Y H(D-l`/PԆ%)Nq:$s鸂r8I1Sq`}@\fuF uE Txpis p9[+ІEbQlNcQ)M!έUc3D" Kτ֔Zl$%gDq}$mGZ 9yINBv`O|.g !tJhuwvf?/tMjd~.bH֩$y^:Fp:amXۦ9 s]vwJ| 9/;a' bMMOBw 2i<.#ڈ%q3TR@pVзEd BONAMJ:JĶ=v@EmD_}ȸ9s)zse)Nf Z% Qt[z8֙*"$ HE`.@## t]2|éY҄|#Vc̃d4¼ʲū~qbt;!O>.ՀEA$aCh5eW"?93wص`vKJґԚ19j"J.5*ϵoLCwVDS c8)CB1ϲ +Ѳ+&:S*T2-Hx ɰpA*(Ys`SZ I4ZIؖPoB!)+>ne@Nw/X\%^IC{ת2b_w=0_Glև\8x $bWy̙DmDCy [) 1X:jѻQ-w4 ݟpu@Q!CQsU:K:p+EP7E|8"N0&o&(rfAB\Fmћ\I:w2VRxNȕ$f(@ij &G=#+ $FCMv2T9[ld+1Oʵʸҝpd"5yDÏ!G"s>UVtIU ^"x] ̗mW`u<5.C$YnQ}"y+rr=wvuC i%JFUQcC3AQlb̗Bn~-i- _ W!9y[OZR-ml?̰M ,E&*:Gɜmfi2zGiO^aOAϢ[AaZwM76ς D6+yYy2K*T7 8 E@,m\,§3.ibw!cs!58sx;&ތNGD;W}lxe62e9 _P(ipbu$iGG•h? w ^3%fpT02U#<'+I."*Ⲣ*{47Bgo4 >9!3[` S.Y<;bC<}ʿ$b)+K_Y⏛RM#$܁5yUiCuL8|a5m/n젒1[p#h'ϹwmGHGUNA)5Td9c?0޻=/zOx-Ιe[('Rc/LEc=1w:1,q6dP$W-*JY&^" r( s9^4En*XQ ^uD=>sYH/}@p z;'c?)B u?C;qMz D[e)C4XB9?mH|l*KceܤBnqu;Y/|]po;Vn-g&[~ʟUhC1Vu4=2 f-uVNUiؕ8F'AEa3q??{q y9fBԢ׿+%C @Pk"2ښyhVE gIJўjT6tr)>3e޹OH1/~noHѴ4!;85(pZ\#9vȾ6[ngEP cY"IM m!,ǟ=m^gJsxi)7yfE IY*TUG1XeB}.žJ6p^)(fW`Bȸ (URi. /x"gٴOicj[$('Opcs^5KκgI^ϳ\o ֺT{ċ_k%MI&A]r˾2u7ם7>z&9|; }Ŝ\8Tm pYN &41 WJ2k0ݫP s33;qX8SO4aNj~tXe)ʇ֙E*ˁq(С|K~PCNhQBUt0/U9_VeDڍ$?vNBSL\vw;"{~Ҧ{Ǧ8&@WQ9*ri2 Ky(*pύcG)N=nb^_+)O_13zjR&O-Qnd W0yZB -dh>5=HF }UN}lj%09..3m\6SЊlO@%?%)u4 ׿ɰӐT)֋?WW;'%D,״F(Dr&@/loGPqN}SF1v賩))ewd v^”'C8E#ήH aF\Xh7Xat ]W4d Tg ȓ(cX(ݤ/qI#+go仗&N:JQeRa;Mz!!#O BFAwEC[S"p4-)&JLMgu7MXNi"E3Bq8+l/*lj&Y?.} M؈٠>7:.`\ J ?ӢVn%2^ug$K@V̪ Yj VNm s dP?rG oV][ ^yisDSU\K4MWD\@j"`]$scۋ|la$z],&x%VK7Kej\ *Ӣ]kO‰  44FeWGBǜ&5n| iq{B網}%̌QF@ciٳC㰏ȣQȃ(ItzDHVj+jK'GO=NվZ*f ؙ\O0OY㈰L{ pB.G\Ȏ:'LMD^<8ˠj x遖Ԗ័Nnۉj?%*C3}G<1a _?5ECEliQ%0b~*_{m@Vz #J:&Ub Qh0KQ$']q \b*|5ڨ, -51(A-BDa#+jD7жv(õf$o}FhOC=RDcaB8K3D3vJx]0޲}5-H^#?Q21;iEmg%o_Ӕos2 8#fЉHhwCCI:鿝La~B4w$l)zBbd494h_BF\0o?FC=X oQ1O+qܔ SV ixBLr MSmyyln dر̿e`Na|SΤcGq% }UVQ;s=dA}c(_ě7- Bgc9 Ґ}<տwO-N*^MГ5BͩI6QWOVY Y9gl&jIܕ SkBBUg'zD1X g2_pI)zq#VAFp 0dXIcK^vɪ MNE97Ujqm7BQ[,)4M3,+[m4?/pGcC(%|VyAq-'rtŸ_2av1W#zq]z4EK]Q0z=aAY$J|rD+x > {ثLu+]z[O㖹-)P2v#p^&ph| 佬>Gj/ KZN#a]E-IP_i5Id>W!j|t)䖆qq4/ ջ/)4 4bKM)G=?F2rEܼ>AҒҒ*1c,ԁ3 uI, V ŭnbMAќK1M}5:&XaGRPe@DBe8"m%*]C`ǰz灳w>fu| :{_ۭ؋k>2A{J"ț-[=/*$ഒr×~*E2hYu<}RSU' Y9UR;]0s%ǼcVY]Bm =0U Y-xX\е0ͩWK@S^_[RDy0>7Q(Tg֐;>h"FnPDvs[ȅ2:D=*]nfGwD E,gM05*o"8$P 3{vGB!Evx<p lXTuX}tН"\TINޝgTzG}5GJZwSm`gu "ae,>$j3쎜ZthV0gQ3a6*#%j4>[uafk9ۘj.\(a#Bƌn{nםcd,Y饯q E΢u+,\k}]o,;x<#_,t/Pw1Z!Bv[`hqvqR3e g^qp &tިBŰ7U=F#&\p0\+R˗jxMPid-xN{1|Yf.g.E!@~î+UuMY){&qW㕂qT|[yQXk 0?8fPӗ(K=H!_,[ D@] ~eҶE<`;wPHv"sayѦwaS4v?:{)G1 &}^pɷH82Y u8s+\E_08rVUѓ 7w߆$|΀2&qk%GǔDZYmԸaNLyV#Qi^tm9/a v4H6jgT:DR`Ym|Ճ 3!\-)] Savks!&mP5928@"|vv֬x,=Q)H_JHQT"͜a 9$UKøOšY{*nEqD9̬)R'L&lƜy^`3QF}[&[%xbQ^ ~ΰK@ı pLu˂Y(qiz gu ,yy[KVIXՎ4 ess 5bf\\%+_iֱEލYϧ¡5cQa߼oM2.* 457h8pY2WF MiY3)'m2w/A\$TJT!4gY047(]' q4ѷ˖ `zCxJO\//"IvJD }q(rd)m]&^ *∀}ҕX ty]#Y`VKzG`583Xɓ:2V9ŗHc^V}Ӄ>7=:?ʣn mMeoz|jW9D0Wz3ҿ8Vdd=~ eR|*YH"ׄ N4 @⢂hdXz뵲TIlcM×0 hN2cl 8U:J]SWr^6CP c$5;*>%GwqjGץh=/Y0c~/I4gK.xw `88Sqs824LŻLmE4:=!Ə<ۭ8,oh4n] _v`uL 0VԲTɓ>’L>D.۬Ý'da[$88̋oiuETuҏRu5FSϝ&)Zo/JnsIp\zBFaz{=ZCS?BOnxV-?OĪ>o5Z(OVtߓՔZՕNg=83pݭ?. Huq֦?ʚ[wzlp[_S] Q vϊ|_X8橂!QAGsD*{TԲ@iSjƪ CP ^ʓ!lDS})UHC(hCSWuWƛqWz,Fu±a$s=d{zj fO;Ba޳a{Y+Bޛ?EWX cB"]l#,\[ƐO:@^|>!&Ica_=3֮ 7w =L˽.EL=Eh:g;/`#?˝n (lIq:KdӌT"\isDڱٜ&ſ$q!t=9p)]67 endstream endobj 89 0 obj << /Type /FontDescriptor /FontName /KQFQXT+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/eight/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/seven/six/slash/t/three/two/u/v/w/x/y/zero) /FontFile 88 0 R >> endobj 90 0 obj << /Length1 1619 /Length2 9017 /Length3 0 /Length 10062 /Filter /FlateDecode >> stream xڍTT6L!!5H7HIwt33twt4 R )*t /5>;s}>kh(UԙE͡ )(ę(dcdachmA4o@N`(_ 'S"ss_9 :%L\@ErЈC=VO 30Nځf&iE3[: rk+gg{~VV777;'= lT9]A_J&v?hV`?P g7G` 6A2\ G@uY=GL?kdga_D`d33  ZmA@e)gwg& W)lkb{&@)QUɓ?99흝X$y$\jg8;~O2{*'kA`/. HVϐ'% 9AfV5^vف`3g) dYc{=v ۯ/2Bl= }򲒒('&uz1sr9ـ|\@.>YV{cPb!vp+zWP>2HOq=?ݐo7omb3੓]B4 1Ɋ szeMCbiwNR`w m 2il=A+8^Ojr@V)$hu:W<@V_߈*z)x9#'?j7_/d|Z rY@'fȿ3_)__in*ht_c ; 85 n%qcJgZtpDN \wMԃ-Iw!DCrXkj۝Qn`3Dh}?*)ȞO76`?ѼspTǻvv/[ Uݫ~%v_6P2Cg=Kə ;4n#\<#0KwͬjS15.K/)r^Q-,#? # rt^/A#{W>H(=PBtݻ[TIIpXu/?z_ϺMdM1F:>D}昊S⮾P2_?±QLGs]eZ8Yz)6J:O'jf^qi{1n]9) ŭ7E2pT;If?)5j7S|,mep 1/*z_ ]֚ݿ ze5վH&b1:Gw¯U?eYCW5 z[:~0iR kX š3%UyM_6w_Lڥxki2v"w;ilz?z=F0xՒ`2}Iө/*N_,k۳%cӓλ|-D,>(A03Ltz8504Բ[>C4Xگ,w:MDF z7_=@Y)=t5y%, wW9 ;`@:ێAT. n2%Ja&'aQNDٳk(x^ɪIvXnqҘ~_ W]Hyɺ^yU-a*[3qOr g2jɍr"IWOqx\m^EUEI |26Bl9˙4'c-B*l'}>a!lo D|"( b@aL_8M[zo%hh m;Szό[ 1"30M\Ҷ.3)±8"YfRvkXIp oYUUM=Ӗ,%,OK~s`vi2At)[= 3ow h@dX"r̬Ig".!;@R#[wEA;ː?&?"^V,ylEc6$ugw9 Q"S^sRBCVkmkPz8$+j#XUX=U*-y痋ޚkQ cG ߻T:sjmFNjk?P cuGw~U l 26teQh}-`$/SeQsh~dy8[02HEK_>s ~|"^'.RZ2|B.RC s b1b6 E]Ӆz?wBm!u7pE1<[HAo V" )noK2lFY.Ov%JVD'9NWyFvQl^\[Jͽk3s`nyL֧/`߀yCq݅.7Gy",shzG7_-lKbνl]j*t.|\eQ.s\>h AfKeW}^dL*dʳ,1S5xnreiz^DVI|;F`8l)!MP^%uQRжaN}fЭ=K' VUkƃ' cT5 w:ZMo͚۰#U97V[Ea*3nT03r\|V661+=V+k\eajL(^cujmG-gV^J궮| gKl0Z+Xj-1X3QWAFs[B?/ᾪܹ( d h6xYO&طb|K|XI&#UnR&4{GoD.D])WG{Jḧ́Ɍf]1n4<ǴÛ AϚBZl*5Dt(qIح GoۚW*g3+&7[p*!H|}{Es} M vA_kJ=n`'E UHʃJމW{s`hV@ucR\x{ Ro襎RrD#ki>ٌ}z~7$, EAo6,?(w#6T\M _WDD9Tϥ5+y?Il9SURxR8,+kmRR]D lyA6ɷP?؅D]H _Aio$mτ:k^{GQ48|lwXedz2"1-ǃbom qF`QW|I0L$H7>}nRSOVJ\?͛wMTGjd +K "ۙ$V_MF!ܭAX,\߄l]#\)tI\Æ/z$YT_/x4\-LJ#ͶK"K#1TZXgW$~`eS|vP!'ovtL p6h>/#\  mx }@FE#,lkqI:e$v;73}}˽\= kt,Uc#4Oȣ@ ôk&HTv!^'ݏO!fK9 &DWѬꞬ;n1e:0驾[V1/$}|S%7)pQuCA$뗍f$dN.t+ElI!!\\1˳2nR7+i(NV;$4 ʪq(j:hiː RK$.}$E-oQ(pߏ >o}a8xޥf&[lDk$R; IL!1Л L^EvBFZ>=~ާح_X#ާQ?`ydLi34ql*4L!]xIzQO#iZOd; 캳yPeiUдOnM*4VБKE-V25"N亞]h+O+bc )Ǒ ?[8c vZ=}rcvNf?hp5%/3HɌm'1_@9q^ﳍO n)Re-7eTtr1">{)tZ<(B]#ΰ# Ar햎+8#31=v)ԩ0'Qu |2obNom({ߏ1d$uc4 l6,u$1O߹,D (ǵ>G(_EI\Fd7$\D=Z4 9?( mpH:@W,+Q=3Ϩ2ȜnDﵶ8 Zӡ(e?V7g&1_NGdO ! tϻ#|΄XCI_D [QԮcF"$pnX753Zv^[W?,oo򵺛 +sKK]` 8wCKҷDۑR _Dtt] #]էe-ʗA&z%a=cMCoNg@.hrc C@é@`޲i <*l b,jD4Dc OFBP>ZL$qd|Pf+Wc1D7򅄩U Vj T)2g=[+Kحu^mIc|CM "$T,(&Yf%򾳕Ӥd۟'(8 .@tjU%B5⩂/Z;`j;;ax;8fzH"te7Oc }fPbA)#r$7qL#E'WCKލ˅$3 IxB9ZhHpO!#\ayyUs.cG&*W7ӡdJӀ=sV@k_M})HZ%-G4KPTdCy>t 䊥[Jd=}BZQv%ZTAҐLk5RaFUgձ2Oiоw 8N6s޵\\}oQ&Z.V kU8HFbqolȼ;),Y /*&GEwPF^P(\ґdkBIGNIY46;TKk619e*ƴƘ5"|1?:Mp]Ϸύj3"zb"p@# X] nW?)dK X$ȎL`Ĉ,W[#^:f < ` ⰡstnarRH=8@}J#A9d 置fq<; oC+BZ/W"%!>Mz{Y$ee@fL/?] ][,qfz O(#oY)j^$_i/*t-1FH2z6 ~7>^Ҭ4DQәAYF7]Ֆg>Ҷ:C[.th )qT K;s{(01}7ܡ CL^E+ zL#:Q .!=&ȹ!qR{Xsuv.fKPVMЬӭ+ s?&ZԩB\ QM.W [|=_*rÚ@`^v4U% |  R^dk^zS*@XcϘ%[ʙwlZcQc[MAqYW6*b_8nIuzVH31htFudnO[,G0x\vUx1#GZ"gy~QnHo=ZBN+yGsdu Uv,ٷvo_Z#EN ay$18rQǕ }|p/u]b+hh2}G`|$7+0n 4 DwUtzI۩_l#GVf/=u@RHM}D4TXs ltrD些QWC_>䞿f3JlvKȍ!9WQ>G6N%ck=m2u1 Kpw]oA#VVTb2@ݱxٶֺh(nA#pPre ZVo[7FIE+Sr۪LF* D  :{lot(w:C% iU &kx ^9g~ P9D TeI&ϠR:9Mw:= * qڽ*&eݾanLn֩Wx [i W'y`s몾7pnF4Fb|4XBf w6˦ߒ/l|?bS$\inv#hSL(Mst^;<Z#L}`{^qԜ EP|2KRhQ֌ᆎsKTIG$/;;RΛ5gV?N}9]qR~?x4w` 8=D W+y,vip0'vƅ;)G2p1&a@9N=-7O!~K?xpBp,ʊ5HQZ_ `6_N{;&4gyjHbq "CԺgqtSf;z9Y{U 4t}PFk1f4`^%k j\ed&kT?D=Ka; *cOŅϣ*=<m*P[N85'> endobj 92 0 obj << /Length1 1395 /Length2 6090 /Length3 0 /Length 7032 /Filter /FlateDecode >> stream xڍVT컧$F42 tl1r4J  Ҋ( RJJ()W{νgl}~{TT D1PDK~~3FQrͮCx:w3@>@"-`_hPpu(7_ AbU:`@p A( G+ @S4 ++)Abhu_\! L 4sEx6E;c8@(o| kMu s^G`,a_<῍_j|8O'p8o/qo 0,@ɎWÝ wxA_Oxn9Q.HJK\7Mh NT\(*.B @!YZ#(dA9@_0|"wC4p?Ka/C7?meV(b,~# @%6;!|iB񛡂rޚ s@( ~`?&8~]RC;9q)i KR@Np߼Ph,> tFc)) _2-/o"Kp?@nu{ua (E(n sLC&";bsAiIC`_y ,1Ÿ$>dd 09vJu7JЙWpwV]|R/(+g"DR+P-W9C+ӧ2j]^ ʮ={sڗ[q[k-jۘZuH3yC(q_ *=&ŨH]xJ"kWQsDdg6®AbF8ݵlZ' "k")+Jaޟ𤠔-bRsRs3rS$wĥ9l&X?K=0eLPJ! }I]vA$o%|؎ >l2EkO>bw8̈r)dR'=m{|C[VMF |[H>IP{tϩ|ԝ&%2T٬M|$rJ;F s!-dXFu9NׂGCg]\h[-j2v}ÿ{CyL6kiW骹rtIh Y&0{6# ҷvifB5^L0wXYu\'cӠzH%%MuRFP'~fz'>t|Dn797]b4I:֙#@_㌠ԛ4B(zYs:I!l~W ]˹iYBuSqEiuԽ~v_S&&}SF$ED #ߌ6+Lb62ի^O*8ɫEJ56|2 $o*3#Ƅ8aC㳚nš yu=:'gj<ޞ<NXAtڭrHr8ž^_x9ӵ-yQ$7IT. >6 dWʞ?O}V mA=xAʧ<E7hWtuƸ5Ӭ4tHex|"\dn:EZ9~NܦΩSX>`">6E9#aIr<ŏ;4Zm {d_= Fx@NCx޵)msFi4ANvbkmۘؗi_*h%ku+alJi :Y?uf cT`39y}YW_?|W: U͸$,T ʮ?,pjUDOXt=0]P"a8":#Ȱ殪MyHF^0\?ד)~Hkr5$U>YH'i:2 ::7J_Q*y 윪G"M 1, $[܊cV5wfeF X#z=Ghls}Ix ĕC3^ԙ?KŽgj6oSچ'8wV9R1&sjk#dY) ? 8[t1s 7dc*DM]%?]rkJ:U+V& =mwЉNwEyZ)&/8m.®d4.q(zn^WY)5Jt'\ZxV{y#[E\MHiM;I }žO$䧗F~?a&}d^2^0'<휘hlN~-Ez xOHb,9}'[/Cvs^\ /jBl0V6c v,mFN:`r9 ^gC-86XNI3=k*bWEa2+=25k{L~\hbQ7zW(6>z~L )@y.qO"? cż[}6hހ`y.&2%ћ7jNJ[iӥ&iNu폥dܪQ֜!Fɯi4-Y KTi>0NcqDUϊۘȃ͸W&J_?k{]Vty2zfv !>mF9z}7w%ikU_DhEHI~a7<ӞJ@] *g$c'Ad籨k|YՔ+L6mî- {&ϗ>3-$j AfQafQ ݋Z xtHpgg~AIRvM;;-Syq߶ G눱SVmw3 uj#}Z5gm>5kWpdյUUj{@ pL׊Oc62hT ۵۷Biwt]iiOF+ uXhl$lai7%1؅Gy) ) WI|\@2EIp>d^j\Ml+8\^, 5_Ϳ5tPO! ιh37<#D}is§@O ϖEBfi FM2qpw'{ep\#pZ`G@T"0+'c3 Mɔ(g藥XvTr9 ا$Y-% f~Ga?@CT a(p).qGq%4#[ 3kE6aWكTӄ|WPr=EJp ~ZV XKAֆM=?ׯQhUJi49~RrH Ƙq٧ d8QR%=3=rU@Yֳy#IT:|Յ]تS0nv3!5nMN:[- eǠ{JsTi+.cRH"۬lFE}gZS}ĻSm)7QzsBL 0Y۬ngwX`mnjӍt`XnYWyRW+nXpIj9K 1fr.sT#ȪSJ$ (ie ǖDG69K*YYm_lF-ENCZPuj&ltW[@&uVXZ/c#"*¸|#8r {ւmߒE7;,oTw;㨊rQW^YPT?@4'AfTW>bΎxcUv\pmehTH<>ْdk#fVC =gqI[?֦ѝvcw%rm.RAF"Y;Yo $:A󰯒Sz/C)$Uٕ j7n{7zg+ؑO1EO2I2s?/Pzʷv-i)0M C)L7nZ]e2e =՗W_}C,n%(& 6Լ7-;LHCTA>gdg&%ed?xnB`w%tZ3u?%0LS=ɷ٘~7FsGQ v{ wmUh:n00& Ln_љyAPuٗBtjp:V$,e3V,mWH]6>{goϹ$5BVFw"-HT]W;-!w?x.}Yl&{}=Z K.9҉\B {>gkrQv6̛wrp鮉d`-}\\d4JJśv3ѱ?&pxK3ܚ$x o>[j^ F)pw ;~Y !;\w_%. HHF3zT)LE&Qvq-.a@Gͭdm$%:2O;__*m'?oCamޢ#gy߄1LŹ e.SP \<\s-34Zu:>cra6S +/l5zX8@ _å|6Y$"AL*yoRZv} n-Q`~mԓҗT*!4_iA.^ʜ ڰ[o j}I\TĮʾ UdBǑv/{"G 'ϧ}ynxFeb| ^k)Whu([/&\ޛ"hvp6&UpEܹ!~|l֔m3BwX0RTѷ'vY1x䷋F@LRb޺P,ұh CDF&||Cg;_ #a endstream endobj 93 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 92 0 R >> endobj 94 0 obj << /Length1 1395 /Length2 6093 /Length3 0 /Length 7039 /Filter /FlateDecode >> stream xڍtTm.]%Ȁ9H#) 00--J#tJK(~uΚw׾Xt 6`e8 (h BPPZ"6c0 $]:E ݡ#PT(&)((< v-~:F)]GG-(!!; F@lA0vAWAp[Q(WIOOO~ px `$ 'b:B (O @+[0 pفtm&@ YO^_WIWD`-(ɏB@0_ (y P w :-B#!_~A_NDS [=VgUqs)VGFD$e(++ݿ+`؃DHB}آ6`?j2zLM< @[vp?+k?&yy(OHD &j0{8@O_k] G Em78+ݏ;XA._v4QЂ߮O.V5r0?A*Cv{P GB~=3>лf~JI6ѫJ0[ݯ7zhI D/708 @D),@?Vet'Bz~MDp[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\pIc!@ڻ˛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`#uAAUc?mͰ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$J- endstream endobj 95 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 94 0 R >> endobj 96 0 obj << /Length1 2421 /Length2 15243 /Length3 0 /Length 16657 /Filter /FlateDecode >> stream xڍeT\S;\. vr~QcT\{._kCA bh ttpc`ad)ɫ0Y((ԭ쀿O(4.֎p\&n2qw@`eef23 76(0dpbN.֖Vn@mF`[ bt63q(Y=ͬnc͉ӓޕRifP]<怿(Mneϑ .6:+;]j2%'?dheoe33G{'okK$)F0q0hboabmgbN;x =djbjmWLy/=ĭ]ffŶ_;1i8X;ezY:^fVL9Qv}=_'G'{*@k  ` vm] O@}Y}g>gv޿7IND[DDߤ=u22X,\NNMoà#,L<3zPt|k 3s0ޅUV/+?$ng7?vw{_UqT-?4v2n&"`> <]%nfVj``oS={@3KiJ89o8Qc9)01:83X8ZN_I70F<&3I70FV~w+"w=߈~#vooO7z/yG&"w{́YQzwmbbZ!qW-Wy/λWO n~;}+ܬ\=7O?cu}{y>@Eb^[;4[Yr4 x"p0ϩqNg֧c[^pǝ#QeQ5 S%i^.qftxG*Y]՝hƋK /Muʹx&Y:儻@{KoKFȃ' p`GRJ%'Yd <hx2l`-ýKK1vh:46~*"}\抧)#Uhd-E4V "R##$9tDu?/U^C_;ChKH""!* DyNc91oEe=ʹ*ļfpM8W.ԯ΋zGc(7 7w@jf+#=8 h1/0R1/ع˓gtue#1^pUDޕ~`@;Dwg dsKHw2 {aLեRR1S`EN/Pd]P:C݆e"GDd۠c8OiU ׂOL~=Qײo=Cw7:8t ӠTkG,Hbg:и(-NzB@133%f}AQɧd+_%щ|k,kb]as *])3Ղ/7ٜ(vvd 5VrFƺe0[tOX MΛo|sxFDoCO{N/lt$ZJMeqtzv={Zxuh 5%\tRv> r  js͑ rQ.ъJH&Eqfp2ك$W\ٖ @roĵn <-aa.= ى> v,izU{uaNz{fnf69C*; SFZE e3hӌDz=/*e -V_>nXJՄpG8MWCQm,v< ΆhPۓ>bi/;t9^zT} ]n~9uD&x+fvz#H2?gH>P96%PQL՝zeyޯgPɐ0;~lVEU>L"e.P;6@1OT7 a-02jֈ^'J**\œ|rx^VȬXg6O5#:qCfD-8+jp,dy(QlI5O!S$ա{G&-H^|wcƵ_^Hp"|rfsE(y :fY^=Qg8bv^L8O] \-7_/D3.5wALR_uz,5?k\.*EL7#ʏ*bHOedI<+.fΜ}G)pbZa*<G(jZ+ &__1^|5zD)dzwɶgxcYpR*Y( .̪]u&ֆ/g Gkjn] {b HG/ aT)2?;`qױI]Q9(ozp5ȱ)EҮ3Is)YUHLNN=Ҁ1l̍5a>$\n.Kl t&XX9_?4qlJvf/Q7 [.J]Fe*E|- :cBaJiS=0nL[>?\=Ha t<9BV|M6iwp]m5aXJP#@ɼ1v fBL?ÌlHdt=ĉ& ^'toCyP,oP)xR!4!|Uu|==GCVb*A/)}OHC(h2]\@cĪ 5%yB0Yd=jfp oxFL,\6cnknF^2)#AAj7\u'Bc2{2[gtkfp9InqQ/`֓,ԒcXv9= B.O?b->_{ !s}|'Nʪ >MLMjZ] ¶"Cu߱Dhj,rR?%U E+%hrڜx.7's?>Ԑԁ 괔`YM_A#*~ŃlX]N6p6J>JJ8M* ?cE4tYاɼb0uDsroˁYv F~d<(/4^tb1Q{RMSdX}V6`! %b5/?6xqְ.Wh7EI7͎m֫G\l:+9u~4$ :?U&l[LbrnlL/]=2V2賚\yflӰA'2<6qaz-%B,.z3$m)3ju\^#? ! y̍c/|{+? ayTdz4J?n4j;h஺ E߁SoWH|@Wk<.u>POkmU9:wfӱM NS ;^>M2 7BeIL7%R^M&QH:` >x7 .W\ EC4L}HoN% ׮1_}˅$1:\#d:|{0{;̊J8gj.c@./Į7ZxEpIUAdFo8B3ėg敤&25 "yZ> "F7wJ{,y>D, р6ʑ;CBfF86بZV]rv gE?{̣fcZ=b z̗!B ge*XW y" _ ԰I{t^":ywӍ s`J?eKi'$2`Ew(2A+/KXy wm+IEâ3".)nI}TVT.`/%S:/[L߸m6Q0/|Ҵ_K9c?ﲿrg,m67:Fخ0+b1tNZԎ)H_R0]zK7})b< k*''QCA G/K&ϛi L[@ a83fLpk$6.}MkGӹbk,2IKi ×ٹKPzS|IJǫu$uZikE`=WGpX7ou;w|oI傶x*hW|"_lAIfr|kq@AƖ'! 3H$lDId8*&{'_yNvDb{LlԄUZn:HIaN3fYU;kZi\>R2uSI+pK#ߣ5SH<>:bH|9eIJK'~'nX-~֕Q|7.x!y=vw|,Б,_GMk 5S5h,"ŭUt?|N[7Msaۊ_`/'2 <2%c|_f/c`ky'WDhcM%kzWBi'i3wF~_\Ea81+o1vY}R R4h' ͘1򌌃)HԨs[ӸVvUsvZ2A*\EAޱ@4QO@*EـziƞDBon"OQJr߶R]'A^ 9X酊:NU0dHmdHc[O͈$vԂz̡`u)y:cZBg|^"wR[J$i/J+z8ס'MX_b?VgĿh \'P\yv:I4ta#j#Sw* y|;h~(BLi gUa)& :3˾-֯f>2FrA6[^5{n!tWzC[lT@ע2S+vtdґ"sfCV5ǥA0nےtcg4,6I䵲2?}V͔ި`ZLbw5e-^yNҋw@RBAɽ/SK_El= Sjt@<w04^|yn>fY)'lbɎDID.X- ^_}7Wگo5I ~r\$bsEhc~7|#k(5D~hG5R0,s^#b >~t_}#cq *q(2a:kI'h݄ͻCOrLB]+pllL'B`ſ;s$XC}G_"82Z#P'$LqkbAQĩ ÜcVYbB]F&w)|c=hmHv0PnBSҷr)6 2ЬG#zAx|x6o.u/ɮDnxTϓK֋?A@ y洯i9o]@l#d(J3\6,6 g & YЬ ѢhLsT8w+E%i'.tJ 45$^6 O=mUCx,RwYӷ2bwj{qT$ӝGn3W1TĨ;ݺ6cY9hA|CTd`s\W}ZDn PxB/5+yTb.HCTB&EV;ﯫ5‘Nh 3rY2\e̤NwqĄ3lN# < 6Z#&QME5Sy$Gv6v/c^:>l.;1B&n{+go/WKth c akP<51{i= zƛG+CxJK!y <ҴQ #hT[xD(f鑮j[Т1~,zmEHv}?+[>'U բͱRr `abSlu[ #BT&~i;.H,w^f'6XRf$՟r] Ueu[V8 j_ ;^7:>>x,$zeoOÏ  *#V @JZwg~jt;{Q[師^>꿸U0 u" Zh?+>#7{]`@ae\dJQt=F*~0pdQ&Gc2 tHO"|cJ>X 1;XXZ_1 MfK=ĉ(e.514 $,&mmtOV}wYAo5/Ml.= ֱm"eW>()k2ؐ1Se-!<_SVPbm6 v^]|*HBkjS1>lI4Ol}+wBEmS9-K"tdt\n[{Dԛ>3Ti ]XxО۞<6t5BB~A jX.wW ,2@cF7O q9r٭b|nS׸<>mfvܳo#zXҿi}l"zY\AozLkl \]ttnyvhϛZJ//1 GO p}nABll0p3%yd%:S@k+zL[%/ʶ9Ћx[UqV IWjlgϬPe~͠[2j"Chh`LdGqm(dK.[0=|8F'p@ed#wv|J4z.{vd}va: ;G ]^Sm!_Ǽ:kp>iyqU1zm @@ޒ`b'  hA͝$VOTW/E+y x8*jwe<>MDơVa7T aOɯk5ޏǦ`cAwp=#ŠɃ G`!codXT~̥*6PNYNd[cܧ .ʲcⴄꭊǎQ/OQӢvX:oV_:Ŕr^և`Cs p~g0l%=0?BJĶablq JU34fwbN^U,!s]+ʍrbS)h|ݗ{*.{g SaiFԾ#;ujD! V@/Wm|c3m$w+c=|\Gk.w?N>'"?hMҽW13c7sw]Ёzkqvs!Τ4V>OҺ8mx~gj6ɬi&^>+SsPY?mb ˌ 5Q{bU7M" VӰst'[O{p%4ɺl>wGRg6GBB';JHcqR?~:[+QXAim{beKkD\e^Tk0YzMU2P3(~^U 7a;ǎ5-O]H!RޫCY1Vnta%kQ.pb| X%6VM\9p@S:o,CuN~8Ao!/dp/~GSNE[Ώ}CZY.:u^_P/}>Qь\+|0$*k!];]sL:PY`V@}ei(>nLϐmt le^8-LXQ GK䗶NhgKu\3X6)XmV7ǻ;;`% Rh~@$aG)*'S-"~-8X`#D7>ǃT&I턖.ަ2xN(YbQSAEDUs G% )JA}`>=kEei*ιj>TTѪo_AE/$VF]6w]Ve02P N9I[Kbx-3>5\=w td^A+XAٚ? 5_sa0ttKlZܑW@'x=>֡fZELl=bhm+w5 uy{[lǫo%t|꡶r$>K|.;)Nh@'xm/c陗 (2+c=יl*:64WMu jGtQ9?m6N()zj`G5 TRJ}Dhjڎn͹-57\BLRd.Yof6= *ˠ$54mgrk.?b jx"&Ƒ(?I"倶0L/K=#Z2 d+ M3~ͮJ{pBvmL F(v:C%M <wj8!q{( }fU>,FlBp~{ $ll *xP*QOQ<lSi@nE 0cP*Da^^8[i #Өr=vZRC''ŜtYKY}> 47*DKbEcΘi#s]h6'"9K{SbiRFYP@|` !E^7+Mrktxv ۯG5 3hU{ AkQzR#,?DyxBGxT/9&W:\enjٛ)Nڍ3S[=uYijAZ2zbݑS>_WCac*HAnT}NضfpR;.A.f:ua!z/!XP+f; al7TςNK?L7U'HwZLȍc RHýk]H"5Ԉ z@M5h Q}gs`Fĩ~x 1 ꀍ> k0ovS:r4 pBw'Ey8P777$>>l<=H"+QncH8ѦQLU*L&&J̜NR :ڍ"P8WY6B(G4IEqQW:z#{"9k@F)bbƉ1BDlpÛ.b.C՜Lz_62ekh`^KT /晸N.Ϭ$J^;Q(}(mI]%vxEdBOJ-;ŮNIu3Zb-ʶ J)|B3^ڣ~ Y )G|2 fMv9qMedFݢֈyL6䂾 v5n>q*}+;0!J-M,X{6ȠQ4N(WRt뭍ao?iW5dMO^Y# {楯s^b.0By@urcC=[?R;XкMv33mr+RsLr{*|6lq>? di'йG&{_(B]SPԸԔ$n E3[3Nʳ/Pi<Gm_Vof>ϚܦSyac|)P*Ԋ{f=*k bKG}#u(s*"31j&NNNTf њ xqyVy)9x`_Yf\ TT 1NxzPmзn}4u\*vت.M+3X4 tasnzNggg6UQt9V#7;N@׆@cA01D"mSG9Pyk,"nOMbniԯoR ._N}Io=g?aGR7b-W|%B\$,՝^4='Q)p*7J&[o :0pZPEhub 7ꙄE&^T. wr-|Pn7o@7Kԥ{A&)L!3%0c|Uh5֭{/?vRaɱV;^j+'`SěP.:E6̄VQ؞Z(.4igfp)}pIxİ&&[TZ1q>_)vq:" ):MY>PuZwiXƩ`]?.f3U"^lW3`&IFaԶ\5qkUyocYI5zɹ]Ri2,NHMxSn8'X'(ɿg&̗TóB͌ZɯZl %t J endstream endobj 97 0 obj << /Type /FontDescriptor /FontName /KAXAAF+CMSLTT10 /Flags 4 /FontBBox [-20 -233 617 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle -9 /StemV 69 /XHeight 431 /CharSet (/A/C/D/E/F/L/M/N/P/R/S/T/U/V/W/a/asciitilde/b/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/e/equal/exclam/f/five/four/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 96 0 R >> endobj 98 0 obj << /Length1 1429 /Length2 6266 /Length3 0 /Length 7235 /Filter /FlateDecode >> stream xڍuT6 MZEJBH'*MJ$.H^A@"E)A@]FuZ73̼;|d7Pt@ԐX$ T1 $Li ǸpރyH =aP ֧`:HP ť P@@A&Cp*#Q~p'g ߏ@{^ XJJw:P ":P34Bau`PBB>>>Pw I8 ah72PCMh G0B:b|0 !/4hP0_`? UOBpd=EN@G -_@͇zCnP;,ѡ@5E ?'A n8 *fU2I~O ޻П">-G8 / `]$90@1$),yaB`_n,tҀa4xz3O :1@;AX7/;O/דVaH߿G, 10V3JJH_`8P@X A"@ 10uuՇ#( M2x /tX=À<}?/U_'Rrs ġp7?0Ab7PS_ s{wbwDչXT$V{翴0=> f@î+݂ƎwݬUE#~8 #au&,& cw[@!AMb9$ Pa0t.oy`-I'2.M'U >+¢]1Ħ˪kʲ"Smc[%?]hA_dJN68-?;Bk{ jZ؊ hw~9;Kﱷ2.yn[ o >趤^xbvskѱzT&^aŮeLMra|{qps$æ;t[CDAԇ>AːP䝸'{)'a3PŁJ1ԡ,x䔚/z$Bu iD3afv"z?Op]c!w_&}KnS5SsRd[?T/ ElC RDߌ'{8JѦ|O^Kiy$؆aRCYbV(N]@vL ,ZVXbFi?5)9w׀*EΰP˼,7*С0gh s/GwP8 u'ݴbe==@+Y6w:l*_7yMZ2eV)OnG8Z}*lRf%6ղ+H00/ w[0ۦV` 34!D7m c4ŽT:}i։dEʊ(5BL(?AޣnU_+ka۞QW8 q'dh~cWOtͱF-y+I*쟣C{P]4_b锘V\cD=M.H0F,0,vN%(PK;܇'dkU+6%:,K_k$*q.3ŠZQa5,; }>g.MSQe*JZm9V~ϘWH>ťTA&.OQ$i\UKx绎u}rTJaKZDPRR|җ:d pUp^D ]?J9e夣+S7Md'r~\ J,Nx'œ A. R7:t'x'*ɫϒɇUKx!hOxzh,)Is`T{3#+h2>cA{YW ݆4$lRyJe^oҜgBWNI-9wr}odn1@WۄL`qKIF\XiTV̭*ދX`LYMm](ʈ Ht`>vJ .l'im{A$ei3ou |z-VeV]Ṁ9duB{'=WdfIAu77dK'@EhȲ3C;ZQt8tg Lԃ W8 .ZojNyuي}:O]'"NUd _Fn]eޞ4{WT>̞ϔ;@dga*0V.KMsC3*uK➵0"%?kG NGZf 8I+'OP2.*i2!%!u2 {=9⧷bb$'qBwh<9E %*gnޏ4>5Lb{}9TgBb0FδG5;&( ^׶2|DukNh`q. =f )w~#MT]4w[mpQ PElkQ\AK)χ#/s)(`.5]!?`Giaf_IUu OZ{rГ02b%\\)ۗڛ*87.ո c}L4pňbawe3+oVq?M#lK/ߣr9aղcg× 3VraD몶iK!EۦVO\.l1JJ!ӟ;Ԏue)f5^i)n^`V?ׄ`2@HZ6G =9Qi͜LT {Z m `'}[x?(H9aR$ $XydN::&}8H_n|*9d7ςܝsⰰ{~j" G*8l\a!ar1]DM?hGZ]}<<($&edmC83c}4$ѣnEε^ oTmkQ/5ü#_-[rG8ZD.6'Oy6F~v;q9}lM̼wV=LJ?oxͧnӸCZ7ϋrcZcBKp'NGc2|_].O셮r hT YTৎf^k6͒oΆ1F67h8Keosy}S,!|dpc&}/(CtqΖCBpax/#܂x?4Z*Dwmxŝя̀.8gb"Eߑfoh^'E]+Ev/.յq:Ŧ=Cs:# ηfh/c,?hb<q&k <Ҍ\g$zu.Wճ/JQ",`.%:^!RЛwzM?pg ^(F?tPuvLn ^AfI;8Fڹ)FQp(dokӬnNAH^M\S8 ،NN`%8e;qvYj5brSyf n%~Pk'8"׼88x:AjQ\ LS(83~\nO_S 疛L^xtOGN+;/%JvLZ5)K wL[)ue|ےSh{|sScrJE}A6EyVpsZ%b'eJ hS=3opg9یj>\m.<W|8-QlR|Oh8Kab`}nF$*ZL88d~cێ,^3P}*<-c߃mA$z`2 3xRZ\"[`t}љfk?_[6> 췡uF:ѓK*[qGE>NIC$ص$bz˸Ǜil[5{ .ӦW`klq;7Cuh_*i% qQ2N`2I*48y\nhYVB0]t3&b#Wï%SaV|+:fiuE B7Gxk? >T!- `Pkǎ^"cnVHҁ'NSrH 3YK/3 wA9ٔ¿2]1j6H˜+M_N.gd8_|j\ϗDɽL3Ni&EOEb#t&GZ*rz% vxsGTEWq9fEܚڠ&sHYHM/tLonIR$}Qp\P0l)i$"E:9dλ򥋡MB´dfY,ĿX>tj }3 ok鼺7p46G}g ENǻ棶Z)(Xº4It-HH2p3C 3vqrc $"ӵx)kgos7 '?x^.1PscVyk;8 paQAEt_('Wl?(߽nk9'*_Qu@=Tt/9k@K!|eh2*WIJ'9~HN;ǮwW7$鞨x&Ҟ]ޛC3ѻa\&`7gZ3 '/ٟV/pzt7ثXirCMI76F0W:x4X{ٰ\auSėm&">aۃY7?M;+%~Ze7&zwбשw5;I/prSSagX YB lUˬQƘ.'ںMƫlx, vjg|=UΉֺq 0v[Zx2h/LZdHoM7ev%,Vs>ku˝|}us6|^Oƣ3*9JmKCXM|2AzCΛ\Bx/zm.%$ E!qM?ecӈt $[N7]9ER_&&kXAK k_@&/]3JImr鳣YS[EU,EJl8=ZmL =1)R^crۋ l)aP9"䶟lw)C4\@UtxH&AtNIW&|iOxBf(I]>ki`³sb";i>Dn^l "lSHʍӲRʠ+<{^]=>8@v-v7:wVgq+rDKyӵIQoSK ZORG$:3c4-Ne-zH/9MV~mԍJlxBC{Fe/hQ_<"^VD6Iπը^O"i#o_&!O ] l6D z xtB 4p +I4wyq 7UP yk߈cB7%CF-݈b#MKHpZd&F7> endobj 100 0 obj << /Length1 1522 /Length2 8527 /Length3 0 /Length 9534 /Filter /FlateDecode >> stream xڍT6L#% K4Ht,+,! !ݭH H#HtH9{gk暙gaf喵YA`Nn>8@^COx@~lff=( 9!6➨s9||"@ @Pk@qf9{v:>11YG 94@;}E0 C!`C yy=<va` b u'b? 0ޏYÜn1}Y?%픓y|!0YVmϳ+ KsҰ[Av??o |+;oeHᷟr:xɸf7fh?Yb us_ t!N_$U ֆ"v'6gw:Aa_7?S\ߨVTtì0/$Qk8!{u~WKEL=#?H :+ /ׂ/xv @ 04 ,:{Yji>sK|dʬelr'"ۉ6fAr:!IAFsI)VXiI?ռ~qڕMChqsp1;HD܂R*G2 2J{[gWDl9/w7|ڍD446DjF* ίKW|+ID&V~k28’)m/+F MCIy3uqRNZI8I ;wo t%Ι6dt o.fצQO )!]ԸƏx< 3ʑN8!|cdx8VFЧf89<-1@0r࡛QKWJFF6G7ѵYv?#Vo9hQ{ZF2_|)DwTWd7چ㢌DqN8iY]fߟt0BeRHة#x\"/)mW}KB(nXz-7:Mt wvrqg y(yU4 { oa^n@Lٚ{86AQFM}g;BJN[Z0'!+Z0@{=-aFntZؙctŪ9)8|M2p+ϒxtz=(-tf ZL̈ilj=<{a5m=$kדBtysMב\?sX\ROyZ￉bij:w?9FtqkT5j{ҚݒBJ0!u>^#TCcK9}8檱Nk) ͩ"%>"F".6<_v5枫lx=+<ڏ{;,F{P9aŔaQu%/1ۖJ!kZ e޽(򰋾BXrvvTxZn28*q0y*4v.3t@_Ξ3~X K׃\; J54):Ks'T KX¨\Zy V=Rbu_fوϼn7 &_KnRAJbN :]點]\x2eTI۩w\Io8A -BJ!ek\Ymhn;#20lǞzŃ=Pao8,g-w@oߢW `!E OwG''ݔ3ےpuƔT*=3Z('Z?aX;(ˢCIe.pvi+)EN|ۓkUA/ >i_%!^z$M,P X-ݙEPd {Bt J_s5z~TnUy[jÊMZLé1gQi)?:V0KU fu`X?RU#&Ѩ&aɴ*zځOs06 mđu9H2T}qdk-Qh)4|uHֻ{5dfmk@M~wB?VA䱤 6 -"T>qh^aJO<!KbЙZu܇>TvN!b: U&BBtJ&}C*[ bQLIt':;͕- 7\53q_ѐD$+HS~L&,MuYಣ[v؈6"U1 " gkSaR l3ҒTTS_t}50fSV z9b?\,w`t`Ԑ KڞY{.b+c7DmyUjVˉUd >r@zX@+q/axݩcUgƧI#3 j$XOk ]$G~\v=i ZāFq-S9}-ϴ_=@H . YMl9;/}l+iP#gl?#L5։3ٴ!zLm{䙁FbAʮebD+"A7a(Tχ3L'7[-LJuۿU?M2›rؐ? $NP]Xv$mW ֠4e AȺlt8(we 񢴷cQ ;fYʾ庉N0ۊik6޷7:lTS_ΊCu/"7!;acTF"#rFQl2'ms 'o -8I|>yeOKRugt694)fcHxYR)Z9v=FgϵG*XhפI\c̩͘ϗ%4N;\"̢<$/6GWxr,~ VfļƿS{3\4.DeE]S?/( L"pg 𣏕{6J!l?eStr. |+dh b&iYO_u2ILe!ᒗ8HG)}coĆ_(iL^cf)ӟ',QsN  8h{3#rvtv5ہSX& *3n?&{;29(U+b}>F-0S1~we8خ!lK z(.|sF@OXv(uq˫䨚vQWPβ/+"")bХyj.{6?.S>'a|`5CH(imVo_:da.Ycrva̴Z &~ZPF9zw4c D簆5[8=HNe*g 7ߥ;yUuzW[v:n IEXȮIar; nTʱDs eYʍBs7on%\{UuV+[q%=~FzՍ*)NT7ծ9LFU`)?|*boFuR^N'6dFMJt crVu "{t@GfHmq,"vy-FhpM8l7Aڨ*=2u?Χt~ cJv#U^d\k*M-ےL k*Ke O4xt5wK{LOՂjҾ(H1Pܙ18I{gج(>vX1bZJ<#zXge%N`ՠomo/dsfx87ՠoDBCrqխlAچWDzlFMLEftPg+ O&I>JbַuE)AR|ihsm;)::;n'K;j?BTԓ%:m :-x-]7.9nxVjq7գr`![-uĎHzTہw 4$9sǎ]EO0(cÌD6,Q>=nFV UJrXl 6KSPlS9޽W/SزPf*Q |֜ױPEBQXvc?/7YxC,?NOL1mv?wׇ/urxQE1 z{S#Jz^mhJ)nkפb0^ꕃj2<M&ʩo(e1އ 2nbi`dm KKm'x(9Rh'[ ŌzRe.8 ٖ$"@Rz7mM'/bs7{coIƋoѶ /zGBoi>rX4-nRiZ1xՓU$jl'<,4N_}PQ̐-U ;}E&sنQ&vZlXp/lCӘbc1`(!v#YrgVo(IW擺jb+w #;S-xNe;7Bm :YӹvoSn]Oq+v2t, ۙ٧sܑ6t vcŷ63ҥR{5ّ(| $QJ%Q݃T6)_5] DXDnԇ:Զ]9fɦzjN`|@ء)AֈR6ھۭ}ӝ-e{T/AcbXr1Ht6^n ZLlJ҂VD`Gl&Eˀ%YeL%}sUaPE3ߵ4$ic3(!# ;7f]ThI<ٺ7"*Nwmd u:X,)R_q$*5QDpL)&;Uj) kSo U*U"'w{,V>O1Q/ƁY# !\lEa >0:GI`^]Fe#鴔@ T pDž(<*U5B|\ՏFXQۙfoD!^ vԽ\[KyJXb d>/4z3 3S9.l>fx)PD RNJ[sϮnD :} ~7_VR!*̱]r6&hWueJtL|Vj];{ #a,^%LW~D?Û**B7^q7<:/]RtV ؎h0?Ԓ endstream endobj 101 0 obj << /Type /FontDescriptor /FontName /TEGUAR+CMTT10 /Flags 4 /FontBBox [-4 -233 537 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/C/M/a/c/d/e/f/h/o/r) /FontFile 100 0 R >> endobj 102 0 obj << /Length1 2182 /Length2 8224 /Length3 0 /Length 9505 /Filter /FlateDecode >> stream xڍP\64 H.ݝ ,.,RJ#-* %%%݈4|Oΰ{y;h(4Y-a`ԅ]( dgbegĢт؃cT I8䂐I\0(P`gr?J @eV vƢ9z!6.<[09?cw! (Pbv@d5aB ٸ8 Yapkf;v* XhZ60+w D!`3j فJ@UG0/c o@9,,` 'j ؃2J..@! s2@-GgVgOl? , 98.X?'-udvP;dZZaȦ 8A~ˬ.@vvv~.. a@KSsZ!h}!V`3 t}Taqp-!.@s5;:B #x d1b,aP{Z̦'/707  }oT lC`Q@nKob@on\&gd\2A{Ͽ- eb?k kWʻ"gR bakbi"= V9C~7@v!Vq8#KFl3JC-`?WAXzs vklP ` ~&SIFρl">򿈟Ȧq#. o=G o3,[巜__q$ςYBD=wrELoN oD^+1~a?&ֿ#"?&@6!7y: (х?r 8Ńp"&=$wv3?jĉ?[s!r9S_26 J6^j8\@H( οID`?*ƃ0wF\yq4A!'BG8NDߤ ϺYequ#"v=X_`,C"N0tפ6%.r#g['6"/w9jLD ~jD2_euVrPli10ZZj3َb ի}Lj;􈪵o9j~c\?w3fXWWe4~"A$3DGk1$dLVu~e*Qw%du+C wعIw'~Ӆڗ&ij?AQk)hjԶn%<;[ʼnCFrJsdoIS"TԊj] !VN-r4o K+sYhIt~cD)a/{zL(xRtIr^/)u/g9ki*mKsL䜹2AK\<, ^CeГҋ0$nǮ#uI$q V_x>vm7I$Hvg$i8? lf mf'^E~[22 .ˊ56Ш6m(oEFyev4o",K0IY[W銪 yD6ss)f,4MG/Ya%iR3lei2S>Z8K2=& {_Vra쑓jFd穥;ؚv|dν`#^sg`QedwrGZ[[DbtiHx+NSL؋-ˤ])в 8aw1l>{,\8lgNrQP[u-/ΟBg.*e}1[kktn3IԼIB7l/{+ %V{r/~.qD6 AՓ ;^9m.&uRm z?Vgx9 4!!5P{Ik.1-BK|݂Ir[YF)<\FTj٣]H`QIM,иR(8Ej*_faʡ$`P2=Z7"܍\&oG|Y"Ohiɍ/Qsg"SN8&NR1$W{YԨ{:"0PSm˔\UjR!T Rn8(pM8xl ̍oe x7^(Yf{L2@`kp<|ӗTIi.NbvVe R*|U20kJcX90Onc3o H5k;R^,HCQ?Q;AY&bS*zc:0+%5_JOU*@)؟[5//X1~7.ʼn!(f gw L~m;:8i'kz3dqǽLd E(z#;C{ Sc#G b.꼷Cqʮo! YL"&8O g$&P(H ]tOv(b{QX#O+0U6Qk`7݄m*EgN? 3m_=iŮ+Tf)iP&{<+^ԅKʝOeT<k$S5!ĸ(=>D_0[ﶚo۾OWx%n_f;f k^%%a#INmWU9/cM#PΩT?kzo>ڛ,暑bôI,Px90kK ON4@9 )CY?S$6oV>$ 5v}ol%w;'3UL<';]Ű/1GVƇXuunM~UњpQCnU7m0вGv?^[ɕģ:c WR'R8n`e;[oDqsRbmץKdt-05tYRUfZWr:S)wJc=mgPyP\ 8N{oqěLZ#D?jmks Mk.*u T(4jgO`E.#.S X&Z]9|v91 d~TE;nGc2(QC ĸb2 V~MPf--^km\[c@Nw|WМ]4`iDMfQ1P 5Rņԣ C>S+ m}B9aZ!w[r}FϺ/e4T劦2[Dq ЅQ$[?cgL3Lytag>r2ON#>!?'2˧Nd W|uD #*{hqGL)C44h5%s &MaE;(ȨZo}sA(Na},OMҴ-iɌ)΍ Oʻt<_+ݼ36c3nk2ҭ0lMssgGeF}/+Vceˉ499;-3EGezLҽG_Y`KvY$OƇ0fls-.8buj}R?W>bW7 Ūa cq$U~ʘl”e6V/]ĉ zRލ@踧KUC7ZOH&4ՏV;[;-aǜEU_ҹnz՛I`mZ[2@.M* Αg̺I+v,\ 'JZۏIr}Y,G_ǹsw2YoS x(Ƈfi h/f-GQ13?}7`ԉֺzgV2,ʛneDT"!x#)ETlܻ^ J1gias C3֨ڔ VbW'M[:IroMv@)^k,Cz%ːTtj|V}Kt.4k/W9zPjwi5W.?HFM$UC,=؟7I+A -ħ/OdG,$?K?e9l&#-HǍVF"yY68},8iWi {Cˢqckz6:Eo{4ʓN*.r踃oq Zճn+oLE|w͢Rٹm=Bc[P>5>C#Z3t(d&Kj㬔Dlɓ}MIwk PaGՊt눘1龄^O,uT>&jQmJr?QpNnIcisBػIg#ֳȆbUz&R*N bh4K ,;VС"(_p9ՙV oM)x//dhA&ܔGw>: GQiZ#;G'W[#fn۔ Hd(C)劣Lr[)Wm6&eʄ?(߈z$r@O0 ęx9Vv607ʅZ7y=oxjtv"h4QN?yX-u"v>K=`~`Leg40TԼפGé.54 ×yԋ6;ل᫑58$_tNpJ-?'}`YV+9!›njrgkRZӹ+t^[+p R||yYLScmOcW4HQ)f1nTqp1M"{dn@gYaҞ"s2oy$T$´]oxm)%0'}eԡ9/1Dݬ;} Ь:P(wn.򁉸V3@W9ʣR>vZPYtk.|KraҖ0Or^Wl<{އm Ӧ,x|t:yF$$xoX.өÃ@QCQ> ,V sG &G˶ Zf|wtTHwn Fx '-\|4场DOwvUXv>_ t9 vd( z ڭE0{l*y5hf{le~,&&!t23g*ǽzɃ_Z-,l&6 _6. ^l:&WXl|& bhK*lləpu/$\JI .QdyY wqDuJ?$:g2D 6T0="U:"{?y2U{gmABIH\t燥A;euY ,Cd[~Fe #2ʝ@f_9B:Z{X "ݼݹ足@/zql)9C۸3O/ܒz.=u} w'ta /_ױIÞLno:N=, n,p"PfH?3|gk' ՏwA{'$FMBEH5;9#yP&u꤇:A0fPщ"DX hU Dž:{cל6[D>UCuUt9 ;zgKKEfqKʃOcXtm^l?FxRu˄UeN--7=-Ƿ$ZSPQKτa[ּlHi`/'F&D|/t˳-0Bo>`,pzMQ-Db29UdsdȔy .nY(Qr5k% aA4Z '?&2u?>ug.d|+ YloB]z3Hvc,@evaq(3 ƵO y _#)f\a+'QFFTj%Z|O6P[AzY95]BRo 0 -Gau^$towZlrP'޿.=/@ wH2Fڸ.48}CޓN "h%e.M| n oI9^cG$!4ZdU f/iDP?oŕX7wepZkYeX4# ^4DUrO@L1ztvlt+8;̠:RFЗeԏ .Q9j?q#cRf;fT+Cc.\֦eVw|>Lk:Y>77Qu__[͋,fzDK"iLbPapcme+:gJ>͸NgYwIr7M>5h9A6Dv &1X㦂_MaaR#URĹ:2-PSB%Tc~$~QRtGn"e|T8|E#2O1OYOtz;S{E*ZK1V>ڝ76ũ[Sk$;@$:,\%ޤ{ Ej7fVMM 9޼jWqj1;5)!Xv%J׷7 p$xJd=۶zbթ Ú^d]gA֓P@0a>d]L{L:EhIfhGf"ǢN:R87;UQTbNcvޚj'+ͧ'9VTZnoVr. vQu< #l`utR;rIHӰBo&K-`b[Ss ؙzS/VyWI/qxʭ>%K{[' 1nQv3]( {)F,mNHj 潊.'.~'_ Ŭ$_|~S,r Y(yR#7SEѪwKq1;f") A41..́4{!R'R?z͈Xͽ /vח x苩Yv~&=wnkG xT^>n[>:30v;)?b?.'X~B~=%pMBiӈNFu-.0T'GJۣ|7ռUʩT͕۷0; HS2N?-'MkZ|hp9|'d#{11gkBNFQR֪3K %. ىUEU>f?)\X!{X0$z5Y=tfICP$hS?Nh $Kҋ{9͑hzAKk,ƑQhݚ]*ʦ}S2}~Qry ` ח?M f endstream endobj 103 0 obj << /Type /FontDescriptor /FontName /XVPXIA+CMTT12 /Flags 4 /FontBBox [-1 -234 524 695] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/C/D/E/M/P/Q/S/W/a/bracketleft/bracketright/c/d/e/eight/equal/f/five/four/g/greater/h/hyphen/i/k/l/m/n/nine/o/one/p/parenleft/parenright/percent/period/q/quotedbl/r/s/seven/six/t/three/two/u/x/y/zero) /FontFile 102 0 R >> endobj 42 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ITOGIG+CMBX12 /FontDescriptor 85 0 R /FirstChar 49 /LastChar 121 /Widths 81 0 R >> endobj 48 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ROIJAG+CMR10 /FontDescriptor 87 0 R /FirstChar 44 /LastChar 121 /Widths 76 0 R >> endobj 41 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KQFQXT+CMR12 /FontDescriptor 89 0 R /FirstChar 11 /LastChar 121 /Widths 82 0 R >> endobj 40 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KKIEET+CMR17 /FontDescriptor 91 0 R /FirstChar 67 /LastChar 119 /Widths 83 0 R >> endobj 45 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FYGEPU+CMR7 /FontDescriptor 93 0 R /FirstChar 49 /LastChar 50 /Widths 78 0 R >> endobj 44 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PXOHER+CMR8 /FontDescriptor 95 0 R /FirstChar 49 /LastChar 50 /Widths 79 0 R >> endobj 55 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KAXAAF+CMSLTT10 /FontDescriptor 97 0 R /FirstChar 33 /LastChar 126 /Widths 74 0 R >> endobj 54 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JIQTFW+CMTI12 /FontDescriptor 99 0 R /FirstChar 110 /LastChar 116 /Widths 75 0 R >> endobj 47 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TEGUAR+CMTT10 /FontDescriptor 101 0 R /FirstChar 67 /LastChar 114 /Widths 77 0 R >> endobj 43 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XVPXIA+CMTT12 /FontDescriptor 103 0 R /FirstChar 34 /LastChar 121 /Widths 80 0 R >> endobj 49 0 obj << /Type /Pages /Count 6 /Kids [34 0 R 51 0 R 58 0 R 62 0 R 67 0 R 71 0 R] >> endobj 104 0 obj << /Type /Outlines /First 3 0 R /Last 31 0 R /Count 8 >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 104 0 R /Prev 27 0 R >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 104 0 R /Prev 23 0 R /Next 31 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 104 0 R /Prev 19 0 R /Next 27 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 104 0 R /Prev 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 104 0 R /Prev 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 104 0 R /Prev 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 104 0 R /Prev 3 0 R /Next 11 0 R >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 104 0 R /Next 7 0 R >> endobj 105 0 obj << /Names [(Doc-Start) 39 0 R (Hfootnote.1) 46 0 R (Hfootnote.2) 65 0 R (page.1) 38 0 R (page.2) 53 0 R (page.3) 60 0 R] /Limits [(Doc-Start) (page.3)] >> endobj 106 0 obj << /Names [(page.4) 64 0 R (page.5) 69 0 R (page.6) 73 0 R (section.1) 2 0 R (section.2) 6 0 R (section.3) 10 0 R] /Limits [(page.4) (section.3)] >> endobj 107 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] /Limits [(section.4) (section.8)] >> endobj 108 0 obj << /Kids [105 0 R 106 0 R 107 0 R] /Limits [(Doc-Start) (section.8)] >> endobj 109 0 obj << /Dests 108 0 R >> endobj 110 0 obj << /Type /Catalog /Pages 49 0 R /Outlines 104 0 R /Names 109 0 R /PageMode/UseOutlines /OpenAction 33 0 R >> endobj 111 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.14)/Keywords() /CreationDate (D:20190716154816-07'00') /ModDate (D:20190716154816-07'00') /Trapped /False /PTEX.Fullbanner (This is MiKTeX-pdfTeX 2.9.4902 (1.40.14)) >> endobj xref 0 112 0000000000 65535 f 0000000015 00000 n 0000003547 00000 n 0000140651 00000 n 0000000060 00000 n 0000000090 00000 n 0000003601 00000 n 0000140567 00000 n 0000000135 00000 n 0000000170 00000 n 0000006664 00000 n 0000140481 00000 n 0000000215 00000 n 0000000271 00000 n 0000006719 00000 n 0000140393 00000 n 0000000317 00000 n 0000000359 00000 n 0000008754 00000 n 0000140305 00000 n 0000000405 00000 n 0000000446 00000 n 0000011690 00000 n 0000140217 00000 n 0000000492 00000 n 0000000557 00000 n 0000013818 00000 n 0000140129 00000 n 0000000603 00000 n 0000000650 00000 n 0000015135 00000 n 0000140054 00000 n 0000000696 00000 n 0000000725 00000 n 0000003159 00000 n 0000003286 00000 n 0000003714 00000 n 0000000773 00000 n 0000003439 00000 n 0000003492 00000 n 0000138901 00000 n 0000138761 00000 n 0000138480 00000 n 0000139744 00000 n 0000139179 00000 n 0000139041 00000 n 0000003655 00000 n 0000139602 00000 n 0000138621 00000 n 0000139886 00000 n 0000006774 00000 n 0000006503 00000 n 0000003866 00000 n 0000006611 00000 n 0000139460 00000 n 0000139317 00000 n 0000011484 00000 n 0000008809 00000 n 0000008593 00000 n 0000006892 00000 n 0000008701 00000 n 0000011803 00000 n 0000011357 00000 n 0000008915 00000 n 0000011637 00000 n 0000011744 00000 n 0000013873 00000 n 0000013657 00000 n 0000011955 00000 n 0000013765 00000 n 0000015190 00000 n 0000014974 00000 n 0000013979 00000 n 0000015082 00000 n 0000015284 00000 n 0000015678 00000 n 0000015726 00000 n 0000016165 00000 n 0000016375 00000 n 0000016405 00000 n 0000016435 00000 n 0000016981 00000 n 0000017411 00000 n 0000018016 00000 n 0000018348 00000 n 0000032113 00000 n 0000032426 00000 n 0000047430 00000 n 0000047712 00000 n 0000068068 00000 n 0000068538 00000 n 0000078719 00000 n 0000078967 00000 n 0000086118 00000 n 0000086340 00000 n 0000093498 00000 n 0000093720 00000 n 0000110497 00000 n 0000110972 00000 n 0000118326 00000 n 0000118550 00000 n 0000128204 00000 n 0000128440 00000 n 0000138065 00000 n 0000139980 00000 n 0000140722 00000 n 0000140894 00000 n 0000141060 00000 n 0000141221 00000 n 0000141310 00000 n 0000141348 00000 n 0000141474 00000 n trailer << /Size 112 /Root 110 0 R /Info 111 0 R /ID [<894C2EBACB85E3872F0A145DE2E05FC3> <894C2EBACB85E3872F0A145DE2E05FC3>] >> startxref 141749 %%EOF doMC/inst/doc/gettingstartedMC.Rnw0000644000176200001440000002637313513447512016576 0ustar liggesusers% \VignetteIndexEntry{Getting Started with doMC and foreach} % \VignetteDepends{doMC} % \VignetteDepends{foreach} % \VignettePackage{doMC} \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 doMC and foreach} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Getting Started with doMC and foreach} \author{Steve Weston} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} The \texttt{doMC} 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{doMC} 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{doMC} package acts as an interface between \texttt{foreach} and the \texttt{multicore} functionality of the \texttt{parallel} package, originally written by Simon Urbanek and incorporated into \texttt{parallel} for R 2.14.0. The \texttt{multicore} functionality currently only works with operating systems that support the \texttt{fork} system call (which means that Windows isn't supported). Also, \texttt{multicore} only runs tasks on a single computer, not a cluster of computers. That means that it is pointless to use \texttt{doMC} and \texttt{multicore} 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{multicore} functionality 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. In addition, it usually isn't safe to run \texttt{doMC} and \texttt{multicore} from a GUI environment. \section{Registering the \texttt{doMC} parallel backend} To register \texttt{doMC} to be used with \texttt{foreach}, you must call the \texttt{registerDoMC} function. This function takes only one argument, named ``cores''. This specifies the number of worker processes that it will use to execute tasks, which will normally be equal to the total number of cores on the machine. You don't need to specify a value for it, however. By default, the \texttt{multicore} package will use the value of the ``cores'' option, as specified with the standard ``options'' function. If that isn't set, then \texttt{multicore} will try to detect the number of cores, and use approximately half that many workers. Remember: unless \texttt{registerDoMC} is called, \texttt{foreach} will {\em not} run in parallel. Simply loading the \texttt{doMC} package is not enough. \section{An example \texttt{doMC} session} Before we go any further, let's load \texttt{doMC}, register it, and use it with \texttt{foreach}: <>= library(doMC) registerDoMC(2) foreach(i=1:3) %dopar% sqrt(i) @ \begin{quote} Note well that this is {\em not} a practical use of \texttt{doMC}. This is my ``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{doMC} with all of its dependencies (\texttt{foreach}, \texttt{iterators}, \texttt{multicore}, 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{doMC} and \texttt{multicore}. Note that you can register a different parallel backend later, or deregister \texttt{doMC} 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: <>= 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{doMC} and \texttt{multicore} 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{doMC} 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. I'm not going to explain what it's doing or how it works here. I 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 registering a different parallel backend that supports clusters in order to take advantage of more processors. \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() @ This is mostly useful for documentation purposes, or for checking that you have the most recent version of \texttt{doMC}. \section{Specifying multicore options} The \texttt{doMC} 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: <>= mcoptions <- list(preschedule=FALSE, set.seed=FALSE) foreach(i=1:3, .options.multicore=mcoptions) %dopar% sqrt(i) @ 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{doMC}. Although if no value of ``cores'' was specified when \texttt{doMC} was registered, you can also change this value dynamically using the \texttt{options} function: \begin{verbatim} > registerDoMC() > getDoParWorkers() [1] 3 > options(cores=2) > getDoParWorkers() [1] 2 > options(cores=3) > getDoParWorkers() [1] 3 \end{verbatim} If you did specify the number of cores when registering \texttt{doMC}, the ``cores'' option is ignored: <>= registerDoMC(2) options(cores=4) getDoParWorkers() @ As you can see, there are a number of options for controlling the number of workers to use with \texttt{multicore}, but the default behaviour usually does what you want. \section{Conclusion} The \texttt{doMC} and \texttt{multicore} 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} doMC/inst/doc/gettingstartedMC.R0000644000176200001440000000356113513452060016215 0ustar liggesusers### R code from vignette source 'gettingstartedMC.Rnw' ################################################### ### code chunk number 1: loadLibs ################################################### library(doMC) registerDoMC(2) foreach(i=1:3) %dopar% sqrt(i) ################################################### ### code chunk number 2: 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 3: 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 4: getDoParWorkers ################################################### getDoParWorkers() ################################################### ### code chunk number 5: getDoParName ################################################### getDoParName() getDoParVersion() ################################################### ### code chunk number 6: options ################################################### mcoptions <- list(preschedule=FALSE, set.seed=FALSE) foreach(i=1:3, .options.multicore=mcoptions) %dopar% sqrt(i) ################################################### ### code chunk number 7: coreoptions2 ################################################### registerDoMC(2) options(cores=4) getDoParWorkers() doMC/inst/unitTests/0000755000176200001440000000000013513447512014060 5ustar liggesusersdoMC/inst/unitTests/runTestSuite.sh0000644000176200001440000000157513513447512017102 0ustar liggesusers#!/bin/sh LOGFILE=test.log R --vanilla --slave > ${LOGFILE} 2>&1 <<'EOF' library(doMC) library(RUnit) verbose <- as.logical(Sys.getenv('FOREACH_VERBOSE', 'FALSE')) library(doMC) registerDoMC() options(warn=1) options(showWarnCalls=TRUE) cat('Starting test at', date(), '\n') cat(sprintf('doMC 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) } } cat('Finished test at', date(), '\n') EOF doMC/inst/unitTests/options.R0000644000176200001440000000060013513447512015672 0ustar liggesuserstest01 <- function() { x <- list(1:3, 1:9, 1:19) cs <- 1:20 for (chunkSize in cs) { mcopts <- list(preschedule=FALSE) for (y in x) { actual <- foreach(i=y, .options.multicore=mcopts) %dopar% i checkEquals(actual, as.list(y)) actual <- foreach(i=y, .combine='c', .options.multicore=mcopts) %do% i checkEquals(actual, y) } } }