timeSeries/0000755000176000001440000000000013612625323012416 5ustar ripleyuserstimeSeries/NAMESPACE0000644000176000001440000001577013612553714013653 0ustar ripleyusers ################################################ ## import name space ################################################ ## MM: This (importing all) is stupid: import("graphics") import("grDevices") import("methods") import("stats") import("utils") import("timeDate") ################################################ ## S4 classes ################################################ exportClasses("index_timeSeries", "timeSeries", "time_timeSeries" ) export("colCummaxs", "colCummins", "colCumprods", "colCumreturns", "colCumsums", "outlier", "returns", "rowCumsums", "series", "series<-", "timeSeries" ) exportMethods("$", "$<-", "+", "-", "Ops", "[", "[<-", "aggregate", "align", "apply", "as.data.frame", "as.list", "as.matrix", "as.ts", "attach", "cbind2", "coerce", "colMeans", "colSums", "colnames", "colnames<-", "comment", "comment<-", "cummax", "cummin", "cumprod", "cumsum", "cut", "diff", "dim", "dim<-", "dimnames", "dimnames<-", "end", "filter", "finCenter", "finCenter<-", "frequency", "getDataPart", "head", "initialize", "is.na", "is.unsorted", "isDaily", "isMonthly", "isQuarterly", "isRegular", "lag", "lines", "merge", "na.contiguous", "na.omit", "names", "names<-", "plot", "points", "print", "quantile", "median", "rank", "rbind2", "rev", "rownames", "rownames<-", "sample", #"scale", "setDataPart", "show", "sort", "start", "str", "t", "tail", "time", "window" ) ################################################ ## S3 classes ################################################ S3method(".DollarNames", "timeSeries") S3method("aggregate", "timeSeries") S3method("as.data.frame", "timeSeries") S3method("as.list", "timeSeries") S3method("as.matrix", "timeSeries") S3method("as.timeSeries", "character") S3method("as.timeSeries", "data.frame") S3method("as.timeSeries", "default") S3method("as.timeSeries", "ts") S3method("as.timeSeries", "zoo") S3method("as.ts", "timeSeries") S3method("cbind", "timeSeries") S3method("cumulated", "default") S3method("cut", "timeSeries") S3method("diff", "timeSeries") S3method("end", "timeSeries") S3method("getUnits", "default") S3method("head", "timeSeries") S3method("lag", "timeSeries") S3method("lines", "timeSeries") S3method("merge", "timeSeries") S3method("na.omit", "timeSeries") S3method("plot", "timeSeries") S3method("points", "timeSeries") S3method("pretty", "timeSeries") S3method("rbind", "timeSeries") S3method("rev", "timeSeries") S3method("scale", "timeSeries") S3method("sort", "timeSeries") S3method("start", "timeSeries") S3method("str", "timeSeries") S3method("tail", "timeSeries") S3method("time", "timeSeries") S3method("time<-", "timeSeries") S3method("window", "timeSeries") ################################################ ## functions ################################################ export( # MODIFY - DELETE/ADD: # "plotOHLC", ".plotOHLC", # .endOfPeriod*, "endOfPeriodBenchmarks", "endOfPeriodSeries", "endOfPeriodStats", # ADD: "returns0", "index2wealth", "daily2monthly", "daily2weekly", "splits", # DELETE # ".plotTimeSeries", # ADD ".xtplot.timeSeries", ".xtsPlot", ".axTicksByTime2", ".endpoints2", ".periodicity2", ".colorwheelPalette", # ADD: "getAttributes", "setAttributes<-", ".appendList" ) export( ".DollarNames.timeSeries", ".aggregate.timeSeries", ".align.timeSeries", ".applySeries", ".as.data.frame.timeSeries", ".as.list.timeSeries", ".as.matrix.timeSeries", ".as.ts.timeSeries", ".cut.timeSeries", ".description", #".diff.timeSeries", ".dollar_assign", ".end.timeSeries", ".extract.turnpointsPastecs", ".fapply", ".findIndex", ".head.timeSeries", ".isOHLC", ".isOHLCV", ".lines.timeSeries", ".lowessSmoother", ".merge.timeSeries", ".na.omit.timeSeries", ".naOmitMatrix", ".old2newRda", ".old2newTimeSeries", ".plot.timeSeries", ".plot.turnpointsPastecs", ".points.timeSeries", ".print.timeSeries", ".rev.timeSeries", ".rollmax.timeSeries", ".rollmean.timeSeries", ".rollmedian.timeSeries", ".rollmin.timeSeries", ".scale.timeSeries", ".signalCounts", ".signalSeries", ".sort.timeSeries", ".splineSmoother", ".start.timeSeries", ".str.timeSeries", ".subset_timeSeries", ".summary.turnpointsPastecs", ".supsmuSmoother", ".tail.timeSeries", ".time.timeSeries", ".timeSeries", ".turnpoints2", ".turnpointsPastecs", ".turnpointsSeries", ".turnpointsStats", ".validity_timeSeries", ".window.timeSeries", "alignDailySeries", "applySeries", "as.timeSeries", "colAvgs", "colKurtosis", "colMaxs", "colMins", "colProds", "colQuantiles", "colSds", "colSkewness", "colStats", "colStdevs", "colVars", "countMonthlyRecords", "cumulated", "description", "drawdowns", "drawdownsStats", "dummyDailySeries", "dummySeries", "durationSeries", "durations", "fapply", "getFinCenter", "getReturns", "getTime", "getUnits", "getUnits.default", "hclustColnames", "interpNA", "is.signalSeries", "is.timeSeries", "isMultivariate", "isUnivariate", "midquoteSeries", "midquotes", "newPositions<-", ".ohlcDailyPlot", "orderColnames", "orderStatistics", "pcaColnames", "readSeries", "removeNA", "returnSeries", "rollDailySeries", "rollMax", "rollMean", "rollMedian", "rollMin", "rollMonthlySeries", "rollMonthlyWindows", "rollStats", "runlengths", "sampleColnames", "seriesData", "seriesPositions", "setFinCenter<-", "setTime<-", "setUnits<-", "smoothLowess", "smoothSpline", "smoothSupsmu", "sortColnames", "spreadSeries", "spreads", "statsColnames", "substituteNA", "time<-", "turns", "turnsStats" ) timeSeries/ChangeLog0000644000176000001440000006433013612551406014176 0ustar ripleyusers2020-01-24 Martin Maechler * DESCRIPTION (Version): 3062.100 ; using Authors@R * R/utils-head.R: tail.matrix() in R-devel uses 'keepnums'. * R/timeSeries-readSeries.R (et all): do *NOT* use `if(class(.) == "timeSeries")` but use `inherits(*, "...")` !! * R/methods-plot.R (.plotTimeSeries): fix wrong logic in `if(.. && at == "auto")` when `at` can be a vector (!) * R/aaa-utils.R (`%||%`): utility, to be used extensively in * R/methods-plot2.R (.xtplot.timeSeries). 2015-11-09 tsetz * updated rank function * exported getUnits and .DollarNames as S3 methods 2014-06-17 wuertz * vignette 'plotting timeSeries objects' added * DESCRIPTION, required packages added 2014-06-16 wuertz * Refcard PDF added to doc directory 2013-03-25 chalabi * DESCRIPTION: Updated version number * R/methods-mathOps.R: callGeneric() seems to have troubles in finding variables defined in the function frame and passed to the generic with the dots arguments. 2013-03-15 chalabi * ChangeLog, DESCRIPTION: Updated ChangeLog and DSC files * DESCRIPTION: Updated maintainer field and version number * R/zzz.R: Removed deprecated .First.lib() * R/base-apply.R: Added out of range test in apply,method-timeSeries 2013-02-22 tsetz * R/statistics-rollMean.R: functions rollMin and rollMax exchanged and function rollMin corrected, * rollStats timeSeries name corrected 2012-08-12 chalabi * ChangeLog, DESCRIPTION: updated DESC and ChangeLog 2012-08-07 chalabi * DESCRIPTION: updated version number * R/base-subsetting.R: Removed C level call to 'find_interv_vec' due to changes in R-devel 2012-03-21 chalabi * ChangeLog, DESCRIPTION: updated ChangeLog and DESC * NAMESPACE, R/utils-getArgs.R, man/utils-getArgs.Rd: moved getArgs to fBasics where it was already defined * ChangeLog, DESCRIPTION: updated DESC and ChangeLog * man/utils-getArgs.Rd: added manual page for getArgs * R/utils-getArgs.R: getArgs() can now handle signature of length > 1 * NAMESPACE: added getArgs to NAMESPACE * R/methods-plot.R: pretty.timeSeries can not handle signal series * NAMESPACE: updated NAMESPACE * ChangeLog, DESCRIPTION: updated DESCRIPTION and ChangeLog * DESCRIPTION: updated version number 2012-03-20 chalabi * DESCRIPTION: updated DESC file 2012-03-20 wuertz * NAMESPACE: updated * R/timeSeries-slotSeries.R: had conflicts with mu fPortfolio * man/timeSeries-slotSeries.Rd: 2012-03-19 chalabi * DESCRIPTION: updated DSC * man/methods-plot.Rd: updated manual page * R/fin-daily.R: fixed patial argument names * data/LPP2005REC.rda, data/MSFT.rda, data/USDCHF.rda: resaved data to reduce file disk storage 2012-03-17 wuertz * man/methods-plot.Rd: plot examples updated for pretty label positions * ChangeLog, NAMESPACE, R/methods-plot.R, man/methods-plot.Rd: pretty added 2012-03-16 wuertz * R/fin-drawdowns.R: drawdowns made visible 2011-11-01 chalabi * DESCRIPTION, R/fin-align.R, R/fin-daily.R, man/fin-align.Rd, man/fin-daily.Rd: alignDailySeries is now based on the align timeSeries method which is now based on the align timeDate method in timeDate (>= 2150.95). * inst/unitTests/runit.TimeSeriesData.R: updated unit test with new lag,timeSeries-method * R/stats-lag.R: fixed lag,timeSeries method when colnames are provided by 'units' argument. * R/base-cbind.R: Better handling of FinCenter in cbind.timeSeries method. * R/timeSeries.R: timeSeries method now works also with non default FinCenter when timestamps are given as a numerical vector. 2011-10-24 chalabi * R/stats-lag.R, inst/unitTests/runit.lag.R: Thanks to Daniele Amberti, lag timeSeries methods now returns proper colnames when used with multiple lag indexes. * inst/unitTests/runit.merge.R: * R/base-merge.R: Thanks to Daniele Amberti, merge timeSeries method now poperly converts colnames to valid data.frame names. 2011-10-11 tsetz * R/fin-drawdowns.R: Drawdowns are now compatible to the results of the drawdown function from performanceAnalytics ... 2011-09-23 mmaechler * DESCRIPTION: remove deprecated "LazyLoad" entry 2011-08-02 chalabi * ChangeLog, DESCRIPTION: updated DESC and ChangeLog 2011-05-04 chalabi * R/fin-align.R: Fixed integer overflow when dealing with very long historical data (1800 - today) in align method. 2011-04-21 wuertz * NAMESPACE, R/statistics-rollMean.R, man/statistics-rollMean.Rd: function rollStats added 2011-03-31 wuertz * NAMESPACE, R/fin-smooth.R, R/statistics-smoothLowess.R, man/base-rev.Rd, man/base-sort.Rd, man/base-start.Rd, man/fin-smooth.Rd, man/statistics-smoothLowess.Rd, man/timeSeries-readSeries.Rd, man/timeSeries-slotFinCenter.Rd, man/timeSeries-slotSeries.Rd, man/timeSeries-slotTime.Rd, man/timeSeries-slotUnits.Rd: help pages added and script files renamed * man/timeSeries-finCenter.Rd, man/timeSeries-slotFinCenter.Rd, man/timeSeries-slotUnits.Rd, man/utils-str.Rd, man/utils-structure.Rd: function renames * R/timeSeries-description.R, R/timeSeries-finCenter.R, R/timeSeries-series.R, R/timeSeries-slotFinCenter.R, R/timeSeries-slotSeries.R, R/timeSeries-slotTime.R, R/timeSeries-slotUnits.R, R/timeSeries-time.R, R/utils-description.R, R/utils-str.R, R/utils-structure.R: files renamed * man/timeSeries-description.Rd, man/timeSeries-series.Rd, man/timeSeries-slotSeries.Rd, man/timeSeries-slotTime.Rd, man/timeSeries-time.Rd, man/utils-description.Rd: files renamed * R/base-colCumsums.R, R/base-colSums.R, R/base-rowCumsums.R, R/fin-orderColnames.R, R/fin-orderStatistics.R, R/fin-rollmean.R, R/statistics-colCumsums.R, R/statistics-colSums.R, R/statistics-orderColnames.R, R/statistics-orderStatistics.R, R/statistics-rollMean.R, R/statistics-rowCumsums.R, man/base-colCumsums.Rd, man/base-colSums.Rd, man/base-rowCumsums.Rd, man/fin-orderColnames.Rd, man/fin-orderStatistics.Rd, man/fin-rollMean.Rd, man/statistics-colCumsums.Rd, man/statistics-colSums.Rd, man/statistics-orderColnames.Rd, man/statistics-orderStatistics.Rd, man/statistics-rollMean.Rd, man/statistics-rowCumsums.Rd: new file group for statistics and inference introduced. * NAMESPACE, R/aaa-Deprecated.R, R/base-Extract.R, R/base-attach.R, R/base-colSums.R, R/base-comment.R, R/base-rowCumsums.R, R/base-sort.R, R/base-start.R, R/base-subsetting.R, R/base-t.R, R/data-examples.R, R/fin-align.R, R/fin-daily.R, R/fin-drawdowns.R, R/fin-durations.R, R/fin-monthly.R, R/fin-periodical.R, R/fin-rollmean.R, R/fin-runlengths.R, R/fin-smooth.R, R/fin-splits.R, R/fin-spreads.R, R/fin-turnpoints.R, R/graphics-plot.R, R/methods-as.R, R/methods-comment.R, R/methods-is.R, R/methods-mathOps.R, R/methods-plot.R, R/old2new.R, R/stats-aggregate.R, R/stats-filter.R, R/stats-lag.R, R/stats-model.frame.R, R/stats-na.contiguous.R, R/stats-na.omit.R, R/stats-window.R, R/timeSeries-description.R, R/timeSeries-dummy.R, R/timeSeries-finCenter.R, R/timeSeries-getDataPart.R, R/timeSeries-isOHLC.R, R/timeSeries-isRegular.R, R/timeSeries-isUnivariate.R, R/timeSeries-readSeries.R, R/timeSeries-series.R, R/timeSeries-signalCounts.R, R/timeSeries-time.R, R/timeSeries.R, R/utils-getArgs.R, R/utils-head.R, R/utils-old2new.R, R/utils-str.R, man/00timeSeries-package.Rd, man/base-diff.Rd, man/base-merge.Rd, man/base-rev.Rd, man/base-sample.Rd, man/base-scale.Rd, man/base-sort.Rd, man/base-start.Rd, man/base-subsetting.Rd, man/data-examples.Rd, man/data.Rd, man/fin-align.Rd, man/fin-cumulated.Rd, man/fin-daily.Rd, man/fin-drawdowns.Rd, man/fin-durations.Rd, man/fin-periodical.Rd, man/fin-rollMean.Rd, man/fin-runlengths.Rd, man/fin-smooth.Rd, man/fin-splits.Rd, man/fin-turnpoints.Rd, man/graphics-plot.Rd, man/methods-comment.Rd, man/methods-plot.Rd, man/stats-window.Rd: several smaller updates: man pages improved, rolling statistics and smoother function added, some obsolete functions declared as deprecated. 2011-03-09 chalabi * ChangeLog, DESCRIPTION: updated DESC and ChangeLog * inst/doc: removed empty directory * DESCRIPTION: updated version number * R/timeSeries-readSeries.R: Fixed readSeries when reading tables with multiple columns. (Reported by Chris Breton). 2011-02-10 chalabi * ChangeLog, DESCRIPTION: updated Date and Revision field in DESC file and updated Changelog file * DESCRIPTION: updated DESC file * man/timeSeries-readSeries.Rd, man/timeSeries.Rd: added manual page for function readSeries() * inst/doc/TimeSeriesFAQ.pdf: removed pdf file because new version can be found on the website 2011-01-31 chalabi * R/timeSeries-readSeries.R, man/timeSeries.Rd: Added the optional 'format' argument and and a warning when the provided format produces NAs in readSeries function 2010-10-27 chalabi * ChangeLog, DESCRIPTION: updated DESC and ChangeLog file 2010-10-26 chalabi * R/base-cbind.R: cbind now extends vectors to match number of rows of the timeSeries object. 2010-09-30 chalabi * NAMESPACE: updated NAMESPACE 2010-09-24 chalabi * DESCRIPTION, NAMESPACE: updated NAMESPACE and version number in DESC file 2010-08-20 chalabi * R/stats-na.omit.R: removeNA is now the same as na.omit 2010-08-12 chalabi * R/graphics-plot.R: added grid function in .plotTimeSeries when using single plot type. * R/base-cbind.R, inst/unitTests/runit.bind.R: fixed issued reported by Thomas Etheber when using cbind method with timeSeries object with one record. 2010-07-26 chalabi * ChangeLog, DESCRIPTION: updated DESC and ChangeLog * DESCRIPTION: updated version number 2010-07-08 chalabi * R/methods-mathOps.R, R/stats-lag.R, R/stats-na.omit.R: improved support recordIDs * R/timeSeries-finCenter.R: cleanup code * R/base-apply.R, R/base-cbind.R, R/base-diff.R, R/base-rowCumsums.R, R/fin-runlengths.R: improved support of recordIDs 2010-07-06 chalabi * ChangeLog, DESCRIPTION: updated DESC and Changelog 2010-07-05 chalabi * R/methods-show.R: code cleanup 2010-07-02 chalabi * R/methods-show.R: Improved recordIDs handling in show method. 2010-05-17 chalabi * R/base-start.R: updated start/end to handle TZ 2010-04-22 chalabi * R/timeSeries-readSeries.R: improved dates management in readSeries() 2010-04-14 chalabi * NAMESPACE: updated NAMESPACE 2010-01-23 wuertz * NAMESPACE, R/aaa-Deprecated.R, R/fin-align.R, R/timeSeries-description.R, R/utils-getArgs.R: internal function .getArgs added 2010-01-22 wuertz * R/aaa-Deprecated.R, R/fin-durations.R, R/fin-spreads.R: deprecated functions moved to aaa-deprecated.R, started to clean up .... * R/fin-rollmean.R: code cleaned and description added * NAMESPACE, R/fin-runlength.R, R/fin-runlengths.R, man/fin-runlengths.Rd: .runlengths added 2010-01-06 chalabi * DESCRIPTION: updated version number * ChangeLog, DESCRIPTION: updated Changelog and DESC file * inst/unitTests/runit.aggregate.R, inst/unitTests/runit.subset.R: fixed unit tests for new years 2009-12-24 chalabi * NAMESPACE: updated NAMESPACE 2009-12-20 wuertz * NAMESPACE, R/fin-runlength.R: .runlengths() function added 2009-12-13 chalabi * DESCRIPTION: updated version number * ChangeLog, DESCRIPTION: updated Changelog and DESC file * man/base-subset.Rd: added aliased in manual pages 2009-12-10 chalabi * DESCRIPTION: updated version number * ChangeLog, DESCRIPTION: updated Changelog and DESC file * R/base-Extract.R: added completion method after the $ sign. * R/base-Extract.R, man/base-subset.Rd: updated signature list of timeSeries,$ method according to changes in r50609 in R-devel. 2009-10-26 wuertz * R/fin-drawdowns.R: example lin in script corrected 2009-10-05 chalabi * R/graphics-plot.R: improved handling of NA's in plot,timeSeries-method 2009-09-30 chalabi * inst/doc, inst/doc/TimeSeriesFAQ.pdf: added pdf files in inst/doc 2009-09-28 chalabi * DESCRIPTION: updated version number * ChangeLog, DESCRIPTION: updated DESCR and ChangeLog * R/AllClass.R: Added prototype in timeSeries class definition. 2009-09-02 chalabi * NAMESPACE, R/base-Extract.R, man/base-subset.Rd, man/timeSeries.Rd: added methods to subset timeSeries object with POSIXt and Date time stamps * NAMESPACE, R/stats-filter.R, man/stats-filter.Rd: added filter,timeSeries-method * NAMESPACE, R/base-t.R, man/base-t.Rd: added t,timeSeries-method * R/stats-na.contiguous.R, inst/unitTests/runit.na.contiguous.R, man/stats-na.contiguous.Rd: added na.contiguous,timeSeries-method. 2009-08-30 wuertz * R/base-apply.R: back to the previous version * R/base-attach.R: description added to attach * R/base-apply.R: apply should work now in all cases 2009-08-30 chalabi * NAMESPACE, R/timeSeries-isRegular.R, man/timeSeries-isRegular.Rd: isRegular methods are now proper S4 methods. 2009-08-30 wuertz * man/base-colCumsumsRd: file with missing dot deleted * man/base-colCumsums.Rd: missing dot in file name added 2009-08-28 wuertz * R/base-diff.R, R/methods-Ops.R, R/methods-mathOps.R, man/base-rowCumsums.Rd, man/fin-align.Rd, man/methods-DataPart.Rd, man/methods-align.Rd, man/methods-rowCum.Rd, man/time.Rd, man/timeSeries-getDataPart.Rd, man/timeSeries-time.Rd: renaming of man files finished * NAMESPACE, R/fin-monthly.R, R/fin-rollmean.R, R/timeSeries-isRegular.R, man/apply.Rd, man/base-apply.Rd, man/base-attach.Rd, man/base-cbind.Rd, man/base-colCumsumsRd, man/base-colSums.Rd, man/base-dim.Rd, man/base-rank.Rd, man/base-subset.Rd, man/colCum.Rd, man/colStats.Rd, man/cumulated.Rd, man/daily.Rd, man/description.Rd, man/drawdowns.Rd, man/durations.Rd, man/fin-cumulated.Rd, man/fin-daily.Rd, man/fin-drawdowns.Rd, man/fin-durations.Rd, man/fin-monthly.Rd, man/fin-orderColnames.Rd, man/fin-orderStatistics.Rd, man/fin-returns.Rd, man/fin-spreads.Rd, man/finCenter.Rd, man/graphics-plot.Rd, man/is.Rd, man/isUnivariate.Rd, man/lag.Rd, man/methods-aggregate.Rd, man/methods-attach.Rd, man/methods-bind.Rd, man/methods-dim.Rd, man/methods-is.Rd, man/methods-na.Rd, man/methods-plot.Rd, man/methods-returns.Rd, man/methods-str.Rd, man/methods-subset.Rd, man/model.frame.Rd, man/monthly.Rd, man/order.Rd, man/orderStatistics.Rd, man/rank.Rd, man/series.Rd, man/spreads.Rd, man/stats-aggregate.Rd, man/stats-lag.Rd, man/stats-model.frame.Rd, man/stats-na.omit.Rd, man/timeSeries-description.Rd, man/timeSeries-finCenter.Rd, man/timeSeries-isRegular.Rd, man/timeSeries-isUnivariate.Rd, man/timeSeries-series.Rd, man/utils-str.Rd: man script files Rd renamed to be more compatible with the script R files and the eBook * man/colCum.Rd: deleted by mistake * man/colCum.Rd: * R/timeSeries-isPeriod.R: isPeriod file no longer needed 2009-08-27 wuertz * inst/unitTests/runit.NA.R, inst/unitTests/runit.Omit.R, inst/unitTests/runit.TimeSeriesClass.R, inst/unitTests/runit.TimeSeriesCoercion.R, inst/unitTests/runit.TimeSeriesData.R, inst/unitTests/runit.TimeSeriesPositions.R, inst/unitTests/runit.aggregate.R, inst/unitTests/runit.align.R, inst/unitTests/runit.apply.R, inst/unitTests/runit.as.R, inst/unitTests/runit.attach.R, inst/unitTests/runit.bind.R, inst/unitTests/runit.colCum.R, inst/unitTests/runit.colStats.R, inst/unitTests/runit.cor.R, inst/unitTests/runit.cumulated.R, inst/unitTests/runit.daily.R, inst/unitTests/runit.dim.R, inst/unitTests/runit.drawdowns.R, inst/unitTests/runit.durations.R, inst/unitTests/runit.lag.R, inst/unitTests/runit.mathOps.R, inst/unitTests/runit.merge.R, inst/unitTests/runit.methods-plot.R, inst/unitTests/runit.methods-print.R, inst/unitTests/runit.methods-summary.R, inst/unitTests/runit.model.frame.R, inst/unitTests/runit.monthly.R, inst/unitTests/runit.order.R, inst/unitTests/runit.periodical.R, inst/unitTests/runit.rank.R, inst/unitTests/runit.returns.R, inst/unitTests/runit.rowCum.R, inst/unitTests/runit.signalCounts.R, inst/unitTests/runit.spreads.R, inst/unitTests/runit.subset.R, inst/unitTests/runit.time.R, inst/unitTests/runit.timeSeries.R, man/apply.Rd, man/colCum.Rd, man/colStats.Rd, man/cumulated.Rd, man/daily.Rd, man/data.Rd, man/description.Rd, man/drawdowns.Rd, man/durations.Rd, man/finCenter.Rd, man/is.Rd, man/isUnivariate.Rd, man/lag.Rd, man/methods-DataPart.Rd, man/methods-aggregate.Rd, man/methods-align.Rd, man/methods-as.Rd, man/methods-attach.Rd, man/methods-base.Rd, man/methods-bind.Rd, man/methods-comment.Rd, man/methods-dim.Rd, man/methods-mathOps.Rd, man/methods-na.Rd, man/methods-plot.Rd, man/methods-returns.Rd, man/methods-rowCum.Rd, man/methods-show.Rd, man/methods-stats.Rd, man/methods-str.Rd, man/methods-subset.Rd, man/model.frame.Rd, man/monthly.Rd, man/order.Rd, man/orderStatistics.Rd, man/rank.Rd, man/series.Rd, man/spreads.Rd, man/time.Rd, man/timeSeries.Rd: As a consequnece of introducing rda data files I have adapted all manual pages and all unit test files where it was necessary * data/LPP2005REC.rda, data/MSFT.rda, data/USDCHF.rda: now the rda files are there * data/LPP2005REC.Rda, data/MSFT.Rda, data/USDCHF.Rda: data files removed * data/LPP2005REC.Rda, data/LPP2005REC.csv, data/MSFT.Rda, data/USDCHF.Rda: Rda data files added, csv deleted, now all data files are in the same format makes life easier * data/MSFT.rda, data/msft.dat.csv, data/usdchf.csv: csv and rda files deleted 2009-08-17 chalabi * R/base-colCumsums.R, inst/unitTests/runit.colCum.R: Rewrite all Colcum methods to take advantages of new apply,timeSeries-methods. * R/base-apply.R: Improved apply,timeSeries-method to handle timeSeries with one row. * NAMESPACE: new NAMESPACE structure which should ease maintenance of packages. * R/methods-show.R: show,timeSeries-method is now more friendly with default "max.print" R option. * DESCRIPTION, NAMESPACE, R/base-Extract.R, R/base-cbind.R, R/base-merge.R, R/methods-Ops.R, R/methods-as.R, R/methods-show.R, R/timeSeries.R, inst/unitTests/runit.bind.R, man/methods-bind.Rd: Merge branch 'devel-timeSeries' Conflicts: pkg/timeSeries/R/base-Extract.R pkg/timeSeries/R/timeSeries.R * NAMESPACE, R/AllClass.R, R/base-Extract.R, R/timeSeries-getDataPart.R, man/methods-subset.Rd: better handling of @recordIDs with $<-,timeSeries-method. * R/methods-as.R: improved as.ts,timeSeries-method with monthly and quarterly data. 2009-06-13 chalabi * R/base-Extract.R: Improved $,timeSeries-method when matching names in @recordIDs * R/AllClass.R, R/base-Extract.R, R/base-dim.R: names,timeSeries-method returns now also the names of data in @recordIDs. names<-,timeSeries-methods works both for data part and @recordIDs. 2009-05-17 wuertz * inst/unitTests/runit.TimeSeriesCoercion.R: unit tests - still to be updated as.ts * man/methods-as.Rd, man/methods-bind.Rd, man/timeSeries.Rd: man pages updated * NAMESPACE: namespace adapted * NAMESPACE: * R/AllClass.R, R/AllGeneric.R, R/base-Extract.R, R/base-apply.R, R/base-attach.R, R/base-cbind.R, R/base-colCumsums.R, R/base-colSums.R, R/base-comment.R, R/base-diff.R, R/base-dim.R, R/base-merge.R, R/base-rank.R, R/base-rev.R, R/base-rowCumsums.R, R/base-sample.R, R/base-scale.R, R/base-sort.R, R/base-start.R, R/base-subset.R, R/fin-align.R, R/fin-cumulated.R, R/fin-daily.R, R/fin-drawdowns.R, R/fin-durations.R, R/fin-monthly.R, R/fin-orderColnames.R, R/fin-orderStatistics.R, R/fin-periodical.R, R/fin-returns.R, R/fin-smooth.R, R/fin-splits.R, R/fin-spreads.R, R/fin-turnpoints.R, R/graphics-plot.R, R/methods-Ops.R, R/methods-as.R, R/methods-is.R, R/methods-show.R, R/old2new.R, R/stats-aggregate.R, R/stats-lag.R, R/stats-model.frame.R, R/stats-na.omit.R, R/stats-window.R, R/timeSeries-description.R, R/timeSeries-dummy.R, R/timeSeries-finCenter.R, R/timeSeries-getDataPart.R, R/timeSeries-isOHLC.R, R/timeSeries-isPeriod.R, R/timeSeries-isUnivariate.R, R/timeSeries-readSeries.R, R/timeSeries-series.R, R/timeSeries-signalCounts.R, R/timeSeries-time.R, R/timeSeries.R, R/utils-head.R, R/utils-str.R, R/zzz.R: NEW FILE ORDERING CHECKED IN ... * R/AllClass.R, R/AllGeneric.R, R/colCum.R, R/colStats.R, R/cumulated.R, R/daily.R, R/description.R, R/drawdowns.R, R/dummy.R, R/durations.R, R/is.R, R/isUnivariate.R, R/methods-DataPart.R, R/methods-aggregate.R, R/methods-align.R, R/methods-apply.R, R/methods-as.R, R/methods-attach.R, R/methods-bind.R, R/methods-comment.R, R/methods-dim.R, R/methods-finCenter.R, R/methods-head.R, R/methods-lag.R, R/methods-mathOps.R, R/methods-merge.R, R/methods-na.R, R/methods-outlier.R, R/methods-plot.R, R/methods-returns.R, R/methods-rowCum.R, R/methods-series.R, R/methods-show.R, R/methods-str.R, R/methods-subset.R, R/methods-tail.R, R/methods-window.R, R/model.frame.R, R/monthly.R, R/old2new.R, R/order.R, R/orderStatistics.R, R/periodical.R, R/rank.R, R/readSeries.R, R/signalCounts.R, R/spreads.R, R/time.R, R/timeSeries.R, R/turnpoints.R, R/zzz.R: 2009-05-07 wuertz * R/methods-show.R: .print.timeSeries missing column names fixed on "h" style can now also handle "%Q" format for quarterly data * R/methods-plot.R: .plotTimeSeries can now handle different colors and plot symbols for multivariate series 2009-04-19 chalabi * DESCRIPTION: added explicit version number in Depends field for key packages * R/methods-aggregate.R: fixed colnames in aggregate,timeSeries-method * R/AllClass.R: initialize,timeSeries-method checks object with validObject * R/colStats.R: added colMeans and colSums,timeSeries-method because default function is unefficient with large timeSeries objects. 2009-04-02 chalabi * NAMESPACE: updated NAMESPACE * DESCRIPTION: more explicit depends and suggests field in DESC file. 2009-04-01 chalabi * DESCRIPTION: updated DESC file 2009-03-31 chalabi * R/AllClass.R, R/is.R, R/methods-DataPart.R: small changes to make timeSeries work with R-2.7.0. 2009-03-30 chalabi * man/data.Rd: added MSFT (timeSeries version of mstf.dat) in data folder. * NAMESPACE, R/AllClass.R, R/zzz.R: define S4 class 'difftime' with 'setOldClass()'. We will keep it until 'methods' pkg will define it alongside the other old 'base' classes. * R/methods-mathOps.R, R/timeSeries.R, inst/unitTests/runit.mathOps.R, inst/unitTests/runit.timeSeries.R, man/methods-mathOps.Rd: added explicit methods for Ops with 'ts' and 'timeSeries' arguments. 2009-03-25 chalabi * data/MSFT.rda: added timeSeries version of msft.dat dataset 2009-03-19 chalabi * R/is.R, R/methods-aggregate.R, R/methods-as.R, R/methods-bind.R, R/methods-dim.R, R/methods-head.R, R/methods-lag.R, R/methods-mathOps.R, R/methods-merge.R, R/methods-na.R, R/methods-plot.R, R/methods-str.R, R/methods-tail.R, R/methods-window.R, R/model.frame.R, R/time.R, man/lag.Rd, man/methods-aggregate.Rd, man/methods-as.Rd, man/methods-bind.Rd, man/methods-mathOps.Rd, man/methods-na.Rd, man/methods-subset.Rd, man/time.Rd: 'base' generics have now S3 and S4 methods. S3 methods are used because 'UseMethod' does not dispatch S4 methods in 'base' functions. For example 'base' functions starting with something like 'as.list' would failed without the S3 method. * R/old2new.R: added functions to convert old timeSeries format to new class 'timeSeries' * R/methods-subset.R, R/time.R, R/timeSeries.R: @positions is numeric and makes timeSeries object much faster. * R/methods-show.R, R/zzz.R: added getRmetricsOptions("max.print") * R/methods-bind.R, R/methods-merge.R: new implementation of [cb]bind and merge functions * R/is.R: added function is.signalSeries * R/methods-tail.R: optimized tail for large timeSeries * R/methods-as.R, man/methods-as.Rd: new as.list.timeSeries S3 methods. This means that functions like sapply and lapply can now work with timeSeries objects. * R/methods-bind.R, man/methods-bind.Rd: new cbind and rbind implementation in S3 method since methods:::bind_activation might create problems. Names of arguments are now supported. * R/methods-series.R: series<-,matrix-method uses now the new timeSeires() methods. * R/methods-as.R: new implementation of as.timeSeries.data.frame. Should has the same features as the previous implementation. * R/daily.R, R/methods-dim.R: improved handling of colnames and unit. functions like var() should now returns with the appropriate colnames. * R/AllClass.R, R/AllGeneric.R, R/timeSeries.R, man/timeSeries.Rd: timeSeries() is now a generic function with methods. timeSeries() should now take advantage of new implementation of timeDate() and should be faster in creating new timeSeries objects. * R/methods-subset.R: added $,timeSeries method with auto-completion of column names * NAMESPACE, R/methods-dim.R: added name,timeSeries method which return the column names 2009-02-04 chalabi * ChangeLog: * inst/NEWS: * DESCRIPTION: updated version number 2009-01-29 chalabi * R/methods-aggregate.R, man/methods-aggregate.Rd: improved aggregate,timeSeries-method 2009-01-28 chalabi * R/methods-plot.R: small changed in plot,timeSeries to avoid warning when dealing with signal series * R/methods-subset.R: timeSeries()[''] now returns a nuermic(NA) instead of logical(NA) * inst/unitTests/runit.subset.R: added RUnit test with subsetting 2009-01-12 chalabi * man/apply.Rd: fixed warning with new Rd parser * R/AllClass.R: use getDataPart method * R/is.R: use getDataPart method * R/methods-as.R: change as.matrix to use the getDatPart method * R/methods-subset.R: improved speed of sub-setting and sub-assignment and fixed problem when sub-setting with character argument without comma. * R/methods-dim.R, R/methods-head.R, R/methods-show.R, R/methods-tail.R: faster method * R/methods-bind.R: fixed colnames problem with c,rbind * NAMESPACE, R/methods-DataPart.R: added getDataPart,timeSeries method 2009-01-11 wuertz * R/align.R: old align.R script removed * R/methods-align.R: align established as method filename renamed 2009-01-07 wuertz * NAMESPACE, R/align.R, inst/unitTests/runit.aggregate.R, inst/unitTests/runit.subset.R, man/methods-align.Rd: unit tests which failed from the change 2008 to 2009 repaired, function align added the same as .align.timeSeries and documented, added to namespace 2009-01-06 wuertz * R/methods-aggregate.R: example modified was not working for 2009 * R/methods-lag.R: example modified timeSeries/data/0000755000176000001440000000000013612573075013335 5ustar ripleyuserstimeSeries/data/MSFT.rda0000644000176000001440000001172611731630620014573 0ustar ripleyusers[y|EC`#("DAB@}D I $; ("*(A>tՍ ̷~1ێikٚښFlk?ؚڄQ&:ݿQR!AzAwSStFF|_d?'uyx lq\F&4)WRIA^>6Sgf,ٚcq|F9zSKhwq=܌_au]<̋];z&BS&0 Ql&Ǹ8:fs\.J7R=A:ˈvݯ~{c~WW_^2.~=*:Έ~wuоCnՔ{S㸘'u7SMM磒yqOv{.*7rH}wKܯvK}{ne=vFѶfFr2ɼB]Ͱ9'^~ )oO pxٌq}%mӮp$;o ?~@*'!ltE so\b<1=z3nxf'Fq78q|q?9HM~hTs^?F Mx3F_?ߌZ ovVq38?n}|f|Bi[yb|+|e؇g%+I<=w6"~v;,p8'7 ;_YIo~ǔ#̛uӏ砋~< ]_ӏ3 U%&0O_"pRZ?y9Cyh&W^~;ʟGXgymr @e+!uP^}/8'.t>y*O[2/êկu(HQ':^u>yZ:;^ޝR9%Ƿ6q KC]aM3_|3۵rOJ8AI\2XK3QS=~'p>Nu wKF?O/yDi[MѸ7(_4;R^RMAѪ[w%Ѵ{G>|a9/zq8ת9}US7 uGzJ㺩yNyXxYy[?o黉A}'XO~8 6GGSf?"CϪ?GQ~d~#`q̋}!dwO3YGҟ̏U6W&+OWEԧ{73QxΛ_:z>ާx Wq<} %`jL%rY:">]{O:Y2V}#bse3.{0;۽Sw2~{%׺1z7}x_?uo /!nKEG~໡ikf*V)n1 4#xgzp +<Ͷ߂`ƫ Ggj5=_y_y~[S`?띝47/ yYTާL&g_uUNOd}~&O=NjOs d7ux2_l@W Cw^`{aы-?_~)5ee/mG`!&Sv|PY}~^!OHm}m2yiE_QUdOIDWbKү2@v y3O[E[4DpUJ$5Fɸ=2^a&䫨Py(dC7_}0{e<q"~e%Co5WTkEM --i/ܛ+z_ijwW~Mu|Ku_K³D.J+X_jϻe>so7UO>wn+ڌ]_aXU_%^rȜ8?I'EmkE.='mDpeEgI{?ܜn;E}a-^u|Vܫ|-y){Hn_yW,,h5]Kc-NmlX^9֥`=нW/\҆= Y߲ /bE/t3AXߝ$_c.,xث @<8E8Ἄ7$yɞ1\䜸~_t|:bs-ddxc6=Ee!g^6SmJ .Xm`)Ez,?\n;nTYXmggG׼7W܄q~/g8-ol"2j?ChGOW]S+Oa_wdf~[eP9Q[E5뜰o?sg` Iy"SG٨㒷J{Y*Ci.Sߒ#QolW]S.ofNNj=Kɾ7p&L?.kiKoiwGiϓFg&Si9:=5{zr6)Y)iaBL]IGq62OUC?}W!3eg|ݿ ?s7@?>_?~-AJKa0>h{PAalzzЛKb-V@om>f m(sˁpQߕ;cpa_)5;ޭn/Cv[E{z {`d]v}ܟ׿3܃󀿥7췾 98!7׷o@:큿|~OS<}Bt<$` #5cqM~ |"Y f\ tot_O}@g]L~TG>ou)8c}|ǝ~<10##?r z2>;'>y>'~J @Oz! k) \z߄}3g>sY`Y^s6?`c? '`/^x'¯/x~l.7_kOp~&dew*n.p*EQ\(X-/}zhk_ OC_ᆾ,+*C_kfpگa_29 h&ೠ,xE'$C0Q_afBvK~/WW@a~kDpg7n*[`~o/~CߏkupM(_ յ`L ~3~o[Cmӈ[NI9=)̰QںCLgr >%mDrZV̈"3'Ϝ ]!u/CHKחHc9FIYIL _hl#dd&Gt8*ezr)ə&Oʊ~r )-+)|!ΰ6eHBn5]I%MQzmPeS`n~1timeSeries/data/LPP2005REC.rda0000644000176000001440000006540111731630620015315 0ustar ripleyuserse\U?tH(9@P *b'!((* a﹟\kwskk >,$IHHHnۺl )vLR\\B[t= :j0고OAXwoz҇鮆 uBy~-s*z7dB<#T-9'&oAzVIj־+Ua@֔0 vG9TapMi3ᑓ $wց${Q1]:4wR? Z{LwGуAҨ^x# Ela zL^AXr4~پl/n]ywq'N cG&\`;z0X;X:/{]S :efl TYؒ$wE~({&[ U~TpC ' d^J<~)MP~uH q@KjWEo IN`p?+K'~t6(vE= w<@ͅCB;0bC9[.h-%yw{$)\SbU4!VUS4/ t&}i˥[O;Q7tg}[#9~UMk0d\v2F uz ڼIyE}D2FЏo;5owlx3p'Qk2QsN*;q閏E&EyaB\Ҿܟ۸Q+Wf3ɋuO~pퟯX2Yvm4`D̯3G>CzQ;OU-wbL3E=Rrh&/3#F%}hk&irk C>Y3&6,>U];rZ_bnlNMeApkn ~khmzNc ?3^P*ʸv S dыωdp*_|qh`H~<ҝhbN1NLJ%}Ct 50IY͓Dwuw dNr%lcY| t~|s L$p*o]N62QG;Pj\/tlj|@yͬv`ݢy=ӏ;0XhAt笞z 6U1T,ݠE.?#iL<uWAsN{t7ZϺ`L RFTMzq,ҟN-@XWB;U=YT6G֮}n]ϏGv /uϟn±ZTϦG{Nz/Y=lg;yi\DVi91tXc|/Oyokҗqxxt3yPZeWL(2V~:X -YstKbI0Fûhq|he=~c`4 oPw1|Ni5{t"\K PgD_+UǴ/ރŒPm߾?ҹyjy TL>ӶmihnwNU1;ECGG:pL;mt <9|GY8A~ڍauB(+'~śQ,0@H7~,?:ƈV\iؼ]2h{+^g!;[ j3oDyam6zE/Z[~4ܓҬA'\8 o3 8vLuIK;EȦ[UZc4LhC\~COVg'n)yz7FGXPͪәEϳQdMEFH'}v_ 3 YyQa6B4( |QF\z`먕YrKTͨsxw7Jg^ǣE_CE8`"=gA^r)d[تnoD;:z-Omʘ9x\_'+aa6|)(q |: I_HMD̜!^{#bP%W_BI}-FF}LL~AtSX>w˩;)G ʧzN3ܻ᭖R{1aɞYaLs?OcØuR ͻ.`~ʷi? Y&p뺯ưfc8H18Sr"S7GVfli+{KփɻlWB rf|qдWAg9tg"?= n |7'W:{|FraE:X~BuR;)mr݀d4d=Ʈ`fCKv?ɓeOefQ֜l:`MU BҒDQ>4ǸM}'EivxĐz=t*|Kԇ⶙97MeeWG yp4{xíD;?cϼ!߅b|2Ҿ^ͫJ/=diך_c? 6TN5+>OQm{=F^ƨ< oqLU8>ӤVbmuߑ '7FqM"[>I׿4Тw[w%I:DV]-T{{+%_@QlRmB̬V y|Nh069]UuAqz7wppW/As?أ.B*sfNHh~-i,޸IK̋^_z:M۾rJ&u!z:uE!f?K/L/ X\7Eoֺb [,#.H<-(C_2ǂi%30],)(BbN%8zS̎z&Ӧ7@IÑ\'U97!8"*'O=[m;1*(Sv>BH6H. |N/tڣą7෠l{G2|+"_y只"2Ўr"]n5^WBL٫W.럌kqcC'j)}m/Y{[ rSEgrXzHu!tp,0z+ m0N`5SLSJnlS\j볼cijtvw~/bLx1> Qkœ/yW6(c!d9U&>}];byv 74@1 uv %:(SC| S:~8D Yʶjk^C D'>B8~0yUDpϳ&ߙ@ʸ-ɻܧW~zdf'  `̋f#ڱ}ҥHjC[󴫫K.ǜ/Wt 8ll5# = j_1B>\/=Z4ZK]L+Cfgj;l \Y۟ssQ6PB",P]lVƓ1_ЀCw |uCH8#=yZ=&ľm{ έ2{& eY*= xZY MFZ: tfǠoaշѺ!̋ 4C7ڨS<ߚ̋Uz E8%]?yA{@z:YϦ1u˽*V>E`n+Rdw /9{l,@8_2ɢ>}G_˱)k5w#dyLE:1 j?mcl-\Ks!*b 'ӟبEݥ$3@F(mbXʣ2"vMt2 ުk8WЕK>=]s-UqAQ_{w cرfarhdE^ZDt0,Z2nApzqIt1X^KeeDEa\ X9&^;}vNt+hvr: ^g7ZZ∘k = hI,5,5_f*{F,ӿb?;UحuE`P2hzc bQ1,)W j\N@mߡ֠}Oɚj;DF vr%ۀzJ] !}7J3M{{׮*C/pX/SGHbj,?5GD#.cM݊E-oU$t 5?dGpBe}z   MC$cq;9|ag :KvRߎ4^@Vs}4|r'x{~ܵ;R]Ͻ O”)PlDyrN̡N sb*[g܅~hOZҟV}wroBpYϕ-n ArCOpׯxN,zĦVh~[P)X1\ s;]ŽWR{Da˞&M>4{9,uǣ~4MꡞchSrq[ ZYSQs|ΕU؞8_}a־JE*(^Ɛ 3+&vuhS<=VRګPսw-!@^`K1WG)^*t4^`MxLj0p*Q!UKķ;缡zi JL6QKﱡ+>v}W6l$U>y 5`&O15֪#UݾïwФ7][_فq&@!׍:vn~Yк(n(7<G5mKh_?zX ,JB{zI"@+%%ѺC%* ~@ :QqX2ԉMKI rBFsb=\7:1VEkPm#J1&а7/ƈa$G3hmTc u]H  oQpC]4 re4^%1gͯtnc4HG0lTZT^:!< -ͭDn׳AOv]{^_&|j+Bw:t2-i4tl~4U- `0L|.m@}wg%TUEs_-=19F-0ÂΙT{A}BN ɖB"h}3գoHfݣF#ʝ ۲LF3zD٣pxt1Md+Um9 PeZ>iYE2|7f!Ə %.Ġ2I" ğUǺ̷`t@Ҹuһi!q”`{pPف_{^тψ\@wä4Qzy׬;N#6ahu%s681N$X`hB=gz~هj%ߏEC+f?kR}r.i=BB {nVn=xF76QZེPʂV.E/;e)fv9>P;vQBkG'ɻ'P[_ qH|HB_y<3>+11W@F*ց [bdw`eۏy>`%&Az֒e17)HJ]t;Skq/ҹ}fO56%(yh)hUɽm@ ;yT=.hI<']8{/| F,D&Rt`| Ww51^=O!PػY1I-97!E i%tϟ;`wr<;"o_ ԋph5t}Kt(|[| e^}EztTGȐỘw䶷2D^s^M@D~}{a;U^>J>ǾtkSPm=nrgTFs _cgg2|e8GV>YP_h%'u::(/g߲ 2#[/<4}ύso+ bn>.m82fV] Qs3pBw@g!t>^F jч 6$YM}Ԭ:, Ϻ!7rt.mڪ/Zj~v&i\Vugz@fVLt<+ЭF 7 m=#3пr8 ׊.KX)tW:{;g0Z(4l׊M’|t7t9*[n_8 3kɇ#m6$#icrP^w>ܫn%Й3)bp2ͯB?8hVG~lV=t2qQ^ùك̠<ό#_DLjHvVu:*{3XTKϟWm[[<_ЎӨeB7y%WhNn-/nVsɫۮLy)cV]"EwU߂)2E4SyNg@3vO88jЂ`BxzdxQEd:ZWyZp8e_#ՔA_J1#Cm{7eo롐A|dOerX%suʖ|3EGTЅ4߷mK=Z4.Ui*߲(b(Wtԉ;): ʏBoweu0N+# EN* -oT봏 OY;! O=JC G|tғ:ϳ\"qfh"XLsJ ]M> 0^ Zgy|Dz( }&vSYU sDg?}maG=eu}bA |]JsXU=B]3В^Ե;h#xr.m)B0累IA9}H 0vTuNxpVo.X֜Z8S<γw\)wQ6{xV|a`@ouБ A@Pԭ3|EFZKVH-YxZ{)R3$eb0h>2 c N"hQE J ʂʋkVe︦'Z< *K~TNܪ>i1ԐS3u3 ,%њZ}sV gB/vΥQ>Z~m}g^QQmOf d%@>[AXh>? l'"#ױI4{ ݶ=M)cݪ}a@1as\@[Gr.O硿`-i"hzwvWT-L6HENQfUa }!Q ]8ϷGPn:Zт!;xpl'\O7=rͻ}C"y{G)Q):YcKp341N ?ɲQuثψs>w;`u_EFbGe|^9|jN])( E |U? mg--H4dK|}*5X8̕w;|=r*+h>N}3NEYWj\nO>mf]Y#I=)ַJr w.qҟΖAv1Cy-H&)V Lujp165iJ( eW5^wJ]rB;3%4] Z;m#ĪHTI).Yʈݸ .g ֳ<^gjycڵsҭشD# vfNԶX&[ۥvW:ۃ38݋ݗzd _V{#s|?y{|Ijot7s$iP>RdCfg`܏3J`=~>L{Fibcchf9g~""scSʣgn)l>Vbc#,h+_{xUoѭLb/D*D O;Yl?}/Q=4Rs:xp ,=vk)f-sGcxU!?\M#hW!5Pʜ]%$n~I^_ފ)h/O¨ #'}U]8sY WHaY~8v9⋾m2*Rs5HtdM*s-G #yWqZHmjZ!5 O?$ڍ' %w1T0rded&/Eeو1ƥ ~_S>s>q7)l긜\Vn.~)̌~Џ] DK/εRô {ʮӧ|OE T{<:i>?8LJOBzDkGߝLЅ`,R/ xv$CPǗ)P[;R;Xv3³uJ!;-ƸRF_ x)A޼8Џdg\έ,=Q]iwF1PՎ9x'g}G^a.6zU= 4?y*ިթJσѢaO鯃X1VNES~yK3{!{vύ]됤حԋΦ37?ABZ#t9Z1AoFz_r[Kn,sc", t?3"wn?_s1wÎܴr >/x<{ӞQM>C v{.45gd;#xY H>|)iONALVGn;ې ^/k %1̻\oQDWI3 kXd:)-]o$cOͰ&t).q~^KiC3#KMW -ڕY$/ATƕ;NBf',H =`|')g~L[wNVkJH>?*HO"o@^~syau_)K\L_!Tt$7 ^,YYns+Yz+Ç46 ;hi6[8^GZP6j8U/.U=vܩkU% me ҿeJ1LJIJU=H?t[3bH?ܩv:v=::J52(kۺXt.aF`9Ms )ӻf*:N@h>l,@Fw㆟n;j)x1B? 'vIslv.49ft" 3w^1/D%만v=[X0XUznQazL ~+_+.A0Q+@n`ldǃjqjt?؞5]<ɘbtC0- Cރk)F(~CJ3Y[|D7Nu :K؆ :yB|ࢡw9&nzοk!n)=di`? 3kk``(D{RM\{7NՁwoz Ko#^3ւX /?~6F>gTfZt4xu` ~Y0]o/\02]+iѫ0_GKG'͝4o  DdA+\(E[jm~ϡ^dEnČYckǐ)q?0'j/^*7ـ/IGK՚vH?0SrƂKo JMR³C|JTЊ+ש1XF"xl9^qq֣ y-(ORQz^u/*_7MTuz$5QCHw^2FEyk6Uy t{Zv`MfSFixqQaZE&?-L])HG XU6i/|@6ڛ2svY3?LFэAG%vb꒐!0_XI UV˘i.dH k|#u0ÓjB*$L& 7 |Xإ: [4oCʰ28l/+Oޕ}1 $ ^J~BTe%=3r;St./d<,{n5^=}]aE=sR,/,2g?E7$P~Jʫ Ðk+m6pLE[dbC)x'u x"O;\9B?Ok}1-@{I{Oڥ}i70%iILpG,3 jbz~}Ldb+gb:ܰa2+xFRv(DJڭga'=*F-9 ; z qie׼3cT#qף옒 ņĝ1/1,Cھ4ՋSunE>x7ɼ?qNK4eCg fUH*٪^׼]?3X ]uZ&~@}w*̈́K?=7e8l7e{DMチmj+ܼ_zRyH`u2a{I “ӣ\hs) FjEó+oqr$&@$o@jwʘ|A䋭Q޼~5D~!8S~Ig"ssu#ցy %*ߤ QKZb̅z߄k]ֺO^ VԀ7[}+ɰޏKh 2ڤF#fR+~z̬H_@⢉!\;+n͝F} {ѧ鳏 nϏ2 ˣmZ'|΀Ȃ֧ak;hchҒ{H^w Vin>7P{ ?ZꈓY9Kc wy&Lb%;3z/glYWJߚ;*-~2J,,.ϗ'jd_玧v|/!N g1擾j|t-Z˯q~~ ;^og&'UBa%o1CAC8e֋4 ×6lw -QnS q*1_XѴo4sgoe>[(]&[BveL!U-Lk9+WqB7,%;q?:YQA{˭'FsjеMfF?}93͙QW?R _G:Qr`,?=x=]sSujpUB{*DgdB:<}45X6aPź)>$0sAi1Eɏ[$ڂAJ@L8zqXƑޏj h4(l\LQߚfb\z,o 7+3lmߖM7nي+iE.z)Z7 iҁ39W\g{ B^a:hm؂8X4e2Ideu߸ 5__ h!!`}*8 /(R>.}\Yu2fSGn~vVYTu gfȌ_p-X}^V@CO 87.̟B[܇w^慽^`jAw7jiBi=x\C{qb( QEed+ZB_y4:|X:Dˏ.#R7 31qR tԞ3V[C&`I-0 { 4'Nb?;Uz.ǀߠV4|TdmG3/gMz^+&V.;Jг6oѳ7 fwjs*t?:mE'_ԶC˒2/CgϘ+~aWћ>dt Scb)j]PsA7fpGĠ28K-}iINEd#d?CSLwYe9!@\zwfȣ))4\i24]NI/ŵ`6k RfO\*T/B댻'r!-DG2< 7%oZԝZCڟlw\'/ǞZc1>svpLvf0~d_VOvB_Zc27LCn7T^vc;8r ]2p^è1(>/ 7;;A] %Շϫ>D;W#,A&vAatv~fAO A!7oYjtP7{{@GK j:\ 1!d4<0}o?K7>h(.E!o;{¦Z}"h|1tڇ3K]rk-sL5Ô7geiDOdM:Wՠ.S@J`YM^z 9}x0#)^ۀI_nx{z5PGfz*!e\ R'NBO<e cs!Rmco䫁33 E)(U7iZ#shC󟎝`3G\K3.8u}C{z;%BWߌޭ8oJM7+)A㢆 4ԝjo'٧` T۾j|P8 RfEsaLBϔE׺+`/#a 9ݞ-K>2A6r>_}A9/K}zP ^ܞ'^5j} >tㅽQ|ߪ/Z:^{"FF-|rv7c=M?&THY8P |˸uh5/vx 5&^yB Ӊu= #rVMJ r 렁A8^Z|COj%~+ CIs k(ptg n}C}%ѦMoz$i;;o-eP}` #ƫԙ>6qqcPYz7$ہv?l0a(@?zf5ai{1tI&wliВ8cG!6vxolŭ:CA'9!D7P*K qy545 '||{=?&Fohi;m-܌T|;EBpWi)QtV(su~)_v=wiaܚ N9 fIVmv? OIۑC+O@CfUdCIF\ gTNDkW;;N]Гڒ9 dR?fיɅjY(A&p џOr0<hkD^]ӈʲH]0w}/CP~15pA=OwcsXF V;&@́t1 I?<vCŎ7nr:p'Ds+Q7֧.k$8[|U!J 4uwOXIAX}Fe*S,Bs0PA.ڏ,`=*~ j8g(jJ ^qpoYsۦͭ0{?M9tIR鯺Ws" zon qu4?N_ă|u_HOkb#[*W J^P54x9P6MaƄs,`oTbg)٠% Aj^jeЖ=D;o0y!(9V|ߘ%˻FO%QD܇_dFm(BKkM=ѬF3|iY gN&'ÔC& ^{@/IDuW *#l ]~)sG9х߃Vj{L~aog#/a ʯ_bV)dzr쩝Y0H1 էrc栬5DIhKŦR&okatCiK n~aJ$no} ֧߀=hYb٬NPmP1%FFgZݶS0TxSfL i1gn局^gg5']$a谔;f ӥ|^$DϦ:wjznC.,Z?TSэ^щpTlh͕&Fҥ9`EҮݕnB<а£O rh> S[EnlO 0Y^~ Cw>#"0iiE44KVTv\ΧtN|Hi iZPG{ZPr@_,_eA&#lN<,Z}4j@p媴&9]lpAl\ ^GWdL9^0N~i$+2d jy ᑊVtT yE ;1,WNT~},T' x;*0=6H{Jܵ8ۊg}/҄d0cM/ ~H&:D 5 xT+{ImCP5u`~ #-"\g!"2I{:p/U#K7{*zz˸UO $C>DIeyIB t/ -g'%d*^eNR-LࢯXU98m! ֧;o:j`T}r75m^U;Odnh6.r&|VP0W7nQYQOdem%_ %ɂ e3aºn]y R #WLfr$ɛAzn7"(/#_uO=qp(V\(:K;pA7ʲhlNzENG.g\}C btCT(yxQevP,(}Aw&*?CUxӧ(fT]y&VozBD޽{n?:Is2+TRuV/{OҙsOol m6ͽQȧ57]?g]!boF|/ɏFY{U4ofWB(M׌.0N8 Y]Cy XdxѺ0B_eQ`9GIqз֠]]uiXƮc) C+bϢzhOVړ4w}ڏ8ϞQh൏?:>c7u@z:Tzz90LJot*(SZ)y; ގfwNf){qiiZ)5^\u{%V1zș#nޖ-ޞ KWȿSi'}T{AO|;^A{9 BNǍ[E@j 8\X 7RUAu08X?JXP @M3v%3`Gn[W־N@lioJ .{0I\O|dVAdt.(nKBt&%4eܿ+? v=XcaUJ쭶kpFv2yt~_.f.btIց v{]s&<Na W?=z.M^+pOC~hvǰ}f瞂c(o|cy  } `8m8}]{ U;y!Pg*Ĵ.iD|`"ܔN*XXW{qIʐaVRtbixƧ@k1&[h|:T:X PkMf,覼gTpC(ݛhE:e\BdN`z$ KO1B_Ũ-`jX xl4q҄& c>,_ [eH9RWp|}z'0Fd]O k \3#ˀP;XQn=Y{iF l+A!c,`GnӀ+wh +6bN\rt=Qڤ U“yGAڵ/(jP .::v:}AѰk(^^<MTk]Xnm_i}yxU-FɎß!Su&Dxk.;b hܸSe(>@DG#:1]iS.osϾ^Gnvcě y5s& ZU_ .2_%ytK?'\ـwΐ^ҳzYw"Ft>o)J-xnkiQzIz1}Hfӄ. lp[y톱LNg/@"UW -KjG J?A94Z(t˟֖EZUupxjIݘ_XG\BX$"*>2@*$ !ֿ|_h kl`հFU5MbgmS@mg>mmr5k`{%`-dh/?,+[QGuegkW[zg~no7c${U ;†0zYHй8tBRY+ϛ}6] mmm'stt _1m7}AR^ʤ ߔCK 㐗[;)`sCjT\sjwtČs>} Z6V]2g @oJ|= }wD_r Z+M0ƚ5jB\Dc3"l`Q"JG4 TϛVr ai | Fln^hV-ڀby Tz|*B'FA0nm<ʈ,+~2߹Qr(S ~4sz@%Țw4&Fބcq౗5Vj]}n2KZC{9S ͢>ͧ#W!(xvCoc]/.Z ry;D~q&Hezy o%CrKQssl* 7}HZ좇# `#q-< t8QG]68>v(F#p=iתK ORuKS8ׄ˃Es lAnZn1p5)FG20y#RsM$pDmn@ޟߠo\tv~GaS#tSkT"W ~SG4{Oȧ &<=ӱ.~D>M30 ݄g$w~+wD>=ᙯ,6g$YϺFx6s³#<{ϾHxCs&<#9 y[{SF=S߫LWDDr_@ 5BsK;@<|4"< y ϗ@ Lx~"_p/ /Kx!N C,?OC>D''E^"3Z /ۈ| [K\"$ %/eAK'_K^2De /[Cx߄!5 /_Ixi+^QWRw%0"w »UwM"3»-1D#{'G$= Ex`{#7}|?$/#} Auޟo#|@+HN@{^!|6`+7>x!5!CD0C‡&|x5>GmG$|/G Qe"| c"|"|c GǍ>^ل@D~A'> O''>y)_J>{`>n tC4C#kmVm#=C#Zm$7<=:&UDh_[{GFnP{GDlmuo7 M,##L==k3:PୣvWC_sXEsGrIqI)J)JpI+?z{GW Eg(9K:d{Ѝ^+ytimeSeries/data/USDCHF.rda0000644000176000001440000042737011731630620015004 0ustar ripleyusers7zXZi"6!Xށ])TW"nRʟXl΀8[ p 5*j㫪i8-=.@o -sIJɬ\֥-GAe3С6>B0, `;(%/Ņg:J w?t?<_] WK{wwtWvEu, kz^!E+_kM^'iަ\(],j O2 +L$3k!YYąD@CQ}ވvPT\hj`\GBg  äJKZ۠qcozR3/J7$H[et~'Vo/-n<*Dlmt{GC m}KDB,Wѫ ЦN!\/HhDMWE,udF/?:4 z z#L O!T&zgj]\_cJEJ$Ua?\&bx*{`bC>] YS'?Qjxdfض C.`RPڞ;1aS*#,8WxbPMV]T`֝她}bS7M#,0|X8>EFE-Ͷ4L8=^ʔMU߷}#"_+Hm?&aHo ϼp6 K[<7*%uOD X3v ^RY*Xk|#Ƭ=OO"S,O{9~.4Oa Nk mFL\ m R0.. 5ƪabm.A(9ubӀljuJ¾WBԵi8_uƎ]f})U53lc@l.K\0 7(R:əP{^ g(8k~s:N6e}f,Xپ4r23rYFD-gYyA- D[!l"2]R-AX:;W=%W>;弅Y+ i|OG3d^;V^{({EG3%2!o~sV`aS:ц.Bty]:+;M5M]FbZΉ`5&vNbEP{ԏhyN%1`"!u}>M6 s1GԴpiwќM+d_:w4WyFֹvCT.pϊe!g,6;~gW}Ir`E2Jf =N 5ƪm08'ٳKR+3Gn\¶%lϓ#DhC9xo;JLW|MNbbK~-IГB7R1X y~͉2~B~7#%EX-~DFeø,׾Ǜ ͆{4xj:KqAb;kmVWµkuĐ8.:{jJ/!Su7*BEpuY48CnZc&RCdAŽ<|~2ʖ;4y^zЪ7'( _煊PphB9Ԁ J"S"CPwzΣQvJW>"m]m8->d-Dׅk3BmbCq0+ōk֛!1yA!b;0]آD) 4D& 4x^4xVğPZ7$Fv&iEp!mB 9vaBclP.[Oe`R-m"jCv_&,n}Nb:!qjj5@)+̚og/ƒ)X2CrꑋS0G}@mܐq!~ضH,,=]u4d>KOwp"YA'<ǥ Eu=]K(.q,HMfM}<a3C0*ֈ^Uhߵ &БHQdkGgo+n⃋(WEz/^zRWk?{ j%+hꢣƒj7 K&glqvX>!|jq)!|d@ljd&iCF'.gbĿ/\+I&= w@v'G~߲s,=Ca?Rx(r)0 m5pN !LZs&0 hbF?6XY 8 {}LP`ESJ9 gB1*DSypgA*]Įqcz["E}¶#yve (9^4:8w]4Tl!$@ƿ6Q^}G{$')ku?*)5Sa9tz;RS҂uX0U>r*؟'Z{%7*m[s+};Uy$JLCψzモX "U>#;#j+=<~UEɓO\}qL}sXm!҇:Qvۮ F(EmE1xBA(qoYô3% SGpO}qN8F(p{Z,f3Do;uݢ}gsf5ˁ@EuAntS| ½O6(DyޚMYj@ Ƀ#=Jp:&[4-; uϕte G [(86=`W u?*tg l^4&1#`s>*4;GWb {F'q5fP3iJ~wBO! vZ\ ra>.EaX"U'SlY-H{\SbL"럍iC}+ }K3,PeD3be>6PǦf]\IXl*B\&)kUZ3(~ ^Sr901" ,ܒg6z1"4~at{dXxDc=g^6Kjo|7{-rJ5NGoQ $^m 6|X獾`͈: ;sq0.jIޤB |ddgܳD =sYscUC~D\,bҶˑ "VL%񙙘0 ){X!paasO89ߌϰ/#PF,{ʕYqhvBA|sQ%$*qTM`oDz5[L6sS`de&X7i9Q0?mvfXP" OxsScl.Ai$A!uwwY^ O0?>j%9VkJ_*ll U^h8&_ڂZhBKEBfT-4'TԣTY5+㲭q)p 縦2V!G_Yҹ@ j_ol(['0$vmI{3[vd`|VW!~R&f%Ʌ54I[$+RYt}cm;m&7ÕcyL%g)$[9T˕ke 9Z`ux%$dBIP])?ddaB2F-֠uDW'XtQݻtŊ[l2|{%.+Yv  f;9iV Wadx.a2?Rۗkyãyq"<0ӀtAۥ,Rx21~2RR- ,bjLlYuc#Vzkr)ʉǫKlnh &>1..T ZDY}^#R c,^MuGcbm#AXڣ!xr;&hOg싗$?ȕ!)N酣yŲd:Aʪl YW#군-\>~c$%,7Ťc1ĬEݵݽ,'!gn%9̪#TT\cI)f8\$y~N0űP,)ܴ:O9 5&̅gV3tsZoS;cv @ĩ.:ۜ~׎xg & e:JI^@i!ZfGzU** o`BE?Ϫo3)4y4"}u= Hݱ0dB]?> lch,6mC[v}t_[Z#"oOx5RnOux"CW*Z&rB%JFK7E[>/ i։fvb{¶O&o@Q+{YCa^)}UzR^ M[]W eqbbyY9uYCl\BwM,x3 ȀXt]ZaA~$9)NE>)&Ynk2KdW3l%Aڌ_Ql;weNAC(!m }uMX3軂8R K^BT]ul.` )\RA% ~K4d玬TrN<O,6Z,ZmV*LX- Gk7QԳzX+TB#r=1ڜ$Ɔ~9hLȁc]X%w@֏x1PG^Mӟ(G쵑}wSgVCHlz7p 0Ҥ?)@I9Ii|Zg-I :9d(>.v!mO}xyzD9,":Xu3@ߤs .ҟ$쓷/3.e r 3m˷b؏U앸x.9y dj^!燩*] &u?fx|[#_hU)Uro/KhD7dvh̓gQ% D_SAk|!J^UkD6B>G)IvfbIpݡy;g  U1`bM$߯R)OA+RćA}CxvofMr:7hFљ3b'v+y8_ShTEj%!FVdxq^<"]f =c > v$ǕUL;SYaγ^>&(y<ټi.Ệ%SVuqdh53'@MsU:~fi2OHɠrӿY y5 ^Ǜ-bJ < ѮLʅ4y6;ȫ۾;HcBXPIporZwO>Xɾxvuݲp2]KS3[M0ʶ/[6)ZDv>RO&^V mmUPيA3MPλTkDۀhh7L6AƋ0jB[3&m)g[@.ثle*f3? Q-;YJǑw4$`5)#GOv, N"F*>_N+fkW1t!UVԁ}:⇿bd:x<9|oܔQZ$:*9h</l0/b/AE4X'Ni3V~$6dtdC!c2V^FJ tvh@]ٿ-bTbX*ڜ#G4<<|gs$g)6!Wx=w(&**L{L dg,^RuveqoG|_;аgHJ/Nɯ`tΚ_[[NJk&p6zmo?qwYW l{H֚*"v7ʺzA<\FlBM' e:gg{߮OPn(ԋ&&iڦC]#spp Ln8Q䴷VWifx:վ&KV`Vj;,e579R9I eh͙͝ꮭXa].VUF5~<bjKi!$6)kN&Y [$xd\L\ B6Ka -?u[8 \&7C8H%rQvҿ,W!niRW)D>^A͞nW.j-|5D^#fpU`Ux}F҃N٬x"'or2sTEQ`Jswz5jIGlƨ)Zl1`V5}ʙ-Y"6H pH-j|Cykr_|\kLŠئVWL)7a!^B5-= 7r]FF njM/YSA? uR2,$xذ&q}MQ%Qõ:1G*9aՅ&<0ʲ@#)¤5U@&"13jICc8p\ Z\5sx2bșGpSYǣfԴ͎PDcLp9,eWbw.NRU: 1en$^Z$Ps|A/W]Wf%eL"X[ލh,Q!_\)I2!=+g dܚA4^xD7-BpXcSN&<3᧕Z;Q+'h aoQ9ӨOM{w)ӢSON K l7#U`00y;bbLS,;brN:RK U-[,tA2܉4L"g8['+z <)-,ph4ϸ"$qn8SÙ2Y+yɢbP 6y$ 3(.*e(`a9n{hOyy:>j(dϩ0ދo q5fJYf"lûUVCDAo< ) vYc!ي,7":FuXHȃE6I1e~͟J-nKq+mLu]d6 yL)Jv-S7p"p\Υ=ft;Jq?ѵ,1q`ne}߃ȇS_XpqԶS,L@T~=yWo )H8T1C=y -b|8b6D;0x 6D4ɈȇW|Kmۓ6{G!oSq$K i]Az _t0O*OYDݣN'zǸ)1}κn>8넃Ѡ )9w؛| ZKZ:,h 3,Ck9F;RrDK]m[5zGrNؒ)]Aŧ +Ч+E;lPI#a-Ukk@S奟QH@θzAo0sϙ[iXŚWONzOƸw=qh0 ,gR =rc^k f `yrU2^A : (+B`|MX/B H_⭰-s> !ۿ&θk*#3^=̏g _8džM/Dm=~}3ѲL3NJVW3byCJtÜ|Goj-ZCm'x,rb҆l!;i_^FI :<1 S`u-%@r>7#@:*m?БR#h`*ζ+I_.YoHzүylQfIT:~.yÐd~FY Yvt@ 7R$'t<ȧH:8oF^%+U >>LˍJbYWg ?A>k.arlD%bJ3}yEQLZPcN:Ket*/q2o1 #/(U[0BŜ:Mhmj0Qז`WG>53 aU"s7<-Ls=ʷHD8-wqfXce{x/0z`>:*ySat.HPo6?l~w1SdeW!:13` i\.fyfuiųXԬ$\Mpa_3ҙ%آ.`KpSal`.: ϨJ)e^7L4 KH|A #"<̀e9YV+b==M`)5vmX;;uQ`xf#𤥉L=S \ %yU}&<{#R}7dO1]p7E* Oצ8UY Œ*60u/1H\T D }`'cpSqq6:zJy.DI[HM!ЍoP+5lx|+f*RlU?+Ҋh6/'D攡p ÿE@|2L/%@<S8h/I}Qz:@?kTIОMoɿE2d,v9kIm%]K!X{i!W3~Pdōj7y k(ujհ-*u >PpTAA=rWVw.Yǎ ܯR&7*gp Jy^mAF+4Ql9X9:Y70/sՓ׫!16Lޔ4ؼǎA5w ̄+@$+P!'.f12W T`AT&,!4ZI Py&WV8zc;- F]c{a% D}vZߑ,K xbmρUґ$N;*tL|_/єIpV#/eI_ o?{RdQ8{1x:i \~꘏mrzFmi)HpAp, #K.@` >5Y@Yt3KiZ??1,UKaA l]]CUj G1395-|\g !aSփb@ K26]cEaU /{Sjur@Ngj"_!M^aI9N/{]Q;*Y2']*Q(h4d61}k^"ǦZ]h 4:ap ;z)CdunjudCcdz5wVJBt( 6RU lq[59WM&Ѵg#EkR3?eIiCTOS̝7XdP5[V ab1=gfԧ4tzKVD of/0%M/xV:ެ4{&jZ#V8=[8yL4t= 9 u6@e'wm,=`Rn jWr uKP/kS≴Ԍ]>@}1e B]sHQ0.a|j]ޏqYo͉M **(r7Ɉk)`ƍ$WyP>'nx1;(cQ ΤP( IM" ]*ju}g7"qj= y AB 34I7`;:Oiݝ>Fy$;KRPv1wJ;?mxV엫 v<[*຦^hJGHPuXƄd kXtӟ7^:hBPz4kꈼ/7`eUb,.^yHL/?̈́Vx@6"x9s3pb"J o33ƅQ€mO-屫T)lUt9RDKJ4%MFmzwVZ+@hY?/G{.Ng !հ+$1#툌 TBrC.)0zeBx?GunՏ'K? 4] \>Xb⡅ Dɘ`"&o+! %)əXR,ߦ;9'ǷA1f 얼&nCJ ΓB]$|lud$%|V8% Q]-2Ӌ40L:׉HYFu2cz9NKA*~?s\o:w\8W ;- Wi7Q??]auRmUd-v]AiShvgaԉkjxzBhUWVD{%owv>ZOݻI.; %ffM~Jޯ[Op"(1:ݘeuT[oDce~9&<ɍ5`$'!L=wE5AtVGl9DRi9<<5ϩS8]+lv)V?U²3i?E ZQTFc&5.CztB-b9ә DzczY|ej5:%Q)ARR1s\lqk!/ Կ()~Ț-m7 S[F6^QWd^a3,IP=0-7Ա_x>yL,(ESdw'RlS$s4}LS єM)Ou}iHU+ީ%)d+#E0#@O2#r{Wކ+3Jy04*T(COC{6IC澲i3g=N:f1 1B;i*Q"!;UH˾k[N zQ,匍YRT`)LRt ٸfmhO&OfG[C]Ǘ/4nY^iuҟُSĪ%>بpIӡGxi`tN^e"w:Y b`q*,O|Tyrag*T59S8ܓڞN%٫I8yr02Ǵ tQ7j>/|O޷q,j_IO 5*MJs ؍c;cx!2`q3?_y*oHoǮ S/}vۻ޽N16l.ͫ89Uh .823.o@lڰ|]uHBn [!tR k͜7+D, a=T _cI}j$;B ]}a;!MJq (2m92ۿkX>$0I#Ƿ_ -MN2⛓gUpfi\Gjh1t s*Y^=gB+R{WxZ@.HAԫG=U3QF=%}P+Hh6x{h-Yx6R !|:푋:i'̃?}77)f"^.qQ]U p(k$jx:WQ:|G#)%n89H@uY}ӝz{oOiÉ{Zhk<;K$~_k!I5ˤb?g0hlUiٯL82PH/t&72~`Ēja{*&D |̻,ÉLe EEFɉTi RQSAhv9@@^Ιw|V(NE ˩X") r}<3Q8w݄٠ȡuFʏHWGl6xJ7B@"~bv &X'GM{ŪhײD"-@ Y{ضHVSldoRONYXtBp 4tW0'{k0XBa?g,6M}7 !pdyڴmFVT = '_RYH~+nwꡰQ<¶jhDѷ,}J5K/oEtOhE"}o4T$ޑKFY}mD:*,4;W C,Hs'f  `oB}qt:@Sw@gx]ņĸ0 Y1*eP!\>#Rn;:$ h:- SZ]>^&:Ot6QR2jET*H 6 KZs%{4d)!wRfR={ 3G-Ft"̱ 3%X/ ^g7_Lh:)%X." )`bhvUwwtT^}$ʺDio7+t1ȕXzSYȆ^NJpCRW%4$^!sm|4?@T+#y2T#(D%g4> JWJx ~Su%&v/S' B%Y'']^ )*KY?ZY Y3lfP8=$zT.9_#P kZvt} XH$f|}9丕 rgE$?9x³: RE^f#LdamaXGr'B(P$lZay&D^y9[CTĦoYnR,V ~?V@'Q RYzm6]D'oP75Y6HZg_$ts;=.y>Ҍ5O“sd6"׻in;#Ii6mFG_iA)=P 5Lpz;1淗4=&KЧ"@C)k<5' EIlRExնib 4% F}ÛIَęnCӉzy}WPV>1#JJO3f):ǭ ܁ؘ6@/>( Qe%4inr7O{&XkmXoz|,R~[wD* ,|z6eaF;,mU<Ӏͣ':2)>љG=_QxZw<5},6O! ]31B]-88Ar pؓ(hh2uVOB>zYvLtʪ=S"#aȒ|;)l]8i1$x ~r|Y^So9CzMP YB7Gjhv1R W+~9oљ9n~ݱyh&ˇ:D;-wיq\z;Z6IixCp|U;nin\hml^:(mk֎ޠZ1Ӧ$_\AJ'uڅTm w~n"&ev9ԦbN9 ͕Z뇭mAG&s 3W5}9_a#Wv渷Jbnl۪I=H'8}x?0:[, +nakr5݄rьZt玦GyFMi"F biv^X{jMg#8?WBE͹e?1<7{DYG+2 aS=o.1D u"bv`MQ?h AxdmY┥ nZE40Њ;7udum~~$i}bošR'Z7IskVjڐY]"ЍH>:jDK}}JR}LR]7F1UɶÓ+iؙrlq+HaJҘϵXFw})kk?O7*qhrl;Qr7@#ݵ}WJi:E:fܯ](jj*F汶+@Sl6J=U/XOTwoxT8cTe^'},?NX8 5}K`2]i®!/틦98aXgړrͬA{k4(%tᒏfm-/V tEC=1נp_Fzib}:GVun ~ c(lč&`& 3Ɉ{!47Jh6pWp$3 fɹ(iTP)aL~hW'[d8%8|Q呆šFs^"^Xb&?ZęyKfiP%7:h9p-`c={s`m<IҊh+ 10$sE"ȴleɮgp{س)> kEۗyi NoQ< Xt 8A65irI^ꕰ ձ.)|$/^}p- H/Βil˂b/z|΍RV 8=7N*+-^bq!-X>jQ_BNRXI/x З8ʃ>(E>ylgњRlz#/ FŪx!e}EB衫ͣ|Kg;\KkΟR;cz iдx w1ZJx4ffuN6 ^pM2tjSgyIĀV*.h2]ˍ'nc]nF_k?JY]z,M P|HЎϢa뢣1;Q)OZ'kbOQ :l,-h@G-T7Vmc4ӨT=}yv{+squM&"x';J8,,n@H+hfvXl3!i[Є̣qur>U_ߝ^ud ѧ/pMՀ:WP%Ie'I !r!5?NT/tHB7 = !$Wx17 !T&[X1Y €زfGsM[اBۢLkW󣖟{kQ9ջ/&lS(; KQ+XrA|~v854`mOQzO"2̈{-8:+ax? `ԍ-5+⫨MbiK!i;J @b*X o!&xLq[kU@jjR'WOƀ8 4bz ;=@fӺP}gǢ[>b Ep"␿mG2|uk01=$8ʍ!t@XZ8] mkwbCMc8A Ԕ0K(|GָhpLNq Dj=Xa4 X!J+.X䘲2!JߢU_LCCwEL+\&Sd Ir4Rd=aX< FzW4\GES( ]xז|SՎr׸H8EѲ#TkL[| 5K57(/yZW⛨"1T/.{MastPATWo(OIpLįV YH:@J EUb;{Lu4L;»[(tD) m?&gIĐ:XR }`$]v>o  Da&'qZMR7.TIgKl[qJSH`1Ѐq>x;޲w sz_ьukbY  ޱeuoC/TDiaMj=cɀ'uD/ݞ]oq(\2jcFeba %س(4Kuhn{n^Vz턲Ўbk2 .*\R)=d4 i_n)$sf.=7G鄆e*IqL:`?RLc9K!~rv_DY7eMTqs 0i>O*S،[dkPIR8  ;>x FțY]3E,#-vɦ)peO_h-睂lu޿hpشpaM",L]Zg ǞB.|P?n$M\r v3sm&"MOUa߉sc) D'ARkr;??\ ^v%Kǔwɍg.$gu4/63Dj]2zٵzܻ.xv(@J{X`8HdGV38E~:,v. nu.aE|4 W:áλ@an(NOC~k4ߨXq3ҳF,hx"ڣ-`IAJWs9s7j+sVʐ%Hd|~WYBMj/ 3Tf <]wJ_H`U$$I@*G>-!Σ' 1)%YcI~%Wj`~I dq&p8֖b7{^ŋ6,sT∾f_+X]-uE *-Tyk}NtU}#S^4&V GAZwJNQeIab2۶E㰑_a_&]FClKAxwnԂ5!Y=2_f^R8isA IE=Y9 J.@<0LT.'jOD 6+лe^.ꃛ1f 4./nu5gss|@uO#Nt$sGlm]EA ^s! {CّMGΙt]!àrDeOe8}t1=fCo{i`Q[eDPSgVRϿ?Ԧy#ZDM4 z}Z<$E; rՓIc~H*6q1F {%hEUfvqLCI^l5~&$aկC8E=i/D&'P BRRysˢRlYF \/`qYjr[pf(pKvHr$&MJ6MEʖ D[vXtS$r"g">+ux#[\4R.N[Rt0F(<39t*peuv\Cc FđLJ{+4t2b\HZuWl,;̄ U'yWtչd@݇FC5Lbo6ȫ{Ot{sLy~f: ༷i7 3W.8 $,fGn+$>Lsy8}>@Zu.+TP) 38$7Te]0{Vgkڙ LȠ"bL:*#oqhYN u #2-u,אB<Л\ p9GtboU`خ<$' *jBSF cpb ~Pħ$G)u&Ô.;,DJD%y]v:ɖ#kyɁ!"Q1AKoI嗏ЦA'3 eͭ(IRUY6{=hفs o=JH@/}1=& .] w^o I7* ir͌iMmpv,F#Wkc~>PB!{Ͻ*VF0Xs97^EbEa>OmpPS85/izIlf\yUTCSޟʁE@N\ 92axF kɅzU999F._tc-)m3TWEdŽ;ef?FV}l8] 8*/1a@7 ?7J$,j_wV FCp0Qt8H { CSc~ݮ|ؑ~5k7 B{=3Cz l߯Z"_LOAhڐ" ýC S^8'd.2qX-V0_r Ϟ=k-%>1/ I=#, p4ᥙZMfUچn5.pSnDʣ!LqJ ûJE꡶^N|c[[Ck)˾Iemh.N̦?b! ɋWddÚp|X V5-^Fԧ2]n6} 綳K:eRu'D:\''AF(hݤLf h dg'~UiEdw e"%=.&>YX?MFۼBJU`oll6HMޅK&zX }14tpY#u9xpq (ꅭI YF 5O:C T؛LREs'Rd J] Ŧq$"+|Oi# |" SXlZHʝTE)W4 ʥfMrS=Tm;7 ;rla-=r0LUi}A4[SVM^*d߹?w~ztZCٕhSX{ܨ̏Y .v,&.C~ (2_%@ֶp| $S.p(b$=7CS*ZlvrsinIR&P!^]>D.Xz@f^G0 ;<.ØiUS!&#Y Z͍61WND3 dSME3Qӑuҩ)(H@Zأpɚ5"mDN۾Yʣ_0NS>1ˀoJ 53({W,pGhJ\GUb`؋Zs b18/$\ Zxw_WVW¡goӗØ2@%Q(cc [)ԁY.a[bӔä13 =Q")83Q&v;%h+cXPZN^{`%:!=$dfƯwJ0'?jz-!KۍBG DRk53R[|ie,ִEIŠ1gz3K89N ajS,hviS_;k>9nQh^ޟ.yi@eӉՇړpV\xV6;/ջGW#ؿJc]0yԦh*[]sZ>S+S ٜsY}G IZˣy6Q`)efw"A1 Lm_<tz.u|⎫{ [4*{]>¸SS;+M`]>(ͬzn"RF,}WX>9箊LAO <4R[?TfejJ1#Bԯ`=K+/l, h^iI汣bE XV +ﺎj~N3bpWyFCsK qĿJe]?:1%v<2Yhh 7u9bÙ5/uv'm>f>iˀηe]Ks/ >ytb,fϮ5ͧ%8OxSfبT'tN/Y e]݈Ӫ*${\#wH֍W;@AjD̉YA+#g˴pՊ΃(/5ٗ#J\˝4--ҖޞVs1=׿9WJj!-POT\:+rDLWbj.$ANk E=9,ceý]ǻmteK!r]D,zkWP!im-z# DJ  /yA6/% S$$Ƕe8ih<$ 41@\Tq_,('u¦ܠ4.>ςaLVsV\k#YK*FdΖu.}0 0 "j AdAӸT Φ C`AcN:r|,83ۼ'ыT;N=RH8O_ê_Dz%4cՎ{oz< ԫʆ)oAX3*)ΡVB @:ٴtX Mkb;~0ALjuɬa;R _kS&Au6eMז{[ Ԋ,(F]#gZߍCg%k!u17Қ2N-Y,X*} %k&d;!,Gzt|s2J1I\۰$ͦ-a^ܢlc &v.^q'dWM?\E2K;'cbku#t:KulRw91Qcg iF e*!mCr=gLyUU*oڃgyʨ#x:e/,d4ÊTgSB {g1Ɂ~Lb҃'?+ METUqHm̦C+&2UO;w1T*-j=T7D,=V}uɠaᄜ7ڟM/n)) ;1\ƯnKNbg1>Y"CJ >#a*J-8gTJ.Đ.sɚ)g,ՔV&ݫX˚H۵Zei_} rl b}%u4Zy}k^&eR6$+Hme ngě金ǝ9Czܶ<3mgw HN~ txz9eɇ'8҇ 4Qv Yn| zÊl88eR8uCF_ 3a!X91 <ђo2z`y/q?"Pw=A i85BϘ/w-L@Bwy4.1Œo,U.{g%&Rt]vtQ0Хg/, (qR |P󚎄Ӹݝ.P2Tu-0 P|B7f6 sCM+♾+/! ຂ`:߹]'Wwnw ϡl+XhؤCw>+U5 {*-t?.^!pOu &+l#A ;6wU7h#95][7v/',_(]'4 *5.it.:@;A3 5H22R )C1-Rݧuvo4/"a&RL6Z5~͎n'2m\fXd<.[o\wg,r3)d3{m# "z=^h{ڟs 4>tz.$K..M]<Ԏ%KsAMum_ral‘.hI$ۦ@pz&f%XmL_B0J`o 9=*#Bq+;BEN1HO7Q`#c1GNUӎps$ɷX2lUO`ͭ|p- jnB*Ec>Y ]nh݉2^Să0ː%B}/gNxƦ[!m'h$/^۫KP`5KVMn 85`qRIDcqyxA[/r=X3w%L Ki_Ӗ H-p}:I(=&TA0W.I溜viR6~rZJԼJ:Q\JT3NQ)5#jf<_냋QA2mͦl oNw >Յ<B%e+0*KDO !©*_*]quvvQfP2VQKzAg/H!D2*Qĕ(֐ lrm4O)ܑIrlXRՀD&|dtt;m+ O@lWOKu[ 3s8 *Qv,L9Zdg$am VOʸ?q@Oh\f+Fmkd&#~>U1/9C`(9k" L,-Y/XAbdr-tn)GZ98 SmЊ|L)UCJNU59 QqHb\P6:AVrh _ԙJxO-W69Otbs1KP|Oy B]KFkfdLƣq0n%h,Ld[fw_%Y;CaаiRhՍe߉"~+PE:#IN6PxTk4 VAW Uln7Lm\SLWLIM}EJWj6SC.2k54rXm:hBOԶ<ӾLJ/ =n}ˉ?ˬZ;Gd y 7 P G\% TޑHiH͇rJ үP1²'TkvW\t e蕖־~-KUY&!]*=(7@Rs`&YN!5ַG_7P`W `%'#L@h *l^4`ƪu+OG`#+OA]"S`I[J>;;X8@<{@eos"VpoG{^z0yh@ȉ+- #0 FU@kAW0-8 @5}FG8AE/KD ܔxǨN.)\1]42B#TȌoS~'dOy\Hy(l`녕mfB7dzg!\CU\Q;B51p9!<3DZLL=EsE/HU)*n;| 9 7jmc^]sخr'"hU/Ö62T$G4T})[ȥ3IO ⾮6 EEQ^%- u9&LKC[s n#?)p잪>%ocu5>TY̐DA3c3!16tDհ(\|;|:\vtZB~0cyZT:*a %B߱0pGQ":1#o lp/oyIvѼ-]~(GTZCJϻZʂNDjp_v-V8r+N-7Vdy*vf/G4N!'YK/->C |Ďw (K/-m;T{ cР4HT+E6N*nX;W߄Q#"DV+/2w^HD@ZWӛ\'TT{h+Mld0A=1AF7b_f-wP^|^mꋈO ޞP@![-EK5z7Ժ tvLq@ۦGsCG3YIcW:aޒX4Z-b3x)֑?;KbYS(,ݱC\BZeg$^:S!)gt-neJ {L6.=aXhEw@lDC㋌O{L^}I[$W&+͆ ḣ闩S^笰cwsoiYȒ7Kк3rN ۚs.)?Ǒ~r3}Th gfӮ52MI/bkMhTMэjiw@?m[ `"xG#[Ñzj:Dw1G$H5/-%җcޤvwԷCX҆n ;#04IU;]r7se(\_rYɇ2p=k!9!C: &vl:&tW5oC?pL|< [7K&c>zR:͍6K#|!їe( eĵ(mhe aiDC٥YKd|L>I{Lք <l~ }H@]ڈa ɥg,{$Ho lxia P:4u_MnE{K3:%䢮BhRr1

0F|G:^"@H4? I^|t{ye d^.6G-H?A{=":;{T[URHT/ C]R֥ Xw+FYfh =݋ p@CSuP<{I^8 D/Hm"=Z=3s%N=wV|ˢj.vBG\{9@O LV G=R H%A۵n*H'@ 5>ɘ>7: tbbq4M}&W9j_Tb4:xPhsK|')Nzي_A VKOէD,}RMjgQ7Wqwy+Da\ainl@fpOl\M?e5sF47LK/9iЬ b}\4צ(n_㒪hʓ(WΞJ6&)lWݿs[vФĖ]ms?cdK%h?2d^b9a~PGP (1 '|``vCq6)GX$?E9=SW㲨k*G Jv&QX-PC)"}8+|=ϲ >oaH tIqx_$ d_Vf1pe_`  RʍcĽZVGuB8:hT'EWOW7|L"^BϹy$zm G0-نG ]1k7Z,WG;[8c\D7g^3j1yX8)xl4R*Lˉ#S>@\=*$W% oߺex2i0G=na(V?q< ҫnfOPaY)W@ݕފ_T*CJϗY~K|jVZ!R]x AT'21yגbGB  S.^@l=Z!Js}™iW %9v0 XKO̿]|FUςz2 x(T sz-OV ')%<~s\+_!Dc |zo@*rP_þ6ZdM Ş @"H}=,4W[ 9/vų_n9T<! r )ELݧPՎYa B{E!;SFPu{Rg:=sf*ȋo2abOP]gĞmz &'qC' H&q bT %4Z?]!7B9$ 5q08\W{.^cd)!D_7JçgC2vZCέb|nK|SES{0!"𖸿xPv3 y_'L"J_MMh#i%C F QBtQ1FJ>ztkR^>7 ŞBwD0&DeN_8*ёמ0{>j -vh-e[300|VrJfv]v=r4*= &/'vIHH}zOsips/:8)'/bQ,['DPyFh2. h}˷z{ۻj팂0D/ #I#Vu)ah&WUW4Lbބ א(vnӸ/5GE٫W=2 WciuJ%; AZ!QD(+.Z>\N'sLkYq?dH%^<8e%Qޮ?*z J~OYQn+Zw>\߬b~ .F=3CbT{NHUz @-? zXST8ĸu0a‰f]U ⳈDIBap%5čB+#ԑYKys%? P%x8n+=@*)\UL#P'cIA wOiG2,end ޟ픻z%7rG5*'nFuTp-=U/㝝sHzNz4XZWh%?׬tQu5ĄAh!K0&m_Q  U ^1kJp(.J-qA? :f|y:.#kvXjD S?RQ$_tX݄Eq6NsV| L@ QX}Bѷ3MkdYI66#lWg-Rh) \?N2+^ZÎu < \8(IS;RaĖ8["Qc֚L-0C_'p>lO )!QM̂r#}] |aq6xgg[>2CPti<`<'<+[gy_7ෝcv">)dΞ~߈9kR6m>|8K8?NèZ(1H=K<#N9&AZĄφ:C.Zٽ<4\PIS+`qm3_F7F7\U _\fˠStzg~r[#lIHT|=fz3ՙh/޾9k0  E玄O#Gzң5ypd ?J:v¨X*O0'r* %+l*>h\+z3Y:\EP%):uK|>%XNYrwą|C)Y oa(^d<(5e_xRt~ԫ"g3&_Ĥ1 R"MK4n=֒x<~"ѼMiRUQs!>|OЋ<\v7݁#10I (J[79 {mL t^ ;S_5c*ev }w =*=w>8|Ԩ!x A'NKѮ@r&܋K|#@޶aoA ?S8d浅Z0#6؁KNEZ +{EyF4E8.UN k'p4N!uY]QFEVU2~ :ܿX.fR9>yKjGÞ^j"c꬙UM>z%3$e=aEa⑾"zXYB> ~+7cxo$ojKoBџ 'K%h#me[8kӁa5вRFL 6hc_b30]W_v'Q lX`y҇|"4 _?-ÒdR{yG ."+57K4%usԛ1H{;yW+fF* [5XXrlR>BKd,ZW?z˻8gֵA68q˿Ջq(a͚{Pǥ#Ui" 2\2l|نJz/[LU0èă;d.Te=z(i1?8 D "l}&fh*nnň`e.]ꏵ "e?o|)c绲&3I}NHB[R "CZ0iˏ[Ziͺi 5k=+E%\W!'siौh:n3H0[O}59G?'% ћwJ+?T*R#Շ/wN ^cf=Kر6>fUzZnE "EE?VA|VC*--ԝˏasP$e1xlFmim+]ho*:7pn< )KN4[D? q`݄MBSl@9=,3jR'n)T~.s;MSwݘ?`*sc!gZ05Q̫T'QBRqSbAKތm+T*45t R|w8%+M,>}1: f돣 xwYkQӠ7 잦`y'ˠ*`ܪ|e莧zkL`yT{sL%0"((́5bLoCɼ䈏@Xۘ4>dqg!y+qgܾu/j2 "݆F %p44nfF')ƼD؜ٙE 7, N?sa%k1  桰ujz.OP[̢\~Sǩ45 km U+<ʒ._-  x",9x:ҍh qW.xֺk~>EFGݒ>9:5Du˿8­1la7 ->) p .C2ĸO_\7&7-ܰeDEXNeU>naBjۭ%Hm {:VֈRpY|L(*2lLK,TK{.7oC ߸r#q`.-i5'"т,Oۧ5\P쮜YT;4үc ڬW*][7JkVLpӀ;5qڪ Pru8$_5ɴCc6Z0Z20yۓ+*VRo1@͖)\ 1 2ZQjt칐(ReߩhG0{8]"6HUJQ{ O6?^ Vec0^ރ"Peո )u)~(@QN%eo܌he VJNb0M*p 1}/ċs 9Ɛzli5GE/YzOȺ$yjf$|ҺFSBLϷT)ZV(QZB3ޢk2&#XNs&<$OlKgΦ37n,Շy\ɏ&bH꣟Kjb]D92qd``[ DY||)"۩`P0K߂J+(-K;hv&rg|h_saJ$g;4^yW:CU+ZV}a' )xz =dLF[S>_@Bz~20vWdlqPvX\1U}㦐}<`Qs2Fjj#:}*4;1+~~# Df ̏sl{r%D0FV8Mt<EykrI{Y]G+vgP2KeM{p~C'S}ס a1h&nP'LGO_,zrO1vS4[%9bX㧢\?']mteK$K.L=;~0I=.86/MPd?jxu.3~o8kּLw'Zaxg$glO .yλho)TqӵX4޷/_H ׄ/{@t @:wkAP"6gzFovYE&MEkg|)m3YUDZsqG%Xln ,"EՕnY+-8C2XR@OIf k3˾ lϕcQo{qQVThV ho$k%v&2QlC1O;o7QOs_y&OG@$Wo`X`WeryY䐞4[F!* ݆2!|/< O*Kp;  dj^F3'_o/41O;3l ԣd &ʔ2f%4<|}aT,{o1y2mbfE y.2:3 fz{LX<|'10^+ ~mUUcWA&M||):B2 Y%.ZgϜ~ܬTvl^G}CBD`|D08K0hŐ@!:@pq؁jpÝ]v2B6EiRqc9?)c_o̎/Ɉpד`;ݯt[&CTkv@reK^<-a5Se`DmW2Iy&yLdU_\L9zKQ40.Ԓ&3$~ƚ$LZsx>RAfP2Xi%[ok7_GYaOcH'_1g`CenbC`_{\KEfBH͘E["5إ܊ ٝ{E*btL c/?qTYcm m) 4Ψso}CԮ :(:qK.,.I{{gKMʠOݦ`ㇰii#'iQ"X: 3'՘K#FP!["3ɫt}N VE,GrQG8wx=svIon?{3`4u,l9ɐ'o۔N]TB%ݴ%I&MLc;r6oTD. 4m Yx_WDAffc"XTTqG8A|RHX/WMS3JQ:*TY ^Wdg|ގN7nıX; ggfPFJ\ >&%1QxX}*?:ZϾJRhޥh~!Z0J^w4N -ŒPp4 s:V.42¡i&&jMf+r۽֠ A*St.l6xa0O?ȶ8f/\B6ӖaxW^+HANVP亶\~< Rк"xR]:3aRgSro*R`rBLIN"XiH)pD8x)#G4 ǖ x42ɬqU,=abٵ`-ii^gnܧVdT+h@&lVO YBZ!M=Naߏi^ 1Y>-R=`ݗM:?pG~|;^  К{Nh7TNES>?̣5͖7%") BiMc<8Pb9HJKR{az16)`c'*:4e'~ɓPaL/Z=yĨ)CaHYUE `bsaVO A8λZ5`O=o 8xۊVZܰD8RoCx_ќӥvDvׁptλ(@SJ6Xa.I7^ZfOl$@|/]{"U._rY`9H re+eo#ƙNIl"hn\4S/PJ ! yYm2f}vr*?NH~顁 Ag` #!:WˉY{usd\XYN4FVXA7X('d|NWjamB\ 1E[g~>E/1k4Gf9]=i:0_9៮ұwd=Gߚͯ~qOQ!e`T;J?CZ/S*Tmj2\zm ~Xdg(i\ Bre߰T%whs_죘(,t`eȡ-" ?n֑h^w-!$Gk %͵ 5;ٙF^V^!>6p-[)߄U!4Z4/|{0,ӐWzK Z hKw}d],%ypuNPkH~幘KCԔOvYbȧtE3ގobHR!]8`Dh+T^$`'D8*j^ :KR0p Fȴr~R^&t}v ROIDzOUHqe5ZGޥ؟X! 4ͧ?CHI B%+؈x!=gH @OLfPe)??&ZjA5#İ9:LkS e[al'c/Xc(,3ȳOV$@wL! z/ ݥW`1<Z,,AZ rsIԨ{&&mx#LU7ȁ9D-Q_˽ȃpJkEIg\q*Ɏi@頧?_ ^P5tXfLQc5V?̐Y;IPDèUE7@37dGZX-/puH;Z p\;+ Q< > A7Hҙ_膓if$ |b ǘ 0YW6%{w oB4Nޓ +?2p>zL0'@leD4_kP(fЦLch[˽ +fE{Tw<<'[>svEwE f npg/ٜ,E.RNaHAP8݋4m }ôu6y6(ьŸq 0 &-?^:hvԦP \;+<ZVxHVݾc6+ˊFً@ЛQpfj@6o,]S~ee24B&fSԋyb9嫦BK|s6ڿ9qVpTPn]\}(؜/,/Y۟xfchQ7Ĵ]elÐGupelBju-D|RC_SN>hBp \;ƃpf*VFSkb++/#g.4fr`&+|mpψtkPZpC^V.%OBS7VDM\<[tbkʏ-Z ꊠ:g|3kwvw쬩=敍zV7ȣ³Нcx/ ;GCC GvK{5Qg3%{H @aPU[5)M2ʻM Ź{HTli֬Fk1+W&.81=sA_X9̃Wl{'NO̜BT}'bƏ[]E `ح31 Y%::/'ªyǘx4_r(Nss=ả ü! (@x4 ^b#?_-P4I L࿨iNT뾂Z֮RQ,?X~鎟-n-I͝OZ+~'ȩ{lhRns]Z)|v7 MfV7iơZ*]ys4IiQpC :X9+NGU>"'gL`m$Zz!+I+s >ez~d!1Mր,6+#`̆ELǼaiҪw}q'ڇ &/ɵ) ؂yDoʮYjz> Dm]Gpw~eJĜ d*< LDgձw$ꩪ@-$@g{׬:aYG\cQsJEQ> om mi$Il#C_ѱU}(xea BMW^߃T}O'd=a1-!BJΤ˩0_@ETd^jO$ n׫S#6/gjZaϏXϡ崥 7auQ}Wj?k\LrDZALSr-PhlI;v!3>Q5ϼ.{5>82QP1)`fXlSB6-KYZ*.O_"7 b@E83\YTo}F~mTȴwd .mcBeĩk3&*}Ȣ8c^/9`pƊp[%8]#-4 7)p۳6U] .zB \}2 @oTqB65|:|flY =[` uMq#)c&*UH#]s*.YH{8HaN Ǖ]#Pxː ^L-JE^t8d=l\a>U3o6*[{fs-;ؤ{ zgVZlv,x7Z6?'_#,,$Pn T}"$ЪHTڱG:<, 09<yZ3|{HXʸY4.M Db_u0 j]qyrPa. 3G̋*Ņ2 vDٰGcҷF-xr%X y6~Nc28.n qMPxP6߷Ϸ"et6zReN!9=^b*+IkV.f_N0F7(Y<}`|M 8]%1#^ʯSܒ>㽩W Нv2|͵&{IXZ28`#WRשHdM|4^\kwiVvMeŗaB_ݝ#w_,C%u> Gzh'jI~\R#G y)C=c~H#,6go(}E2<2xgO8+><# t'?>(z76ZJAM1J TW/&v[wUT8>⹬r0.XWo۹K,JA9hrjWvs H!KJioKr1K/'\Bg s-(_:r?(CͲI޴yXvr#?팠4k hG9Գu_V>a1q2"_Ğ=M.nB 94ygd~.wwK43tZ_u.LV =|s%RqkkpTCV󸔶ߪPJ4ҰRo&[WԲ ֫E 4[k=|GYE3|e|hl{@y3r|1;eƳ$Q%jbj =Bgޥ e96ƯB 1o˜]@%QcgLf+fMV렠n)S.ΩRs![ -oׁeMmUɽ4oEUR((hJ#v^ bGy68o<~ur9lgPiRIšmm#&ʂl='=hB͈Pe}{h@rHH>2=ЌEF.95Kv>x%dĂ[dXc۷~+tt/d%XzhF+KȻ/t'} o\\yǴ2̾m3\+w%4X$7_ eƩ;nZ8'@Jׇ#V vH'"4BXdLly3 Ij ]gޏG^z"'M|"SQF=jD=$*\B '/,ND|z[,h(ji~&u+H1BqSVўȍܯJ s@{0;}F.ԧC6TζotcB# y ]:v `/ag`Mܶ rH"qׁ߁wqEa;QΣ~ތ5#U,//E{R$t\TMQ?b8qFh%I|| I6ϐ+,MQWhflAZXw$SBqM[l׸] BKbfJN`W1zjF.4ǘ@9yowj؈ L$l WaLQrǮyqE:Ҷ&8Z=oh{#; Ն9KѼ| M0|)=L,}3.nNF͜++BNfܮeAۧN+ !3'q:fb6 G@=F^'W3 x4՟jPNa>ik$M{ڰvh̲r:Ws 'G| u<=ʯS.X<櫏ΒIV~jB KKumF[Ű3c#}n,JF4xX t>uf /_% I aC]3DDZLj$*o2,bpuhNLD"5`%E.DOdD`6tO/r1N)P0ܐl;놓q:RcXl*o1Ȝ01=ycw&"d#)z[OڧbD"0miDR5Fg)0QtgVdmgD| ȁֿ MS ny!)Ey5cHPD<_c}K#tOkОa`e-ܱa ܞ6 2IU6L吜 n#KJBA:JZI'9{nO!x냐~x*`b!JY>̲Z(.6@SLWex DobEA4r:O@#{;&kC3h5K'T?l{ 3 ﻉOq!c <'kK_ \<7HmF}Yj`O쵢uON | Rfb&_nJ'$&bSB3p.Cf{Mgu#1}ŒuUw[V!"6oX hO{@_o+u'"Ȳ|DI*n?& |fC=*+ 2=x5C!2LU|~ ?2\l'J,V>42UQK-* cz:s/ߎ^ dSkeZhFpY5wҰ#KT6E8`v>wy+b_-eߚM-4WU`kHHP/|'u 1mW=1M\$xn2zӜbgaHVԪUL>B+TR=Y>nA6=LC8RH_؈ '#6۴.Enҟ+هs*rTlÚ-nY$wuJ_JJ@OfǷ넓(At >Zgy ΢g76y4.n{wzy@SH1m*?T~O BZ3^LR"U4cYJ~s_KÁ_zX%g.> Sv] gⓏOeBu3Zv~뫍X-.ԚttȈ4Fz^tl*hT-V'˗Xc9\E.? cK _]G'\H (F;J?1R!'`Dok8z):G^4BiZH$I!X:AniM!w!d?'8̜|2l ,d+z&QhL*ի'6HB^zNnPQ'ɝ.B$(ͤ}1<87<$z:žN椅60 }@ {*FWw]:!>j]\ah6f%FiW*#Zi$Ůaa ﵠk%'t!/fL3.6y$]J,[?L4<=ˎ@g4Pe'Â`蜢?nCq'U9Qۃ( e+<(o/햴#W1av'wl`!u[HFV52"[lV#EQ~9?cvG|zSk\1F.`'DPݕu+ju?kyra   Miwq]﫤mZO' ã8DoYZlwt+Fqw|@"b&]p[6 ~ж zsJH1(4f0U{uT}wM(\{2#'FD 9*q,)H Gm`N6afR8lzstTGG% tFKYE{߳T ҳ_UX L|sEV geqDzp 4}AS<ɰU9!#-=U> tJJ(Նvhn %]_K|E[V@4 xHXw(c5޷S" j\:P$ ⠏8T !ZW򺗼-q? *([!Z kLtm#LovQߜN/n%jp؏,_w2@T7V v& iBA4tT -89F'oeTۙ"eә@:0b*<NQƎMA-:w&IU4+Ic 99e!rnʶNUU}f5$ D=u[BW! =?=)a./@c'i x2Ye[9+Y"Cl3x7K*ɪIr릒f.u@YoEfaƕUX3`mRm2O3~o *UI1Y-v2/ʹMR]YY'.f௴~svbF*Bҧpb@,Uj=66}݅L QnhM c YA3:>¬Ѝ}Iil|L+Ō*bz'=ZL$HKq)ġ1n_O]n"ϠAͿ~QUXTD*sBœSǵ%YrB߻r CYwʈpkw~6 p2q'6]eTmМ]G5)^ ,bD]~F´KK[?Sky 3ꏔ2zBDEڳrX\VqP}^#C :X B~KFĴ҇Ia'|8pi1 K9/OX3? &RD}jHn284,FE5T炊_^9F902;- AI#a*`o#5±cxlcVf<v'^K%4S6mgt~h m_5ÑE-ꗟ"NiiCHdGtL+~寻 Hsdb$NSӟGѥR+Ty@t3#`SZ]X ™=1@[h8ɖwWHJvҐ/pqRjW)yu5ޓ9da)h&0}LO:2Wr{?Gc8 v.8X_J=q\Ү,mt L"i. \t[z`QE61@$ڻ!GN54!(uI'2G'W釖SyـJv<$4 sqM9ŎNF}_+c77z$gZjEn<"1J=:f`H-`V*GԔ7^C׳|Bp1%j\:Et^ueer9mB*ߊ2So4+-Ʊ = >,By7aI6ؐIź7Î7(3zi;Rb_YdfCLゑHw_WlKgv^uϻ XS O0 (Vm-/3J <&*/zLĶF_/s}ˍA}V3N0py,5|YnNwalSߠꗳ'*ChLr39pZaD`jf*5ŋΪ6='U/Tҫ!*6|{)8DUޏMʿak B j焆2+gc@-fa"7|W_sNi@rB:>P0b5b8 /v,^r+S&é(d?_1qN`-XD{'U@ 0U?\rS>9>ԗGa,3VPP g;azQ\Rdэ4; ^]d].hGd0s@ZC:ţpaJ&Bll+[<$_tYc@#aYҗd߲{mxkDR6Ie0YwSń6Pw>V53K>1MɻnG.X_O{ 螺ժNi7*/c>I:D*z(kJ+: rz<35,1Q@I-K=H&k[/jXiY'Fmi"1/$zoy w VdUF`j0\$< e{A鏻$"Y9L)$ZG v/~64o(mX0> AE!jq [99'[׊1 dz=p\tt=.Mf̊vJF&P$mW,TqPY;"O#n$F]Zbdi*rӁ:p{M 44]ShrVdo"卍 Ei{-R۰43ulb1?%NCdIuYԩx9T6L{_bԁɺpq3}`#>a n*nbl|$jlAX̮7)/_Kg sgcosF׺tpЗ[s كZ:-&yr.eWy+394I_ '}t?la nen"JZSR .,%׽ WFKmPYFU@*ރFEQQstț]P8q]掰YK7/A:}HAZ%s{_4=9 VKX7>!LVLDZπVT{ݳk<&8fd"d()Y.#6#f+lTrVCCҀĜ]]80_ʔK Bn^ KwU#Z+rNC ; m+%e5<"bp*B* }YSȼ(T-*ӈ:n7F*Ruq!;oV!J.]r@? tXr3Wgk:> 'F+d#goXwP݃li:5>a&[a's\l=O']/^!qr@D1>kז8շK E텝 (?-ٹYw^ӽL{L)]H1@^65|PmG Ta ~vIW8Tl?/+ɐ,!EY7P"%ea=;V ( 8 Rpvh+q kѱ`vai!m!'9݋ca6Lw< {gjx}A~_t-YO\I"e. s49JKanӵq 9-=h50rװ ܼsWI/)r?s.Qh)\-:ک9: CfeLվo!^ν/ѓlzT?u9]򘢩K[GQ5UM(,8" Vε$NX'h`،PfڐUvڼ< 8.IZV7=*xb,Fan|kOrxXz|tӭzO@P`/ zOoJo( 9VJ׸x8 $:'|Zj cfiC ?ub#mE*u:6=5P|tp2Nܷ쪱/ b$E]r2S ?|qαqC" gr&vòV?pv rNpR6QR\*ny/gP"nqa7D/h3;i(7sƮ7hݙlDՀ$2o] Mt7ttl׳u7H9pG=ob)zrٗL ߩfJQ9+))(_}y<2L(1c/pcf,1*ieCFpGswȠ3*Ǹi;&ėT7垟%L֡iغ4#qb|/c T׉ c9,A Ms JHn! ,QsV"73=Hdn| ?-9VE 2f3n]wIV{"*gqEkN6OLFbWڸ/8-mb'>_@NcDLҖJsan)0A;w-y@&6"TG8*O/Z#+? #Ab 0krCĺAw=qC9f-0q>WĒ5:0_c%1alG{3ݷ* V!>-`7g=4|tCCa{1g8m#|J3EdIY^DɎ|5TZjpncnۗ{d O;=Ѐ4|noXG]1eq vG2u}ձ7"3lҾ|H*auMUXs/3I{&9RO8,w0׊/,oQ;y35̷KFA#"uVjCf>| 9bD霤G@mM̉L ΟCLCB@U+C;Y %?2dL;GA*n?>(@Hfh*"S,omVK?LxU^ư`Q-%u^B%P"Ō/UN6{RPXuK >7P|~ICӢJ>*M cdmFj:ܬC-K$"g9+e&L*YQ_t#Q1>u&n1'RЎ+][Z!h:L-BbV@nvb˴J\ZO ƹ!vm αT>ngf סM|񕄫9T8[I1@1EA)Џ_6)JwO6[ףmF+$^eo@VPCZP<;vפ74Fy$qSN wpNviº.ft}Wt?U+x6|7b~\2J;ᡘL.v6I\@E@[fah<Ɓh@#c VɬԿIZ_XSYMF΋}#M+/a@Jf5x8ᚍv3-J˾˧u>"ٍBgZErAkLa`v7qxo nJ6m[-+N1Gݑ05SRMBUzu +єM( :`VԯԘЂg˯Ww%Fؙ'n>Č?i"u^ f^V^JBՇoujZ W2މ7dbAaiOC0B^3Jzv7JPmgPAFGT"uQ OK283Y;ȉH8Lp?q<`1s$Sɋ|K'-E" kh!\[,#~S+,'`xٝRdR=r6_hazll$U%Ka&8ʇ!jEW?Lv1@57֢:ij>GvZHdd0f&ĻFTQ%y$l8w7?B`w)Tk)q3vñu1+)s}WufY=[`h?Dų̈IMGdO Z F7CM|cBCdM-zos,2F8DA`(JuΪYJ,TCL5v=<-q'~yJkDcAb "$"[c][ycKZ{d\NKYdO59*I08Vs VDeO3͠sMiF>:k5bg㴇 pX$]~)eIeMp Nz.Oj;ZO@&yˌ'po_q{ikL{ydZT$.['4}'(zwY`~3 }dh=@'BKנ>JӷJ Ɔ3yHe꾇l`SP6 曮J' #+$&4ڪ?I'lڐM x^! u><yfg*K9SW8|붸Qݠ4hXJY#A_Rz56H_+" d$r(+J1ID-C)dPjmW;u07{WL: &fKyƦ'ؑvδ"qD裙 X9.K,"$e*n<DMR#N4=*)Q—P]ݎ2)f|,뺎!6XtKU8wtV΄Vz6@@$f9 -maCsNK?U2~wW#{L4m+φ$OGX~ Fa񨋉H +N? [,'P͞RG`3%ҥMxs Alxv9x4|$duh׫_mUyCpHtrdd\ ݘwր56Cصu3@یdրElw+ߓu:jO m}盥oA,KT$OOvc*upSnEKAA#=dT^Cw\zo?˜ǰiG27aħ4T S.D3Ezuqk8) to0MLfd֒'h6"O>IJ)3EeOx|dLC7" Bw_mj?> KHDVUu3frƧZqq E g0A&ױ!Uy|HjB] W!L>3g%w%K{hӕ"\rD%do'J_OЪx WR9mRfU Ϳx J֣n>K?btOEJj[@\֘Q>49B#ECOLsɟnpWSweTqL3#yʮh U*)D}Dy+/VD?IXpK0mwBH4_ΧHk1eEefM(%l˝ݧ0$jH0ܰ*_s.`r>j3 49=n+5 4cL*{;L5_Ͱzibqȓ%M6!MȕHIy<E޻ɛ{ }wCYe4BG\mX@ , |0b-*܃p ]Iu 9la6s:Ӓx ؎60u#=,RQ 7@q慶q3=')赦k5W?7> v=ɶO!5t>'6][Zzܶ[0.`VJ|xn5Ki%ݼ+TF*ec,a=X;*?qɖh7¯Oxq?!n@C#g8 ҘmRB2'԰/j)96Vh"VQ tiM.okkr'e"6CXM uBl\[)0;UG=FGЭ-N%B:uʌ-*x'- u7\rW,bgxZL7"ܑ<8㍁*f=`k |Gذ/P^Uať;3X Z8?ws995BUqsCNI3 CNA;4'Ax٧8F wR8dl:C\;-ۖ2ɬ%.=#jq%ə VL%/BGkS$bOlʜs+c2}a%DhMHU 4?.-Az̖WzyQC?oRވ+/Q#sv̕x ? <mqF_"}$dOQUv t6 >}ǯ"e`ۂ{fM+CaJ~>r9_m]8gʴahωҦ? —ET g_̍># ŊH_ M!T_6Cv^߬"aS\8| g6t:a4*mMQZHRDll5W/sv`On0w#7].*RE05'-̔RQNVyw|ycݏF Y6HkEaj -Q:e/5 y  p0l޿VABËW?ާ0؎GZ$=Dgh<ȋT}(ʖXY1=KO41{-O5pB˨;>:[bK<q9j4qvōT% Sg['l$UejNٱYOP9a<&O}awQT5+DEk$끢jy({[q':q2=zMQŎahŀm޲ەIЛf'\`qQ@F68FU@"Nu`VNite%@YLT ETfC"l(֫gQ RaȄ,MqH(;HPO l eIH)8,bje]T_gJlA+pYh(NĎRxLv&lY=3a 3#3 sCo3$]{ue.]? /||`Y7\v#)49NߛpO1挫G~z2~0KV2f,{&D" Q# vz~R LK}Hte 2''* o"倘my J6sɮ5:c B6Qd'ʲQE)1WHzQofzJA,N-p}zz2) ld~(t DcTrh.^H͕jbkm5c~HnVmBgo}PtDDЖlO-?FGr+ FH-ii$ BFiT;A(w S/Fͬ7J ZQ#j #sfuB Mr-ܺǺɿ_rF'!Ct;=ŗAp˂ A{o.iGv(DlMۚSQ9Nx B|KiDzO iѹ?z:Z7Yw˾]l~ٝd77Q$5PL_: תvtj^&Po:6u%G(6OlgS+my=my9Meoޮns~OlE͈ #"ܑ+ɬ X Dx -vz=]n2N!jBvm f$|SKдqŽߡ亊N;i.`dEXQ거m$Gl*Ɇ<%YKtOǶ*ĺ)"ޢ"em(:'Aڄu8@|2B>Ƅ0_Al-N|}#lBCj'D +F~͡{ )T Gvy5ҍqce?.W'w0ӼVJJ +W11'nb„C3f.0@V<07ԃD5g4;%̩]xSߩi!)~ @Hgw1g_u D V=J_v׵Q['xRm)MN0۱=t#n?[{D">w)ș5:,/`q=У%hYJ)b ^pb@;hv.F?D B~$ũΧ})wOY\RDZ&"s)zᙛuh "ۭPК!QHN /  q_ ?iKn\OZ6(aXWY A<aM6?aU.=ᥒ 5h\@ΜP-e#jI sx_'ZsSd+I^D9eh%U̪. Q˖W=fnÑ =A^(:Mko{նX>ueAou,w68p FUF<ݠ1@>TX#ȮڼՒ՞_6s&r)˷8Ҵ 8&@E7\N9z c>X򥍑j,kpki%N}MO7K,Qѧ1\'t̓GQ@vQ}^X^rm!4Y .P/*1kJ&h'lczWhdw^:쭪?CCR.yAJ{PgF״+tf;_Rd)VDN23#t1OCۏ_gdmɵj^:C"0|2LŢn%xnGyu_2V)on9aO ȦmpDF”V&3h@7Dbpw"ﳷsyL/iϜJZ7,vBcx]j14;31sʦeJJVfjw~,J 󵨶,pđT9Y35Q%G@ b3v&vTAo#;@;9җCC@gQ/Otً T|a@M3dʎoe dO]ŗON)Md_!=p6pw1֡?9O<8P}k9=!Ã0՗ #[[˯aD 1}QD T1GYflMZ4Nz>[Lw'fI+.ofwN"m65S[Ũ +r_SNFS1D!;ܚw.WL_{6ߧ=֦Քם20DC4e׿u~N}dhLPt"epbndp4fgь܌BQĔE*}.mR0=O7qD!9B2DR];Y`)tHJԺZ[=Mt W},PUWO*B܂ڤDȶӸG .JoԔR6ձwse\Vi$nTB%En+n`ރ$_.Zg "/G_@7sj]0TTΣ{<PXP#Up.r!Kh(w"jAb3. W\{TulwrqGri)&|w>޿cZ$D)\ȯq/k iYq ]cJ0 ][!s O$bOz5Mui MЪܖoyݡ1xbBBXW[8RF6` ipKyXB7(2z0]~*hO-ot/{Ӝ8E4@3)>Uh>,E)ιO0Ni PF9fhrrC`i T >9r0g=XA: rãHVp. !B8*'pƧk?9հNʊqVNڑ{xF#a'RM:X^ o+!hD/1Aa(fS^.mi;9/kt!hF> j4<\wI"&x@ig˳?i& kڕ75ӻ3O'EX fjݭxȻZppyYv׽Jkt;̝t[1YTMGY~-T3ݚEv-AOLDBw ^+ rUf$Q.zؙBIc<;B̈́_؃ F!Yo"v&xqeFBDVӓ$Opi)~HgȲ>* !YCIFL*~2<_c4Lw1`K!-9PxY|npp@ϊę; liL))M[?ڐaW6V7I i#m=Jĩ_½B 1f,|~9 ."aRp{6tƜ Xno[PX|p-Av~4_š̱ f3ܡ͜ϙ)p'ƥWmQ6:{ ^tcVl%Ns8»jwBYpP%gsҊ0ct@fA2\UK$Y.Pm5p𙑝j(e4,O?4^y kU_=Y?g⩑]D +jVywZ> bbwqZ8'&զ&1VEH82Mi!={q:~$|YzTbUa( ̾L"DPT:lܔ,MZzu*[@Y"͞  Za%z57iO?b-D!loV^›#@cFZVe6.p!d\}5&&5 YB@MV֍kh*Ԉݚ5*qef)$IZb9w@{M~n=/%ZB.Yj0-3ġJv+FYoM=J!bP3̟҃Jΐ=4U{$8T do.g6BE5c(\?I~4M:>y]Sa?w fBAU5tz|}Iu~u!VBN ґ_!'JLzޓ@,PzMH'%b׊zurd *h:ͨV!Mw8YgSJb0b˧<;oJi}[sc=>JeGv0?hGx[ty@FC"$ ZH:WݟѪBXcjqjf#bX"=B:V'O6zcxuQ}]|c#/)_81{Iy L,PHxxE\#'pnӆn'qg[jX ~;4 FL㟔&/zm}9L*]3a,o)] L )(]]3g[CMwkO]ڃStz Xt/n\L2\j lz8bPWN? E(ŁPꪐqU`W,~F`,dղA{n)mвVϾ:5\V~% @GĵI Vs(87'_6ZKO8;rX_mcomû$eE@֗Fhe }8eG6n[yţ!PHK/fI9 m]s8gi`mLv8co ;&q̱THb3EW{60AxzNYHh>0|]7kny#%*(˦.]jY1f Ow c_YЇEq Q@~Y^P}X32d.Y!y$^#ͱó%P'58 e(_qOsyaR#kpK+áa1I[Fx-N`%ŐGsI@=cs.!wLo8D)J}V}OG^a$ tIV gtCh#yH[ùђa-' }+V쮇fO;EE)qBfoM<,FUrTYH^5̨sZ L6 S1n~(gMM󻫰s8U(BSAuR?#v-Q`9^jcE b8=/nx;ϴuAlG۽I(ꟁ)ևͬ2V-@el-h#k@ocG5+rXf| |CXoL(ꀡK|W<#I(l}6:8+ew&Ug$[=d;gq'lg|[0ˍ_)ޝ! ) '%Y/@9ګr@ G]pɨ!4hk5l"-;7yF_mVv8[۾-F׬ 'a1cXla?..Ol Eפg UhZ7Dp"boEk )I/}<nOESOe\H#3Pa,'hsQȼ9yR8q)ep|ٷwv|rur6YKy8'%<&0 E:/T&d~pkch r;+pu&GbHh]h $.lQ\p ~7k<U@Vq|km3duN^q l)Fu}A;.@{* EAY\`X#{+\ 2tf\{>Kf?u}R j;:YR(ȘC\%O~ u3tga9Q7hl8 qucW&)ƤX18,r=X16y(C.A첈pmPUZk9̳Q{#R`8Voy^~!u[@'`8ڷVIp ]X=y=IwQGէn19I< +5co8\*jxz 0$d]*V9<-h(Z&g=&<rx2LeOؓxza]v+E>_Uӷ}mܵ)^ ?T.'g>-kA`#ҫ>SU/'?osDR,la:%~qsd ]fK= VH;j7(B ,9q<_2'wt 88!R}ΐ/!?s2M/ؑ)3jNSe@;FU=pG@N bmZ_mM1{ X"TwYhYUSj3xdF8 5'nQY( w( 8qYC#6)LY9Kve52&{aJcJzAP~Ů%)kGFI< ዢ ')&^az3f.J<Η!ZrMR*H/*#z'Os s @HnIZ!q IIlbߎX{pTD$B~3,i f=LZ ls']~[Aa#)!Eu׀ IþmR:NIVҗ=CiD}N}U9aݩpqع՟0z(dy&QL==*=o4k7 kuz|)k &x.'O"1V*LPUy3^rvh RcBs>{z וh!OtBL.&t%=<32UnrC^1j d(0ֆFlG(^lƿ[V̕r+/v(bAnpZ&ǻaw]G\G#B30Jd bJw+Ij>i>r!*G( HK|s@Ő.iϋ*#RHS$PE(<>mA>ٗDN$: SpŁLRQڱNiA<Wg'+SAiިd&(XsI=FGz2cxU`'#oLf#5] _c l۸p93f_ :1<ݨZ@ h(ܿZmIy+sp:0zpڰq`E$U*{z1"“%i?ZR5 ]NI8i_*P5ULlq8+,k6&7\8\L;gxd~tb6NZt9:A7 )2fhɵ >(xg2q]j85AY\ٰެ.qT_8BL^-wZу9n90'[׽=; _4[r, ]iҡר̢YL|+ډZ8Ǜ<fuULsXt4TʓDG tn\`'_my8ul#L"&0`'m[DٶaPciq$BC*q ^C~Ӧ  MFMGp2õ'aQdƘ|Yġ$H28! \5v&T@caR 0㷯DK̝(JNħ.@}R(ndHSk1Xv~ ৕ttYG"=gN-Rk`zV;eR8U֝BXsP-tN_Y>#82bé4ռiXK9ωͭ`!'|gz fz6lCt]}-&DWD~(WT@"OOgЯ3Ve5]pA]{-d }vtb62 1S 5zD*Oa%T%Yqk+|ʱ)$iԜ1]G4!"´.@ͫd.BWa%6VrEB&2.2rO}z$Oj f3ǃG<*\017A]j1Тg*@ QR'}sUR2TtO켩xm0:CdBޟ52>P̴t6ݙ*|~!u+^"rOs왪rhb`ӊmRunH*6RY,b`$MB_Ac6fppg"(mv)U'K%z!Ⰾ`t/}D]"E{>8-s2zSeR WWfݢUv< 8Kg=r3qʇkV@ҎC$1ys_e~]C[,x_:ؠDm>I[RxO( ͤu\x_yi mӫ"@&{ÏǢf2.{i`=s`rs(3lvg%8pau=B!xF>mqYJuiwj{‹dN̞ճ?ʽ[cIl0l!L0և1IEy@ٗCnE%̘6,RLbYM,"4b%( FNuK{z\;=G1AfFj|fMcқJ-Lh]Rb~] ApH8ץ&@dΕ8y^ŭKI?lLϲHdz WD/2&Ϗ99^o]3I,cWqanv$1yfFHցX6fߔPIla= hm{c5D*,pu~s0 J>Wf 4/͌䗉*ZJͫG7+zAQ3uoݘʣy|{dM'g Q %GIu),bYzBmŝհ+8:' :R{Fr:JKo%go%nu`TͶ0Z,*kZa8=_ jHE%dtd5?mM% '8;iRT kv=<_Ā (k*+D{{J()QACyJ $VCUCn=mH5yQ6uxr O zIl4 )TLUɽ~Pjҝ;=)WEږ(qɼ:4װक़?H-'2`"R*(%}sוǒ>Eh zrDرCL \ٿ./m^MSg^g,[չǠ!*1B8vޭR}"D=w=l q 4$zPe9͛^ x~玼cU#ѫ-%'_`jՃ47׮2Φe <BZTZ>_gr"h ףnaGm\9JQvHBE":g^K֤ފY1#guj7P#*)tNFE9hDmWVPŮ{EhTtSWԷh >;S@dqu7̝OWޯ^Rmߢx d}5 Kr 2hk_ cDݕk.>sb{X5^PQf=l"9#չyhqO)؁xtYG˫8Eb-;,;ZDZJME&-:mNlP!NM DVR 72Rԡ)ʪ[gdb1 ♳@C?\ly}e-`ƖWdWƥc!!! \4ߞk"Y#^.#t |ƞ6c|d1uvbSݎf.J.2uH6M+QV&0'cF0C1/Eņ P2 =&v}eZ'XHW̅4ӻޅĻU >sA;t ۛBǏd`* 5>0а@;g~:Q$ĹJ͓>:ҩVQb p-/o-„` I=aFqP(;7}4$+?du6)EʋrfP[Ʞ J#mPGNQvӿot &s 9'1/ll7`-6 }Bp yz$V`EXVHjϵ e#8('}ịJpE> )#Ϋ*渴!42 ppHF6 E- BMmwX|(Ŵϵ%D#ܕʶG]n^Y5?'b2]f5DsiGc2uX &ZVB)/$B"E<}6U'oY;# ǁnn05TuïNė?PI pC%7] \#{!e D`MI=pH8Z& ;,C'o`';qp+ H?[.G4XwAa2s-)4'I!#T<H Z4 OMp#bz"vY_{jQ2Jn=GL`$y7+< AA|P@jAn6?P%QwanonX6fs'%RtmQlp6?V>H@mphf,\{K-IsnXB'SC`} {s$ۚ{DyLJ,I36dD)P gYiNF탥r1[FBI?o8  ؕG߷0#`mη OȌ致&Ye? ӷaɘN1cplj<5kAQb¸5~p+:HőQBl@"?vlj[/ xjXQZ rjRv<0&߁PlC_ 0QՏ!$J^9E,Kc{VEK Fel!yzZ 0hHdQ4rh*g$q dD 3PcgҔ($ǒȿΘ-$]b ZMSY~yLW(aS[v \%;OG4Ax)a$ F,nVuj߷t:K%dmRS-OAK}r@5txRrƒ6~~ cPQ{IB\R-U$BibVVS7^'젏:iqoZ=^b@[⡳^2űMt^Mk~C-1)WpJ"ӿhTU͛}A8ŵe&{Ô@;ڽ۸" O&M/ذ"跗d kBJ4~W48qi<\b߬jpأgE2+J2.L'i# Zf4b_pW(.p`56'u tI r{ S<SY'qD$=Tկy`|DBm)1Yy͕} fR;k]2/R?J[@ O ]| 8b[!& tpD%[RZx.<\0t4L7|S@Zvܙ?eSaܨ}a#8#z3#`*.bEcx}Mk:95zW*\%a]sst .(o;܍,m]bXk_𣬧)٦ws㮵]sr/IY%Ki Z۲a{=?8ßRSEunA4"͒go&(J|@] ?Z\;F(`77^Cڏ;Eu,R,Fd<ɝGAZ: J}CFȄ~%(^o.$RHOeg%IN[ %EǩG_r3\0ӐxxMPt.Br;J r:Hf>`)[ޑ 3qXNKY{ H>94.@\aK\QclVYbkl4HK-V+y !kb8>bkS7+oOؤ̸h碯ȑ8EYw.j#$^r&~5q*3 Xyyv܏} (7W? +BQ ۦiX)\L]Cu]DAgO#i+NqDbjc]{b 2(o0ۘkNǤg6A1DBӛz3c>ɣiF>u$Yz-XU\+┎.p[CN.L!8]toK,8m'/BذR7dq"eh TgV1/, 0ʯV}grd&V_Ԡuut4$vG!]&;D[!Bڪk,^(3J)(1aȩ_s',3xE/\i-I-7wpU]1օuWPvh^?6$҈cgݹϺ D*,~9_qk#BOب죢(#:>{ĸ[´y:jm 'T^1C'9P0H4ACn]4p7>>f=:P%#dd)٩LbX`:Ud##8Rrb}@'^_Ub䒠/ { ctREsOBE#/{~ LPKo{crTuV=aM_n=UwMOUU+!;ıBl5- rMH()_9quԹdwsz%[צ0IRv˜PW$?(4 %-js̩#/;K*û-Biu-CQ)NbmB8!FKiؒd0Ͽt93lu'ʈpX"}c7mJ6wnx *a3tABgQXIC//(OCvca6e,k{PYY(]Ij27Aߖ;V_B AMRsrОqIʋеj64[ |sGBXkphcit%ܴFb) jԋ'Q]||x;UZl ל16G6>|o /|GmWH"8UfK1ݟe@1pO} ,<'I?NU?擵BgX,5cȀ\5d~A[ӳr0s.Ԓ9EM'6}*)DwqA=r5rh@zZtrmK_}XblÞ 6KVIaCg{kp? :(jLۧ(xj1N+p-QN]Kc9u\+0ga|lc ׎ÑDž-=;XD/3dw$o*')[y{ lg'ۈs(ċ0#7?D7%Im75_58J[3WJ{Z=#[[/Qw_yI[dƁH 5ޫr\ @=_ ?vME?۔7F$P\7u}+qZ x:u?E7]8= 3'I81AF?N}V<v-ԧ|pYdXHi0:c:qI26al&;^eC_q$O^ѬGF)HZ25!tOk v1+u6uf]HKṎ:׾gۥXO^+,5U˨^GeixKRG{jg%/N$HYِĺ܀\NfZgGV2ݾJrNm5ӹ(s-?*S$β#@ùCMԸfeyE1hjx@k 3PX)\6Tw/IRAylCZP /+ݟ]E>:gu"%yl~c#?tұ,^Ӱ:[ÉaR]b%o @GqLOWMyg&, z[/~K0d \3,in4 '0H /w*lOtr][wH ,HQ։'gD▂aZ#Q7%)6LjS͡;lByw'߷F@S8$9MHl{Q8k+D ls #L.EB 6MPPx xdbu|,eN?s=+8QDl4D(UZHcc;-jL"CPumP~h#~.GOmxXzןvqKL&D7HQy_%Ok"s> xn!I`>dVܩ< t5w*;('s_ mv4<0L6슓$tuǷF^YK^G? YANs)C`R!h2Za^SR.'ӁFv8CWX8, Isc/SH®vIGx07> Y'嬂~? ,pZ%{auM4YaPP`R14FؘCԝ ucHCWf&w13~LGC  #pNYfߪ#f5ڔVq;otA'\E#Ğ(v׊$0P,L2u-^')=-uS>큠9߲!f-چ.`润cBݝeӯFA>7aNcE->4њʁavb ˝7(mz'mlioAf2ː(9;DFSLQa uGOf+}%>EoZ +//ެ42j7k[fdL;! ޑw ߟ<]I-rGǒ#)egv' GxA<"5 z^F! = .H\ rM[ u*k78f~2lk*]z 3`]}'0Wق3ڊ:J#qu?x-Kd| ll-2Z/Km,+&8b:=5OFA핵CRDה_"˙>KE5Qf!k]a#0xkYJ?9dًzOEiO?]9HY@4>`o[DvC7"<>xmرKL.s:“L}yNj|ҙ񚣊Fsrw(EeqyN" MJ7BKN!O3XոvԄ2vU<83ZZeMK7%i-AgVݮJ%.~# 8ICOĹHڐXRR6SBKer8~uȦ\=aWEӛhݎ$)͒a@RidwW@5'eKNxΰmZ4&T]8w6cۼS]p؏B?(y9>K$:țԅ. ME,_!]%Yaæ1hT^7ff$+C&՜*wFso <:=K듯'[s7K;&T1"hmU(4ěe^)EX+^[;?vmr_ؐELC|\.K2L}s bNqhMڝw P,$҇xJ窲op {2XJC7¹ZN_f1@ ;Sٓk ϋAo%;^cJ\~Nh5g贑V2/q^c[-pFBNE{fn3wZvbė_TЯt#m77]t$?h.vw0De\e:P!mRZX!6 $keg3NKr35^{c6x6 VRe2Lһ4֏gG 4]\4*{ulųeVKu,|z$sKL,i W273,t{N4્" ` Чӫ>aK |PBۯX1XH/"UDҿr"C=B%=j}2#R_ӄLci&[fkQuK{:0{NrF>G#HY|<ó\~"+ާ- m9o,IX2+ `Pfu(5Zr &wS`3)A*ѳ?D9j6 PHDMap{M engaX/a p4JAqZ%k;S,z'RU"^~I`C7. mW_cD H,L8`kWnSmVbZfUHo֛ѮNYsx[MQӼ%==~NW *DQ?:qG}a2G1'6"IVT;*4YLي(M~ZBsrZ hx'˙fs^s[,fY&;WL/&{\>NnF5PqɁ3i+9rD 2.SwhX~4 ~/9ϿuT>#?b/l׵v]q_xZ`[2._O%OND&Czdq$GYWi|HH?-Nx5!:0L;]k͂T,&S k&5pBW +gsփV{uĎs][Ӓ~s#O!ty"'w.z+ Igs>plxX+ 5@?N~ܢ@#?q:w_HmP _U_hp[Ked0*lE7p;{Ī٨joVy5BH:+bZ!/<~"8|.W2KU8l)(EV;T8:oop}ߏŀ+~s/6|pl{Z|ԦHsZXeֵLByn~ڰ'Rc7//NU-mGv?V[k Wiݬ:) & \&:}PDVծZn,"U/U?ulqAȥ'5_yl-­9]וe-ov+~g `"Z[ 3 Dw{t3vr"-{q]{%J}{:yʹ/; !}x a7E W59K@cO@k6<=C*$"+Jh-K&`u@=f cNaS@ܱ[ʑF]z@ D>H@K_c qC 4 ZL:^ԬSiː:ٳ;G03JKir|ڄ2BgO8]4 ɤ /o_mF]%>ǘ^@Gzr3k>G.ä߾?idL(QHqY`l9g ^ |}%DSiFL2\U(K1;\c|vZ't>,{N\#y;ߺ/Fti )wɩ{/BwMOgfP(ЯLػMӔH o^{R[G1]W{#lqa$Ms|A FI~!0z+GN85j'j!/pXsh_7sZL1ϫ 7{$|3_] T {2jEOLoX :͋ a6vLjØ\P4+W ;K,%f9S2Zt5^ ߦZZ@BR}-AAь=C XѣtOpol+>p:bh)YMu. Oc0.sTܷAͪ~4sŰ[oӆ#WdWh̰`'"a8"@{Aj`>ncV"J!0xn ߽+v[ηĿDZ7By yGii6U:N!ڧ Lfj>$(z4EJfC^A1rL~̡IyM*` yz!bs!%1w߀%zFƝ$p:;`||s+rƨK GwM2Hc$9p/m->mpbϥz-\i*Hj!tfriaoiHG`FtrV3QHeL$dkuE_g.wŒ^sKϻ{n0it5<qi`5*㴧bWhCEh,n)pQޫ $QF( 0fh}-a.|"zu&UaF1^- tQh9 qFG9L(D寃$-Q O /g>t] Pz"zsc;t}jՆqHy!lOی *yxQSfD +@6D%G!liǀS ,*MyDVqtP;}NBUXhH٢ ʽ`N[yxڔ55@^ÀO$N@nJ6L&vmUUf5v2_Zp‡* )ebz2 r+Ulݙ/UJ V҂|d:ys7U7o>-xfqC.mluf`x3hئ=e;7Ug,D13zkMRg^ALlDtaoEsUƿ}t|-Ywf&4&orEZx6KX^켡Skh'aT\FfI J2wTK+{2TLI΁#0rbC?áNm>6 *uDl12-V T@Btʳ l'uaCC?KZP*2c"됙.ݠ<}wpdUr_."RӽH<2^s-ǧk(9],BQ(g17=S 5i޳ w"AZ)@䗆cC;2ر@+lhO'魩 sT[7*b-q C&AV?E `(B6:oj:WPf`:3dΈY9ףjȊIbc3]!}Zl"6{>!GiyO{X &V_氊8 w2c@NyaiIm]ie0|+a+3x -C+tr TNoM]ljQʴx8N#L O_cRQX!VǏo'6DYN3,EQ-=U@[1(vWu%0 c'[0窕{9Ng#}E]_&  iB 9]"YeiSzt`w`;5<%x_ɂj9=|Z~?©uWg+x,ZU?ڌ u;|%GhCC:}}ץkҎ 8=ݦILZpI <೫lth([i5O2VkmTOoY2f`f*~i!xuY9Y 3BEo'I2`E]T>ŅB}R@g8?(9 S|J}7&}*Sԋb=WILr2sPzKG6JYO2]tfߢI;Y_29DԬMTA|-L]{V%CizYvfW׃Dj Jzie]Z%)WR^-`-FiD.?o0t(}@+^H9_<zփ4wݠDJC0`(n'x"/[ץ,9NɏPD-um%62O2VKhbe7fǷK/Ad AvږP"?v{v$H-RT:9N&i!^NҺvH>E"+ݖLW|DNK˶y ZhxnCMT'OK [zI&MZtJ⨍̷7 XV/c1*.F!: pb}wГx\r!½u n[¾(F?4v0 [6SX ZΟ %NQVx; z6PbY܉v !\SC ܕrm'‚Jceͮ.^/X5WW $ 4Ba3ײYsXB_Pnm蚿Xf`̘jnJTs@WlHZA>f;4i@Qبm?B%< ih!CַegeP/T2@Dn[NA]qVB*mOKnohm纟Hlrs~ `ԗHǀa> tR;+`b=#H`Y(`,LF+p!] PF-mKT'%T0.)9`a9OGotٗy|x* aϾW":q2=HiQޭi2;=\2%zv+&u2X5ޘ6SA0fcȾ% QutAn?[E'OƱ_EaxD9٣^%ErFJaڵwÚ6=;RZ\AP,$Qy'P.8gĥ9 ,Q±j;+r2F vcbw?5Xܘe?,3DsmDX~'32zRg{+ȷSx2*dj~0\E:f.Y!&jƕ=%$du.1ت";v7ֱ!5TR6uoU56~9lK#A)u 7T>Vi:ЋJõcāw~/ad8hT.Dr4â#=ďąFʠiG'Q!A]! '\$t1jX}!/ Ht[Tq6 1] Q}z˾8y;wч0]x'ļ;%Sȷ wu 9ߒM=:>ja*^ٖX 7hSugQ]$Rv+ hS{XoLR-vz7N1>k1)'[ Cf+y^f}=d "--{-*V.Vn苨Gvɬ|#vk |&zt׸OP˕(r)h|@vdא ;&=YbM-'.dҟxdz--ɑ %yrI̥Ł՘>^)2Ero.IrSŴ9~?8Z ٞ)4KaZ2t2re 3]ǐ=t尅SŦQu $T)34 cz>*9t>ɰjx0['|v~8StF>puDt9?g&+bί2YDg 陛g)t .ܮz sujfg,hkcc&ooI3)pO_|(4XonKVMɽs)!S֡F$xm~H;,ċGbރBR3ݨqU)VltvXۯKe//7a@uVͅ& cQ,Cb'+*9)vپ{b 3{UGf#\}D;ưP|-zV"?(26W}VT$O(PɦQ<?8Fiҿ]Ei4;rJ1vlB3)b1k n7(ĐX'gfU=Ag/+Be}}/oAԼfv΁Cr%aVCN3|߆V3 ~ 2Lr<]Er侵|؝\uDA9o2*7->oqcr fPfZ V6]LSu/QT+7ưԜ |M Ze'-㚽ӳttg4ZkԽeg)p93uvȩ.DV-OLkj NY!ʤPDU#l) _߳ V8u4@e de’6:ʗ\-5"e48AYM_k4B~hZX\?u@-4RHD$z ~/I#ϠtQ.*~( SC[ZVkC-1LcuTɐ9)J)%bVxL 8sgMbB?'fcNzOsc\d^J+ Mهf8gh{ TN4Ҫ&?*W7/carU>^ւS.9z@$&W%= N`VYp\;77 Ӳ ff L I]:bqǜ?ak(9^a0j4ȞR1y W}6R_H(Cg:Կcbr@_t́2GNƉKi@Nl92qnޅJSy͞wzzaȇm* TLG 쇃ڙ1m]b|ẑ1HOy= x PNNhAJB4;O$:b$7l14J~+D8{5i|6R{Ԥ·0V`7svo!؂&d(VrY XG8lirdBXT$<~e"ra  KыҼXVihRS,cvj9!ݽilgUҹ- < /_cf-nC'e=0rQeWQ;N䫶%9f5bLD\Wۃ{[ȲZ3QkPU ۩0Z]\Jk쌖7w ._96"f7]M3M2 *JV+#?6PIUGОF>4/NLΝs|8F8=]'.CL~Hxk+lw7u'ܛP ^${A0>XИe}e%UHB uwBcKiYu2`gP}GM$ӘnU~(iYtt[քj>m2Ntѽ׊*9W֫ MFB8\P0#@ }À72|4,GBlW5s60럏4^9DB#w|%p'> -P_8?U9t&Faa 9_, 䜛eϐjr֣TtlOYݶjiMϷ{T6\}Ask)WtJUx2X˗ {qad <Ҧz~p46#qWQ tןpb WNȈeM=/x:YG a='ށ ]#CW9/rH41)HH \XS~{Hecb-:S  {:**a9Ez{Mr>QL}LI(UG@'Ϝ~C4f12@Rdl<C6?V";`o{(IY4QG&7vC[ 0V.g<v߶yg ȃp5Jpfg;{OЄ1gi'o?c ,Ҝ*_sD49%T1}|R 9u؅p047 {t#vK1dãhVZ^i( Lɏ]V\ .kњ>X QD3[R2?j.Rֽ<p)L0e|Hu!@! jE َz# zeyŸWԪj$?^d~Qυux2^I~ɗ%GJ3&w {Q-T ~ Ib~(Ak2I֯gQCe~SF(:|H@ mVz,tr"KNl>xe/p>r4q NιQxR'ߗcYa2v=wd=Kh$F![ǗMGm%fh%dacD3GbCvQt SþIWSh)/&F~7G\ms8 nb [?2Azq+@qi0dY+aWo7A!:d:2l9xb.l-…_Z^˭K_D4զ9>ET0H"s6g,gܗ㟗[4>%:+.[-_V;%+`р`k4"ݥ\T[b*"|T=stG[ >sVKMRpSV!Z[o`/}pp{S^W2k޶W AеS':׊>VMS1߁=7s-jek<}N.m.?6n-UAB._u@6v hg :8ИF۷-4nɫNùHj1,FXb:$xK6FXYgx)MHtӢ1XS2 ]=׽-| sްEZ)ޯFBr}kIa&YP JBXVu줄YO6 #h=tHg}H{chcݎK]pײiْ9maHNlmABF&H2 [>r;Yp;[`}MCe ݟ#},<b4ΒN6Ui3Ԧl,$ΛkHJ<@*@1hmnq!Q(2Vq>fYs R-̊@oP_-#Dw pރXU.NvP%̎sR D'1{vFȿYg(<FeTZ>A "_Q.Yz0C&a/ծd0H)$jS&p*n1O.J_>iD:uO*L&04 I\G'tނf tEX;fo-m#vԪP|IIx_V_t-')qfJџͿmYW,A87E00OYoB} .j̟bzA;;qr>SrFYnjPނ^owg#s)HEGmx Cb"Bn@@Q&\꿪'"߽R/Au:^5*K^)QA_72Ǖ?4+Щq#}&ڡ!kni=ypwq!-N?=:5}^v zeE`JYzivlY˧9/tPtG`ٚY7u_nnMCp45vd^[P {}N0$y0eS2e7(mJ8&iC" ~^_&HwMC Zc=$ǕЦ7ÔCo$tT 6j p:1bOn"_|W8Hr" R$]9qgXB$ g//I鳶gdu /d6EKR𭃞V 0 ^dJ~H9Ac? S @S',f6u4~baNiA3e!IK i. “UVvӃ S+ TNg24p1>fFYɵ7qkE'ִ gG8&@ ׬9;l@oKECXF.AJD<@dK t 5jY,of={[k[Q)3cBwG^v)a$Ql}P{]ѩ]'2/d9ӈDW F3:ա>ju>2ᑳ@Gizr&v@Kx2 "MR\H8ukhd>㾓8(QR&lO]{[*.dexR*ښ"%Wf3 {D9]WCÀ!墍9Lpƻuf<1,bLgxXZo_œ,@ TZ1 &wTڕ~|[| "fzCY'ōHn/lWH$c$ f5Aņ|mMŤa\X9eIҺ+"08vk)% { ѽcOeghht⥗eLAe-EaȄ݋,*."K4dqjhMQK"@jFO/@V* h0IY3,1 hs{|DžYK^ۏ)9P$|fT z1 ͢,ZhpY[I7„wLǵs#4Dq,fS39 M(y²zi%6[miҵx&[tb,ڠc"ԟ@d깟0y܊ G5Ym;(xeٌ`De p— o0ľ_?ٚ*M4W`[!Ƚ8ه{=fI 41ygaakrNM%u\ α[o]X%Jx Mlh͒5c^3EoDr;_VkۂJxF_LrEC`iwm49X4Y^G…,hܮ`BԒI,IXa6T/qGScf5ErG+ >BVAt[p H ژU1DQ MgUсmq}hA@٭f+&L]("nuq:[U^6LvV55mS]&.PR,F17\Q@, "H2_~/=|d*i<)8WS+w<2$;?(-y `hahLIsr!r?CVaVQ>i}kF2UgX|~:Շ% 2+;˳?;r-ka6_!)oB"k5Z1γ z^F12N._ -ɭAb` q'1Y?HQON2= O p3dI<ڎqi[V'Cپ3~fٙNA썴ܵ"_ߘXE9cŹ %c鞏o'!"o XL>l{WωXj/V 萜p=/m{`@ 6f[Yaru;|׼' ~J`<`ɗދ]1z}UFo褻oEb<ɹs3K݅-b/ΐK1T:7hDWxâܱ3 %1ϞK^58×NMH|<^Af]2*L}<=]hzȥ˂2\82DDM yqW~@vJ9ޅU?j98DطY{Pj<8~"9FuJ D!ܓv+ì4})S/렒R|RYB*g|h=t#Aj[ Sqg>S5!GnKQntzwJ"38uMfY'1̬HCu7Z}qV-/xhHiۈV4K% _𶰄~:lmJ>F_EFaeedzAsyܸE&&3oMӌڐ# ~n &YҳhGV0}Vp{8.Aִv?$y/{cUWVX+179Ys$6vW[n'`:U dé|*(LU$|LFf3j/sM% lPۺ8APBOt]9oS$Ӕ:ynyXKۗQկCa+?)vqqxLb,TYͯUK<ltھq6 q4Gn[*f[Omo9?gp"ͦACgk=68`q95fKJhO'fCe0Ezr3[{2w#}:~B8E:X5- aί$@FQRfK΅߶U.8[KիJ:cu; *`3N&N7y 4ZM+4il*/hWiCBj'RX'QT:ve MDZ4ʀ'r.}9دzOiPiq6ӖT8 No!$'zjx q=ecf=_! ?/׬Ң~ۼ\0?aTp-d"9ұB&gy0gZ$+I&(=cs1}i66RrP;wKI}xs!l:.ӫ_b\g=H?%Uh #a#.avSdWQ$8!=|`˺lN &1(T;Rj!Τo:$.: =~s-mVy[UPCq$俱8bri="M&u\?ٚEm+ j?)?6X ~Wsv`pOa7ɏ]'L~gq@ cDʯNO1rViqQ؍J#O{֡=:?@HE[*Bª;hq1!f_ǹ)?ig`CK3A ɳ1  óC \|D>z/ wϑ5E 2ŴI226U vLIݷ[ >BYu7@+7=n 0¦% .[ء bZy$nj]/GAa+zzm+HѮ\ȴA@6gVͬD,;`.F|^zE3Hơƻۨ{1DdNKV ռ:;) ~}! S)$iƈh܍ 򠠐w|1X_+D^bXM@16"Ӿ̹֙ 'H_HOh ~ٺ÷a?fZGj$5gcnQ/jӌ0厯3IP+QQ^y_A~^sjfE6EA6kz#`7i{2,DoCV϶&oPjW :ea F }w3+Αǡ ̨G"#O;̜8eve 5av|Arų}5/ִכ}F{cgP3dԼO`xT VO,=@{%Fꁉ(0[Ti&s@#!C JjjOIVbtq1w2œ=O% p̎% WC7;,ݞcCUBC(zg>p݈!8$/JЎh%"Z4c DMD>}af/ Ljhk9K B,BXѷS.g .'y`3;9lOd$䣸_×D m ڟƽ[4 V%1 oa0lj誰#{F "^ݝ{M˙2 mO&93Io}C#b?{Y5#3wwoOdwtc%WM!LEQYD,㶃~ (鸽Ë,3+N%Xdm9w>cn۞Ch,~ʇ;.w8x)xcxwĭڗ21Q~6CRڮѢќe}Ȩ'mewYFֶΏWPcWp1~{:%LZD(dz!9֖)LTt]v~C*|a/eỒSiw6͈*H@@ۣ^#åH4B'D:o F{mPj#Qmct9鵻e¶U= }-7 O~ kʶБqXJcO9+$+*hǠ3]I'C\=V2dF#qLmG*9r&bx.ոA ;W"oodܤךf!Ҍ٬žY]7Y&L1]1<慧{.XťmH 27>xlk +2;ݶ-Cŀ(_`wt.D-\oc؀]izڋTK0O͗GDMcolEGE~YH* w%MHk\. huNȍlpBdBBKiqtOIl- s! $գ_ *0D9]j7$k 7~َ8ks aP(j~5OHvR#%2hh(_56U_fXCZdÈO4!\m1}u4)B8HAƈ?c3o<)im1K1޷,|/@2|r)nIYb/EiLtC]`%Pf+A˻P_Ädοԃ.$L飤I4Kp(G8Q@BϖIΌJxc72ۃTax. L4-HHkj>Bn/kb+p`Q9lKZFLPc_jQ@Tj5q)l⮒ ̣-":JCPy/:_ Y;~E #:.k@1^҅`6:`-ݨYWXVgH\GJF[)UNY wlA/ʘ":KS 8Ks $ ѥ@”lDX0yO#7U]Ջ]IuD;KoC&oXY3L>pn2~{8zRVzyZ_PUrD d ^Xqݴk LS$:ҵ! K$x[ B2a7pm[945.{w]ھU aaW8h'z!2ew5~yjѦֈ 3fEIQeаwInSm}{@D >ܮz --7ޤ <ܛDO)jXHiN :2cMiVf&R;Kl'>RkRt|fβm*O(~%3 Ƕ,lDc68> t>M0$ZWo8m0~/>Zi؄BXG&JﲉIib]6f}Xr`MF{DɁ:@Ow>s$')'ŕoj(gr d#UF/SCxH͈*nU;0)B<_tk)`FvQ +*#N{aR Y,l%HqY_ŬxH[khHO !!2#ϵ^ ?#@ Ao+~zyPdhܴ_o _XVyO$.߽qPRŎYƫr]j-_;Oi3ʓT|,ΖLK҉8>0KuZ'!BYށX/Qߥ^{Ӯ(X򽸻b; ??pe}WޚB$!ޕ`![9 ia[+ZW W\ -!Ińy/Qz*3naf!7W`vi-Qʑ];߳'Y}8ztM?W!by.;CA"VQ9u^H Ogw-zއO@Q\~g=d::Qo{Ն~O+CO}=udO71[W4Bi>w{iC&t

;ӺfVo$R˅~Ӟ2yϥ~~Bhw= Jq/W}>]ШNR7LwL˞XzkCQͦӯ "׳VNېL57D,ڐϬNݬ>B* epf>]|C:<.-I 墖(]Pv`M,H*(/5TL,qj$ܬ[ٛa4~STo΁CG Յ"j0}.LRq nCK .f:J4sZ뿛O6\2%J7.o&f`pPW%vANt'?'Aws;ꉴΪ 1dܔ"1Db>+YW͌X>V|B)Nf /&V}C4 UG`:CXHyO"}dp0ÀEؙ+oTr˃P.~sFIKeЕz)/h09(`9SH5KpE6j@GS7,xWPqa`>0&3NSĮ ]]+[ gǩdN,-^̰hE9B TCLkM_ל;_NW3}@ # 63U-/ԃͅ).rT,>=I/!j'׉Vϰ 'xXPl&~6M32y{Q>A)#]ba-ֳ4Wo 0|2`_rz}f)0C ">uAX5I:D^0'z^D׬ZLם:ժ$;FnnaƔ"f 4@ ^2*p}^`w7P"]r&<OJ̀Z0,^gA 언7I=eGE|zSyQc Md3"n ԣ0=Pk m LJkD>G)Ty9kvxzO:BC)ݧǤ45u|YԾfJpٜAccpl3NEPuaA69piR.)%3a@Cp N2RW`|{54JͪO9@H Ye"?ƘN͑v. in 2 ɠ*^7ދ$yre]%4.: A <3qͭ/O͛1@W$am#o& ,Gቬ*ZP<)%}%;Y=y(CyUFd}.szT}^ vNz uϛE VU^?j$@Zq*a 2DiqkV¹gWIQ/1YMfdgϓf/6GU"lG6s$HAtLPYF5Yc}6ME~ ?o߰]%1H[ B_/(BYwQ7 Z@uClEV.Wk߈XG)fWJ59I*47@Oݚgs3 $ g V_q|/[+,0D }ɞr/gr]r?XEAkD$ rDr ⱁlq%p|XIF5V_Tմ92/}ǢPL tUv_k4{'N> ە!Ty^"7d<dž5Qߌ+92xri|TB;^YO4ޖ"hd Dy!,O Iw_OɅhC3}Y~%8YKw[}Yԡ6AiHwwM2>K_ė&|ӻKy9rpjZ[? bSe^0ɮ亻4*uyeIODc$))vGFp,x6} m1Tf-^uqE鮠\.] 5xQƁɡ9~㰂;xd=]"m ,SMa(6f`թDWrG^Ondʀ%4Z"OLfj5P9i\3/p+O(:S s1=J۩E#tmNA~4iA1#)G%[nNQKK;ECͨ 릘:b:}zV\Px>6 ЖY2!_xkH{a ƿho[W9Z?0 !e@XЇ],| Zmn=ԚTЍ1<D^E,~C4'_ %pعIe.M_TFR. &4!ڍa'E&)ʰT@#KK{8C;wKeAc`hNjW '5h5bJfzn#~{v.=d?V!C_گSdJUW|v@aoaj6v--ayrj=-ߌ'OMl+ G1R|6lK*uA{rd(7 lT%L;g5lA`(mSI&DY0A{ۆCZeXT`S]h6o'Ý>@FheR&ܚ<w9;nCh8uVA X2Lۤ#s.YlM=/~(WyFGe&G`$,*/hIԇEiim~\|XJs)(\;=Mؑ"xyzNt"&|r=GPO?cq:d%LZ}(aы*k )GFgnōZ0Ҏ$lV c4)Zdcba٨WisO@S)W {Htv\?~{;b\rE"7/xJqC2tuJ1 i\?=4T4Ԃ^I+5#]7fJmO-(+N?4Pu+|ք{H}sj5yLsa&6\E1?3vcc ? m&un j<Zڷ߉vp Yd0|iNiA+T .X4ņQB^m lф;\c)GqފB1NHn+?ɬ(yʳVnO$@!'cDl4&'C!8е=J@hAh ɺr3˘*tiW:,~_3<G'/̑ -up8E'/z9I[mқP*Uc[-wln&=M+fYocFAiUIMlxYS UC>d^l ɻrRQ-Izf\AxٳCQWS*~3ȎjSOw_2dXJw38Me;2K(>nh~̋ך0̢ݜ7 ="_KmR$ @{gJuJȘ]&IK Uz:$2ȃAԄLuX[Ď߫03C} =fTl|(S~=!TcyH Fd6;h%)ar(셦e]y=Lh|wסB֨)?œk6>r{5t[vBWP`. G5}fuY@m6 H|.V^3cSg%mЫ4}Gi[/p~Afw%W=#7$OYO3_ >kK;f̈f+}9"37U(iMy% 2LzSE@X?OBuDpx0VȤ+v`sn0M ;X1"Nr1V="+5LE@OYaȕB*'C}r'[At; ( /+](,`d@a)B7䔂r}8lQ; cPEFiMAhunMs}Ciżk20NVm^)kEG‘ÊuW|I)o֧f8l_%_q& //0 N0CG{~`"Kɥ#ŪW7޳7`b@HaDnӊIZ0n#.Se}>R"ޥ*J033V{0m|6]~ސ Ϫw/I b){0 $9strDsUy fBAk]Ûc4UfQ߁>;kQ揻%ȵ p T$>_)z#/&y2t?53l̥`o~U[&m+yIL_*%Ʀ͇8dpz{J _,YԽ5snF2i[HY;_UtщH]v? GEHFD  8m̵A+b:j>Vjq]z/i *YO6OJQ "g]ݱZДi>й0\@,J?ž8z=痩vUhWO$#fLzZy| c7D1t=>Hu.|nuپC@N.v+c¤Q(h gMK C6u5{Rّ@#ɌUsitN[x]xR >[~edPB5zA<ϸ!Vp<FJsg,HW]hJDjdx`GCꍛ(huGǝnķ6>6fH}{< 7y3i_Rrmv/ܲD)[GDI}p٬V*GC,(uߩ!q>ίR3jNѢEIT箙(TPQ#!@̸ZxdÊu=RakzH[7&c,=܌⬃Zo}R횔:s u0.hxvBZ|b',r@~Ooroܶ$tL eRk[=0YVMv1R~&z-4\ l/ hd/HgpkNd9!$ļoi0a֫~ŝ&oh2t`z o*1[nW 3Ic,[Lz /4TkAiKYB:" |q'W3ndG'ÒʧŮ`愎+8d1K>aGoTvWm@ {ۛrOYe#__m9z}Y3vo&.>RLc֓or>P֏aŹVӦQ{ Q!K]DiޥJ}'HL*y6^:bO^ZfG MBD(gf^zUHŘcL2 JTW=]q`6 Vj#zwpځ,0"5 )8(Z<l(ץM?C_qkt-`S-lГ%Fdb94f /,JnRbz)o7n]pH&v!8idEM?uT ~pc>hޓĪw?# l6ad_(KUQ/;Io1, z; YMz[0vq |  iq3@4~D؏|3a,5S'-د1q|;ZAz@zI]2DvS%Op'g4DcOA%;z Lr=LW!NC" 0Kթփ:/ 8,ۉ>_鐹'¨P_15_I``kW(6hPX65[k"Zk&'r3pzǐe{كg2vdA%3z9Y&6]"̚y9~'>G!j'QKIHSZˁe* $ԯ9R?XBDq3*Wޫv3w1DB%oʼnzwȏWgf~280}Qpf| x(paP@P}k}8*ڿE1c PE-2[CyuOsyZ}Onfy1Xf(?Bo򥁉'",LT0ߜFrrꗱixCO%+Vrځ܋F 3iZm;Z>!'ePmq-7ʴ .;* :7Y0^z}+9qV65|21z_3˅ v6vC92^y'2S ߮G|7}R:&[ yeӪw\޹eՄ;Zk^ro=̝=}Z^5ٿ%OA4&w3 SVWG :|W@>Ov^/gu՘#Ͱ@D+A{"*cϢjkeR+ef&ah@pk)T7TP^䭶ox4P-6f?)#a)SRZ_пQnͧ=X)ykxiP4Nj@y#HE>!$1i,uxK@"!0XtgͽZ!==ሖL,84n{V8ސ9Ws}(+D6-jdɽ A L$e7~ƧyFZCg3r*>n cD 2r~3/{tdetV$O3 HK:Z\5ם.+3lt4*xv[x53:FCE-/&sfoE:d)#WptI[|ñ.юkIإ>'9$ 2 Mp:N@t O!>5AdB{Dн"T&O3k^Ȇb?SNHgLedsҢ#\wC6woRE2hnc {=4uB$X~ E:T;N1Ҏ-hP[)KgdJf.`TL_  /qKlExlK3GcAe4sk13;"1& # W* . v θbL}m+Ү`< :7 ) CU[}jeѹ2MG$iTR+tOuJB@)/< q*>4OeuiȂcuetCotqw( ( U FR6ϧx`ea!F+QDBsI4M%uJ3TNj:PD.gHШ*3RҸڷpˁm1=r6L,D4N2O]-^Q35+YJi`’tdb^rLpx{VG-COs,:_տC\1:z3Yxod 'UpڂѢ smIER,kn#Ҧ2a D"׏<;fyten|M 8h@r٨D Ig.w(1O XRPxL}8?L$ݏyx3}K,(ozܿ혳c HF`)yR Xkq86e0 Da5_gs†菁>b}0|pvJ1q YGv<\-~_~N,O3 HfL "pᩲ1"[={թ}97O ;%|3E>rtENrCepA֕YT}n۳ `8p1~-OGy;TyrdH'eMژN[+9Oz#֭ #-o M].Z^փVѠh):Kӥ{5 ] ! V!bzg3h%%R;T }Iƚ_b|ek@9d8FjC w'$O#B4oI HG"Q0:4\ TC3#B!utHc ~>2U wv}ٸ([7 B%OHѧbʰ~nVe-Y]S 9~FTKH #Dαk\S*7U X>/"zFTۥω@=?}Jg{>Rqw P-f6Wb^YV[C9+g١[Qzyص4H9G(8,~1*%?R1S/i_JuFet}4vi*o? t1"'ku] k t>d=O+OfTi\? GeX.9cH^smD9rX:_nhbuC${z)-dB͂زLaf MǴ ]tsE4VX{.^2]*nhr3 HMQ&}qX̜s^>5uj^1o)VnO`\2UHU0iN%ۢFR2?G}vlM d?l]{zsoAWč!2LV0W_vL(_gD k5YbKB ڇ7,5f[f49:ް <(há ,=/CQN`_OsdhwHBw}!Ӗ@7fOTL,m4Nu~fb+\'k)XHzeQ>-ԣtNސH $6 nD_/#ik]0(Pf&X>آ0 jTy  {G@c tIq63vv<"1Z 'M"O^3 kѳm-j:ig y8>'bF6?pȄvJJڭD9߷tC c`W˔y9DuB.:%珁 nY(0pwOK537C$ D$|P!#JLg cY&`zw&NIX>."EOc!^/ !Ah6m JqBһ,.Ȗ]y?EQ T74WѰ>+ڷQFfw$]@ L ;̗̽4gpزq3S=EШÿBnx F؋%i X= xj#z%z(KSӚ9`L%KTm?ks:Td*`kKma]_&V8(,W3e3t nYvAvD/+`unj1w> d.#䁫k꽙94{60㿗%}A!=]NH<;X3EXd\ >@/yZW&=&_ە !ums lncwCeSi,SDjr=$*1-zZ3uwj|I87=ϒ>uƅdvR2G| (ߘɘuުt(-Hcaxo7g_=rAn_]M(0ȁVUdҜ€;t P >ݵƢD@:}<"OzTIf})@G"4PzFS"UOL&u_n]?LVT. f^LPb,2Kiȵ#Lށ l/u\D(-'gA"BҜD3?f{]YP|Tu8w4}C(ԾY!ɠ2xFJj'x)3w R#҃jە.v0N WIu~x,6A6BҌk&05hkA^(y[:LLHeSqynW߬BtfE^eqḶ| x+Ef[3ŪDEҎL4la/hSR8|MC^. A# `pTssOBmI?ьV;öch$;;Җz)n3pERL M`z5DыZ{cQF1{L5-~_B ?J_)y.|[h(9)Ou(ckxJnvipE 2Rk!Ne}|\1Ҿ"<W/WXQhLb@cŖ#^ /v(9Bas8.sn^VY?SIHK݀4K.cPA2n\tB'YwCyI/ /"Ð.1ﵭu5 _gT]`?q-2&] o}` "˝prLWЎf 8ㄕ½f9ZN0. *⎺f1Msߔ.`p8ŋ抣&Gz-F=Hfr&ӛ<=9Ϝ14BkʨaFo͈Vm-v])D(6dvthP%i(@je4D縳avH=ew5üU@%/75ƧuSLVbߐ [ 3 E 枩Ӓ:% M7L臡'A}!go߹1H&YTܙ T|9u{u&I m_@CtWΛkytA0xMpYޝD s[Ou|[J0sMMIF!4¾)qhn1SX0Y: ,ك ["iwpıж_J zW[b:VLϙNh vR^ bWjv0lC$3]A8M md\óD1y9ȏn;< 1owǦ.¢U;zsN; R̼`Yv| d@nxZb@ҀTw;惬W-dt[|&2d}NJO4ޫÜ \:@)[iwfÓк=r4 = F:sKszd}w, l5ʉ O 4޿ W8h}Af.Yi7ܗ{QbFF d#Ѵ'~6 b1>后]~o>Cm,2hğj&fJr^{ϢͮS_@%0jQ\ ]^V'СARjM|'8*^8y(u-] ld4Od]?=ywPq87-_(5^.Mi-,hؼ=i\e5v =15l Φ>?ɖ9?S^Z97U}fo} 91qrsvm=pL}X%EMن3 *Cpvy!X){YctOu`oMO$VP v1h!?Ao)5iCB[0aWAa=פ:ٿoR:6jUJ.r|q+/'1xE"xL,Zpr71"leD&HX/)E1! dO au^6I?X}FܨY:onoNA 4 k}uToXv@/ K9Df7ǽW sOc:19ov`; C"RՈ5k +0 f5n 2S 8` cԡiBbJJWnRbθ1\OhUϞ=9KW-Z.VڨKsjg^F:4e~_lPGGB `h#|Ļ&hMF$)p40GAՓ{=Ӷs\g!mNʒ r\'Km6ҥj3ƭ\OjHZ|XcWO8BWͩƔǩt>f v3yy8"S'燕T0[2 R}їA $Hv}e/%_4=LĤ{@sO鋶 .:{'cSRn4sX07UFz:3'~hAS;W{P~WɅE0vPEMyϼw[ctG.jQ.&XIP RU\  g x|P'#N-p$=߄dWҾ-%7ͧu6QQ7 ~@@w 6?tБeh&A*zKL8cbuƖ;@e!ٲl4+uڻs7q Mo&a_vdCs("R9VxѡVK7mUAg1sUZXn$ROJ@4M{>Ơi;G`qbyũ;osD"xh ~.)5٬ A:ڕ0[>EIV o/>#E\aw܇G*UONw~$wɴO%Ϝ8$=FmO2uJlOy&cP~#9Vɕ5XY<tlWk8ŞK-?+:hLf)RM:K/AABL}+|2 }F$,dǶ KTmXF XŢH؆_ M:)4 b]dk`XirtHJ,`(SNe,fE;},Qg=2+BB7YFT!~hsƽ ERQbUbrZ8X[_،> 縶vԶOdD拏Cp<8݃^^S2J<8b=FRF)ucn <dPfH~t#H*ſ {ƻXc%puL:! Ӵ 6@3HB(JoFBf'+\Ma,qjK<:9[-<3<oo綂_Чg$KI3wd;HTJÌXҟg)q4|c@ֳv5VCۯ\y\&<"ya$h>{<`P* dmfsO HMqX 3Uʃ^r'L3o##%r"NXN%‚I"nR;5!ՙ2zE]WPnVrkt6ɤ";*^&Xut\-AD;SQvtSS,TDhuU:C3hu.prumUl"Xkٸ]OXB-uhX lU[BUDd#W8 V#bHe:ƒ5l.Xl"$AȾFHM1P %ڸ;܂C(v:' E֐a^¼ HVA[6j/xaPGo5%J[ Bgq fnGa}YYު8|qw;VOGA[.>UMu@wm<<_!!M~KChH=uf"mo)Y0zDdZ'gy*!}R|.OtKej6a-)ƿtRv"G&߼oe)ٵR\ }؞Xށ["~e.u'G,]%y L C{g0SKPɒ!ؼDu׆D|Д/aaNR+J } a1\B`U-d7*s_J'۽rsD֨§(2gIOMɘ}"[|Q1cN/_4=XSq[3Z*X^*1 ݀&>;mc 2ZBp))Z^!k9~ĠZy;VvSy$ iz  Cpk<*ŷY†j|c)K݈J=)~VêZ$)o5|8'4(5ޜ;ds1~ۂpʀ4d+Z8R5O**zF0'0}wď\kTY_VOsIPPn^)ir~`Cq@ͤ_S0-蹫G-խԘ Z|3P'G]t@@5=wVtfkl6AG.{#D L7FC x}e\li)Ք-? $lO`D-Z 1>[b\R13ޜl qtjp5.\‡^U9l^oDK޷!gē LUP1;#$먬cN> FT'fbsDgGb4l(mRF`>1hf9ϓ0F{u2Ix"ńvڻ.hbSM,DuJX!7+z#v~0po@V(%s*$<$JJzYO9#Sv FN*uaԪ9DA5'u1>~+?hPaZ6Л`X3~ Kپ orJ tJ1ɻr1W&f_KϠPV0RoE<=Sќ2b.5nng`ը_}'t/v4B빻0X3 jy+;ӊxtIRc"( ¥/'oH=p"6φL[nD`va4a*`+}i80§?u1D=- H152d2wig9SU0 YZtimeSeries/man/0000755000176000001440000000000013612573075013177 5ustar ripleyuserstimeSeries/man/base-diff.Rd0000644000176000001440000000234412407026706015304 0ustar ripleyusers\name{diff} \title{diff} \alias{diff} \alias{diff,timeSeries-method} \description{ Differences a 'timeSeries' 0bject. } \usage{ diff(x, \dots) } % lag=1, diff=1, trim=FALSE, pad=NA, \arguments{ \item{x}{ an object of class 'timeSeries'. } \item{\dots}{ further arguments to be passed. These may include } } \details{ Arguments to be passed may include:\cr \code{lag} - an integer indicating which lag to use. By default 1.\cr \code{diff} - an integer indicating the order of the difference. By default 1.\cr \code{trim} - a logical flag. Should NAs at the beginning of the series be removed? By default FALSE.\cr \code{pad} - a umeric value with which NAs should be replaced at the beginning of the series. By default NA. } \value{ Returns a differenced S4 'timeSeries' object. } \examples{ ## Load Microsoft Data Set - x <- MSFT[1:12, ] x ## Compute Differences - diff(x) ## Trimmed Differences - diff(x, trim=TRUE) ## Padded Differences - diff(x, trim=FALSE, pad=0) } \keyword{chron} timeSeries/man/fin-wealth.Rd0000644000176000001440000000117712407027632015524 0ustar ripleyusers\name{wealth} \title{Conversion of an index to wealth} \alias{index2wealth} \description{ Converts an index series to a wealth series normalizing the starting value to one. } \usage{ index2wealth(x) } \arguments{ \item{x}{ an object of class 'timeSeries'. } } \value{ returns a time series object of the same class as the input argument \code{x} normalizing the starting value to one. } \examples{ ## Load MSFT Open Prices - INDEX <- MSFT[1:20, 1] INDEX ## Compute Wealth Normalized to 100 - 100 * index2wealth(INDEX) } \keyword{chron} timeSeries/man/base-subsetting.Rd0000644000176000001440000001230212407026706016556 0ustar ripleyusers\name{TimeSeriesSubsettings} \alias{TimeSeriesSubsettings} \alias{[,timeSeries,ANY,index_timeSeries-method} \alias{[,timeSeries,character,character-method} \alias{[,timeSeries,character,index_timeSeries-method} \alias{[,timeSeries,character,missing-method} \alias{[,timeSeries,index_timeSeries,character-method} \alias{[,timeSeries,index_timeSeries,index_timeSeries-method} \alias{[,timeSeries,index_timeSeries,missing-method} \alias{[,timeSeries,matrix,index_timeSeries-method} \alias{[,timeSeries,matrix,missing-method} \alias{[,timeSeries,missing,character-method} \alias{[,timeSeries,missing,index_timeSeries-method} \alias{[,timeSeries,missing,missing-method} \alias{[,timeSeries,timeDate,character-method} \alias{[,timeSeries,timeDate,index_timeSeries-method} \alias{[,timeSeries,timeDate,missing-method} \alias{[,timeSeries,timeSeries,index_timeSeries-method} \alias{[,timeSeries,timeSeries,missing-method} \alias{[,timeSeries,time_timeSeries,ANY-method} \alias{[,timeSeries,time_timeSeries,character-method} \alias{[,timeSeries,time_timeSeries,index_timeSeries-method} \alias{[,timeSeries,time_timeSeries,missing-method} \alias{$,timeSeries-method} \alias{[<-,timeSeries,timeDate,index_timeSeries-method} \alias{[<-,timeSeries,timeDate,missing-method} \alias{[<-,timeSeries,timeSeries,index_timeSeries-method} \alias{[<-,timeSeries,timeSeries,missing-method} \alias{[<-,timeSeries,character,character-method} \alias{[<-,timeSeries,character,index_timeSeries-method} \alias{[<-,timeSeries,character,missing-method} \alias{[<-,timeSeries,index_timeSeries,character-method} \alias{[<-,timeSeries,matrix,character-method} \alias{[<-,timeSeries,timeDate,character-method} \alias{[<-,timeSeries,timeSeries,character-method} \alias{[<-,timeSeries,character,ANY-method} \alias{[<-,timeSeries,timeDate,ANY-method} \alias{$<-,timeSeries,ANY-method} \alias{$<-,timeSeries,factor-method} \alias{$<-,timeSeries,numeric-method} \alias{$<-,timeSeries,ANY,ANY-method} \alias{$<-,timeSeries,ANY,factor-method} \alias{$<-,timeSeries,ANY,numeric-method} \alias{window,timeSeries-method} \alias{cut,timeSeries-method} \alias{head,timeSeries-method} \alias{tail,timeSeries-method} \alias{window.timeSeries} \alias{cut.timeSeries} \alias{head.timeSeries} \alias{tail.timeSeries} \alias{outlier} \alias{outlier,timeSeries-method} \alias{outlier,ANY-method} \title{Subsettig Time Series} \description{ Subset a 'timeSeries' objects due to different aspects. \cr \tabular{ll}{ \code{[} \tab "[" method for a 'timeSeries' object, \cr \code{[<-} \tab "[<-" method to assign value for a subset of a 'timeSeries' object, \cr \code{window} \tab Windows a piece from a 'timeSeries' object, \cr \code{cut} \tab A no longer used synonyme for window, \cr \code{head} \tab Returns the head of a 'timeSeries' object, \cr \code{tail} \tab Returns the tail of a 'timeSeries' object, \cr \code{outliers} \tab Removes outliers from a 'timeSeries' object. } } \usage{ % \method{[}{timeSeries}(x, i, j, drop) % \method{[}{timeSeries}(x, i, j) <- value \S4method{window}{timeSeries}(x, start, end, \dots) \S4method{head}{timeSeries}(x, n = 6, recordIDs = FALSE, \dots) \S4method{tail}{timeSeries}(x, n = 6, recordIDs = FALSE, \dots) \S4method{outlier}{timeSeries}(x, sd = 3, complement = TRUE, \dots) \S4method{cut}{timeSeries}(x, from, to, \dots) } \arguments{ \item{complement}{ [outlierSeries] - \cr a logical flag, should the outler series or its complement be returns, by default \code{TRUE} which returns the series free of outliers. } \item{from, to}{ starting date and end date, \code{to} must be after \code{from}. } \item{start, end}{ starting date and end date, \code{end} must be after \code{start}. } % \item{i, j}{ % ["["] - \cr % index arguments used for subsettings. % } \item{n}{ [head][tail] - \cr an integer specifying the number of lines to be returned. By default \code{n=6}. } \item{recordIDs}{ [head][tail] - \cr a logical value. Should the \code{recordIDs} returned together with the data matrix and time series positions? } \item{sd}{ [outlierSeries] - \cr a numeric value of standard deviations, e.g. 10 means that values larger or smaller tahn ten times the standard deviation will be removed from the series. } % \item{value}{ % a numeric value to use as a replacement. It will be repeated a % whole number of times if necessary. % } \item{x}{ an object of class \code{timeSeries}. } \item{\dots}{ arguments passed to other methods. } } \value{ All functions return an object of class 'timeSeries'. } \examples{ ## Create an Artificial timeSeries Object - setRmetricsOptions(myFinCenter = "GMT") charvec <- timeCalendar() set.seed(4711) data <- matrix(exp(cumsum(rnorm(12, sd = 0.1)))) tS <- timeSeries(data, charvec, units = "tS") tS ## Subset Series by Counts "[" - tS[1:3, ] ## Subset the Head of the Series - head(tS, 6) } \keyword{chron} timeSeries/man/base-scale.Rd0000644000176000001440000000313612407026706015463 0ustar ripleyusers\name{scale} \title{scale} \description{ Scales a 'timeSeries' object. } \details{ \code{scale} is a function to center and/or scale the columns of a 'timeSeries' object. The value of \code{center} determines how column centering is performed. If \code{center} is a numeric vector with length equal to the number of columns of \code{x}, then each column of \code{x} has the corresponding value from \code{center} subtracted from it. If \code{center} is TRUE then centering is done by subtracting the column means (omitting NAs) of \code{x} from their corresponding columns, and if \code{center} is FALSE, no centering is done. The value of \code{scale} determines how column scaling is performed (after centering). If \code{scale} is a numeric vector with length equal to the number of columns of \code{x}, then each column of \code{x} is divided by the corresponding value from \code{scale}. If \code{scale} is TRUE then scaling is done by dividing the (centered) columns of \code{x} by their standard deviations if \code{center} is TRUE, and the root mean square otherwise. If \code{scale} is FALSE, no scaling is done. } \value{ Returns a centered and/or scaled 'timeSeries' object. } \examples{ ## Load Series: x <- 100* LPP2005REC[, c("SBI", "SPI")] ## Scale and Center - X <- scale(x) hist(X[, 1], prob=TRUE) s <- seq(-3, 3, length=201) lines(s, dnorm(s), col="red") } \keyword{chron} timeSeries/man/base-attach.Rd0000644000176000001440000000367612407026706015651 0ustar ripleyusers\name{attach} \title{Attach a timSeries to the search path} \alias{attach} \alias{attach,timeSeries-method} \description{ Attaches a 'timeSeries' object to the search path. } \usage{ \S4method{attach}{timeSeries}(what, pos = 2, name = deparse(substitute(what)), warn.conflicts = TRUE) } \note{ Note, the function \code{detach} from the \code{base} package can be used to detach the attached objects. } \arguments{ \item{name}{ alternative way to specify the database to be attached. See for details \code{help(attach,package=base)}. } \item{pos}{ an integer specifying position in \code{search()} where to attach the database. See for details \code{help(attach,package=base)}. } \item{warn.conflicts}{ a logical value. If \code{TRUE}, warnings are printed about conflicts from attaching the database, unless that database contains an object \code{.conflicts.OK}. A conflict is a function masking a function, or a non-function masking a non-function. See for details \code{help(attach,package=base)}. } \item{what}{ [attach] - \cr database to be attached. This may currently be a timeSeries object, a data.frame or a list or a R data file created with save or NULL or an environment. See for details \code{help(attach, package=base)}. } } \value{ The environment is returned invisibly with a \code{name} attribute. } \examples{ ## Load Microsoft Data Set - x <- MSFT[1:10, ] colnames(x) ## Attach the Series and Compute the Range - attach(x) range <- High - Low range ## Convert Vector to a timeSeries Object - timeSeries(data=range, charvec=time(x), units="Range") ## Detach the series from the search path - detach("x") ans <- try(High, silent=TRUE) cat(ans[1]) } \keyword{chron} timeSeries/man/base-merge.Rd0000644000176000001440000000247012407026706015473 0ustar ripleyusers\name{merge} \title{Merges two 'timeSeries' objects} \alias{merge} \alias{merge,ANY,timeSeries-method} \alias{merge,timeSeries,ANY-method} \alias{merge,timeSeries,missing-method} \alias{merge,timeSeries,numeric-method} \alias{merge,timeSeries,matrix-method} \alias{merge,timeSeries,timeSeries-method} \alias{merge,matrix,timeSeries-method} \alias{merge,numeric,timeSeries-method} \description{ Merges several object types with 'timeSeries' objects. The number of rows must match. } \value{ Returns a 'timeSeries' object of two merged time series. } \details{ The following combinations are supported: \tabular{ll}{ \code{timeSeries} \tab ANY \cr \code{timeSeries} \tab missing \cr \code{timeSeries} \tab numeric \cr \code{timeSeries} \tab matrix \cr \code{timeSeries} \tab timeSeries } } \examples{ ## Load Series - x <- MSFT[1:12, ] ## Merge 'timeSeries' with missing Object - merge(x) ## Merge 'timeSeries' with numeric Object - y <- rnorm(12) class(y) merge(x, y) ## Merge 'timeSeries' with matrix Object - y <- matrix(rnorm(24), ncol=2) class(y) merge(x, y) ## Merge 'timeSeries' with matrix Object - y <- timeSeries(data=rnorm(12), charvec=time(x)) class(y) merge(x, y) } \keyword{chron} timeSeries/man/statistics-smoothLowess.Rd0000644000176000001440000000503612347663061020367 0ustar ripleyusers\name{smooth} \title{Smoothes Time Series Objects} \alias{smoothLowess} \alias{smoothSpline} \alias{smoothSupsmu} \description{ Smoothes a 'timeSeries' object. } \usage{ smoothLowess(x, f = 0.5, \dots) smoothSpline(x, spar = NULL, \dots) smoothSupsmu(x, bass = 5, \dots) } \arguments{ \item{x}{ an univariate 'timeSeries' object. } \item{f}{ the lowess smoother span. This gives the proportion of points in the plot which influence the smooth at each value. Larger values give more smoothness. } \item{spar}{ smoothing parameter, typically (but not necessarily) in (0,1]. By default \code{NULL}, i.e. the value will be automatically selected. } \item{bass}{ controls the smoothness of the fitted curve. Values of up to 10 indicate increasing smoothness. } \item{\dots}{ optional arguments to be passed to the underlying smoothers. } } \details{ The functions \code{smoothLowess}, \code{smoothSpline}, \code{smoothSupsmu} allow to smooth \code{timeSerie} object. The are interfaces to the function \code{lowess}, \code{supmsu}. and \code{smooth.spline} in R's \code{stats} package. The \code{\dots} arguments allow to pass optional arguments to the underlying \code{stats} functions and tailor the smoothing process. We refer to the manual pages of these functions for a proper setting of these options. } \value{ returns a bivariate 'timeSeries' object, the first column holds the original time series data, the second the smoothed series. } \author{ The R core team for the underlying smoother functions. } \examples{ ## Use Close from MSFT's Price Series - head(MSFT) MSFT.CLOSE <- MSFT[, "Close"] head(MSFT.CLOSE) ## Plot Original and Smoothed Series by Lowess - MSFT.LOWESS <- smoothLowess(MSFT.CLOSE, f = 0.1) head(MSFT.LOWESS) plot(MSFT.LOWESS) title(main = "Close - Lowess Smoothed") ## Plot Original and Smoothed Series by Splines - MSFT.SPLINE <- smoothSpline(MSFT.CLOSE, spar = 0.4) head(MSFT.SPLINE) plot(MSFT.SPLINE) title(main = "Close - Spline Smoothed") ## Plot Original and Smoothed Series by Supsmu - MSFT.SUPSMU <- smoothSupsmu(MSFT.CLOSE) head(MSFT.SUPSMU) plot(MSFT.SUPSMU) title(main = "Close - Spline Smoothed") } \keyword{chron} timeSeries/man/timeSeries-deprecated.Rd0000644000176000001440000000052211161704321017657 0ustar ripleyusers\name{timeSeries-deprecated} \title{Deprecated functions in timeSeries package} \alias{seriesPositions} \alias{newPositions<-} \description{ \tabular{ll}{ \code{seriesPositions} \tab Extracts positions slot from a 'timeSeries', \cr \code{newPositions<-} \tab Modifies positions of a 'timeSeries' object, \cr } } timeSeries/man/base-t.Rd0000644000176000001440000000074612407026706014643 0ustar ripleyusers\name{t} \title{timeSeries Transpose} \alias{t,timeSeries-method} \description{ Returns the transpose of a 'timeSeries' object. } \usage{ \S4method{t}{timeSeries}(x) } \arguments{ \item{x}{ a 'timeSeries' object. } } \value{ Returns a matrix object. } \examples{ ## Dummy timeSeries with NAs entries data <- matrix(1:24, ncol = 2) s <- timeSeries(data, timeCalendar()) s ## Transpose 'timeSeries' - t(s) } \keyword{chron} timeSeries/man/utils-structure.Rd0000644000176000001440000000126512407026706016663 0ustar ripleyusers\name{str-methods} \title{timeSeries Object Structure} \alias{str} \alias{str,timeSeries-method} \description{ Compactly display the structure of a 'timeSeries' Object. } \usage{ \S4method{str}{timeSeries}(object, \dots) } \arguments{ \item{object}{ an object of class \code{timeSeries}. } \item{\dots}{ arguments passed to other methods. } } \value{ returns a str report for an object of class \code{timeSeries}. } \examples{ ## Load Microsoft Data Set - data(MSFT) X <- MSFT[1:12, 1:4] colnames(X) <- abbreviate(colnames(X), 4) ## Display Structure - str(X) } \keyword{chron} timeSeries/man/base-apply.Rd0000644000176000001440000001121712407026706015520 0ustar ripleyusers\name{apply} \title{Apply Functions Over Time Series Periods} \alias{fapply} \alias{applySeries} \alias{apply,timeSeries-method} \description{ Applies a function to a 'timeSeries' object over time peridos of arbitrary positons and lengths. } \usage{ fapply(x, from, to, FUN, \dots) applySeries(x, from = NULL, to = NULL, by = c("monthly", "quarterly"), FUN = colMeans, units = NULL, format = x@format, zone = x@FinCenter, FinCenter = x@FinCenter, recordIDs = data.frame(), title = x@title, documentation = x@documentation, \dots) } \arguments{ \item{x}{ an object of class \code{timeSeries}. } \item{from, to}{ starting date and end date as timeDate objects. Note, \code{to} must be time ordered after \code{from}. If \code{from} and \code{to} are missing in function \code{fapply} they are set by default to \code{from=start(x)}, and \code{to=end(x)}. } \item{FUN}{ the function to be applied. For the function \code{applySeries} the default setting is \code{FUN=colMeans}. } \item{by}{ a character value either \code{"monthly"} or \code{"quarterly"} used in the function \code{applySeries}. The default value is \code{"monthly"}. Only operative when both arguments \code{from} and \code{to} have their default values \code{NULL}. In this case the function \code{FUN} will be applied to monthly or quarterly periods. } \item{units}{ an optional character string, which allows to overwrite the current column names of a \code{timeSeries} object. By default \code{NULL} which means that the column names are selected automatically. } \item{format}{ the format specification of the input character vector in POSIX notation. } \item{zone}{ the time zone or financial center where the data were recorded. } \item{FinCenter}{ a character value with the the location of the financial center named as "continent/city", or "city". } \item{recordIDs}{ a data frame which can be used for record identification information. Note, this is not yet handled by the apply functions, an empty data.frame will be returned. } \item{title}{ an optional title string, if not specified the inputs data name is deparsed. } \item{documentation}{ optional documentation string, or a vector of character strings. } \item{\dots}{ arguments passed to other methods. } } \details{ Like \code{apply} applies a function to the margins of an array, the function \code{fapply} applies a function to the time stamps or signal counts of a financial (therefore the "f" in front of the function name) time series of class \code{'timeSeries'}. The function \code{fapply} inputs a \code{timeSeries} object, and if \code{from} and \code{to} are missing, they take the start and end time stamps of the series as default falues. The function then behaves like \code{apply} on the column margin. Note, the function \code{fapply} can be used repetitive in the following sense: If \code{from} and \code{to} are two \code{timeDate} vectors of equal length then for each period spanned by the elelemts of the two vectors the function \code{FUN} will be applied to each period. The resulting time stamps, are the time stamps of the \code{to} vector. Note, the periods can be regular or irregelar, and they can even overlap. The function \code{fapply} calls the more general function \code{applySeries} which also offers, to create automatical monthly and quarterly periods. } \examples{ ## Percentual Returns of Swiss Bond Index and Performance Index - LPP <- 100 * LPP2005REC[, c("SBI", "SPI")] head(LPP, 20) ## Aggregate Quarterly Returns - applySeries(LPP, by = "quarterly", FUN = colSums) ## Aggregate Quarterly every last Friday in Quarter - oneDay <- 24*3600 from <- unique(timeFirstDayInQuarter(time(LPP))) - oneDay from <- timeLastNdayInMonth(from, nday = 5) to <- unique(timeLastDayInQuarter(time(LPP))) to <- timeLastNdayInMonth(to, nday = 5) data.frame(from = as.character(from), to = as.character(to)) applySeries(LPP, from, to, FUN = colSums) ## Count Trading Days per Month - colCounts <- function(x) rep(NROW(x), times = NCOL(x)) applySeries(LPP, FUN = colCounts, by = "monthly") ## Alternative Use - fapply(LPP, from, to, FUN = colSums) } \keyword{chron} timeSeries/man/statistics-colSums.Rd0000644000176000001440000000460211545077672017312 0ustar ripleyusers\name{colStats} \alias{colStats} \alias{colSums,timeSeries-method} \alias{colMeans,timeSeries-method} \alias{colSds} \alias{colVars} \alias{colSkewness} \alias{colKurtosis} \alias{colMaxs} \alias{colMins} \alias{colProds} \alias{colQuantiles} \alias{colAvgs} \alias{colStdevs} % \alias{mean.timeSeries} % \alias{var.timeSeries} \title{Column Statistics} \description{ A collection and description of functions to compute column statistical properties of financial and economic time series data. \cr The functions are: \tabular{ll}{ \code{colStats}\tab calculates column statistics, \cr \code{colSums} \tab calculates column sums, \cr \code{colMeans} \tab calculates column means, \cr \code{colSds} \tab calculates column standard deviations, \cr \code{colVars} \tab calculates column variances, \cr \code{colSkewness} \tab calculates column skewness, \cr \code{colKurtosis} \tab calculates column kurtosis, \cr \code{colMaxs} \tab calculates maximum values in each column, \cr \code{colMins} \tab calculates minimum values in each column, \cr \code{colProds} \tab computes product of all values in each column, \cr \code{colQuantiles} \tab computes quantiles of each column. } } \usage{ colStats(x, FUN, \dots) colSds(x, \dots) colVars(x, \dots) colSkewness(x, \dots) colKurtosis(x, \dots) colMaxs(x, \dots) colMins(x, \dots) colProds(x, \dots) colQuantiles(x, prob = 0.05, \dots) colStdevs(x, \dots) colAvgs(x, \dots) % \method{mean}{timeSeries}(x, \dots) % \method{var}{timeSeries}(x, \dots) } \arguments{ \item{FUN}{ a function name. The statistical function to be applied. } \item{prob}{ a numeric value, the probability with value in [0,1]. } \item{x}{ a rectangular object which can be transformed into a matrix by the function \code{as.matrix}. } \item{\dots}{ arguments to be passed. } } \value{ the functions return a numeric vector of the statistics. } \seealso{ \code{link{rowStats}}. } \examples{ ## Simulated Return Data in Matrix Form - x = matrix(rnorm(252), ncol = 2) ## Mean Columnwise Statistics - colStats(x, FUN = mean) ## Quantiles Column by Column - colQuantiles(x, prob = 0.10, type = 1) } \keyword{univar} timeSeries/man/timeSeries-isUnivariate.Rd0000644000176000001440000000212111245774216020234 0ustar ripleyusers\name{isUnivariate} \title{Checks if a Time Series is Univariate} \alias{isUnivariate} \alias{isMultivariate} \description{ Checks if a time series o bject or any other rectangular object is univariate or multivariate. } \usage{ isUnivariate(x) isMultivariate(x) } \arguments{ \item{x}{ an object of class \code{timeSeries} or any other rectangular object. } } \value{ \code{isUnivariate}\cr \code{isMultivariate}\cr \cr return a logical depending if the test is true or not. } \details{ A rectangular object \code{x} is considered to be univariate if the function \code{NCOL(x)} returns one, and is considered to be multivariate if \code{NCOL(x)} returns a value bigger than one. } \examples{ ## Load Microsoft Data - setRmetricsOptions(myFinCenter = "GMT") data(MSFT) Open = MSFT[, "Open"] ## Is the timeSeries Univariate - isUnivariate(MSFT) isUnivariate(Open) ## Is the timeSeries Multivariate - isMultivariate(MSFT) isMultivariate(Open) } \keyword{chron} timeSeries/man/stats-lag.Rd0000644000176000001440000000234012407026706015357 0ustar ripleyusers\name{lag} \title{Lag a Time Series} \alias{lag} \alias{lag,timeSeries-method} \alias{lag.timeSeries} \description{ Compute a lagged version of a 'timeSeries' object. } \usage{ \S4method{lag}{timeSeries}(x, k = 1, trim = FALSE, units = NULL, \dots) } \arguments{ \item{k}{ [lagSeries] - \cr an integer value. The number of lags (in units of observations). By default 1. } \item{trim}{ a logical value. By default \code{TRUE}, the first missing observation in the return series will be removed. } \item{units}{ an optional character string, which allows to overwrite the current column names of a \code{timeSeries} object. By default \code{NULL} which means that the column names are selected automatically. } \item{x}{ an object of class \code{timeSeries}. } \item{\dots}{ arguments passed to other methods. } } \value{ returns a lagged S4 object of class 'timeSeries'. } \examples{ ## Load Micsrosoft Data Set - x = MSFT[1:20, "Open"] ## Lag the timeSeries Object: lag(x, k = -1:1) } \keyword{chron} timeSeries/man/fin-align.Rd0000644000176000001440000000226412407026706015331 0ustar ripleyusers\name{align-methods} \docType{methods} \alias{align} \alias{align-methods} \alias{align,timeSeries-method} \title{timeSeries Class, Functions and Methods} \description{ Aligns a 'timeSeries' Object. } \usage{ \S4method{align}{timeSeries}(x, by = "1d", offset = "0s", method = c("before", "after", "interp", "fillNA", "fmm", "periodic", "natural", "monoH.FC"), include.weekends = FALSE, ...) } \arguments{ \item{x}{ an object of class \code{timeSeries}. } \item{by}{ a character string denoting the period } \item{offset}{ a character string denoting the offset } \item{method}{ a character string denoting the alignment approach. } \item{include.weekends}{ a logical flag, should weekend be included. } \item{\ldots}{ Further arguments to be passed to the interpolating function. } } \value{ Returns an aligned S4 'timeSeries' object. } \examples{ ## Use MSFT and Compute Sample Size - dim(MSFT) ## Align the Series - MSFT.AL <- align(MSFT) ## Show the Size of the Aligned Series - dim(MSFT.AL) } \keyword{methods} \keyword{chron} timeSeries/man/utils-description.Rd0000644000176000001440000000042611545122343017140 0ustar ripleyusers\name{description} \alias{description} \title{Creates Date and User Information} \description{ Creates and returns a data and user string. } \usage{ description() } \examples{ ## Show Default Description String - description() } \keyword{programming} timeSeries/man/methods-plot.Rd0000644000176000001440000001766612407026706016120 0ustar ripleyusers\name{plot-methods} \title{Plot a Time Series} \alias{plot} \alias{plot,timeSeries-method} \alias{lines,timeSeries-method} \alias{points,timeSeries-method} \alias{pretty.timeSeries} \description{ Plots 'timeSeries' objects and add lines and points. } \usage{ \S4method{plot}{timeSeries}(x, y, FinCenter = NULL, plot.type = c("multiple", "single"), format = "auto", at = pretty(x), widths = 1, heights = 1, xy.labels, xy.lines, panel = lines, nc, yax.flip = FALSE, mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), oma.multi = c(6, 0, 5, 0), axes = TRUE, \ldots) \S4method{lines}{timeSeries}(x, FinCenter = NULL, \dots) \S4method{points}{timeSeries}(x, FinCenter = NULL, \dots) \method{pretty}{timeSeries}(x, n=5, min.n=n\%/\%3, shrink.sml=0.75, high.u.bias=1.5, u5.bias=0.5+1.5*high.u.bias, eps.correct=0, \dots) } \details{ The original plotting function \code{plot} was build along R's plotting function \code{plot.ts} with an additional argument to tailor the position marks at user defined position specified by the argument \code{at}. We call this style or theme "ts". With Verison R 3.1 we have inroduced two new additionol plotting themes called "pretty" and "chick". They are becoming active when we set \code{at="pretty"} or \code{at="chic"}. Plot style or theme "pretty" is an extension of our original plotting function. Plot style or theme "chic" an implementation along the contributed packages \code{xts} and \code{PerformanceAnalytics} from the Chicago finance group members. "Chicago" gave the name to call the them \code{"chic"}. For both themes, "pretty" and "chic" additional arguments are passed through the \code{\dots} arguments. These are: \tabular{lll}{ \code{Argument:} \tab Default: \tab Description: \cr \code{type} \tab "l" \tab types pf plot \cr \code{col} \tab 1 \tab colors for lines and points \cr \code{pch} \tab 20 \tab plot symbol \cr \code{cex} \tab 1 \tab character and symbol scales \cr \code{lty} \tab 1 \tab line types \cr \code{lwd} \tab 2 \tab line widths \cr \code{cex.axes} \tab 1 \tab scale of axes \cr \code{cex.lab} \tab 1 \tab scale of labels \cr \code{cex.pch} \tab 1 \tab scale of plot symbols \cr \code{} \tab \tab \cr \code{grid} \tab TRUE \tab should grid lines plotted? \cr \code{frame.plot} \tab TRUE \tab should b box around the plot? \cr \code{axes} \tab TRUE \tab should be axes drawn on the plot? \cr \code{ann} \tab TRUE \tab should default annotations appear? } Concerning the plot elements, the length of these vectors has to be the same as the number of columns in the time series to be plotted. If their length is only one, then tey are repeated. There is an almost 70 pages vignette added to the package, with dozens of examples of tailored plots. Have a look in it. } \arguments{ \item{x, y }{ objects of class \code{timeSeries}. } \item{FinCenter}{ a character with the the location of the financial center named as \code{"continent/city"}. } \item{plot.type}{ for multivariate time series, should the series by plotted separately (with a common time axis) or on a single plot? } \item{format}{POSIX label format, e.g. "\%Y-\%m-\%d" or "\%F" for ISO-8601 standard date format. } \item{at}{ a \code{timeDate} object setting the plot label positions. If \code{at=pretty(x)}, the postitions are generated automatized calling the function \code{pretty}. Default option \code{at="auto"} selects 6 equal spaced time label positions. For the new plot themes set at="pretty" or at="chic". In this case additional arguments can be passed through the \code{\dots} arguments, see details. } \item{widths, heights}{ widths and heights for individual graphs, see \code{layout}. } \item{xy.labels}{ logical, indicating if \code{text()} labels should be used for an x-y plot, \_or\_ character, supplying a vector of labels to be used. The default is to label for up to 150 points, and not for more. } \item{xy.lines}{ logical, indicating if \code{lines} should be drawn for an x-y plot. Defaults to the value of \code{xy.labels} if that is logical, otherwise to \code{TRUE} } \item{panel}{ a \code{function(x, col, bg, pch, type, ...)} which gives the action to be carried out in each panel of the display for \code{plot.type="multiple"}. The default is \code{lines}. } \item{nc}{ the number of columns to use when \code{type="multiple"}. Defaults to 1 for up to 4 series, otherwise to 2. } \item{yax.flip}{ logical indicating if the y-axis (ticks and numbering) should flip from side 2 (left) to 4 (right) from series to series when \code{type="multiple"}. } \item{mar.multi, oma.multi}{ the (default) \code{par} settings for \code{plot.type="multiple"}. } \item{axes}{ logical indicating if x- and y- axes should be drawn. } \item{n}{ an integer giving the desired number of intervals. } \item{min.n}{ a nonnegative integer giving the minimal number of intervals. } \item{shrink.sml}{ a positive numeric by a which a default scale is shrunk in the case when range(x) is very small. } \item{high.u.bias}{ a non-negative numeric, typically > 1. Larger high.u.bias values favor larger units. } \item{u5.bias}{ a non-negative numeric multiplier favoring factor 5 over 2. } \item{eps.correct}{ an integer code, one of {0,1,2}. If non-0, a correction is made at the boundaries. } \item{\dots}{ additional graphical arguments, see \code{plot}, \code{plot.default} and \code{par}. } } \value{ Displays a plot or plot elements of an object of class 'timeSeries'. } \examples{ ## Load Swiss Pension Fund Benchmark Data - LPP <- LPP2005REC[1:12, 1:4] colnames(LPP) <- abbreviate(colnames(LPP), 2) finCenter(LPP) <- "GMT" ## Example Plot 1 - plot(LPP[, 1], type = "o", col = "steelblue", main = "LPP", xlab = "2005", ylab = "Return") plot(LPP[, 1], at="auto", type = "o", col = "steelblue", main = "LPP", xlab = "2005", ylab = "Return") ## Example Plot 2 - plot(LPP[, 1:2], type = "o", col = "steelblue", main = "LPP", xlab = "2005", ylab = "Return") ## Example Plot 3 - plot(LPP[, 1], LPP[, 2], type = "p", col = "steelblue", main = "LPP", xlab = "Return 1", ylab = "Return 2") ## Example Plot 4a, The Wrong Way to do it! - LPP <- as.timeSeries(data(LPP2005REC)) ZRH <- as.timeSeries(LPP[,"SPI"], zone = "Zurich", FinCenter = "Zurich") NYC <- as.timeSeries(LPP[,"LMI"], zone = "NewYork", FinCenter = "NewYork") finCenter(ZRH) finCenter(NYC) plot(ZRH, at="auto", type = "p", pch = 19, col = "blue") points(NYC, pch = 19, col = "red") ## Example Plot 4b, Convert NYC to Zurich Time - finCenter(ZRH) <- "Zurich" finCenter(NYC) <- "Zurich" at <- unique(round(time(ZRH))) plot(ZRH, type = "p", pch = 19, col = "blue", format = "\%b \%d", at = at, xlab = paste(ZRH@FinCenter, "local Time"), main = ZRH@FinCenter) points(NYC, pch = 19, col = "red") ## Example 4c, Force Everything to GMT Using "FinCenter" Argument - finCenter(ZRH) <- "Zurich" finCenter(NYC) <- "NewYork" at <- unique(round(time(ZRH))) plot(ZRH, type = "p", pch = 19, col = "blue", format = "\%b \%d", at = at, FinCenter = "GMT", xlab = "GMT", main = "ZRH - GMT") points(NYC, FinCenter = "GMT", pch = 19, col = "red") } \keyword{chron} timeSeries/man/base-start.Rd0000644000176000001440000000155712407026706015536 0ustar ripleyusers\name{start} \alias{start,timeSeries-method} \alias{start.timeSeries} \alias{end,timeSeries-method} \alias{end.timeSeries} \title{Start and End of a 'timeSeries'} \description{ Returns start and/or end time stamps of a 'timeSeries' object. } \usage{ \S4method{start}{timeSeries}(x, \dots) \S4method{end}{timeSeries}(x, \dots) } \arguments{ \item{x}{ an uni- or multivariate \code{timeSeries} object. } \item{\dots}{ optional arguments passed to other methods. } } \value{ returns a \code{timeSeries} object. } \examples{ ## Create Dummy timeSeries - tS <- dummySeries()[, 1] tS ## Return Start and end Time Stamp - c(start(tS), end(tS)) range(time(tS)) } \keyword{chron} timeSeries/man/methods-mathOps.Rd0000644000176000001440000000732713202247351016541 0ustar ripleyusers\name{math} \alias{math} \alias{Ops,vector,timeSeries-method} \alias{Ops,array,timeSeries-method} \alias{Ops,ts,timeSeries-method} \alias{Ops,timeSeries,vector-method} \alias{Ops,timeSeries,array-method} \alias{Ops,timeSeries,ts-method} \alias{Ops,timeSeries,timeSeries-method} \alias{-,timeSeries,missing-method} \alias{+,timeSeries,missing-method} \alias{cummax,timeSeries-method} \alias{cummin,timeSeries-method} \alias{cumprod,timeSeries-method} \alias{cumsum,timeSeries-method} \alias{Math,timeSeries-method} \alias{Math2,timeSeries-method} \alias{Summary,timeSeries-method} \alias{trunc,timeSeries-method} \alias{log,timeSeries-method} \alias{\%*\%,timeSeries,vector-method} \alias{\%*\%,timeSeries,ANY-method} \alias{\%*\%,ANY,timeSeries-method} %\alias{diff.timeSeries} %\alias{scale.timeSeries} \alias{quantile.timeSeries} \alias{quantile,timeSeries-method} \alias{median.timeSeries} \alias{median,timeSeries-method} \title{Mathematical Time Series Operations} \description{ Functions and methods dealing with mathematical 'timeSeries' operations. } \details{ The math functions include:\cr \tabular{ll}{ \code{Ops-method} \tab Group 'Ops' methods for a 'timeSeries' object \cr \code{Math-method} \tab Group 'Math' methods for a 'timeSeries' object \cr \code{Math2-method} \tab Group 'Math2' methods for a 'timeSeries' object \cr \code{Summary-method} \tab Group 'Summary' methods for a 'timeSeries' object \cr %\code{diff} \tab Differences a 'timeSeries' object, \cr %\code{scale} \tab Centers and/or scales a 'timeSeries' object, \cr \code{quantile} \tab Returns quantiles of an univariate 'timeSeries'. } } \usage{ % \S4method{Ops}{timeSeries}(e1, e2) % \S4method{Math}{timeSeries}(x, ...) % \S4method{Math2}{timeSeries}(x, digits) % \S4method{Summary}{timeSeries}(x, ..., na.rm = FALSE) % \S4method{diff}{timeSeries}(x, lag = 1, diff = 1, trim = FALSE, pad = NA, \dots) % \S4method{scale}{timeSeries}(x, center = TRUE, scale = TRUE) \S4method{quantile}{timeSeries}(x, \dots) } \arguments{ % \item{center, scale}{ % [scale] - \cr % either a logical value or a numeric vector of length equal to % the number of columns of \code{x}. % } % \item{diff}{ % an integer indicating the order of the difference. By default 1. % } % \item{digits} { % number of digits to be used in 'round' or 'signif'. % } % \item{e1, e2}{ % [Ops] - \cr % two objects of class \code{timeSeries}. % } % \item{lag}{ % an integer indicating which lag to use. By default 1. % } % \item{na.rm}{ % logical: should missing values be removed? % } % \item{pad}{ % [diffSeries] - \cr % which value should get the padded values? By default \code{NA}. % Another choice often used would be zero. % } % \item{trim}{ % a logical value. By default \code{TRUE}, the first missing % observation in the return series will be removed. % } \item{x}{ an object of class \code{timeSeries}. } \item{\dots}{ arguments to be passed. } } \value{ Returns the value from a mathematical or logical operation operating on objects of class 'timeSeries[], or the value computed by a mathematical function. } \examples{ ## Create an Artificial timeSeries Object - setRmetricsOptions(myFinCenter = "GMT") charvec = timeCalendar() set.seed(4711) data = matrix(exp(cumsum(rnorm(12, sd = 0.1)))) TS = timeSeries(data, charvec, units = "TS") TS ## Mathematical Operations: | +/- * ^ ... - TS^2 TS[2:4] OR = returns(TS) OR OR > 0 } \keyword{chron} \keyword{methods} timeSeries/man/timeSeries-getDataPart.Rd0000644000176000001440000000061112407026706017766 0ustar ripleyusers\name{DataPart,timeSeries-method} \title{DataPart,timeSeries-method} \alias{getDataPart,timeSeries-method} \alias{setDataPart,timeSeries-method} \description{ Utilities called to implement object@.Data of \code{timeSeries} objects. } \examples{ ## Load Microsoft Data - X <- MSFT[1:10, 1:4] ## Get Data Part - DATA <- getDataPart(X) class(DATA) } \keyword{chron} timeSeries/man/stats-na.omit.Rd0000644000176000001440000001214112407026706016161 0ustar ripleyusers\name{na} \title{Handling Missing Time Series Values} \alias{na} \alias{na.omit} \alias{na.omit,timeSeries-method} \alias{na.omit.timeSeries} \alias{removeNA} \alias{substituteNA} \alias{interpNA} \description{ Functions for handling missing values in 'timeSeries' objects } \details{ Functions for handling missing values in 'timeSeries' objects and in objects which can be transformed into a vector or a two dimensional matrix. \cr The functions are listed by topic. \cr \tabular{ll}{ \code{na.omit} \tab Handles NAs, \cr \code{removeNA} \tab Removes NAs from a matrix object, \cr \code{substituteNA} \tab substitute NAs by zero, the column mean or median, \cr \code{interpNA} \tab interpolates NAs using R's "approx" function. } \bold{Missing Values in Price and Index Series:} Applied to \code{timeSeries} objects the function \code{removeNA} just removes rows with NAs from the series. For an interpolation of time series points one can use the function \code{interpNA}. Three different methods of interpolation are offered: \code{"linear"} does a linear interpolation, \code{"before"} uses the previous value, and \code{"after"} uses the following value. Note, that the interpolation is done on the index scale and not on the time scale. \bold{Missing Values in Return Series:} For return series the function \code{substituteNA} may be useful. The function allows to fill missing values either by \code{method="zeros"}, the \code{method="mean"} or the \code{method="median"} value of the appropriate columns. } \usage{ \S4method{na.omit}{timeSeries}(object, method = c("r", "s", "z", "ir", "iz", "ie"), interp = c("before", "linear", "after"), \dots) removeNA(x, \dots) substituteNA(x, type = c("zeros", "mean", "median"), \dots) interpNA(x, method = c("linear", "before", "after"), \dots) } \arguments{ \item{interp, type}{ [nna.omit][substituteNA] - \cr Three alternative methods are provided to remove NAs from the data: \code{type="zeros"} replaces the missing values by zeros, \code{type="mean"} replaces the missing values by the column mean, \code{type="median"} replaces the missing values by the the column median. } \item{method}{ [na.omit] - \cr Specifies the method how to handle NAs. One of the applied vector strings: \cr \code{method="s"} na.rm = FALSE, skip, i.e. do nothing, \code{method="r"} remove NAs, \code{method="z"} substitute NAs by zeros, \code{method="ir"} interpolate NAs and remove NAs at the beginning and end of the series, \code{method="iz"} interpolate NAs and substitute NAs at the beginning and end of the series, \code{method="ie"} interpolate NAs and extrapolate NAs at the beginning and end of the series, [interpNA] - \cr Specifies the method how to interpolate the matrix column by column. One of the applied vector strings: \code{method="linear"}, \code{method="before"} or \code{method="after"}.\cr For the interpolation the function \code{approx} is used. } \item{object}{ an object of class("timeSeries"). } \item{x}{ a numeric matrix, or any other object which can be transformed into a matrix through \code{x = as.matrix(x, ...)}. If \code{x} is a vector, it will be transformed into a one-dimensional matrix. } \item{\dots}{ arguments to be passed to the function \code{as.matrix}. } } \note{ The functions \code{removeNA}, \code{substituteNA} and \code{interpNA} are older implementations. Please use in all cases if possible the new function \code{na.omit}. When dealing with daily data sets, there exists another function \code{alignDaily Series} which can handle missing data in un-aligned calendarical 'timeSeries' objects. } \references{ Troyanskaya O., Cantor M., Sherlock G., Brown P., Hastie T., Tibshirani R., Botstein D., Altman R.B., (2001); \emph{Missing Value Estimation Methods for DNA microarrays} Bioinformatics 17, 520--525. } \examples{ ## Create a Matrix - X <- matrix(rnorm(100), ncol = 5) ## Replace a Single NA Inside - X[3, 5] <- NA ## Replace Three in a Row Inside - X[17, 2:4] <- c(NA, NA, NA) ## Replace Three in a Column Inside - X[13:15, 4] <- c(NA, NA, NA) ## Replace Two at the Right Border - X[11:12, 5] <- c(NA, NA) ## Replace One in the Lower Left Corner - X[20, 1] <- NA print(X) ## Remove Rows with NAs - removeNA(X) ## Subsitute NA's by Zeros or Column Means - substituteNA(X, type = "zeros") substituteNA(X, type = "mean") ## Interpolate NA's Linearily - interpNA(X, method = "linear") # Note the corner missing value cannot be interpolated! ## Take Previous Values in a Column - interpNA(X, method = "before") # Also here, the corner value is excluded } \keyword{math} timeSeries/man/base-rank.Rd0000644000176000001440000000367512620111345015326 0ustar ripleyusers\name{rank} \title{Sample Ranks of a Time Series} \alias{rank,timeSeries-method} \description{ Returns the sample ranks of the values of a 'timeSeries' object. } \details{ If all components are different (and no NAs), the ranks are well defined, with values in \code{seq_len(x)}. With some values equal (called ???ties???), the argument ties.method determines the result at the corresponding indices. The \code{"first"} method results in a permutation with increasing values at each index set of ties. The \code{"random"} method puts these in random order whereas the default, \code{"average"}, replaces them by their mean, and \code{"max"} and \code{"min"} replaces them by their maximum and minimum respectively, the latter being the typical sports ranking. NA values are never considered to be equal: for \code{na.last = TRUE} and \code{na.last = FALSE} they are given distinct ranks in the order in which they occur in \code{x}. } \usage{ \S4method{rank}{timeSeries}(x, na.last = TRUE, ties.method = ) } \arguments{ \item{x}{ an univariate object of class \code{timeSeries}. } \item{na.last}{ for controlling the treatment of NAs. If TRUE, missing values in the data are put last; if FALSE, they are put first; if NA, they are removed; if "keep" they are kept with rank NA. } \item{ties.method}{ a character string specifying how ties are treated; can be abbreviated. } } \value{ returns the ranks of a \code{timeSeries} object. } \examples{ ## Load Microsoft Data - X <- 100 * returns(MSFT) ## Compute the Ranks - head(rank(X[, "Open"]), 10) ## Only Interested in the Vector, then use - head(rank(series(X[, "Open"])), 10) } \keyword{chron} timeSeries/man/timeSeries-isRegular.Rd0000644000176000001440000000363712407026706017536 0ustar ripleyusers\name{isRegular} \title{Checks if a time series is regular} \alias{isDaily,timeSeries-method} \alias{isMonthly,timeSeries-method} \alias{isQuarterly,timeSeries-method} \alias{isRegular,timeSeries-method} \alias{frequency,timeSeries-method} \description{ Checks if a time series is regular. } \details{ What is a regular time series? If a series is a daily, a monthly, or a weekly time series then we speak of a regular series. This can be tested calling the functions \code{isDaily}, \code{isMonthly}, \code{isQuarterly}, or in general \code{isRegular} If the series is regular then the frequency of the series can be determined calling the function \code{frequency}. A time series is defined as daily if the series has not more than one date/time stamp per day.\cr A time series is defined as monthly if the series has not more than one date/time stamp per month.\cr A time series is defined as quarterly if the series has not more than one date/time stamp per quarter.\cr Note, amonthly series is also a daily series, a quarterly series is alsona monthly series.\cr With these definitions a regular series is either a monthly or a quarterly series.\cr NOT yet implemented is the case of weekly series. } \usage{ \S4method{isDaily}{timeSeries}(x) \S4method{isMonthly}{timeSeries}(x) \S4method{isQuarterly}{timeSeries}(x) \S4method{isRegular}{timeSeries}(x) \S4method{frequency}{timeSeries}(x, \dots) } \arguments{ \item{x}{ an R object of class 'timeSeries'. } \item{\dots}{ arguments to be passed. } } \value{ The \code{is*} functions return \code{TRUE} or \code{FALSE} depending on whether the series fulfills the condition or not. The function frequency returns in general 1, for quarterly series 4, and for monthly series 12. } \examples{ ## None } \keyword{chron} timeSeries/man/statistics-colCumsums.Rd0000644000176000001440000000314611545077672020021 0ustar ripleyusers\name{colCum} \title{Cumulated Column Statistics} \alias{colCum} \alias{colCummaxs} \alias{colCummins} \alias{colCumprods} \alias{colCumreturns} \alias{colCumsums} \alias{colCummaxs,matrix-method} \alias{colCummaxs,timeSeries-method} \alias{colCummins,matrix-method} \alias{colCummins,timeSeries-method} \alias{colCumprods,matrix-method} \alias{colCumprods,timeSeries-method} \alias{colCumreturns,matrix-method} \alias{colCumreturns,timeSeries-method} \alias{colCumsums,matrix-method} \alias{colCumsums,timeSeries-method} \description{ Functions to compute cumulative column statistics. } \usage{ \S4method{colCumsums}{timeSeries}(x, na.rm = FALSE, \dots) \S4method{colCummaxs}{timeSeries}(x, na.rm = FALSE, \dots) \S4method{colCummins}{timeSeries}(x, na.rm = FALSE, \dots) \S4method{colCumprods}{timeSeries}(x, na.rm = FALSE, \dots) \S4method{colCumreturns}{timeSeries}(x, method = c("geometric", "simple"), na.rm = FALSE, \dots) } \arguments{ \item{method}{ a character string to indicate if geometric (TRUE) or simple (FALSE) returns should be computed. } \item{na.rm}{ a logical. Should missing values be removed? } \item{x}{ a time series, may be an object of class \code{"matrix"}, or \code{"timeSeries"}. } \item{\dots}{ arguments to be passed. } } \value{ all functions return an S4 object of class \code{timeSeries}. } \examples{ ## Simulated Return Data - x = matrix(rnorm(24), ncol = 2) ## Cumulative Sums Column by Column - colCumsums(x) } \keyword{univar} timeSeries/man/fin-spreads.Rd0000644000176000001440000000336111245774216015704 0ustar ripleyusers\name{spreads} \title{Spreads and Mid Quotes} \alias{spreads} \alias{midquotes} \alias{spreadSeries} \alias{midquoteSeries} \description{ Compute spreads and midquotes from price streams. } \usage{ spreads(x, which = c("Bid", "Ask"), tickSize = NULL) midquotes(x, which = c("Bid", "Ask")) midquoteSeries(\dots) spreadSeries(\dots) } \arguments{ \item{tickSize}{ the default is NULL to simply compute price changes in original price levels. If ticksize is supplied, the price changes will be divided by the value of \code{inTicksOfSize} to compute price changes in ticks. } \item{which}{ a vector with two character strings naming the column names of the time series from which to compute the mid quotes and spreads. By default these are bid and ask prices with column names \code{c("Bid", "Ask")}. } \item{x}{ an object of class \code{timeSeries}. } \item{\dots}{ arguments to be passed. } } \value{ all functions return an object of class \code{timeSeries}. } \note{ The functions \code{returnSeries}, \code{getReturns}, \code{midquoteSeries}, \code{spreadSeries} are synonymes for \code{returns}, \code{midquotes}, and \code{spreads}. } \examples{ ## Load the Microsoft Data - setRmetricsOptions(myFinCenter = "GMT") data(MSFT) X = MSFT[1:10, ] head(X) ## Compute Open/Close Midquotes - X.MID <- midquotes(X, which = c("Close", "Open")) colnames(X.MID) <- "X.MID" X.MID ## Compute Open/Close Spreads - X.SPREAD <- spreads(X, which = c("Close", "Open")) colnames(X.SPREAD) <- "X.SPREAD" X.SPREAD } \keyword{chron} timeSeries/man/stats-filter.Rd0000644000176000001440000000105112407026706016077 0ustar ripleyusers \name{filter} \title{Linear Filtering on a Time Series} \alias{filter,timeSeries-method} \description{ Applies linear filtering to a univariate 'timeSeries'. } \value{ A 'timeSeries' object without missing values. } \examples{ ## Creata a Dummy Signal 'timeSeries' - data <- matrix(rnorm(100), ncol = 2) s <- timeSeries(data, units=c("A", "B")) head(s) ## Filter the series - f <- filter(s, rep(1, 3)) head(f) ## Plot and Compare the first series - plot(cbind(s[, 1], f[, 1]), plot.type="s") } timeSeries/man/fin-drawdowns.Rd0000644000176000001440000000413111545076570016250 0ustar ripleyusers\name{drawdowns} \title{Calculations of Drawdowns} \alias{drawdowns} \alias{drawdownsStats} \description{ Compute series of drawdowns from financial returns and calculate drawdown statisitcs. } \usage{ drawdowns(x, \dots) drawdownsStats(x, \dots) } \arguments{ \item{x}{ a 'timeSeries' object of financial returns. Note, drawdowns can be calculated from an uni- or multivariate time deries object, statistics can only be computed from an univariate time series object. } \item{\dots}{ optional arguments passed to the function \code{na.omit}. } } \value{ \code{drawdowns}\cr returns an object of class 'timeSeries'. \code{drawdownsStats}\cr returns an object of class 'data.frame' with the following entries:\cr \code{"drawdown"} - the depth of the drawdown, \cr \code{"from"} - the start date, \cr \code{"trough"} - the trough period, \cr \code{"to"} - the end date, \cr \code{"length"} - the length in number of records, \cr \code{"peaktrough"} - the peak trough, and , \cr \code{"recovery"} - the recovery length in number of records. } \details{ The code in the core of the function \code{drawdownsStats} was was borrowed from the package \code{PerformanceAnalytics} authored by Peter Carl and Sankalp Upadhyay. } \author{ Peter Carl and Sankalp Upadhyay for code from the contributed R package \code{PerformanceAnalytics} used in the function \code{drawdownsStats}. } \examples{ ## Use Swiss Pension Fund Data Set of Returns - head(LPP2005REC) SPI <- LPP2005REC[, "SPI"] head(SPI) ## Plot Drawdowns - dd = drawdowns(LPP2005REC[, "SPI"], main = "Drawdowns") plot(dd) dd = drawdowns(LPP2005REC[, 1:6], main = "Drawdowns") plot(dd) ## Compute Drawdowns Statistics - ddStats <- drawdownsStats(SPI) class(ddStats) ddStats ## Note, Only Univariate Series are allowd - ddStats <- try(drawdownsStats(LPP2005REC)) class(ddStats) } \keyword{chron} timeSeries/man/stats-aggregate.Rd0000644000176000001440000000545312407026706016552 0ustar ripleyusers\name{aggregate-methods} \docType{methods} \alias{aggregate} \alias{aggregate.timeSeries} \alias{aggregate-methods} \alias{aggregate,timeSeries-method} \alias{daily2weekly} \alias{daily2monthly} \title{timeSeries Class, Functions and Methods} \description{ Aggregates a 'timeSeries' Object. } \details{ The function \code{aggregate} is a function which can aggregate time series on general aggregation periods. In addition there are two tailored function for simple usage: Function \code{daily2monthly} and \code{daily2weekly} which allow to aggregate 'timeSeries' objects from daily to monthly or weekly levels, respectively. In the case of the function \code{daily2weekly} one can explicitely the starting day of the week, the default value is Tuesday, \code{startOn="Tue"}. } \usage{ \S4method{aggregate}{timeSeries}(x, by, FUN, \dots) daily2monthly(x, init=FALSE) daily2weekly(x, startOn="Tue", init=FALSE) } \arguments{ \item{x}{ an object of class 'timeSeries'. } \item{by}{ a sequence of \code{timeDate} objects denoting the aggregation period. } \item{FUN}{ the function to be applied. } \item{startOn}{ a string value, specifying the day of week as a three letter abbreviation. Weekly aggregated data records are then fixed to the weekdays given by the argument \code{startOn}.} \item{init}{ a logical value, if set to \code{TRUE} then the time series will be indexed to 1 for its first value. By default init is set to \code{FALSE}. } \item{\dots}{ arguments passed to other methods. } } \value{ \code{aggregate} returns an aggregated S4 object of class \code{timeSeries}. \code{daily2monthly} returns an aggregated monthly object of class \code{timeSeries}. \code{daily2weekly} returns an aggregated weekly object of class \code{timeSeries} starting on the specified day of week. } \examples{ ## Load Microsoft Data Set - x <- MSFT ## Aggregate by Weeks - by <- timeSequence(from = start(x), to = end(x), by = "week") aggregate(x, by, mean) ## Aggregate to Last Friday of Month - by <- unique(timeLastNdayInMonth(time(x), 5)) X <- aggregate(x, by, mean) X dayOfWeek(time(X)) isMonthly(X) ## Aggregate to Last Day of Quarter - by <- unique(timeLastDayInQuarter(time(x))) X <- aggregate(x, by, mean) X isQuarterly(X) ## Aggregate daily records to end of month records - X <- daily2monthly(x) X isMonthly(X) ## Aggregate da, ily records to end of week records - X <- daily2weekly(x, startOn="Fri") X dayOfWeek(time(X)) } \keyword{methods} \keyword{chron} timeSeries/man/timeSeries-slotFinCenter.Rd0000644000176000001440000000166112407026706020353 0ustar ripleyusers\name{finCenter} \title{Get and Set Financial Center of a 'timeSeries'} \alias{getFinCenter} \alias{setFinCenter<-} \alias{finCenter,timeSeries-method} \alias{finCenter<-,timeSeries-method} \description{ Print or assign new financial center to a 'timeSeries' object. } \usage{ getFinCenter(x) setFinCenter(x) <- value \S4method{finCenter}{timeSeries}(x) \S4method{finCenter}{timeSeries}(x) <- value } \arguments{ \item{x}{ a 'timeSeries' object. } \item{value}{ a character with the the location of the financial center named as "continent/city". } } \seealso{listFinCenter} \examples{ ## An artificial timeSeries Object - tS <- dummySeries() tS ## Print Financial Center - finCenter(tS) getFinCenter(tS) ## Assign New Financial Center - finCenter(tS) <- "Zurich" tS setFinCenter(tS) <- "New_York" tS } \keyword{programming} timeSeries/man/fin-periodical.Rd0000644000176000001440000000403512407026706016350 0ustar ripleyusers\name{periodical} \alias{endOfPeriod} \alias{endOfPeriodSeries} \alias{endOfPeriodStats} \alias{endOfPeriodBenchmarks} \title{End-of-Period Series, Stats, and Benchmarks} \description{ Computes perodical statistics back to a given period. } \details{ The function \code{endOfPeriodSeries} returns series back to a given period.\cr The function \code{endOfPeriodStats} returns statistics back to a given period.\cr The function \code{endOfPeriodBenchmarks} returns benchmarks back to a given period. \code{x} must be end of month data. Note you can create such series using for example the functions: \code{align}, \code{alignDailySeries}, \code{daily2monthly}. } \usage{ endOfPeriodSeries(x, nYearsBack = c("1y", "2y", "3y", "5y", "10y", "YTD")) endOfPeriodStats(x, nYearsBack = c("1y", "2y", "3y", "5y", "10y", "YTD")) endOfPeriodBenchmarks(x, benchmark = ncol(x), nYearsBack = c("1y", "2y", "3y", "5y", "10y", "YTD")) } \arguments{ \item{x}{ an end-of-month recorded multivariate 'timeSeries' object. One of the columns holds the benchmark series specified by the argument \code{benchmark}, By defauklt this is the last column of \code{x}. } \item{nYearsBack}{ a period string. How long back should the series be treated? Options include values from 1 year to 10 years, and year-to-date: "1y", "2y", "3y", "5y", "10y", "YTD". } \item{benchmark}{ an integer giving the position of the benchmar series in \code{x}. } } \examples{ ## Load Series: Column 1:3 Swiss Market, Column 8 (4) Benchmark x <- 100 * LPP2005REC[, c(1:3, 8)] colnames(x) x <- daily2monthly(x) x ## Get the Monthly Series - endOfPeriodSeries(x, nYearsBack="1y") ## Compute the Monthly Statistics - endOfPeriodStats(x, nYearsBack="1y") ## Compute the Benchmark - endOfPeriodBenchmarks(x, benchmark=4) } \keyword{chron} timeSeries/man/methods-show.Rd0000644000176000001440000000126512407026706016106 0ustar ripleyusers\name{print-methods} \title{Print a Time Series} \alias{show,timeSeries-method} \alias{print,timeSeries-method} \description{ Print 'timeSeries' pbjects. } % \usage{ % show.timeSeries(object) % } \arguments{ \item{object}{ an object of class \code{timeSeries}. } } \value{ Prints an object of class \code{timeSeries}. } \examples{ ## Load Micsrosoft Data - setRmetricsOptions(myFinCenter = "GMT") LPP <- MSFT[1:12, 1:4] ## Abbreviate Column Names - colnames(LPP) <- abbreviate(colnames(LPP), 6) ## Print Data Set - print(LPP) ## Alternative Use, Show Data Set - show(LPP) } \keyword{chron} timeSeries/man/methods-stats.Rd0000644000176000001440000000404411245551275016265 0ustar ripleyusers\name{timeSeries-method-stats} \docType{methods} \alias{sd-methods} \alias{var-methods} \alias{cov-methods} \alias{cor-methods} \alias{dcauchy-methods} \alias{dnorm-methods} \alias{dt-methods} \alias{sd,timeSeries-method} \alias{var,timeSeries-method} \alias{cov,timeSeries-method} \alias{cor,timeSeries-method} \alias{dcauchy,timeSeries-method} \alias{dnorm,timeSeries-method} \alias{dt,timeSeries-method} \title{Time Series Correlations} \description{ S4 methods of stats package for \code{timeSeries} objects. \cr \tabular{ll}{ \code{cov} \tab Computes Covariance from a 'timeSeries' object, \cr \code{cor} \tab Computes Correlations from a 'timeSeries' object. \cr \code{dcauchy} \tab ... \cr \code{dnorm} \tab ... \cr \code{dt} \tab ... \cr } } \usage{ \S4method{cov}{timeSeries}(x, y = NULL, use = "all.obs", method = c("pearson", "kendall", "spearman")) \S4method{cor}{timeSeries}(x, y = NULL, use = "all.obs", method = c("pearson", "kendall", "spearman")) } \arguments{ \item{method}{ a character string indicating which correlation coefficient (or covariance) is to be computed. One of \code{"pearson"} (default), \code{"kendall"}, or \code{"spearman"}, can be abbreviated. } \item{use}{ an optional character string giving a method for computing covariances in the presence of missing values. This must be (an abbreviation of) one of the strings \code{"all.obs"}, \code{"complete.obs"} or \code{"pairwise.complete.obs"}. } \item{x}{ an univariate object of class \code{timeSeries}. } \item{y}{ NULL (default) or a \code{timeSeries} object with compatible dimensions to \code{x}. The default is equivalent to y = x (but more efficient). } } \value{ returns the covariance or correlation matrix. } \examples{ ## Load Microsoft Data Set - data(MSFT) X = MSFT[, 1:4] X = 100 * returns(X) ## Compute Covariance Matrix - cov(X[, "Open"], X[, "Close"]) cov(X) } \keyword{methods} \keyword{chron} timeSeries/man/fin-runlengths.Rd0000644000176000001440000000121712407026706016425 0ustar ripleyusers\name{runlengths} \title{Runlengths of a Time Series} \alias{runlengths} \description{ Computes runlengths of an univariate 'timeSeries' object. } \usage{ runlengths(x, \dots) } \arguments{ \item{x}{ an univariate time series of class 'timeSeries'. } \item{\dots}{ arguments to be passed. } } \value{ returns an object of class \code{timeSeries}. } \examples{ ## random time series - set.seed(4711) x <- rnorm(12) tS <- timeSeries(data=x, charvec=timeCalendar(), units="x") tS ## return runlengths - runlengths(tS) } \keyword{chron} timeSeries/man/statistics-orderColnames.Rd0000644000176000001440000000765412460300462020453 0ustar ripleyusers\name{orderColnames} \title{Reorder Column Names of a Time Series} \alias{orderColnames} \alias{sortColnames} \alias{sampleColnames} \alias{statsColnames} \alias{pcaColnames} \alias{hclustColnames} \description{ Functions and methods dealing with the rearrangement of column names of 'timeSeries' objects. \cr \tabular{ll}{ \code{orderColnames} \tab Returns ordered column names of a time Series, \cr \code{sortColnames} \tab Returns sorted column names of a time Series, \cr \code{sampleColnames} \tab Returns sampled column names of a time Series, \cr \code{statsColnames} \tab Returns statistically rearranged column names, \cr \code{pcaColnames} \tab Returns PCA correlation ordered column names, \cr \code{hclustColnames} \tab Returns hierarchical clustered column names. } } \usage{ orderColnames(x, \dots) sortColnames(x, \dots) sampleColnames(x, \dots) statsColnames(x, FUN = colMeans, \dots) pcaColnames(x, robust = FALSE, \dots) hclustColnames(x, method = c("euclidean", "complete"), \dots) } \arguments{ \item{FUN}{ a character string indicating which statistical function should be applied. By default statistical ordering operates on the column means of the time series. } \item{method}{ a character string with two elements. The first determines the choice of the distance measure, see \code{dist}, and the second determines the choice of the agglomeration method, see \code{hclust}. } \item{robust}{ a logical flag which indicates if robust correlations should be used. } \item{x}{ an object of class \code{timesSeries} or any other rectangular object which can be transformed by the function \code{as.matrix} into a numeric matrix. } \item{\dots}{ further arguments to be passed, see details. } } \details{ \bold{Statistically Motivated Rearrangement} The function \code{statsColnames} rearranges the column names according to a statical measure. These measure must operate on the columns of the time series and return a vector of values which can be sorted. Typical functions ar those listed in in help page \code{colStats} but one can also crete his own functions which compute for example risk or any other statistical measure. The \code{\dots} argument allows to pass additional arguments to the underlying function \code{FUN}.\cr \bold{PCA Ordering of the Correlation Matrix} The function \code{pcaColnames} rearranges the column names according to the PCA ordered correlation matrix. The argument \code{robust} allsows to select between the use of the standard \code{cor} and computation of robust correlations using the function \code{covMcd} from contributed R package \code{robustbase}. The \code{\dots} argument allows to pass additional arguments to the two underlying functions \code{cor} or \code{covMcd}. E.g. adding \code{method="kendall"} to the argument list calculates Kendall's rank correlations instead the default which calculates Person's correlations.\cr \bold{Ordering by Hierarchical Clustering} The function \code{pcaColnames} uses the hierarchical clustering approach \code{hclust} to rearrange the column names of the time series. } \value{ returns a vector of character string, the rearranged column names. } \examples{ ## Load Swiss Pension Fund Benchmark Data - data <- LPP2005REC[,1:6] ## Abbreviate Column Names - colnames(data) ## Sort Alphabetically - sortColnames(data) ## Sort by Column Names by Hierarchical Clustering - hclustColnames(data) head(data[, hclustColnames(data)]) } \keyword{chron} timeSeries/man/00timeSeries-package.Rd0000644000176000001440000002243012407026706017324 0ustar ripleyusers\name{timeSeries-package} \alias{timeSeries-package} \docType{package} \title{Utilities and Tools Package} \description{ Package of time series tools and utilities. } \details{ \tabular{ll}{ Package: \tab timeSeries\cr Type: \tab Package\cr Version: \tab see description file\cr Date: \tab 2011\cr License: \tab GPL Version 2 or later\cr Copyright: \tab (c) 1999-2014 Rmetrics Association\cr URL: \tab \url{http://www.rmetrics.org} } } \section{timeSeries - S4 timeSeries Class}{ \tabular{ll}{ \code{timeSeries} \tab Creates a 'timeSeries' from scratch\cr \code{getDataPart, series} \tab ... \cr \code{getUnits} \tab Extracts the time serie units \cr \code{getTime, time} \tab Extracts the positions of timestamps \cr \code{use: slot} \tab Extracts the format of the timestamp \cr \code{getFinCenter, finCenter} \tab Extracts the financial center \cr \code{use: slot} \tab Extracts the record IDs \cr \code{getTitle} \tab Extracts the title \cr \code{use: slot} \tab Extracts the documentation } } \section{Base Time Series Functions}{ \tabular{ll}{ \code{apply} \tab Applies a function to blocks of a 'timeSeries' \cr \code{attach} \tab Attaches a 'timeSeries' to the search path \cr \code{cbind} \tab Combines columns of two 'timeSeries' objects \cr \code{ rbind} \tab Combines rows of two 'timeSeries' objects \cr %\code{comment} \tab ? ... \cr \code{diff} \tab Returns differences of a 'timeSeries' object \cr \code{dim} \tab returns dimensions of a 'timeSeries' object \cr \code{merge} \tab Merges two 'timeSeries' objects \cr \code{rank} \tab Returns sample ranks of a 'timeSeries' object \cr \code{rev} \tab Reverts a 'timeSeries' object \cr \code{sample} \tab Resamples a 'timeSeries' object \cr \code{scale} \tab Scales a 'timeSeries' object \cr \code{sort} \tab Sorts a 'timeSeries' object \cr \code{start} \tab Returns start date/time of a 'timeSeries' \cr \code{ end} \tab Returns end date/time of a 'timeSeries' \cr \code{t} \tab Returns the transpose of a 'timeSeries' object } } \section{Subsetting 'timeSeries' Objects}{ \tabular{ll}{ \code{.subset_} \tab Subsets 'timeSeries' objects \cr \code{.findIndex} \tab Index search in a 'timeSeries' object \cr \code{[} \tab Subsets a 'timeSeries' object \cr \code{[<-]} \tab Assigns values to a subset \cr \code{$} \tab Subsets a 'timeSeries' by column names \cr \code{$<-} \tab Replaces Subset by column names \cr \code{t} \tab Returns the transpose of a 'timeSeries' \cr \code{head} \tab Returns the head of a 'timeSeries' \cr \code{ tail} \tab Returns the tail of a time Series \cr \code{na.omit} \tab Handles NAs in a timeSeries object \cr \code{ removeNA} \tab removes NAs from a matrix object \cr \code{ substituteNA} \tab substitutes NAs by zero, column mean or median \cr \code{ interpNA} \tab interpolates NAs using R's "approx" function } } \section{Mathematical Operation}{ \tabular{ll}{ \code{Ops.timeSeries} \tab S4: Arith method for a 'timeSeries' object \cr \code{abs} \tab Returns absolute values of a 'timeSeries' object \cr \code{sqrt} \tab Returns square root of a 'timeSeries' object \cr \code{exp} \tab Returns the exponential values of a 'timeSeries' object \cr \code{log} \tab Returns the logarithm of a 'timeSeries' object \cr \code{sign} \tab Returns the signs of a 'timeSeries' object \cr \code{diff} \tab Differences a 'timeSeries' object \cr \code{scale} \tab Centers and/or scales a 'timeSeries' object \cr \code{quantile} \tab Returns quantiles of an univariate 'timeSeries'} } \section{Methods}{ \tabular{ll}{ \code{as.timeSeries} \tab Defines method for a 'timeSeries' \cr \code{as.*.default} \tab Returns the input \cr \code{as.*.ts} \tab Transforma a 'ts' object into a 'timeSeries' \cr \code{as.*.data.frame} \tab Transforms a 'data.frame' intp a 'timeSeries \cr \code{as.*.character} \tab Loads and transforms from a demo file \cr \code{as.*.zoo} \tab Transforms a 'zoo' object into a 'timeSeries' \cr \code{as.vector.*} \tab Converts univariate timeSeries to vector \cr \code{as.matrix.*} \tab Converts timeSeries to matrix \cr \code{as.numeric.*} \tab Converts timeSeries to numeric \cr \code{as.data.frame.*} \tab Converts timeSeries to data.frame \cr \code{as.ts.*} \tab Converts timeSeries to ts \cr \code{as.logical.*} \tab Converts timeSeries to logical \cr %\code{comment} \tab ? ... \cr \code{is.timeSeries} \tab Tests for a 'timeSeries' object \cr \code{plot} \tab Displays a X-Y 'timeSeries' Plot \cr \code{lines} \tab Adds connected line segments to a plot \cr \code{points} \tab Adds Points to a plot \cr \code{show} \tab Prints a 'timeSeries oobject} } \section{Financial time series functions}{ \tabular{ll}{ \code{align} \tab Aligns a 'timeSeries' to time stamps \cr \code{cumulated} \tab Computes cumulated series from a returns \cr \code{alignDailySeries} \tab Aligns a 'timeSeries' to calendarical dates \cr \code{ rollDailySeries} \tab Rolls a 'timeSeries daily\cr \code{drawdowns} \tab Computes series of drawdowns from financial returns \cr \code{ drawdownsStats} \tab Computes drawdowns statistics \cr \code{durations} \tab Computes durations from a financial time series \cr \code{countMonthlyRecords} \tab Counts monthly records in a 'timeSeries' \cr \code{ rollMonthlyWindows} \tab Rolls Monthly windows \cr \code{ rollMonthlySeries} \tab Rolls a 'timeSeries' monthly \cr \code{endOfPeriodSeries} \tab Returns end of periodical series \cr \code{ endOfPeriodStats} \tab Returns end of period statistics \cr \code{ endOfPeriodBenchmarks} \tab Returns period benchmarks \cr \code{returns} \tab Computes returns from prices or indexes \cr \code{ returns0} \tab Computes untrimmed returns from prices or indexes \cr \code{runlengths} \tab Computes run lenghts of a 'timeSeries' \cr \code{smooth} \tab Smoothes a 'timeSeries' \cr \code{splits} \tab Detects 'timeSeries' splits by outlier detection \cr \code{spreads} \tab Computes spreads from a price/index stream \cr \code{turns} \tab Computes turning points in a 'timeSeries' object \cr \code{ turnsStats} \tab Computes turning points statistics } } \section{Statistics Time Series functions}{ \tabular{ll}{ \code{colCumsums} \tab Computes cumulated column sums of a 'timeSeries' \cr \code{ colCummaxs} \tab Computes cumulated maximum of a 'timeSeries' \cr \code{ colCummins} \tab Computes cumulated minimum of a 'timeSeries' \cr \code{ colCumprods} \tab Computes cumulated pruduct values by column \cr \code{ colCumreturns} \tab Computes cumulated returns by column \cr \code{colSums} \tab Computes sums of all values in each column \cr \code{ colMeans} \tab Computes means of all values in each column \cr \code{ colSds} \tab Computes standard deviations of all values in each column \cr \code{ colVars} \tab Computes variances of all values in each column \cr \code{ colSkewness} \tab Computes skewness of all values in each column \cr \code{ colKurtosis} \tab Computes kurtosis of all values in each column \cr \code{ colMaxs} \tab Computes maxima of all values in each column \cr \code{ colMins} \tab Computes minima of all values in each column \cr \code{ colProds} \tab Computes products of all values in each column \cr \code{ colStats} \tab Computes statistics of all values in each column \cr \code{orderColnames} \tab Returns ordered column names of a 'timeSeries' \cr \code{ sortColnames} \tab Returns alphabetically sorted column names \cr \code{ sampleColnames} \tab Returns sampled column names of a 'timeSeries' \cr \code{ pcaColnames} \tab Returns PCA correlation ordered column names \cr \code{ hclustColnames} \tab Returns hierarchically clustered columnames \cr \code{ statsColnames} \tab Returns statisticall rearrange columnames \cr \code{orderStatistics} \tab Computes order statistics of a 'timeSeries' object \cr \code{rollMean} \tab Computes rolling means of a 'timeSeries' object \cr \code{ rollMin} \tab Computes rolling minima of a 'timeSeries' object \cr \code{ rollMax} \tab Computes rolling maxima of a 'timeSeries' object \cr \code{ rollMedian} \tab Computes rolling medians of a 'timeSeries' object \cr \code{ rollStats} \tab Computes rolling statistics of a 'timeSeries' objectcr \cr \code{rowCumsums} \tab Computes cumulated column sums of a 'timeSeries' \cr \code{smoothLowess} \tab Smoothes a series with lowess function \cr \code{ smoothSupsmu} \tab Smoothes a series with supsmu function \cr \code{ smoothSpline} \tab Smoothes a series with smooth.spline function } } \section{Misc Functions}{ \tabular{ll}{ \code{dummyDailySeries} \tab Creates a dummy daily 'timeSeries' object \cr \code{isMonthly} \tab Decides if the series consists of monthly records \cr %\code{Description} \tab Creates default description string \cr \code{getArgs} \tab Extracts arguments from a S4 method } } \keyword{package} timeSeries/man/fin-daily.Rd0000644000176000001440000001232112407026706015334 0ustar ripleyusers\name{SpecialDailySeries} \title{Special Daily Time Series} \alias{daily} \alias{dummyDailySeries} \alias{dummySeries} \alias{alignDailySeries} \alias{rollDailySeries} %alias{ohlcDailyPlot} \description{ Special daily 'timeSeries' functions. } \details{ \tabular{ll}{ \code{dummyDailySeries} \tab Creates a dummy daily 'timeSeries' object, \cr \code{alignDailySeries} \tab Aligns a daily 'timeSeries' to new positions,\cr \code{rollDailySeries} \tab Rolls daily a 'timeSeries' on a given period, \cr \code{ohlcDailyPlot} \tab Plots open high low close bar chart, \cr \code{dummySeries} \tab Creates a dummy monthly 'timeSeries' object} } \usage{ dummyDailySeries(x = rnorm(365), units = NULL, zone = "", FinCenter = "") alignDailySeries(x, method = c("before", "after", "interp", "fillNA", "fmm", "periodic", "natural", "monoH.FC"), include.weekends = FALSE, units = NULL, zone = "", FinCenter = "", ...) rollDailySeries(x, period = "7d", FUN, \dots) %ohlcDailyPlot(x, volume = TRUE, colOrder = c(1:5), units = 1e6, % xlab = c("Date", "Date"), ylab = c("Price", "Volume"), % main = c("O-H-L-C", "Volume"), grid.nx = 7, grid.lty = "solid", \dots) } \arguments{ %\item{colOrder}{ % [ohlcDailyPlot] - \cr % an integer vector which gives the order of the prices and the % volume in the input object. By default the following order of % columns from 1 to 5 is assumed: Open, high, low, close, and volume. % } \item{FinCenter}{ a character with the the location of the financial center named as "continent/city". } \item{FUN}{ the function to be applied.\cr [applySeries] - \cr a function to use for aggregation, by default \code{colAvgs}. } %\item{grid.lty, grid.nx}{ % [ohlcDailyPlot] - \cr % The type of grid line and the number of grid lines used in the % plot. % } \item{include.weekends}{ [alignDailySeries] - \cr a logical value. Should weekend dates be included or removed from the series. } %\item{main}{ % [ohlcDailyPlot] - \cr % a character string to title the price and volume plot. % } \item{method}{ [alignDailySeries] - \cr the method to be used for the alignment. A character string, one of \code{"before"}, use the data from the row whose position is just before the unmatched position, or \code{"after"}, use the data from the row whose position is just after the unmatched position, or \code{"linear"}, interpolate linearly between \code{"before"} and \code{"after"}. } \item{period}{ [rollDailySeries] - \cr a character string specifying the rollling period composed by the length of the period and its unit, e.g. \code{"7d"} represents one week. } \item{units}{ [allignDailySeries] - \cr an optional character string, which allows to overwrite the current column names of a \code{timeSeries} object. By default \code{NULL} which means that the column names are selected automatically. %\cr %[ohlcDailyPlot] - \cr %a numeric value, specifying in which multiples the volume should %be referenced on the plot labels. By default 1e6, i.e. in units %of 1 Million. } %\item{volume}{ % [ohlcDailyPlot] - \cr % a logigical value. Should a volume plot added to the OHLC Plot. % By default \code{TRUE}. % } \item{x}{ an object of class \code{timeSeries}. } %\item{xlab, ylab}{ % [ohlcDailyPlot] - \cr % two string vectors to name the x and y axis of the price and % volume plot. % } \item{zone}{ the time zone or financial center where the data were recorded. } \item{\dots}{ arguments passed to interpolating methods. } } \value{ \code{dummyDailySeries} \cr creates from a numeric matrix with daily records of unknown dates a \code{timeSeries} object with dummy daily dates. \cr \code{alignDailySeries} \cr returns from a daily time series with missing holidays a weekly aligned daily \code{timeSeries} object \cr \code{rollDailySeries}\cr \cr returns an object of class \code{timeSeries} with rolling values, computed from the function \code{FUN}. %\cr % %\code{ohlcDailyPlot} %displays a Open-High-Low-Close Plot of daily data records. } \examples{ ## Use Microsofts' OHLCV Price Series - head(MSFT) end(MSFT) ## Cut out April Data from 2001 - Close <- MSFT[, "Close"] tsApril01 <- window(Close, start="2001-04-01", end="2001-04-30") tsApril01 ## Align Daily Series with NA - tsRet <- returns(tsApril01, trim = TRUE) GoodFriday(2001) EasterMonday(2001) alignDailySeries(tsRet, method = "fillNA", include.weekends = FALSE) alignDailySeries(tsRet, method = "fillNA", include.weekends = TRUE) ## Align Daily Series by Interpolated Values - alignDailySeries(tsRet, method = "interp", include.weekend = FALSE) alignDailySeries(tsRet, method = "interp", include.weekend = TRUE) } \keyword{chron} timeSeries/man/timeSeries.Rd0000644000176000001440000001320512347663061015577 0ustar ripleyusers\name{TimeSeriesClass} \title{timeSeries Class} \alias{TimeSeriesClass} \alias{timeSeries} \alias{timeSeries,ANY,ANY-method} \alias{timeSeries,ANY,missing-method} \alias{timeSeries,ANY,timeDate-method} \alias{timeSeries,matrix,ANY-method} \alias{timeSeries,matrix,missing-method} \alias{timeSeries,matrix,timeDate-method} \alias{timeSeries,missing,ANY-method} \alias{timeSeries,missing,missing-method} \alias{timeSeries,missing,timeDate-method} \alias{timeSeries,matrix,numeric-method} \alias{index_timeSeries} \alias{time_timeSeries} \alias{timeSeries-class} \alias{index_timeSeries-class} \alias{time_timeSeries-class} \alias{initialize,timeSeries-method} \alias{seriesData} \description{ Functions to generate and modify 'timeSeries' objects: \tabular{ll}{ \code{timeSeries} \tab Creates a 'timeSeries' object from scratch.} Data Slot and classification of 'timeSeries' objects: \tabular{ll}{ \code{seriesData} \tab Extracts data slot from a 'timeSeries'. } } \usage{ timeSeries(data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, \dots) seriesData(object) } \arguments{ \item{charvec}{ a character vector of dates and times or any objects which can be coerced to a \code{timeDate} object. } \item{data}{ a \code{matrix} object or any objects which can be coereced to a matrix. } \item{documentation}{ optional documentation string, or a vector of character strings. } \item{FinCenter}{ a character with the the location of the financial center named as "continent/city". } \item{format}{ the format specification of the input character vector, \cr [as.timeSeries] - \cr a character string with the format in POSIX notation to be passed to the time series object. } \item{object}{ [is][seriesData][seriesPositions][show][summary] - an object of class \code{timeSeries}. } \item{recordIDs}{ a data frame which can be used for record identification information. \cr [print] - \cr a logical value. Should the \code{recordIDs} printed together with the data matrix and time series positions? } \item{title}{ an optional title string, if not specified the inputs data name is deparsed. } \item{units}{ an optional character string, which allows to overwrite the current column names of a \code{timeSeries} object. By default \code{NULL} which means that the column names are selected automatically. } \item{zone}{ the time zone or financial center where the data were recorded. } \item{\dots}{ arguments passed to other methods. } } \value{ \code{timeSeries}\cr returns a S4 object of class \code{timeSeries}. \cr \code{seriesData}\cr \cr extracts the \code{@.Data} slot from a \code{timeSeries} object and is equivalent to \code{as.amtrix}. } \details{ \bold{Generation of Time Series Objects:} \cr We have defined a \code{timeSeries} class which is in many aspects similar to the S-Plus class with the same name, but has also some important differences. The class has seven Slots, the 'Data' slot which holds the time series data in matrix form, the 'position' slot which holds the time/date as a character vector, the 'format' and 'FinCenter' slots which are the same as for the 'timeDate' object, the 'units' slot which holds the column names of the data matrix, and a 'title' and a 'documentation' slot which hold descriptive character strings. Date and time is managed in the same way as for \code{timeDate} objects. } \note{ These functions were written for Rmetrics users using R and Rmetrics under Microsoft's Windows operating system where timze zones, daylight saving times and holiday calendars are insuffeciently supported. } \examples{ ## Load Microsoft Data - # Microsoft Data: setRmetricsOptions(myFinCenter = "GMT") data(MSFT) head(MSFT) ## Create a timeSeries Object, The Direct Way ... Close <- MSFT[, 5] head(Close) ## Create a timeSeries Object from Scratch - data <- as.matrix(MSFT[, 4]) charvec <- rownames(MSFT) Close <- timeSeries(data, charvec, units = "Close") head(Close) c(start(Close), end(Close)) ## Cut out April Data from 2001 - tsApril01 <- window(Close, "2001-04-01", "2001-04-30") tsApril01 ## Compute Continuous Returns - returns(tsApril01) ## Compute Discrete Returns - returns(tsApril01, type = "discrete") ## Compute Discrete Returns, Don't trim - returns(tsApril01, trim = FALSE) ## Compute Discrete Returns, Use Percentage Values - tsRet <- returns(tsApril01, percentage = TRUE, trim = FALSE) tsRet ## Aggregate Weekly - GoodFriday(2001) to <- timeSequence(from = "2001-04-11", length.out = 3, by = "week") from <- to - 6*24*3600 from to applySeries(tsRet, from, to, FUN = sum) ## Create large timeSeries objects with different 'charvec' object classes - # charvec is a 'timeDate' object head(timeSeries(1:1e6L, timeSequence(length.out = 1e6L, by = "sec"))) head(timeSeries(1:1e6L, seq(Sys.timeDate(), length.out = 1e6L, by = "sec"))) # 'charvec' is a 'POSIXt' object head(timeSeries(1:1e6L, seq(Sys.time(), length.out = 1e6L, by = "sec"))) # 'charvec' is a 'numeric' object head(timeSeries(1:1e6L, 1:1e6L)) } \keyword{chron} timeSeries/man/stats-window.Rd0000644000176000001440000000062112407026706016123 0ustar ripleyusers\name{window} \title{window} \alias{window} \description{ Extracts a part from a 'timeSeries Object } \examples{ ## Load LPP Benchmark Returns - x <- LPP2005REC[, 7:9] range(time(x)) ## Extract Data for January 2006 - window(x, "2006-01-01", "2006-01-31") } \keyword{chron} timeSeries/man/fin-splits.Rd0000644000176000001440000000236112407026706015553 0ustar ripleyusers\name{splits} \title{splits} \alias{splits} \description{ Searches for outlier splits in a 'timeSeries' object. } \details{ This function is thought to find splits in financial price or index series If a price or index is splitted we observe in the returns a big jump of several standard deviations which is identified usual as an outlier. } \usage{ splits(x, sd = 3, complement = TRUE, ...) } \arguments{ \item{x}{ a 'timeSeries' object. } \item{sd}{ a numeric value of standard deviations, e.g. 5 means that values larger or smaller than five times the standard deviation of the series will be detected. } \item{complement}{ a logical flag, should the outlier series or its complements be returned? } \item{\dots}{ arguments to be passed. } } \examples{ ## Create a Return Series with a Split - data <- runif(12, -1, 1) data[6] <- 20 x <- timeSeries(data, timeCalendar(), units="RUNIF") x ## Search for the Split: splits(x, sd=3, complement=TRUE) splits(x, sd=3, complement=FALSE) } timeSeries/man/methods-base.Rd0000644000176000001440000000057212407026706016040 0ustar ripleyusers\name{base-methods} \title{Methods for 'timeSeries' object} \docType{methods} \alias{mean,timeSeries-method} \alias{summary,timeSeries-method} \description{ Methods for function in Package `base' for \code{timeSeries} object. } \section{Methods}{ \describe{ \item{x = "timeSeries"}{a \code{timeSeries} object.} }} \examples{ ## None - } \keyword{chron} timeSeries/man/fin-monthly.Rd0000644000176000001440000000601312407026706015725 0ustar ripleyusers\name{monthly} \alias{monthly} \alias{countMonthlyRecords} \alias{rollMonthlyWindows} \alias{rollMonthlySeries} \title{Special Monthly Series} \description{ Functions and methods dealing with special monthly 'timeSeries' objects. } \details{ The function \code{countMonthlyRecords} computes a 'timeSeries' that holds the number of monthly counts of the records. The function \code{rollMonthlyWindows} computes start and end dates for rolling time windows. The function \code{rollMonthlySeries} computes a static over rolling periods defined by the function \code{rollMonthlyWindows}. } \usage{ countMonthlyRecords(x) rollMonthlyWindows(x, period = "12m", by = "1m") rollMonthlySeries(x, period = "12m", by = "1m", FUN, \dots) } \arguments{ \item{x}{ a 'timeSeries' object. } \item{period}{ a character string specifying the rollling period composed by the length of the period and its unit. As examples: \code{"3m"} represents quarterly shifts, and \code{"6m"}, ]code{"12m"}, and \code{"24m"} semi-annual, annual and bi-annual shifts. To determine the proper start of the series is in the responsibility of the user. } \item{by}{ a character string specifying the rolling shift composed by the length of the shift and its unit. As examples: \code{"1m"} represents monthly shifts, \code{"3m"} represents quarterly shifts, and \code{"6m"} semi-annual shifts. To determine the proper start of the series is in the responsibility of the user. } \item{FUN}{ the function for the statistic to be applied. For example in the case of aggregation use\code{colAvgs}. } \item{\dots}{ arguments passed to the function \code{FUN}. } } \value{ The function \code{countMonthlyRecords} returns a 'timeSeries' object. The function \code{rollMonthlyWindows} returns a list with two named 'tomeDate' entries: \code{$from} and \code{to}. An attribute \code{"control"} is added which keeps the \code{start} and \code{end} dates of the series. The function \code{rollMonthlySeries} computes the statistics defined by the function \code{FUN} over a rolling window internally computed by the function \code{rollMonthlyWindows}. Note, the periods may be overlapping, may be dense, or even may have gaps. } \examples{ ## Load Microsoft Daily Data Set: x <- MSFT ## Count Monthly Records - counts <- countMonthlyRecords(x) counts ## Quaterly Non-Overlapping Time Periods - windows <- rollMonthlyWindows(counts[-1, ], period = "3m", by = "3m") windows ## Nicely Reprint Results as a data.frame - data.frame(cbind(FROM=format(windows$from), TO=format(windows$to))) ## Compute the average number of monthly trading days per quarter - rollMonthlySeries(counts[-1, ], period = "3m", by = "3m", FUN=mean) } \keyword{chron} timeSeries/man/fin-turnpoints.Rd0000644000176000001440000000704412407026706016465 0ustar ripleyusers\name{turns} \title{Turning Points of a Time Series} \alias{turns} \alias{turnsStats} \description{ Extracts and analyzes turn points of an univariate \code{timeSeries} object. } \usage{ turns(x, \dots) turnsStats(x, doplot = TRUE) } \arguments{ \item{x}{ an univariate 'timeSeries' object of financial indices or prices. } \item{\dots}{ optional arguments passed to the function \code{na.omit}. } \item{doplot}{ a logical flag, should the results be plotted? By default TRUE. } } \details{ The function \code{turns} determines the number and the position of extrema (turning points, either peaks or pits) in a regular time series. The function \code{turnsStats} calculates the quantity of information associated to the observations in this series, according to Kendall's information theory. The functions are borrowed from the contributed R package \code{pastecs} and made ready for working together with univariate \code{timeSeries} objects. You need not to load the R package \code{pastecs}, the code parts we need here are builtin in the \code{timeSeries} package. We have renamed the function \code{turnpoints} to \code{turns} to distinguish between the original function in the contributed R package \code{pastecs} and our Rmetrics function wrapper. For further details please consult the help page from the contributed R package \code{pastecs}. } \value{ \code{turns}\cr returns an object of class \code{timeSeries}. \code{turnsStats}\cr returns an object of class \code{turnpoints} with the following entries:\cr \code{data} - The dataset to which the calculation is done.\cr \code{n} - The number of observations.\cr \code{points} - The value of the points in the series, after elimination of ex-aequos.\cr \code{pos} - The position of the points on the time scale in the series (including ex-aequos).\cr \code{exaequos} - Location of exaequos (1), or not (0).\cr \code{nturns} - Total number of tunring points in the whole time series.\cr \code{firstispeak} - Is the first turning point a peak (TRUE), or not (FALSE).\cr \code{peaks} - Logical vector. Location of the peaks in the time series without ex-aequos.\cr \code{pits} - Logical vector. Location of the pits in the time series without ex-aequos.\cr \code{tppos} - Position of the turning points in the initial series (with ex-aequos).\cr \code{proba} - Probability to find a turning point at this location.\cr \code{info} - Quantity of information associated with this point.\cr } \author{ Frederic Ibanez and Philippe Grosjean for code from the contributed R package \code{pastecs} and Rmetrics for the function wrapper. } \references{ Ibanez, F., 1982, Sur une nouvelle application de la theorie de l'information a la description des series chronologiques planctoniques. J. Exp. Mar. Biol. Ecol., 4, 619--632 Kendall, M.G., 1976, Time Series, 2nd ed. Charles Griffin and Co, London. } \examples{ ## Load Swiss Equities Series - SPI.RET <- LPP2005REC[, "SPI"] head(SPI.RET) ## Cumulate and Smooth the Series - SPI <- smoothLowess(cumulated(SPI.RET), f=0.05) plot(SPI) ## Plot Turn Points Series - SPI.SMOOTH <- SPI[, 2] tP <- turns(SPI.SMOOTH) plot(tP) ## Compute Statistics - turnsStats(SPI.SMOOTH) } \keyword{chron} timeSeries/man/methods-is.Rd0000644000176000001440000000160012407026706015532 0ustar ripleyusers\name{is.timeSeries} \title{timeSeries Class, Coercion and Transformation} \alias{is.timeSeries} \alias{is.signalSeries} \alias{is.na,timeSeries-method} \alias{is.unsorted,timeSeries-method} \description{ \code{is.timeSeries} tests if its argument is a \code{timeSeries}. \code{is.timeSeries} tests if series has no timestamps. } \usage{ is.timeSeries(x) is.signalSeries(x) } \arguments{ \item{x}{ an object of class 'timeSeries'. } } \value{ Returns \code{TRUE} or \code{FALSE} depending on whether its argument is an object of class 'timeSeries' or not. } \examples{ ## Create an Artificial timeSeries Object - setRmetricsOptions(myFinCenter = "GMT") charvec <- timeCalendar() data <- matrix(rnorm(12)) TS <- timeSeries(data, charvec, units = "RAND") TS ## Test for timeSeries - is.timeSeries(TS) } \keyword{chron} timeSeries/man/timeSeries-slotTime.Rd0000644000176000001440000000215112407026706017367 0ustar ripleyusers\name{time} \title{Get and Set Time stamps of a 'timeSeries'} \alias{time} \alias{time<-} \alias{time,timeSeries-method} \alias{time.timeSeries} \alias{time<-.timeSeries} \alias{sample,timeSeries-method} \alias{getTime} \alias{setTime<-} \description{ Functions and methods extracting and modifying positions of 'timeSeries' objects. } \usage{ getTime(x) setTime(x) <- value \S4method{time}{timeSeries}(x, \dots) \method{time}{timeSeries}(x) <- value } \arguments{ \item{value}{ a valid value for the component of \code{time(x)}. } \item{x}{ an object of class \code{timeSeries}. } \item{\dots}{ optional arguments passed to other methods. } } \value{ Returns a 'timeDate' object. } \examples{ ## Create Dummy timeSeries - X <- timeSeries(matrix(rnorm(24), 12), timeCalendar()) ## Return Series Positions - getTime(X) time(X) ## Add / Subtract one Day from X setTime(X) <- time(X) - 24*3600 # sec X time(X) <- time(X) + 24*3600 # sec X } \keyword{chron} timeSeries/man/methods-as.Rd0000644000176000001440000000753012407026706015532 0ustar ripleyusers\name{as} \title{timeSeries Class, Coercion and Transformation} \alias{as} \alias{as.timeSeries} \alias{as.timeSeries.default} \alias{as.timeSeries.ts} \alias{as.timeSeries.data.frame} \alias{as.timeSeries.character} \alias{as.timeSeries.zoo} \alias{as.ts,timeSeries-method} \alias{as.data.frame,timeSeries-method} \alias{as.list,timeSeries-method} \alias{as.matrix,timeSeries-method} \alias{as.ts.timeSeries} \alias{as.data.frame.timeSeries} \alias{as.list.timeSeries} \alias{as.matrix.timeSeries} \alias{coerce,ANY,timeSeries-method} \alias{coerce,ts,timeSeries-method} \alias{coerce,data.frame,timeSeries-method} \alias{coerce,character,timeSeries-method} \alias{coerce,ANY,timeSeries-method} \alias{coerce,timeSeries,tse-method} \alias{coerce,timeSeries,data.frame-method} \alias{coerce,timeSeries,list-method} \alias{coerce,timeSeries,matrix-method} \alias{coerce,timeSeries,ts-method} \description{ Functions and methods dealing with the coercion of 'timeSeries' objects. } \details{ Functions to create 'timeSeries' objects from other objects: \tabular{ll}{ \code{as.timeSeries} \tab Generic to convert an object to a 'timeSeries', \cr \code{as.timeSeries.default} \tab Returns the unchanged object, \cr \code{as.timeSeries.numeric} \tab Converts from a numeric vector, \cr \code{as.timeSseries.data.frame} \tab Converts from a numeric vector, \cr \code{as.timeSeries.matrix} \tab Converts from a matrix, \cr \code{as.timeSeries.ts} \tab Converts from an object of class 'ts', \cr \code{as.timeSeries.character} \tab Converts from a named demo file, \cr \code{as.timeSeries.zoo} \tab Converts an object of class zoo. } Functions to transform 'timeSeries' objects into other objects: \tabular{ll}{ % \code{as.vector.timeSeries} \tab Coerces a 'timeSeries' to a vector, \cr % \code{as.numeric.timeSeries} \tab Coerces a 'timeSeries' to numeric, \cr \code{as.matrix.timeSeries} \tab Coerces a 'timeSeries' to a matrix, \cr \code{as.data.frame.timeSeries} \tab Coerces a 'timeSeries' to a data.frame, \cr \code{as.ts.timeSeries} \tab S3: Coerces a 'timeSeries' to a 'ts' object. \cr \code{as.ts.timeSeries} \tab S3: Coerces a 'timeSeries' to a 'logical' object. } } \usage{ \method{as.timeSeries}{default}(x, \dots) \method{as.timeSeries}{ts}(x, \dots) \method{as.timeSeries}{data.frame}(x, \dots) \method{as.timeSeries}{character}(x, \dots) \method{as.timeSeries}{zoo}(x, \dots) \S4method{as.matrix}{timeSeries}(x, \dots) \S4method{as.ts}{timeSeries}(x, \dots) \S4method{as.data.frame}{timeSeries}(x, row.names = NULL, optional = FALSE, \dots) \S4method{as.ts}{timeSeries}(x, \dots) } \arguments{ \item{optional}{ A logical value. If \code{TRUE}, setting row names and converting column names (to syntactic names) is optional. } \item{row.names}{ \code{NULL} or a character vector giving the row names for the data frame. Missing values are not allowed. } \item{x}{ an object which is coerced according to the generic function. } \item{\dots}{ arguments passed to other methods. } } \value{ Function \code{as.timeSeries} returns a S4 object of class 'timeSeries'.\cr Functions \code{as.numeric}, \code{as.data.frame}, \code{as.matrix}, \code{as.ts} return depending on the generic function a numeric vector, a data frame, a matrix, or an object of class \code{ts}. } \examples{ ## Create an Artificial timeSeries Object - setRmetricsOptions(myFinCenter = "GMT") charvec <- timeCalendar() data <- matrix(rnorm(12)) TS <- timeSeries(data, charvec, units = "RAND") TS ## Coerce to Vector - as.vector(TS) ## Coerce to Matrix - as.matrix(TS) ## Coerce to Data Frame - as.data.frame(TS) } \keyword{chron} timeSeries/man/stats-model.frame.Rd0000644000176000001440000000310712407026706017007 0ustar ripleyusers\name{model.frame} \title{Model Frames for Time Series Objects} \alias{model.frame} \alias{model.frame.default,ANY,timeSeries-method} \description{ Allow to work with model frames for 'timeSeries' objects. } % \usage{ % model.frame(formula, data, ...) % } % \arguments{ % \item{formula}{ % a model formula object. % } % \item{data}{ % an object of class \code{timeSeries}. % } % \item{\dots}{ % arguments passed to the function \code{stats::model.frame}. % } % } \value{ Returns an object of class 'timeSeries. } \details{ The function \code{model.frame} is a generic function which returns in the R-ststs framework by default a data.frame with the variables needed to use \code{formula} and any \code{...} arguments. In contrast to this the method returns an object of class \code{timeSeries} when the argument data was not a \code{data.frame} but also an object of class 'timeSeries'. } \note{ This function is preliminary and untested. } \seealso{ \code{\link{model.frame}}. } \examples{ ## Load Microsoft Data - setRmetricsOptions(myFinCenter = "GMT") X <- MSFT[1:12, ] ## Extract High's and Low's: DATA <- model.frame( ~ High + Low, data = X) class(DATA) as.timeSeries(DATA) ## Extract Open Prices and their log10's: base <- 10 Open <- model.frame(Open ~ log(Open, base = `base`), data = X) colnames(Open) <- c("X", "log10(X)") class(Open) as.timeSeries(Open) } \keyword{chron} timeSeries/man/fin-cumulated.Rd0000644000176000001440000000317512407026706016224 0ustar ripleyusers\name{cumulated} \title{Cumulated Time Series from Returns} \alias{cumulated} \alias{cumulated.default} \description{ Computes a cumulated financial 'timeSeries', e.g. prices or indexes, from financial returns. } \usage{ cumulated(x, \dots) \method{cumulated}{default}(x, method = c("continuous", "discrete", "compound", "simple"), percentage = FALSE, \dots) } \arguments{ \item{method}{ a character string naming the method how the returns were computed. } \item{percentage}{ a logical value. By default \code{FALSE}, if \code{TRUE} the series will be expressed in percentage changes. } \item{x}{ an object of class \code{timeSeries}. } \item{\dots}{ arguments to be passed. } } \details{ Note, the function \code{cumulated} assumes as input discrete returns from a price or index series. Only then the cumulatrd series agrees with the original price or index series. The first values of the cumulated series cannot be computed, it is assumed that the series is indexed to 1. } \value{ Returns a 'timeSeries' object of the same class as the input argument \code{x}. } \examples{ ## Use the Microsofts' Close Prices Indexed to 1 - MSFT.CL <- MSFT[, "Close"] MSFT.CL <- MSFT.CL/MSFT[[1, "Close"]] head(MSFT.CL) ## Compute Discrete Return - MSFT.RET <- returns(MSFT.CL, method = "discrete") ## Cumulated Series and Compare - MSFT.CUM <- cumulated(MSFT.RET, method = "discrete") head(cbind(MSFT.CL, MSFT.CUM)) } \keyword{chron} timeSeries/man/statistics-rowCumsums.Rd0000644000176000001440000000155311545077672020053 0ustar ripleyusers\name{rowCum} \title{Cumulated Column Statistics} \alias{rowCum} \alias{rowCumsums} \alias{rowCumsums,ANY-method} \alias{rowCumsums,timeSeries-method} \description{ Compute cumulative row Statistics. } \usage{ \S4method{rowCumsums}{ANY}(x, na.rm = FALSE, \dots) \S4method{rowCumsums}{timeSeries}(x, na.rm = FALSE, \dots) } \arguments{ \item{na.rm}{ a logical. Should missing values be removed? } \item{x}{ a time series, may be an object of class \code{"matrix"} or \code{"timeSeries"}. } \item{\dots}{ arguments to be passed. } } \value{ all functions return an S4 object of class \code{timeSeries}. } \examples{ ## Simulated Monthly Return Data - X = matrix(rnorm(24), ncol = 2) ## Compute cumulated Sums - rowCumsums(X) } \keyword{univar} timeSeries/man/fin-durations.Rd0000644000176000001440000000263712407026706016253 0ustar ripleyusers\name{durations} \title{Durations from a Time Series} \alias{durations} \alias{durationSeries} \description{ Computes durations from an object of class 'timeSeries'. } \usage{ durations(x, trim = FALSE, units = c("secs", "mins", "hours", "days")) } \arguments{ \item{x}{ an object of class \code{timeSeries}. } \item{trim}{ a logical value. By default \code{TRUE}, the first missing observation in the return series will be removed. } \item{units}{ a character value or vector which allows to set the units in which the durations are measured. By default durations are measured in seconds. } } \details{ Durations measure how long it takes until we get the next record in a \code{timesSeries} object. We return a time series in which for each time stamp we get the length of the period from when we got the last record. This period is measured in length specified by the argument \code{units}, for daily data use \code{units="days"}. } \value{ returns an object of class \code{timeSeries}. } \examples{ ## Compute Durations in days for the MSFT Sereries - head(durations(MSFT, units = "days")) head(durations(MSFT, trim = TRUE, units = "days")) ## The same in hours - head(durations(MSFT, trim = TRUE, units = "hours")) } \keyword{chron} timeSeries/man/fin-returns.Rd0000644000176000001440000000420212407026706015733 0ustar ripleyusers\name{returns} \title{Financial Returns} \alias{returns} \alias{returns,ANY-method} \alias{returns,timeSeries-method} \alias{returns0} \alias{returnSeries} \alias{getReturns} \description{ Compute financial returns from prices or indexes. } \usage{ returns(x, \dots) returns0(x, \dots) \S4method{returns}{ANY}(x, method = c("continuous", "discrete", "compound", "simple"), percentage = FALSE, \dots) \S4method{returns}{timeSeries}(x, method = c("continuous", "discrete", "compound", "simple"), percentage = FALSE, na.rm = TRUE, trim = TRUE, \dots) getReturns(\dots) returnSeries(\dots) } \arguments{ \item{x}{ an object of class \code{timeSeries}. } \item{percentage}{ a logical value. By default \code{FALSE}, if \code{TRUE} the series will be expressed in percentage changes. } \item{method}{ a character string. Which method should be used to compute the returns, "continuous", "discrete", or "compound", "simple". The second pair of methods is a synonyme for the first two methods. } \item{na.rm}{ a logical value. Should NAs be removed? By Default \code{TRUE}. } \item{trim}{ a logical value. Should the time series be trimmed? By Default \code{TRUE}. } \item{\dots}{ arguments to be passed. } } \value{ all functions return an object of class \code{timeSeries}. \code{returns0} returns am untrimmed series with the first row of returns set to zero(s). } \note{ The functions \code{returnSeries}, \code{getReturns}, are synonymes for the function \code{returns}. We do not recommend to use these functions. } \examples{ ## Load Microsoft Data - setRmetricsOptions(myFinCenter = "GMT") data(MSFT) X = MSFT[1:10, 1:4] X ## Continuous Returns - returns(X) returns0(X) ## Discrete Returns: returns(X, method = "discrete") ## Don't trim: returns(X, trim = FALSE) ## Use Percentage Values: returns(X, percentage = TRUE, trim = FALSE) } \keyword{chron} timeSeries/man/statistics-orderStatistics.Rd0000644000176000001440000000131212407026706021034 0ustar ripleyusers\name{orderStatistics} \title{order Statistics} \alias{orderStatistics} \description{ Computes order statistic of a 'timeSeries'. } \usage{ orderStatistics(x) } \arguments{ \item{x}{ an univariate 'timeSeries' object. } } \value{ Function \code{orderStatistics} returns the order statistic of an univariate 'timeSeries' object. The output is an object of class 'list'. } \examples{ ## Load Swiss Pension Fund Benchmark Data - setRmetricsOptions(myFinCenter = "GMT") X <- LPP2005REC[, "SPI"] colnames(X) ## Compute 1\% Order Statistics - N <- round(0.01*nrow(X)) N OS <- orderStatistics(X)[[1]] OS[1:N, ] } \keyword{chron} timeSeries/man/timeSeries-slotSeries.Rd0000644000176000001440000000305212347663061017730 0ustar ripleyusers\name{series-methods} \docType{methods} \alias{series} \alias{series<-} \alias{series,timeSeries-method} \alias{series<-,timeSeries,matrix-method} \alias{series<-,timeSeries,ANY-method} \alias{series<-,timeSeries,data.frame-method} \alias{series<-,timeSeries,vector-method} \alias{coredata} \alias{coredata<-} \alias{coredata,timeSeries-method} \alias{coredata<-,timeSeries,matrix-method} \alias{coredata<-,timeSeries,ANY-method} \alias{coredata<-,timeSeries,data.frame-method} \alias{coredata<-,timeSeries,vector-method} %\alias{getSeries} %\alias{getSeries.timeSeries} %\alias{setSeries<-} \title{Get and Set Data of a 'timeSeries'} \description{ \code{series} returns the \code{@.Data} slot of a \code{timeSeries} object in \code{matrix} form. New series can also be assign to an already existing \code{timeSeries}. \code{coredata} is a synonyme function nameing for \code{series}. } \usage{ %\S4method{series}{timeSeries}(x) series(x) series(x) <- value % %getSeries(x) %setSeries(x) <- value } \arguments{ \item{x}{ a \code{timeSeries} object. } \item{value}{ a \code{vector}, a \code{data.frame} or a \code{matrix} object of numeric data. } } \seealso{timeSeries()} \examples{ ## A Dummy timeSeries Object ts <- timeSeries() ts ## Get the Matrix Part - mat <- series(ts) class(mat) mat ## Assign a New Univariate Series - series(ts) <- rnorm(12) ts ## Assign a New Bivariate Series - series(ts) <- rnorm(12) ts } \keyword{programming} timeSeries/man/base-cbind.Rd0000644000176000001440000000375612407026706015463 0ustar ripleyusers\name{bind} \title{Bind two timeSeries objects} %\alias{merge} \alias{cbind} \alias{rbind} \alias{cbind2} \alias{rbind2} % \alias{cbind,timeSeries-method} % \alias{rbind,timeSeries-method} \alias{cbind.timeSeries} \alias{rbind.timeSeries} % \alias{c.timeSeries} %\alias{merge,ANY,timeSeries-method} %\alias{merge,timeSeries,ANY-method} %\alias{merge,timeSeries,missing-method} %\alias{merge,timeSeries,numeric-method} %\alias{merge,timeSeries,matrix-method} %\alias{merge,timeSeries,timeSeries-method} %\alias{merge,matrix,timeSeries-method} %\alias{merge,numeric,timeSeries-method} %\alias{merge.timeSeries} \alias{cbind2,ANY,timeSeries-method} \alias{cbind2,timeSeries,ANY-method} \alias{cbind2,timeSeries,missing-method} \alias{cbind2,timeSeries,timeSeries-method} \alias{rbind2,ANY,timeSeries-method} \alias{rbind2,timeSeries,ANY-method} \alias{rbind2,timeSeries,missing-method} \alias{rbind2,timeSeries,timeSeries-method} \description{ Binds two 'timeSeries' objects either by column or by row. } % \usage{ % \S4method{merge}{timeSeries,timeSeries}(x, y, ...) % \S4method{cbind2}{timeSeries,timeSeries}(x, y) % \S4method{rbind2}{timeSeries,timeSeries}(x, y) % \S4method{cbind2}{timeSeries,timeSeries}(x, y) % } % \arguments{ % % \item{units}{ % % an optional character string, which allows to overwrite the % % current column names of a \code{timeSeries} object. By default % % \code{NULL} which means that the column names are selected % % automatically. % % } % \item{x, y}{ % two objects of class \code{timeSeries}. % } % % \item{\dots}{ % % arguments passed to returned timeSeries object. % % } % } \value{ returns a S4 object of class \code{timeDate}. } \examples{ ## Load Microsoft Data Set - x <- MSFT[1:12, ] x ## Bind Columnwise - X <- cbind(x[, "Open"], returns(x[, "Open"])) colnames(X) <- c("Open", "Return") X ## Bind Rowwise - Y <- rbind(x[1:3, "Open"], x[10:12, "Open"]) Y } \keyword{chron} timeSeries/man/base-sample.Rd0000644000176000001440000000103212407026706015646 0ustar ripleyusers\name{sample} \title{sample} \description{ Takes a sample of the specified size from the elements of a 'timeSeries. } \value{ Returns a resampled 'timeSeries' object. } \examples{ ## Monthly Calendar Series - x <- daily2monthly(LPP2005REC[, 1:2])[3:14, ] ## Resample the Series with respect to the time stamps - resampled <- sample(x) resampled is.unsorted(resampled) } \keyword{chron} timeSeries/man/stats-na.contiguous.Rd0000644000176000001440000000141111246737701017412 0ustar ripleyusers\name{na.contiguous} \title{Find Longest Contiguous Stretch of non-NAs} \alias{na.contiguous,timeSeries-method} \description{ Find the longest consecutive stretch of non-missing values in a timeSeries object. (In the event of a tie, the first such stretch.) } \usage{ \S4method{na.contiguous}{timeSeries}(object, ...) } \arguments{ \item{object}{ a timeSeries object. } \item{\dots}{ further arguments passed to or from other methods. } } \value{ A timeSeries object without missing values. } \examples{ ## Dummy timeSeries with NAs entries data <- matrix(sample(c(1:20, rep(NA,4))), ncol = 2) s <- timeSeries(data, timeCalendar()) ## Find the longest consecutive non-missing values na.contiguous(s) } timeSeries/man/statistics-rollMean.Rd0000644000176000001440000000454211554132561017426 0ustar ripleyusers\name{rollMean} \title{Rolling Statistics} \alias{rollStats} \alias{rollMean} \alias{rollMin} \alias{rollMax} \alias{rollMedian} \description{ Computes rolling mean, min, max and median for a 'timeSeries' object. } \usage{ rollStats(x, k, FUN=mean, na.pad=FALSE, align=c("center", "left", "right"), \dots) rollMean(x, k, na.pad = FALSE, align = c("center", "left", "right"), \dots) rollMin(x, k, na.pad = FALSE, align = c("center", "left", "right"), \dots) rollMax(x, k, na.pad = FALSE, align = c("center", "left", "right"), \dots) rollMedian(x, k, na.pad = FALSE, align = c("center", "left", "right"), \dots) } \arguments{ \item{x}{ an uni- or multivariate 'timeSeries' object. } \item{k}{ an integer width of the rolling window. Must be odd for \code{rollMedian}. } \item{FUN}{ the function to be rolled. } \item{na.pad}{ a logical flag. Should NA padding be added at beginning? By default \code{FALSE}. } \item{align}{ a character string specifying whether the index of the result should be left- or right-aligned or centered compared to the rolling window of observations. The default choice is set to \code{align="center"}. } \item{\dots}{ optional arguments to be passed. } } \value{ returns an object of class 'timeSeries'. } \details{ The code in the core of the functions \code{rollMean}, \code{rollMin}, \code{rollMax}, and \code{rollMedian} was borrowed from the package \code{zoo} authored by Achim Zeileis, Gabor Grothendieck and Felix Andrews. } \author{ Achim Zeileis, Gabor Grothendieck and Felix Andrews for code from the contributed R package \code{zoo} used in the functions \code{rollMean}, \code{rollMin}, \code{rollMax}, and \code{rollMedian}. } \examples{ ## Use Swiss Pension Fund Data Set of Returns - head(LPP2005REC) SPI <- LPP2005REC[, "SPI"] head(SPI) ## Plot Drawdowns - rmean <- rollMean(SPI, k = 10) plot(rmean) } \keyword{chron} timeSeries/man/methods-comment.Rd0000644000176000001440000000123212407026706016562 0ustar ripleyusers\name{comment} \alias{comment,timeSeries-method} \alias{comment<-,timeSeries-method} \title{comment for timeSeries objects} \description{ Print or assign new comment to a \code{timeSeries} object. } \usage{ \S4method{comment}{timeSeries}(x) \S4method{comment}{timeSeries}(x) <- value } \arguments{ \item{x}{ a \code{timeSeries} object. } \item{value}{ a character string - the comment. } } \examples{ ## Get Description from timeSeries - comment(LPP2005REC) ## Add User to comment - comment(LPP2005REC) <- paste(comment(LPP2005REC), "by User Rmetrics") comment(LPP2005REC) } \keyword{chron} timeSeries/man/timeSeries-slotDocumentation.Rd0000644000176000001440000000411712407027632021305 0ustar ripleyusers\name{attributes} \title{Get and Set Optional Attributes of a 'timeSeries'} \alias{attributes} \alias{documentation} \alias{getAttributes} \alias{setAttributes<-} \description{ Extracts or assigns optional attributes from or to a \code{timeSeries} object. } \usage{ getAttributes(obj) setAttributes(obj) <- value } \arguments{ \item{obj}{ a \code{timeSeries} object whose optional attributes are to be accessed. } \item{value}{ an object, the new value of the attribute, or NULL to remove the attribute. } } \details{ Each \code{timeSeries} object is documented. By default a time series object holds in the documentation slot a string with creation time and the user who has defined it. But this is not all. Optionally the whole creation process and history can be recorded. For this the \code{@documentation} slot may have an optional \code{"Attributes"} element. This attribute is tracked over the whole life time of the object whenever the time series is changed. Whenever you like to be informed about the optional attributes, or you like to recover them you can dot it, and evenmore, whenever you like to add information as an addiitonal attribute you can also do it. The two functions \code{getAttributes} and \code{setAttributes} provide access to and allow to modify the optional attributes of a \code{timeSeries} object. %The replacement form causes the named attribute to take the value %specified (or create a new attribute with the value given). %Optional attributes are attached to the \code{@documentation} slot of the %S4 \code{timeSeries} object. These attributes are preserved during operations %on \code{timeSeries} objects using the internal function \code{.appendList}. } \examples{ ## Create an artificial timeSeries Object - tS <- dummySeries() tS ## Get Optional Attributes - getAttributes(tS) tS@documentation ## Set a new Optional Attribute - setAttributes(tS) <- list(what="A dummy Series") tS getAttributes(tS) tS@documentation } \keyword{programming} timeSeries/man/base-dim.Rd0000644000176000001440000000446112407026706015147 0ustar ripleyusers\name{dimnames} \title{Time Series Columns and Rows} \alias{dim,timeSeries-method} \alias{dim<-,timeSeries-method} \alias{dimnames,timeSeries-method} \alias{dimnames<-,timeSeries,list-method} \alias{colnames<-,timeSeries-method} \alias{colnames,timeSeries-method} \alias{rownames,timeSeries-method} \alias{rownames<-,timeSeries,timeDate-method} \alias{rownames<-,timeSeries,ANY-method} \alias{names,timeSeries-method} \alias{names<-,timeSeries-method} \description{ Handling columns and rows of 'timeSeries' objects. } \details{ \tabular{ll}{ \code{dim} \tab Returns the dimension of a 'timeSeries' object \cr \code{dimnames} \tab Returns the dimension names of a 'timeSeries' object \cr \code{colnames<-} \tab Assigns column names to a 'timeSeries' object \cr \code{rownames<-} \tab Assigns row names to a 'timeSeries' object } } % \usage{ % %\S4method{dim}{timeSeries}(x) % %\S4method{dimnames}{timeSeries}(x) % %\S4method{dimnames}{timeSeries}(x) <- value % dim(x) % dimnames(x) % dimnames(x) <- value % colnames(x) % colnames(x) <- value % rownames(x) % rownames(x) <- value % \method{is.array}{timeSeries}(x) % } %\arguments{ % % \item{value}{ % a valid value for names component of \code{dimnames(x)}. % For a \code{"timeSeries"} object this is either \code{NULL} or a % character vector of length the column dimension. Not, row names % cannot be assigne for a \code{"timeSeries"} object, the function % \code{rownames()} will stop and return an error message. % } % \item{x}{ % an object of class \code{timeSeries}. % } % %} \value{ Returns the dimensions and related numbers of a 'timeSeries' object. } \examples{ ## Load Swiss Pension Fund Benchmark Data - X <- LPP2005REC[1:10, 1:3] ## Get Dimension - dim(X) ## Get Column and Row Names - dimnames(X) ## Get Column / Row Names - colnames(X) rownames(X) ## Try your own DIM - DIM <- function(x) {c(NROW(x), NCOL(x))} DIM(X) DIM(X[, 1]) ## Try length / LENGTH - length(X) length(X[, 1]) LENGTH <- function(X) NROW(X) LENGTH(X) ## Columns / Rows - ncol(X); NCOL(X) nrow(X); NROW(X) ## See also - isUnivariate(X) isMultivariate(X) } \keyword{chron} timeSeries/man/timeSeries-slotUnits.Rd0000644000176000001440000000136712421244605017577 0ustar ripleyusers\name{units} \alias{getUnits} \alias{getUnits.default} \alias{setUnits<-} \title{Get and Set Unit Names of a 'timeSeries'} \description{ Gets and sets the column names of a 'timeSeries' object. The column names are also called units or unit names. } \usage{ getUnits(x) setUnits(x) <- value } \arguments{ \item{x}{ a 'timeSeries' object. } \item{value}{ a \code{vector} of unit names. } } \seealso{timeSeries()} \examples{ ## A Dummy timeSeries Object tS <- dummySeries() tS ## Get the Units - getUnits(tS) ## Assign New Units to the Series - setUnits(tS) <- c("A", "B") head(tS) } \keyword{programming} timeSeries/man/data-examples.Rd0000644000176000001440000000137512347663061016220 0ustar ripleyusers\name{TimeSeriesData} \alias{TimeSeriesData} \alias{LPP2005REC} \alias{MSFT} \alias{USDCHF} \title{Time Series Data Sets} \description{ Three data sets used in example files. The data sets are: \tabular{ll}{ \code{LPP2005REC} \tab Swiss pension fund assets returns benchmark, \cr \code{MSFT} \tab Daily Microsoft OHLC prices and volume, \cr \code{USDCHF} \tab USD CHF intraday foreign exchange xchange rates.} } \examples{ ## Plot LPP2005 Example Data Set - data(LPP2005REC) plot(LPP2005REC, type = "l") ## Plot MSFT Example Data Set - data(MSFT) plot(MSFT[, 1:4], type = "l") plot(MSFT[, 5], type = "h") ## Plot USDCHF Example Data Set - # plot(USDCHF) } \keyword{datasets} timeSeries/man/base-sort.Rd0000644000176000001440000000324012407026706015357 0ustar ripleyusers\name{sort} \alias{sort,timeSeries-method} \alias{sort.timeSeries} \title{Sorting a 'timeSeries' by Time Stamps} \description{ Sorts a 'timeSeries' object with respect to its time stamps. } \details{ Sorts a time series either in increasing or decreasing time stamp order. Internally the function \code{order} from R's base packahe is used. \code{order} generates a permutation which rearranges the time stamps in ascending or descending order. To find out if the series is unsorted, the function \code{is.unsorted} from R's base package can be called. } \usage{ \S4method{sort}{timeSeries}(x, decreasing = FALSE, \dots) } \arguments{ \item{x}{ an uni- or multivariate \code{timeSeries} object. } \item{decreasing}{ a logical flag. Should we sort in increasing or decreasing order? By default FALSE. } \item{\dots}{ optional arguments passed to other methods. } } \value{ Returns a sorted 'timeSeries' object, which can be increasing or decreasing in time. } \examples{ ## Monthly Calendar Series - x <- daily2monthly(LPP2005REC[, 1:2])[3:14, ] ## Resample the Series with respect to the time stamps - resampled <- sample(x) resampled is.unsorted(resampled) ## Now sort the serie in decreasing time order - sorted <- sort(resampled, , decreasing = TRUE) sorted is.unsorted(sorted) ## Is the reverted series ordered? - reverted <- rev(sorted) reverted is.unsorted(reverted) } \keyword{chron} timeSeries/man/timeSeries-readSeries.Rd0000644000176000001440000000402012407026706017652 0ustar ripleyusers\name{readSeries} \title{Reads a 'timeSeries' from a File} \alias{readSeries} \description{ Reads a file in table format and creates a \code{timeSeries} object from it. } \details{ The first column of the table must hold the timestamps. Format of the stimestamps can be either specified in the header of the first column or by the \code{format} argument. } \usage{ readSeries(file, header = TRUE, sep = ";", zone = "", FinCenter = "", format, \dots) } \arguments{ \item{file}{ the filename of a spreadsheet data set from which to import the data records. } \item{FinCenter}{ a character with the the location of the financial center named as "continent/city". } \item{header}{ a logical value indicating whether the file contains the names of the variables as its first line. If missing, the value is determined from the file format: 'header' is set to 'TRUE' if and only if the first row contains one fewer field than the number of columns. } \item{format}{ a character string with the format in POSIX notation specifying the timestamp format. Note, the format has not to be specified if the first column in the file has the timestamp format specifyer, e.g. "\%Y-\%m-\%d" for the short ISO 8601 format. } \item{sep}{ the field seperator used in the spreadsheet file to separate columns. By default ";". Note, if \code{sep=";"} is specified, and reading the series fails, then the reading is automatically repeated with \code{sep=","}. } \item{zone}{ the time zone or financial center where the data were recorded. By default \code{zone=""} which is short for GMT. } \item{\dots}{ Additional arguments passed to \code{read.table()} function which is used to read the file. } } \value{ Returns a S4 object of class \code{timeSeries}. } timeSeries/man/base-rev.Rd0000644000176000001440000000122312407026706015163 0ustar ripleyusers\name{rev} \alias{rev,timeSeries-method} \alias{rev.timeSeries} \title{Reversion of a 'timeSeries'} \description{ Reverses an uni- or multivariate 'timeSeries' object by reversing the order of the time stamps. } \usage{ \S4method{rev}{timeSeries}(x) } \arguments{ \item{x}{ an uni- or multivariate 'timeSeries' object. } } \value{ Returns a reversed 'timeSeries' object. } \examples{ ## Create Dummy timeSeries - tS <- dummySeries() ## Reverse Series - rev(tS) } \keyword{chron} timeSeries/DESCRIPTION0000644000176000001440000000236313612625323014130 0ustar ripleyusersPackage: timeSeries Title: Financial Time Series Objects (Rmetrics) Date: 2020-01-24 Version: 3062.100 Authors@R: c(person("Diethelm", "Wuertz", role="aut", comment = "original code") , person("Tobias", "Setz", role = "cre", email = "tobias.setz@live.com") , person("Yohan", "Chalabi", role = "ctb") , person("Martin","Maechler", role="ctb", email="maechler@stat.math.ethz.ch", comment = c(ORCID = "0000-0002-8685-9910")) ) Description: 'S4' classes and various tools for financial time series: Basic functions such as scaling and sorting, subsetting, mathematical operations and statistical functions. Depends: R (>= 2.10), graphics, grDevices, stats, methods, utils, timeDate (>= 2150.95) Suggests: RUnit, robustbase, xts, PerformanceAnalytics, fTrading LazyData: yes License: GPL (>= 2) URL: https://r-forge.r-project.org/scm/viewvc.php/pkg/timeSeries/?root=rmetrics, http://www.rmetrics.org NeedsCompilation: no Packaged: 2020-01-24 13:51:15 UTC; maechler Author: Diethelm Wuertz [aut] (original code), Tobias Setz [cre], Yohan Chalabi [ctb], Martin Maechler [ctb] () Maintainer: Tobias Setz Repository: CRAN Date/Publication: 2020-01-24 17:35:15 UTC timeSeries/build/0000755000176000001440000000000013612573121013513 5ustar ripleyuserstimeSeries/build/vignette.rds0000644000176000001440000000033013612573121016046 0ustar ripleyusersb```b`fcb`b2 1# '*M N-L-/ +GS! /KWPGUWOJM.)&`\AJ t nC zּTtk]R RR@g;<E T [fN*ސ89 d Bw(,/׃# @?{49'ݣ\)%ziE@ watimeSeries/tests/0000755000176000001440000000000013612573075013566 5ustar ripleyuserstimeSeries/tests/msft.dat.csv0000644000176000001440000003146411023731525016021 0ustar ripleyusers"X.Y..m..d";"Open";"High";"Low";"Close";"Volume" "1";"2000-09-27";63.4375;63.5625;59.8125;60.625;53077800 "2";"2000-09-28";60.8125;61.875;60.625;61.3125;26180200 "3";"2000-09-29";61;61.3125;58.625;60.3125;37026800 "4";"2000-10-02";60.5;60.8125;58.25;59.125;29281200 "5";"2000-10-03";59.5625;59.8125;56.5;56.5625;42687000 "6";"2000-10-04";56.375;56.5625;54.5;55.4375;68226700 "7";"2000-10-05";55.5;57.25;55.25;55.375;40549700 "8";"2000-10-06";55.8125;56.75;54.75;55.5625;30897000 "9";"2000-10-09";55.625;55.75;53;54.1875;29161800 "10";"2000-10-10";53.9375;55.5625;53.8125;54.5625;31033100 "11";"2000-10-11";54;56.9375;54;55.75;50602900 "12";"2000-10-12";56.3125;56.875;53.8125;54.375;45109800 "13";"2000-10-13";53.875;54.875;52.125;53.75;52260600 "14";"2000-10-16";53.5;53.8125;49.5625;50.375;59879500 "15";"2000-10-17";51.875;52.4375;50.25;50.4375;40638300 "16";"2000-10-18";49.625;53.25;48.4375;51.75;55268200 "17";"2000-10-19";58.4375;62.1875;58;61.875;128496600 "18";"2000-10-20";61.3125;66.125;61.125;65.1875;80189300 "19";"2000-10-23";64.625;66.25;60.6875;62.125;92585200 "20";"2000-10-24";62.625;62.9375;60.1875;61.5;47213700 "21";"2000-10-25";61.9375;63.4375;60.4375;61.25;83801900 "22";"2000-10-26";61;65.0625;60.8125;64.4375;57413300 "23";"2000-10-27";64.6875;69.1875;64.625;67.6875;62146200 "24";"2000-10-30";67.5;70.125;67.375;69.0625;55028800 "25";"2000-10-31";69;69.5;68;68.875;52237000 "26";"2000-11-01";68.5;70.0625;68.4375;69.625;40654700 "27";"2000-11-02";70.375;70.8438;69.625;70.3125;38992600 "28";"2000-11-03";69.25;69.625;68.0625;68.25;34355500 "29";"2000-11-06";68.6875;70.125;68.25;69.5;37425700 "30";"2000-11-07";69.75;71.875;69.5;70.5;52165600 "31";"2000-11-08";71.125;72.375;68;69.4375;103074700 "32";"2000-11-09";68.5;71.3125;68.4375;70.875;45529300 "33";"2000-11-10";69.9375;70.3125;66.8125;67.375;46872200 "34";"2000-11-13";66.6875;68.125;64.4062;66.4375;41682400 "35";"2000-11-14";68;69.8125;67.3125;68.8125;42109300 "36";"2000-11-15";69.0625;70.875;68.6875;70.0625;30211100 "37";"2000-11-16";69.4375;71.5;68.9375;68.9375;46064300 "38";"2000-11-17";69.4375;70;67.7969;69.0625;53262800 "39";"2000-11-20";68.125;68.5;65.5625;67.1875;40078600 "40";"2000-11-21";67.375;69.25;67.375;67.75;29743800 "41";"2000-11-22";66.0625;69.5;66;68.25;38171600 "42";"2000-11-24";69;70.4375;68.5;69.9375;17219600 "43";"2000-11-27";71.4375;72.25;70.625;70.6875;42653800 "44";"2000-11-28";69.375;69.75;66.8125;67;63723100 "45";"2000-11-29";66.8125;67.125;63.25;65.0625;49140200 "46";"2000-11-30";62;62.0625;57;57.375;98600400 "47";"2000-12-01";58.0625;60.625;56.0625;56.625;54904900 "48";"2000-12-04";57.25;59;55.1875;56.4375;40203600 "49";"2000-12-05";59.1875;60.5;58.25;59.875;50867200 "50";"2000-12-06";60;60.0625;56.0625;56.6875;45280400 "51";"2000-12-07";53.4375;54;52.25;53.125;72654200 "52";"2000-12-08";54.625;55.875;53.4375;54.4375;60469900 "53";"2000-12-11";55.5;58.75;55;58.0625;47788100 "54";"2000-12-12";57.8125;60;56.75;58.375;31553000 "55";"2000-12-13";60.5;60.5;56.8125;57.25;49180200 "56";"2000-12-14";57.9375;58.7344;55.375;55.5;35600700 "57";"2000-12-15";51.0469;52;47.75;49.1875;58449900 "58";"2000-12-18";49;50;47;47.8125;53593700 "59";"2000-12-19";47.4375;48;44.5;44.8125;60135900 "60";"2000-12-20";42.8125;44;41.375;41.5;74518900 "61";"2000-12-21";40.75;45.125;40.3125;43.4375;81586500 "62";"2000-12-22";44.75;47.125;44.75;46.4375;54775900 "63";"2000-12-26";46.875;48.5625;45.875;46.875;33470800 "64";"2000-12-27";46.125;46.8125;45;46.4375;34501900 "65";"2000-12-28";45.125;46.25;43.875;44.5625;38809600 "66";"2000-12-29";43.9375;45.8125;43;43.375;49988800 "67";"2001-01-02";44.125;45;42.875;43.375;41206600 "68";"2001-01-03";43.1875;48.875;43.125;47.9375;67981100 "69";"2001-01-04";47.8125;50.5;46.875;48.4375;56198500 "70";"2001-01-05";48.5;49.875;47.5625;49.125;46707300 "71";"2001-01-08";48.9375;49.75;46.6875;48.9375;39908800 "72";"2001-01-09";50;52.625;49.75;51.8125;57482700 "73";"2001-01-10";51;53.8125;50.75;52.875;45115100 "74";"2001-01-11";53;55.75;52.3125;55;50927400 "75";"2001-01-12";54.875;55;52.5;53.5;36856000 "76";"2001-01-16";53.375;53.5;51.125;52.5625;34231200 "77";"2001-01-17";53.625;54.875;52.5625;52.9375;36422100 "78";"2001-01-18";53.6875;56.1875;52.625;55.5;54894400 "79";"2001-01-19";60;61.4375;58.875;61;104674400 "80";"2001-01-22";60.75;61;59;60.125;38336500 "81";"2001-01-23";59.75;60.9375;58.9375;60.5625;35147600 "82";"2001-01-24";61;63.4375;60.75;62.9375;55227500 "83";"2001-01-25";62.75;64;61.5625;61.8125;42828700 "84";"2001-01-26";61;64.3125;61;64;46540000 "85";"2001-01-29";63.5625;64.625;63.5;64.5;42491900 "86";"2001-01-30";64.5;64.75;62.875;63.375;28638400 "87";"2001-01-31";63;63.75;61;61.0625;40949400 "88";"2001-02-01";60.8125;62.625;60.375;62.375;35896400 "89";"2001-02-02";62.5;63.375;60.75;60.8125;35550000 "90";"2001-02-05";60.75;62.0625;60.25;61.9375;25699600 "91";"2001-02-06";62.0625;63.8125;61.6875;62.5625;48221000 "92";"2001-02-07";62;65.0625;61.8125;64.6875;63030900 "93";"2001-02-08";63.75;64.5;62;62.25;44020600 "94";"2001-02-09";61.3125;61.5625;58.5;59.125;50287600 "95";"2001-02-12";58.8125;59.4375;57.1875;58.75;35644700 "96";"2001-02-13";59.625;61.0625;58.125;58.1875;38035300 "97";"2001-02-14";57.625;59;56.375;58.375;30864200 "98";"2001-02-15";59;60.1875;57.875;58.8125;32813900 "99";"2001-02-16";57;58.25;56.125;57.3125;33479200 "100";"2001-02-20";57.375;58.25;55.375;55.875;30365400 "101";"2001-02-21";55.25;58.0625;55.1875;56.25;31973600 "102";"2001-02-22";56.3125;56.8125;53.875;55.1875;50408200 "103";"2001-02-23";54.4375;57.5;54.3125;56.75;46310300 "104";"2001-02-26";57.625;59.9375;57.375;59.5625;43968400 "105";"2001-02-27";59.375;61.1875;58.6719;59.375;49574300 "106";"2001-02-28";59.5625;60.0781;58.1875;59;42304200 "107";"2001-03-01";58.5625;59.5;56.25;59.3594;40890800 "108";"2001-03-02";57.5;58.125;56.4375;56.6875;39900400 "109";"2001-03-05";57.25;58.625;56.5625;57.4375;24691800 "110";"2001-03-06";58.625;60;58.375;59.4375;33390900 "111";"2001-03-07";59.875;61.125;59.3125;60.6875;29871800 "112";"2001-03-08";60.3125;60.5938;58.4375;59.25;27313000 "113";"2001-03-09";57.9375;58.1875;54.875;56.6875;51897200 "114";"2001-03-12";54.6875;55;51.625;51.9375;57188000 "115";"2001-03-13";52.1875;54.75;52;54.1875;45517800 "116";"2001-03-14";52.5;55.25;52.1875;54;45343100 "117";"2001-03-15";55.3125;56.0781;53.5;53.6875;35819200 "118";"2001-03-16";52.5;55.125;52.4844;54.5625;56424400 "119";"2001-03-19";54.5;55.5;53.125;54.3125;30518200 "120";"2001-03-20";54.5625;56.125;52.625;52.6875;45911400 "121";"2001-03-21";52.25;53.25;49.75;50.0625;62494300 "122";"2001-03-22";50.5625;54.0625;50.5;54;63181600 "123";"2001-03-23";54.9375;57;54.375;56.5625;49759800 "124";"2001-03-26";57.125;57.5;55.5625;56.0625;31559300 "125";"2001-03-27";56.0625;58.5625;55.875;58.25;47567800 "126";"2001-03-28";57.375;57.9375;55.375;55.5625;39340800 "127";"2001-03-29";55.375;57.1875;54.5625;55.375;43492500 "128";"2001-03-30";55.75;56.1875;53.875;54.6875;45600800 "129";"2001-04-02";54.8125;56.9375;54.625;55.8125;37962000 "130";"2001-04-03";55.3125;55.3125;52.75;53.375;47093800 "131";"2001-04-04";53.375;55;51.0625;51.9375;52023300 "132";"2001-04-05";53.75;57.375;53.5;56.75;56682000 "133";"2001-04-06";56.375;57.1875;55.0625;56.1875;46311000 "134";"2001-04-09";56.57;57.42;55.66;57.15;28147800 "135";"2001-04-10";57.95;60.09;57.78;59.68;54599700 "136";"2001-04-11";60.65;61.5;59.7;60.04;54939800 "137";"2001-04-12";59.56;62.31;59.35;62.18;43760000 "138";"2001-04-16";61.4;61.58;60.12;60.79;32928700 "139";"2001-04-17";60.52;62.11;60.04;61.48;42574600 "140";"2001-04-18";63.39;66.31;63;65.43;78348200 "141";"2001-04-19";65.81;69;65.75;68.04;79687800 "142";"2001-04-20";70.3;71.1;68.5;69;96459800 "143";"2001-04-23";68.11;68.47;66.9;68.25;46085600 "144";"2001-04-24";68.2;69.93;67.14;67.55;44588300 "145";"2001-04-25";67.57;69.79;67.25;69.69;38372000 "146";"2001-04-26";70.07;71;68.25;69.13;59368800 "147";"2001-04-27";69.53;69.68;66.21;67.12;60786200 "148";"2001-04-30";68.53;69.06;67.68;67.75;37184100 "149";"2001-05-01";67.66;70.3;67.6;70.17;41851400 "150";"2001-05-02";71;71.15;69.35;69.76;46432200 "151";"2001-05-03";69.25;70.18;68.14;68.53;33136700 "152";"2001-05-04";68;71.05;67.96;70.75;59769200 "153";"2001-05-07";70.83;72.15;70.7;71.38;54678100 "154";"2001-05-08";71.75;72.1;70.75;72.06;37542000 "155";"2001-05-09";71.24;71.3;69.86;70.4;38338300 "156";"2001-05-10";71.13;71.24;69.96;70;32167300 "157";"2001-05-11";69.96;70;68.65;69.4;25564400 "158";"2001-05-14";69.13;69.2;68.3;68.72;22484000 "159";"2001-05-15";68.74;69.3;68;68.27;30692800 "160";"2001-05-16";67.7;69.88;67.33;69.16;45946900 "161";"2001-05-17";69.1;70.14;67.55;68.17;53492400 "162";"2001-05-18";67.69;69.2;67.25;68.09;45302700 "163";"2001-05-21";68.05;69.99;67.75;68.79;51745800 "164";"2001-05-22";69.45;70.35;69.18;70.31;41727800 "165";"2001-05-23";70.39;71.6;69.51;69.7;46818700 "166";"2001-05-24";69.94;71.78;69.27;71.72;40390800 "167";"2001-05-25";71.66;71.9;70.36;70.91;26373800 "168";"2001-05-29";70.8;71.75;70.05;70.34;35605400 "169";"2001-05-30";69.56;70.58;68.65;69.19;43250900 "170";"2001-05-31";69.49;70.38;68.4;69.18;35341300 "171";"2001-06-01";69.6;70.7;68.7;70.34;28793800 "172";"2001-06-04";70.55;71.02;69.8;70.78;21868300 "173";"2001-06-05";70.76;73.08;70.5;72.6;44727100 "174";"2001-06-06";72.89;73.48;71.55;72.36;40011400 "175";"2001-06-07";72.12;73.73;72.08;73.68;33480000 "176";"2001-06-08";73.7;73.75;72.05;73.19;25933500 "177";"2001-06-11";72.85;72.85;71.51;72.12;23672800 "178";"2001-06-12";71.02;72.41;70.81;72.08;33357300 "179";"2001-06-13";72.05;72.3;70.64;70.69;27651200 "180";"2001-06-14";70.22;70.55;68.4;68.9;35986200 "181";"2001-06-15";67.51;68.3;66.4;68.02;54177200 "182";"2001-06-18";67.95;67.96;66.01;66.88;28423400 "183";"2001-06-19";68.21;68.85;66.85;67.32;31728700 "184";"2001-06-20";67.14;69.59;67.1;69.41;32054200 "185";"2001-06-21";69.15;70.55;68.92;69.84;34801900 "186";"2001-06-22";70;70.61;68.58;68.83;25546000 "187";"2001-06-25";69.1;69.81;67.77;68.85;24607800 "188";"2001-06-26";67.82;70.21;67.7;70.14;31538500 "189";"2001-06-27";69.86;71.53;69.36;71.14;34599900 "190";"2001-06-28";71.55;76.15;70.53;72.74;64487800 "191";"2001-06-29";72.6;73.41;71.4;73;47141900 "192";"2001-07-02";72.05;73.15;70.15;70.6;36405100 "193";"2001-07-03";70.3;70.8;69.93;70.47;14018700 "194";"2001-07-05";70.22;70.72;68.44;68.51;24621300 "195";"2001-07-06";68.3;68.4;65.67;66.06;33733900 "196";"2001-07-09";66.2;66.91;65.04;65.69;33238300 "197";"2001-07-10";65.9;66.25;64.35;64.48;33281300 "198";"2001-07-11";64.21;66.75;64.2;66.5;36911300 "199";"2001-07-12";70.7;72.05;70.33;71.6;64039000 "200";"2001-07-13";71.4;72;70.94;71.34;29467300 "201";"2001-07-16";71.45;72.16;70.15;71.18;27995400 "202";"2001-07-17";70.66;72.01;70.14;71.82;31620500 "203";"2001-07-18";70.6;71.5;69.87;70.57;28795400 "204";"2001-07-19";71.22;73;71.22;72.57;38274700 "205";"2001-07-20";68.03;69.4;67.94;69.18;62101800 "206";"2001-07-23";69.24;69.24;66.35;67.09;39999700 "207";"2001-07-24";67;67.99;65.7;66.32;33765100 "208";"2001-07-25";66.26;67.52;65.61;67.48;37032700 "209";"2001-07-26";67.12;67.32;65.5;66.59;38987000 "210";"2001-07-27";66.05;66.25;65.05;65.47;32698000 "211";"2001-07-30";65.65;66.88;65.54;65.8;21098200 "212";"2001-07-31";66.01;67.39;65.85;66.19;29515800 "213";"2001-08-01";66.8;66.81;65.76;66.47;27839500 "214";"2001-08-02";67.21;67.54;66.26;67.45;27099200 "215";"2001-08-03";67.3;67.36;66;66.89;21630200 "216";"2001-08-06";66.53;67.12;65.68;66.13;13915800 "217";"2001-08-07";66.04;67.05;65.99;66.35;15673900 "218";"2001-08-08";66.51;67.24;64.49;64.86;27498200 "219";"2001-08-09";64.98;65.55;64.3;65.01;22768100 "220";"2001-08-10";64.77;65.86;62.9;65.52;25878200 "221";"2001-08-13";65.24;65.99;64.75;65.83;16337700 "222";"2001-08-14";65.75;66.09;64.45;64.69;18240600 "223";"2001-08-15";64.71;65.05;63.2;63.2;19751500 "224";"2001-08-16";62.84;64.71;62.7;64.62;21952800 "225";"2001-08-17";63.78;64.13;61.5;61.88;26117100 "226";"2001-08-20";61.66;62.75;61.1;62.7;24185600 "227";"2001-08-21";62.7;63.2;60.71;60.78;23555900 "228";"2001-08-22";61.13;61.15;59.08;60.66;39053600 "229";"2001-08-23";60.67;61.53;59;59.12;25906600 "230";"2001-08-24";59.6;62.28;59.23;62.05;31699500 "231";"2001-08-27";61.9;63.36;61.57;62.31;22281400 "232";"2001-08-28";62.34;62.95;60.58;60.74;23711400 "233";"2001-08-29";61.05;61.3;59.54;60.25;24085000 "234";"2001-08-30";59.04;59.66;56.52;56.94;48816000 "235";"2001-08-31";56.85;58.06;56.3;57.05;28950400 "236";"2001-09-04";57.19;59.08;56.07;56.1;33594600 "237";"2001-09-05";56.18;58.39;55.39;57.74;44735300 "238";"2001-09-06";56.56;58.39;55.9;56.02;56178400 "239";"2001-09-07";56.11;57.36;55.31;55.4;44931900 "240";"2001-09-10";54.92;57.95;54.7;57.58;42235900 "241";"2001-09-17";54.02;55.1;52.8;52.91;63751000 "242";"2001-09-18";53.41;55;53.17;54.32;41591300 "243";"2001-09-19";54.46;54.7;50.6;53.87;63475100 "244";"2001-09-20";52.35;52.61;50.67;50.76;58991600 "245";"2001-09-21";47.92;50.6;47.5;49.71;92488300 "246";"2001-09-24";50.65;52.45;49.87;52.01;42790100 "247";"2001-09-25";52.27;53;50.16;51.3;42470300 "248";"2001-09-26";51.51;51.8;49.55;50.27;29262200 "249";"2001-09-27";50.1;50.68;48;49.96;40595600 timeSeries/tests/doRUnit.R0000644000176000001440000000164211023731525015266 0ustar ripleyusers#### doRUnit.R --- Run RUnit tests ####------------------------------------------------------------------------ ### Origianlly follows Gregor Gojanc's example in CRAN package 'gdata' ### and the corresponding section in the R Wiki: ### http://wiki.r-project.org/rwiki/doku.php?id=developers:runit ### MM: Vastly changed: This should also be "runnable" for *installed* ## package which has no ./tests/ ## ----> put the bulk of the code e.g. in ../inst/unitTests/runTests.R : if(require("RUnit", quietly = TRUE)) { ## --- Setup --- wd <- getwd() pkg <- sub("\\.Rcheck$", '', basename(dirname(wd))) library(package = pkg, character.only=TRUE) path <- system.file("unitTests", package = pkg) stopifnot(file.exists(path), file.info(path.expand(path))$isdir) source(file.path(path, "runTests.R"), echo = TRUE) } ################################################################################ timeSeries/vignettes/0000755000176000001440000000000013612573121014424 5ustar ripleyuserstimeSeries/vignettes/colorPalettes2Fig.pdf0000644000176000001440000010337312407026777020471 0ustar ripleyusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20140430203415) /ModDate (D:20140430203415) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 30481 /Filter /FlateDecode >> stream xK&;v$"䂥x?HC1fD6 NwTGS&%ӿ򋬌 vfU&w޿_o{6.qz[o6oOo_Ͽߺ{ßݷ-K!k_´uoO/}e6{_ۑ㞆Psn߆ a+}ǰ_ mosҰp04[㘆㷉_i8}XkP?i?޶o2L.e7_O`K\/QOݑeQr)p1LO@ٞF1m 6FBždltCs_f_\p46;' eX>l,/.EIPYpP(ydlL{6q?/\X1 s4,İcb gq6C,@C) xaW`ąo(,eqK8)CIPP2,0Hm䚇+1Ya* 6ϕ~a# [(6ϿbXLѧ_}SwpC~v=nS&hmD)VB0nC*ym|ǭގ4n!roz e\7yTNU3SeXy8yW&NJ^8yV6NOUCei+''rgHWĢ'*;!0=4u\~3Gb悘if(R\~*+JrC6-Kt,'ҵTNwӧg4>2x >Q뽲x^ &DSeՈ,@y. f2-oh2s*%=JhG* E2}wߧ.l~s,a"2}R/ CZ}2"!Bl@LՈs1۔;R3y~SͰyeE)V( =W.P Y²V9A=@h5>@q =&k}!;G3t08_{B*܊{Av.&j|<*cRGȿce i{MqJ㱮ROU,C?}!.@X&tB. _ .|+w.-_B\[|9|㋼ |  ~JkE0~O_ojiXajKb^ˏQ᎓}#pc}ec f-]}|\&NeypF9 $p y]Yy<33=w`fǹ };i2zi$x f\0M0~#05NϽ򸯬!|5¨cA5ik s<*+kHEj[`eer̤s;.aXq⸝4C앙Cef G C&"5t SǫUwRA_NoJDjͬafxK!I?aWyz֦~7fbNdV/7'l(㡶vdg\Y;,rYwk;+/FmgmgXY;sWY7v\kmgRYy\Y1ũw/Lps?f`e-a3G̱`dhlq4@4H4P4X`hp x HψuSDS|?3GV3`]LA;o4Ik^ZjAܖx:]ץPKjM\x@]7P%YkdZhZ&kNZkŖOkSܝBmN;|6yZW0@4ݠ7sx3Z'OiKԖ9-rZ[伶$ȉmY3 AmKܖ 9-rz[.ˆLSl;!|j]T:&8޴һVkPzX#c;[F{ЛлF ơgG z z1^׺|uv`C$"ZT, E1Hņު R*VA$b1!D(!1Dʸ BCQ/DESg hbnѴxHmkP=5?C+p?܂A&Tlx0 M6@[t;tи%AS܃x),OZ6/5,/o9qLu५GYgqmTy[yOuzZaz}yU Q<*ok8.k,Sӕ]m=zU~wcƺ+o f .wheU֘4uKYZ~ Bzx~KZKjsRy[yW֘6W1bofq tm] .xmj(n瘾׀oQzװm5V*jsmeҸ}}%7Ji4kokkZ2?P{['y[_slnh(\jo+ڻ:okٝxŏ׏__mm~si\R;l|rND6\94L=ipko frVg7L3y|*a?/m}jF:}OЯy gw|,]6bΓmfYK>afg]_y[__g%̔u$rnL=G̱`dhlqt@tHtPtX`hp x JψSDW|?3o)Ϡլ73mN%m3P Bx]rjI y]r!jUȉGȍu!G\Zr&jiȝ![s>Mջ+jÇjәuoʵ4sx3N?8gN8o[3 Am_ܾ 9}rz.ˆS>8w>CۺS{3M9`c^0Pc7}T{xiyEyPcuKG;]=:>+o6kgRy[y9 wh1~wM̠^╷u 3pB˓Nz4sx KG DD E J @tꁙ0sm]̊S:e޵τ^䶕OJC-nvy%!քhBԪQBnD 90Jʐ3QKCD 984!jwCۺksK/gBrg ]2tp7g _ Q˗'9| p=|Uw!Fmq* p|8uI+T^Ci5=5G%J5F@oA]Ai5лF >^;0^i̠>fD^ITN!̛9E2o\ (XPs1HbCň"E@3.v] )2XRt1HbKBCQʼnʼnީu4j܌i'nH5ެmY'|RftjM0+`L7¬nY rs|^-=0 {0 {SVޞwm̹/k`y! aCF 3tlڰAfڰfڰf ۰1sZ04ܙqأR2&nT C7G̍#3@7NPOȅCx87 }lClg] u>_% d[W籱E LݡDqƼ4,Gr f5Û jsG❍qg'R!"!KN=FOa)ՎɕiXTLZHLyygG(dAoZ @XԝfEN$ j&/c\ A_;6Nd fͅ Mb=0zvZXL;-0.[;?36KxN 50-dwi+k4i~H};qy7T;E^C{ ];-00ZPad@kq!ðQFe }o0Z` ` 5;<]FQ-x~׆`xm׌fPymW!` TDfè{SNU6҅o RYpo0^5O׏K6ʍ^ x f<̥\Dn(iOa:D 8LrnWD/yrP3 !j:'q0 Z;H%҇03Dtz_{l<耨'h_9IQd}M˩Ď!ie+#X^`A;Q P7C%ɷ||\y 1!$ ~"~lay# w_r>!5SwhCN~:Yͱgb>#C|`2wUHv)1YYu]"4RUGKiV=[QnCIEK.ʚL7ה,a5% F9>e孈z|"0@;ELy 5e~"wEMR?O֦ȂHqɄ9{ N 0)nvEw*\4Phj<6!הN7CLݡӎыK {i *lx$Âe F[f.xI?7 az ype@T~.C#ԕ_SunNMJ{=+UYTTEP)SDMՋj:U>wTN /_O_<8r/]p⶙Ci=բE)uBRL.I]T;x[I%ޱ"ԍ-pR5R5l$8;ø0ع|u/DS05S1%S255S3ES45US5eS6 u@r@+ůksv\@N;])PҖ GY c ?npDj OpEr _fpFIz opG ^pHɉ P1 S0VjL_<sqH@PTJP̮UJ`HViJpįW9JAXJYJ9!y&JWbk5bz\@Lkܑ<eϰySBLi 2+̔g#)FS HaL6)%L6bm3ڟ`0ڈa*a*#t1Zi^;ڽ3ݻ<]*xW&ɻ0UIRLwc]{<*C~v\e{_0yUV%&ϟDF.Pf)P+yLf&j_d0Y3MSWQeTxv3q4"b&q-!br̷C7]ѕ=,)[va^^!v^A6^aF@߿W6F^S/JBpi H'D9b 1mbN<+̷\݊Dmƣ]\vykT%ͩHS*$OUJdCU9U%IJT̳P%W%)J$PU:qtj?o1ƋIJӔ/&*_LUN1]b²ĔH&-BL[,1u9 b2HYOWo0<|+ IJrԍ [@7bd7fl6BmAƍ0vF y#ݾL5ZOՄvF gԕl/m7J^)yd2@Ie%9٠*C\(Qtd2HIe(%IYJJx.K-Kμ m uusE5ۛR7Wo.K_\|qe%ĵ[ך7K'0O,O3V!+ oae{X?wibqC _>#LJ&%<&hn=8͉8g,(($)ޯAS&*|L m>7?J4!̧@hֶL4]L4;q`Y3wr4sx8jGEڌ*nF|7}Q>ΨDZsF1JTTJE9JTԣNEAJUT$WAtO3: 3W>TXl\fgJWd~ePfleFPleʆPfl ePleQfleFQlaDF 0U2Z[[1'N% ,;>opvr1ck 1f?#̆6m1[i2fv1lk}>,hcYcY'^%̔;,[?ٰ˙̀w`Fk 3]kZ z*fԻ1޵6vo3kn3kE*Y;0s޵&eΟYLkgrԴãWۑck;kg;k_F Ccmgmgxve;k YivsClgxOKy/N#@Y s?>󳼔-wh9V5P5R5T5V. I'FCn1ĠEb"1lπE ~FcM=16OaѺ7uNxGf;rkműk/KkKkD2iu"U UVJT-֩Z+-TXrym)֦V;|6xZ>-o1sx3J/)K@T8,qZY⼲$ĉeY3;Z8,qrY&Te#29, q֢xZW03i>u7ZMcѻ7w6[#콍!{wc16`S;g {mcØA}k]PN4-S3E0oɼSDs1bAń"U#|.V](QDt1bI)RZ2EsB#Qʼn޳Iޙu4}鶇R4xXmzsOW>~_t 9 Z?&@7o ЭSt3R?d@7D4nk=;ter~ڇ-ƕ}nRƗ4eVF:eeVƘ:meWF:ueWƙ:}eI PF`<`+%AkR&%BmR*&5HfutfWY3뮤3ݺݭv JqS9JS=JSA%J1TE-JqT]bXebce!uB_7)f(Qቭrݺg9pߡ5sgh*' ytbjNTmP|jF:}'~D؆}bl A|,_X0 3޳ rg5>Sr+w1ꃵꓵFꣵ공Å._#cAĨub:1nH :njzb̉u3kaP޶X ^n{9 vXK-@Ԛx Ȃ!kE2 u$Y -XVZd-ZkAXymwQZtn]̌rox9Ü>9rN;vY,y 3ANl炜 r>Ĺ匈9g"N/Eu΁TNCݺ_mosx79Fk6o!zXM?ս0/M7CN%{{?c߯\R#F&}Fߘd,fk[W@m(?u;E0JRDXp,D:?>+UoRSb&PN"DFK*)Ul%bz*N-NܭK)TN i&.(5^RjX|Rbrp ݲ@l7OnYݎ1X}|=x="t/>v~E5iܪRԥ)LR)+ELRi+LRԩ+LR+MJRҤ(EMJR֤4(MJRڤT(jSJ5SgTgٗSf'l3CrmIxR7(MqRW8:qRw(OqR(PqR(QqR$(RqR4(SqRDi=f(Q񉭂鬜r`FVyB5S[ET[UU[eV[u"Y[̅3X;'̕Y;/ĈݭwQN-洶NWcF9'%*xqwɞc9 Z/{5d~ט#jj1hc Nc0q[3}FyБJ<1<wfn-w[iI$s}ҁ9> x`OR0g'-C̩I $s}#-T\o5$inTsxqW[9%vܭ<+w+kYiXk>Yk>Zk>[k>\PN'cAĨub:1nX :Ōzb̉uo*XY{;r9<[p^oAk= ~5Y,VYPd-ZgAЂ%kMR DY:& MTm:q`f)g-wȹ판9*g 1bwG8pT<āܭ+KZq.z;{Әc^^#^C^c{kcw䨡77ػQ0a\ځ>>gk3 zSw hp g߿qd"6sd%HdSb"NF"D>+*f U$"JdTb*RV"9$Q$QݺӔc2zbR*֋uJ+/*7@VnXb dv#ȪVu +1oݒ`ϲ`?nT{wxߖ/ž[?i)c~Zr@Y0yDa$#Z-w&g؈ep0Uy3-moiȆ/N~PrsL+1tC,_\BpW) o)]<D o5@D[W.籱%1\CŴ"!1#(|C<aQ`yo#Y2q.wn@?roa> *ܹʒ_EDzBڐ}]._. !}a`<+݈e-oF3uY CKlh s;ys/&FLlN"KDa@;k_b^ 6A ;b}<,bqp 0 Ȕ?Hq)2̔•<6p| M`sLlyi/!б(%":iԆ $Zf6m"0F፰}YYlG(gK[ xxofhyow!@,B\Di{0.Oi8UkXQbtXz)To RYf3 {d?ZSaW.Ӆ2آ, 5#s)) [<3 Li _©dM栗8?ht(}PLk ޡ&i0#tz( QN囋%Q.v_IP\]WOyO9,JFʒ%Hʂ&JrO7!QtR $u6u&3Ds[mfx\.O`#\lL$/F_Fz؂Ԕ[fmi]O'a3wކV? B2,QDc:]qU"4RrRmx.(EsQ$jJ~g2.#쿸䷥^Chgꚩ;D>h^%H`>0EhMA Ӑ]|"t!.hmw$ "%q[<1; #.NP\4}_@F J{Nh3u@O,CO;G/ ZK/O/U``K+ flB҂(mm&t`+l}aypEl_~R#SW~MI95)TT gNPRCL:U6U/jpmTTߩ.R;%TT(~=YT(~%tu.0Ɵw)bE(HQ -H[B&erO"E])RxOR,inls\llyf_["TVWoo?ۋ<ݛ}MHgpAiytd/bF;Nf!eƘUfeF]ffƙ{effF;mfgƚtfgF|fY`ƛfUd晛hf}E3Z%dy:u_fZbP-ZbС1!Z;cP5)ZycТ91ZcPe=9ZcУEAAZ3dP%EIZ}܍$`4Fd s1q=nAbt ҁ0$N)'H#: = с$D?&DBW1WOܕ){ RcG{H}*TH*T2G*TRH*TrH*؏R=$hWC;јatfBv솽얍vFm#ݸnd7o7T ڈaw,b]9SW̮w<;L3%/oļS2s2AeˌP!Jz.S\( Q2t2Ie,% %<%Jxϖ%Jxg~t7VKR7פno.J]\,}s]̕;Kӗ0זo!..__k."/!Cܗ>ܗ>OXR>m5걲>~Eﮚ ux|ON"0,V"P,]"p: 67rŲ:gxW>Ӫ18o8@88̊@7? 8k8 y}ٹ.YW0ȷxhA4t`Oc'v쥫_:yiPd{tQ  QK)Q:޿UBd}2DGxW~־VڡyJ~־ҜDGmBõg8reVwhe<ԎVը4kGkgGk_Frxڠ4kGkGoGk/ooqÎVp=Є=Z~ v&0]+K>S^Y'd6sxO'ܧ#!Ęub:1j@[g:?#1㾞i0sbj}3?9rzq2Z;S%4Z[SE6Z%9QLrjHBɕ3UK%wJU-|^|M'֕}f- ;w9<SJ+ N*@U8\q^r-ęHN-C[8\qv*r]ZX.8pR<ŁO+ʥ &|[$gKi1zX^#^C^c{kc1cn 7Fqj P[`am̰~3Ϭo85xXfN̛=E4l.\L(ҹ^U1bEŌ"EDC.!}"o'S<'4\(=[$ꝙ[TgwBi s!:|.^υPDυ1f>B8|\ s!z֏eυp6F֙mi6A3#LIwG|a+ag>%<3e v MxWg kSU>J>}gx lV^cϖmgECH]0 3C9^[x^yPܮXg9%̔npos5mzXCƱƛ{kaDdo)ٻJ~ג6W1Lj zm?:^Y̨>m͆~ǡv`~"_c){Yt~Vfȧb%PL"DDC*!UL%RJ<'4T$=[$\vpş)b4RƋUJ딚/V*_Unþn^\rĚFU˭붛AVn+Vߺ%brer~ :\o.}htjcݶ7Sܰ1%M1S43eM5St3M9Sܴ3M=S3%͢S,0e͢S,:0͢S,Z0-!UPeꙛ|}+쫠Գ3qM,醚8Bo+88Cw;8DK88E[8Fk88G{8H88c,23$źiat!5.䦆х\0FrYBnk]u UDJ.ƆI\0Q;& riÄ!Flt s\BwWcF9'F@z\f+S 9ͱw5Fs`UNbҁ1O)vȯ #:0 }yUbUɋ~3̋>1.aP88Ԁ88848T8te >m >uC, c:TSa.}@.õgFץڄ#;%)qôh(2ƵÚTKetqW]cZJ2x<++^]e*+pق">|setT^[T۵I?P];wFcfP/躄rb;k9VK5Pˬ5RK5t5vKN e'FCn1KĠ%bԒ1lɁ$π% ~F b->1ӶOa΁t ޶X^n{9kwXKXd-vZem#kIBk6YK}Ze-}Z%6ZSkSPv))ms$ '@j6ymR gANm& 9M2Ym#6N9p$eS躴ϔX8m}.1]mF}썽읍{XConw7aj¸}-|ϰ6fk?gFץƩlqC"6sd%HdSb"NF"D>+*f U$"JdTb*RV"9$Q$Q ަHmk/V)^SjX~Vbr z&mk!V-BnYݎ>X}|=x=+3F]%-?&ynsKm7؂~Ы!CzHX2pg[xD>qo{ZD#Ý!qiHKI(H7EPsPާ9erW0sC|_Hy{eg}Cy+aDSvYj`bQ͘E}Cpcx ֱOt@>a 5Ab`y %&˯Qĸ+H9M}SwhC^vޑvl|YyC [ A(ˢQ,ng5 PN(Oix-Ҷz@eq (g5MkJA~W6籱C/SI"rMQ!Q\{!yH E>yi.kᰛ!UJsa.ü a(ýi ed/'hylEHpie=ui/c,Ji-cJ {hZ  ^ af D+m6ن lO zGFk\%K3[?w 8iGvsjRXPRڥ*B-L5J*u4'l^TۨЩQS]wJ8(~PzPZ΅R';$9Qѣ\-H1[$R($pL䢟EN)RJUZQt5]b6 wa(=Lr=|2QddmI @lL6] 2qd@m!2N-2+#E2Z(+f*cBi1a뉗u3H; u`;SckX#8"Ukhc)S!LcL6Rm2fʵ1 %} S SOܬK|CDVsWx3Hsi# >jV M>j !!jQ˷UHZuw*Y;pY;/S7Ts>tMH61Ϻ|鰙ã` 4kCkgC+?,SZiֆiІVOmhmh10v-Z;.aJ6*>(Z-Z~6/0;Z (/;k M 'ܦ#n!Ęeb21j@[g2?#R1㶞i0si]3Yj1{6VX |_XK|cWX|gJjjF:R+U+fJTZ,6kS>UN\++m|F8D}rJ6ImT @kSئ9M rj6EmT!":6)ȁ3)g֥T^]}-Z5Dok90:0;0<06кF Ʃ3@m}v`ӘA}l]h߼#,Dv`)yb@ł" E:x.F\(Q$tbHŒ"SdFEgD3oI-dć p1bxO)[ȸwkdؖas:)2NqW[/0LML3wfQ-qO 'Ƭ Qİub:?)tL?w fXAy>c-{7X ,رVXc-QkA@m`ZeÂ#kIB 4YK-xZe-|^m@ԦV@|6[r8Xt&gN?8g8tN8o8\3 Amg 9rz;/ˆܭSN8wNCݺm.yWdwi5ǥw֠PjJ[!4XM?U1;^DoQV%zxt m ¤vw2-3Icu 4[9?oh)E0J̏RD Yp,D:?@KRSb&PN"DFK*)Ul%bz*N-Nܭ+Aay,F#]QjXzNbRZ8[VO앻%AYnX nbr;冈շnGX܃gY܃zpEݭoҏФI1c_T{sI[w< 0m so 1 so 2 *so 3 :so?uxԬ0h¤^vЇM0BBYXgw>Ͼ >;`/o0%fsx( 11 2Q"12$Q2&q2(#2Q2tA¢5E&,~)~9f:kK)d}чR-:4Ob4.Fb.Fb4.Fb.FF8aw1:^ e0z^ i0P~;(~\[1( ft-~#=nj`0kg!#ƌ6 US!FLc6Qm2fĵ1 "}FёU1 f2\vz;lllʛ:(88۱~ƕt$zDY D?\Mw] .^7`ãST~Wߕ]w[3Zi>gkfk?ڧ~%wxXf.LD4l*TL$ҩHS1ȧb%PL"DDC*!UL%RJ<'4T$=[$]W@sNa]QjXzNbRZ-땛 V,AYnX nbr;冈շnGX܃gY܃ƹ\|fߋ4ܙ{ J?z2RWf e@+Vg/F]>:09$ߛ4sU\~|~zX ,~Y \~!ydחz>Lܡšd<Ɓ샩q͙{_qkP` F"` ϖyD 9 d0rXPqEd氂1sXQ#P/u 2p,n^ZWFF_nN]~Al&Pd@@a2u;ZQv,yUsTt#oJITdgiPAp{o:޾ޞ_SgvtU']ʟ}ԅ\OP)6Y]Au=װ_h K-qQ N Gx)o*.kF^@P5iYڶ)n~!L&i4OfiDo.4SnL8ճlq U&nـQq(ih:kfOFR2e/Ov[m'Ovi;" h:H  zY .X D,x\h=tg5k>ƩXd=kPB"Ҿ H{6%PCRfAKjj 0dITA~;TM=X M%<_>͗zJ"\ЉE "Qa,GuZ ڵ!mGTtY~%5k; Vz}GTZH兩TP卩?UW啩UY<3䝩7VZg奩Vo孩/WvIQ~YUej{_5F.{<^ӕh(RPj"%F)ppJ%uHC)]<HDdLHEl\HFitlHG)||HH /ˆD hHl/d#y 7-RSRKGT"TROz+URS+UURW+UR[+UrR_+VfRc(UVV!^*)^)xaOy/FW\;gׇ^?2{}ggㇹs?'s_R̭6kœg9Ϗ1'$\;K3׽3;۽3Lw}a]j~ꫵjʅ5zzK-'E@`@JN 5"ᐶsuJ?*TBxC;d3nԸKpcYǪ!EE:kD>$)XYФIXd9j)It7*ViӪW*8 }Ȭ.]dWlq79E"+,M׾+cIYdq&&|Yg>,4eVekmf}٩)F8KWif+g;53x8sΌ1hF4#}>cHBڌ4nFJT$CE&JZTGE.JT$WADf31Wd |jÌlgpru%J|Wy%JWr}%JW%x/jzfB 䋒I'%mJ'@*{TVa'˖ iA-K$\9AF)@Bz <B^  YM0cnK3_S W[)_8zcтXw4ЗhۍRt0~#Zd@|5]_T'xf7n(^!yӇ^9j 8hu.E\AtN۶}*9Bmࣜfo^O!W!^94t_:+}c/S:<,- .ӣ*>,OB 5V 2<%G*%ݴu;é<Ĵ-}M F)JmԨ* K*`K(+Kh+૯rR@XT8<ժF_c@&@e`&F^lzVWx3nh3r"Ռ8wK@3s$)Obr$)Obr$)Pbr%)GPbr%*O 1/10$BusFI1 VrX|e9]@ B}wlgpbܧb_#~q~q~"q~Aq~`q~q2$*Bq24*Cq2DYN/xR?-x@j0r5cAzǃ  +c*e`Wgˉƶzlˉȶlˉʶ(>rb(-'6rb-'>1 AG bJRw;m91ܖm91ܖm91:ݖxGoJ[Nnhw`f07?1ZG(UII'L>6[TfrPDZ6pۇxGq_X4^76 ]oeWu ϳ !3ifBwO[NC3y> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000030846 00000 n 0000030929 00000 n 0000031052 00000 n 0000031085 00000 n 0000000212 00000 n 0000000292 00000 n 0000033780 00000 n 0000034037 00000 n 0000034134 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 34236 %%EOF timeSeries/vignettes/symbolTableFig.pdf0000644000176000001440000001670512407026777020046 0ustar ripleyusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20140417140611) /ModDate (D:20140417140611) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 3433 /Filter /FlateDecode >> stream x\i6~W36vBihZHӄ^_Gg|ӤR4|G>HW˃ӍՋ+OyӓZR |zuZOr FܺޕW˕^] ywy|oy'˵ܾ'Y6c(anx̣3Q+x2| ʧ=+gLn2zܨOޥ#vmJ ;Vlh=Z*$W1Z<):bю2FcU{/0]UV4N0/.1 DCr*qaLjCUQ5jA" !b20Eo6 swT%dd v X`kh; Q]" nbuU *,%-5ɮ=(} F2*Sߺ*$;`.6/X K#T7d S%J +l č%b˷d G>اq+ѦZ\HMgkVҔѨTCL=٦$0s0J"M+HHnD}G~ˎI&+D3+"/- 4Q!d &\hfգBLkx\$H̪GHn@ͬzq]m "_u'"yo/ 4R!2S⬶l!C D2fV[*D wd 7 TZ4|W"y+.,7d  F\ߗHfʨK޶<d 9hos?̼Pju)G2[uλڂWe ҊPg[C_hVh[CX"Yy;.9Я@G+.6[ke weR2i] K"@$%}e2iu i0d .&ܬm76ןf(ݬ8KԻ\"}7-OtwmySb2Pj+k[2Ymtm_@$ft --Ym)}y7d Ym)\L6;2ijKmhZ)xyV[b^Lї}!PiվR"}?.KCJ"}?.:U_p)]d4_J D2^@]/ߍoD 2Ŕ_@$/ڿ'~V[2iy)Ӣ}ye b1,c*ôh7j'~'#҂oCHKaZ^J-] Eo@ZǙ1 DraZ^LZ;"iI?L *H-40mO̖AMK;t]dAM *,k{2iQԤz6ץ" ~:2ߗHnԤhbFfAM*LM| >IIm,7HԤƴz$)?IA6>HΤ Fdt&ytWc|s@[,3A˨cl?1L x`|"o.i1\`|*m+i}ElS1Lڙ/)/2b֙f_ Fu&J8Sl_1Lk F2:0I".t&a$83%C")?΄ZK"#*Ql~Wt$D=0YA1j~lgUFm;=`}п3k޿3ܿs3ۿ3y `a:lm fNFwhӺ"7 `Z=ʰK~FV@2cQݠ2Q60Q160(øo r2fa'XL:3i1lo VY7+<~`M?j0`5|Orevan` ւ)&X ja,#2-#2"2|QPQ00FvFr>(XGe-2Gvx;( eqa쵰O|}um,׵`[05r~|~ f9>?߂Yo,`c|~ q>`k0c|~ f9>|>`[0->?߂i-r~|~ q>k VYol?߂Yo,`i>r >endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 10 0 R /F2 11 0 R /F3 12 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj xref 0 13 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000003797 00000 n 0000003880 00000 n 0000004015 00000 n 0000004048 00000 n 0000000212 00000 n 0000000292 00000 n 0000006743 00000 n 0000007000 00000 n 0000007084 00000 n 0000007181 00000 n trailer << /Size 13 /Info 1 0 R /Root 2 0 R >> startxref 7283 %%EOF timeSeries/vignettes/characterTableFig.pdf0000644000176000001440000007333012407026777020472 0ustar ripleyusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20090325151403) /ModDate (D:20090325151403) /Title (R Graphics Output) /Producer (R 2.8.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 5 0 obj << /Type /Page /Parent 3 0 R /Contents 6 0 R /Resources 4 0 R >> endobj 6 0 obj << /Length 7 0 R >> stream q Q q BT 0.000 0.000 0.000 rg /F3 1 Tf 14.00 0.00 -0.00 14.00 172.98 397.45 Tm (Table of Characters) Tj ET Q q 73.44 73.44 328.32 299.52 re W n BT 0.000 0.000 0.000 rg /F6 1 Tf 8.00 0.00 -0.00 8.00 122.60 342.74 Tm ( ) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.60 342.74 Tm ( ) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 340.12 Tm (!) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 340.12 Tm (!) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.75 339.92 Tm (") Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.75 339.92 Tm (") Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.60 340.11 Tm (#) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.60 340.11 Tm (#) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 339.91 Tm ($) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 339.91 Tm ($) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.27 340.26 Tm (%) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.27 340.26 Tm (%) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.49 340.17 Tm (&) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.49 340.17 Tm (&) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.84 340.81 Tm (') Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.84 340.81 Tm (') Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.27 331.25 Tm (\() Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.27 331.25 Tm (\() Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 331.25 Tm (\)) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 331.25 Tm (\)) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.60 330.44 Tm (*) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.60 330.44 Tm (*) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 331.05 Tm (+) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 331.05 Tm (+) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.60 333.37 Tm (,) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.60 333.37 Tm (,) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.40 331.09 Tm (-) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.40 331.09 Tm (-) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.60 332.87 Tm (.) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.60 332.87 Tm (.) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.49 330.67 Tm (/) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.49 330.67 Tm (/) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 320.93 Tm (0) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 320.93 Tm (0) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.60 320.92 Tm (1) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.60 320.92 Tm (1) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.60 320.87 Tm (2) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.60 320.87 Tm (2) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.60 320.93 Tm (3) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.60 320.93 Tm (3) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.60 320.87 Tm (4) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.60 320.87 Tm (4) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.60 320.91 Tm (5) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.60 320.91 Tm (5) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.60 320.93 Tm (6) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.60 320.93 Tm (6) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.60 320.99 Tm (7) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.60 320.99 Tm (7) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 311.37 Tm (8) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 311.37 Tm (8) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.60 311.38 Tm (9) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.60 311.38 Tm (9) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.49 312.28 Tm (:) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.49 312.28 Tm (:) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.49 312.82 Tm (;) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.49 312.82 Tm (;) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 311.96 Tm (<) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 311.96 Tm (<) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.40 311.93 Tm (=) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.40 311.93 Tm (=) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 311.96 Tm (>) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 311.96 Tm (>) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.82 311.37 Tm (?) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.82 311.37 Tm (?) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 302.59 Tm (@) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 302.59 Tm (@) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.71 301.80 Tm (A) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.71 301.80 Tm (A) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.93 301.80 Tm (B) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.93 301.80 Tm (B) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.71 301.80 Tm (C) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.71 301.80 Tm (C) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.15 301.74 Tm (D) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.15 301.74 Tm (D) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.16 301.80 Tm (E) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.16 301.80 Tm (E) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.55 301.80 Tm (F) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.55 301.80 Tm (F) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 301.80 Tm (G) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 301.80 Tm (G) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.71 292.23 Tm (H) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.71 292.23 Tm (H) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 292.23 Tm (I) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 292.23 Tm (I) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.08 292.24 Tm (J) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.08 292.24 Tm (J) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.71 292.23 Tm (K) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.71 292.23 Tm (K) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.86 292.17 Tm (L) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.86 292.17 Tm (L) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.04 292.23 Tm (M) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.04 292.23 Tm (M) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.71 292.26 Tm (N) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.71 292.26 Tm (N) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.71 292.25 Tm (O) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.71 292.25 Tm (O) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 282.67 Tm (P) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 282.67 Tm (P) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.64 282.69 Tm (Q) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.64 282.69 Tm (Q) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.38 282.67 Tm (R) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.38 282.67 Tm (R) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.23 282.67 Tm (S) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.23 282.67 Tm (S) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.16 282.67 Tm (T) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.16 282.67 Tm (T) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.84 282.67 Tm (U) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.84 282.67 Tm (U) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.84 284.29 Tm (V) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.84 284.29 Tm (V) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.53 282.61 Tm (W) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.53 282.61 Tm (W) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.02 273.11 Tm (X) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.02 273.11 Tm (X) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.42 273.06 Tm (Y) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.42 273.06 Tm (Y) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.16 273.11 Tm (Z) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.16 273.11 Tm (Z) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.27 273.72 Tm ([) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.27 273.72 Tm ([) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.15 273.85 Tm (\\) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.15 273.85 Tm (\\) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 312.27 273.72 Tm (]) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 312.27 273.72 Tm (]) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.97 273.10 Tm (^) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.97 273.10 Tm (^) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.60 276.60 Tm (_) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.60 276.60 Tm (_) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 259.04 Tm (`) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 259.04 Tm (`) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.08 264.31 Tm (a) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.08 264.31 Tm (a) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 264.16 Tm (b) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 264.16 Tm (b) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 265.16 Tm (c) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 265.16 Tm (c) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 263.35 Tm (d) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 263.35 Tm (d) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.84 264.30 Tm (e) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.84 264.30 Tm (e) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.52 264.44 Tm (f) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.52 264.44 Tm (f) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.96 265.14 Tm (g) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.96 265.14 Tm (g) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.19 255.42 Tm (h) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.19 255.42 Tm (h) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 254.73 Tm (i) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 254.73 Tm (i) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.19 255.57 Tm (j) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.19 255.57 Tm (j) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 254.67 Tm (k) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 254.67 Tm (k) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 253.78 Tm (l) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 253.78 Tm (l) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.30 255.56 Tm (m) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.30 255.56 Tm (m) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.52 254.71 Tm (n) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.52 254.71 Tm (n) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.40 254.75 Tm (o) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.40 254.75 Tm (o) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 245.24 Tm (p) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 245.24 Tm (p) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.52 244.42 Tm (q) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.52 244.42 Tm (q) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 246.03 Tm (r) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 246.03 Tm (r) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.19 245.19 Tm (s) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.19 245.19 Tm (s) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.84 245.18 Tm (t) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.84 245.18 Tm (t) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.30 245.15 Tm (u) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.30 245.15 Tm (u) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.75 244.85 Tm (v) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.75 244.85 Tm (v) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.86 245.18 Tm (w) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.86 245.18 Tm (w) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.63 235.38 Tm (x) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.63 235.38 Tm (x) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.86 236.46 Tm (y) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.86 236.46 Tm (y) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.62 235.42 Tm (z) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.62 235.42 Tm (z) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.68 235.58 Tm ({) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.68 235.58 Tm ({) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.80 235.89 Tm (|) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.80 235.89 Tm (|) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.68 235.58 Tm (}) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.68 235.58 Tm (}) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 235.50 Tm (~) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 235.50 Tm (~) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 237.54 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 237.54 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.60 187.04 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.60 187.04 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.12 186.99 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.12 186.99 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.61 184.95 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.61 184.95 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 187.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 187.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.93 187.07 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.93 187.07 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 187.62 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 187.62 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.60 187.76 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.60 187.76 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.59 187.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.59 187.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.59 178.11 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.59 178.11 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.59 178.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.59 178.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.59 178.12 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.59 178.12 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.43 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.43 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.65 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.65 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 176.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 176.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.65 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.65 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 176.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 176.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.00 166.32 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.00 166.32 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.40 168.02 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.40 168.02 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.96 165.82 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.96 165.82 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 168.05 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 168.05 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 168.47 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 168.47 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 168.49 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 168.49 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 167.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 167.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.76 168.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.76 168.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 158.93 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 158.93 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.40 158.94 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.40 158.94 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 158.94 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 158.94 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 158.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 158.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.60 160.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.60 160.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 157.48 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 157.48 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.60 159.06 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.60 159.06 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.97 158.59 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.97 158.59 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.31 148.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.31 148.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.86 148.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.86 148.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.42 148.60 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.42 148.60 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.65 150.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.65 150.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.53 148.85 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.53 148.85 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.53 148.84 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.53 148.84 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.31 148.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.31 148.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.53 149.44 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.53 149.44 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 140.01 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 140.01 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.75 140.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.75 140.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 140.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 140.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.75 140.04 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.75 140.04 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.75 139.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.75 139.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 129.66 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 129.66 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.75 129.55 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.75 129.55 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.44 129.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.44 129.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.44 129.71 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.44 129.71 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.04 128.49 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.04 128.49 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.31 129.75 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.31 129.75 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 128.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 128.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.60 130.27 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.60 130.27 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.75 121.63 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.75 121.63 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.19 120.97 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.19 120.97 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.19 120.88 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.19 120.88 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.43 120.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.43 120.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.65 120.79 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.65 120.79 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 119.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 119.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.65 120.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.65 120.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 119.30 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 119.30 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.62 110.24 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.62 110.24 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 111.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 111.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.44 110.62 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.44 110.62 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.44 110.58 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.44 110.58 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.46 109.36 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.46 109.36 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 110.65 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 110.65 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.06 110.69 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.06 110.69 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.06 109.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.06 109.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.06 101.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.06 101.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 100.30 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 100.30 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.62 100.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.62 100.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 100.22 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 100.22 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.62 100.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.62 100.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 94.10 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 94.10 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 91.90 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 91.90 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.50 90.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.50 90.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.86 90.77 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.86 90.77 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.86 90.55 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.86 90.55 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.86 90.76 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.86 90.76 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.06 91.56 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.06 91.56 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.06 90.74 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.06 90.74 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.06 82.00 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.06 82.00 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 81.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 81.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.62 81.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.62 81.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 81.09 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 81.09 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 84.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 84.53 Tm () Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 121.38 359.13 Tm (0) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 159.38 359.05 Tm (1) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 197.38 359.05 Tm (2) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 235.38 359.13 Tm (3) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 273.38 359.05 Tm (4) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 311.38 359.19 Tm (5) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 349.38 359.13 Tm (6) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 387.38 359.11 Tm (7) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 83.38 339.93 Tm (4) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 83.38 330.50 Tm (5) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 83.38 320.88 Tm (6) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 83.38 311.30 Tm (7) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 301.75 Tm (10) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 292.11 Tm (11) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 282.55 Tm (12) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 273.06 Tm (13) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 263.42 Tm (14) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 253.94 Tm (15) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 244.37 Tm (16) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 234.73 Tm (17) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 225.25 Tm (20) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 215.61 Tm (21) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 206.04 Tm (22) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 196.56 Tm (23) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 186.92 Tm (24) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 177.43 Tm (25) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 167.87 Tm (26) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 158.23 Tm (27) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 148.74 Tm (30) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 139.18 Tm (31) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 129.61 Tm (32) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 120.05 Tm (33) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 110.49 Tm (34) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 100.92 Tm (35) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 91.36 Tm (36) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 81.80 Tm (37) Tj ET Q endstream endobj 7 0 obj 29175 endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> >> endobj 8 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus ] >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 8 0 R >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F4 /BaseFont /Helvetica-Oblique /Encoding 8 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000029541 00000 n 0000029624 00000 n 0000000212 00000 n 0000000292 00000 n 0000029520 00000 n 0000029727 00000 n 0000029821 00000 n 0000029922 00000 n 0000030027 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 30105 %%EOF timeSeries/vignettes/colorPalettes1Fig.pdf0000644000176000001440000012056212407026777020467 0ustar ripleyusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20140430203415) /ModDate (D:20140430203415) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 37256 /Filter /FlateDecode >> stream xK-9z$_̅ƴzZ# AnTRAп ㋾[~oۿۿ歟o6߆m\/??o7ooMӼ5տ'|?o/o?о6_?~oCm޶<4L2p vK+m52l淡iMKÖ;upҰ? > oYpNy8|[2\f O~*c)6wwDנ,r{[aZy*6o~lzݿK2lSaYi2\V :ml6/Nðop.ےmSvk.yƵLHd0o4Cga3aƘ(_o}4b GHm#lOn</܅6c<lt_FlnaLͩ I6acZ38vƔ2l\ ɋSưoåǰ_\&+ oCWm萾i..2' COyp6py{usE!O@&l`fo_vK퇡ϟ>o 1S~jJ {r~ 0*\ ]0'aɉö pEx=6}#^MHߋ 7cװq-66˿-\y_> c4,Dbb gq .AeCUҰJ[W0؍H{ucԔ|Hn)]s뱑_myK\&4iV22 .g}P4H5OW+,Ȥ7]w殀t+l0|Fmꂋ/N.7 pT36_}c7u'6FS5ccQ&j^~툫yxT1Tֱ Ke6R@/19LLa`ݧ5 eu{Eȿފ7cfr~2Af/=J9<;~rVCl#S/-vr~.s>Rlnc[Ø<Ƣ2lw`@Kk5fh B҆(mm&x@kla+lͯ.n6*Gޑ+yz(Vг\'v@ sR  *486(t|\_.*n-*2WW)v*(9A6у\m1$R)$pL䦟MN!B7zN#Kubʸܞ63ceX*1=Jko{mX6@KM +MX9?Ke!~ &FSy5brCzlFL"Z!f7y~ aZnɢRP7 v3N{=~+'(wfjZei\]m=@L*O(Ы~: g0O[MiZ,uT7VPn졶W4*ybUQP]BxJE*UpjǤh}^LfiLiú 1^`Ceq[9Fm oL4ǚq_F-:nx|2uqCʹ󸲎򸯼1Ǖ}Me_u=dqLDqZsQO\98ధ.Esy #:g}e_qSW].e}]e_uY|woIV!v_vkhp?u3X6:p?yFN`PXy;XN2D>;.@G2q G`PyR[Lou3]p^*0˵? ]Wj<*KMX]G1vue@ti+ `㮲ܯTV]ea#`&,wsqWY;2x渍6V6Ҹtld幫uY+_J6x#V1<0󮝿 3G^9füoV^gʆ>T8Ԃ*hJe)Ԛ-tKVYEd-Zg*%kULRVAY-4֦8N56Y0SNk0]pgONif9rV 6ymF۬ gANmf9rv)6[Y9;s&|gL~^slh76o!zXc΁ցށ!1AQahqhlAA}7fk:Z@SD 4I$f,6{hQ z$S"].F=oGXAb0D(XBk)V2D'^'z7'z9d=/J PN=r>nC͏ P>?܀z c ^ [8nO ЭKt3Pc@7DܒǠ)A<fLkkZ/~Vnw믿wBWֳȨ .2򸯚<*c+SQ[+c(lx<* F E<*c+;>G!O?h_DFc_v=cc fSt_z2*Og<Ϝ8celqS[}_ { xt2/VelikZKyVϤ0Z9m8}el鯌-bSڕc tllr>íc ^B5^V_[žJ6IהB ckI6Vec+v~j߻;6b.ym7[Tb-. ւ;~o?)ckaZxX<Ҹ~[؜,C$i4LK~3[kS̴W ]_n7>lX#J~o\hׂ;> ~opHa,ԯqSV[t038]?[/ #c f.;v?[̱Z`ZdZhZlq@HPXH`HhHpH xH DψuCDK̼kȏu3ޢֶ@iq-<.-z}3<.*D#FԺ"Q CD -4NBQ-8֦EOAÛjӑy̼~7q)C SMp0it S8L pf6=ȹm4!gBNoEuȁä~gRāAߔ{jG5hK!XE?T1;ޘDoOP K%xA m>^;^D}3fk[_͸}LH!ۮWh2l;{8v-]6,UJ.E@3.v] )2XRt1HbK DQDQhan{?vFfT:曕R7k`VKnY1ffv+ȺfNJݒ'Y0݃Y0݃/:8ݕorO]~s[Vue\ZE\<;r\Ao/GjT)yAC`\}p^=>v`&_3neTV!r\~ZF:cjq_ZyVVrUVOI @|,>6f1~rw\cS/~ @t灙wM9rc&*ULh@3SIh68ԂfhZBjM3OK(D !,FԺ"Q CD !4NBQCm>M!6oMGyτ >8e(mc8mz5@#N8s8xs#-9&tVӇB:UU8u3q_7޴j R[C{w Ӡcqj P[xϠ̠׾3] i* E0oɼSDs1bAń" E<#|.V](QDt1bIŔ"-E'EECW ~7fT*uR7+oJ7nY/b ft#̪Vu +1߻%O`7`_r'fô~CH[|Iѕ3 hi݄Ƙj݄j݌k 83ɬÛpe[>G[$} H^x7_'̏C\?@m`]"AuK#[ :wwDK4oc#U߫20u JӰmL^1˘voNmxtg5HtsblA̒ZLL PS*Ӱ̰y勑pM)9,wag- l,yLj m]H&: X_F>|6 WsMȞ;0  @$r`0!v`X0v ofmx7 90Lcɱ黊啱Zl09v:QXǿW c65{biGԳA^2xA}oSEL TO- 1Z0c@kA0CoFjL68}'68W?8N]Ui7 !ڮ͜/By 60^%*@ WyJá*^TںbOu`A*N &ի0Κ¤~y,F9"myK\W< 7ET2ɹMYA4փi^@ĵChm$!FJ%(} 2 ٢ }s ^ǩnijӣ"XVo`A=In PiC%z|@y 1!ڎ$܎xq.6ڕwv7jlStiĿWMrkl9j< }lY}ѵRDUKɚYrN`c-i߫n'ڠyi3$0+CP4 Y^'+mWԴ!.hmvkކ,L0Ms`h:*n\4}7ݟE&lUccI^{UzbzӒaJf%(&m8ȉ8f(()Sf*|BYl>ʬ6>.!@]]\.;c].L=C}>PBfhv3'z Eq:VPE:g袔G2JThK:JT裔OBJ[~$@9CJ1[!}d`L?]Gpsz{JWPz_PʟPz PQz_F`= XG(uG3Lc=cfn7$A e9)̱3`ʳ1hc)SA(SaTLg)O>3L}3L}>0c&>_nNc^δvLsw-`ڻk]KZ"ͻV1޵iuLŴ{X+pX+PZD>ty&[.`c^gsqWX:x}}u/-> E>Vٷm~X+}w/c\X -a#fOjkEŹ5F1VsWkXkYkZk[PwN{'cAĨb1nH:ƌybf߅+2L/ ZL3eL;fLCg|o1MO1m/111ϵ1U&`e(-V&de(mV&0"fؘκ7-^]_Ln/Kѥc ^\ʏ5 0'6l6m6(vb*.Vb.^3J{1뫘ɒe6n6n6o6oc,6^o>Lj`:TM(m>^Ë&]_L.~=fvsgh({txjW-|jF:mЇ~Zp؂}xlA|,_^[03^arGF1o/L=[̱ZbZfZjZnZra!Ę%bВ1jI@[g?#҅1ٷwa*fM9ܼ[{^omk=֒x&D-vZem#kIBk6YK}Ze-}\u@ԦxWm:0K8~7sF69mD g@Nk&9M rfSI"N.E]&8LaDF1iA7-nGFW1sMͽi1zXF}c /~od*1K~ڀ¤v2-3${{1^*hvY; ,E4K-oBr[B-E>+*f U$"JdTb*RV"1$Q$Q*h.rIܬ5JZ/)5_TjXz%܂265ۍhӭ 붛AVn+VwKbrerbtu3.-\?X\#˞;\W^RΗ:5倩VNe利VΘm吩WNu嘩WΙ}I PNIMPΚIPN YbY`Tfkk2*:8qq!JuS T9NDT=JS TA&J5TTE.JuT TI6JTTM>JT TQFZy(JET^E|9f3enJyV.&b2.&b.&b2.&bkb2&=a&}!Fp}Zp1uV3Jj=p`&^k ʞc Z&0{5dט #jc A(a&XLg # 7cAS3ݧ Lzi&4}ZI>My`Oc0ާ5dLiPyUW?N<3J &[<pL\ȹ 3neTW*+riTVÕ}pq[9\y*sW9\y<է&\4++ڄܧ}L~p^N#,f=-X@HPX0^q/O 'Ƭ Qk İbZ?* t̾ 3t-fvsy/ƽޢkE; z%Xk, Y4dZfё΢$kEKJ=Yk-[y>MY"]:ˁ/L=9}rJvI] 0,p^v/șnS ;BNnD.rz/ĈCX{&|pn71]mF}썽읍{HTConw7aj¸}-x6W$Ȏ!ep<,NRiy`,yX| $!Z!JyX\<$AVn<\aA)fW~kSR4qbR{X : | /`00!o0;G]4od{}x{1L_?2b#W..nӆ6~(lʻQ(. E$?DgF(@X4ByJCd/+QQoY 4P{(}"qTSs@}Ԕ~k⚒_z`dFzm"rB4/O$0W"槵 iHWE>vdjڷPI\}x6cb ۓ焏%s0k<|Ew*\༕#C,6rzݕmj=h=h(h-dhoJ?N Vх~)3jqJ.f L48S3նA$&Sztp^L)n̴m8NTSGH0fEBwi`MVv3矏]t-f}WmW]VPMVX=\Q. PB!\Z>" sB̾ 1 V\]\2vylT%ѩHS§*$PUJCU9U%MJTͳP%W%)J{it8@ ̦ - nfR$%ڋiJ/*G@LV1a bL$Y!-/CL\V1y%B,c+Aw4||uh0Xt^!v^Av^avFi#ݶncn7BTpPMxǰ6b]ߋvG ОOf8%1o\(LPrs$2#;Te%?1J.s ]))LRrt$2K D ޲D ȳ4d \jZpnH\&u{sQe 70`L\| qqm|\s/2 }}|Z񭶲H/?]ORS{_.U! >>U8t8&p\p>M<ULZ[[Ywo,*b*b$+b+b 1mwĢAQĢ3_E;2NaepS^aFaFaFbG^bGb y9J|yq:y&hy6iyF7if:hc:xwZ1[C}dqL[Waf7Q38U0xY00]P0ap08e0x i00"fjǂAcA&̄ufvs)c7#n zxB^# :0C R4FpFv`@}ҁJߍJ\g0Uᦠ{= H>j棖 >j 5ZeMy: >ʻV >joM ?2`&#)ZQj8qNrY6ʍ[!N,7CٹrCĹ喈Mg"N/7Fú^݋8u3u]7Ros5׈אט1am 77ػQ0cځ?3쵍7cu4v],x͜"7{h.\,(¹PsbDŊ"EB;.],)Bj2EJ\yLh$8QԻ8I;2>X pwO5>|_;t$݂x1nB<(!q~̀n:vnc=Sterb{Xv??~n=姷*6;KAhO~QeK&] ?1]̽2K9{L/s/t3L?s/t4LOt5kL_t6k Lot7kLt8ELK#-ͽ?JK{ٽv_g0?/ˇOy{o-_KyX}}f+|\@𙱥ę|g"ܺ"$δ-xHýyR/:~Uip9V5P'5R5t'5vN 'FCV1+ĠbJ1l%Rπ ~F$cƝ?1́u3]a2㔙<]gsy/$ǽޒk%= K~% </Iʒ#k%I:K4Y+-yZedZ,]6エM{tL[80ͥBu) s; '@j9 rb{NU$7"-D\ފ8qzy3ˆcl/xeŁ3i Z9#gJ{e}/1]c 5DokF{J~͒do0Lj~IځڤpϨCŌz#hiv\+@"HWd)Yl-Dx"_ n)XIT1Hb'QP"DHS*1 D='z'zG)UMӒ.qIܬ5JZ/)5_TjXg)܂65ˍ[!m7nG?V~`ѯan!Qj(:;L;ڴM1kt5Bs!"c@tg51H"8QD^Gdv|datlU" #̭3(X0 -!=%M)]-f^\AOF2zdAf>"3/ I3>(8x(k̭3tX8^gsqS[}T[yWV7'4+s+2\U2xM4giN zn<,D.,Ap|$0 )(b~&"O^Ǡ8:hcԴ+=kW Lk; ޮw]!Lb:ݕG (Ep+mgqGN l  5WDn+HaUooYIY󥒲LrgM 0;<*H =p ѹ%&/fx qOks+QF{13(:ntEz6mʫPخ7O3/BafރB!]`ebt i%Rbr:G) yhיRڦ^VutP' (S"qTSD_d )7| Fq pnmUk0 lRl4 CvE@(َLMpjM\[-6դ7qP<,6sp\`R B1M(#;y%E[ѢĖ}L{icQJkKVXU;Dj05THh 34!ZiC6\f~o56ފ 6N1qi/hTvsI9ҎL]I5U'ԤSR%:AKUZj 2U hOTTQS~HupPRQugQ55σ#0OP8vsIr -GZ4bH"nQH "E?)Rbu/bKy^H1}Qf ";[X5j~'jkI]es Ⱥ.6 sO\1ws3\2-s+\3w=s#\4Ms\5w]s\6ms \7w}\8K+IPɜ47I{Akv@̲BRvE n /vpCK[ ?pD c OnpEj _pFr ofpGKz pH ^pIˉ P1c0wzܫ3X~|A ^L+x/yf?R+AUBV+U2Z+U"^+Vb(AVf(Vj>(V愲e<@ _%+u1L|=~N f.d4_q>j?S=Li 0+Ĕg SL6"m0eb Ɣj#)F(S``HɎOR1L6b*}/b*}@T:+ nJz]I#)>J i> 7!J!>X[ *E|vl{T)Uh *v1<Q\sUBrOt1|\Gcv3/Sl[$lWej68$&xt6pL)JO0m2ed6)ȴa SB&oDt|m0saG 4Ŗ|Mh5å[VtBvc [t@tPt`pPMxǠĠ1]3)*Bd+pmyJf.\&(Psd2DIe%A9J.]&)9RtdPsYwoYwUL9rٍ%n 7%˛kR7oJ\.}sa ̥Kkӷ0aN\~< }s_r__q2YϷ[X,,&=EG&1`q%G&#'*3.CV͍ z4ghÞ N{V1hmeb1F:I:㌦"-Ρ"-"-N"cve)PĞk{]=;rNa+N+6n##+3;CK=o>8iϖ#1#$-P2& -p2/($-1?LLʑN0|9fz |3YJuA;M*_*@*A!*B1 +CA,+DQL+Eq2`A%亷%^8Yg03`c0 9α3`@1icAT 6pm#;>~00ژa`͘a`u3R^.gvs)=r^ Z %ZE /ުV!>j5{+3k]QdfmfH%3k]Pi 6!`#7 fpAc%n2j;+xžLmg\Y+AY<緝Zlga;+BpHY눃h.n 09p:2s0\bOp I 'ܤ#n!7ĘEb"1j@[g"?#ҁ1㦞7wa:WjSќn˭qZR,ZR5.ZRUUˤ5IT-VZ)-STZjPbǵ7X]:vDXL^N͜Q>9%rN[䤶 Ym)r %ANl˂ٖ9-rn["LmrFdjr`[,8u3|W 㲾ɶ{jZ5Dok90:0;0<0ѸF Ʃ3@m>^;0^n̠>NI,y3H͞"E6 p.&\l(QsbFŎ"!EFKwLג)bz.N-N]$nV}jS|O?݂xnB!o qSp3ssK {p/ {%ok_~(=wE;^j7]]C 3$̝2CI3d̝6C܉3̝:Cz% 9+w!iV f%K)BzAT"f!nVjV_GG;{j+5;r>]ϊ ³ĴA+nL#"ǴB+vL3ǴC+~LC"ȴD+LSȴE+Lcw2!ͱz B<ꄾo>!-Ҫ = ")njG)"*q3Bi9ʱ_5Bѕs߂'–`[|lE8~o!9$N-xGyYR̂9pcw f>0pO'ܧ#!Ęub:1j@[g:?#1㾞wa:HSe ܸ[c-`ZaA$Dy]!kE2 u$Y -XVZd-ZkAXqmwQ]:\$/3S]w;,ӆ8q8v6ȩ|s!'sBng΋0"wSΩ[g0ӕkU}-޵ZB 5*oРc}P{xiy+*f U$"JdTb*RV"1$Q$Q:G? %XFjXxJbRJ p-X+wKnXjbr3v ߻%``_z{0t~J8{?r˞\w& a_n憘aan&憚acnF憜aenf~.;k: Y0`AJ[! Q`X (p 7spw >^S\L.z\qy?R-1S -1S-1 S-2U"S-<2$S-\2&S-|2(S#C|(ZHd;!i,>2cf.{i?MbM.ƣb|M.ƫbM.Ƴb|M.ƻF_mr1 cm0^ gm04&(&Zū1f-̲^p@h?c=njY0kĘf!cƌy6TC63m 2eL1kc1@ }FNX1XM8qapS 8y(4ZmӇC:U(V 8u3h튙4\/޴һ5Bk8s`u`w[ie qi H[xϠ̠׾3M3 n˿Yf.LD4l*TL$ҩHS1ȧb%PL"DDC*!UL%RJ<&4T$[$\g@3O-GJ/M=vFbR:拕Jk V+@WnXfbr+ĺfk"VwKbrerbreU&m~ys4TM_*u3 YШ1+Y 3Im*3gmI3-kę"- WmeҎLk 1s̘9d勑XO ol]h9*-?a>F[;|_x`e}J%(v)bk119#`xc~{sc^8)Oot=s?7 ixgw< NŽwe7 &T=FYaQ3t nf(, 2%ANuC2rkJn6%vm.S]?>hos+dG.ͼ44|=ʚMb@0oXS7/bۓE3o`~羁7|ܾuB( MH.7Rd0[[RgJ1*v)ӊgO:$H!%{*ZP`BjA&c |-p3sp`$HD <2N"cF N&nS bfkfqkgJU \{ޫt_TpVdVׁ v83dj  sb: iW10pѷ1>Q4Ra܊68+"Pw<3/JaқY?%c,X35͠Jb77C!6P.`˾S3ƈLӰdAovnMy) ʵw"σ4$}1Wi۸ (w|{yVj{Wu^{ݽdi bѕhtP=Vs [[TQ~BC+TUo)ˊJpP8/NySYQ-{d|˔U5\Ui]OFt} [Vz>_aё˴1,>|ˬ5)BU.d6 iT0 z +Mݵ|+]Mפy(,42J#75_Fv`|/ě\@IJ ⤀ΙxAz %g)Pj%)QZ%)@QJ%)Q:%)Q*> )p//EGgqKhBC ΁(v SI8 T Hn UX Vhf WIx Xʈ_ |ȇyfJoW^p1^z`|/s\-h7S==LI0Eǔe/SLi6>l0b Gd˔i)?S/Lm6^|+^|`|/\q{?sԽ3g;sؽ39yw}a`s]#Ŝy7л19̹w}mq a.soG?0n>Nˀ^ Ҕ ^F<^]eV=^v;y>ԙ ?j܅/Ÿ~S+̀@KmC1VԮ +~* h|bA`.A`/;[ӈԔ;DYfps>*3'9h4}>dM]gO#/.|C?|DO.|E龏Af^{5bz˗YC4s1R*]1R3*^1RS*_1rs*@1r*A1r&*B1r6*C15SXӽSj0Z:;ta1cV+0XALxl0,aİe#aF F#aF0ÞpA'{ Ó'ߋf'K'3~7G{gwyF 02U"\wa`#]*wW9F]bd%F]b%F?1hwUbDUI  k%Rn2j)7jΠdVK+s//g kiyK+^g_ZyIRϵĈ K+^B>"&ġV+/- p$˭~a5\7\!7\A7\a7Dr"M;䦞sOZ B-p+|<$ <ѲoAˁt,-q M4lٰ6v>J/F A- ,kY$:(Jd͔`ɒ*9WJa"rS~Lh"wKtz6BI'mJ'O*oTV|aG'˓ cA-?$\n9A.!@B76xPL Wm0cnK3_S W[)_8zcтXw4ЗhۍRt0~#-^xA>2<¤M&[3$-oPC%r 6q.6\ PAs"i!#-TcAۭՅۑtjmMWn.-2r8Drk}SuJq\xauyqC\wiQxHNIVJIKfS.0e vM.H%PJR+5JR,5JR-5JRJ+II_|%IPD%IDPd%sU7̥[\\/` bp390OB$)pOB$)OB$)OB%)0PB` !4f?VCI@ { {/GGv 8<^q g?s9s;s=F^ _ ``a%b-\S=\TM"nz0̓W#1vIr{$f7c! X!9+nb:&nb&nb:& l˶l{Ҍm71V(n:\~rA4~7gnb&fnb&fnb&>r_Ãn>t w`ƻm0އ:cO["3{ Y+B`B`Rߢ[zP2lZ`aS4nX>Xs"݂c4>yZ|ku,J~a>8U!b:mڿa{ֆJu:Ԏxxǥ0YDݲzfmU#uIL(4Qq%xʮԟ xO9NUUy!_X/!htB>ئe~Qશ@`@,k4ZYl pDM~OM'֧)wgӇHv;̘Ҁ̗4֥0Xƚ.ޡꍅ~HDїuE~z]eDGAw~`|d7!of'F!iQ(^~X\Zxִi~jDbCNR >1 *r U)#@Re<T]Z](M'1 ?}o .nG\̏x$vFI𢕒M _Th,ZYDe16˂EAڽ0Io\^ûMlԜ4VށϷ21J Ԣ*qJ-*J-"+J-b+1ubԢ+qK-+K$(K,0!+,JڷLz2u`6ALybf4y?$)N2:!"O2$)XO2$)O2$*O2$#*P2%C*XP2-D $)o/1GfyRzť nǴLM״MMNMOM(TWMUQ['R[!DͦQާ&}#Fqf Ġmbm613L+_S~L 3%`p {1cJHeʱd#)0ExQp!U^0Tl:jKmZo`0+G%# fH}Y>s`T0+G.#Z fHڏy}V%EM'3ilA+ "̦~npFǖLǚ/+Ӵ XTٔ}e6q[Myl*SWMy<Ǻ&ұ$\My<&5#boUfSrtj M'34q*t3+஘+䮙+讚+쮛pWNk'a@DU آn ՞C'Z=h90NYC?_"iJvp(VP;ᡴXCduu!ʚET=(V%Q3YZDŵ\|T,{ρtG k)W -ԃNZ۴2j \5B }ksDx h`65@myl61S*v&g̦C]y+mBަ34y^^5t^S4^qZ*HC_nm7J lpjOvȆ:{l:"$jqmҬ5SMK:1mT(`PmS9bCNR >1 *r U)#@Re<T]Z](M' aFGi>Q$.^(]Qh$zNIE[e"핅 Z,AYh- LU+Udo0~~'f/8zEK*'NgHJ^DŽ4xS^WEW&TmWb K[aizT= +ZF r𦀸dy" ,OKkІ >4sx(31noXh!/ޅl~cx4*JFŕW!19F3y58CF(.CD#bDZN0›m8v_Rs`C7`ћ#9b9 kq QeFr\ĀUqvqhqa*iT\Dd+8 xL8߀qU:0n<-@\hϧ1PNPV31׳Yz=U(ɾ^k}MkՑ$,D eXhAtb B RN$ HC>, :> 98G1SKW}i.7FDB/$u+wIntfwy(!74![17_{?K>m9xK_ՌmU;n>:z7Ϋ{Ϋy:B']˿2Q3jt -RQ&'ͮDigEʅ6Z[;!kAZ,[S^ $z6쵷f^i;v4X[\;ɣ*&Y!(mp0B{SĎ:[r0vG-FY 3|LQzNxg10}ȖWglcßi*fVtu^7D7UG(DZa I Й ZNtB.ݣ}0> 7 ς`(^o m[Bі F1$mՐwCYH?$#I*TR C@R)|2iK% !Hbb{AWzWz6WdŽ׊Ag+> X\x cqDМ-GwR&'=ವ}B-B-/܃鲦6&fD'xKd^1bԀ0IC1I #&2!J=$`2_J'Ot* RSl+uLR;\,LR#L- 1eJ])Cm) SfYd}xM9oR{')q3/'sM'muk'Uw'=y˘'%i{٘'#2T'͊Iu{$=0> {\py=q!GH ̖II̥J̴rKÔʹL ҔZΤMIo$qQ__uȔ-2vdn3vDuo歮gsP:G i|U&!\#U`ve0s^? nn)VeM$EIuٺnlPJPB*2R6%WU}7We=Spq';:~|9[4jbXԐ=\{Cȶ@6 re E %&bπm5}f5=ܩ =;z]{7 6wܶþ^_ٴ?}^!\\ureZ";M06Ÿ?}^g"lQ5I\;ЇRt4r2'?M-.ke=v[/ Qvfkq#82sj#z<[k#F#3eG{c|2&ە441:#E-ңSQ9UoА+ XGfg)= Rl5KQk^0/g&j,dQM&c>Snᖶoͣ5N$;acT6 O< ihfʧmbFq~fi;(';sYT=>V? WnVF&lp1tpK-ߺ?3p*z2pҸZ{ A.G-͉bp<׀.4wa5 _8u Ck6ƃ_+O~Xύܡ HN}on)]Av؋Cflnc#Px=DȆE6M}XClNeGXv`e C4_Y|,r2]dR#nnn)u]X"t}c\7e _-obnQ f Z_O)BJ вjڀ,;ܮGzD[Lgd=̡E{Ò@L\EJ%µ Nj`g;߀JmM3kJԓQxYkw|wtKj;&ּPj ;d?of5F;;]8e3]c<T1|Fj ڟًg?ܮ>}.nqak35ٔZlY ,e5AkT4I[4݈PKD5X;5!L:ewʧhc2]OϼtvK@660+z?s e]("~Biޖ4.Y]W|)|MSh6{ySjd`s6u|t9".FvڼFiEl\azFi>ħ5mLU8mm#4%x si;Z(m:Y/\>>?ln81^^67K ˋ.0n -xRӪJë,+D1 1s6j;!>K"gaɑ'259g=<:Ae! ƐYѬOlV/28k w'޴HeQ!:$me|Y{`2GD~L ~LD~MG#D_?-Ooߊc~iMj~f77c<F1_21: (:@CK 6:7;eC?z]7'Hc֕T.S}Ma:5H h/@f9`Gͭ#3v閲ƚPD*[5 XhGkzZ3՚ȅ{2p|lj035 7 hi BKۇl?& nnx5znr }j 08&^'>=ѷ`+0E_RP)@ Bh/D |EX'۵q_y&btK’_cO!ACn I{δwP{cF XOG{g֔'۵SB,R7p{?,w{7`{/$ {7{ { 7x}? nmtO&p]X .0 kn0놾lLkK+w^>^P }<+zmÆ&&}znLm7Wq<[vk49Hr%$uI2IaP*Gc]tI(9ZSRVdpmIZߵ.&ݛ6 ZT~YT~7aUvk4rn+@^궁 $&n \-1yτmNuMƶ|ކiumwcyjn4hR_zS- n~۽V<_n77S$Oh=ņSPphAǁ z레C*/Ǩ=z0CH2J0̠ v9ĠaA}pts9n閒Q+ԯo +İfc59 mZXdMB*k&YPΚ煁ִ/f5) ]6`5f {l6)~7[#;-9 bxn :ER8n4Q@Ht?)tEg0 G7FnFͭWz]nԻFPnR7 t U!OUf̪*os#ӕ3jdts6.<1-RְtHN;bƱ3|N#;;Yx~#d@K><[Sޮn(etKAc  ߁ /: ;G۽J߽޻N X^CEֽFi^4sc㛛C΍-.lf>4R-eCul1莑!鬑ʑ葷~LYF{|6&;1; N^ttKd#*k,s-z/ e"bF1tQ (^y6> Q eѠi;)lԔ}vJMnn?7j{6H1>}8-Mz"'Wyԩy2IZ gN$jI(9ZSRVdpmIZߵ.&ݛ6 ZT~YT~F7eK΃ıYs[mW L&1Qw[m0L4{[mlϧmx{?ֆz7Fٍ&5}Pa? endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000037621 00000 n 0000037704 00000 n 0000037827 00000 n 0000037860 00000 n 0000000212 00000 n 0000000292 00000 n 0000040555 00000 n 0000040812 00000 n 0000040909 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 41011 %%EOF timeSeries/vignettes/colorwheel.pdf0000644000176000001440000014243412407026777017305 0ustar ripleyusers%PDF-1.6 % 7 0 obj <> endobj 13 0 obj <>/Filter/FlateDecode/ID[<295E44FDAE254B2AA171513D3A17C178>]/Index[7 8]/Info 6 0 R/Length 40/Prev 50176/Root 8 0 R/Size 15/Type/XRef/W[1 2 0]>>stream hbbd`b`bb`ab`< #801|y 1 endstream endobj startxref 0 %%EOF 14 0 obj <>stream hb```a``|2`30D0020p,Ya230Ҍ@| r endstream endobj 8 0 obj <> endobj 9 0 obj <>>>/Rotate 0/Type/Page>> endobj 10 0 obj <>stream q 180 0 0 199.9199982 0 0 cm /Im0 Do Q endstream endobj 11 0 obj <>stream HA /i14Bց}"<鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝.0FȄ\a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;1CĹP # endstream endobj 12 0 obj <>stream Adobed     '$''''$25552;;;;;;;;;;   %%#(((((#,0000,7;;;7;;;;;;;;;;   %%#(((((#,0000,7;;;7;;;;;;;;;;A"r    a!16Aa"2QTqBU#$35CRSbert%&D '()*4789:EFGHIJVWXYZcdfghijsuvwxyz O9!AQ12Raq"#3B $%&'()*456789:CDEFGHIJSTUVWXYZbcdefghijrstuvwxyzᢣ !1Aa2q 3BQ"#$%&'()*456789:CDEFGHIJRSTUVWXYZbcdefghijrstuvwxyz "?dVEd寓y8|7D̊w<2C5Bi8ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q#/'&lkTI"=xNv(Uzg7fh~5Bi/m:''%Xgl5*q>q[M(*i)bX*d*$DsqM+PҎ =)t7'Sw&w+Ͳ,lt'=Flkb ]wzQWxg'["%i\q|\gT+PҕVT[cZTNeMSH]/&Cy?u7rgx!)آeKѬb#Z]%_ekcVz+4*tJ\j~qg=s7@e@0Zд(GJa1s']Odo3(YpZSC^ք٭GEabE&8r//BseVNѕ<8qdlQ r5UUpD6 {Ϥ[V{QI3\M ]A:.r%Ŷ\'f̽LX\Įj=\UθPߒ;#xi><8V{( 5WG+U| lVgkڎETX4V]5[Ips"Cqɺ'S+*}O_z[ AJk)YShd e[I#U\W>c7K3tgp [E%=-k㥙ZӉPUGQtFحfj.t-/j& R4&o= ?HSNʪxb\Y,m{WȊyuaUeʰEtʙCv֧72Q`w_)O>_Z2j\%Nw*]Wxg*.--[F[:ةYLIOjΡl4Ƈ|r>ҖJIx-tĭzU7U2SK:7QW?:UNꚙjY^W*Um^Ҕa*~z@ewBc®SnuNJ\<ɱ >Q̉L)J:CaFډ#UkĊQc:lddNՏ rfTj/TqYsFmW-^w0F'>c =C:ӼkVGbYQSF֫co4r"p:g*8wbWթy Y""p89PI^=-3lI~h܋E:{6ޖ#HcUks\3 i-vꦣ_HZ&8o9g穃vOWkA)'mSy 3{CKΐ1H1Meu|yc壕Iʹ몥rY˟:5i,6ZFT9抈F"Nge\PQS31ГFMB'^GLl*'<Ĝ+7hK^jH"bڸfruQ %Ubڪj).G5ΊOZck܈hETO [݅%vNC3Or^~f/:˩{]+R5DcQDщ͚2ӕVc:hH>S*ܥX*#2Wf΅P2ژ#XOfص)*GOବn94hN4+ό3 zV՞Vɪޘ1j'b|1V ~1ŲE4baZ%C:ػ3@ֺ[Sj-j==>Rkի e|94sGHv{Zf+ʉO޶dt=*i^5zj$LxOҝ|znlʍ爓;F.tX4Um89L5zeN $sFbr=j9L訹I˚DcyŰ֧xG:-HpEsDt6ev|t.WIaqMϯe/P`{6\ =Ѱz?xo=h{6%M-7h{6%M- Ujq̐9UQ=k: tEFrb[1C@ wpڼ:^*B̪J+FȎl3EΊU*GS7z` > zޘᦳJ׵x ΎLSc uJFT5ّp\~f<Ǭ(hqJxS<iuTܧKUήjT_1MSL +,AYFG_,GV&H`>~zm%KI4A3\s;S =DUPGSJ{QSsW9QÜ_͇@؍G4-vЯr&u$g ۃ,R BȗD#Aiv$=ho)EGLEO|ɛJW.wJx0`FgϺJ_ 5;\3CRԷK#^,.**y@ɖtbjh9ԔF͡lHH5k[Ns7|)g9ڪ3~|F$yAh4%dʧ%TDxSlN%Tʝ'4cX#w!S7)+ԬT]ruS7(2i=>=C3۞h{;ٲȂbb9x/_p7^gղ)=S{t>meZqZ%@d^˥UW(, v6{bX"Ȫ+"EN7C4=0tosU9QUn͞8$r6fp/])@?T{E?sw8ES2Z,V,mVM.9׬n\C|{Üh{/ox2,H23)Y SQ|8292^҂&VFI`Ue&PYTԬag* 9ׄ૕O ɘ|1>ZG15W7YJqx`mz:W##HәZ"׮XY/zvoVɇk4ҹƇ_GY^Ț7ޕN` <3U}X`f{e09/[7lsMo/j}Jrb5Bi8}Yoy-}a[iChυ`+ mk4./̽ dؔ,5rΠ_~_rܜ2rqTÈg=s7B]cr9!*zYʶjhDDO-}&SżzXic苂sQ]J#%d2r9zE=7ǂTG8mM:f0ںJFfUǦ }`Xx6,s&L& eGf[1F@9"hʋګ5;8-by*<]VKX\Hx.N=LKW+2 c'=ԵB, ɱٔ̃9L^:긪$r#([YBTj.dxpSKQG3t2ps"{'R6zd^TogCd;&oѥ~'iS9==W1C$\<8%%m*Jv/]xnPZev,5UNHݛœ͋ɂg_Ѣb"';vfId퐨*(#Ӛ?v T-ƓzQܾF1kFάE]7**90Ǖ:~=RIJMB&rtT΀M^T6|T62Jd`d"gÌ2(hFY g9+TῃЅlU]7&ɊySKu+N{▣)dUoha7Yt1Ry<~Z.EWSB⦍N5D;t4v|)OC #PZVu5C-X'j5VSݲ6&O|2 R+\ƊE=̽%AOeCg"b9Uˆ+&+2nђ'VG+åVUȬ~LQFpڍTG˧ s*/Xjku=dL'ic,zIN/m,2S$ұX˃Q ]TJ84kSxẬ'ļ`+8e+ 0W"bqPS&l?t>g'L2h0yODr+WB J>rQs kh{ &켜Xl9ܯΉi:cY?.Cpӕ7 _V*O t'1ju Y-9̑a{`?,T17-)3pЈ`6666& kQ^{6ЕH$NsDOhtbվMI+=DTK ^RWb| =̍,X9-dd6[-g7oW8᧶u2K=Mo)׹ߦ;Gt[*-̎2vo|X10 <MYy9ٌs;ܯ43;:6Җפ_ET{3zHdUΊNUv.V#^]-S dXj=L"**ryYK9cO#GΆru#抢90j;?o6ԽR72ȣrS4#S?lc*pp~V"Rj;D3'ի)]fd0p1z̛dcQu<ȘZ*JֵF1j""&dDN#SKMY D,z#H[>KVN6&͡ʆ౓\aed[z<QOH.N =z5mK_+eG9˂`͎~2-$yTɜDrWbW=/!jȑSR#b%UȩƘCjY }j+Uj\thfYx䟶e)h(i8h)Q[ F1xKr{g7fi}2ٿ{e߻PoNL]ƨQm7ԧs|_Lo|1-_9 -j}Jpg7fi}2ٿ{e߻PoNL]ƨQm7ԧ,˜s'W,oY qW-Kmo!JS[>xꜘu|iԵW=kʢ.3FK%Z^PDŽw h;䞠:ٝK^#Lv=ƽSU<ɢr/'4HPRpR|ʄ^,d$3f=dŋN3aج_ICIo'NPNjw>| l߽4c9/[7ls@;q[M)ɋ -EJB&w>ʐ\x{\UH5b&g+7QG˞\TirU\5Zk91&. 1QUEE),ӧl949 {r=2V#NSrkYQW1-nI^V㺱3,}2ٿ{ehs|_Lo|wT(Sq[M)⨓qx:ƪ$RJ^k*u-̇)Wľ;RK أ^ټs3Ic2+-XR_TO)Hg>C{bm6x;o/F3e~4wERPoNԴZ޺{gh/K׫$fȨSPE]=PUF*"iÚ1L`{77yޜ{`X*Suɰ)g7fi}2ٿ{e߻PoNL]ƨQm7ԧi t>@jޕ*.XE!V4z G;Zuٔ2͢6oU91kRw9Q.7pێ}[NF=jpVċܧͅ4}L;VsӚRH2@9UԴϬ[\m:N=Li2jc]Bk'y WK.9OJ,fuAYtQV]-rfsWN9ZUEE垝3בthnw]|7bÐAE*gvl F,F'*vf"ץC iTխW RrhPOIoջk:?SVuI҉o MeRqst]NE+xv|&%`֎DLէs1t{Gu(rWE%rI3g7fi}2ٿ{e߻PoNL]ƨQm7ԧ{1M"Jҿr̉Tiag6r5W2UYZq+- wK=blkr҆%u5Jt'm 3uyg3W<@+nrܛϷ4ڗSʺJʖbт޴!T9%N?Z()'Td\|Iv!#CȨj[kEEЩ>ԩrpk5W!\1z)IlJ @d>i dž)Pc EIq`yRK<<Ig1ʋwE$P1Oq!Nz9%GyQhAFҧ 3=O5gGePGH9‘vw9{jvg[{l;ȝ>_ ;3C'~6}Sbr#z C-ْD\Z'*)XT]BcPՇS"r93r8s6%Z5o+]̏C{qsI8KԷ9MҨ̄WSo!g[Ll&5x1ww UU:UDLW2'ȯX0s+BvZԵ]R$̪]a]b,Ȗ$lk \R49_+^5>U:TI, ~بTlc.)$( :uOӍErJ+BS8Ӷy jieIa\4YJj*aIəE66Tb"ZT["%]=@g7fi}2ٿ{e߻PoNL]ƨQm7ԧiYNEEU $PhχWfc}'4THer\UTV[P\dCDJV;[=9<:TI2M :xZ*U: IYəE=:̮uJID\kڸȊȥ$e;smpΈJfvO<)4j4ΊscL੦IO,cVS5)0FЪEsDUt"!湊r`pyj FIs ջ tHZODmʷKwd6<\((8(>_s'!eb[Kb11r5N1$,F'֞ҧ,± lTKKVrթ~,H &qmAS8bt*/LUJ=.rV/+XLH,Y|S+b-Y&=[IYCCL{ՙYLJ*I2)Y4m5ŮLQOŰ*צz=;F$$ b%ڥeKR'Fn:3g7fi}2ٿ{e߻PoNL]ƨQm7ԧJkYFwQ],Soi3!ӗĠBY껑՞hKk52ӽqt+WA4{Ѝ1&,_Gv$,ͬK~}Sw$pNԚjGj;7=`Yks*m]1ž6u7s=9W(=uΧnQ\EƊIvKgībNVMFޕxm&e:y=_OjYBL#s=SL|vmoKflu)b9VD֢bl=NY 癘S\tn'42KYY%iV4/)An:̴̞ɏkEG"*hTČ*9/]<E"Iɒ_`p[`d[#g7fi}2ٿ{e߻PoNL]ƨQm7ԧpHicBWU^5Ĵbm;"ɖ$M5'}z4oO &QfTP]∽t>O^g}͍-srK}KS;"4Wc|'HeGt}CHII/.J6rG2Jܳ_2hCմ{Rj G3ErrC,*ɬKIqU#sٱ{.TSOe5,rÔ{UQtL[yU4ۤ*g#♈98syUˍdʾwxbodhiѱ繻&OS#+z\lr+&J{>>^jS]4;&ܥKzg6",s|_Lo|1-_9 -j}Jp:YzTo 6yè TI]*ڪJzn5W| z'&4J̱Ԏsf^ي<37W=lU%^)[CVٖ<*w7S;xp=5xڨ!ޝ@xYæ"4f/4UЭ=\/z\N&z<a&c9S{<ЉM^ okRJHj`N" ȭrb*.BjUfLpWg9t5t c6G{=cΪ$ԲJBu]-=HgSK%fg'Lnۋ+j;_8~@ڙ\լJ”/RfĝoWRGiXݛN5¢B`$U3Rxc diِZg^9yr1\"USuIҪ5\"iU̇")5VFQ"q3t6[i9Zs8xj?\擣XBN| kԫUqŝڜeUH[;= -VUd:N\X)4ⳮ{>q~ {+v։qmKב9<rN9c^E.XVƨQVtPe ]EfB@CFeѥe9kZq+ǻJHUi^,hiI鞏j P%,:Vԇl:+,1xog9}2ٿ{ehs|_Lo|wT(Sq[M)uIgBH4cy8NܷiZ~yM+ʽd3Fӫ*^D897 gM"՝[.*Y"MQ=KJ+JU0bW*ڐɼ̚|4%,*F˧Y$͘Ӷ@Qʖ6U[݄[´ z =3$nLQ\PemXӤ;"^/)YV-J4{jףI΅j3XG9JEljfrpM ᫦e];~&e/enm[TCqW}Jy] )!**,j0(rnܙҳTQYP#˝zƥ0 iXD;b6J7]y@V9/N̕Qi=^>ۗ:ŧ gM_>t+SK޹U=<&}mMhZ犧q92&68"5LȈ3j"v<5-?Ds R*.()⬤Z:♊ǵzqrbzg͓V6~Gi}vUM ݖ6zb"U;gt/zĥyZ>E#OV3rXbr5âbNZ]T::jw%\rh*TTS2Kg-TDSdސؓJ)bGJģX L.to>0L6['mjxuTQ՛K+ J1/"Vm[R.f;4lr:ʊQP"uZ֔[~f&hoerؖ^X6vJI,/v@uYEPBz/R=0}kj̩T#8]OfC[Nژ3/)?k:ͫF}Q*dN$8EEDT΋%$vO%6v-K,1{ vP}2ٿ{ehs|_Lo|wT(Sq[M)zvD*`ˡpr[FZx݌ʬn[65'%<*Ҫ}]KOzȜHNMcZ=cj"\X$91 ʜ43]:wp毠y|YS;E.]DkVM%<@}7j)&jNlTVɂ਺Kjجx0d}gvNGfcHv_5Tw K42fQO-QQfZJi}􍈮sD}駪"/̲"o4~S;ĞLJjG͓f_gNnD:5-B(_\g _jgRmF&D:#Ǘ(>ͱ_Z$F'SeEcYPļ%bpz|*TPT#a]fe}yӔ 9ֳ:(k]Šv#Lt=fo:wKfگtbKGiBjY)S/q;ѹXV3*.e,VΧOV&zi%ˬ-#ą3^Qp챬Ng9TJުV5g7O.e!E jn(TEv-5| g悒p] 䝊+ 8y:<4qFےCU["O챞eXLY i^5B88ӂ֦|#SL4"&#C6frڹmQ^ȕwXH'2Xek)5Evܺ9SM]41Bl5Sۦ*fkȮЇvJxiڌ#ЈAs&;fΒ3:nv9QɋWs @ S͢( M,EVEzI,Y%r1L\*5U3#SԽِwVwǩ{+ {`<,6Vc n=lSI#$F1Dj']UO[ԽِwVw=z̃yਧg48Lr=1b@گzZ\"'}^ 6jpb/kԽِwVwVѠl, McF&E:qC%j[֋pܒ+WLPNg^SxjVJ֮ əT5WQjb8WԽِwVw=l+,yiy[<cUDTW5Īd.RœQKSKS ՂyS )";Tk`u<ձ#]vNފQQȨzT7uQp]?%,b#JfUVUOfLyl持X#j9tာʪWV)|VRڵI3͡xΣ~VDg$S:WUN q#>KN`b΋#ђ,Y303-*ҝքk\la۴ٳk<Yu5 H:5[U͊c궏%;,| NhQWџAyDr5X`֢6$}44+j)bcd'%Bc52-UZIiRJGF/ g·'rvUU#d,…UcxKk\/YF`ZZ5nMMSJeP5{|'4r5ʞI㓙d=E+|l=ç\q;RV$VHhT8Ied@I4WjŪ_Ҫ*r-ئJNgmTpV)QT}V%*vV^ZT̩L{A׾xez>WNs+xW*?Ky5WǛ,{^ bGTW:5Uju<& q\3=E\/evd՝lU0v㕊ǵs JT9W3s_oS9se͒ծW-2sZJu\n(&SٓSiY٭ 9ڝ}y;&Т*beb+{׵ET\Q@:=K]ug|[GTiZFSVkEI^;;<WQU9YMBZVa57vѹYBR{-"Q:Ȉ|l%Ls|_Lo|1-_9 -j}Jp&M ƫ\P4|ZG1};T&gyJg3Jyd7i= 0= jjx}$U4nTEW5}:Xr=Q8MLOiVt(iIdwՉ1F4"fCnV](s/Y!s18Ytgw˚V5fRUpL R¢eSS*`zwLy귄YRmB9[x^ :x*}=Lm)U:ʇIЮNxM:iNQ ,.#[\ǜCS E"p^&-T^%9 ߉ͧTriOvΉ`W1(|r5Z:*.eE>Fu 3&{9 )R*h6_r*ŢaN=4!ﵝϲ(6%!LQY6lnS95tc@%J{kQs*)W&Mm:ЮNxM{6mGAO;^'66QWF+{#"t*.eC9] 牴ͣ\6Vֹ̳}fn8hQ:.e>@)r['UVΧUUWt+&w6PP6euM:ȈXڍ {`|i̤]McXFK:r5{Rk{2 bϚ|#zW'TǦv9Q@=~rsn١,5},Tz"9cj5U> ŧ=]4}г*Sڰ$NG&srߓ=#$};W9UUU\B9m7sieY:Z H\ڍUM8f=2Lt{ܮsUU\t+\6([&ΕfEo]Q{GeuXƧK;pr~!bzvm*))T1zM T+:-R^aW=h/34uܯ|\UUA ܱ{Z^%CEږ-5MὋ<1RR11 Z=$zuYG%UD,v ʼI="pdj91Es)P,Vef>jB-\MWUӲJ$71[!{j5J*+#U-{Ӫ\}&%e4)vM::hLQvѾ[F^P)땳<9/[7lsMo/j}Jrb5Bi8}dcdczb׵ZE̦Wlϲi*;׮Ίj *?R|Ysx8=6u]8aY*3r`*.a+|.8. xigtVKXׂ󗴢cA,QwwÔ}ZY-W#jiUPa+K)m+Qzc :/n@zHJhNTN6c=6´-p)^f#F>Q+*xF>w5TFs2_&[e++V̚R4^.\dJE=%sj&2Ek8MMIF蘭7V2Dz6ͩ gM_6~ff19U@9nZp:1N EErE؈ֵ2!ɛ.j 7Wt犧qԳv@[&KJQ=$|6UrfS9gGZ=qdѯU/iN3Uٷh7mg:Thd SiX6q0#s;WWjKeQcUobqvT4+{ar2EcTʙV;,jYsz$vw9} I47:3Vo.CW7b I $bS6Ei4iN ѶD$E=2zǕqZvS ~B[Xd-M= om/8E`Ygm3}yqKUZ8G۶V(% y7Hj* T}b;:SB8b811NQVKӎNS1cQЍL9""ZtӢB*:=JNXĩ!*}6L.QY+K-WO,Ԛ=5}{ޕ|'iik.Ά,#Kz{* {Rj G;N*.s ɬ;I٪ؽ*vO)'zIak= R6閙zi@ xi*b=N4\6ԣu%WT航ֵWt"X3e~4ьl߽ƨQm7ԧ&.T(SLUpDҫZ9_`ʬ%<$>_+1V'>e8]Ifjb*8+=MS:^ ΠURf ;ɵZoB霨܏O!p PF͡-sVlU%iZ/)8**ZDei {2 ^ϚϨeng&3ʊ{ddŧ=U4uг*:Svܢ̭*(Xt8C]aƭ\P1푍6e퍊5EW*DDΪ}ܦО rZޞ3W+ cRl7OfxEܺ9 SOO,@dQ1ƦDL Q&(>@͒ W |sC]H=)^P's:\RʚY+3{KOLYF:\DY+39;\h[v65%tsplQU$'*dՕ5+ׇhW?ƜLǧ RPmd=ccSxip^&B=^1"yl\^"FkVUEa}J:SYT8TYײR=-.mK:馢8׬EwtcbF6G,\<UUW^5Χth% KEjseĶ%FG)<9_bJ,ڨV&z)-t۴3|T(i/#\F2Fr9V4*. v쬴U+$uXr.3%ȴ]3USY`z&moPZp%;JDƼd3YWM;I\UT 7ZVU]0+ȎVlҬPcUk0SDFD7vMfT(,\llrj2"Oqv'ZI'>RTضaXnAhӢt;4tLFϨeU\QS^Le<?GWz>%&X)4%[1V`:@#ִk)+ˆNU\+%gH-]i$r.TIMI옫IjrGi}vUM P5W2&uRC(rWQYnI:i^7}V7`zn'H TgV1oWv&j1򪪪U|tIr>'X(\ܩJm ٴ2]E)|.)SBaFtNRUN˅ʙw%m寋jDM\DU"5E*NǨaZ9g7fi}2ٿ{e߻PoNLƨQm7Ԧʛ}1QjfŰ7ȇeF˂"bȆEíZYq5XN$kx}&HLu;D9f JX4rG\.uU]*};.0{m\uIE^/"6Ձf-h->:s+ צ=0[ilQ(v\t#*t2TNXմ4RduUMUO#f|\[*u PgSY)s1[WʋdQ,2hYHUc=*r*ygyfPޢ,MsJ\_ѝI9(-砳\(QzˢYm'=$^iS*R_Aʊ 6kWSL"^gNSgWtPһG7t^TS&i>;6tmKJ*/)6RڳPҲ8v{+zʽT-UMIOG#]¨{uLcƍENigtHܗ>- gEC’E#ʪIezZ)H);:FLK*Z$:}Vj=sUʺUWIZKS-Du0/u[G\Z$j*Yx2·!ׅ5̩cO)vqh_BɑU(ԸJexW@g7fi}2ٿ{e߻PoNL]ƨQm7ԧYZ+gX3 :612b**4\>UO!B 3'Cs$R[2Ǻ7\EE*gCfkҲSL7IZRcKN(IڋYN];rIkXz/ikGl"]\.tG' %Jy*j&+Јqc³mb={*2rk>͢b1ҫʧ&)毚|jZ3zWiRϷ,:J7/LςT꣕΀dݭ%DV'\|hnӓ:rjc+N,Eiqɻm]<#Ts^3EUz Br7WJg>r1U_'uM\βHy*iS"iH) {/TpVy[:$Oԭ-M&8"ȌwiَqɣzikھB.E|U EZFƻضS@g7fi}2ٿ{e߻PoNL]ƨQm7ԧ ޮgi% bډOogv9]]T=R\+6cl[EGW==9Uk1ÄLƦcZ^JuW&~BڵbN0;3O]Zq[NDPU}?@-ֱ"5DDDЈ<TyڏVΊ*4M}DڝTHz\XkU\UUt"!WOh5DOg[,3M\er; ݊1zp\EVxilY2jk3[MWY5hfU6kQP^cT_1>^IG.I"`ىڝw'}Ofͅj- xS?f'Q'TJbN-I7j&1:O8 0>K--_9g7fh~5Bi91wER!o2Uu_5̮VӰ"bc$Icyۀj= ڷ$Swt & Q;;MS͢HأL^#ZuU ɢmf715ҫeлQ$V)IhGCZޕh^FsJ~Mc$cz+\ΊPTʈVΊi#dtr' Ekt*.r{+N\UOf=q{m](޲$+] U;nP,{V ;Z%C:ʫ*i[NB\NttYmu(Mܫ5nbzH:V-SlT#XZ&^5*F\EclZ[J*fo9qq7h3!ᤤ^SU jjZͲݗVV ( l߽4c9/[7ls@;q[M)ɋ -OeVJCnG[zWhGS1QRps\)k'r[0oƜXq)-48 V(`(mtCL\$pr`2r:,TΛ$>27dmWs#ZAObd^ƒ 8/\\m5YtU܂oz86m[kT5{JV]W O'rvqftfY46E:SƑ;Kܽu^3:"%$%kP'{EiWt3Wԯ8^9Us3]e76jO8m*b:g%* բWZnI^8v;ͣM۬ϴk:>)QQSΊxiiKUeDvtT>kXc2 <Y9,WCxj髠Zj4NTUcW4uRMUUn :u Uҥ2!dZ5WQ' rfSa6tuN4KG+s=SLvm-lY펩<,U/";BS}Ki@lGt/jOd2E385(bk+]g+O ӵ9Pk.*E_fGһSC=8k|d͍nZJ5w=*jGPקdEj)rR܉}qNPO[y"JuSXׯ9t9m:?xJܕs‘]D>$(.nʡ.5qTkQUW2"gR!DN6Ęaٖj"B?n?fH:݊ݩZ]0-KX!SVt=iMM-bGSjPw@dmjڐUVwfEbĀs3e~4ьl߽ƨQm7ԧ&.T(Sm5ұ_?L>ZR1(+I#n̑Uij%p==ݔO9_FzU4;FhյD|[!TZeT#o+XZ6ueى4q/"b%qSƫ=%q+0|*&+Vs9TH)b|4%,{5^Dʺ_+|r\dߞW"/DzSuSIIe#R$u buqzhv@}%8ctҹ5\.dDLpr2zҭЙ$*Q7I&Ỷ=kFԢ(bzTE·89/_Q´ur%ܩLw짤Hrj'e^P]Ke3L{h<s|_Lo|1-_9 -j}Jp=ZJ̉g18޸*J6«NMIyL%u 6p 񲒡WI;zѱ|bsߕK"BoQ<3"ڪ!m`cqm*ңTeRo|A-_XmyMRvOz/%3VSUVēJ٣v1Qw|;sU2FSL eifCUS 2t8cl15ڍkS2"&dC¢9 MYJ9m>pWg9t5dBe btQ䚖TY] /'RrM*s:Ĺ3Py[cY^m*{..|uЇ9lFy^ӋݒvYx*;!oUMC25JF5 +)bZN;EeM]3MP/D8JwbUyuֻCJYM~KVԁ Ex TmLק^ {3)lWL}'H/OdlV>iSȵMΛ[<$Pd8s|_Lo|1-_9 -j}Jp>4gR3*/ =ϡ3Ԧ(%pωKv=Bҝjkt;ЇDD`e6:Ogr*hS>jb|u ZMNs&O QXU(F+oMeF`PКֱƦ j""&DЇȕ*=^ 3*/!>ZzF6jja q/yUklƥ+Umd>Բ}Idd1>iFsNdLTVZR=$f@8:ѣm{lő9,bE{ zvEdSMcѩ[^!mku 草=H[jڵvS݊PZd0Ō%7VJwIy[ݑ{Jz>%=gʜ.fq)k^cTPӹUqt}JħUʱu,TiBš{N4 <TsWM {-(M>畉B4$3*yS:v WaԤ**sXCe3ŽhC O Ԣ*nef^ҥee+QȘ],ЬJ. JNOw`s|_Lo|1-_9 -j}JpYd%H*ꚸidz{k 掚 *%^ "c^$jbmڒ6ׯ=1󭵹:̝z:skN7>^i\|DN#wPm5#G$brr9LʊO26\&$TJ0dwiNmۆG;'Td˙|e6TTT4)&U}+k.>@\2TyKY5SdJ6߲[lϥEs5RZySLr;>9y;jIjY,up=U1S %fg*r.:hT3W.vjMNU\3&,2[jO IRG*?eĝz5K_Q<SSFK,pDTkst"&u>_MF2`L4S@ZǕZx^6I-h:eUHYčOUW,jڕ8фar1W&בD`fYZj^ ƚ֩X3:91Cz~gUUOeh Z ܒYuO d%4c\");#-e+R'S¯vd2+J`who/F3e~4wERPoN׋hO."NKթWU"dOSO8+HC 䪦c|:iǧq{R{UfV2״\ m Mjaʆْږ%S>g'3_86jVK*W5=>!՗6xtWɟP[ fDDDq\96]dE5ρϭ7><9Ux(̡ɧDE5! W5snTUYıE#akis6gv8h'ʙPQ:&㨞DL4bq^^SQh$(9[ jfGt@K=4v2ҲdN=\3[Jך&c+ifFꊩq@:*, ,+*̖H̕kQgr&keUSj)5%trg@ KɗENhz&QUQS≘YulwIXr=&)=LpDLW>T-mʋ#2giRRM?{U1^=tʫ:ҧRj_ORNujҔV~X4I4j̺Qzʚʲ3{N3zzDoSʜNMŒ™*W&W#;3@q:@y \Sʦ+=:feN֕,雁J%s|_Lo|1-_9 -j}Jp9ʹA.fKbVTIJ.^Yc^T\*!\M=IL|pAy $7cy ] P /qwXc*jDpg4᎜hS 5+bxȪ`#tJfc])Em➘a?wG{{zbO])Em➘{{zawG(Em➘t])?wG{{zbO])mMeZ0M3eV"ձ6ˈ+ eE=_,oLdH♕1u/Em➘vYlY|,U_";J{{zawG(Em➘-Zڧ˵اv!D^k&w.bIZ=Nj.kc)Y "r9;6(zv}^eW6&}P{x뜹PTFeڼkVH:w7F.VP[k)݉cN 8MnEbJ7 5,".|t.sQUSII=hX0V`JN%|:w V*`> fJ btC1"a9~3է_SIg(掞%RlW le-ye'`` U)>s)>`'m1s矶R|>tr*,R**`@kWsD:ɜ:W^qQRK_Y )瑬nhi#$D'S/|k*|OWve3dHbi]*dN52SP{'*{ŵ ty /u=IM8I*xě\W9suS DM5ZJ;}]z9նun'A=$IIcęixMQoiGYO<=/(T掊d=[p%`\0 FAz9Q"WBYWel7qK"x˜ďrIH{WsUQQ{hb|ࡇorv\[ks"Nooڐ)j`eM,))ыJUjM=D:Vt|r33{W{jb\j"tj}|<[=}<+1.͊鞞䩘>{#jkSÜVPe1]IbLQ.Ο%N>ؚsmAjDVZtl|ҺvBH间Tj(YgӾuMz6*AUʳHdrz9PTu8m"mUyE {xKTW-rWzôw>̇BTt.5ds`u(&]HקUj bV% cř%R] vtC;XZvCZdD>+N:ֶNJвmj'~8uqgzʇq#ԕƲ0ڏcEEL:\,RB6S:5i6ױ=WTne򎼥ɛA]B>RG;\u 8LR-eId39e٫VD̾|/8Mz%lkū<--\"P)@3e~4ьl߽ƨQm7ԧ&.T(S/ '̴сV*p<2xPNֲ魊 h*Hq99P'd[ ]F~ڱ:շ;W?½NC+)`|*􉨭QgSOr1ʳ"R]OuRޕLƺA RAGO-3QDkEXW-]lltTkZUЈLfOVֵi,j'V;&dwSmz+bj2bw{Y]R[֋) Ul ^וN JM'HiDrGWz̞N T氮zoYN >9TT m5Ke#Hn-T !ErP?:"gǮdwixSNt%G]5ES᫇ 퉬Y覎&V.eV2mDEjfffDCeZT6216CFlҶ-Z{J\[o*{ykYLtT&gIʍМōb9X-ULpSI$F.dDM*}L%sţv LƼLIʹ(ʼV{ݑʼ֑TNVQ1pUL"uhNӧQQOjδ쪦ѽXtNOMI30Ij]c!=֨Y∸H'7]5ࢫ:wpoVw4fP-l)}ÅzMNT[E>ԕ)qw%z7#cjEL}KɥlP3zt'OD'bt],;.e%R8Twgʍjb"&uP=QQӧ I\NNAC =LLDǮk<ɿQpsc}kjv׌;xt D*VMEJNǻw99/[7lsMo/j}Jrf5Bi0'riL[C#rzѰ*V tzr/_e-|Dצ(v J]ml#7L =RbyUSuMf=cN75x+](qڴU5 `Ѵ4êpcO.\7iOۑ'z`3FT<8VY)$k$ Xiɛ޺՗eQlb26&u^7* Tb`ֵ}ɱlJ F-g@&:'A\ckh5 t4x,:8=i}ɭ=j)U"*Ի22R˄u8M`CM I]Fp((*k~xiWv:7S'i{g|πFR--(,;Ȑt kսyṗgPSٔPR Fu^U]'= reeZ4s5<Y'J'stu-o"Uk2""y$9ɤůyJ,Gh[ݰ,yQeo]ŕZ>ѧb̥jk\1UEjTO"}I{CZ +"-jG':BUީs"NjdRYׇ9aFI5LUTlmSl|Scb fpT~w{:gjbl-̬ѻ oH o/F3e~4wERPoN>EVL"9<8yu6x5*sv6ŭ;U"FG i,""*<GAC 49buXj[qVj5DЈ!dT4{L&i4ϕsyUq6}ɥ)eS;C wOݓP%KWgQlS(SP*N∩Ƙ'U9tl_))|*&+5G5QQstSX4nDŏjEL٥kfj+,|u^5jLZ}#)mYVRЧЮ0gYHL{V5gEB+Ո$\\;ܽPxJeV|R%lITL|{kJбQWh|jj*)q^b֯m/dWd|\p%v^-Ueթ]4r򹩏͑9=*h{D[u;&,(IM`㏫\?{^OB4TE>YLL0YTZzGMAEF ,žE=hZ򓓺owx@}2ٿ{ehs|_Lo|wT(Sq[M)ҶbYȓ:T*a$sT^0JVE#gUHVޗ}DtXTCtjk*tLQgkgLqBD C=O!SX8OfOWMg,ze:בɘJȴ,k̒7jc3zt)#Hy]4v<{#jF36 ʵR'8IZ ΩrQѱIJ\B`el#HT2.Pqo1bu#lb ӬT爑.Lf3KϝN5ʋ.% m/Ⱥ|rYh}DFGUrDDLUO\"9S:*kFJ:sHeLU1Lqìb>NOC-].UVQ%Eύˁî)ȘDkֵ3""fD>?qVsJҏ/i|tDJq8sKBBWx>jǓ~)+W6["Z]  E8rN1wAo8 3e~4ьl߽ƨQm7ԧ&.T(S˯ZKaL#b* N>UXnY5=_ _sN/3,hw>79Z*](PO7eeUc|d"驦ez1N5Si[. mw/uq(BtIX%ճ#;H291-3;+7Tajr!Kk[oU[=,,űei,W9qUUZ="\:#bs-Ki:`ip;nuil y;KyT"rMm W.dDT.U,9db͋ o/ YdWM3{rUUҧ[*[Vij JB\S-N5Ne>Ax^ftibuc}db[\ZVډhUϠxUr-z<6+qsˊKE[}Lș>y)&4VKriEC_ɫv+zeJ`ٙNγF8w2["؍)U"82%0NaBf[N`OvNG`DJV5b:%(h=kڪjTT҇Ҳ$#kQ#D雡a3楕T1r`sEY5'}7 lɧZ)]V(v('k}rg$*mw4\q\ΓOO ,,bGmF̈qU8,1A:pwd}>舉fD|q"@}2ٿ{ehs|_Lo|wT(Sq[M)&r!e]QO%RW:G/'kdcV$4X>6cQ0\v!J+.&Ojɛ UZ8᚜y-vG'v[-WAY85Ta=)w=ͦÉ@ElF.J :2X"E>W'kd8KvI Y|$UVM(1LQ]|+O|ET\S2|l1hj$tR.쪕}U"G9͠9&I1 [9=fqj$"wӑNe(5(eFakd=g+o=™QhcrFQȨYefצ };[),#}3QY?2B\<\3|~b}C[ իFv &+$r+!ӣkQ1O 'Q)K:jGN7G'4Զ [Qi*fLzmkX"5B&d>Ok>\DkZFD̈||8s|_Lo|1-_9 -j}J`V֦giO48-:IxN.^KRM$F>@TVLS34+;Bu(8P%-f|Ữ3`J(UODЌ^o]/G|U *Ǯu6s|_Loټ1-_9 -j}JpWHDԮcyhZ̤}Jص4hcWGM2AuF{$` V0T\T|>l|lq.{DÙM,6DNL&z^z6-YU5 i&sS$urIݓ`p>@g7fi}2ٿ{e߻PoNL]ƨQm7ԧ*˛ lUQ7 jWSB?7&ͦ۲)>Jpצ1Fϩ$oHEN''"dlЭ#̨> | ^@Xk_izѮ-COIlb:FL Mɳ))ƙ׍].^֕Em [5U긱ps|_Lo|1-_9q[M) -.R.PS`#MtֹX*MufV5.c{W2W']T-K"اZzFWh{WgZT*4S4NP*k;woTd>,/XczikZY;| TH@J"|VEuT1zF']T.[5fwfPTMCDӇTU:eMe&U,XYdNd'24ʝ3d:9\m`|0o/F3e~45Bi16GԔu+y {ZʺJ{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Q{5Uh[Oܮjp']5UcMuz'i{|F7slGC*Mbdԗ_OLEOյ_ycS):'i{|F7sĘ/ 9=]NZOkv ߣh,p(==N{n'Q9Tro:O(wFD=7to|`>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM}2ٿ{eYtO(wF;յlF1T+%\(cp''2|''| >O| | | >>>O>O|>||i> endstream endobj 1 0 obj <>stream 2014-05-14T21:14:07+02:00 2014-05-14T21:13:01+02:00 2014-05-14T21:14:07+02:00 Adobe Acrobat 10.0 application/pdf uuid:9cb91169-7cbd-f84f-b1db-2ddbe477f4c4 uuid:ccc87a8c-c8d3-f143-b142-fbf798839731 Adobe Acrobat 10.0 Image Conversion Plug-in endstream endobj 2 0 obj <>stream h2U0Pw/+Q0L)T$w endstream endobj 3 0 obj <>stream h2S0Pw.JM,sI,Ip2204105412446060R70Pׄ/pLOJUpL.OJ,Q043Olb`PRMgnbzs~^YjQ1 9麙yvv7. endstream endobj 4 0 obj <>/Filter/FlateDecode/ID[<295E44FDAE254B2AA171513D3A17C178>]/Info 6 0 R/Length 37/Root 8 0 R/Size 7/Type/XRef/W[1 2 0]>>stream hbb```bܪ[ ķm , endstream endobj startxref 116 %%EOF timeSeries/vignettes/colorTableFig.pdf0000644000176000001440000004400112407026777017645 0ustar ripleyusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20101228123754) /ModDate (D:20101228123754) /Title (R Graphics Output) /Producer (R 2.12.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 5 0 obj << /Type /Page /Parent 3 0 R /Contents 6 0 R /Resources 4 0 R >> endobj 6 0 obj << /Length 7 0 R >> stream 1 J 1 j q Q q BT 0.000 0.000 0.000 rg /F3 1 Tf 14.00 0.00 -0.00 14.00 160.63 397.45 Tm [(T) 80 (ab) 10 (le of Color Codes)] TJ ET Q q 59.04 73.44 342.72 299.52 re W n BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 331.40 Tm (0) Tj ET 66.33 301.00 m 77.13 301.00 l 77.13 311.80 l 66.33 311.80 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 303.59 Tm (1) Tj ET 1.000 0.000 0.000 rg 66.33 273.27 m 77.13 273.27 l 77.13 284.07 l 66.33 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 275.85 Tm (2) Tj ET 0.000 0.804 0.000 rg 66.33 245.53 m 77.13 245.53 l 77.13 256.33 l 66.33 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 248.20 Tm (3) Tj ET 0.000 0.000 1.000 rg 66.33 217.80 m 77.13 217.80 l 77.13 228.60 l 66.33 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 220.39 Tm (4) Tj ET 0.000 1.000 1.000 rg 66.33 190.07 m 77.13 190.07 l 77.13 200.87 l 66.33 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 192.79 Tm (5) Tj ET 1.000 0.000 1.000 rg 66.33 162.33 m 77.13 162.33 l 77.13 173.13 l 66.33 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 165.00 Tm (6) Tj ET 1.000 1.000 0.000 rg 66.33 134.60 m 77.13 134.60 l 77.13 145.40 l 66.33 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 137.25 Tm (7) Tj ET 0.745 0.745 0.745 rg 66.33 106.87 m 77.13 106.87 l 77.13 117.67 l 66.33 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 109.53 Tm (8) Tj ET 66.33 79.13 m 77.13 79.13 l 77.13 89.93 l 66.33 89.93 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 81.80 Tm (9) Tj ET 1.000 0.000 0.000 rg 95.18 328.73 m 105.98 328.73 l 105.98 339.53 l 95.18 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 331.40 Tm (10) Tj ET 0.000 0.804 0.000 rg 95.18 301.00 m 105.98 301.00 l 105.98 311.80 l 95.18 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 303.59 Tm (11) Tj ET 0.000 0.000 1.000 rg 95.18 273.27 m 105.98 273.27 l 105.98 284.07 l 95.18 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 275.85 Tm (12) Tj ET 0.000 1.000 1.000 rg 95.18 245.53 m 105.98 245.53 l 105.98 256.33 l 95.18 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 248.20 Tm (13) Tj ET 1.000 0.000 1.000 rg 95.18 217.80 m 105.98 217.80 l 105.98 228.60 l 95.18 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 220.39 Tm (14) Tj ET 1.000 1.000 0.000 rg 95.18 190.07 m 105.98 190.07 l 105.98 200.87 l 95.18 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 192.73 Tm (15) Tj ET 0.745 0.745 0.745 rg 95.18 162.33 m 105.98 162.33 l 105.98 173.13 l 95.18 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 165.00 Tm (16) Tj ET 95.18 134.60 m 105.98 134.60 l 105.98 145.40 l 95.18 145.40 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 137.19 Tm (17) Tj ET 1.000 0.000 0.000 rg 95.18 106.87 m 105.98 106.87 l 105.98 117.67 l 95.18 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 109.53 Tm (18) Tj ET 0.000 0.804 0.000 rg 95.18 79.13 m 105.98 79.13 l 105.98 89.93 l 95.18 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 81.80 Tm (19) Tj ET 0.000 0.000 1.000 rg 124.03 328.73 m 134.83 328.73 l 134.83 339.53 l 124.03 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 331.40 Tm (20) Tj ET 0.000 1.000 1.000 rg 124.03 301.00 m 134.83 301.00 l 134.83 311.80 l 124.03 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 303.59 Tm (21) Tj ET 1.000 0.000 1.000 rg 124.03 273.27 m 134.83 273.27 l 134.83 284.07 l 124.03 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 275.85 Tm (22) Tj ET 1.000 1.000 0.000 rg 124.03 245.53 m 134.83 245.53 l 134.83 256.33 l 124.03 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 248.20 Tm (23) Tj ET 0.745 0.745 0.745 rg 124.03 217.80 m 134.83 217.80 l 134.83 228.60 l 124.03 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 220.39 Tm (24) Tj ET 124.03 190.07 m 134.83 190.07 l 134.83 200.87 l 124.03 200.87 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 192.73 Tm (25) Tj ET 1.000 0.000 0.000 rg 124.03 162.33 m 134.83 162.33 l 134.83 173.13 l 124.03 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 165.00 Tm (26) Tj ET 0.000 0.804 0.000 rg 124.03 134.60 m 134.83 134.60 l 134.83 145.40 l 124.03 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 137.19 Tm (27) Tj ET 0.000 0.000 1.000 rg 124.03 106.87 m 134.83 106.87 l 134.83 117.67 l 124.03 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 109.53 Tm (28) Tj ET 0.000 1.000 1.000 rg 124.03 79.13 m 134.83 79.13 l 134.83 89.93 l 124.03 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 81.80 Tm (29) Tj ET 1.000 0.000 1.000 rg 152.88 328.73 m 163.68 328.73 l 163.68 339.53 l 152.88 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 331.40 Tm (30) Tj ET 1.000 1.000 0.000 rg 152.88 301.00 m 163.68 301.00 l 163.68 311.80 l 152.88 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 303.66 Tm (31) Tj ET 0.745 0.745 0.745 rg 152.88 273.27 m 163.68 273.27 l 163.68 284.07 l 152.88 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 275.93 Tm (32) Tj ET 152.88 245.53 m 163.68 245.53 l 163.68 256.33 l 152.88 256.33 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 248.20 Tm (33) Tj ET 1.000 0.000 0.000 rg 152.88 217.80 m 163.68 217.80 l 163.68 228.60 l 152.88 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 220.46 Tm (34) Tj ET 0.000 0.804 0.000 rg 152.88 190.07 m 163.68 190.07 l 163.68 200.87 l 152.88 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 192.73 Tm (35) Tj ET 0.000 0.000 1.000 rg 152.88 162.33 m 163.68 162.33 l 163.68 173.13 l 152.88 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 165.00 Tm (36) Tj ET 0.000 1.000 1.000 rg 152.88 134.60 m 163.68 134.60 l 163.68 145.40 l 152.88 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 137.26 Tm (37) Tj ET 1.000 0.000 1.000 rg 152.88 106.87 m 163.68 106.87 l 163.68 117.67 l 152.88 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 109.53 Tm (38) Tj ET 1.000 1.000 0.000 rg 152.88 79.13 m 163.68 79.13 l 163.68 89.93 l 152.88 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 81.80 Tm (39) Tj ET 0.745 0.745 0.745 rg 181.73 328.73 m 192.53 328.73 l 192.53 339.53 l 181.73 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 331.40 Tm (40) Tj ET 181.73 301.00 m 192.53 301.00 l 192.53 311.80 l 181.73 311.80 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 303.59 Tm (41) Tj ET 1.000 0.000 0.000 rg 181.73 273.27 m 192.53 273.27 l 192.53 284.07 l 181.73 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 275.85 Tm (42) Tj ET 0.000 0.804 0.000 rg 181.73 245.53 m 192.53 245.53 l 192.53 256.33 l 181.73 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 248.20 Tm (43) Tj ET 0.000 0.000 1.000 rg 181.73 217.80 m 192.53 217.80 l 192.53 228.60 l 181.73 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 220.39 Tm (44) Tj ET 0.000 1.000 1.000 rg 181.73 190.07 m 192.53 190.07 l 192.53 200.87 l 181.73 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 192.73 Tm (45) Tj ET 1.000 0.000 1.000 rg 181.73 162.33 m 192.53 162.33 l 192.53 173.13 l 181.73 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 165.00 Tm (46) Tj ET 1.000 1.000 0.000 rg 181.73 134.60 m 192.53 134.60 l 192.53 145.40 l 181.73 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 137.19 Tm (47) Tj ET 0.745 0.745 0.745 rg 181.73 106.87 m 192.53 106.87 l 192.53 117.67 l 181.73 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 109.53 Tm (48) Tj ET 181.73 79.13 m 192.53 79.13 l 192.53 89.93 l 181.73 89.93 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 81.80 Tm (49) Tj ET 1.000 0.000 0.000 rg 210.58 328.73 m 221.38 328.73 l 221.38 339.53 l 210.58 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 331.40 Tm (50) Tj ET 0.000 0.804 0.000 rg 210.58 301.00 m 221.38 301.00 l 221.38 311.80 l 210.58 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 303.66 Tm (51) Tj ET 0.000 0.000 1.000 rg 210.58 273.27 m 221.38 273.27 l 221.38 284.07 l 210.58 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 275.93 Tm (52) Tj ET 0.000 1.000 1.000 rg 210.58 245.53 m 221.38 245.53 l 221.38 256.33 l 210.58 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 248.20 Tm (53) Tj ET 1.000 0.000 1.000 rg 210.58 217.80 m 221.38 217.80 l 221.38 228.60 l 210.58 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 220.46 Tm (54) Tj ET 1.000 1.000 0.000 rg 210.58 190.07 m 221.38 190.07 l 221.38 200.87 l 210.58 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 192.79 Tm (55) Tj ET 0.745 0.745 0.745 rg 210.58 162.33 m 221.38 162.33 l 221.38 173.13 l 210.58 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 165.00 Tm (56) Tj ET 210.58 134.60 m 221.38 134.60 l 221.38 145.40 l 210.58 145.40 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 137.32 Tm (57) Tj ET 1.000 0.000 0.000 rg 210.58 106.87 m 221.38 106.87 l 221.38 117.67 l 210.58 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 109.53 Tm (58) Tj ET 0.000 0.804 0.000 rg 210.58 79.13 m 221.38 79.13 l 221.38 89.93 l 210.58 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 81.80 Tm (59) Tj ET 0.000 0.000 1.000 rg 239.42 328.73 m 250.22 328.73 l 250.22 339.53 l 239.42 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 331.40 Tm (60) Tj ET 0.000 1.000 1.000 rg 239.42 301.00 m 250.22 301.00 l 250.22 311.80 l 239.42 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 303.66 Tm (61) Tj ET 1.000 0.000 1.000 rg 239.42 273.27 m 250.22 273.27 l 250.22 284.07 l 239.42 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 275.93 Tm (62) Tj ET 1.000 1.000 0.000 rg 239.42 245.53 m 250.22 245.53 l 250.22 256.33 l 239.42 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 248.20 Tm (63) Tj ET 0.745 0.745 0.745 rg 239.42 217.80 m 250.22 217.80 l 250.22 228.60 l 239.42 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 220.46 Tm (64) Tj ET 239.42 190.07 m 250.22 190.07 l 250.22 200.87 l 239.42 200.87 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 192.73 Tm (65) Tj ET 1.000 0.000 0.000 rg 239.42 162.33 m 250.22 162.33 l 250.22 173.13 l 239.42 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 165.00 Tm (66) Tj ET 0.000 0.804 0.000 rg 239.42 134.60 m 250.22 134.60 l 250.22 145.40 l 239.42 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 137.26 Tm (67) Tj ET 0.000 0.000 1.000 rg 239.42 106.87 m 250.22 106.87 l 250.22 117.67 l 239.42 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 109.53 Tm (68) Tj ET 0.000 1.000 1.000 rg 239.42 79.13 m 250.22 79.13 l 250.22 89.93 l 239.42 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 81.80 Tm (69) Tj ET 1.000 0.000 1.000 rg 268.27 328.73 m 279.07 328.73 l 279.07 339.53 l 268.27 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 331.40 Tm (70) Tj ET 1.000 1.000 0.000 rg 268.27 301.00 m 279.07 301.00 l 279.07 311.80 l 268.27 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 303.59 Tm (71) Tj ET 0.745 0.745 0.745 rg 268.27 273.27 m 279.07 273.27 l 279.07 284.07 l 268.27 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 275.85 Tm (72) Tj ET 268.27 245.53 m 279.07 245.53 l 279.07 256.33 l 268.27 256.33 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 248.20 Tm (73) Tj ET 1.000 0.000 0.000 rg 268.27 217.80 m 279.07 217.80 l 279.07 228.60 l 268.27 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 220.39 Tm (74) Tj ET 0.000 0.804 0.000 rg 268.27 190.07 m 279.07 190.07 l 279.07 200.87 l 268.27 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 192.79 Tm (75) Tj ET 0.000 0.000 1.000 rg 268.27 162.33 m 279.07 162.33 l 279.07 173.13 l 268.27 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 165.00 Tm (76) Tj ET 0.000 1.000 1.000 rg 268.27 134.60 m 279.07 134.60 l 279.07 145.40 l 268.27 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 137.25 Tm (77) Tj ET 1.000 0.000 1.000 rg 268.27 106.87 m 279.07 106.87 l 279.07 117.67 l 268.27 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 109.53 Tm (78) Tj ET 1.000 1.000 0.000 rg 268.27 79.13 m 279.07 79.13 l 279.07 89.93 l 268.27 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 81.80 Tm (79) Tj ET 0.745 0.745 0.745 rg 297.12 328.73 m 307.92 328.73 l 307.92 339.53 l 297.12 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 331.40 Tm (80) Tj ET 297.12 301.00 m 307.92 301.00 l 307.92 311.80 l 297.12 311.80 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 303.66 Tm (81) Tj ET 1.000 0.000 0.000 rg 297.12 273.27 m 307.92 273.27 l 307.92 284.07 l 297.12 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 275.93 Tm (82) Tj ET 0.000 0.804 0.000 rg 297.12 245.53 m 307.92 245.53 l 307.92 256.33 l 297.12 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 248.20 Tm (83) Tj ET 0.000 0.000 1.000 rg 297.12 217.80 m 307.92 217.80 l 307.92 228.60 l 297.12 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 220.46 Tm (84) Tj ET 0.000 1.000 1.000 rg 297.12 190.07 m 307.92 190.07 l 307.92 200.87 l 297.12 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 192.73 Tm (85) Tj ET 1.000 0.000 1.000 rg 297.12 162.33 m 307.92 162.33 l 307.92 173.13 l 297.12 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 165.00 Tm (86) Tj ET 1.000 1.000 0.000 rg 297.12 134.60 m 307.92 134.60 l 307.92 145.40 l 297.12 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 137.26 Tm (87) Tj ET 0.745 0.745 0.745 rg 297.12 106.87 m 307.92 106.87 l 307.92 117.67 l 297.12 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 109.53 Tm (88) Tj ET 297.12 79.13 m 307.92 79.13 l 307.92 89.93 l 297.12 89.93 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 81.80 Tm (89) Tj ET 1.000 0.000 0.000 rg 325.97 328.73 m 336.77 328.73 l 336.77 339.53 l 325.97 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 331.40 Tm (90) Tj ET 0.000 0.804 0.000 rg 325.97 301.00 m 336.77 301.00 l 336.77 311.80 l 325.97 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 303.66 Tm (91) Tj ET 0.000 0.000 1.000 rg 325.97 273.27 m 336.77 273.27 l 336.77 284.07 l 325.97 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 275.93 Tm (92) Tj ET 0.000 1.000 1.000 rg 325.97 245.53 m 336.77 245.53 l 336.77 256.33 l 325.97 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 248.20 Tm (93) Tj ET 1.000 0.000 1.000 rg 325.97 217.80 m 336.77 217.80 l 336.77 228.60 l 325.97 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 220.46 Tm (94) Tj ET 1.000 1.000 0.000 rg 325.97 190.07 m 336.77 190.07 l 336.77 200.87 l 325.97 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 192.73 Tm (95) Tj ET 0.745 0.745 0.745 rg 325.97 162.33 m 336.77 162.33 l 336.77 173.13 l 325.97 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 165.00 Tm (96) Tj ET 325.97 134.60 m 336.77 134.60 l 336.77 145.40 l 325.97 145.40 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 137.26 Tm (97) Tj ET 1.000 0.000 0.000 rg 325.97 106.87 m 336.77 106.87 l 336.77 117.67 l 325.97 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 109.53 Tm (98) Tj ET 0.000 0.804 0.000 rg 325.97 79.13 m 336.77 79.13 l 336.77 89.93 l 325.97 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 81.80 Tm (99) Tj ET Q endstream endobj 7 0 obj 17300 endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> >> endobj 8 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus ] >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 8 0 R >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 8 0 R >> endobj xref 0 11 0000000000 65535 f 0000000021 00000 n 0000000164 00000 n 0000017667 00000 n 0000017750 00000 n 0000000213 00000 n 0000000293 00000 n 0000017646 00000 n 0000017842 00000 n 0000017936 00000 n 0000018032 00000 n trailer << /Size 11 /Info 1 0 R /Root 2 0 R >> startxref 18134 %%EOF timeSeries/vignettes/timeSeriesPlot.Rnw0000644000176000001440000015272612461442310020075 0ustar ripleyusers%\VignetteIndexEntry{Plotting 'timeSeries' Objects} \documentclass[10pt,a4paper]{article} \usepackage{hyperref} \hypersetup{colorlinks,% citecolor=black,% linkcolor=blue,% urlcolor=darkgreen,% } \title{\bf Plotting 'timeSeries' Objects} \author{Diethelm W\"urtz and Tobias Setz\\ETH Zurich and Rmetrics Association Zurich} \date{May 12, 2014} \begin{document} \SweaveOpts{concordance=TRUE} \maketitle \tableofcontents \setlength{\parskip}{20pt} %\SweaveOpts{strip.white=FALSE} \setkeys{Gin}{width=0.9\textwidth} % plot.ts <- function ( % x, y = NULL, plot.type = c("multiple", "single"), % xy.labels, xy.lines, panel = lines, nc, % yax.flip = FALSE, % mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), % oma.multi = c(6, 0, 5, 0), axes = TRUE, ...) % plot.zoo <- function ( % x, y = NULL, screens, plot.type, panel = lines, % xlab = "Index", ylab = NULL, main = NULL, % xlim = NULL, ylim = NULL, % xy.labels = FALSE, xy.lines = NULL, % yax.flip = FALSE, % oma = c(6, 0, 5, 0), % mar = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), % col = 1, lty = 1, lwd = 1, pch = 1, type = "l", log = "", % nc, widths = 1, heights = 1, ...) % plot.xts <- function ( % x, y = NULL, type = "l", auto.grid = TRUE, % major.ticks = "auto", minor.ticks = TRUE, major.format = TRUE, % bar.col = "grey", candle.col = "white", % ann = TRUE, axes = TRUE, ...) % .plot.timeSeries <-function( % x, y, FinCenter = NULL, type = NULL, plot.type = c("multiple", "single"), % format = "auto", at = c("chic", "pretty"), % col, pch, cex, lty, lwd, % grid = FALSE, frame.plot = TRUE, panel = lines, % axes = TRUE, ann = TRUE, cex.axis = 1, cex.lab = 1, % yax.flip = FALSE, % mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), % oma.multi = c(7.75, 1.1, 6.1, 1.1), % ...) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 1 \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Introduction} The Rmetrics \texttt{timeDate} and \texttt{timeSeries} packages are workhorses to deal with chronological objects. Since their inception 2009 under their original names \texttt{fCalendar} and \texttt{fSeries} they have been only slightly modified. With version R 3.1. we have essentially improved the \texttt{plot} function, but we also took care that the functionality is almost upward compatible. In this vignette we show how to work with the recently updated S4 generic plot function \texttt{plot}. The function is written to display Rmetrics S4 \texttt{timeSeries} objects. The basic functionality of the \texttt{plot} function is to display single and multiple views on univariae and multivariate \texttt{timeSeries} objects. The function \texttt{plot.ts} from R's base environment, which displays basic \texttt{ts} time series objects, served as a model for our design of the generic S4 \texttt{plot} function for \texttt{timeSeries} objects. Similarily, \texttt{plot.ts} can be considered as the prototype for the S3 \texttt{plot.zoo} method. The \texttt{xts} plot function was build to display univariate \texttt{xts} time series objects which inherit from \texttt{zoo}'s objects for ordered time series objects. The generic S4 time series plotting function can dispay \emph{univariate} and \emph{multivariate} time series in \emph{single} and \emph{multiple} frames. The plots can be tailored with respect to several viewing components: colors (col), line types (lty), plot symbols (pch), line widths (lwd), symbol sizes (cex), axis layout (pretty, chic, tailored), minor tick mark appearence, font styles and font sizes, frame positioning (mar, oma), as well as tailored panel functions (panel). \noindent\emph{General Plot Settings and Design Apects}: \noindent\emph{Plot Type}: Univariate time series are displayed by default in \texttt{plot.type="single"} frames, multivariate time series are displayed by default in \texttt{plot.type="multiple"} frames. The default line style for a plot is \texttt{type ="l"} is drawn with "lines". \noindent\emph{Time Axis Layout}: For the time axis layout the function \texttt{pretty} determines in an automative way the \texttt{at="pretty"} positions of the ticks. The \texttt{format="auto"} is extracted from the time stamps of the time series object or can be overwritten by the user with a POSIX format string. Alternatively, one can select \texttt{"chic"} to generate time axis styles. We called this method "chic" to give reference to the underlying function \texttt{axTicksByTime} from the Chicago \texttt{xts} package which generates tick positions and axis labels. Furthermore, a "tailored" method can be applied which allows for fully arbitrary user defined positions and formatted labels. Minor ticks can be added in several fashions. \noindent\emph{Annotations}: The annotations of the plots are reduced to the y-label. These are taken by default from the column names of the time series object. This gives the user the freedom to have full control about his views how the plot should be look like. Note, multivariate time series in single plots show the string \texttt{"Values"} as label on the y-axis. Main title, sub title, and the x-label on the time axis are not shown by default. We prefer and recommend to add these decorations calling the function \texttt{title}. This allows also much more flexibility compared to passing the arguments through the plot functions. All default annotations (including the y-label) can be suppressed setting the plot function argument to \texttt{ann=FALSE}. The argument \texttt{axes=FALSE} suppresses to draw both axes on the plot frame. \noindent\emph{Decorations}: There are several options to decorate the plot: These include colors (col), plotting symbols (pch), scaling factor of plotting characters and symbols (cex), line types (lty), and lindwidths (lwd). Note, all these parameters may be vectors of the same length as the number of time series, so that each series can be addressed to its own individual style, color, and size. A grid and the plot frame (box) can be added or suppresse specifying the arguments \texttt{grid} and \texttt{frame.plot} in the argument list of the \texttt{plot} function. \noindent\emph{Panel Function}: In the case of multiple plots the plot frames, are also called \emph{panels}. By default in each panel the appropriate curve is drawn calling R's \texttt{lines} function \texttt{panel=lines}. This function can be replaced by a user defined function. This offers a wide range of new views on your time series. So for example yo can show zero or any other reference lines on the panels, or you can add rugs to (return) charts, or you can add for an example an EMA indicator (or any other kind of indicator) to curves shown in individual panels. \noindent\emph{Example "timeSeries" Objects}: To demonstrate the wide range of options to dispaly S4 \texttt{timeSeries} objects, we use the the daily index values from the Swiss Pension Fund Benchmark \emph{LPP2005}. The time series is part of the \texttt{timeSeries} package. For this we have introduced some abbreviations: <>= Sys.setlocale("LC_ALL", "C") @ <>= require(timeSeries) require(xts) require(PerformanceAnalytics) require(fTrading) tS1 <- 100 * cumulated(LPP2005REC[, 1]) # SBI (univariate) tS2 <- 100 * cumulated(LPP2005REC[, 1:2]) # SBI & SPI (bivariate) tS3 <- 100 * cumulated(LPP2005REC[, 1:3]) # SBI, SPI, SWIIT (Swiss Market) tS6 <- 100 * cumulated(LPP2005REC[, 1:6]) # Swiss and Foreign Market Indexes @ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 2 \newpage\thispagestyle{empty}\mbox{} \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Standard Time Series Plots} The \texttt{plot} function from the \texttt{timeSeries} package allows for five different views on standard plot layouts. These include \begin{itemize} \item Univeriate single plots \item Multivariate single plots \item One column multiple plots \item Two column multiple plots \item Scatter plots \end{itemize} \noindent The only argument we have to set is the \texttt{plot.type} parameter to determine the layout of the plot. The default value is \texttt{"multiple"}, and the alternative value is \texttt{"single"}. The arguments can be abbreviated as \texttt{"m"} or \texttt{"s"}, respectively. \noindent \emph{Univariate Single Plots} were designed to plot univariate \texttt{timeSeries} objects in one single graph frame. Nothing then the \texttt{timeSeries} object has to be specified, the \texttt{plot.type} is forced to \texttt{"s"}. \noindent \emph{Multivariate Single Plots} will be used when a set of multivariate \texttt{timeSeries} objects should be drawn in one common data frame. For this argument the vlue \texttt{plot.type="s"} has to be specified. \noindent \emph{One Column Multiple Plots} display multivariate \texttt{timeSeries} objects, such that each series is plotted in its own frame. Up to four series, the frames are displayed in one column, for more series the frames are arranged in a two colum column display. \noindent \emph{Two Column Multiple Plots} handel the case of more than four \texttt{timeSeries} objects. Then the the series are displayed in two colums. In total, the number of rows is not restricted. % ---------------------------------------------------------------------------- \pagebreak \subsection{Univariate Single Plots} The most simple time series plot shows an univariate curve in a single plot. The axis is designed from "pretty" positions calculated from R's base function \texttt{pretty}. The labels are printed in the ISO 8601 standard date/time format. <>= par(mfrow=c(1, 1)) plot(tS1) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The chart shows an univariate time series (here the Swiss Bond Index) in a single frame. For all plot options default values have been chosen. You can decorate the plot, making it more conveniant to your needs, e.g.: change the color (col), add a main title and x-label calling the function \texttt{title}, or remove the grid lines setting the argument \texttt{grid=FALSE}. You can also design the minor tick marks, setting instead of the value \texttt{"auto"} oe of the following spreads: \texttt{"day"}, the default, \texttt{"week"}, or \texttt{"month"}. } \end{figure} \end{center} % ---------------------------------------------------------------------------- \pagebreak \subsection*{} Tow other plot function implementations for \texttt{xts} time series objects can be found in the contributesd R packages \texttt{xts} and \texttt{PerformanceAnalytics}. Let us compare how they generate plot positions and time label formats. \vspace{-0.3cm} <>= require(PerformanceAnalytics) par(mfrow=c(3, 1)) xts::plot.xts(as.xts(tS1)) PerformanceAnalytics::chart.TimeSeries(as.xts(tS1)) plot(tS1) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The group of the three charts shows an univariate time series in a single frame for the plot functions as implemented in the packages \texttt{xts}, \texttt{PerformanceAnalytics}, and \texttt{timeSeries}. For example in the case of daily time series records \texttt{xts} uses U.S. style labels whereas \texttt{PerformanceAnalytics} and \texttt{timeSeries} use ISO standard date labels \texttt{YYYY-mm-dd}. The plot decorations are those from default settings.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Multivariate Single Plots} Multivariate time series plots in a single panel are constructed by default in the way that the first curve is plotted calling the function \texttt{plot} and the remaining curves by calling the function \texttt{lines}. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="s") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This chart shows a multivariate time series in a single frame. Note, we have to set the argument \texttt{plot.type="s"}. Again, for all plot options the default settings have been used. You can decorate the plot, making it more conveniant to your needs, e.g.: change the color vector (col), add a main title and x-label calling the function \texttt{title}, or remove grid lines setting the argument \texttt{grid=FALSE}. Note, to change the color settings you can set the argument \texttt{col=1:3} which would result in "black", "red", "green" for the three curves, or you can just set the colors by name, or selecting them from a color palette.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection*{} Now let us compare the plot function from the \texttt{timeSeries} package with the \texttt{chart.TimeSeries} plotting function from the \texttt{PerformanceAnalytics} function. (Note, the \texttt(xts) has no multivariate plot function implemented.) <>= par(mfrow=c(2, 1)) require(PerformanceAnalytics) PerformanceAnalytics::chart.TimeSeries(as.xts(tS3)) plot(tS3, plot.type="s") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The two charts show a multivariate time series plotted in a single frame. We use for the plot the functions as implemented in the packages \texttt{PerformanceAnalytics}, and \texttt{timeSeries}.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Multiple Plots} Multiple plots enormously simplify the display of different curves in multiple panels. These are the ideal plots when it comes to the task to create a quick overview over several time series. Multiple plotting is exclusive to \texttt{timeSeries} objects, \texttt(xts) and \texttt{PerformanceAnalytics} offer no multiple plotting tool. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{As long as we plot less than 4 time series in a multivariate frame, we get a one column layout. Annotations show by default only the y-labels which are taken from the colmun names of the time series to be drawn. Feel free to add main title, sub title, and x-label calling the function \texttt{title}}. \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection*{} For more than four curves the frames of the plot design are arranged in two columns. <>= par(mfrow=c(1, 1)) plot(tS6, plot.type="m") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The graph shows the layout how it is created for six curves. There are two columns with three panels to the left and also three panels to the right. Note, it is easily possible to adapt the margin sizes and the gap between the two columns of plots calling the function \texttt{mar} and \texttt{oma}.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection*{} If you like a design with a small gap between the panel rows, you can modify the \texttt{mar} parameter to introduce a small gap, here with a width of 0.3. Feel free to modify it. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", mar=c(gap=0.3, 5.1, gap=0.3, 2.1)) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{One can use in a multiple plot the \texttt{mar} parameter setting to create a small gap between the rows of the individual charts. This lets a plot look more elegant.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Combining Single Plots} You can also create your own multiple panel plots. Just combine single panels in an array of rows and columns using the parameter settings for \texttt{mfrow}, \texttt{mfcol}, and \texttt{mar}. <>= par(mfrow=c(2, 1)) par(mar = c(bottom=1.5, 5.1, top=4, 2.1)) plot(tS2[, 1]) par(mar = c(bottom=4, 5.1, top=1.5, 2.1)) plot(tS2[, 2]) @ \begin{center} \begin{figure}[h] <>= <> @ \caption{One can use in single plots the \texttt{mfrow} and \texttt{mar} parameter settings to place single plots either row by row or column by column. Here, \texttt{mfrow} and \texttt{mfcol} to the job. In this case a vector of the form \texttt{c(nr, nc)} draws subsequent figures in an nr-by-nc array on the device by columns (mfcol) or rows (mfrow), respectively.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Layout of Single Plots} There is another option in R to create panel layouts, not necessarilly in an rectangular array. Have a look to the help page of the function \texttt{layout}, her comes a simple example. <>= nf <- layout(mat=matrix(c(1, 1, 2, 3), byrow = TRUE, nrow=2)) par(mar = c(bottom=2, 5.1, top=3, 2.1)) plot(tS3[, 1]) par(mar = c(bottom=3, 5.1, top=2, 1.1)) plot(tS3[, 2]) par(mar = c(bottom=3, 4.1, top=2, 2.1)) plot(tS3[, 3]) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{With the function \texttt{layout} you can devide the plot device in rows and columns expressed in matrix form defined by the argument \texttt{mat}. } \end{figure} \end{center} %To be more specific, the graph \texttt{i} is allocated a region composed %from a subset of these rows and columns, based on the rows and columns %in which \texttt{i} occurs in the matrix \texttt{mat}. %The argument \texttt{layout.show(n)} plots (part of) the current layout, %namely the outlines of the next \texttt{n} figures. % ----------------------------------------------------------------------------- \pagebreak \subsection*{} In addition widths and heights of the layout can be different from row to row, and/or from column to column. The sizes are expressed by the arguments \texttt{widths} and \texttt{heights} of the function \texttt{layout}. <>= nf <- layout(mat=matrix(c(1, 1, 2, 3), byrow=TRUE, nrow=2), heights=c(2.5,1)) par(mar = c(bottom=2, 5.1, top=3, 2.1)) plot(tS3[, 1]) par(mar = c(bottom=3, 5.1, top=1.5, 1.1)) plot(tS3[, 2]) par(mar = c(bottom=3, 4.1, top=1.5, 2.1)) plot(tS3[, 3]) @ \begin{center} \begin{figure}[h] <>= <> @ \caption{With the function \texttt{layout} one can also define the widths and heights of the columns and rows.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Bivariate Scatter Plots} For historical reasons, like in the function \texttt{plot.ts}, there is also the option to create an scatter plot from two univariaye time series. Since this is not a "true" time series plot, we will not go in further detail for this display. <>= par(mfrow=c(1,1)) plot(tS2[, 1], tS2[, 2]) @ \begin{center} \begin{figure}[h] <>= <> @ \caption{If \texttt(x) and \texttt(y) are univariate time series, then the plot function will display a scatter plot.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 3 \newpage\thispagestyle{empty}\mbox{} \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Time Axis Layout} The function \texttt{plot} comes with three options to design the time axis layout: \texttt{"pretty"}, \texttt{"chic"}, and \emph{} (note this not a string argument. \emph{} should just abbreviate that we have to input character strings of fully arbitray \texttt{at} positions. For the first two options the style of the axis annotation is generated in a fully automated way, whereas in the tailored case each tick on the axis to be user defined. \noindent The \emph{"pretty"} time axis layout is the default setting for the argument \texttt{at}. Internally the function \texttt{pretty} is used to compute a sequence of about \texttt{n+1} equally spaced round values which cover the range of the values in the time stamps \texttt{time(x)} of the series \texttt{x}. The values are chosen so that they are 1, 2 or 5 times a power of 10. \noindent The \emph{"chic"} time axis layout is the alternative setting for the argument \texttt{at}. Internally the function \texttt{axTicksByTime} from the package \texttt{xts} is used to compute the sequence of axis positions and the format labels. \noindent The \emph{} time axis layout leaves it to the user to specify by himself the positions (at), the time label formatting (format), and the minor tick marks (minor.ticks). % ----------------------------------------------------------------------------- \pagebreak \subsection{Time Axis: "pretty" or "chic"?} Our plotting function comes with two axis-styles. The first is called \texttt{"pretty"}, which is the default style, and calculates positions from R's base function \texttt{pretty}. The other is called \texttt{"chic"} to remember its origin, arising from the "Chicago" \texttt{xts} package. \vspace{-0.7cm} <>= par(mfcol = c(2, 1)) plot(tS1, at = "pretty") plot(tS1, at = "chic") @ \vspace{-0.3cm} \begin{center} \begin{figure}[h] <>= <> @ \caption{The graph shows the two flavours from the \texttt{at="pretty"} and the \texttt{"chic"} axis designs. The first style uses the function \texttt{pretty} from R's \texttt{base} environment to compute the positions for the major ticks. The second style uses the function \texttt{axTicksByTime} from the \texttt{xts} package to compute x-axis tick mark locations by time. In the upper graph the minor ticks are calendar days, whereas in the lower graph weekdays are drawn (therefore the small gaps between the minor ticks become visible). Note, the time series is in both cases an object of class \texttt{timeSeries}.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection*{} Now let us plot a multivariate 3-column time series in a single panel. Again we compare the outcome of the \texttt{"pretty"} and the \texttt{"chic"} axis style. <>= par(mfcol=c(2, 1)) plot(tS3, plot.type="s", at="pretty") plot(tS3, plot.type="s", at="chic") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The only difference of this graph compared to the previous is the fact that we consider here a multivariate time series. Three curves are shown in a common plot. Note, when using the \texttt{"chic"} style, then the vertical gridlines are narrower compared to the \texttt{"pretty"} style.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Time Axis - Selecting Minor Tick Marks} The \texttt{"pretty"} style allows to draw the minor tick marks on different time scales. These are: \texttt{"day"}, \texttt{"week"}, and \texttt{"month"}. <>= par(mfrow=c(3, 1)) plot(tS1, minor.ticks="day", at="pretty") plot(tS1, minor.ticks="week", at="pretty") plot(tS1, minor.ticks="month", at="pretty") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{It is worth to note that a good selection of minor tick marks makes a plot much better readable.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Time Axis - One Column Multiple Plot Layout} In the multiple plot layout the axis are drawn along the same principles as they are drawn in the case of the single plot layout. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", at="pretty") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows a one column multiple plot layout. The one column layout is generated for up to four time series. When the multivariate time series has more then four time series then a two column layout is displayed. It is up to you which axis style you prefer, \texttt{at="pretty"} or \texttt{at="chic".}} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Time Axis - Two Column Multiple Plot Layout} Concerning the style of the axis, there is now difference between the one and two column plot designs. <>= par(mfrow=c(1, 1)) plot(tS6, plot.type="m", at="chic") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{When we have more then four time series, then the display will be generated in two columns. Note, it is possible to modify the width of the gap between the two columns.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Tick and Format Layout: The axis style} The third alternative to style the axis offers the users to define format positions according to his preferences. Here comes an example: <>= par(mfrow=c(2, 1)) at <- paste0("200", c("6-01", "6-04", "6-07", "6-10", "7-01", "7-04"), "-01") plot(tS3, plot.type="s", format="%B\n%Y", at=at) plot(tS3, plot.type="s", format="%b/%y", at=at) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows plots with user tailored positions and formatted axis labels.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 4 \newpage\thispagestyle{empty}\mbox{} %\newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Annotations} Plot annotations are elelents which can be added to plots or completely discarded. To discard all annotations you have to set \texttt{ann=FALSE} in the argument list of the timSeries \texttt{plot} function. To display annotation you can call the function \texttt{title}. This allows to add the main title, the sub title, and the x- and y-labels to a plot. Together with the appropriate character strings, you can also specify the placement of these annotations by the arguments \texttt{line} and \texttt{outer}. There are additional functions to add annotations to a plot. These are \texttt{text} and \texttt{mtext}. % ----------------------------------------------------------------------------- \pagebreak \subsection{Discarding all Annotations} In a default plot we display only the value-label(s) which are taken from the units or column names of the time time series object. Title, sub title, and time-label are not shown. To discard the appearance of all annotations on a plot you have to set the plot argument \texttt{ann=FALSE}. <>= par(mfrow=c(2, 2)) plot(tS1, ann=FALSE) plot(tS3, plot.type="s", ann=FALSE, at="pretty") plot(tS6, plot.type="s", ann=FALSE, at="pretty") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows a plot where all annotations have been discarded. Now feel free to add your own annotations.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Adding Title and Labels} To add a main title, a sub, title, and x- and y-labels you can call the function \texttt{title}. <>= par(mfrow=c(2, 2)) plot(tS1); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index", xlab = "Date") plot(tS6, plot.type="s"); title(main = "Index", xlab = "Date") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph displays in a two by two array four single plots. We have added title and x-lable annotations.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Axis Font Size} Sometimes the axis font size may be considered as too small or too large. Then you can use the plot argument \texttt{cex.axis} to upsize or downsize the font. <>= par(mfrow=c(3, 1)) plot(tS3, at="chic", plot.type="s", cex.axis=0.75) plot(tS3, at="chic", plot.type="s", cex.axis=1.00) plot(tS3, at="chic", plot.type="s", cex.axis=1.25) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This is an example how to change the size of the axis labels relatively to its default value. The upper graph shows a font size decreased by 20\%, the lower graph a font size increased by 25\%. You can proceed in the same way when using the \texttt{"pretty"} axis style.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Flipping Value Axes} Flipping every second axis label in a multiple plot from left to rigth might be meaningful in the case when axis labels overwrite themselves. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", yax.flip = TRUE) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The graph shows an one column multiple plot, where the axis of the middle panel is flipped from the left to the right. Note, the same procedure can also be applied two two column multiple plots.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 5 \newpage\thispagestyle{empty}\mbox{} %\newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Decorations} There exist several options to decorate plots in different ways. Plot types (lines, points, horizontal bars, etc.) can be modified, colors can be changed, lines can be modified by style and seize, points can be selected by symbol and size. \noindent In the following we will give some examples \begin{itemize} \item Modifying Types \item Changing Colors by Names \item Changing Colors by Color Palettes \item Changing Line Styles \item Modifying Line Widths \item Changing Plot Symbols \item Modifying Plot Symbol Sizes \item Discarding Grid Lines \item Drawing a Box \end{itemize} \noindent to show a few of the many types of cdecorations. Play around to achieve your perfect layout. % ----------------------------------------------------------------------------- \pagebreak \subsection{Modifying Types} <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", type=c("l", "p", "h"), at="pretty") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{If we like to consider in a multiple plot for each panel its own plot style then we can set the parameter \texttt{type}.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Colors by Names} Colors can be changed in several ways. Just by their numbers, e.g. 1 (black), 2 (red), 3 (green) etc., or by name, e.g. "black", "red", "green", etc. or by using well designed color palettes. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=c("blue", "orange", "darkgreen")) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows how to assign colors by name in the case of a multiple plot. You can do it in the same way setting \texttt{plot.type="s"} if you like to display all three curves in a common single plot.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Colors by Color Palettes} When the number of curves increases, then it can become quite difficult to find a set of nice colors. In such cases it is convenient to select the colors from color palettes. <>= par(mfrow=c(1, 1)) plot(tS6, plot.type="s", col=heat.colors(n=6, alpha = 1), at="chic", format = "%B\n%Y") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows an example of six curves diplayed in a sequence of reds. For this we called the function \texttt{seqPalette}.} \end{figure} \end{center} \pagebreak \begin{verbatim} FUNCTION: COLOUR PALETTE rainbowPalette Contiguous rainbow colour palette heatPalette Contiguous heat colour palette terrainPalette Contiguous terrain colour palette topoPalette Contiguous topo colour palette cmPalette Contiguous cm colour palette greyPalette R's gamma-corrected gray palette timPalette Tim's MATLAB-like colour palette rampPalette Colour ramp palettes seqPalette Sequential colour brewer palettes divPalette Diverging colour brewer palettes qualiPalette Qualified colour brewer palettes focusPalette Red, green and blue focus palettes monoPalette Red, green and blue mono palettes \end{verbatim} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Line Styles} In multiple plot to each curve an own line style \texttt{lty} can be assigned: 0 "blank", 1 "solid", 2 "dashed", 3 "dotted", 4 "dotdash", 5 "longdash", or 6 "twodash". <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=1, lty=1:3, at="chic") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{When we like to print plots in black and white, then its makes much sense to use different line types so that we can distinguish the curves one from each other.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Modifying Line Widths} Not only the line type, but also the line width can be modified for each curve in an individual kind. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=1, lwd=3:1, at="chic") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The graph shows three line widths, the upper's curve width is thick, the middle's curve width is medium, and the lowest's curve width is the thinnest one.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Plot Symbols} To use different plot symbols we can assign them by the parameter \texttt{pch}. Don't forget also to set \texttt{type="p"}. %<>= %par(mfrow=c(1, 1)) %tS3weekly <- align(tS3, by="1w") %plot(tS3weekly, plot.type="s", type="p", col=1:3, pch=21:23, at="chic") %@ \medskip %\begin{center} %\begin{figure}[h] %<>= %<> %@ %\caption{This plot shows how to assign different plot symbols to the curves %in a single plot.} %\end{figure} %\end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Modifying Plot Symbol Sizes} The argument \texttt{cex.pch} allows to increase or decrease plot symbol sizes with respect to the current plot symbol size. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="s", type="p", col=1:3, pch=21:23, cex.pch=c(0.2, 0.2, 0.2), at="pretty") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This plot show how to change the size of plot symbols in a single plot setting the argument \texttt{cex.pch}. Note, for each curve its own size can be set. The same approach can be used also for multiple plots.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Discarding Grid Lines} By default grid lines are displayed. To discard the grid lines from the plot set the arguments \texttt{grid=FALSE}. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="s", grid=FALSE) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{By default a grid is drawn on top of the plot. You can remove it by setting the argument \texttt{grid=FALSE}} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Drawing a Box} <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="s", frame.plot=FALSE, grid=FALSE) box() box(bty = "7", col = "white") # boxL grid(NA, NULL, col = "darkgrey") # hgrid @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{By default the plots are displayed as frame plots. This means that the graphs are surrounded by a box. This box can be discarded setting the plot argument \texttt{frame.plot=FALSE}.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 6 \newpage\thispagestyle{empty}\mbox{} %\newpage\thispagestyle{empty}\mbox{} \pagebreak \section{The Panel Function} Multiple plots are very powerful plotting designs. Each panel in a graph can individually tailored by the user. By default each curve in a panel is generated by the function \texttt{lines}. You can define your own panel function(s) by setting the plot argument \texttt{panel} to a user dfined functions. In the following we will show three examples. % ----------------------------------------------------------------------------- \pagebreak \subsection{Adding a Horizental Zero Line} In this example we show how to write a panel function which allows to add a horizontal zero line to each plot panel. <>= par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, col=col) abline(h=0, col = "brown", lwd=2)} plot(returns(tS3), plot.type="m", col = .colorwheelPalette(3), panel=lines2, at="pretty") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{This multiple plot shows panels with curves having a horizontal zero reference line.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Adding an Rug to Multiple Return Plots} This example shows how to add in each panel rugs to the righ Y-axis. <>= par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, type="h", col=col) rug(Y, side=4, col="steelblue") } plot(returns(tS6), plot.type="m", col = .colorwheelPalette(6), panel=lines2, at="pretty") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{This multiple plot shows panels with rugs on the right Y-axis.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Adding an EMA to Multiple Index Plots} This example shows how to add an EMA indicator to each plot panel. The \texttt{emaTA()} function is provided by the \texttt{fTrading} package. <>= par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, type="l", col=col) lines(x=X, y=emaTA(Y), col="black") } plot(tS3, plot.type="m", col = .colorwheelPalette(3), panel=lines2, grid=TRUE, at="pretty") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{A multiple graph with EMA indicators in each panel.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 7 \newpage\thispagestyle{empty}\mbox{} \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Conclusions} The \texttt{plot} function in the \texttt{timeSeries} package is a very powerful tool to create plots from time series objects. This includes to display univariate and multivariate time series in single and multiple panels, to select from two styles for the time-axis or even to tailor positions and formats according to his own needs, and to modifiy annotations and decorations of plots. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 8 \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Appendix} In the appendix we have summarized graphs and tables which are useful tools to create plots. We have reprinted the default color table from R, we have summarized several color palettes as available in the \texttt{fBasics} package and other contributed R packages, and two tables with font characters and plot symbols. % ----------------------------------------------------------------------------- \pagebreak \subsection{Margins: mar and oma} <>= # Plot: # - oma stands for 'Outer Margin Area' # - mar represents the 'figure Margins' # - The default size is c(5,4,4,2) + 0.1 # - The axes tick marks will go in the first lines par(mfrow=c(1, 1)) par(oma=c(3,3,3,3)) # all sides have 3 lines of space par(mar=c(5,4,4,2) + 0.1) plot(x=1:10, y=1:10, type="n", xlab="X", ylab="Y") # Add Text tot the Plot Part - red text(5,5, "Plot", col="red", cex=2) text(5,4, "text(5,5, \"Plot\", col=\"red\", cex=2)", col="red", cex=1) box("plot", col="red", lwd=2) # Add text to thebThe Figure Part - grey mtext("Margins", side=3, line=2, cex=1.5, col="grey") mtext("par(mar=c(5,4,4,2) + 0.1)", side=3, line=1, cex=1, col="grey") mtext("Line 0", side=3, line=0, adj=1.0, cex=1, col="grey") mtext(" 1", side=3, line=1, adj=1.0, cex=1, col="grey") mtext("Line 2", side=3, line=2, adj=1.0, cex=1, col="grey") mtext("Line 3", side=3, line=3, adj=1.0, cex=1, col="grey") mtext("Line 0", side=2, line=0, adj=1.0, cex=1, col="grey") mtext("Line 1", side=2, line=1, adj=1.0, cex=1, col="grey") mtext("Line 2", side=2, line=2, adj=1.0, cex=1, col="grey") mtext("Line 3", side=2, line=3, adj=1.0, cex=1, col="grey") box("figure", col="grey") # The title will fit in the third line on the top of the graph. title("Ttitle - Third Line") # Note 'outer=TRUE' moves us from the figure to the outer margins. mtext("Outer Margin Area", side=1, line=1, cex=1.8, col="brown", outer=TRUE) mtext("par(oma=c(3,3,3,3))", side=1, line=2, cex=1, col="orange", outer=TRUE) mtext("Line 0", side=1, line=0, adj=0.0, cex=0.8, col="orange", outer=TRUE) mtext("Line 1", side=1, line=1, adj=0.0, cex=1, col="orange", outer=TRUE) mtext("Line 2", side=1, line=2, adj=0.0, cex=1, col="orange", outer=TRUE) box("outer", col="orange") @ \pagebreak \subsection*{} \begin{center} <>= <> @ \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Character Table} \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{characterTableFig.pdf} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Color Table} \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{colorTableFig.pdf} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Color Palettes I} \medskip \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{colorPalettes1Fig.pdf} \end{figure} \end{center} \pagebreak \subsection{Color Palettes II} \medskip \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{colorPalettes2Fig.pdf} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Symbol Table} \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{symbolTableFig.pdf} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Axis Style "pretty"} <>= FORMAT <- tS1@format FORMAT POSITIONS <- pretty(tS1) POSITIONS LABELS <- pretty(tS1) LABELS @ % ----------------------------------------------------------------------------- \pagebreak \subsection{Axis Style "chic"} <>= axTicksByTime <- function (x, ticks.on = "auto", k = 1, labels = TRUE, format.labels = TRUE, ends = TRUE, gt = 2, lt = 30) { if (timeBased(x)) x <- xts(rep(1, length(x)), x) tick.opts <- c("years", "months", "weeks", "days", "hours", "minutes", "seconds") tick.k.opts <- c(10, 5, 2, 1, 6, 1, 1, 1, 4, 2, 1, 30, 15, 1, 1) if (ticks.on %in% tick.opts) { cl <- ticks.on[1] ck <- k } else { tick.opts <- paste(rep(tick.opts, c(4, 2, 1, 1, 3, 3, 1)), tick.k.opts) is <- structure(rep(0, length(tick.opts)), .Names = tick.opts) for (i in 1:length(tick.opts)) { y <- strsplit(tick.opts[i], " ")[[1]] ep <- endpoints(x, y[1], as.numeric(y[2])) is[i] <- length(ep) - 1 if (is[i] > lt) break } nms <- rev(names(is)[which(is > gt & is < lt)])[1] cl <- strsplit(nms, " ")[[1]][1] ck <- as.numeric(strsplit(nms, " ")[[1]][2]) } if (is.null(cl)) ep <- NULL else ep <- endpoints(x, cl, ck) if (ends) ep <- ep + c(rep(1, length(ep) - 1), 0) if (labels) { if (is.logical(format.labels) || is.character(format.labels)) { unix <- ifelse(.Platform$OS.type == "unix", TRUE, FALSE) time.scale <- periodicity(x)$scale fmt <- ifelse(unix, "%n%b%n%Y", "%b %Y") if (time.scale == "weekly" | time.scale == "daily") fmt <- ifelse(unix, "%b %d%n%Y", "%b %d %Y") if (time.scale == "minute" | time.scale == "hourly") fmt <- ifelse(unix, "%b %d%n%H:%M", "%b %d %H:%M") if (time.scale == "seconds") fmt <- ifelse(unix, "%b %d%n%H:%M:%S", "%b %d %H:%M:%S") if (is.character(format.labels)) fmt <- format.labels names(ep) <- format(index(x)[ep], fmt) } else { names(ep) <- as.character(index(x)[ep]) } ep } } @ <>= ticks <- axTicksByTime(as.xts(tS1)) ticks @ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagebreak \section*{About the Authors} % ----------------------------------------------------------------------------- % Diethelm Wuertz \noindent\textbf{Diethelm W\"urtz} is professor at the Institute for Theoretical Physics, ITP, and for the Curriculum Computational Science and Engineering, CSE, at the Swiss Federal Institute of Technology in Zurich. He teaches Econophysics at ITP and supervises seminars in Financial Engineering. Diethelm is senior partner of Finance Online, an ETH spin-off company in Zurich, and co-founder of the Rmetrics Association in Zurich.\\ % ----------------------------------------------------------------------------- % Tobias Setz \noindent \textbf{Tobias Setz} has a Bachelor and Master in Computational Science from ETH in Zurich and has contributed with his Thesis projects on wavelet analytics and Bayesian change point analytics to this handbook. He is now a PhD student in the Econophysics group at ETH Zurich at the Institute for Theoretical Physics.\\ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagebreak \section*{About Rmetrics} \noindent\emph{Rmetrics Open Source Project} With hundreds of functions built on modern methods, the Rmetrics open source software combines exploratory data analysis, statistical modelling and rapid model prototyping. The R/Rmetrics packages are embedded in R, building an environment which creates a first class system for applications in teaching statistics and finance. Rmetrics covers Time Series Econometrics, Hypothesis Testing, GARCH Modelling and Volatility Forecasting, Extreme Value Theory and Copulae, Pricing of Derivatives, Portfolio Analysis, Design and Optimization, and much more. \noindent\emph{The Rmetrics Association}\\ is a non-profit taking association working in the public interest. The Rmetrics Association provides support for innovations in financial computing. We believe that the Rmetrics Open Source software has become a valuable educational tool and that it is worth ensuring its continued development and the development of future innovations in software for statistical and computational research in finance. Rmetrics provides a reference point for individuals and institutions that want to support or interact with the Rmetrics development community. Rmetrics encourages students to participate in Rmetrics' activities in the context of Student Internships. \noindent\emph{Rmetrics Software Evalution}\\ If you like to get an impression of the size and quality of the Open Source Rmetrics Program have a look on the Ohloh Rmetrics Software Evaluation. The Evalutions gives an overview about the Software Development (Code Analysis, Estimated Cost), the people behind it, and its community. \noindent\emph{Contributions to Rmetrics}\\ are coming from several educuational institutions world wide. These include the Rmetrics web site and documentation project supported by ITP/CSE ETH Zurich, the organization of Summerschools and Workshops supported by ITP/CSE ETH Zurich, the R-sig-Finance Help and Mailing List, supported by SfS ETH Zurich, the R-forge development server, supported by University of Economics in Vienna, CRAN Test and Distribution Server for R software, supported by University of Economics Vienna, the Debian Linux integration supported by the Debian Association. Many thanks to all behind these projects who gave us continuous support over the last years.\\ \noindent Rmetrics Association\\ www.rmetrics.org % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagebreak % References \begin{thebibliography}{99} \bibitem{zoo} Achim Zeileis and Gabor Grothendieck (2005): \emph{ zoo: S3 Infrastructure for Regular and Irregular Time Series.} Journal of Statistical Software, 14(6), 1-27. URL http://www.jstatsoft.org/v14/i06/ \bibitem{tseries} Adrian Trapletti and Kurt Hornik (2007): \emph{tseries: Time Series Analysis and Computational Finance.} R package version 0.10-11. \bibitem{rmetrics} Diethelm W\"urtz et al. (2007): \emph{Rmetrics: Rmetrics - Financial Engineering and Computational Finance.} R package version 260.72. http://www.rmetrics.org \bibitem{ISO} International Organization for Standardization (2004): \emph{ISO 8601: Data elements and interchage formats --- Information interchange --- Representation of dates and time} URL http://www.iso.org \bibitem{R} R Development Core Team: \emph{R: A Language and Environment for Statistical Computing}, R Foundation for Statistical Computing, Vienna, Austria. ISBN 3-900051-07-0, URL http://www.R-project.org \bibitem{quantmod} Jeffrey A. Ryan (2008): \emph{quantmod: Quantitative Financial Modelling Framework.} R package version 0.3-5. URL http://www.quantmod.com URL http://r-forge.r-project.org/projects/quantmod \end{thebibliography} \end{document} timeSeries/R/0000755000176000001440000000000013612573075012625 5ustar ripleyuserstimeSeries/R/AllClass.R0000644000176000001440000001272512407026706014450 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # CLASS: REPRESENTATION: # setClass Classify 'timeSeries' # setValidity Validate 'timeSeries' # setMethod Initialize 'timeSeries' ################################################################################ # CLASS: REPRESENTATION: # 'signalSeries' Deprecated S4 Class representation # 'timeSeries' Deprecated S4 Class representation ################################################################################ # YC: Note if slots are added or removed, don't forget to edit # getDataPart,timeSeries-method and setDataPart,timeSeries-method !! setClass("timeSeries", representation(.Data = "matrix", units = "character", positions = "numeric", format = "character", FinCenter = "character", recordIDs = "data.frame", title = "character", documentation = "character"), contains = "structure", prototype(matrix(NA), units = character(0), positions = numeric(0), format = character(0), FinCenter = character(0), recordIDs = data.frame(), title = character(0), documentation = character(0))) # ------------------------------------------------------------------------------ .validity_timeSeries <- function(object) { if ((length(object@positions) > 0) && NROW(object) != length(object@positions)) return("length of '@positions' not equal to '@.Data' extent") if (NCOL(object) != length(object@units)) return("length of '@units' not equal to '@.Data' extent") if (NROW(object@recordIDs) > 0 & NROW(object@recordIDs) != nrow(object)) return("length of '@recordIDs' not equal to '@.Data' extent") # Return Value: TRUE } setValidity("timeSeries", .validity_timeSeries) # ------------------------------------------------------------------------------ # Note it is faster to assign manually all slots of the timeSeries objects. setMethod("initialize", "timeSeries", function(.Object, .Data = new("matrix"), units = character(0), positions = numeric(0), format = character(0), FinCenter = "", #<< FIXME: use identical in code rather than FinCenter == "" recordIDs = data.frame(), title = character(0), documentation = character(0)) { # as.double -> crucial for speed improvement in subsetting if (!is.double(positions)) positions <- as.double(positions) .Object <- timeSeries::setDataPart(.Object, value = .Data) `slot<-`(.Object, "units", value = units) `slot<-`(.Object, "positions", value = positions) `slot<-`(.Object, "format", value = format) `slot<-`(.Object, "FinCenter", value = FinCenter) `slot<-`(.Object, "recordIDs", value = recordIDs) `slot<-`(.Object, "title", value = title) `slot<-`(.Object, "documentation", value = documentation) # Check only one we needs rather than using validObject anyStrings <- function(x) if (identical(x, TRUE)) character() else x error <- anyStrings(.validity_timeSeries(.Object)) if (length(error) > 0) stop(paste("Initialize timeSeries :", error, collapse = "\n"), call. = FALSE, domain = NA) # Return Value: .Object }) ################################################################################ ## setClass("signalSeries", ## representation( ## .Data = "matrix", ## units = "character", ## recordIDs = "data.frame", ## title = "character", ## documentation = "character"), ## contains = "structure", ## validity = function(object) { ## if (NCOL(getDataPart(object)) != length(object@units)) ## return("length of '@units' not equal to '@.Data' extent") ## TRUE ## }) ## # ------------------------------------------------------------------------------ ## setClass("timeSeries", ## representation(positions = "numeric", ## format = "character", ## FinCenter = "character"), ## contains = "signalSeries", ## validity = function(object) { ## if (NROW(getDataPart(object)) != length(object@positions)) ## return("length of '@positions' not equal to '@.Data' extent") ## if (NCOL(getDataPart(object)) != length(object@units)) ## return("length of '@units' not equal to '@.Data' extent") ## TRUE ## }) ################################################################################ timeSeries/R/methods-plot.R0000644000176000001440000003517413612551406015373 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # plot,timeSeries Plots a 'timeSeries' object # .plot.timeSeries Internal function called by plot.timeSeries # lines,timeSeries Adds lines to a 'timeSeries' plot # points,timeSeries Adds points to a 'timeSeries' plot # FUNCTION: DESCRIPTION: # pretty.timeSeries Returns a sequence of equally spaced round values ################################################################################ .plot.timeSeries <- function(x, y, FinCenter = NULL, plot.type = c("multiple", "single"), format = "auto", at = pretty(x), widths = 1, heights = 1, xy.labels, xy.lines, panel = lines, nc, yax.flip = FALSE, mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), oma.multi = c(6, 0, 5, 0), axes = TRUE, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Plots 'timeSeries' objects # Arguments: # see plot.ts() # Additional Arguments: # format, at to beautify axis.POSIXct() function # widths, heights to handle layout() function # Details: # This function is build in exactly the same way as the function # plot.ts() for regular time series (R's ts) objects... # Examples: # x = as.timeSeries(data(msft.dat))[, 1:4] # .plot.timeSeries(x) # .plot.timeSeries(x[,1], x[,2], pch = 19) # .plot.timeSeries(x, plot.type = "single", col = 2:5) # FUNCTION: # Check Missing: if (missing(y)) y <- NULL # Check for "pretty' and "chic": if (is.character(at)) { if (at[1] == "pretty" || at[1] == "chic") { return(.xtplot.timeSeries( x=x, y=y, FinCenter = FinCenter, plot.type = plot.type, format = format, at = at, panel = panel, yax.flip = yax.flip, mar.multi = mar.multi, oma.multi = oma.multi, axes=axes, ...) ) } } # Labels: xlabel <- if (!missing(x)) deparse(substitute(x)) ylabel <- if (!missing(y)) deparse(substitute(y)) # Take care of FinCenter: if (!is.null(FinCenter)) { finCenter(x) <- FinCenter if (!is.null(y)) finCenter(y) <- FinCenter if (is(at, "timeDate")) at@FinCenter <- FinCenter } # Return Value: .plotTimeSeries(x = x, y = y, plot.type = plot.type, xy.labels = xy.labels, xy.lines = xy.lines, panel = panel, nc = nc, xlabel = xlabel, ylabel = ylabel, axes = axes, mar.multi = mar.multi, oma.multi = oma.multi, yax.flip = yax.flip, format = format, at = at, widths = widths, heights = heights, ...) } setMethod("plot", "timeSeries", function(x, y, FinCenter = NULL, plot.type = c("multiple", "single"), format = "auto", at = pretty(x), widths = 1, heights = 1, xy.labels, xy.lines, panel = lines, nc, yax.flip = FALSE, mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), oma.multi = c(6, 0, 5, 0), axes = TRUE, ...) .plot.timeSeries(x = x, y = y, FinCenter = FinCenter, plot.type = plot.type, format = format, at = at, widths = widths, heights = heights, xy.labels=xy.labels, xy.lines=xy.lines, panel = panel, nc = nc, yax.flip = yax.flip, mar.multi = mar.multi, oma.multi = oma.multi, axes = axes, ...)) # until UseMethod dispatches S4 methods in 'base' functions plot.timeSeries <- function(x, y, ...) .plot.timeSeries(x, y, ...) # ------------------------------------------------------------------------------ # Internal Function called by plot(): .plotTimeSeries <- function(x, y = NULL, plot.type = c("multiple", "single"), xy.labels, xy.lines, panel = lines, nc, xlabel, ylabel, type = "l", xlim = NULL, ylim = NULL, xlab = "Time", ylab, log = "", col = 1:ncol(x), bg = NA, pch = 1:ncol(x), cex = par("cex"), lty = par("lty"), lwd = par("lwd"), axes = TRUE, frame.plot = axes, ann = par("ann"), main = NULL, mar.multi, oma.multi, yax.flip, format, at, widths, heights, grid = FALSE, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Plots timeSeries objects - Internal Function # Details: # A modified copy of R's internal 'plotts()' function, # see 'plot.ts()'. # FUNCTION: # Utility Function: plot.type <- match.arg(plot.type) nser <- NCOL(x) if (format == "auto") format = x@format X <- if (x@format == "counts") time(x) else as.POSIXct(time(x)) if (is.character(at) && identical(at, "auto")) { # Index = round(seq(1, length(time(x)), length = 6)) # at = X[Index] at = seq(X[1], X[length(X)], length = 6) } if(is(at, "timeDate")) at = as.POSIXct(at) # YC : force col and pch to be of same length as NCOL(x) otherwise # time series might not be plotted at all. col <- rep(col, length.out = nser) pch <- rep(pch, length.out = nser) # Multiple Plots, each one Curve, on one Page: if (plot.type == "multiple" && nser > 1) { ngraph = nser panel <- match.fun(panel) nser <- NCOL(x) if (nser > 10) stop("cannot plot more than 10 series as \"multiple\"") if (is.null(main)) main <- xlabel nm <- colnames(x) if (is.null(nm)) nm <- paste("Series", 1:nser) if (missing(nc)) nc <- if (nser > 4) 2 else 1 nr <- ceiling(nser/nc) oldpar <- par(mar = mar.multi, oma = oma.multi, mfcol = c(nr, nc)) on.exit(par(oldpar)) nr <- ceiling(ngraph/nc) layout(matrix(seq(nr * nc), nr), widths = widths, heights = heights) for (i in 1:nser) { plot(X, series(x)[, i], axes = FALSE, xlab = "", ylab = "", log = log, col = col[i], bg = bg, pch = pch[i], ann = ann, type = "n", ...) panel(X, series(x)[, i], col = col[i], bg = bg, pch = pch[i], type = type, ...) if (frame.plot) box(...) y.side <- if (i%%2 || !yax.flip) 2 else 4 do.xax <- i%%nr == 0 || i == nser if (axes) { axis(y.side, xpd = NA) if (do.xax) { if (x@format == "counts") { axis(1) } else { axis.POSIXct(1, at = at, format = format) } } } if (ann) { mtext(nm[i], y.side, line = 3, ...) if (do.xax) mtext(xlab, side = 1, line = 3, ...) } if(grid) abline(v = at, lty = 3, col = "grey") } if (ann && !is.null(main)) { par(mfcol = c(1, 1)) cex.main = par("cex.main") font.main = par("font.main") col.main = par("col.main") mtext(main, side = 3, line = 3, cex = cex.main, font = font.main, col = col.main, ...) } return(invisible()) } # Scatter Plot: if (!is.null(y)) { stopifnot(isUnivariate(x)) stopifnot(isUnivariate(y)) xy = cbind(x, y) xy <- xy.coords(series(xy)[, 1], series(xy)[, 2], xlabel, ylabel, log) xlab <- if (missing(xlab)) xy$xlab else xlab ylab <- if (missing(ylab)) xy$ylab else ylab xlim <- if (is.null(xlim)) range(xy$x[is.finite(xy$x)]) else xlim ylim <- if (is.null(ylim)) range(xy$y[is.finite(xy$y)]) else ylim n <- length(xy$x) if (missing(xy.labels)) xy.labels <- (n <= 150) if (!is.logical(xy.labels)) { if (!is.character(xy.labels)) stop("'xy.labels' must be logical or character") do.lab <- TRUE } else { do.lab <- xy.labels } ptype <- if (do.lab) "n" else if (missing(type)) "p" else type plot.default(xy, type = ptype, xlab = xlab, ylab = ylab, xlim = xlim, ylim = ylim, log = log, col = col, bg = bg, pch = pch, axes = axes, frame.plot = frame.plot, ann = ann, main = main, ...) if (missing(xy.lines)) { xy.lines <- do.lab } if (do.lab) text(xy, labels = if (is.character(xy.labels)) xy.labels else seq_along(xy$x), col = col, cex = cex) if (xy.lines) { type = if (do.lab) "c" else "l" lines(xy, col = col, lty = lty, lwd = lwd, type = type) } return(invisible()) } # Multiple Curves all in one Plot, on one Page: if (missing(ylab)) { ylab <- colnames(x) if (length(ylab) != 1) ylab <- xlabel } if (is.null(ylim)) ylim <- range(x, na.rm = TRUE) i = 1 X <- if (x@format == "counts") time(x) else as.POSIXct(time(x)) plot(X, series(x)[, i], ylim = ylim, col = col[(i - 1)%%length(col) + 1], lty = lty[(i - 1)%%length(lty) + 1], lwd = lwd[(i - 1)%%length(lwd) + 1], bg = bg[(i - 1)%%length(bg) + 1], pch = pch[(i - 1)%%length(pch) + 1], type = type, axes = FALSE, ylab = "", xlab = "") if (NCOL(x) > 1) for (i in 2:NCOL(x)) lines(X, series(x)[, i], col = col[(i - 1)%%length(col) + 1], lty = lty[(i - 1)%%length(lty) + 1], lwd = lwd[(i - 1)%%length(lwd) + 1], bg = bg[(i - 1)%%length(bg) + 1], pch = pch[(i - 1)%%length(pch) + 1], type = type) if (ann) title(main = main, xlab = xlab, ylab = ylab, ...) if (axes) { if (x@format == "counts") axis(1, ...) else axis.POSIXct(1, at = at, format = format) axis(2, ...) } if (frame.plot) box(...) if(grid) abline(v = at, lty = 3, col = "grey") return(invisible()) } # ------------------------------------------------------------------------------ .lines.timeSeries <- function(x, FinCenter = NULL, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # NEW Lines method for an object of class "timeSeries" # Arguments: # x - a "timeSeries" object # Example: # plot(MSFT[, 1]); lines(MSFT[, 1], col = "red") # FUNCTION: # Change FinCenter: if (!is.null(FinCenter)) finCenter(x) <- FinCenter # Lines: positions <- time(x) if (x@format == "counts") { lines(x = positions, y = series(x), ...) } else { lines(x = as.POSIXct(positions), y = series(x), ...) } # Return Value: invisible(x) } setMethod("lines", "timeSeries", function(x, FinCenter = NULL, ...) .lines.timeSeries(x, FinCenter, ...)) # until UseMethod dispatches S4 methods in 'base' functions lines.timeSeries <- function(x, FinCenter = NULL, ...) .lines.timeSeries(x, FinCenter = FinCenter, ...) # ------------------------------------------------------------------------------ .points.timeSeries <- function(x, FinCenter = NULL, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Plot method for an object of class "timeSeries" # Arguments: # x - a "timeSeries" object # Value: # Plots a 'timeSeries' object. # FUNCTION: # Change FinCenter: if (!is.null(FinCenter)) finCenter(x) <- FinCenter # Points: positions <- time(x) if (x@format == "counts") { points(x = positions, y = series(x), ...) } else { points(x = as.POSIXct(positions), y = series(x), ...) } # Return Value: invisible(x) } setMethod("points", "timeSeries", function(x, FinCenter = NULL, ...) .points.timeSeries(x, FinCenter = FinCenter, ...)) # until UseMethod dispatches S4 methods in 'base' functions points.timeSeries <- function(x, FinCenter = NULL, ...) .points.timeSeries(x, FinCenter = FinCenter, ...) ################################################################################ pretty.timeSeries <- function(x, n = 5, min.n = n%/%3, shrink.sml = 0.75, high.u.bias = 1.5, u5.bias = 0.5 + 1.5 * high.u.bias, eps.correct = 0, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns a sequence of equally spaced round values. # Details: # Computes a sequence of about n+1 equally spaced ?round? # values which cover the range of the values in x. # The values are chosen so that they are 1, 2 or 5 times # a power of 10. # Arguments: # x - a timeSeries object from which the time is # extracted # n - integer giving the desired number of intervals. # min.n - nonnegative integer giving the minimal # number of intervals. # shrink.sml - positive numeric by a which a default # scale is shrunk in the case when range(x) is # very small. # high.u.bias - non-negative numeric, typically > 1. # Larger high.u.bias values favor larger units. # u5.bias - non-negative numeric multiplier favoring # factor 5 over 2. # eps.correct - integer code, one of {0,1,2}. If # non-0, a correction is made at the boundaries. # ... - further arguments for methods. # FUNCTION: td <- time(x) if (inherits(x, "timeDate")) { x <- as.POSIXct(td) as.timeDate(pretty(x, n=n, min.n=min.n, shrink.sml=shrink.sml, high.u.bias=high.u.bias, u5.bias=u5.bias, eps.correct=eps.correct, ...)) } else { #-> signal series pretty(td) } } ############################################################################### timeSeries/R/utils-structure.R0000644000176000001440000000473711545122420016144 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # str,timeSeries Displays the structure of a 'timeSeries' object ################################################################################ .str.timeSeries <- function(object, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Displays the structure of a 'timeSeries' object. # Arguments: # object - an object of class 'timeSeries'. # ... - # FUNCTION: # Series Name: cat("Time Series: ") cat("\n Name: ", as.character(c(substitute(object)))) # YC : as.character(c( important to handle str(timeSeries()) # Data Matrix: Dim = dim(object) cat("\nData Matrix: ") cat("\n Dimension: ", Dim) cat("\n Column Names: ", colnames(object) ) firstName = rownames(object)[1] lastName = rownames(object)[Dim[1]] cat("\n Row Names: ", firstName, " ... ", lastName) # Date/Time Positions: cat("\nPositions: ") cat("\n Start: ", as.character(start(object))) cat("\n End: ", as.character(end(object))) # Other Attributes: cat("\nWith: ") cat("\n Format: ", object@format) cat("\n FinCenter: ", object@FinCenter) cat("\n Units: ", object@units) cat("\n Title: ", object@title) cat("\n Documentation: ", object@documentation) cat("\n") # Return Value: invisible() } setMethod("str", "timeSeries", function(object, ...) .str.timeSeries(object, ...)) # until UseMethod dispatches S4 methods in 'base' functions str.timeSeries <- function (object, ...) .str.timeSeries(object, ...) ################################################################################ timeSeries/R/timeSeries-slotFinCenter.R0000644000176000001440000000610711545122420017625 0ustar ripleyusers # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # finCenter,timeSeries Get financial center slot from a 'timeSeries' # finCenter<-,timeSeries Set financial center slot from a 'timeSeries' # FUNCTION: DESCRIPTION: # getFinCenter Get financial center slot from a 'timeSeries' # setFinCenter<- Set new financial center slot from a 'timeSeries' ################################################################################ setMethod("finCenter", "timeSeries", function(x) { # A function implemented by Yohan Chalabi and Diethelm Wuertz # Description: # Get financial center slot from a 'timeSeries' object # Arguments: # x - an object of class 'timeSeries' # FUNCTION: # Extract financial center: ans <- x@FinCenter # Return Value: ans }) # ------------------------------------------------------------------------------ setMethod("finCenter<-", "timeSeries", function(x, value) { # A function implemented by Yohan Chalabi and Diethelm Wuertz # Description: # Set financial center slot from a 'timeSeries' object # Arguments: # x - an object of class 'timeSeries' # value - a character string, setting the name of the financial # center. # FUNCTION: # Check: if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # Convert to user financial centre: positions <- timeDate(charvec = time(x), zone = finCenter(x), FinCenter = value) # Assign Positions to Time Stamps: time(x) <- positions # Return Value: x }) ################################################################################ getFinCenter <- function(x) { # Description: # Get financial center slot from a 'timeSeries' object # Arguments: # x - a 'timeSeries' object # FUNCTION: # Return Value: finCenter(x) } # ------------------------------------------------------------------------------ "setFinCenter<-" <- function(x, value) { # Description: # Set new financial center slot from a 'timeSeries' object # FUNCTION: # Arguments: # x - a 'timeSeries' object # Assign Financial Center Slot: finCenter(x) <- value # Return Value: x } ################################################################################ timeSeries/R/fin-returns.R0000644000176000001440000001130112407026706015213 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # returns,ANY Computes returns from a 'matrix' object # returns,timeSeries Computes returns from a 'timeSeries' object # FUNCTION: DESCRIPTION: # returns0 Compute untrimmed returns # OLD FUNCTIONS: KEEP THESE FUNCTIONS FOR COMPATIBILITY: # returnSeries Deprecated, use returns() # getReturns Deprecated, use returns() ################################################################################ setMethod("returns", "ANY", function(x, method = c("continuous", "discrete", "compound", "simple"), percentage = FALSE, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Computes returns from a 'matrix' object # Arguments: # x - data object containing ordered price observations # method - "continuous == "compound" and "discrete" == "simple" # percentage # Note: # To make it conform with PortfolioAnalytics: # "compound" == "continuous" # "simple" == "discrete" # FUNCTION: # Settings: method <- match.arg(method) # Calculate Returns: data <- as.matrix(x) positions <- time(x) if(method == "compound" || method == "continuous") { data <- rbind( data[1, , drop = FALSE]*NA, apply(log(data), 2, diff)) } if(method == "simple" || method == "discrete") { data <- apply(rbind(data, NA*data[1,]), 2, diff) / data data <- rbind(data[1, , drop = FALSE]*NA, data) data <- data[-(length(positions) + 1), , drop = FALSE] } if (percentage) data <- 100*data # Return Value: data } ) # ----------------------------------------------------------------------------- setMethod("returns", "timeSeries", function(x, method = c("continuous", "discrete", "compound", "simple"), percentage = FALSE, na.rm = TRUE, trim = TRUE, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Returns the returns of an object of class 'timeSeries' # Arguments: # x - an object of class 'timeSeries' # method - # percentage - # na.rm - # trim - # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Make sure that series is ordered: x <- sort(x) # Get Returns: if (na.rm) x <- na.omit(x, ...) series(x) <- returns(as(x, "matrix"), method, percentage) if (trim) x <- na.omit(x, "r") # Preserve Title and Documentation: x@title <- Title x@documentation <- Documentation # Return Value: x } ) ############################################################################### returns0 <- function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns the untrimmed returns of an object of class 'timeSeries' # Arguments: # x - an object of class 'timeSeries' # FUNCTION: # Compute Untrimmed Returns: x <- returns(x = x, trim = FALSE) x[1, ] <-0 # Return Value: x } ############################################################################### # DEPRECATED: returnSeries <- function(...) { # A function implemented by Diethelm Wuertz # FUNCTION: # .Deprecated("returns", "timeSeries") returns(...) } # ----------------------------------------------------------------------------- getReturns <- function(...) { # A function implemented by Diethelm Wuertz # Description: # Computes returns # FUNCTION: # .Deprecated("returns", "timeSeries") # Return Value: returns(...) } ############################################################################### timeSeries/R/stats-na.omit.R0000644000176000001440000002337612407026706015457 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # na.omit,timeSeries Handles missing values in objects # .naOmitMatrix Internal function called from na.omit,timeSeries # OLD FUNCTIONS: DESCRIPTION: # removeNA Remove NAs from a matrix object # substituteNA Substitute NAs by zero, the column mean or median # interpNA Interpolate NAs using R's "approx" function ################################################################################ # DW: # I think we should deprecate the following functions: # removeNA, substituteNA, and interpNa since the function # na.omit() can already handle all these cases. # DW: # note we do interpolation with approx(), zoo also offers # interpolation by splines, we should also add this. ################################################################################ .na.omit.timeSeries <- function(object, method = c("r", "s", "z", "ir", "iz", "ie"), interp = c("before", "linear", "after"), ...) { # Description # Handles NAs in timeSeries objects # Detials: # Linear Interpolation is done by the function approx. # Spline interpolation like in zoo is not yet supported. # Arguments: # object - an object of class 'timeSeries' # method - how to handle NAs # interp - how to interpolate NAs # ... - arguments passed to function approx() # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(object)) # Extract Title and Documentation: Title <- object@title Documentation <- object@documentation # Settings: method <- match.arg(method) interp <- match.arg(interp) # Skip ? if (method == "s") return(object) # Handle NAs: if (method == "r") { # Remove NAs: # DW: # object <- stats:::na.omit.default(object) object <- as.timeSeries(na.omit(series(object))) } else if (method == "z") { # Substitute NAs by Zero's: object[is.na(object)] <- 0 } else if (substr(method, 1, 1) == "i") { # Interpolate: interp = match.arg(interp) f = 0 if (interp == "before") { interp = "constant" f = 0 } if (interp == "after") { interp = "constant" f = 1 } n = nrow(object) for (i in 1:ncol(object)) { y = object[, i] idy = (1:n)[!is.na(y)] ## DW: ... added # Linear/Constant Interpolation: y = approx(x = idy, y = y[idy], xout = 1:n, method = interp, f = f, ...)$y object[, i] = y } modID = FALSE if (method == "ir") { # Remove Start and End NAs: # DW: # object <- stats:::na.omit.default(object) object <- as.timeSeries(na.omit(series(object))) } else if (method == "iz") { # Set Start and End NAs to Zero: object[is.na(object)] = 0 } else if (method == "ie") { n = nrow(object) for (k in 1:ncol(object)) { y = object[, k] if (NA %in% y) { start = sum(cumprod(is.na(y))) if (start > 0) for (i in start:1) y[i] = y[i+1] end = n+1 - sum(cumprod(rev(is.na(y)))) if (end <= n) for (i in end:n) y[i] = y[i-1] object[, k] = y } } } } # Handle recordIDs ... recordIDs <- object@recordIDs modID <- c(r = TRUE, z = FALSE, ir = TRUE, iz = FALSE, ie = FALSE) if(modID[method] > 0 && sum(dim(recordIDs)) > 0 ) { index <- attr(object, "n.action") recordIDs <- recordIDs[index, ] } # Preserve Title and Documentation: object@title <- Title object@documentation <- Documentation # Return Value: object } setMethod("na.omit", "timeSeries", function(object, method = c("r", "s", "z", "ir", "iz", "ie"), interp = c("before", "linear", "after"), ...) .na.omit.timeSeries(object, method, interp, ...)) # until UseMethod dispatches S4 methods in 'base' functions na.omit.timeSeries <- function(object, ...) .na.omit.timeSeries(object, ...) # ------------------------------------------------------------------------------ .naOmitMatrix <- function(object, method = c("r", "s", "z", "ir", "iz", "ie"), interp = c("before", "linear", "after")) { # Description: # Internal Function called from na.omit.timSeries() # Arguments: # FUNCTION: # Extract matrix: x = object stopifnot (is.matrix(x)) # Match Arguments: method <- match.arg(method) interp <- match.arg(interp) # Handle NAs: if (method == "r") { # Remove NAs: x <- na.omit(x) } else if (method == "z") { # Substitute NAs by Zero's: x[is.na(x)] <- 0 } else if (substr(method, 1, 1) == "i") { # Interpolate: interp = match.arg(interp) f = 0 if (interp == "before") { interp = "constant" f = 0 } if (interp == "after") { interp = "constant" f = 1 } n = nrow(x) for (i in 1:ncol(x)) { y = x[, i] idy = (1:n)[!is.na(y)] y = approx(idy, y[idy], 1:n, method = interp, f = f)$y x[, i] = y } modID = FALSE if (method == "ir") { # Remove Start and End NAs: x = na.omit(x) } else if (method == "iz") { # Set Start and End NAs to Zero: x[is.na(x)] = 0 } else if (method == "ie") { n = nrow(x) for (k in 1:ncol(x)) { y = x[, k] if (NA %in% y) { start = sum(cumprod(is.na(y))) if (start > 0) for (i in start:1) y[i] = y[i+1] end = n+1 - sum(cumprod(rev(is.na(y)))) if (end <= n) for (i in end:n) y[i] = y[i-1] x[, k] = y } } } } # Add Control: if (substr(method, 1, 1) == "i") { attr(x, "control") = c(method = method, interp = interp) } else { attr(x, "control") = c(method = method) } # Return Value: x } ################################################################################ removeNA <- function (x, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Remove NA's from objects which can be transformed to a matrix # Arguments: # x - an object which can be transformed to a matrix # FUNCTION: na.omit(x, ...) } # ------------------------------------------------------------------------------ substituteNA <- function(x, type = c("zeros", "mean", "median"), ...) { # A function implemented by Diethelm Wuertz # Description: # Imputes missing data by zeros, the median or the # mean values of all matrix elements # Arguments: # x - an object which can be transformed to a matrix # type - method specifies the substitution method to be # used. Choices are "zeros", "mean", or "constant" # FUNCTION: if (!inherits(x, "matrix") && !inherits(x, "timeSeries")) x <- as(x, "matrix") # Type: type <- match.arg(type) ans <- switch(type, "zeros" = apply(x, 2, function(z) { z[is.na(z)] <- 0 z}), "median" = apply(x, 2, function(z) { z[is.na(z)] = median(z, na.rm = TRUE) z}), "mean" = apply(x, 2, function(z) { z[is.na(z)] = mean(z, na.rm = TRUE) z})) # Return Value: ans } # ------------------------------------------------------------------------------ interpNA <- function(x, method = c("linear", "before", "after"), ...) { # A function implemented by Diethelm Wuertz # Description: # Interpolates missing values in a matrix object # Arguments: # x - a numeric vector or time series object of class 'ts'. # method - the method how to interpolate the vector, one of # the applied vector strings: "linear", "before" or # after. # Details: # To interpolate the function 'approx' is used. # Value: # Returns a vector or time series object where the missing # values are interpolated. # FUNCTION: if (!inherits(x, "matrix") && !inherits(x, "timeSeries")) x <- as(x, "matrix") # Internal Function: interpVectorNA <- function(x, method, f) { n <- length(x) idx <- (1:n)[!is.na(x)] x <- approx(idx, x[idx], 1:n, method = method, f = f)$y x} # Select Method: method = method[1]; f = 0 if (method == "before") { method = "constant" f = 0 } if (method == "after") { method = "constant" f = 1 } # For each Column: for (i in 1:ncol(x)) { x[, i] = interpVectorNA(x[, i], method, f) } # Return Value: x } ################################################################################ timeSeries/R/statistics-orderStatistics.R0000644000176000001440000000301611545077672020333 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # orderStatistics Compute order statistic of a 'timeSeries' object ################################################################################ orderStatistics <- function(x) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Compute the order statistics for a 'timeSeries object # Value: # A named list with the order statistics for each column of # the inputted series. # FUNCTION: # Order Statistics: td <- time(x) # Return Value: mapply( function(cl, nm) { S <- sort(cl, index.return = TRUE) timeSeries(data = S$x, charvec = td[S$ix], units = nm)}, as.list(x), colnames(x), SIMPLIFY = FALSE) } ################################################################################ timeSeries/R/base-rank.R0000644000176000001440000000377012620111345014604 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: COLUMN STATISTICS IN FUTILITIES: # rank,timeSeries Returns sample ranks of a 'timeSeries' object ################################################################################ setMethod("rank", "timeSeries", function(x, na.last = TRUE, ties.method = eval(formals(rank)$ties.method)) { # Description: # Returns the sample ranks of the values in a 'timeSeries' # Arguments: # x - an object of class 'timeSeries' # ties.method - # "average", replaces them by their mean, # "first" method results in a permutation with increasing # values at each index set of ties. # "random" method puts these in random order whereas the # default, # "max" and "min" replaces them by their maximum and minimum # respectively, the latter being the typical sports ranking. # Note: # Ties (i.e., equal values) and missing values can be handled # in several ways. # FUNCION: # Return Value: apply(x, 2, rank, na.last = na.last, ties.method = ties.method) } ) ################################################################################ timeSeries/R/methods-plot2.R0000644000176000001440000004677513612551406015466 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ############################################################################### # FUNCTION: DESCRIPTION: # .xtplot.timeSeries Plots a 'timeSeries' object # ... support for at = c("pretty", "chic") ############################################################################### # FUNCTION: DESCRIPTION: # .xtsPlot Internal xts plot unitility # .axTicksByTime2 Takes care of "chic" axis creation # .endpoints2 ... determines appropriate axis end points # .periodicity2 ... determines appropriate axis periodicity # .colorwheelPalette ############################################################################### # .plot.timeSeries <- # function( # x, y, FinCenter = NULL, # plot.type = c("multiple", "single"), # format = "auto", at = pretty(x), # widths = 1, heights = 1, # xy.labels, xy.lines, panel = lines, nc, yax.flip = FALSE, # mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), # oma.multi = c(6, 0, 5, 0), axes = TRUE, ...) # x=dummySeries(); y = NULL; FinCenter = NULL; plot.type = "s" # format = "auto"; at = "pretty"; panel = lines; yax.flip = FALSE # mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1) # oma.multi = c(7.75, 1.1, 6.1, 1.1) # dots <- list() # y = NULL; FinCenter = NULL # plot.type = c("single", "multiple") # format = "auto"; at = c("pretty", "chic") # panel = lines; yax.flip = FALSE # mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1) # oma.multi = c(7.75, 1.1, 6.1, 1.1) # axes = TRUE # ... <- NULL .xtplot.timeSeries <- function( x, y = NULL, FinCenter = NULL, plot.type = c("single", "multiple"), format = "auto", at = c("pretty", "chic"), panel = lines, yax.flip = FALSE, mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), oma.multi = c(7.75, 1.1, 6.1, 1.1), # oma.multi = c(6, 0, 5, 0), axes = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Plots timeSeries objects - Internal Function # Details: # A modified copy of R's internal 'plotts()' function, # see 'plot.ts()'. # FUNCTION: dots <- list(...) minor.ticks <- dots$minor.ticks %||% "auto" type <- dots$type %||% "l" col <- dots[["col"]] %||% { 1:NCOL(x) } pch <- dots$pch %||% 20 cex <- dots$cex %||% 1 lty <- dots$lty %||% 1 lwd <- dots[["lwd"]] %||% 1 grid <- dots$grid %||% TRUE col.grid <- dots$col.grid %||% "darkgrey" lwd.grid <- dots$lwd.grid %||% 1 frame.plot <- dots$frame.plot %||% TRUE ann <- dots$ann %||% TRUE cex.axis <- dots$cex.axis %||% 1 cex.lab <- dots$cex.lab %||% 1 cex.pch <- dots$cex.pch %||% 1 log <- dots$log %||% "" equilogs <- dots$equilogs %||% TRUE main <- dots$main %||% "" xlab <- dots$xlab %||% "" ylab <- dots$ylab %||% { cn <- colnames(x) if(length(cn) > 1 && (plot.type == "single" || plot.type == "s")) "Values" else cn } xax <- dots[["xax"]] %||% FALSE xaxs <- dots$xaxs %||% "r" yaxs <- dots$yaxs %||% "r" # Continue ... if (minor.ticks == "auto") minor.ticks <- .periodicity2(x)$units if (at[1] == "chic") minor.ticks <- TRUE if (format != "auto") minor.ticks <- TRUE # FinCenter - take care of it: if (!is.null(FinCenter)) { finCenter(x) <- FinCenter if (!missing(y)) finCenter(y) <- FinCenter if (is(at, "timeDate")) at@FinCenter <- FinCenter } # Plot Type: plot.type <- plot.type[1] if(isUnivariate(x)) plot.type <- "single" if(is.timeSeries(y)) plot.type <- "scatter" # Axis Positions and Format: AT <- at[1] FORMAT <- format[1] if (x@format == "counts") FORMAT <- "counts" # Decorations: # if (is.null(col)) col <- 1:ncol(x) # if (col[1] == 0) col = 1 else col <- .colorwheelPalette(ncol(x)) # if (is.null(pch)) pch <- 20 # if (is.null(cex)) cex <- 1 # if (is.null(lty)) lty <- 1 # if (is.null(lwd)) lwd <- 2 if(is.null(type[1])) type <- "l" if (length(type) == 1) type <- rep(type, times=NCOL(x)) if (length(col) == 1) col <- rep(col, times=NCOL(x)) if (length(pch) == 1) pch <- rep(pch, times=NCOL(x)) if (length(cex) == 1) cex <- rep(cex, times=NCOL(x)) if (length(lty) == 1) lty <- rep(lty, times=NCOL(x)) if (length(lwd) == 1) lwd <- rep(lwd, times=NCOL(x)) if (length(cex.pch) == 1) cex.pch <- rep(cex.pch, times=NCOL(x)) if (length(ylab) == 1) ylab <- rep(ylab, times=NCOL(x)) TIME <- time(x) if (is.integer(TIME)) { X <- TIME AT <- "counts" } else { X <- as.POSIXct(TIME) } Y <- series(x) if (AT == "pretty") { at <- pretty(x) } if (AT == "chic" ) { ep <- .axTicksByTime2(x, format=FORMAT) at <- TIME[ep] } # SINGLE PLOT: if (plot.type == "single" || plot.type == "s") { # All curves in one Frame: ylim <- dots$ylim %||% range(Y, na.rm=TRUE) xlim <- dots$xlim # even if it is NULL plot(X, Y[,1], type= "n", xlim = xlim, ylim = ylim, axes = FALSE, main = "", xlab = "", ylab = "", log=log, xaxs=xaxs, yaxs=yaxs) for (i in 1:ncol(x)) { lines(X, series(x)[, i], type = type[i], col = col[i], lty = lty[i], lwd = lwd[i], pch = pch[i], cex = cex.pch[i]) } if (ann) { title(main = main, xlab = xlab, ylab = ylab[1], cex.lab = cex.lab) } if (axes) { # Y - Axis: axis(2, cex.axis = cex.axis) } if (axes || xax) { # X - Axis: if (AT == "counts") { axis(1, cex.axis = cex.axis) } else if (AT == "pretty") { at <- pretty(time(x)) if (FORMAT == "auto") format <- "%Y-%m-%d" if (!is.null(minor.ticks)) { minor.at <- timeSequence(time(x)[1], time(x)[nrow(x)],by = minor.ticks) axis.POSIXct(1, at=minor.at, labels=FALSE, col='#BBBBBB',cex.axis = cex.axis) } axis.POSIXct(1, at = at, format = format, cex.axis = cex.axis) } else if (AT == "chic" ) { ep <- .axTicksByTime2(x, format=FORMAT) if (minor.ticks) axis.POSIXct(1, at=TIME, labels=FALSE, col='#BBBBBB',cex.axis = cex.axis) axis.POSIXct(1, at = TIME[ep], labels=names(ep),las=1, lwd=1, mgp=c(3, 1, 0), cex.axis = cex.axis) } else { if (minor.ticks) { axis.POSIXct(1, at=TIME, labels=FALSE, col='#BBBBBB', cex.axis = cex.axis) axis.POSIXct(1, at = at, format = format, cex.axis=cex.axis) } } } if (frame.plot) { box("plot") } if(grid) { if (!(AT %in% c("pretty","chic"))) at <- axTicks(1) abline(v = at, lty = 3, col = col.grid, lwd = lwd.grid) grid(NA, NULL, lty = 3, col = col.grid, lwd = lwd.grid, equilogs=equilogs) } return(invisible()) } # MULTIPLE PLOT: if (plot.type == "multiple" || plot.type == "m") { nser <- ncol(x) nc <- if (nser > 4) 2 else 1 nr <- ceiling(nser/nc) oldpar <- par(mar = mar.multi, oma = oma.multi, mfcol = c(nr, nc)) on.exit(par(oldpar)) for (i in 1:nser) { plot(X, Y[, i], axes = FALSE, ann = TRUE, type = "n", xlab = "", ylab = "", # log = log, col = col[i], pch = pch[i], lty = lty[i], lwd = lwd[i], cex = cex[i]) panel(X, Y[, i], type = type[i], xlab = "", ylab = "", col = col[i], pch = pch[i], lty = lty[i], lwd = lwd[i], cex = cex.pch[i]) y.side <- if (i%%2 || !yax.flip) 2 else 4 do.xax <- i%%nr == 0 || i == nser if (frame.plot) { box() } if (axes) { axis(y.side, xpd = NA, cex.axis=cex.axis) } if (axes || xax) { if (do.xax) { if (AT == "counts") { axis(1, cex.axis = 1.2 * cex.axis) at <- axTicks(1) } else if (AT == "pretty") { at <- pretty(time(x)) if (FORMAT == "auto") format <- "%Y-%m-%d" TIME <- time(x) if (!is.null(minor.ticks)) { minor.at <- timeSequence( time(x)[1], time(x)[nrow(x)], by=minor.ticks) axis.POSIXct(1, at=minor.at, labels=FALSE, cex.axis = 1.2 * cex.axis, col='#BBBBBB') } axis.POSIXct(1, at = at, format = format, cex.axis = 1.2 * cex.axis) } else if (AT == "chic" ) { ep <- .axTicksByTime2(x, format=FORMAT) at <- time(x)[ep] format <- attr(ep, "format") formatLabels <- names(ep) TIME <- time(x) if (minor.ticks) axis.POSIXct(1, at=TIME, labels=FALSE, col='#BBBBBB', cex.axis = 1.2 * cex.axis) axis.POSIXct(1, at = TIME[ep], labels=names(ep), las=1, lwd=1, mgp=c(3, 1, 0), cex.axis = cex.axis) } else { TIME <- time(x) if (minor.ticks) axis.POSIXct(1, at=TIME, labels=FALSE, col='#BBBBBB', cex.axis = 1.2 * cex.axis) axis.POSIXct(1, at = at, format = format, cex.axis = 1.2 *cex.axis) } } } if (ann) { mtext(text = ylab[i], side = y.side, line = 3, cex = cex.lab) if (do.xax) mtext(xlab, side = 1, line = 3, cex = cex.lab) if (i==1) { cex.main <- if (is.null(dots$cex.lab)) par("cex.main") else cex.lab mtext(main, side = 3, line = 3, cex = cex.main, font = par("font.main"), col = par("col.main")) } } if(grid) { abline(v = at, lty = 3, col = col.grid, lwd = lwd.grid) grid(NA, NULL, lty = 3, col = col.grid, lwd = lwd.grid, equilogs=equilogs) } } # end of nser loop return(invisible()) } # SCATTER PLOT: if (!is.null(y)) { stopifnot (isUnivariate(x)) stopifnot (isUnivariate(y)) plot(series(x), series(y), xlab="", ylab="", col=col, pch=pch, cex=cex) return(invisible()) } } ############################################################################### # Test function for xts-plot-like axis positions and labels. .xtsPlot <- function(x, y=NULL, type = "l", ann = TRUE, axes = TRUE, major.ticks = 'auto', minor.ticks = TRUE, major.format = TRUE, grid = TRUE, box = TRUE, ...) { # A function written by Diethelm Wuertz # Descroption: # A simple example to test the xts functions to generate # nice axis positions and Lebels # Example: # x <- 100 * cumulated(LPP2005REC[, 2]); xtsPlot(x) # Settings: # time.scale <- periodicity2(x)$scale ep <- .axTicksByTime2(x, major.ticks, format.labels=major.format) # PLOT COORDS: xycoords <- xy.coords(time(x), x[, 1]) # RAW PLOT: plot(xycoords$x, xycoords$y, type=type, axes=FALSE, ann=FALSE, ...) # ADD GRID: if (grid) { abline(v=xycoords$x[ep], col='grey', lty=3) grid(NA, NULL) } # ADD AXIS: if(axes) { if(minor.ticks) axis(1, at=xycoords$x, labels=FALSE, col='#BBBBBB') axis(1, at=xycoords$x[ep], labels=names(ep), las=1, lwd=1, mgp=c(3,2,0)) axis(2) } # ADD BOX: box() } # ----------------------------------------------------------------------------- # Borrowed from ... # Package: xts # Title: eXtensible Time Series # Version: 0.9-7 # Date: 2013-06-26 # Author: Jeffrey A. Ryan, Joshua M. Ulrich # Maintainer: Jeffrey A. Ryan # License: GPL (>= 2) # URL: http://r-forge.r-project.org/projects/xts/ # Packaged: 2014-01-02 18:00:13 UTC; ripley # NeedsCompilation: yes # Repository: CRAN # Date/Publication: 2014-01-02 19:18:28 .axTicksByTime2 <- function( x, ticks.on='auto', k=1, labels=TRUE, format.labels=TRUE, ends=TRUE, gt = 2, lt = 30, format = "auto") { # A modified function borrowed from the xts-package # Arguments: # x - a 'timeSerie' Object # Example: # x <- 100 * cumulated(LPP2005REC[, 2]); .axTicksByTime2(x) tick.opts <- c( "years", "months", "weeks", "days", "hours", "minutes", "seconds") tick.k.opts <- c( 10, 5, 2, 1, 6, 1, 1, 1, 4, 2, 1, 30, 15, 1, 1) if (ticks.on %in% tick.opts) { cl <- ticks.on[1] ck <- k } else { tick.opts <- paste(rep(tick.opts, c(4, 2, 1, 1, 3, 3, 1)), tick.k.opts) is <- structure(rep(0,length(tick.opts)), .Names = tick.opts) for(i in 1:length(tick.opts)) { y <- strsplit(tick.opts[i], ' ')[[1]] ep <- .endpoints2(x, y[1], as.numeric(y[2])) is[i] <- length(ep) -1 if(is[i] > lt) break } nms <- rev(names(is)[which(is > gt & is < lt)])[1] cl <- strsplit(nms, " ")[[1]][1] ck <- as.numeric(strsplit(nms, " ")[[1]][2]) } ep <- if (is.null(cl)) NULL else .endpoints2(x, cl, ck) if(ends) ep <- ep + c(rep(1,length(ep)-1),0) if (labels) { if(is.logical(format.labels) || is.character(format.labels)) { # format by level of time detail, and platform unix <- ifelse(.Platform$OS.type=="unix", TRUE, FALSE) time.scale <- .periodicity2(x)$scale fmt <- ifelse(unix, '%n%b%n%Y', '%b %Y') if (time.scale == "weekly" | time.scale == "daily") fmt <- ifelse(unix, '%b %d%n%Y', '%b %d %Y') if (time.scale == "minute" | time.scale == "hourly") fmt <- ifelse(unix, '%b %d%n%H:%M', '%b %d %H:%M') if (time.scale == "seconds") fmt <- ifelse(unix, '%b %d%n%H:%M:%S', '%b %d %H:%M:%S') if(is.character(format.labels)) fmt <- format.labels if (format != "auto") fmt <- format names(ep) <- format(time(x)[ep], fmt) } else { names(ep) <- as.character(time(x)[ep]) } } attr(ep, "format") <- fmt # Return Value: ep } ################################################################################ .endpoints2 <- function (x, on = c("months", "years", "quarters", "weeks", "days", "hours", "minutes", "seconds"), k = 1) { # A modified function borrowed from the xts-package # Arguments: # x - a 'timeDate' object # Example: # x <- 100 * cumulated(LPP2005REC[, 2]); .endpoints2(x) stopifnot(is(x, "timeSeries")) x <- time(x) on <- match.arg(on) posix <- as.POSIXct(x, origin="1970-01-01") .posix <- unclass(posix) if (on == "years") { ans <- as.integer(which(diff(as.POSIXlt(posix)$year%/%k + 1) != 0)) } else if (on == "quarters") { ans <- as.integer(which(diff((as.POSIXlt(posix)$mon%/%3) + 1) != 0)) } else if (on == "months") { ans <- as.integer(which(diff(as.POSIXlt(posix)$mon%/%k + 1) != 0)) } else if (on == "weeks") { ans <- as.integer( which(diff((.posix + (3L * 86400L))%/%604800L%/%k + 1) != 0)) } else if (on == "days") { ans <- as.integer(which(diff(.posix%/%86400L%/%k + 1) != 0)) } else if (on == "hours") { ans <- as.integer(which(diff(.posix%/%3600L%/%k + 1) != 0)) } else if (on == "minutes" || on == "mins") { ans <- as.integer(which(diff(.posix%/%60L%/%k + 1) != 0)) } else if (on == "seconds" || on == "secs") { ans <- as.integer(which(diff(.posix%/%k + 1) != 0)) } ans <- c(0, ans, NROW(x)) # Return Value: ans } ############################################################################### .periodicity2 <- function (x) { # A modified function borrowed from the xts-package # Arguments: # x - a 'timeDate' object # Example: # x <- 100 * cumulated(LPP2005REC[, 2]); .periodicity2(x) # FUNCTION: # Check Argument: stopifnot(is(x, "timeSeries")) x <- time(x) p <- median(diff(as.integer(as.POSIXct(x, origin="1970-01-01")))) if (is.na(p)) stop("cannot calculate periodicity of 1 observation") units <- "days" scale <- "yearly" label <- "year" if (p < 60) { units <- "secs" scale <- "seconds" label <- "second" } else if (p < 3600) { units <- "mins" scale <- "minute" label <- "minute" p <- p/60L } else if (p < 86400) { units <- "hours" scale <- "hourly" label <- "hour" } else if (p == 86400) { units <- "days" scale <- "daily" label <- "day" } else if (p <= 604800) { units <- "weeks" scale <- "weekly" label <- "week" } else if (p <= 2678400) { units <- "months" scale <- "monthly" label <- "month" } else if (p <= 7948800) { units <- "quarter" scale <- "quarterly" label <- "quarter" } # Return Value: list( difftime = structure(p, units = units, class = "difftime"), frequency = p, start = start(x), end = end(x), units = units, scale = scale, label = label) } ############################################################################### .colorwheelPalette <- function(n) { # A function implemented by Diethelm Wuertz # FUNCTION: # Color Wheel: orig <- c( "#FFF200", "#FBAA19", "#F26522", "#EF4823", "#ED1D24", "#A9285F", "#662D91", "#4D2F91", "#2E3092", "#00707E", "#00A650", "#8CC63F") orig <- orig[-1] # Splice Wheel if (n == 11) return(orig) rgb.tim <- t(col2rgb(orig)) temp <- matrix(NA, ncol = 3, nrow = n) x <- seq(0, 1, , 11) xg <- seq(0, 1, , n) for (k in 1:3) { hold <- spline(x, rgb.tim[, k], n = n)$y hold[hold < 0] <- 0 hold[hold > 255] <- 255 temp[, k] <- round(hold) } ans <- rgb(temp[, 1], temp[, 2], temp[, 3], maxColorValue = 255) # Return Value: ans } ############################################################################### timeSeries/R/fin-splits.R0000644000176000001440000000726012407026706015040 0ustar ripleyusers # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # outlier,timeSeries Removes outliers from a 'timeSeries' object ################################################################################ # DW: # We should call this function no longer outlier, much better woud be # splits() since the function tries to detect splits by large outliers. # For outlier detection we should use better methods than just the sd(). # ------------------------------------------------------------------------------ splits <- function(x, sd = 3, complement = TRUE, ...) { # Return Value: outlier(x=x, sd=sd, complement=complement, ...) } # ------------------------------------------------------------------------------ setMethod("outlier", "ANY", function(x, sd = 3, complement = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns outlier splits # Arguments: # x - a numeric vector # sd - a numeric value of standard deviations, e.g. 5 # means that values larger or smaller tahn five # times the standard deviation of the series will # be detected. # complement - a logical flag, should the outlier series # or its complements be returned. # Note: # This function is thought to find splits in financial # price or index series If a price or index is splitted we # observe in the returns a big jump of several standard # deviations which is identified usual as an outlier. # FUNCTION: # Check arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Find Outliers: SD <- sd * sd(x) if (complement) { ans <- x[x <= SD] } else { ans <- x[x > SD] names(ans) <- as.character(which(x > SD)) } # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans }) # ------------------------------------------------------------------------------ setMethod("outlier", "timeSeries", function(x, sd = 3, complement = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns outliers in a timeSeries object or the complement # Arguments: # x - an object of class 'timeSeries'. # sd - a numeric value of standard deviations, e.g. 5 # means that values larger or smaller tahn ten # times the standard deviation of the series will # be removed. # complement - a logical flag, should the outler series # or its complement be returned. # FUNCTION: # Check if univariate Series: if (!isUnivariate(x)) stop("Supports only univariate timeSeries Objects") # Find Outliers: SD = sd * sd(x) if (complement) { x = x[abs(x) <= SD,] } else { x = x[abs(x) > SD,] } # Return Value: x }) ################################################################################ timeSeries/R/statistics-orderColnames.R0000644000176000001440000001304112460300462017720 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # statsColnames Returns statistically rearranged column names # orderColnames Returns ordered column names of a time Series # sortColnames Returns sorted column names of a time Series # sampleColnames Returns sampled column names of a time Series # pcaColnames Returns PCA correlation ordered column names # hclustColnames Returns hierarchical clustered column names ################################################################################ statsColnames = function(x, FUN = colMeans, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns statistically rearranged column names # Arguments: # x - an object of class timeSeries # FUN - a character string, the name of the function to be used # ... - optional arguments to be passed to FUN # Note: # Example of function Candidates: # colStats calculates column statistics, # colSums calculates column sums, # colMeans calculates column means, # colSds calculates column standard deviations, # colVars calculates column variances, # colSkewness calculates column skewness, # colKurtosis calculates column kurtosis, # colMaxs calculates maximum values in each column, # colMins calculates minimum values in each column, # colProds computes product of all values in each column, # colQuantiles computes quantiles of each column. # FUNCTION: # Apply colStats Function: fun = match.fun(FUN) Sort = sort(fun(x, ...)) Order = names(Sort) ans = colnames(as.matrix(x)[, Order]) attr(ans, "control") <- Sort # Return Value: ans } # ------------------------------------------------------------------------------ orderColnames = function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns ordered column names of a time Series # Arguments: # x - an object of class timeSeries # FUNCTION: # Order: ans = order(colnames(as.matrix(x)), ...) # Return Value: ans } # ------------------------------------------------------------------------------ sortColnames = function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns sorted column names of a time Series # Arguments: # x - an object of class timeSeries # FUNCTION: # Sort: ans = sort(colnames(as.matrix(x)), ...) # Return Value: ans } # ------------------------------------------------------------------------------ sampleColnames = function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns sampled column names of a time Series # Arguments: # x - an object of class timeSeries # FUNCTION: # Sample: ans = sample(colnames(as.matrix(x)), ...) # Return Value: ans } # ------------------------------------------------------------------------------ pcaColnames = function(x, robust = FALSE, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns PCA correlation ordered column names # Arguments: # x - an object of class timeSeries # robust - a logical, should we use robust covariance estimation? # FUNCTION: # Order: if (robust) { x.cor = robustbase::covMcd(as.matrix(x), cor = TRUE, ...)$cor } else { x.cor = cor(as.matrix(x), ...) } x.eigen = eigen(x.cor)$vectors[,1:2] e1 = x.eigen[, 1] e2 = x.eigen[, 2] Order = order(ifelse(e1 > 0, atan(e2/e1), atan(e2/e1)+pi)) ans = colnames(as.matrix(x))[Order] # Return Value: ans } # ------------------------------------------------------------------------------ hclustColnames = function(x, method = c("euclidean", "complete"), ...) { # A function implemented by Diethelm Wuertz # Description: # Returns hierarchical clustered column names # Arguments: # x - an object of class timeSeries # method - the agglomeration method to be used. This should # be (an unambiguous abbreviation of) one of "ward", "single", # "complete", "average", "mcquitty", "median" or "centroid". # ... optional arguments passed to the function hclust # FUNCTION: # Order: Order = hclust(dist(t(as.matrix(x)), method = method[1]), method = method[2], ...)$order ans = colnames(as.matrix(x))[Order] # Return Value: ans } ################################################################################ timeSeries/R/base-sample.R0000644000176000001440000000211711204015177015127 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # sample,timeSeries Resamples a 'timeSeries' object in time ################################################################################ setMethod("sample", "timeSeries", function(x, size, replace = FALSE, prob = NULL) { x[sample(seq(NROW(x)), size, replace, prob), ] } ) ################################################################################ timeSeries/R/fin-drawdowns.R0000644000176000001440000001525012347663061015534 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # drawdowns Generate 'timeSeries' object of drawdown levels # drawdownsStats Compute drawdown stats for univariate time series # FUNCTION: DESCRIPTION: # .drawdownsHistPlot Displays a histogram plot ################################################################################ drawdowns <- function(x, ...) { # A function implemented by Diethelm Wuertz and Tobias Setz # Description: # Generate 'timeSeries' object of drawdown levels # Arguments: # x - an uni- or multivariate 'timeSeries' object of financial # returns # ... - arguments passed to the function na.omit() # Value: # returns an object of class 'timeSeries'. # FUNCTION: # Check Arguments stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Handle Missing Values: r <- na.omit(x, ...) # The starting point of every time series is set to zero. # This ensures that the starting value for cumprodReturns below # (which is the wealth index) is 1. startup <- timeSeries(data=t(rep(0, ncol(r))), charvec=time(r)[1]) # Preset Drawdowns: nms <- colnames(r) drawdowns <- r <- rbind(startup,r) colnames(drawdowns) <- colnames(r) <- nms # Compute multivariate 'timeSeries' of Drawdowns: cumprodReturns <- colCumprods(1 + r) cummaxReturns <- colCummaxs(cumprodReturns) series(drawdowns) <- series(cumprodReturns)/series(cummaxReturns) - 1 drawdowns <- drawdowns[-1, ] # Preserve Title and Documentation: drawdowns@title <- Title drawdowns@documentation <- Documentation # Return Value: drawdowns } # ------------------------------------------------------------------------------ drawdownsStats = function(x, ...) { # A function implemented by Diethelm Wuertz and Tobias Setz # Description: # Finds the drawdowns in an univariate 'timeSeries' object # Arguments: # x - an uni- or multivariate 'timeSeries' object of financial # returns # ... - arguments passed to the function drawdowns() # Value: # returns an object of class 'data.frame' returning # drawdown - the depth of the drawdown # from - the start date # trough - the trough period # to - the end date # length - the length in number of records # peaktrough - the peak trough # recovery - the recovery length in number of records # Author: # Based on Peter Carl, # partly from contributed R package Performance Analytics # Note: # modified with permission from function by Sankalp Upadhyay # # Examples: # x = drawdownsStats(as.timeSeries(data(edhec))[,1]) # FUNCTION: # Check Arguments: stopifnot(isUnivariate(x)) # Compute Drawdowns: drawdowns <- as.vector(drawdowns(x, ...)) time <- time(x) # Find Drawdowns from a Numeric Vector of Returns: draw <- begin <- end <- length <- trough <- c() index <- 1 if (drawdowns[1] >= 0) { priorSign <- 1 } else { priorSign <- 0 } from <- 1 sofar <- drawdowns[1] to <- 1 dmin <- 1 for (i in 2:length(drawdowns)) { thisSign <- ifelse(drawdowns[i] < 0, 0, 1) if (thisSign == priorSign) { if(drawdowns[i]< sofar) { sofar <- drawdowns[i] dmin <- i } to <- i + 1 } else { # @todo: recovery time (in days) draw[index] <- sofar begin[index] <- from trough[index] <- dmin end[index] <- to #cat(sofar, from, to) from <- i sofar <- drawdowns[i] to <- i + 1 dmin <- i index <- index + 1 priorSign <- thisSign } } draw[index] <- sofar begin[index] <- from trough[index] <- dmin end[index] <- to ## length: as.timeDate(pos[x$to])-as.timeDate(pos[x$from]) # If the time series ends in the middle of a drawdown, return the last # date of the time series and set the recovery time to NA endt <- end; endr <- end; if(to > length(time)) { endt[index] <- to - 1 endr[index] <- NA } # Result - an index list with all drawdowns ... ans <- data.frame(from = as.vector(as.character(time[begin])), trough = as.vector(as.character(time[trough])), to = as.vector(as.character(time[endt])), drawdown = as.vector(draw), length = (end - begin + 1), peaktotrough = (trough - begin + 1), recovery = (endr - trough), stringsAsFactors = FALSE) attr(ans, "series") <- x attr(ans, "names") <- c("From", "Trough", "To", "Depth", "Length", "ToTrough", "Recovery") ans <- ans[ans[, "Depth"] < 0, ] # Order Drawdowns: ans <- ans[order(ans[, "Depth"]), ] rownames(ans) <- 1:dim(ans)[1] # Return Value: ans } # ------------------------------------------------------------------------------ if (FALSE) { .drawdownsHistPlot <- function(x, labels = TRUE, col = "steelblue", add.fit = TRUE, rug = TRUE, skipZeros = TRUE, ...) { # Note: # We require(fExtremes) move this function to fAssets # Check Arguments: stopifnot(isUnivariate(x)) # Plot Drawdowns Histogram: X = drawdowns(x, ...) histPlot(X, labels = labels, col = col, add.fit = FALSE, rug = rug, skipZeros = skipZeros, ...) # Add GPD Fit: if (add.fit) { z = -as.vector(X) par = gpdFit(z, u = 0)@fit$par.ests u = seq(0, max(abs(z)), length = 200) v = dgpd(u, xi = par[1], mu = 0, beta = par[2]) lines(-u, v, col = "brown", lwd = 2) } # return Value: invisible() } } ################################################################################ timeSeries/R/timeSeries-isOHLC.R0000644000176000001440000000432711545076570016147 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # .isOHLC Is the series an Open-High-Low-Close series? # .isOHLCV Is the series an Open-High-Low-Close-Volume series? ################################################################################ # DW: # I think we need a better method to detect if a series is a OHLC(V) series # or not. A possible approach would be: # any High >= Open, Close, Low # any Low <= Open, Close, High # Volume >= 0 # number of columns 4(5) # ----------------------------------------------------------------------------- .isOHLC <- function(object) { # A function implemented by Diethelm Wuertz # Description: # Is the series an Open-High-Low-Close series? # Arguments: # object - an object of class 'timeSeries' # FUNCTION: colNames <- c("Open", "High", "Low", "Close") if (colnames(object)[1:4] == colNames) { return(TRUE) } else { return(FALSE) } } # ------------------------------------------------------------------------------ .isOHLCV <- function(object) { # A function implemented by Diethelm Wuertz # Description: # Is the series an Open-High-Low-Close-Volume series? # Arguments: # object - an object of class 'timeSeries' # FUNCTION: colNames <- c("Open", "High", "Low", "Close", "Volume") if (colnames(object) == colNames) { return(TRUE) } else { return(FALSE) } } ################################################################################ timeSeries/R/fin-durations.R0000644000176000001440000000457712347663061015546 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: FINANCIAL TIME SERIES: # durations Computes durations from a 'timeSeries' object ################################################################################ durations <- function(x, trim = FALSE, units = c("secs", "mins", "hours", "days")) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Computes durations from a financial price series # Arguments: # x - a univariate or multivariate 'timeSeries' object or a # numeric vector or matrix. # trim - a logical flag, by default TRUE, the first missing # observation in the return series will be removed. # units - a character value or vector which allows to set the # units in which the durations are measured # Value: # Returns a S4 object of class 'timeSeries'. # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Check for Signal Series: if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # Match Arguments: units <- match.arg(units) # Get Positions and Durations: pos <- time(x) dur <- c(NA, diff(as.integer(difftime(pos, pos[1], units = units[1])))) # Data Matrix: ans <- timeSeries(data = dur, charvec = pos, units = "Duration") if (trim) ans <- ans[-1, ] # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Series: ans } ################################################################################ timeSeries/R/stats-window.R0000644000176000001440000000750212347663061015416 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # window,timeSeries Extracts a piece from a 'timeSeries' object # DEPRECATED: DESCRIPTION: # cut,timeSeries Extracsts a piece from a 'timeSeries' object ################################################################################ .window.timeSeries <- function(x, start, end, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Windows a piece from a 'timeSeries' object. # Arguments: # x - a 'timeSeries' object # from, to - two 'timeDate' position vectors which size the # blocks # Details: # from and to, are both included in the window. # Value: # Returns a S4 object of class 'timeSeries'. # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Check for Signal Series if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # check if all argument names are used if (length(dot <- list(...))) { if (any(names(dot) %in% c("from", "to"))) { if (!is.null(from <- dot$from)) start <- from if (!is.null(to <- dot$to)) end <- to warning("Arguments 'from/to' are deprecated.\nUse instead 'start/end'.", call. = FALSE) } } start <- timeDate(start) end <- timeDate(end) Positions <- time(x) test <- (Positions >= start & Positions <= end) ans <- x[test,] # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } setMethod("window", "timeSeries", function(x, start, end, ...) .window.timeSeries(x, start, end, ...)) # until UseMethod dispatches S4 methods in 'base' functions window.timeSeries <- function(x, ...) .window.timeSeries(x, ...) ############################################################################### .cut.timeSeries <- function (x, from, to, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Cuts out a piece from a 'timeSeries' object. # Arguments: # x - a 'timeSeries' object # from, to - two 'timeDate' position vectors which size the # blocks # Value: # Returns a S4 object of class 'timeSeries'. # FUNCTION: # .Deprecated("window", "timeSeries") stopifnot(is.timeSeries(x)) if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") from = timeDate(from) to = timeDate(to) Positions = time(x) test = (Positions >= from & Positions <= to) ans <- x[test,] # Return value: ans } setMethod("cut", "timeSeries", function (x, from, to, ...) .cut.timeSeries(x, from, to, ...)) # until UseMethod dispatches S4 methods in 'base' functions cut.timeSeries <- function(x, ...) .cut.timeSeries(x, ...) ################################################################################ timeSeries/R/timeSeries-slotDocumentation.R0000644000176000001440000000547713612544270020602 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # getDocumentation # setDocumentation ################################################################################ # FUNCTION: MANAGING ATTRIBUTES # getAttributes # setAttributes<- # INTERNAL FUNCTION: # .appendList ################################################################################ getAttributes <- function (obj) { # A function implemented by Diethelm Wuertz # Description: # FUNCTION: # Check Argument: stopifnot(inherits(obj, "timeSeries")) # Extract Attributes: ans <- attr(obj@documentation, "Attributes") # Return Value: ans } # ----------------------------------------------------------------------------- `setAttributes<-` <- function(obj, value) { # A function implemented by Diethelm Wuertz # Description: # Example: # obj <- dummySeries(); getAttributes(obj) # setAttributes(obj) <- list(mat=matrix(1:4, ncol=2)); getAttributes(obj) # getAttributes(obj)$mat[[1]] # FUNCTION: # Check Arguments: stopifnot(inherits(obj, "timeSeries") , is.list(value) , length(value) == 1) # Compose New Attribute: name <- names(value) names(value) <- NULL A <- list(value) names(A) <- name # print(A) # Get Already Existing Attribute B <- getAttributes(obj) if(is.null(B)) B <- list() # print(B) # Join Attributes: JOINED <- sapply(unique(c(names(A), names(B))), function(x) list(c(A[[x]], B[[x]]))) # print(JOINED) # Assign Attribute: attr(obj@documentation, "Attributes") <- JOINED # Return Value: obj } # ----------------------------------------------------------------------------- .appendList <- function (A, B) { # A function implemented by Diethelm Wuertz # Description: # Appends list B to list A # Arguments: # A - first named list element # B - second named list element # FUNCTION: # Append list B to list A JOINED <- sapply(unique(c(names(A), names(B))), function(x) list(c(A[[x]], B[[x]]))) # Return Value: JOINED } ############################################################################### timeSeries/R/fin-align.R0000644000176000001440000001077112407026706014615 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # align Aligns a 'timeSeries object' to time stamps # .align.timeSeries Aligns a 'timeSeries object' to time stamps ################################################################################ # DW: See also ... # in package timeDate # setMethod("align", "ANY", # setMethod("align", "timeDate", # ------------------------------------------------------------------------------ .align.timeSeries <- function(x, by = "1d", offset = "0s", method = c("before", "after", "interp", "fillNA", "fmm", "periodic", "natural", "monoH.FC"), include.weekends = FALSE, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Aligns a 'timeSeries' object to equidistant time stamps # Arguments: # x - an object of class "timeSeries". # by - # offset - # method - # "before" - use the data from the row whose position is # just before the unmatched position; # "after" - use the data from the row whose position is # just after the unmatched position; # "linear" - interpolate linearly between "before" and # "after". # "fillNA" - fill missing days with NA values # include.weekends - a logical value. Should weekend dates be # included or removed? # Example: # data(usdthb) # data = matrix(usdthb[, "BID"]) # charvec = as.character(usdthb[, "XDATE"]) # USDTHB = timeSeries(data, charvec, format = "%Y%M%d%H%M") # align(USDTHB, by = "3h", offset = "92m") # MSFT = as.timeSeries(data(msft.dat)) # align(MSFT) # See also: # in package timeDate # setMethod("align", "ANY", # setMethod("align", "timeDate", # FUNCTION: # Settings: Title <- x@title Documentation <- x@documentation # Check for Signal Series: if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # check if series sorted if (is.unsorted(x)) x <- sort(x) # Adjustment: Method <- match.arg(method) fun <- switch(Method, before = function(x, u, v) approxfun(x = u, y = v, method = "constant", f = 0, ...)(x), after = function(x, u, v) approxfun(x = u, y = v, method = "constant", f = 1, ...)(x), interp = , fillNA = function(x, u, v) approxfun(x = u, y = v, method = "linear", f = 0.5, ...)(x), fmm = , periodic = , natural = , monoH.FC = function(x, u, v) splinefun(x = u, y = v, method = Method, ...)(x)) # Align timeDate stamps td1 <- time(x) td2 <- align(td1, by = by, offset = offset) # extract numerical values u <- as.numeric(td1, units = "secs") xout <- as.numeric(td2, units = "secs") N = NCOL(x) data <- matrix(ncol = N, nrow = length(td2)) xx <- getDataPart(x) for (i in 1:N) { v <- as.vector(xx[, i]) # New Positions and approximated values: yout <- fun(xout, u, v) if (Method == "fillNA") yout[!(xout %in% u)] = NA # Compose data: data[, i] = yout } # build time series ans <- timeSeries(data, td2, units = colnames(x)) # Remove Weekends: if(!include.weekends) ans <- ans[isWeekday(td2), ] # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } # ------------------------------------------------------------------------------ setMethod("align", "timeSeries", .align.timeSeries) ################################################################################ timeSeries/R/stats-na.contiguous.R0000644000176000001440000000371612347663061016706 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # na.contiguous,timeSeries Finds the longest consecutive of non-missing values ################################################################################ setMethod("na.contiguous", "timeSeries", function(object, ...) { # A function imlemented by Diethelm Wuertz and Yohan Chalabi # Description: # Finds the longest consecutive of non-missing values # Details: # adapted stats:::na.contingous.default to timeSeries objects # Yohan Chalabi # FUNCTION: good <- apply(!is.na(object), 1L, all) if (!sum(good)) stop("all times contain an NA") tt <- cumsum(!good) ln <- sapply(0:max(tt), function(i) sum(tt == i)) seg <- (seq_along(ln)[ln == max(ln)])[1L] - 1 keep <- (tt == seg) st <- min(which(keep)) if (!good[st]) st <- st + 1 en <- max(which(keep)) omit <- integer(0L) n <- NROW(object) if (st > 1) omit <- c(omit, 1L:(st - 1)) if (en < n) omit <- c(omit, (en + 1):n) if (length(omit)) { object <- object[st:en, ] attr(omit, "class") <- "omit" attr(object, "na.action") <- omit } # Return Value: object }) ################################################################################ timeSeries/R/zzz.R0000644000176000001440000000201612120626326013573 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ .onLoad <- function(libname, pkgname) { if(!is.numeric(getRmetricsOptions("max.print"))) setRmetricsOptions(max.print = 100) #-> show() of large matrices # YC: This should really go in methods package. keep it here for # the time being. (R -2.9.0) setOldClass("difftime") } ################################################################################ timeSeries/R/timeSeries.R0000644000176000001440000002551112347663061015064 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # .signalSeries Creates a signal series from scratch # .timeSeries Creates a time series from scratch # METHODS: # timeSeries,ANY,ANY # timeSeries,matrix,missing # timeSeries,matrix,timeDate # timeSeries,matrix,numeric # timeSeries,matrix,ANY ################################################################################ ## .signalSeries : generate units, title, documentation if NULL ## data must be a matrix .signalSeries <- function(data, charvec, units = NULL, format, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { # Description: # Arguments: # Note: # it is possible that a ts object is considered as a # matrix when timeSeries method as dispatched. Hence this check # FUNCTION: if (!is(data, "matrix")) data <- as(data, "matrix") # Add units, title and Documentation: if (is.null(units)) units <- colnames(data) if (is.null(units)) units <- paste("SS.", seq.int(dim(data)[2]), sep = "") if (is.null(title)) title = "Signal Series Object" if (is.null(documentation)) documentation = as.character(date()) # remove rownames of data but keep colnames for # functions like var, cov ... # Note that if it fails, new("timeSeries" should fail to - normal try(dimnames(data) <- list(NULL, units), silent = TRUE) ### new("signalSeries", ### .Data = data, ### units = units, ### recordIDs = recordIDs, ### title = title, ### documentation = documentation) new("timeSeries", .Data = data, units = units, positions = numeric(0), FinCenter = "", format = "counts", recordIDs = recordIDs, title = title, documentation = documentation) } # ------------------------------------------------------------------------------ ## .timeSeries : generate units, title, documentation if NULL ## data must be a matrix and charvec a timeDate object .timeSeries <- SERIES <- function(data, charvec, units = NULL, format, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { # Description: # Creates a time series from scratch # Arguments: # Note: # it is possible that a ts object is considered as a # matrix when timeSeries method as dispatched. Hence this check # FUNCTION: if (!is(data, "matrix")) data <- as(data, "matrix") stopifnot(is(charvec, "numeric")) # Add units, title and Documentation: if (is.null(units)) units <- colnames(data) if (is.null(units)) units <- paste("TS.", seq.int(dim(data)[2]), sep = "") if (is.null(title)) title <- "Time Series Object" if (is.null(documentation)) documentation <- as.character(date()) if (missing(format)) format <- "%Y-%m-%d" if (identical("", FinCenter)) FinCenter <- "GMT" # Remove rownames of data but keep colnames for # functions like var, cov ... # Note that if it fails, new("timeSeries" should fail to - normal try(dimnames(data) <- list(NULL, units), silent = TRUE) positions <- charvec # as.numeric(charvec, "sec") attributes(positions) <- NULL new("timeSeries", .Data = data, positions = positions, units = units, format = format, # charvec@format, FinCenter = FinCenter, # charvec@FinCenter, recordIDs = recordIDs, title = title, documentation = documentation) } # ------------------------------------------------------------------------------ ## missing ANY setMethod("timeSeries", signature(data = "missing", charvec = "ANY"), function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { .signalSeries(data = matrix(NA), units = units, recordIDs = recordIDs, title = title, documentation = documentation, ...) }) # ------------------------------------------------------------------------------ ## missing missing setMethod("timeSeries", signature(data = "missing", charvec = "missing"), function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { .signalSeries(data = matrix(NA), units = units, recordIDs = recordIDs, title = title, documentation = documentation, ...) }) # ------------------------------------------------------------------------------ ## ANY ANY setMethod("timeSeries", signature(data = "ANY", charvec = "ANY"), function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { data <- as(data, "matrix") if (!is(data, "matrix")) stop("Could not coerce 'data' to a matrix") callGeneric(data = data, charvec = charvec, units = units, format = format, zone = zone, FinCenter = FinCenter, recordIDs = recordIDs, title = title, documentation = documentation, ...) }) # ------------------------------------------------------------------------------ ## ANY missing setMethod("timeSeries", signature(data = "ANY", charvec = "missing"), function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { data <- as(data, "matrix") if (!is(data, "matrix")) stop("Could not coerce 'data' to a matrix") callGeneric(data = data, units = units, format = format, zone = zone, FinCenter = FinCenter, recordIDs = recordIDs, title = title, documentation = documentation, ...) }) # ------------------------------------------------------------------------------ ## matrix missing setMethod("timeSeries", signature(data = "matrix", charvec = "missing"), function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { charvec <- rownames(data) if (is.null(charvec)) { .signalSeries(data = data, units = units, recordIDs = recordIDs, title = title, documentation = documentation, ...) } else { callGeneric(data = data, charvec = charvec, units = units, format = format, zone = zone, FinCenter = FinCenter, recordIDs = recordIDs, title = title, documentation = documentation, ...) } } ) # ------------------------------------------------------------------------------ ## matrix timeDate setMethod("timeSeries", signature(data = "matrix", charvec = "timeDate"), function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { if (any(is.na(charvec))) return(.signalSeries(data = data, units = units, recordIDs = recordIDs, title = title, documentation = documentation, ...)) if (any(!c(zone, FinCenter) %in% "")) charvec <- timeDate(charvec, format = format, zone = zone, FinCenter = FinCenter) .timeSeries(data = data, charvec = as.numeric(charvec, "sec"), units = units, format = charvec@format, FinCenter = charvec@FinCenter, recordIDs = recordIDs, title = title, documentation = documentation, ...) } ) # ------------------------------------------------------------------------------ ## matrix numeric setMethod("timeSeries", signature(data = "matrix", charvec = "numeric"), function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { if (any(!c(zone, FinCenter) %in% "")) { td <- timeDate(charvec, zone = zone, FinCenter = FinCenter) charvec <- as.numeric(td, "sec") FinCenter <- finCenter(td) } .timeSeries(data = data, charvec = charvec, units = units, FinCenter = FinCenter, recordIDs = recordIDs, title = title, documentation = documentation, ...) } ) # ------------------------------------------------------------------------------ ## matrix ANY setMethod("timeSeries", signature(data = "matrix", charvec = "ANY"), function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { # if charvec NULL returns a signal series if (is.null(charvec)) return(.signalSeries(data = data, units = units, recordIDs = recordIDs, title = title, documentation = documentation, ...)) # coerce charvec to timeDate charvec <- timeDate(charvec = charvec, format = format, zone = zone, FinCenter = FinCenter) if (any(is.na(charvec))) # Note : there is already a warning in timeDate if there are NA's .signalSeries(data = data, units = units, recordIDs = recordIDs, title = title, documentation = documentation, ...) else .timeSeries(data = data, charvec = as.numeric(charvec, "sec"), units = units, format = charvec@format, FinCenter = charvec@FinCenter, recordIDs = recordIDs, title = title, documentation = documentation, ...) } ) ################################################################################ timeSeries/R/base-start.R0000644000176000001440000000403011545076570015013 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # start,timeSeries Extracts start date of a 'timeSeries' object # end,timeSeries Extracts end date of a 'timeSeries' object ################################################################################ .start.timeSeries <- function(x, ...) { # Description: # Extracts start date of a 'timeSeries' object # FUNCTION: # Extract Date: if (length(x@positions)>0) timeDate(min(x@positions), zone = "GMT", FinCenter = x@FinCenter) else NULL } setMethod("start" , "timeSeries", function(x, ...) .start.timeSeries(x, ...)) # until UseMethod dispatches S4 methods in 'base' functions start.timeSeries <- function(x, ...) .start.timeSeries(x, ...) # ------------------------------------------------------------------------------ .end.timeSeries <- function(x, ...) { # Description: # Extracts start date of a 'timeSeries' object # FUNCTION: # Extract Date: if (length(x@positions)>0) timeDate(max(x@positions), zone = "GMT", FinCenter = x@FinCenter) else NULL } setMethod("end", "timeSeries", function(x, ...) .end.timeSeries(x, ...)) # until UseMethod dispatches S4 methods in 'base' functions end.timeSeries <- function(x, ...) .end.timeSeries(x, ...) ################################################################################ timeSeries/R/stats-lag.R0000644000176000001440000000754512347663061014661 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # lag,timeSeries Lags a 'timeSeries' object ################################################################################ setMethod("lag" , "timeSeries", function(x, k = 1, trim = FALSE, units = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Lags a 'timeSeries' object. # Arguments: # x - a 'timeSeries' object. # k - an integer indicating which lag to use. By default 1. # Note, negative lags are to data in the future. # trim - a logical. Should NAs at the beginning of the # series be removed? By default FALSE. # units - # ... - # Details: # The arguments differ in the following way from the function # stats::lag - lag(x, k = 1, ...) # Value: # Returns a lagged object of class 'timeSeries'. # Example: # SPI = 100* as.timeSeries(data(LPP2005REC))[1:20, "SPI"] # Note negative lags are to data in the future ! # lag(SPI, k = -2:2) # lag(SPI, k = 0:2 , trim = TRUE) # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Internal Function: tslagMat <- function(x, k = 1) { # Internal Function: tslag1 = function(x, k) { y = x if (k > 0) y = c(rep(NA, times = k), x[1:(length(x)-k)]) if (k < 0) y = c(x[(-k+1):length(x)], rep(NA, times = -k)) y } # Bind: ans <- NULL for (i in k) { ans <- cbind(ans, tslag1(x, i)) } # As Vector: if (length(k) == 1) ans <- as.vector(ans) # Return Value: ans } # Convert: y <- getDataPart(x) Dim <- dim(y)[2] # Lag on each Column: z <- NULL for (i in 1:Dim) { ts <- tslagMat( y[, i], k = k) #, trim = FALSE) z <- cbind(z, ts) } # Positions pos <- x@positions # Record IDs: df <- x@recordIDs # Trim: if (trim){ idx <- !is.na(apply(z, 1, sum)) z <- z[idx, , drop = FALSE] pos <- pos[idx] if (sum(dim(df)) > 0) { df <- df[idx, , drop = FALSE] rownames(df) <- seq.int(sum(idx)) } } # Augment Colnames: cn <- colnames(x) a <- if (is.null(units)) # ensure that colnames is replicated according to the length # of lag indexes. as.vector(matrix(cn, nrow = length(k), ncol = length(cn), byrow = TRUE)) else units kcols <- rep(k, times = ncol(y)) b <- paste("[", kcols, "]", sep="") ab <- paste(a, b, sep = "") units <- ab # Result: ans <- timeSeries(data = z, charvec = pos, units = units, format = x@format, FinCenter = x@FinCenter, recordIDs = df) # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans }) # until UseMethod dispatches S4 methods in 'base' functions lag.timeSeries <- function(x, ...) timeSeries::lag(x, ...) ################################################################################ timeSeries/R/statistics-colCumsums.R0000644000176000001440000001443611545077672017307 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: COLUMN CUMULATIVE SUMS: # colCumsums Computes sample cumulated sums by column # colCumsums,matrix S3 default method (for matrix objects) # colCumsums,timeSeries S3 method for timeSeries objects # FUNCTION: COLUMN CUMULATIVE MAXIMA: # colCummaxs Computes cumulated maximum values # colCummaxs,matrix S3 default method (for matrix objects) # colCummaxs,timeSeries S3 method for timeSeries objects # FUNCTION: COLUMN CUMULATIVE MAXIMA: # colCummins Computes cumulated maximum values # colCummins,matrix S3 default method (for matrix objects) # colCummins,timeSeries S3 method for timeSeries objects # FUNCTION: COLUMN CUMULATIVE MINIMA: # colCumprods Computes cumulated product values # colCumprods,matrix S3 default method (for matrix objects) # colCumprods,timeSeries S3 method for timeSeries objects # FUNCTION: COLUMN CUMULATIVE RETURNS: # colCumreturns Computes cumulated product values # colCumreturns,matrix S3 default method (for matrix objects) # colCumreturns,timeSeries S3 method for timeSeries objects ################################################################################ # ------------------------------------------------------------------------------ setMethod("colCumsums", "matrix", function(x, na.rm = FALSE, ...) { if (na.rm) x <- na.omit(x) ans <- apply(x, 2, cumsum, ...) # special treatment when x has one row because apply returns a vector if (NROW(x) == 1) ans <- matrix(ans, nrow = 1, dimnames = dimnames(x)) ans }) # ------------------------------------------------------------------------------ setMethod("colCumsums", "timeSeries", function(x, na.rm = FALSE, ...) setDataPart(x, callGeneric(getDataPart(x), na.rm = na.rm, ...))) # ------------------------------------------------------------------------------ setMethod("colCummaxs", "matrix", function(x, na.rm = FALSE, ...) { if (na.rm) x <- na.omit(x) ans <- apply(x, 2, cummax, ...) # special treatment when x has one row because apply returns a vector if (NROW(x) == 1) ans <- matrix(ans, nrow = 1, dimnames = dimnames(x)) ans }) # ------------------------------------------------------------------------------ setMethod("colCummaxs", "timeSeries", function(x, na.rm = FALSE, ...) setDataPart(x, callGeneric(getDataPart(x), na.rm = na.rm, ...))) # ------------------------------------------------------------------------------ setMethod("colCummins", "matrix", function(x, na.rm = FALSE, ...) { if (na.rm) x <- na.omit(x) ans <- apply(x, 2, cummin, ...) # special treatment when x has one row because apply returns a vector if (NROW(x) == 1) ans <- matrix(ans, nrow = 1, dimnames = dimnames(x)) ans }) # ------------------------------------------------------------------------------ setMethod("colCummins", "timeSeries", function(x, na.rm = FALSE, ...) setDataPart(x, callGeneric(getDataPart(x), na.rm = na.rm, ...))) # ------------------------------------------------------------------------------ setMethod("colCumprods", "matrix", function(x, na.rm = FALSE, ...) { if (na.rm) x <- na.omit(x) ans <- apply(x, 2, cumprod, ...) # special treatment when x has one row because apply returns a vector if (NROW(x) == 1) ans <- matrix(ans, nrow = 1, dimnames = dimnames(x)) ans }) # ------------------------------------------------------------------------------ setMethod("colCumprods", "timeSeries", function(x, na.rm = FALSE, ...) setDataPart(x, callGeneric(getDataPart(x), na.rm = na.rm, ...))) # ------------------------------------------------------------------------------ setMethod("colCumreturns", "matrix", function(x, method = c("geometric", "simple"), na.rm = FALSE, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Cumulates Returns from a stream of returns # Arguments: # x : a matrix object # method : generate geometric or simple returns, # default "geometric". # FUNCTION: # Handle Missing Values: if (na.rm) x <- na.omit(x, ...) method <- match.arg(method) # Return Value switch(method, "geometric" = colCumsums(x), "simple" = colCumprods(1+x) - 1) }) # ------------------------------------------------------------------------------ setMethod("colCumreturns", "timeSeries", function(x, method = c("geometric", "simple"), na.rm = FALSE, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Cumulates Returns from a stream of returns # Arguments: # x : a timeSeries object # method : generate geometric or simple returns, # default "geometric". # FUNCTION: # Handle Missing Values: if (na.rm) x <- na.omit(x, ...) method <- match.arg(method) # Return Value switch(method, "geometric" = colCumsums(x), "simple" = colCumprods(1+x) - 1) }) ################################################################################ timeSeries/R/aaa-Deprecated.R0000644000176000001440000000352011545076570015531 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # DEPRECATED: # .description # durationSeries # midquoteSeries # spreadSeries ################################################################################ .description <- function() { # Deprecated: .Deprecated(new = "description", package = "timeSeries") # Return Value: description() } # ------------------------------------------------------------------------------ durationSeries <- function(...) { # Deprecated: .Deprecated(new = "returns", package = "timeSeries") # Return Value: durations(...) } # ------------------------------------------------------------------------------ midquoteSeries = function(...) { # Deprecated: .Deprecated(new = "midquotes", package = "timeSeries") # Return Value: midquotes(...) } # ------------------------------------------------------------------------------ spreadSeries = function(...) { # Deprecated: .Deprecated(new = "spreads", package = "timeSeries") # Return Value: spreads(...) } ################################################################################ timeSeries/R/statistics-colSums.R0000644000176000001440000001151112347663061016563 0ustar ripleyusers # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ # FUNCTION: COLUMN STATISTICS: # colStats Computes sample statistics by column # colSums Computes sums of all values in each column # colMeans Computes means of all values in each column # colSds Computes standardard deviation of each column # colVars Computes sample variance by column # colSkewness Computes sample skewness by column # colKurtosis Computes sample kurtosis by column # colMaxs Computes maximum values in each colum # colMins Computes minimum values in each colum # colProds Computes product of all values in each colum # colQuantiles Computes quantiles of all values in each colum # DEPRECATED: NO LONGER USED: # colAvgs Computes sample mean by column # colStdevs Computes sample standard deviation by column # mean.timeSeries Computes sample means by column # var.timeSeries Computes sample variance by column ################################################################################ colStats <- function(x, FUN, ...) { # A function implemented by Diethelm Wuertz # Description: # Computes sample statistics by column # FUNCTION: # Statistics: if (inherits(x, "timeSeries")) apply(na.omit(getDataPart(x), ...), 2, FUN, ...) #<< YC : as.matrix is slow ! else apply(na.omit(as.matrix(x), ...), 2, FUN, ...) } # ------------------------------------------------------------------------------ # YC important because default colSums is unefficient since it retrieves # full dimnames, i.e. rownames which is very time consuming if (getRversion() < "2.9.0") { setMethod("colSums", "timeSeries", function(x, na.rm = FALSE, dims = 1L) { x <- getDataPart(x) callGeneric() }) } else { setMethod("colSums", "timeSeries", function(x, na.rm = FALSE, dims = 1L, ...) { x <- getDataPart(x) callGeneric() }) } # ------------------------------------------------------------------------------ # YC important because default colSums is unefficient since it retrieves # full dimnames, i.e. rownames which is very time consuming if (getRversion() < "2.9.0") { setMethod("colMeans", "timeSeries", function(x, na.rm = FALSE, dims = 1L) { x <- getDataPart(x) callGeneric() }) } else { setMethod("colMeans", "timeSeries", function(x, na.rm = FALSE, dims = 1L, ...) { x <- getDataPart(x) callGeneric() }) } # ------------------------------------------------------------------------------ colSds <- function(x, ...) { colStats(x, "sd", ...) } colVars <- function(x, ...) { colStats(x, "var", ...) } colSkewness <- function(x, ...) { colStats(x, "skewness", ...) } colKurtosis <- function(x, ...) { colStats(x, "kurtosis", ...) } colMaxs <- function(x, ...) { colStats(x, "max", ...) } colMins <- function(x, ...) { colStats(x, "min", ...) } colProds <- function(x, ...) { colStats(x, "prod", ...) } # ------------------------------------------------------------------------------ colQuantiles <- function(x, prob = 0.05, ...) { # FUNCTION: stopifnot(length(prob) == 1) colStats(x, "quantile", probs = prob, ...) } ################################################################################ # DEPRECATED: colAvgs <- function(x, ...) { # FUNCTION: colMeans(x, ...) } # ------------------------------------------------------------------------------ colStdevs <- function(x, ...) { # FUNCTION: colStats(x, "sd", ...) } # ------------------------------------------------------------------------------ # mean.timeSeries <- colMeans # var.timeSeries <- colVars ################################################################################ timeSeries/R/base-subsetting.R0000644000176000001440000005375612010154370016047 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # METHOD: SUBSETTING METHODS ON DATA: # .subset_timeSeries # .findIndex # $,timeSeries Subsets a time series by column names # $<-,timeSeries Replaces subset by column names # [,timeSeries Subsets a time series object # [<-,timeSeries Assigns value to subsets of a time series ################################################################################ ################################################################################ # index ################################################################################ # Note : no "character" -> because needs to be coerced to timeDate object. setClassUnion("index_timeSeries", members = c("numeric", "logical")) setClassUnion("time_timeSeries", members = c("POSIXt", "Date")) # ------------------------------------------------------------------------------ .subset_timeSeries <- function(x, i, j) { stopifnot(inherits(x, "timeSeries")) stopifnot(is(i, "index_timeSeries")) stopifnot(is(j, "index_timeSeries")) # subset data and positions t <- try(data <- .subset(x, i, j, drop = FALSE), silent = TRUE) if (inherits(t, "try-error")) { # cast error and remove calling function msg <- sub("Error in.*: \n *", "", t) stop(msg, call. = FALSE) } pos <- if (length(x@positions)>0) .subset(x@positions, i) else numeric(0) units <- .subset(x@units, j) # Record IDs: df <- x@recordIDs if (prod(dim(df))) df <- df[i, , drop = FALSE] # Result new("timeSeries", .Data = data, title = x@title, documentation = x@documentation, format = x@format, FinCenter = x@FinCenter, units = units, recordIDs = df, positions = pos) } # ------------------------------------------------------------------------------ .findIndex <- function(ipos, pos) { attributes(ipos) <- NULL if (unsorted <- is.unsorted(pos)) { or <- order(pos) pos <- pos[or] } i <- findInterval(ipos, pos) if (!identical(ipos, pos[i])) stop("subscript out of bounds", call. = FALSE) if (unsorted) i <- or[i] i } ################################################################################ # [,timeSeries Subsets of a 'timeSeries' object ################################################################################ ## i <- c("index_timeSeries", "character", "timeDate", ## "timeSeries", "missing", "ANY") ## j <- c("index_timeSeries", "character", "timeSeries", ## "missing", "ANY") ## expand.grid(i = i, j = j) ## > i j ## 1 index_timeSeries index_timeSeries ## 2 character index_timeSeries ## 3 timeDate index_timeSeries ## 4 timeSeries index_timeSeries ## 5 missing index_timeSeries ## 6 ANY index_timeSeries ## 7 index_timeSeries character ## 8 character character ## 9 timeDate character ## 10 timeSeries character ## 11 missing character ## 12 ANY character ## 13 index_timeSeries timeSeries ## 14 character timeSeries ## 15 timeDate timeSeries ## 16 timeSeries timeSeries ## 17 missing timeSeries ## 18 ANY timeSeries ## 19 index_timeSeries missing ## 20 character missing ## 21 timeDate missing ## 22 timeSeries missing ## 23 missing missing ## 24 ANY missing ## 25 index_timeSeries ANY ## 26 character ANY ## 27 timeDate ANY ## 28 timeSeries ANY ## 29 missing ANY ## 30 ANY ANY ## YC : Added i=time_timeSeries i <- "time_timeSeries" j <- c("index_timeSeries", "character", "timeSeries", "missing", "ANY") expand.grid(i = i, j = j) ## 1 time_timeSeries index_timeSeries ## 2 time_timeSeries character ## 3 time_timeSeries timeSeries ## 4 time_timeSeries missing ## 5 time_timeSeries ANY # ------------------------------------------------------------------------------ ## FIXME : deal with signal series # ------------------------------------------------------------------------------ ## 1 index_timeSeries index_timeSeries setMethod("[", signature(x = "timeSeries", i = "index_timeSeries", j = "index_timeSeries"), function(x, i, j, ..., drop = FALSE) .subset_timeSeries(x, i, j)) # ------------------------------------------------------------------------------ ## 2 character index_timeSeries setMethod("[", signature(x = "timeSeries", i = "character", j = "index_timeSeries"), function(x, i, j, ..., drop = FALSE) { td <- timeDate(i) if (any(is.na(td))) return(as.vector(NA)) # bad to use directly @Data but more efficient in this case i <- .findIndex(td@Data, x@positions) .subset_timeSeries(x, i, j) }) # ------------------------------------------------------------------------------ ## 3 timeDate index_timeSeries setMethod("[", signature(x = "timeSeries", i = "timeDate", j = "index_timeSeries"), function(x, i, j, ..., drop = FALSE) { # bad to use directly @Data but more efficient in this case i <- .findIndex(i@Data, x@positions) .subset_timeSeries(x, i, j) }) # ------------------------------------------------------------------------------ ## 4 timeSeries index_timeSeries setMethod("[", signature(x = "timeSeries", i = "timeSeries", j = "index_timeSeries"), function(x, i, j, ..., drop = FALSE) { if (x@format != "counts" && i@format != "counts" && finCenter(x) != finCenter(i)) stop("FinCenter of timeSeries and subset do not match") .subset_timeSeries(x, as.vector(i), j) }) # ------------------------------------------------------------------------------ ## 5 missing index_timeSeries setMethod("[", signature(x = "timeSeries", i = "missing", j = "index_timeSeries"), function(x, i, j, ..., drop = FALSE) .subset_timeSeries(x, TRUE, j)) # ------------------------------------------------------------------------------ ## 6 ANY index_timeSeries setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 7 index_timeSeries character setMethod("[", signature(x = "timeSeries", i = "index_timeSeries", j = "character"), function(x, i, j, ..., drop = FALSE) { j <- pmatch(j, slot(x, "units"), duplicates.ok = TRUE) if (any(is.na(j))) stop("subscript out of bounds", call. = FALSE) .subset_timeSeries(x, i, j) }) # ------------------------------------------------------------------------------ ## 8 character character setMethod("[", signature(x = "timeSeries", i = "character", j = "character"), function(x, i, j, ..., drop = FALSE) { j <- pmatch(j, slot(x, "units"), duplicates.ok = TRUE) if (any(is.na(j))) stop("subscript out of bounds", call. = FALSE) callGeneric(x=x, i=i, j=j, drop=drop) }) # ------------------------------------------------------------------------------ ## 9 timeDate character setMethod("[", signature(x = "timeSeries", i = "timeDate", j = "character"), function(x, i, j, ..., drop = FALSE) { # bad to use directly @Data but more efficient in this case i <- .findIndex(i@Data, x@positions) j <- pmatch(j, slot(x, "units"), duplicates.ok = TRUE) if (any(is.na(j))) stop("subscript out of bounds", call. = FALSE) .subset_timeSeries(x, i, j) }) # ------------------------------------------------------------------------------ ## 10 timeSeries character # inherited method works fine # ------------------------------------------------------------------------------ ## 11 missing character setMethod("[", signature(x = "timeSeries", i = "missing", j = "character"), function(x, i, j, ..., drop = FALSE) { j <- pmatch(j, slot(x, "units"), duplicates.ok = TRUE) if (any(is.na(j))) stop("subscript out of bounds", call. = FALSE) .subset_timeSeries(x, TRUE, j) }) # ------------------------------------------------------------------------------ ## 12 ANY character setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 13 index_timeSeries timeSeries ## 14 character timeSeries ## 15 timeDate timeSeries ## 16 timeSeries timeSeries ## 17 missing timeSeries ## 18 ANY timeSeries ## rely on inherited methods # ------------------------------------------------------------------------------ ## 19 index_timeSeries missing setMethod("[", signature(x = "timeSeries", i = "index_timeSeries", j = "missing"), function(x, i, j, ..., drop = FALSE) { if(nargs() == 2) { # same sub-setting as matrix if(any(as.logical(i)) || prod(dim(x)) == 0) as.vector(x)[i] } else { .subset_timeSeries(x, i, TRUE) } }) # ------------------------------------------------------------------------------ ## 20 character missing setMethod("[", signature(x = "timeSeries", i = "character", j = "missing"), function(x, i, j, ..., drop = FALSE) { if (nargs() == 2) as.numeric(NA) #-> return NA if comma missing else callGeneric(x=x, i=i, j=TRUE) }) # ------------------------------------------------------------------------------ ## 21 timeDate missing setMethod("[", signature(x = "timeSeries", i = "timeDate", j = "missing"), function(x, i, j, ..., drop = FALSE) { # do not return NA if comma missing because timeDate index # bad to use directly @Data but more efficient in this case i <- .findIndex(i@Data, x@positions) .subset_timeSeries(x, i, TRUE) }) # ------------------------------------------------------------------------------ ## 22 timeSeries missing setMethod("[", signature(x = "timeSeries", i = "timeSeries", j = "missing"), function(x, i, j, ..., drop = FALSE) { if (x@format != "counts" && i@format != "counts" && finCenter(x) != finCenter(i)) stop("FinCenter of timeSeries and subset do not match") if(nargs() == 2) { if(any(as.logical(i)) || prod(dim(x)) == 0) as.vector(x)[as.vector(i)] } else { .subset_timeSeries(x, as.vector(i), TRUE) } }) # ------------------------------------------------------------------------------ ## workaround i <- matrix. setMethod("[", signature(x = "timeSeries", i = "matrix", j = "missing"), function(x, i, j, ..., drop = FALSE) { if(nargs() == 2) { # same sub-setting as matrix if(any(as.logical(i)) || prod(dim(x)) == 0) as.vector(x)[i] } else { .subset_timeSeries(x, as.vector(i), TRUE) } }) # ------------------------------------------------------------------------------ ## 23 missing missing setMethod("[", signature(x = "timeSeries", i = "missing", j = "missing"), function(x, i, j, ..., drop = FALSE) x) # ------------------------------------------------------------------------------ ## 24 ANY missing setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 25 index_timeSeries ANY setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 26 character ANY setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 27 timeDate ANY setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 28 timeSeries ANY setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 29 missing ANY setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 30 ANY ANY setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 1 time_timeSeries index_timeSeries setMethod("[", signature(x = "timeSeries", i = "time_timeSeries", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) { i <- timeDate(i) callGeneric(x=x, i=i, j=j, drop=drop) }) # ------------------------------------------------------------------------------ ## 2 time_timeSeries character setMethod("[", signature(x = "timeSeries", i = "time_timeSeries", j = "character"), function(x,i,j, ..., drop = FALSE) { i <- timeDate(i) callGeneric(x=x, i=i, j=j, drop=drop) }) # ------------------------------------------------------------------------------ ## 4 time_timeSeries missing setMethod("[", signature(x = "timeSeries", i = "time_timeSeries", j = "missing"), function(x,i,j, ..., drop = FALSE) { i <- timeDate(i) callGeneric(x=x, i=i, drop=drop) }) # ------------------------------------------------------------------------------ ## 5 time_timeSeries ANY setMethod("[", signature(x = "timeSeries", i = "time_timeSeries", j = "ANY"), function(x,i,j, ..., drop = FALSE) { i <- timeDate(i) callGeneric(x=x, i=i, j=j, drop=drop) }) ################################################################################ # $,timeSeries Subset by column names ################################################################################ # should behave the same way as $,data.frame setMethod("$", signature(x = "timeSeries"), function (x, name) { nc <- colnames(x) nr <- names(x@recordIDs) dataIdx <- pmatch(name, nc) recordIDsIdx <- pmatch(name, nr) # if none or more than one match returns NULL if ((is.na(dataIdx) && is.na(recordIDsIdx)) || (!is.na(dataIdx) && !is.na(recordIDsIdx))) return(NULL) if (!is.na(dataIdx)) return(.subset(x, TRUE, dataIdx)) if (!is.na(recordIDsIdx)) return(x@recordIDs[[recordIDsIdx]]) NULL }) # methods to generate completion after $ .DollarNames.timeSeries <- function(x, pattern) grep(pattern, names(x), value = TRUE) ################################################################################ # $<-,timeSeries Subset by column names ################################################################################ .dollar_assign <- function(x, name, value) { stopifnot(inherits(x, "timeSeries")) # check size of value if (NROW(value) < nrow(x)) { value <- rep(value, length.out = nrow(x)) } else if (NROW(value) > nrow(x)) { stop(gettextf("replacement has %i rows, time series has %i", NROW(value), nrow(x))) #, call. = FALSE) } # assign value to recordIDs if (length(x@recordIDs)) { x@recordIDs[[name]] <- value } else { x@recordIDs <- as.data.frame(value) colnames(x@recordIDs) <- name } # check if object is valid validObject(x) x } setReplaceMethod("$", signature(x = "timeSeries", value = "numeric"), function(x, name, value) { # check size of value if (NROW(value) < nrow(x)) { value <- rep(value, length.out = nrow(x)) } else if (NROW(value) > nrow(x)) { stop(gettextf("replacement has %i rows, time series has %i", NROW(value), nrow(x))) #, call. = FALSE) } # get data part data <- getDataPart(x) # coerce value to matrix ncol <- NCOL(value) value <- matrix(value, ncol = NCOL(value), dimnames = NULL) # set up colnames cn <- colnames(value) if (any(is.null(cn))) cn <- if (ncol > 1) paste(name, ".", seq.int(ncol), sep = "") else name colnames(value) <- cn # if name already present - subsitute ... if (any(cdata <- (colnames(data) %in% cn))) { cvalue <- cn %in% colnames(data) data[,cdata] <- value[,cvalue] value <- cbind(data, value[,!cvalue]) ans <- setDataPart(x, value) } else { ans <- .dollar_assign(x, name, as.vector(value)) } # return ans }) setReplaceMethod("$", signature(x = "timeSeries", value = "factor"), function(x, name, value) .dollar_assign(x, name, value)) setReplaceMethod("$", signature(x = "timeSeries", value = "ANY"), function(x, name, value) .dollar_assign(x, name, value)) ################################################################################ # [<-,timeSeries Assign value to subsets of a 'timeSeries' object ################################################################################ # Note that most of the generic function works by default with [<-,timeDate # only need to deal with special cases that are i <- ("timeDate", "character") # ------------------------------------------------------------------------------ # timeDate setReplaceMethod("[", signature(x = "timeSeries", i = "timeDate", j = "ANY"), function(x, i, j, value) { # bad to use directly @Data but more efficient in this case i <- .findIndex(i@Data, x@positions) callGeneric(x=x, i=i, j=j, value=value) }) setReplaceMethod("[", signature(x = "timeSeries", i = "timeDate", j = "missing"), function(x, i, j, value) callGeneric(x=x, i=i, j=TRUE, value=value)) # ------------------------------------------------------------------------------ # character setReplaceMethod("[", signature(x = "timeSeries", i = "character", j = "ANY"), function(x, i, j, value) { i <- timeDate(i) callGeneric(x=x, i=i, j=j, value=value) }) setReplaceMethod("[", signature(x = "timeSeries", i = "character", j = "missing"), function(x, i, j, value) { i <- timeDate(i) callGeneric(x=x, i=i, j=TRUE, value=value) }) ################################################################################ timeSeries/R/stats-aggregate.R0000644000176000001440000001326512407026706016034 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # aggregate,timeSeries Aggregates a 'timeSeries' object # FUNCTION: DESCRIPTION: # daily2monthly Aggregates a daily to monthly 'timeSeries' object # daily2weekly Aggregates a daily to weekly 'timeSeries' object ################################################################################ .aggregate.timeSeries <- function(x, by, FUN, ...) { # A function implemented by Yohan Chalabi and Diethelm Wuertz # Description: # Aggregates a 'timeSeries' object # Details: # This function can be used to aggregate and coursen a # 'timeSeries' object. # Arguments: # x - a 'timeSeries' object to be aggregated # by - a calendarical block # FUN - function to be applied, by default 'colMeans' # ... - additional argument to be passed to the newly generated # 'timeSeries' object # Value: # Returns a S4 object of class 'timeSeries'. # Examples: # Quarterly Aggregation: # m = matrix(rep(1:12,2), ncol = 2) # ts = timeSeries(m, timeCalendar()) # Y = getRmetricsOptions("currentYear"); Y # from = paste(Y, "04-01", sep = "-"); to = paste(Y+1, "01-01", sep = "-") # by = timeSequence(from, to, by = "quarter") - 24*3600; by # ts; aggregate(ts, by, sum) # Weekly Aggregation: # dates = timeSequence(from = "2009-01-01", to = "2009-02-01", by = "day") # data = 10 * round(matrix(rnorm(2*length(dates)), ncol = 2), 1); data # ts = timeSeries(data = data, charvec = dates) # by = timeSequence(from = "2009-01-08", to = "2009-02-01", by = "week") # by = by - 24*3600; aggregate(ts, by, sum) # FUNCTION: # Check Arguments: if (!((inherits(by, "timeDate") && x@format != "counts") || (is.numeric(by) && x@format == "counts"))) stop("'by' should be of the same class as 'time(x)'", call.=FALSE) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Make sure that x is sorted: if (is.unsorted(x)) x <- sort(x) # Sort and remove double entries in by: by <- unique(sort(by)) INDEX <- findInterval(x@positions, as.numeric(by, "sec") + 1) INDEX <- INDEX + 1 is.na(INDEX) <- !(INDEX <= length(by)) # YC : ncol important to avoid problems of dimension dropped by apply data <- matrix(apply(getDataPart(x), 2, tapply, INDEX, FUN), ncol=ncol(x)) rownames(data) <- as.character(by[unique(na.omit(INDEX))]) colnames(data) <- colnames(x) ans <- timeSeries(data, ...) # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } setMethod("aggregate", "timeSeries", function(x, by, FUN, ...) .aggregate.timeSeries(x, by, FUN, ...)) # until UseMethod dispatches S4 methods in 'base' functions aggregate.timeSeries <- function(x, ...) .aggregate.timeSeries(x, ...) ################################################################################ daily2monthly <- function (x, init = FALSE) { # A function implemented by Diethelm Wuertz # Description: # Converts daily to monthly series # Arguments: # x - daily time series # init - should the index series converted to a wealth series # FUNCTION: # Save Colnames: colNames <- colnames(x) # Fill to end of Month: Time <- unique(sort(timeLastDayInMonth(time(x)))) x.endOfMonth <- x[nrow(x), ] time(x.endOfMonth) <- rev(Time)[1] x <- rbind(x, x.endOfMonth) x <- alignDailySeries(x, include.weekends=TRUE) # Cut Properly on end of Month: today <- timeDate(Sys.Date()) first <- timeFirstDayInMonth(today) x <- x[time(x) < first, ] Time <- unique(sort(timeLastDayInMonth(time(x)))) # Align Properly: mSeries <- alignDailySeries(x, include.weekends=TRUE) mSeries <- mSeries[Time, ] # Optionally Initialize: if (init) for (i in 1:ncol(mSeries)) mSeries[, i] <- mSeries[, i]/as.vector(mSeries[1, i]) colnames(mSeries) <- colNames # Return Value: mSeries } # ----------------------------------------------------------------------------- daily2weekly <- function(x, startOn="Tue", init=FALSE) { # A function implemented by Diethelm Wuertz # Description: # Converts daily to weekly series # Arguments: # x - daily time series # init - should the index series converted to a wealth series # FUNCTION: # Convert Series: mSeries <- alignDailySeries(x, include.weekends = TRUE) start <- which(dayOfWeek(time(mSeries[1:7, ])) == startOn) mSeries <- mSeries[seq(start, nrow(mSeries), by = 7), ] # Wealth Initialization: if (init) for (i in 1:ncol(mSeries)) mSeries[, i] <- mSeries[, i]/as.vector(mSeries[1, i]) # Return Value: mSeries } ############################################################################### timeSeries/R/utils-old2new.R0000644000176000001440000000524411545076570015466 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ .old2newTimeSeries <- function(x) { # Version 1: if ("Data" %in% slotNames(x)) { data <- x@Data charvec <- timeDate(x@positions, zone = x@FinCenter, FinCenter = x@FinCenter) units <- x@units recordIDs <- x@recordIDs title <- x@title documentation <- x@documentation x <- timeSeries(data = data, charvec = charvec, units = units, recordIDs = recordIDs, title = title, documentation = documentation) } # Version 2: if ((".Data" %in% slotNames(x)) && is.character(x@positions)) { data <- x@.Data charvec <- timeDate(x@positions, zone = x@FinCenter, FinCenter = x@FinCenter) units <- x@units recordIDs <- x@recordIDs title <- x@title documentation <- x@documentation x <- timeSeries(data = data, charvec = charvec, units = units, recordIDs = recordIDs, title = title, documentation = documentation) } x } # ------------------------------------------------------------------------------ ## # Example ## library(timeSeries) ## setwd("~/r/fPortfolio/data") ## rda <- dir() ## sapply(rda, .old2newRda, suffix = "") .old2newRda <- function(file, suffix = "_new") { stopifnot(length(file) == 1) local({ load(file) nm <- ls() lold <- mget(nm, envir = environment(NULL)) test <- sapply(lold, is.timeSeries) lold <- lold[test] lnew <- lapply(lold, .old2newTimeSeries) objects <- names(lold) for (nm in objects) assign(nm, lnew[[nm]]) newFile <- paste(file, suffix, sep = "") save(list = objects, file = newFile) }) invisible(TRUE) } ################################################################################ timeSeries/R/methods-comment.R0000644000176000001440000000266611545076570016066 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # comment, timeSeries Get documentation slot of a timeSeries object # comment<-,timeSeries Set documentation slot of a timeSeries object ################################################################################ setMethod("comment", "timeSeries", function(x) { # A function implemented by Yohan Chalabi and Diethelm Wuertz # Return Value: x@documentation } ) # ------------------------------------------------------------------------------ setMethod("comment<-", "timeSeries", function(x, value) { x@documentation <- paste(value, collapse = " ") # Return Value: x } ) ################################################################################ timeSeries/R/base-diff.R0000644000176000001440000000630512407026706014567 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ############################################################################### # FUNCTION: DESCRIPTION: # diff,timeSeries Differences a 'timeSeries' object ############################################################################### .diff.timeSeries <- function(x, lag = 1, diff = 1, trim = FALSE, pad = NA, ...) { # A function implemented by Diethelm Wuertz # Modified by Yohan Chalabi # Description: # Differences 'timeSeries' objects. # Arguments: # x - a 'timeSeries' object. # lag - an integer indicating which lag to use. # By default 1. # diff - an integer indicating the order of the difference. # By default 1. # trim - a logical. Should NAs at the beginning of the # series be removed? # pad - a umeric value with which NAs should be replaced # at the beginning of the series. # Value: # Returns a differenced object of class 'timeSeries'. # FUNCTION: # Ceck Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Convert: y <- getDataPart(x) # as.matrix(x) # Check NAs: # if (any(is.na(y))) stop("NAs are not allowed in time series") # Difference: z <- diff(y, lag = lag, difference = diff) diffNums = dim(y)[1] - dim(z)[1] # Trim Positions: if (!trim) { zpad <- matrix(0*y[1:diffNums, ] + pad, nrow = diffNums) z <- rbind(zpad, z) } pos <- if (!trim) x@positions else x@positions[-(1:diffNums)] # Record IDs: df <- x@recordIDs if (trim && sum(dim(df)) > 0) { df <- df[-seq.int(diffNums), , drop = FALSE] rownames(df) <- seq.int(NROW(df)) } # Diff Result: ans <- timeSeries(data = z, charvec = pos, units = colnames(z), format = x@format, zone = x@FinCenter, FinCenter = x@FinCenter, recordIDs = df) # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } # ----------------------------------------------------------------------------- setMethod("diff", "timeSeries", function(x, lag = 1, diff = 1, trim = FALSE, pad = NA, ...) .diff.timeSeries(x, lag, diff, trim, pad, ...) ##x <- getDataPart(x) ##callGeneric() ) # until UseMethod dispatches S4 methods in 'base' functions diff.timeSeries <- function(x, ...) .diff.timeSeries(x, ...) ############################################################################### timeSeries/R/base-apply.R0000644000176000001440000000570112347663061015007 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # apply Applies a function to blocks of a 'timeSeries' ################################################################################ setMethod("apply", "timeSeries", function(X, MARGIN, FUN, ...) { # A function implemented by Siethelm Wuertz and Yohan Chalabi # Description: # Apply Functions Over 'Array'timeSeries' Margins # Arguments: # X - an array, including a matrix. # MARGIN - a vector giving the subscripts which the function # will be applied over. E.g., for a matrix 1 indicates rows, # 2 indicates columns, c(1, 2) indicates rows and columns. # Where X has named dimnames, it can be a character vector # selecting dimension names. # FUN - the function to be applied: see ???Details???. In the case # of functions like +, %*%, etc., the function name must be # backquoted or quoted. # ... - optional arguments to FUN. # Value: # Returns a vector or array or list of values obtained by # applying a function to margins of a 'timeSeries'. If the # returned value is a matrix, and if the input argument X and # the returned value have the same number of rows, then the # returned value will be transformed into a 'timeSeries' object. # FUNCTION # Check arguments: stopifnot(is.timeSeries(X)) # Extract Title and Documentation: Title <- X@title Documentation <- X@documentation # Settings: pos <- X@positions rec <- X@recordIDs FinCenter <- finCenter(X) X <- getDataPart(X) ans <- callGeneric() # Manage when univariate timeSeries drops the apply to vector: if( is(ans, "vector") && identical(length(ans), NROW(X)) ) { ans <- matrix(ans, ncol=1) } # Result: if (is(ans, "matrix") && identical(NROW(ans), NROW(X))) { # Compose timeSeries ans <- timeSeries( data = ans, charvec = pos, one = FinCenter, FinCenter = FinCenter, recordIDs = rec) # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation } # Return Value: ans }) ############################################################################### timeSeries/R/timeSeries-readSeries.R0000644000176000001440000001026013612544270017137 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # readSeries Reads a CSV file and creates a 'timeSeries' ################################################################################ # DW: # I think we should add a similar function for writeSeries() using # write.table(). Proceed in the same way as in the case of the read # function. # ------------------------------------------------------------------------------ readSeries <- function(file, header = TRUE, sep = ";", zone = "", FinCenter = "", format, ...) { # A function implemented by Diethelm Wuertz # Description: # Reads from a spreadsheet and creates a 'timeSeries' object # Arguments: # file - the name of the file which the data are to be read # from. Each row of the table appears as one line of the # file. If it does not contain an absolute path, the file # name is relative to the current working directory, # getwd(). Tilde-expansion is performed where supported. # As from R 2.10.0 this can be a compressed file. # header - a logical value indicating whether the file contains # the names of the variables as its first line. If missing, # the value is determined from the file format: header is # set to TRUE if and only if the first row contains one fewer # field than the number of columns. # sep - he field separator character. Values on each line of # the file are separated by this character. If sep = "" (the # default for read.table) the separator is ?white space?, # that is one or more spaces, tabs, newlines or carriage # returns. # zone - the time zone or financial center where the data were # recorded. # FinCenter - a character with the the location of the # financial center named as "continent/city". By default # an empty string which means that internally "GMT" will # be used. # format - the format of the timestamps as recoreded in the # first column of the data in the.. # ... - optional arguments passed to the function read.table(). # Value: # Returns a S4 object of class 'timeSeries'. # Notes: # Note we expect that the header of the spreadsheet file in # the first cell holds the time/date format specification! # FUNCTION: # Read Data: df <- read.table(file = file, header = header, sep = sep, check.names = FALSE, ...) # Get 'timeDate' from first column with header specifying the format charvec <- as.character(df[[1]]) if (missing(format)) format <- names(df)[1] td <- try(timeDate(charvec = charvec, format = format, zone = zone, FinCenter = FinCenter), silent=TRUE) # DW: 2014-09-16 # If sep=";" fails try with sep=",": if (sep == ";" && inherits(td, "try-error")) { return(readSeries(file, header = header, sep = ",", zone = zone, FinCenter = FinCenter, ...)) } # If format provided in file or with format argument, try to guess it if (all(is.na(td))) warning("Conversion of timestamps to timeDate objects produced only NAs. Are you sure you provided the proper format with argument 'format' or in the header of your file ?") # Extract data data <- as.matrix(df[-1]) # Create Time Series from Data Frame: ans <- timeSeries(data = data, charvec = td) # Return Value: ans } ################################################################################ timeSeries/R/timeSeries-isUnivariate.R0000644000176000001440000000314212407026706017515 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # isUnivariate Tests if a 'timeSeries' object is univariate # isMultivariate Tests if a 'timeSeries' object is multivariate ################################################################################ isUnivariate <- function(x) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Tests if a time series or rectangular object is univariate # FUNCTION: # Return Value: if (NCOL(x) == 1) TRUE else FALSE } # ------------------------------------------------------------------------------ isMultivariate <- function(x) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Tests if a time series or rectangular object is multivariate # FUNCTION: # Return Value: if (NCOL(x) > 1) TRUE else FALSE } ################################################################################ timeSeries/R/stats-filter.R0000644000176000001440000000572612347663061015402 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # filter,timeSeries Applies linear filtering to a 'timeSeries' object ################################################################################ setMethod("filter", "timeSeries", function(x, filter, method = c("convolution", "recursive"), sides = 2, circular = FALSE, init = NULL) { # Description: # Applies linear filtering to a 'timeSeries' object # Arguments: # x - a univariate or multivariate time series. # filter - a vector of filter coefficients in reverse time order (as # for AR or MA coefficients). # method - Either "convolution" or "recursive" (and can be # abbreviated). If "convolution" a moving average is used: # if "recursive" an autoregression is used. # sides - for convolution filters only. If sides=1 the filter # coefficients are for past values only; if sides=2 they are # centred around lag 0. In this case the length of the filter # should be odd, but if it is even, more of the filter is # forward in time than backward. # circular - for convolution filters only. If TRUE, wrap the filter # around the ends of the series, otherwise assume external # values are missing (NA). # init - for recursive filters only. Specifies the initial values # of the time series just prior to the start value, in reverse # time order. The default is a set of zeros. # Value: # Returns a 'timeSeries' object. # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Filter: ans <- filter(getDataPart(x), filter = filter, method = method, sides = sides, circular = circular, init = init) # Note: do not use as.matrix because ts objects might # not be coerced properly ans <- as(ans, "matrix") # Add Column Names: colnames(ans) <- colnames(x) ans <- setDataPart(x, ans) # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans }) ################################################################################ timeSeries/R/methods-is.R0000644000176000001440000000525213203327023015012 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # is.timeSeries Tests for a 'timeSeries' object ################################################################################ is.timeSeries <- function (x) { # A function implemented by Diethelm Wuertz # Description: # Tests for a 'timeSeries' object. # Arguments: # object - a 'timeSeries' object to be tested. # Value: # Returns 'TRUE' or 'FALSE' depending on whether its # argument is of 'timeSeries' type or not. # Changes: # # FUNCTION: # Check: ans <- is(x, "timeSeries") # Return Value: ans } # ------------------------------------------------------------------------------ is.signalSeries <- function(x) { !as.logical(length(x@positions)) } # ------------------------------------------------------------------------------ # YC: # Note if is.na returns a timeSeries objects then we have problem # with the function quantile... setMethod("is.na", "timeSeries", function(x) setDataPart(x, is.na(getDataPart(x)))) # ------------------------------------------------------------------------------ # something like this would be needed if is.unsorted again became an internal generic #if(getRversion() >= "3.3.0") { # setGeneric("is.unsorted", signature = "x", useAsDefault = base::is.unsorted) #} setMethod("is.unsorted", "timeSeries", function(x, na.rm = FALSE, strictly = FALSE) callGeneric(x@positions, na.rm = na.rm, strictly = strictly)) # if (getRversion() < "2.8.0") # { # setMethod("is.unsorted", "timeSeries", function(x, na.rm = FALSE) # callGeneric(x@positions, na.rm = na.rm)) # } else { # setMethod("is.unsorted", "timeSeries", function(x, na.rm = FALSE, strictly = FALSE) # callGeneric(x@positions, na.rm = na.rm, strictly = strictly)) # } ################################################################################ timeSeries/R/base-applySeries.R0000644000176000001440000002523613612544270016163 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # applySeries Applies a function to blocks of a 'timeSeries' # fapply Applies a function to 'timeSeries' windows # DEPRECATED: DESCRIPTION: # .applySeries Applies a function to blocks of a 'timeSeries' # .fapply Applies a function to 'timeSeries' windows ################################################################################ applySeries <- function(x, from = NULL, to = NULL, by = c("monthly", "quarterly"), FUN = colMeans, units = NULL, format = x@format, zone = x@FinCenter, FinCenter = x@FinCenter, recordIDs = data.frame(), title = x@title, documentation = x@documentation, ...) { # A function implemented by Diethelm Wuertz # Description: # Apply a function to the margins of a 'timeSeries' object # Details: # This function can be used to aggregate and coursen a # 'timeSeries' object. # Arguments: # x - a 'timeSeries' object to be aggregated # from, to - two 'timeDate' position vectors which size the # blocks # by - calendarical block, only active when both 'from' # and 'to' are NULL # FUN - function to be applied, by default 'colMeans' # units - a character vector with column names, allows to # overwrite the column names of the input 'timeSeries' # object. # Value: # Returns a S4 object of class 'timeSeries'. # Notes: # The size of the 'moving' window and the selection of an # 'adj'-acent endpoint are not needed, all the information # is kept in the 'from' and 'to' position vectors. # FUNCTION: # .Deprecated("aggregate", "timeSeries") # Check object: if (!inherits(x, "timeSeries")) stop("s is not a timeSeries object") ### if (x@format == "counts") ### stop(as.character(match.call())[1], ### " is for time series and not for signal series.") # Monthly and Quarterly from and to: if (is.null(from) & is.null(to)) { if (by[1] == "monthly") { # Use monthly blocks: from = unique(timeFirstDayInMonth(time(x))) to = unique(timeLastDayInMonth(time(x))) } else if (by[1] == "quarterly") { from = unique(timeFirstDayInQuarter(time(x))) to = unique(timeLastDayInQuarter(time(x))) } else { stop("by must be eiter monthly or quarterly") } from@FinCenter = to@FinCenter = FinCenter } # Column Names: colNames = units # Function: fun = match.fun(FUN) ### # Blocks: ### j.pos = as.POSIXct(time(x)) ### j.from = as.POSIXct(from) ### j.to = as.POSIXct(to) # Blocks: j.pos = time(x) if (is(j.pos, "timeDate")) { j.from = as.timeDate(from) j.to = as.timeDate(to) } else { j.from = as.integer(from) j.to = as.integer(to) } # Iterate: pos = time(x) rowNames = rownames(x) rowBind = NULL for (i in seq_len(length(from))) { test <- (j.pos >= j.from[i] & j.pos <= j.to[i]) if (!sum(test)) stop("outsite of range") # make sure that cutted is a matrix ... cutted = as.matrix(x[test, ]) # YC : *AND* make sure the matrix is not subbsetted to a vector!!! # YC : here it is fine because as.matrix of a timeSeries checks it # YC : but prefer to check it one more time at the end of the loop... ### if (sum(test)>0) rownames(cutted) <- rowNames[test] ans = fun(cutted, ...) rowBind = rbind(rowBind, ans) } stopifnot(NCOL(rowBind) == NCOL(x)) # YC : see above # YC : length(to) might not be == NCOL(rowBind) if (length(as.character(to)) == NROW(rowBind)) rownames(rowBind) = as.character(to) if (is.null(colNames)) { units = x@units } else { units = colNames } # Return Value: timeSeries(data = rowBind, units = units, format = format, zone = zone, FinCenter = FinCenter, recordIDs = recordIDs, title = title, documentation = documentation, ...) } # ------------------------------------------------------------------------------ fapply <- function(x, from, to, FUN, ...) { # .Deprecated("aggregate", "timeSeries") # Check x: stopifnot(is(x, "timeSeries")) if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # Check for missing form/to: if(missing(from)) from = start(x) if(missing(to)) to = end(x) # Return Value: applySeries(x = x, from = from, to = to, FUN = FUN, ...) } ################################################################################ # *** OLD *** # Check if it is still used somewhere ... .applySeries <- function (x, from = NULL, to = NULL, by = c("monthly", "quarterly"), FUN = colMeans, units = NULL, ...) { # Old/Alternative Version # Chreck for 'timeSeries' Object: stopifnot(is.timeSeries(x), is(from, "timeDate") || is.null(from), is(to, "timeDate") || is.null(to)) # Allow for colMeans: if (substitute(FUN) == "colMeans") FUN = "colAvgs" # Monthly and Quarterly from and to: if (is.null(from) & is.null(to)) { by = match.arg(by) if (by == "monthly") { from = unique(timeFirstDayInMonth(time(x))) to = unique(timeLastDayInMonth(time(x))) } else if (by == "quarterly") { from = unique(timeFirstDayInQuarter(time(x))) to = unique(timeLastDayInQuarter(time(x))) } from@FinCenter = to@FinCenter = x@FinCenter } # Start Cutting Process: fun = match.fun(FUN) cutted = NULL i = 1 # Find First Interval which is not empty: while (is.null(cutted)) { cutted = cut(x, from[i], to[i]) if (!is.null(cutted)) { # Non empty Interval: ans = fun(cutted, ...) } i = i + 1 } # Continue up to the end: for (j in seq_len(length(from))) { cutted = cut(x, from[j], to[j]) if (!is.null(cutted)) { # Non empty Interval: newAns = fun(cutted, ...) ans = rbind(ans, newAns) } } # Return Value: ans } ################################################################################ # *** OLD *** # Check if it is still used somewhere ... .fapply <- function(x, from, to, FUN, ...) { # A function implemented by Diethelm Wuertz # Description: # Applies a function to 'timeSeries' windows # Details: # This function can be used to aggregate and coursen a # 'timeSeries' object. # Arguments: # x - a 'timeSeries' object to be aggregated # from, to - two 'timeDate' position vectors which size the blocks # FUN - function to be applied, by default 'colMeans' # Value: # Returns a S4 object of class 'timeSeries' if FUN returns # a time series object, otherwise a list, where the entries # for each window is the output of the function FUN. # Notes: # The size of the 'moving' window and the selection of an # 'adj'-acent endpoint are not needed, all the information # is kept in the 'from' and 'to' position vectors. # FUNCTION: # Check object: if (!inherits(x, "timeSeries")) stop("s is not a timeSeries object") # Monthly and Quarterly from and to: if (is.null(from) & is.null(to)) { if (by[1] == "monthly") { # Use monthly blocks: from = unique(timeFirstDayInMonth(time(x))) to = unique(timeLastDayInMonth(time(x))) } else if (by[1] == "quarterly") { from = unique(timeFirstDayInQuarter(time(x))) to = unique(timeLastDayInQuarter(time(x))) } else { stop("by must be eiter monthly or quarterly") } from@FinCenter = to@FinCenter = x@FinCenter } # Column Names: colNames = units # Function: fun = match.fun(FUN) # Blocks: j.pos = as.POSIXct(time(x)) j.from = as.POSIXct(from) j.to = as.POSIXct(to) # Iterate: y = series(x) pos = time(x) rowNames = rownames(x) # Compute for the first window ... i = 1 test = (j.pos >= j.from[i] & j.pos <= j.to[i]) # make sure that cutted is a matrix ... cutted = as.matrix(y[test, ]) ### if (sum(test)>0) rownames(cutted) <- rowNames[test] ans = fun(cutted, ...) if (is.timeSeries(ans)) { ## DW can this happen - check ? rowBind = ans for (i in 2L:length(from)) { test = (j.pos >= j.from[1] & j.pos <= j.to[1]) # make sure that cutted is a matrix ... cutted = as.matrix(y[test, ]) ### if (sum(test)>0) rownames(cutted) <- rowNames[test] ans = fun(cutted, ...) rowBind = rbind(rowBind, ans) } rownames(rowBind) = as.character(to) if (is.null(colNames)) { units = x@units } else { units = colNames } # Return Value: ans = timeSeries(data = rowBind, charvec = as.character(to), units = units, format = format, zone = x@zone, FinCenter = x@FinCenter, recordIDs = x@recordIDs, title = x@title, documentation = x@documentation, ...) return(ans) } else { listBind = list() ## DW [] -> [[]] listBind[[1]] = ans for (i in 2L:length(from)) { test = (j.pos >= j.from[i] & j.pos <= j.to[i]) # make sure that cutted is a matrix ... cutted = as.matrix(y[test, ]) ### if (sum(test)>0) rownames(cutted) <- rowNames[test] ans = fun(cutted, ...) ## DW [] -> [[]] listBind[[i]] = ans } # Return Value: ans = listBind attr(ans, "control") <- list(x = x, from = from, to = to) return(invisible(ans)) } # Return Value: return() } ################################################################################ timeSeries/R/timeSeries-getDataPart.R0000644000176000001440000000527711545076570017273 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # S4 METHODS: DESCRIPTION: # getDataPart,timeSeries Get data slot of an object of class 'timeSeries' # setDataPart,timeSeries Set data slot of an object of class 'timeSeries' ################################################################################ # YC: # This makes getDataPart a bit faster than default function setMethod("getDataPart", "timeSeries", #"signalSeries", function(object) { value <- object attributes(value) <- NULL attr(value, "dim") <- attr(object, "dim") attr(value, "dimnames") <- attr(object, "dimnames") value } ) # ------------------------------------------------------------------------------ # YC: # This makes setDataPart a bit faster than default function if (getRversion() < "2.8.0") { setMethod("setDataPart", "timeSeries", function(object, value) { #-> Note : do not use as.matrix because ts objects might #-> not be coerced properly value <- as(value, "matrix") supplied <- attributes(object) valueAttrs <- attributes(value) supplied[names(valueAttrs)] <- valueAttrs # YC: force @unit to be identical to colnames(value) supplied[["units"]] <- colnames(value) attributes(value) <- supplied asS4(value, TRUE) } ) } else { setMethod("setDataPart", "timeSeries", function(object, value, check = TRUE) { #-> Note : do not use as.matrix because ts objects might #-> not be coerced properly if (check) value <- as(value, "matrix") supplied <- attributes(object) valueAttrs <- attributes(value) supplied[names(valueAttrs)] <- valueAttrs # YC: force @unit to be identical to colnames(value) supplied[["units"]] <- colnames(value) attributes(value) <- supplied asS4(value, TRUE) } ) } ################################################################################ timeSeries/R/base-cbind.R0000644000176000001440000002575513612544270014750 0ustar ripleyusers # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # Generic functions defined in {base} # cbind.timeSeries Combines two 'timeSeries' objects by column # rbind.timeSeries Combines two 'timeSeries' objects by row ################################################################################ # Generic functions defined in {methods} # cbind2.timeSeries Combines two objects by column # rbind2.timeSeries Combines two objects by row ################################################################################ cbind.timeSeries <- function(..., deparse.level = 1) { # A function implemented by Yohan Chalabi and Diethelm Wuertz # Description: # Binds columns of two 'timeSeries' objects # Arguments: # ... # deparse.level # FUNCTION: # Columnwise bind: dots <- list(...) # Preserve the title of the first ... element # counter <- NULL # for (i in 1:length(dots)) counter <- c(counter, is.timeSeries(dots[[i]])) # Index <- which(counter[1]) Title <- "" #dots[[Index]]@title # Compose Attributes - Documentation : Attributes <- list() for (i in 1:length(dots)) { if (inherits(dots[[i]], "timeSeries")) { nextAttributes <- getAttributes(dots[[i]]) Attributes <- .appendList(Attributes, nextAttributes) } } Documentation <- as.character(date()) attr(Documentation, "Attributes") <- Attributes # remove NULL from dots args if (any(t <- unlist(lapply(dots, is.null)))) dots[t] <- NULL # deal with numeric values vecIdx <- sapply(dots, function(obj) (!inherits(obj, "timeSeries") && prod(dim(obj)) == 1)) if (any(vecIdx)) dots[vecIdx] <- lapply( dots[vecIdx], function(vec) as.timeSeries(rep(as.vector(vec), len = NROW(dots[[1]])))) # coerce to timeSeries object if not a timeSeries if (any(t <- !unlist(lapply(dots, inherits, "timeSeries")))) dots[t] <- lapply(dots[t], as.timeSeries) # note that new timeSeries get FinCenter of first entry of args FinCenter = finCenter(dots[[1]]) # get names of arguments if any units <- unlist(lapply(dots, colnames)) if (length(t <- as.logical((nchar(nm <- names(units)))))) units[t] <- nm[t] # change colnames if they are the same if (length(unique(units)) != length(units)) { for (name in unique(units)) { pos <- grep(name, units) if (length(pos) != 1) units[pos] <- paste(units[pos], seq(pos), sep = ".") } } # ensure that data is sorted dots <- lapply(dots, sort) # get list of timestamps and recordIDs tds <- lapply(dots, slot, "positions") rec <- lapply(dots, slot, "recordIDs") # Fast version when timeSeries have identical timestamps # or with signal series if (any(co <- unlist(lapply(dots, function(ts) ts@format == "counts"))) || (any(!co) & all(sapply(tds[!co], identical, tds[!co][[1]])))) { # check if all have same number of rows if (diff(range((unlist(lapply(dots, NROW)))))) stop("number of rows must match") td <- if (any(!co)) tds[!co][[1]] else NULL data <- array(unlist(dots), dim=c(NROW(dots[[1]]), sum(sapply(dots, ncol)))) recordIDs <- if (sum(recIdx <- sapply(rec, length))) do.call(cbind, rec[recIdx]) else data.frame() ans <- timeSeries(data = data, charvec = td, units = units, zone = "GMT", FinCenter = FinCenter, recordIDs = recordIDs) } else { # Aligned timestamps: td <- sort(unique(unlist(tds))) fun <- function(ts, td, ref) { mm <- matrix(NA, ncol = ncol(ts), nrow = length(ref)) mm[findInterval(td, ref),] <- getDataPart(ts) mm} data <- mapply(fun, ts = dots, td = tds, MoreArgs = list(ref=td), SIMPLIFY = FALSE) data <- array(unlist(data), dim=c(length(td), sum(sapply(dots, ncol)))) # Note that recordIDs are not preserved when time stamps are # not equal because don't know what value we should use for # missing entries if (sum(sapply(rec, length))) { msg <- "@recordIDs cannot be binded when timestamps are not identical" warning(msg, call. = FALSE) } # note that new timeSeries get FinCenter of first entry of args ans <- timeSeries(data = data, charvec = td, units = units, zone = FinCenter, FinCenter = FinCenter) } # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } # ------------------------------------------------------------------------------ ## # YC: ## # Note that since 2.9.0 S3 methods can not be defined for S4 classes ## # which extends an object like matrix. Therefore we turn all S3 ## # generics to S4 generics for backward compatibility ## # Note that since 2.8.0 it is possible to define methods for functions ## # with dots ... ## if (getRversion() < "2.9.0") { ## cbind.timeSeries <- ## function(..., deparse.level = 1) ## .cbind.timeSeries(..., deparse.level = deparse.level) ## } else { ## setGeneric("cbind", signature = "...") #-> creates warning but ## # cannot avoid it with ## # current dotsMethods scheme ## setMethod("cbind", "timeSeries", function(..., deparse.level = 1) ## .cbind.timeSeries(..., deparse.level = deparse.level)) ## } # ------------------------------------------------------------------------------ setMethod("cbind2", c("timeSeries", "timeSeries"), function(x, y) cbind(x, y)) setMethod("cbind2", c("timeSeries", "ANY"), function(x,y) callGeneric(x, as(y, "timeSeries"))) setMethod("cbind2", c("ANY", "timeSeries"), function(x,y) callGeneric(as(x, "timeSeries"), y)) setMethod("cbind2", c("timeSeries", "missing"), function(x,y) x) # ------------------------------------------------------------------------------ rbind.timeSeries <- function(..., deparse.level = 1) { # A function implemented by Yohan Chalabi and Diethelm Wuertz # Description: # Binds rows of two 'timeSeries' objects # Arguments: # ... # deparse.level # FUNCTION: # Row bind: dots <- list(...) # Preserve the title of the first ... element # counter <- NULL # for (i in 1:length(dots)) counter <- c(counter, is.timeSeries(dots[[i]])) # Index <- which(counter[1]) Title <- "" # dots[[Index]]@title # Compose Attributes - Documentation : Attributes <- list() for (i in 1:length(dots)) { if (inherits(dots[[i]], "timeSeries")) { nextAttributes <- getAttributes(dots[[i]]) Attributes <- .appendList(Attributes, nextAttributes) } } Documentation <- as.character(date()) attr(Documentation, "Attributes") <- Attributes # Remove NULL from dots args if (any(t <- unlist(lapply(dots, is.null)))) dots[t] <- NULL # Coerce to timeSeries object if not a timeSeries if (any(t <- !unlist(lapply(dots, inherits, "timeSeries")))) dots[t] <- lapply(dots[t], as.timeSeries) if (diff(range((unlist(lapply(dots, ncol)))))) stop("number of columns must match") # get names of arguments if any otherwise use colnames units <- unlist(lapply(dots, colnames)) if (length(t <- as.logical((nchar(nm <- names(units)))))) units[t] <- nm[t] units <- structure(units, dim = c(ncol(dots[[1]]), length(dots))) units <- apply(units, 1, paste, collapse = "_") # Bind: # data <- base::rbind(...) # no because S3 method dispatch done in C level data <- do.call(base::rbind, lapply(dots, getDataPart)) if (any(unlist(lapply(dots, function(ts) ts@format == "counts")))) { return(timeSeries(data=data, units = units)) } # recordIDs part if (length(dots) > 1) recordIDs <- tryCatch(do.call(rbind, lapply(dots, slot, "recordIDs")), error = function(e) { msg <- paste("@recordIDs cannot be binded :", conditionMessage(e)) warning(msg, call. = FALSE) data.frame()}) else recordIDs <- slot(dots[[1]], "recordIDs") tds <- unlist(lapply(dots, slot, "positions")) ans <- timeSeries(data = data, charvec = tds, zone = "GMT", FinCenter = finCenter(dots[[1]]), units = units, recordIDs = recordIDs) # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } # ------------------------------------------------------------------------------ ## # YC: ## # Note that since 2.9.0 S3 methods can not be defined for S4 classes ## # which extends an object like matrix. Therefore we turn all S3 ## # generics to S4 generics for backward compatibility ## # Note that since 2.8.0 it is possible to define methods for functions ## # with dots ... ## if (getRversion() < "2.9.0") { ## rbind.timeSeries <- ## function(..., deparse.level = 1) ## .rbind.timeSeries(..., deparse.level = deparse.level) ## } else { ## setGeneric("rbind", signature = "...") #-> creates warning but ## # cannot avoid it with ## # current dotsMethods scheme ## setMethod("rbind", "timeSeries", function(..., deparse.level = 1) ## .rbind.timeSeries(..., deparse.level = deparse.level)) ## } # ------------------------------------------------------------------------------ setMethod("rbind2", c("timeSeries", "timeSeries"), function(x, y) rbind(x, y)) setMethod("rbind2", c("timeSeries", "ANY"), function(x,y) callGeneric(x, as(y, "timeSeries"))) setMethod("rbind2", c("ANY", "timeSeries"), function(x,y) callGeneric(as(x, "timeSeries"), y)) setMethod("rbind2", c("timeSeries", "missing"), function(x,y) x) ################################################################################ timeSeries/R/base-t.R0000644000176000001440000000177311545076570014134 0ustar ripleyusers # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # t,timeSeries Returns the transpose of timeSeries object ################################################################################ setMethod("t", "timeSeries", function(x) callGeneric(getDataPart(x))) ################################################################################ timeSeries/R/timeSeries-signalCounts.R0000644000176000001440000000267611545076570017544 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # .signalCounts Creates charvec for integer indexed time stamps ################################################################################ .signalCounts <- function(int) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Descriptions: # Creates the charvec for integer indexed time stamps # Arguments: # int - a vector of integers, the counts. # FUNCTION: # Check that int is an integer # ... # Check that all int's are positive ... # ... # Format: cint <- as.character(int) ans <- format(cint, width = max(nchar(cint)), justify = "right") # Return Value: ans } ################################################################################ timeSeries/R/timeSeries-dummy.R0000644000176000001440000000511412407026706016206 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # dummySeries Creates a dummy monthly 'timeSeries' object # dummyDailySeries Creates a dummy daily 'timeSeries' object ################################################################################ # DW: # A more natural name for the function dummySeries() would be # dummyMonthlySeries() to have the same naming conventions like in the # case of the dummy daily series. dummySeries <- function(...) { # A function implemented by Diethelm Wuertz # Description: # Creates a monthly dummy 'time Series' object # Arguments: # ... - optional arguments passed to the function timeSeries(). # FUnction: # Return Value: timeSeries(matrix(runif(24), ncol = 2), as.character(timeCalendar()), ...) } # ------------------------------------------------------------------------------ dummyDailySeries <- function(x = rnorm(365), units = NULL, zone = "", FinCenter = "") { # A function implemented by Diethelm Wuertz # Description: # Creates a dummy daily time Series # Arguments: # x - a numeric vector # origin - the first date in the series # FUNCTION: if (zone == "") zone <- getRmetricsOptions("myFinCenter") if (FinCenter == "") FinCenter <- getRmetricsOptions("myFinCenter") # Check: stopifnot(is.numeric(x)) if (is.null(units)) units <- paste("X", 1:NCOL(x), sep = "") stopifnot(length(units) == NCOL(x)) # Time Series: if (is.vector(x)) data = matrix(x, ncol = 1) if (is.matrix(x)) data = x positions <- timeSequence(from = "1970-01-01", length.out = NROW(data), zone = zone, FinCenter = FinCenter) ans <- timeSeries(data = data, charvec = positions, units = units, zone = zone, FinCenter = FinCenter) # Return Value: ans } ################################################################################ timeSeries/R/timeSeries-slotTime.R0000644000176000001440000001056012407026706016654 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # time,timeSeries Extracs time positions from a 'timeSeries' # time<- Defines S3 UseMethod # time<-.timeSeries ... to avoid problems with zoo # FUNCTION: DESCRIPTION: # getTime Get time slot from a 'timeSeries' # setTime<- Set new time slot to a 'timeSeries' ################################################################################ # DEPRECATED: DESCRIPTION: # seriesPositions Deprecated, use time # newPositions<- Deprecated, use time<- ################################################################################ .time.timeSeries <- function(x, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Extracs time positions from a 'timeSeries' # Arguments: # x - a 'timeSeries' object. # Value: # Returns a time resampled object of class 'timeSeries'. # FUNCTION: if (length(x@positions)>0) timeDate(x@positions, zone = "GMT", FinCenter = x@FinCenter) else seq.int(NROW(x)) } setMethod("time", "timeSeries", function(x, ...) .time.timeSeries(x, ...)) # until UseMethod dispatches S4 methods in 'base' functions time.timeSeries <- function(x, ...) .time.timeSeries(x, ...) # ------------------------------------------------------------------------------ `time<-` <- function(x, value) { UseMethod("time<-") } # ------------------------------------------------------------------------------ `time<-.timeSeries` <- function(x, value) { # A function implemented by Yohan Chalabi # Note: # To avoid conflict with zoo package. # FUNCTION: # Assign Rownames: rownames(x) <- value # Return Value: x } # ------------------------------------------------------------------------------ # setMethod("time<-", "timeSeries", function(x, value) # { # rownames(x) <- value # # Return # x # }) ############################################################################### getTime <- function(x) { # Description: # Get time slot from a 'timeSeries' object. # Arguments: # x - a 'timeSeries' object # FUNCTION: # Return Value: time(x) } # ------------------------------------------------------------------------------ "setTime<-" <- function(x, value) { # Description: # Set time slot to a 'timeSeries' object. # Arguments: # x - a 'timeSeries' object # FUNCTION: # Assign Time Slot: time(x) <- value # Return Value: x } ############################################################################### # DEPRECATED seriesPositions <- function(object) { # A function implemented by Diethelm Wuertz # Description: # Extracts the positions of a 'timeSeries' objects and # converts them to a 'timeDate' object. # Arguments: # object - a 'timeSeries' object # Value: # Returns 'timeSeries' positions as 'timeDate' objects. # FUNCTION: # Deprecated: .Deprecated(new = "time", package = "timeSeries") # Return Value: time(object) } # ------------------------------------------------------------------------------ # Deprecated: "newPositions<-" <- function(object, value) { # A function implemented by Diethelm Wuertz # FUNCTION: # Deprecated: .Deprecated(new = "time<-", package = "timeSeries") # Assign Rownames: rownames(object) <- value # Return Value: object } ################################################################################ timeSeries/R/fin-cumulated.R0000644000176000001440000000573212347663061015513 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ############################################################################### # FUNCTION: DESCRIPTION: # cumulated Computes cumulated series from financial returns # cumulated.default Computes cumulated series, default method ############################################################################### cumulated <- function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # Computes cumulated series from financial returns # Return Value: UseMethod("cumulated") } # ------------------------------------------------------------------------------ cumulated.default <- function(x, method = c("continuous", "discrete", "compound", "simple"), percentage = FALSE, ...) { # A function implemented by Diethelm Wuertz # Description: # Computes cumulated series from financial returns # supports 'matrix' and 'timeSeries'. # Arguments: # x - data object containing ordered price observations # method - "continuous == "compound" and "discrete" == "simple" # Example: # X = as.timeSeries(data(msft.dat))[1:10, "Close"]; X = X/series(X)[1, 1] # x = returns(X, "continuous"); x; X; cumulated(x, "continuous") # x = returns(X, "discrete"); x; X; cumulated(x, "discrete") # Note: # To make it conform with PortfolioAnalytics: # "compound" == "continuous", and "simple" == "discrete" # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Settings: method <- match.arg(method) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Handle Missing Values: # if (na.rm) x = na.omit(x, ...) # Transform data: if (percentage) x <- x/100 positions <- time(x) # Calculate Cumulates: # ... colCumsums and colCumprods are generic functions with # methods for 'matrix' and 'timeSeries'. if(method == "geometric") { ans <- colCumsums(x) } if(method == "compound" || method == "continuous") { ans <- exp(colCumsums(x)) } if(method == "simple" || method == "discrete") { ans <- colCumprods(1+x) } # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } ################################################################################ timeSeries/R/timeSeries-slotSeries.R0000644000176000001440000002134713612544270017215 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # series,timeSeries Get data slot from a'timeSeries' # series<-,timeSeries,ANY Set new data slot to a 'timeSeries' # series<-,timeSeries,matrix Set new data slot to a 'timeSeries' # SYNONYMES: DESCRIPTION: # coredata,timeSeries Get data slot from a'timeSeries' # coredata<-,timeSeries,ANY Set new data slot to a 'timeSeries' # coredata<-,timeSeries,matrix Set new data slot to a 'timeSeries' # FUNCTION: DESCRIPTION: # getSeries # getSeries.default # getSeries.timeSeries Get data slot from a 'timeSeries' # setSeries<- Set new data slot to a 'timeSeries' ################################################################################ # DEPRECATED: DESCRIPTION: # seriesData Deprecated, use series ################################################################################ setMethod("series", "timeSeries", function(x) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Returns the series Data of an ordered data object. # Arguments: # x - a 'timeSeries' object # Value: # Returns an object of class 'matrix'. # FUNCTION: # Get Data Slot: ans <- as.matrix(x) # Return Value: ans } ) # ------------------------------------------------------------------------------ setMethod("series<-", signature(x = "timeSeries", value = "ANY"), function(x, value) { # A function implemented by Yohan Chalabi # Return Value: callGeneric(x, as(value, "matrix")) } ) # ------------------------------------------------------------------------------ setMethod("series<-", signature(x = "timeSeries", value = "matrix"), function(x, value) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Assign the series Data to a timeSeries object. # Arguments: # object - a 'timeSeries' object # Value: # Assign to be assign as series Data of a timeSeries. # FUNCTION: # if value same dimension as time series # we we can assign the value directly to @.Data # This can speed up math Ops significantly if (identical(dim(x), dim(value))) { x@.Data <- value if (!is.null(cn <- colnames(value))) colnames(x) <- cn return(x) } if (is.null(charvec <- rownames(value))) charvec <- rownames(x) if (is.null(units <- colnames(value))) units <- colnames(value) # now that we have charvec and units, better to remove # dimnames of value to avoid problems attr(value, "dimnames") <- NULL if (!identical(length(units), NCOL(value))) units <- NULL # if now same dim , drop charvec and returns .signalSeries if (!identical(length(charvec), NROW(value))) return(.signalSeries(value, units)) format <- x@format zone <- FinCenter <- finCenter(x) title <- x@title documentation <- x@documentation recordIDs <- if (identical(NROW(x), NROW(value))) x@recordIDs else data.frame() # Return Value: timeSeries(data = value, charvec = charvec, units = units, format = format, zone = zone, FinCenter = FinCenter, recordIDs = recordIDs, title = title) } ) ################################################################################ # COREDATA SYNONYME setMethod("coredata", "timeSeries", function(x) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Returns the series Data of an ordered data object. # Arguments: # x - a 'timeSeries' object # Value: # Returns an object of class 'matrix'. # FUNCTION: # Get Data Slot: ans <- as.matrix(x) # Return Value: ans }) # ------------------------------------------------------------------------------ setMethod("coredata<-", signature(x = "timeSeries", value = "ANY"), function(x, value) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Return Value: callGeneric(x, as(value, "matrix")) }) # ------------------------------------------------------------------------------ setMethod("coredata<-", signature(x = "timeSeries", value = "matrix"), function(x, value) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Assign the series Data to a timeSeries object. # Arguments: # object - a 'timeSeries' object # Value: # Assign to be assign as series Data of a timeSeries. # FUNCTION: # if value same dimension as time series # we we can assign the value directly to @.Data # This can speed up math Ops significantly if (identical(dim(x), dim(value))) { x@.Data <- value if (!is.null(cn <- colnames(value))) colnames(x) <- cn return(x) } if (is.null(charvec <- rownames(value))) charvec <- rownames(x) if (is.null(units <- colnames(value))) units <- colnames(value) # now that we have charvec and units, better to remove # dimnames of value to avoid problems attr(value, "dimnames") <- NULL if (!identical(length(units), NCOL(value))) units <- NULL # if now same dim , drop charvec and returns .signalSeries if (!identical(length(charvec), NROW(value))) return(.signalSeries(value, units)) format <- x@format zone <- FinCenter <- finCenter(x) title <- x@title documentation <- x@documentation recordIDs <- if (identical(NROW(x), NROW(value))) x@recordIDs else data.frame() # Return Value: timeSeries(data = value, charvec = charvec, units = units, format = format, zone = zone, FinCenter = FinCenter, recordIDs = recordIDs, title = title) }) ################################################################################ ## getSeries <- ## function(x) ## { ## # A function implemented by Diethelm Wuertz ## ## # Note: ## # Used for getSeries methods in fPortfolio package. ## ## # FUNCTION: ## ## # Return Value: ## UseMethod("getSeries") ## } # ------------------------------------------------------------------------------ ## getSeries.default <- ## function(x) ## { ## # Description: ## # Get data slot from a 'timeSeries' object ## ## # Arguments: ## # x - a 'timeSeries' object ## ## # FUNCTION: ## ## # Return Value: ## series(x) ## } # ------------------------------------------------------------------------------ ## getSeries.timeSeries <- ## function(x) ## { ## # Description: ## # Get data slot from a 'timeSeries' object ## ## # Arguments: ## # x - a 'timeSeries' object ## ## # FUNCTION: ## ## # Return Value: ## series(x) ## } # ------------------------------------------------------------------------------ ## "setSeries<-" <- ## function(x, value) ## { ## # Description: ## # Set data slot to a 'timeSeries' object ## ## # Arguments: ## # x - a 'timeSeries' object ## ## # FUNCTION: ## ## # Assign Series Slot: ## series(x) <- value ## ## # Return Value: ## x ## } ################################################################################ # DEPRECATED seriesData <- function(object) { # A function implemented by Diethelm Wuertz # Description: # Returns the series Data of an ordered data object. # Arguments: # object - a 'timeSeries' object # Value: # Returns an object of class 'matrix'. # FUNCTION: # Test: stopifnot(inherits(object, "timeSeries")) # Deprecated .Deprecated(new = "series", package = "timeSeries") # Get Data Slot: ans <- as.matrix(object) # Return Value: ans } ################################################################################ timeSeries/R/base-dim.R0000644000176000001440000002021512407026706014424 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # S4 METHOD: DIM OPERATIONS ON DATA: # dim,timeSeries Returns dimension of a 'timeSeries' object # dim<-,timeSeries Assigns dimension of a 'timeSeries' object # dimnames,timeDSeries Returns dimension names of a 'timeSeries' object # dimnames<-,timeSeries Assign dimension names of a 'timeSeries' object # colnames,timeSeries Return column names to a 'timeSeries' object # rownames,timeSeries Return row names to a 'timeSeries' object # colnames<-,timeSeries Assigns column names to a 'timeSeries' object # rownames<-,timeSeries Assigns row names to a 'timeSeries' object # names,timeSeries Return column names of a 'timeSeries' object # names<.,timeSeries Assigns column names of a 'timeSeries' object ################################################################################ # Base Functions: # Generate from Matrix: # edhec.tS = timeSeries(edhec.mat, rownames(edhec.mat)) # edhec.ts = ts(edhec.mat, start = c(1997, 1), frequency = 12) # Univariate time Series: # edhec1.tS = edhec.tS[, 1] # dim # dim(edhec.tS) # 20 4 # dim(edhec1.tS) # 20 1 # DIM # DIM = function(x) {c(NROW(x), NCOL(x))} # DIM(edhec.tS) # 20 4 # DIM(edhec1.tS) # 20 1 # length # length(edhec.tS) # 1 # # LENGTH # LENGTH = function(x) NROW(x) # LENGTH(edhec.tS) # 20 # LENGTH(edhec1.tS) # 20 # # ncol / nrow # ncol(edhec.tS) # 4 # # ncol(edhec1.tS) # 1 # # NCOL / NRWO # NCOL(edhec.tS) # 4 # # NCOL(edhec1.tS) # 1 # # isUnivariate # isUnivariate = function(x) NCOL(x) == 1 # isUnivariate(edhec.tS) # isUnivariate(edhec1.tS) # # isMultivariate # Just Negation of isUnivariate # # # # ------------------------------------------------------------------------------ # length # dim # ncol # nrow # LENGTH # DIM # NCOL # NROW # ------------------------------------------------------------------------------ # Note it is faster to access attribute rather than accessing @.Data setMethod("dim", "timeSeries", function(x) attr(x, "dim")) # This should make functions like # model.response(model.frame(dummySeries() ~1)) work setReplaceMethod("dim", "timeSeries", function(x, value) { # dim(x) <- NULL returns a vector if (is.null(value)) return(as.vector(x)) else x #<< returns same object : # setting new dim # is forbidden for a timeSeries object } ) # ------------------------------------------------------------------------------ # colnames - faster to have dedicated method than relying on dimnames[[2]] setMethod("colnames", "timeSeries", # "signalSeries", function(x, do.NULL = TRUE, prefix = "col") x@units ) # ------------------------------------------------------------------------------ # rownames ## setMethod("rownames", "signalSeries", ## function (x, do.NULL = TRUE, prefix = "row") NULL) ## setMethod("rownames", "timeSeries", ## function (x, do.NULL = TRUE, prefix = "row") as.character(time(x))) setMethod("rownames", "timeSeries", function (x, do.NULL = TRUE, prefix = "row") { if (length(x@positions) > 0) as.character(time(x)) else NULL } ) # ------------------------------------------------------------------------------ setMethod("dimnames", "timeSeries", # "signalSeries", function(x) { list(rownames(x),colnames(x)) } ) # ------------------------------------------------------------------------------ setMethod("colnames<-", "timeSeries", function(x, value) { units <- as.character(value) if(!length(units)) if (x@format == "counts") units <- paste("SS", seq(NCOL(x)), sep = ".") else units <- paste("TS", seq(NCOL(x)), sep = ".") if (length(units) != NCOL(x)) stop("length of 'colnames' not equal to array extent",call.=FALSE) x@units <- units colnames(x@.Data) <- units x } ) # ------------------------------------------------------------------------------ setMethod("rownames<-", c("timeSeries", "timeDate"), #c("signalSeries", "timeDate"), function (x, value) { .timeSeries( data = getDataPart(x), charvec = as.numeric(value, "sec"), units = colnames(x), format = value@format, FinCenter = value@FinCenter, recordIDs = x@recordIDs, title = x@title, documentation = x@documentation) } ) # ------------------------------------------------------------------------------ setMethod("rownames<-", "timeSeries", # "signalSeries", function (x, value) { # if charvec NULL returns a signal series if (is.null(value)) return(.signalSeries(data = getDataPart(x), units = colnames(x), recordIDs = x@recordIDs, title = x@title, documentation = x@documentation)) # coerce charvec to timeDate charvec <- timeDate(charvec = value) if (any(is.na(charvec))) # Note : there is already a warning in timeDate if there are NA's .signalSeries(data = getDataPart(x), units = colnames(x), recordIDs = x@recordIDs, title = x@title, documentation = x@documentation) else .timeSeries(data = getDataPart(x), charvec = as.numeric(charvec, "sec"), units = colnames(x), format = charvec@format, FinCenter = charvec@FinCenter, recordIDs = x@recordIDs, title = x@title, documentation = x@documentation) } ) # ------------------------------------------------------------------------------ setMethod("dimnames<-", c("timeSeries", "list"), # c("signalSeries", "list"), function(x, value) { rownames(x) <- value[[1]] colnames(x) <- value[[2]] x } ) # ------------------------------------------------------------------------------ # important for completion with $ setMethod("names", "timeSeries", # "signalSeries", function(x) c(colnames(x), names(x@recordIDs))) setReplaceMethod("names", "timeSeries", # "signalSeries", function(x, value) { nc <- ncol(x) nv <- length(value) nr <- length(x@recordIDs) # Note that using [][] ensure that length of the # names are equal to array extent colnames(x) <- value[seq.int(nv)][seq.int(nc)] if (nv > nc) names(x@recordIDs) <- value[-seq.int(nc)][seq.int(nr)] x }) ################################################################################ timeSeries/R/fin-periodical.R0000644000176000001440000001412312407026706015631 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # endOfPeriodSeries Returns series back to a given period # endOfPeriodStats Returns statistics back to a given period # endOfPeriodBenchmarks Returns benchmarks back to a given period ################################################################################ endOfPeriodSeries <- function(x, nYearsBack = c("1y", "2y", "3y", "5y", "10y", "YTD")) { # A function implemented by Diethelm Wuertz # Description: # Returns series back to a given period # Arguments: # x - a monthly 'timeSeries' object of returns # nYearsBack - a period string. How long back should the series # be extracted? Options include values from 1 year to 10 years. # and year to date: "1y", "2y", "3y", "5y", "10y", "YTD". # FUNCTION: # Check: stopifnot(is.timeSeries(x)) # Match Arguments: nYearsBack <- match.arg(nYearsBack) # Settings: if (nYearsBack == "YTD") monthsBack = atoms(end(x))$m else if (nYearsBack == "1y") monthsBack = 12 else if (nYearsBack == "2y") monthsBack = 24 else if (nYearsBack == "3y") monthsBack = 36 else if (nYearsBack == "5y") monthsBack = 60 else if (nYearsBack == "10y") monthsBack = 120 stopifnot( nrow(x) >= monthsBack ) # ReturnValue: rev(rev(x)[1:monthsBack, ]) } # ------------------------------------------------------------------------------ endOfPeriodStats <- function(x, nYearsBack = c("1y", "2y", "3y", "5y", "10y", "YTD")) { # A function implemented by Diethelm Wuertz # Description: # Returns series statistics back to a given period # Arguments: # x - a monthly 'timeSeries' object of returns # nYearsBack - a period string. How long back should the series # be extracted? Options include values from 1 year to 10 years. # and year to date: "1y", "2y", "3y", "5y", "10y", "YTD". # FUNCTION: # Check: stopifnot(is.timeSeries(x)) # Match Arguments: nYearsBack <- match.arg(nYearsBack) # Series: Series <- endOfPeriodSeries(x, nYearsBack = nYearsBack) # Internal Function: .cl.vals <- function(x, ci) { x = x[!is.na(x)] n = length(x) if (n <= 1) return(c(NA, NA)) se.mean = sqrt(var(x)/n) t.val = qt((1 - ci)/2, n - 1) mn = mean(x) lcl = mn + se.mean * t.val ucl = mn - se.mean * t.val c(lcl, ucl) } # Statistics: for (i in 1:ncol(Series)) { # Basic Statistics: X = as.vector(Series[, i]) X.length = length(X) X = X[!is.na(X)] X.na = X.length - length(X) ci = 0.95 z = c(X.length, X.na, min(X), max(X), as.numeric(quantile(X, prob = 0.25, na.rm = TRUE)), as.numeric(quantile(X, prob = 0.75, na.rm = TRUE)), mean(X), median(X), sum(x), sqrt(var(X)/length(X)), .cl.vals(X, ci)[1], .cl.vals(X, ci)[2], var(X), sqrt(var(X)), skewness(X), kurtosis(X)) znames = c("nobs", "NAs", "Minimum", "Maximum", "1. Quartile", "3. Quartile", "Mean", "Median", "Sum", "SE Mean", "LCL Mean", "UCL Mean", "Variance", "Stdev", "Skewness", "Kurtosis") stats1 <- matrix(z, ncol = 1) row.names(stats1) <- znames # Monthly Return Statistics: xData <- as.vector(x) noNegativePeriods <- length(xData[xData < 0 ]) noPositivePeriods <- length(xData[xData > 0 ]) stats1 = rbind(stats1, worstPeriod = min(xData), negativeValues = noNegativePeriods, positiveValues = noPositivePeriods) MaximumDrawdown = NA TimeUnderWater = NA AnnualizedVolatility = NA SharpeRatio = NA InformationRatio = NA ValueAtRisk = NA ExpectedShortfall = NA # Bind: if (i > 1) { stats <- cbind.data.frame(stats, stats1) } else { stats <- stats1 } } colnames(stats) <- colnames(x) # Return Value: stats } # ------------------------------------------------------------------------------ endOfPeriodBenchmarks <- function(x, benchmark = ncol(x), nYearsBack = c("1y", "2y", "3y", "5y", "10y", "YTD")) { # A function implemented by Diethelm Wuertz # Description: # Returns benchmarks back to a given period # Arguments: # x - a monthly 'timeSeries' object of financial returns # nYearsBack - a period string. How long back should the series # be extracted? Options include values from 1 year to 10 years. # and year to date: "1y", "2y", "3y", "5y", "10y", "YTD". # FUNCTION: # Checks: stopifnot(is.timeSeries(x)) # Match Arguments: nYearsBack <- match.arg(nYearsBack) # Series: Series <- endOfPeriodSeries(x[, -benchmark], nYearsBack = nYearsBack) y <- Benchmark <- endOfPeriodSeries(x[, benchmark], nYearsBack = nYearsBack) stats <- NULL for (i in 1:ncol(Series)) { # Gdet Series: x <- Series[, i] # Compute Statistics: stats1 <- c( TrackingError = NA, Alpha = NA, Beta = NA, CorrelationToBenchmark = NA) # Bind Results: stats <- rbind(stats, stats1) } # Return Value: invisible() } ################################################################################ timeSeries/R/statistics-rowCumsums.R0000644000176000001440000000330011545077672017325 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # rowCumsums,ANY Computes cumulated sums by row # rowCumsums,timeSeries Computes cumulated sums by row for timeSeries ################################################################################ setMethod("rowCumsums", "ANY", function(x, na.rm = FALSE, ...) { # Transform: if (!inherits(x, 'matrix')) x <- as(x, "matrix") if (na.rm) x <- na.omit(x) ans <- apply(x, 1, cumsum, ...) # special treatment when x has one row because apply returns a vector if (NCOL(x) > 1) t(ans) else matrix(ans, ncol = 1, dimnames = dimnames(x)) }) # ------------------------------------------------------------------------------ setMethod("rowCumsums", "timeSeries", function(x, na.rm = FALSE, ...) setDataPart(x, callGeneric(getDataPart(x), na.rm = na.rm, ...))) ################################################################################ timeSeries/R/fin-turnpoints.R0000644000176000001440000002363212347663061015754 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # turns Returns turnpoints from a 'timeSeries' # turnsStats Computes statistics of turn points # BUILTIN: DESCRIPTION: # .turnpointsPastecs Builtin function from package pastecs # .extract.turnpointsPastecs Extractor function from package pastecs # .plot.turnpointsPastecs Plot function from package pastecs # .summary.turnpointsPastecs Summary function from package pastecs # DEPRECATED: DESRIPTION: # .turnpoints2 Deprecated, use function turns # .turnpointsSeries Deprecated, use function turns # .turnpointsStats Deprecated, use function turnsStats ################################################################################ # DW: # This function is originally borrowed from the contributesd R package pastecs. # It is not necessary to load pastecs, the functions required are builtin. # ----------------------------------------------------------------------------- turns <- function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns turnpoints from a timeSeries # Arguments: # x - an univariate timeSeries object, e.g. a price or index series. # ... - arguments passed to the function na.omit() # FUNCTION: # Check arguments: stopifnot(is.timeSeries(x)) stopifnot(isUnivariate(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Handle Missing Values: x <- na.omit(x, ...) # Convert to Vector: X <- x x <- as.vector(x) # Turnpoints: ans <- .turnpointsPastecs(x) tp <- .extract.turnpointsPastecs(ans) data <- cbind(x, tp) colnames(data) <- c(colnames(X), "TP") series(X) <- data # Preserve Title and Documentation: X@title <- Title X@documentation <- Documentation # Return Value: X } # ---------------------------------------------------------------------------- turnsStats <- function(x, doplot = TRUE) { # A function implemented by Diethelm Wuertz # Description: # Computes turnpoints statistics # Arguments: # x - an univariate timeSeries object, e.g. a price or index series # doplot - a logical flag, should an optional plot be displayed? # Value: # Returns an object of class turnpoints. # FUNCTION: # Settings stopifnot(isUnivariate(x)) X <- x x <- as.vector(x) # Turnpoints: ans <- .turnpointsPastecs(x) # Summary Statistics: .summary.turnpointsPastecs(ans) # Optional Plot: if(doplot) .plot.turnpointsPastecs(ans) # Return Value: invisible(ans) } ################################################################################ .turnpoints2 <- function(...) { # Deprecated: .Deprecated(new = "turns", package = "timeSeries") # Return Value: turns(...) } # ----------------------------------------------------------------------------- .turnpointsStats <- function(...) { # Deprecated: .Deprecated(new = "turnsStats", package = "timeSeries") # Return Value: turnsStats(...) } ################################################################################ # Package: pastecs # Title: Package for Analysis of Space-Time Ecological Series # Version: 1.3-4 # Date: 2006-11-28 # Author: Frederic Ibanez , # Philippe Grosjean & # Michele Etienne # Description: Regulation, decomposition and analysis of space-time series. # The pastecs library is a PNEC-Art4 and IFREMER # (Benoit Beliaeff ) initiative # to bring PASSTEC 2000 # (http://www.obs-vlfr.fr/~enseigne/anado/passtec/passtec.htm) # functionnalities to R. # URL: http://www.sciviews.org/pastecs # Maintainer: Philippe Grosjean # License: GNU Public Licence 2.0 or above at your convenience # Depends: boot, stats # Packaged: Tue Nov 28 15:33:42 2006; Philippe Grosjean .turnpointsPastecs <- function(x) { data <- deparse(substitute(x)) if (is.null(ncol(x)) == FALSE) stop("Only one series can be treated at a time") # if (exists("is.R") && is.function(is.R) && is.R()) # We are in R # Now done with Depends: field require(stats) x <- as.vector(x) n <- length(x) diffs <- c(x[1]-1, x[1:(n-1)]) != x uniques <- x[diffs] n2 <- length(uniques) poss <- (1:n)[diffs] exaequos <- c(poss[2:n2], n+1) - poss - 1 if (n2 < 3) { # We need at least 3 unique values!!! warning("Less than 3 unique values, no calculation!") nturns <- NA firstispeak <- FALSE peaks <- rep(FALSE, n2) pits <- rep(FALSE, n2) tppos <- NA proba <- NA info <- NA } else { # The following code is faster in R, but do not work all the time! #if (exists("is.R") && is.function(is.R) && is.R()) { # We are in R # ex <- embed(uniques, 3) # Works only in R! # peaks <- c(FALSE, max.col(ex) == 2, FALSE) # pits <- c(FALSE, max.col(-ex) == 2, FALSE) #} else { # We are in S+ m <- n2 - 2 ex <- matrix(uniques[1:m + rep(3:1, rep(m, 3)) - 1], m) peaks <- c(FALSE, apply(ex, 1, max, na.rm=TRUE) == ex[, 2], FALSE) pits <- c(FALSE, apply(ex, 1, min, na.rm=TRUE) == ex[, 2], FALSE) #} tpts <- peaks | pits if (sum(tpts) == 0) { # No turning point nturns <- 0 firstispeak <- FALSE peaks <- rep(FALSE, n2) pits <- rep(FALSE, n2) tppos <- NA proba <- NA info <- NA } else { # This way, we consider the last element of duplicates, as # in PASSTEC 2000 tppos <- (poss + exaequos)[tpts] tptspos <- (1:n2)[tpts] firstispeak <- tptspos[1] == (1:n2)[peaks][1] nturns <- length(tptspos) if (nturns < 2) { inter <- n2 + 1 posinter1 <- tptspos[1] } else { inter <- c(tptspos[2:nturns], n2) - c(1, tptspos[1:(nturns-1)]) + 1 posinter1 <- tptspos - c(1, tptspos[1:(nturns-1)]) } posinter2 <- inter - posinter1 posinter <- pmax(posinter1, posinter2) proba <- 2 / (inter * gamma(posinter) * gamma(inter - posinter + 1)) info <- -log(proba, base = 2) } } res <- list(data = data, n = n, points = uniques, pos = (poss + exaequos), exaequos = exaequos, nturns = nturns, firstispeak = firstispeak, peaks = peaks, pits = pits, tppos = tppos, proba = proba, info = info) class(res) <- "turnpoints" res } # ------------------------------------------------------------------------------ .extract.turnpointsPastecs <- function(e, n, no.tp = 0, peak = 1, pit = -1, ...) { if (missing(n)) n <- -1 res <- rep(no.tp, length.out= e$n) res[e$pos[e$peaks]] <- peak res[e$pos[e$pits]] <- pit # Keep only the first n points if (n < length(res) & n > 0) res <- res[1:n] res } # ------------------------------------------------------------------------------ .plot.turnpointsPastecs <- function(x, level = 0.05, lhorz = TRUE, lcol = 2, llty = 2, type = "l", xlab = "data number", ylab = paste("I (bits), level = ", level*100, "%", sep = ""), main = paste("Information (turning points) for:",x$data), ...) { # The next function actually draws the graph turnpoints.graph <- function(X, Level, Lhorz, Lcol, Llty, Type, Xlab, Ylab, Main, Sub, ...) { plot(X$tppos, X$info, type = Type, xlab = Xlab, ylab = Ylab, main = Main, ...) abline(h = -log(Level, base = 2), lty = Llty, col = Lcol) } # Return Value: invisible(turnpoints.graph(x, level[1], lhorz, lcol, llty, type, xlab, ylab, main, ...)) } # ------------------------------------------------------------------------------ .summary.turnpointsPastecs <- function(object, ...) { cat("Turning points for:", object$data, "\n\n") cat("nbr observations :", object$n, "\n") cat("nbr ex-aequos :", sum(object$exaequos), "\n") if (object$firstispeak) { cat("nbr turning points:", object$nturns, "(first point is a peak)\n") typep <- c("peak", "pit") } else { cat("nbr turning points:", object$nturns, "(first point is a pit)\n") typep <- c("pit", "peak") } cat("E(p) =", 2 / 3 * (object$n - 2), "Var(p) =", (16 * object$n - 29) / 90, "(theoretical)\n") cat("\n") # construct the table summarizing all turning points typepts <- rep(typep, length.out=object$nturns) tablepts <- as.data.frame(list(point = object$tppos, type = typepts, proba = object$proba, info = object$info)) print(tablepts) # Return Value: invisible(object) } ################################################################################ .turnpointsSeries = function(...) { # Deprecated: .Deprecated(new = "turns") # Return Value: turns(...) } ################################################################################ timeSeries/R/methods-mathOps.R0000644000176000001440000001431313202247351016014 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # Ops,timeSeries Returns group 'Ops' for a 'timeSeries' object # cummax Returns cumulated maxima # cummin Returns cumulated minima # cumprod Returns cumulated products # cumsum Returns cumulated sums # ##diff,timeSeries Differences a timeSeries object # ##scale,timeSeries Scales a timeSeries object # quantile,timeSeries Samples quantiles of a timeSeries object # median,timeSeries Samples median of a timeSeries object ################################################################################ setMethod("Ops", c("vector", "timeSeries"), function(e1, e2) { lattrs <- attributes(e2) e2 <- getDataPart(e2) value <- callGeneric(e1, e2) if (identical(dim(value), dim(e2))) { attributes(value) <- lattrs value <- asS4(value, TRUE) } value } ) # ------------------------------------------------------------------------------ setMethod("Ops", c("array", "timeSeries"), function(e1, e2) { e1 <- as.vector(e1) lattrs <- attributes(e2) e2 <- getDataPart(e2) value <- callGeneric(e1, e2) if (identical(dim(value), dim(e2))) { attributes(value) <- lattrs value <- asS4(value, TRUE) } value } ) # ------------------------------------------------------------------------------ setMethod("Ops", c("ts", "timeSeries"), function(e1, e2) { e1 <- as(e1, "matrix") lattrs <- attributes(e2) e2 <- getDataPart(e2) value <- callGeneric(e1, e2) if (identical(dim(value), dim(e2))) { attributes(value) <- lattrs value <- asS4(value, TRUE) } value } ) # ------------------------------------------------------------------------------ setMethod("Ops", c("timeSeries", "vector"), function(e1, e2) { lattrs <- attributes(e1) e1 <- getDataPart(e1) value <- callGeneric(e1, e2) if (identical(dim(value), dim(e1))) { attributes(value) <- lattrs value <- asS4(value, TRUE) } value } ) # ------------------------------------------------------------------------------ setMethod("Ops", c("timeSeries", "array"), function(e1, e2) { lattrs <- attributes(e1) e1 <- getDataPart(e1) value <- callGeneric(e1, e2) if (identical(dim(value), dim(e1))) { attributes(value) <- lattrs value <- asS4(value, TRUE) } value } ) # ------------------------------------------------------------------------------ setMethod("Ops", c("timeSeries", "ts"), function(e1, e2) { lattrs <- attributes(e1) e1 <- getDataPart(e1) e2 <- as(e2, "matrix") value <- callGeneric(e1, e2) if (identical(dim(value), dim(e1))) { attributes(value) <- lattrs value <- asS4(value, TRUE) } value } ) # ------------------------------------------------------------------------------ setMethod("Ops", c("timeSeries", "timeSeries"), function(e1, e2) { # Note keep recordIDs of e1 only # check if conformable arrays if (!identical(dim(e1), dim(e2))) stop("non-conformable arrays") # check if positions are identical if (!identical(e1@positions, e2@positions)) stop("positions slot do not match") lattrs <- attributes(e1) e1 <- getDataPart(e1) e2 <- getDataPart(e2) value <- callGeneric(e1, e2) if (identical(dim(value), dim(e1))) { attributes(value) <- lattrs value <- asS4(value, TRUE) } value } ) # ------------------------------------------------------------------------------ setMethod("cummax", "timeSeries", function(x) callGeneric(getDataPart(x))) # ------------------------------------------------------------------------------ setMethod("cummin", "timeSeries", function(x) callGeneric(getDataPart(x))) # ------------------------------------------------------------------------------ setMethod("cumprod", "timeSeries", function(x) callGeneric(getDataPart(x))) # ------------------------------------------------------------------------------ setMethod("cumsum", "timeSeries", function(x) callGeneric(getDataPart(x))) # ------------------------------------------------------------------------------ ## setMethod("diff", "timeSeries", function(x, ...) { ## x <- getDataPart(x) ## callGeneric() ## }) # ------------------------------------------------------------------------------ ## setMethod("scale", "timeSeries", function(x, ...) { ## x <- getDataPart(x) ## callGeneric() ## }) # ------------------------------------------------------------------------------ setMethod("quantile", "timeSeries", function(x, ...) { x <- getDataPart(x) callGeneric() }) # ------------------------------------------------------------------------------ setMethod("median", "timeSeries", function(x, na.rm) { x <- getDataPart(x) callGeneric(x, na.rm=na.rm) }) ################################################################################ timeSeries/R/base-sort.R0000644000176000001440000000347313203327023014640 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # sort,timeSeries Sorts a 'timeSeries' object in time ################################################################################ .sort.timeSeries <- function (x, decreasing = FALSE, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Time sorts a 'timeSeries' object # Arguments: # x - a 'timeSeries' object. # Value: # Returns a time sorted object of class 'timeSeries'. # FUNCTION: # check if really necessary to sort x ## NB: is.unsorted can return NA if (!decreasing && !isTRUE(is.unsorted(x@positions))) return(x) if (length(x@positions)>0) x[order(x@positions, decreasing = decreasing), ] else x } setMethod("sort", "timeSeries", function (x, decreasing = FALSE, ...) .sort.timeSeries(x, decreasing = decreasing, ...)) # until UseMethod dispatches S4 methods in 'base' functions sort.timeSeries <- function(x, decreasing = FALSE, ...) .sort.timeSeries(x, decreasing = decreasing, ...) ################################################################################ timeSeries/R/base-merge.R0000644000176000001440000001371712347663061014767 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # merge,timeSeries,ANY Merges 'timeSeries' object and ANY # merge,timeSeries,missing Merges 'timeSeries' object and missing # merge,timeSeries,timeSeries Merges two 'timeSeries' objects # merge,ANY,timeSeries Merges ANY and 'timeSeries' object ################################################################################ setMethod("merge", c("timeSeries", "ANY"), function(x, y, ...) { callGeneric(x, as(y, "timeSeries"), ...) } ) # ------------------------------------------------------------------------------ setMethod("merge", c("timeSeries", "missing"), function(x, y, ...) { x } ) # ------------------------------------------------------------------------------ setMethod("merge", c("timeSeries", "numeric"), function(x, y, ...) { # Deal with names of numeric vectors units <- names(y) if (is.null(units)) units <- paste((substitute(x)), collapse = ".") if (length(y) == 1) { y <- rep(y, times = nrow(x)) return(merge(x, timeSeries(y, time(x), units = units), ...)) } else if (length(y) == nrow(x)) { return(merge(x, timeSeries(y, time(x), units = units), ...)) } else { stop("number of rows must match") } } ) # ------------------------------------------------------------------------------ setMethod("merge", c("timeSeries", "matrix"), function(x, y, ...) { # deal with names of matrix units <- colnames(y) if (is.null(units)) { units <- paste((substitute(y)), collapse = ".") if ((nc <- ncol(y)) > 1) units <- paste(units, seq(nc), sep = ".") } if (nrow(y) != nrow(x)) stop("number of rows must match") else merge(x, timeSeries(y, time(x), units = units), ...) }) # ------------------------------------------------------------------------------' .merge.timeSeries <- function(x, y, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Merges two objects of class 'timeSeries' # Arguments: # x, y - two objects of class 'timeSeries' # FUNCTION: # Compose Attributes - Documentation : xAttributes <- getAttributes(x) yAttributes <- getAttributes(y) Attributes <- .appendList(xAttributes, yAttributes) Documentation <- as.character(date()) attr(Documentation, "Attributes") <- Attributes # Merge: if (is.signalSeries(x) | is.signalSeries(y)) { data <- merge(getDataPart(x), getDataPart(x)) return(timeSeries(data = data, units = colnames(data))) } # Convert to Data Frame tx <- as.numeric(time(x), "sec") ty <- as.numeric(time(y), "sec") df.x <- if (prod(dim(rec.x <- x@recordIDs))) data.frame(positions = tx, getDataPart(x), rec.x) else data.frame(positions = tx, getDataPart(x)) df.y <- if (prod(dim(rec.y <- y@recordIDs))) data.frame(positions = ty, getDataPart(y), rec.y) else data.frame(positions = ty, getDataPart(y)) # Merge as Data Frame: df <- merge(df.x, df.y, all = TRUE) #-> To avoid problems when using invalid data.frame colnames nx <- make.names(colnames(x)) nxrec <- colnames(rec.x) ny <- make.names(colnames(y)) nyrec <- colnames(rec.y) dataIdx <- colnames(df) %in% c(nx, ny) recIdx <- colnames(df) %in% c(nxrec, nyrec) data <- as.matrix(df[,dataIdx, drop=FALSE]) recordIDs <- if (any(recIdx)) df[,recIdx, drop=FALSE] else data.frame() units <- names(df)[dataIdx] charvec <- as.numeric(df[,1]) # Return Value: ans <- timeSeries(data = data, charvec = charvec, units = units, zone = "GMT", FinCenter = finCenter(x), recordIDs = recordIDs) ans@documentation <- Documentation ans } setMethod("merge", c("timeSeries", "timeSeries"), function(x, y, ...) .merge.timeSeries(x, y, ...)) # until UseMethod dispatches S4 methods in 'base' functions merge.timeSeries <- function(x, y, ...) .merge.timeSeries(x, y, ...) # ------------------------------------------------------------------------------ setMethod("merge", c("numeric", "timeSeries"), function(x, y, ...) { # Deal with names of numeric vectors units <- names(x) if (is.null(units)) units <- paste((substitute(x)), collapse = ".") if (length(x) == 1) { x = rep(x, times = nrow(y)) return(merge(timeSeries(x, time(y), units = units), y, ...)) } else if (length(x) == nrow(y)) { return(merge(timeSeries(x, time(y), units = units), y, ...)) } else { stop("number of rows must match") } } ) # ------------------------------------------------------------------------------ setMethod("merge", c("matrix", "timeSeries"), function(x, y, ...) { # Deal with names of matrix units <- colnames(x) if (is.null(units)) { units <- paste((substitute(x)), collapse = ".") if ((nc <- ncol(x)) > 1) units <- paste(units, seq(nc), sep = ".") } if (nrow(x) != nrow(y)) stop("number of rows must match") else merge(timeSeries(x, time(y), units = units), y, ...) }) setMethod("merge", c("ANY", "timeSeries"), function(x, y, ...) { callGeneric(as(x, "timeSeries"), y, ...) } ) ################################################################################ timeSeries/R/utils-description.R0000644000176000001440000000252711545122420016422 0ustar ripleyusers # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library 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 Library General Public License for more details. # # You should have received A copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ # FUNCTION: DESCRIPTION: # description Creates default description string ################################################################################ description <- function() { # A function implemented by Diethelm Wuertz # Description: # Sets default description string: # FUNCTION: # Get Description String: ans <- paste(as.character(date()), "by user:", Sys.getenv("USERNAME")) # Return Value: ans } ################################################################################ timeSeries/R/utils-head.R0000644000176000001440000000716113612544213015004 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # METHOD: SUBSETTING METHODS ON DATA: # head,timeSeries Returns the head of a 'timeSeries' object # tail,timeSeries Returns the tail of a 'timeSeries' object ################################################################################ .head.timeSeries <- function(x, n = 6, recordIDs = FALSE, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns the head of a 'timeSeries' object # Arguments: # x - a 'timeSeries' object. # n - a single integer. If positive, number of the first n records (rows) # to be returned. If negative, all but the n first number of # elements of x are returned. # recordIDs - a logical flag, should the record identification # be shown? By default FALSE. # ... - # Value: # Returns the tail of an object of class 'timeSeries'. # FUNCTION: # Head: if (recordIDs & dim(x)[1] == dim(x@recordIDs)[1]) cbind(head.matrix(x, n = n, ...), head(x@recordIDs, n = n, ...)) else head.matrix(x, n = n, ...) } setMethod("head", "timeSeries", function(x, n = 6, recordIDs = FALSE, ...) .head.timeSeries(x, n, recordIDs, ...)) # until UseMethod dispatches S4 methods in 'base' functions head.timeSeries <- function(x, ...) .head.timeSeries(x, ...) # ------------------------------------------------------------------------------ ##' @title Returns the tail of a 'timeSeries' object ##' ##' @param x a 'timeSeries' object. ##' @param n a single integer. If positive, number of the last n records (rows) ##' to be returned. If negative, all but the n last number of ##' elements of x are returned. ##' @param recordIDs a logical flag, should the record identification ##' be shown? By default FALSE. ##' @param ... ##' ##' @return ##' Returns the tail of an object of class 'timeSeries'. ##' .tail.timeSeries <- function(x, n = 6, recordIDs = FALSE, ...) { if (recordIDs & dim(x)[1] == dim(x@recordIDs)[1]) cbind(tail.matrix(x, n = n, addrownums = FALSE, ...), tail(x@recordIDs, n = n, addrownums = FALSE, ...)) else tail.matrix(x, n = n, addrownums = FALSE, ...) } ## Martin Maechler: if("keepnums" %in% names(formals(tail.matrix))) ## R-devel (2020-01; R >= 4.0.0 in future) .tail.timeSeries <- function(x, n = 6, recordIDs = FALSE, ...) { if (recordIDs && nrow(x) == nrow(x@recordIDs)) cbind(tail.matrix(x, n = n, keepnums = FALSE, ...), tail(x@recordIDs, n = n, keepnums = FALSE, ...)) else tail.matrix(x, n = n, keepnums = FALSE, ...) } setMethod("tail", "timeSeries", function(x, n = 6, recordIDs = FALSE, ...) .tail.timeSeries(x, n, recordIDs, ...)) ##' until UseMethod dispatches S4 methods in 'base' functions tail.timeSeries <- function(x, ...) .tail.timeSeries(x, ...) ################################################################################ timeSeries/R/timeSeries-slotUnits.R0000644000176000001440000000344612421244605017061 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # getUnits Get units slot from a 'timeSeries' # setUnits<- Set new units slot to a 'timeSeries' ################################################################################ getUnits <- function(x) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getUnits") } getUnits.default <- function(x) { # Description: # Get units slot from a 'timeSeries' object. # Arguments: # x - a 'timeSeries' object # FUNCTION: # Return Value: colnames(x) } # ------------------------------------------------------------------------------ "setUnits<-" <- function(x, value) { # Description: # Set units slot to a 'timeSeries' object. # Arguments: # x - a 'timeSeries' object # FUNCTION: # Assign Time Slot: colnames(x) <- value # Return Value: x } ################################################################################ timeSeries/R/base-rev.R0000644000176000001440000000221112407026706014443 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # rev,timeSeries Reverts a 'timeSeries' object in time ################################################################################ .rev.timeSeries <- function(x) x[NROW(x):1,] setMethod("rev", "timeSeries", function(x) .rev.timeSeries(x)) # until UseMethod dispatches S4 methods in 'base' functions rev.timeSeries <- function(x) .rev.timeSeries(x) ################################################################################ timeSeries/R/statistics-rollMean.R0000644000176000001440000003030712111700513016672 0ustar ripleyusers # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # rollStats Returns rolling statistics of a 'timeSeries' object # rollMean Returns rolling mean of a 'timeSeries' object # rollMin Returns rolling minimum of a 'timeSeries' object # rollMax Returns rolling maximum of a 'timeSeries' object # rolMedian Returns rolling median of a 'timeSeries' object # DEPRECATED: DESCRIPTION: # .rollmean.timeSeries Returns rolling mean of a 'timeSeries' object # .rollmin.timeSeries Returns rolling minimum of a 'timeSeries' object # .rollmax.timeSeries Returns rolling maximum of a 'timeSeries' object # .rolmedian.timeSeries Returns rolling median of a 'timeSeries' object ################################################################################ rollStats <- function(x, k, FUN=mean, na.pad=FALSE, align=c("center", "left", "right"), ...) { # Description: # Returns rolling statistics of a 'timeSeries' object # Arguments: # x - an object of class timeSeries # k - integer width of the rolling window. # FUN - statistical function to be rolled. # na.pad - a logical. Should NA padding be added at beginning? # align - character specifying whether result should be left- or # right-aligned or centered (default). # ... - furter arguments passed to function FUN. # Note: # Internal function are borrowed from package zoo ... # Example: # x <- timeSeries(matrix(sample(1:24), ncol = 2), timeCalendar()) # cbind(x, roll(x, k=3, FUN = mean, align="right", na.pad = TRUE)) # Internal Function: .rollstats <- function(x, k, fun, na.pad = FALSE, align = c("center", "left", "right"), ...) { window <- matrix(1:(length(x)+1-k), ncol = 1) winFun <- function(i, fun, y, k, ...) { fun = match.fun(fun) from = 1:(length(y)+1-k) to = from + k -1 fun(y[i:to[i]], ...) } rval <- apply(window, 1, FUN=winFun, fun=FUN, y=x, k=k, ...) if (na.pad) { rval <- switch(match.arg(align), "left" = { c(rval, rep(NA, k-1)) }, "center" = { c(rep(NA, floor((k-1)/2)), rval, rep(NA, ceiling((k-1)/2))) }, "right" = { c(rep(NA, k-1), rval) }) } rval } # Roll: ans <- apply(x, 2, FUN=.rollstats, k=k, fun=FUN, na.pad=na.pad, align=align, ...) x <- setDataPart(x[seq.int(1,NROW(ans)),], ans) colnames(x) <- paste(colnames(x), "RSTATS", sep = "_") if(!na.pad) x = na.omit(x) # Return Value x } ############################################################################### rollMean <- function(x, k, na.pad=FALSE, align=c("center", "left", "right"), ...) { # Description: # Returns rolling mean of a 'timeSeries' object # Arguments: # x - an object of class timeSeries # k - integer width of the rolling window. # na.pad - a logical. Should NA padding be added at beginning? # align - character specifying whether result should be left- or # right-aligned or centered (default). # ... - furter arguments passed to methods. # Note: # Internal function are borrowed from package zoo ... # Example: # X = timeSeries(matrix(rnorm(24), ncol = 2), timeCalendar()) # R = rollMean(x = X, k = 3); R; plot(R) # FUNCTION: # Internal Function: .rollmean.default <- function(x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) { n <- length(x) y <- x[k:n] - x[c(1, 1:(n-k))] y[1] <- sum(x[1:k]) rval <- cumsum(y)/k if (na.pad) { rval <- switch(match.arg(align), "left" = { c(rval, rep(NA, k-1)) }, "center" = { c(rep(NA, floor((k-1)/2)), rval, rep(NA, ceiling((k-1)/2))) }, "right" = { c(rep(NA, k-1), rval) }) } rval } # Roll: ans <- apply(x, 2, .rollmean.default, k = k, na.pad=na.pad, align=align) x <- setDataPart(x[seq.int(1,NROW(ans)),], ans) colnames(x) <- paste(colnames(x), "RMEAN", sep = "_") if(!na.pad) x = na.omit(x) # Return Value: x } # ------------------------------------------------------------------------------ rollMax <- function(x, k, na.pad=FALSE, align=c("center", "left", "right"), ...) { # Description: # Returns rolling maximum of a 'timeSeries' object # Arguments: # x - an object of class timeSeries # k - integer width of the rolling window. # na.pad - a logical. Should NA padding be added at beginning? # align - character specifying whether result should be left- or # right-aligned or centered (default). # ... - furter arguments passed to methods. # Note: # Internal function are borrowed from package zoo ... # Example: # X = timeSeries(matrix(rnorm(24), ncol = 2), timeCalendar()) # R = rollMax(x = X, k = 3); plot(R) # FUNCTION: # Internal Function: .rollmax.default <- function(x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) { n <- length(x) rval <- rep(0, n) a <- 0 for (i in k:n) { rval[i] <- if (is.na(a) || is.na(rval[i=1]) || a==rval[i-1]) max(x[(i-k+1):i]) else max(rval[i-1], x[i]); # max of window = rval[i-1] a <- x[i-k+1] # point that will be removed from window } rval <- rval[-seq(k-1)] if (na.pad) { rval <- switch(match.arg(align), "left" = { c(rval, rep(NA, k-1)) }, "center" = { c(rep(NA, floor((k-1)/2)), rval, rep(NA, ceiling((k-1)/2))) }, "right" = { c(rep(NA, k-1), rval) }) } rval } # Roll: ans <- apply(getDataPart(x), 2, .rollmax.default, k = k, na.pad=na.pad, align=align) x <- setDataPart(x[seq.int(1,NROW(ans)),], ans) colnames(x) <- paste(colnames(x), "RMAX", sep = "_") if(!na.pad) x = na.omit(x) # Return Value: x } # ------------------------------------------------------------------------------ rollMin <- function(x, k, na.pad=FALSE, align=c("center", "left", "right"), ...) { # Description: # Returns rolling minimum of a 'timeSeries' object # Arguments: # x - an object of class timeSeries # k - integer width of the rolling window. # na.pad - a logical. Should NA padding be added at beginning? # align - character specifying whether result should be left- or # right-aligned or centered (default). # ... - furter arguments passed to methods. # Note: # Internal function are borrowed from package zoo ... # Example: # X = timeSeries(matrix(rnorm(24), ncol = 2), timeCalendar()) # R = rollMin(x = X, k = 3); R; plot(R) # FUNCTION: .rollmax.default <- function(x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) { n <- length(x) rval <- rep(0, n) a <- 0 for (i in k:n) { rval[i] <- if (is.na(a) || is.na(rval[i=1]) || a==rval[i-1]) max(x[(i-k+1):i]) else max(rval[i-1], x[i]); # max of window = rval[i-1] a <- x[i-k+1] # point that will be removed from window } rval <- rval[-seq(k-1)] if (na.pad) { rval <- switch(match.arg(align), "left" = { c(rval, rep(NA, k-1)) }, "center" = { c(rep(NA, floor((k-1)/2)), rval, rep(NA, ceiling((k-1)/2))) }, "right" = { c(rep(NA, k-1), rval) }) } rval } .rollmin.default <- function(x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) { ans = -.rollmax.default(-x, k, na.pad = na.pad, align = align, ...) ans } # Roll: ans <- apply(getDataPart(x), 2, .rollmin.default, k=k, na.pad=na.pad, align=align) x <- setDataPart(x[seq.int(1,NROW(ans)),], ans) colnames(x) <- paste(colnames(x), "RMIN", sep = "_") if(!na.pad) x = na.omit(x) # Return Value: x } # ------------------------------------------------------------------------------ rollMedian <- function(x, k, na.pad=FALSE, align=c("center", "left", "right"), ...) { # Description: # Returns rolling median of a 'timeSeries' object # Arguments: # x - an object of class timeSeries # k - integer width of the rolling window. Must be odd for rollmedian. # na.pad - a logical. Should NA padding be added at beginning? # align - character specifying whether result should be left- or # right-aligned or centered (default). # ... - furter arguments passed to methods. # Note: # Internal function are borrowed from package zoo ... # Example: # X = timeSeries(matrix(rnorm(24), ncol=2), timeCalendar()) # R = rollMedian(x = X, k = 3); R; plot(R) # FUNCTION: # Internal Function: .rollmedian.default <- function(x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) { stopifnot(k <= length(x), k %% 2 == 1) n <- length(x) m <- k %/% 2 rval <- runmed(x, k, ...) attr(rval, "k") <- NULL rval <- rval[-c(1:m, (n-m+1):n)] if (na.pad) { rval <- switch(match.arg(align), "left" = { c(rval, rep(NA, k-1)) }, "center" = { c(rep(NA, floor((k-1)/2)), rval, rep(NA, ceiling((k-1)/2))) }, "right" = { c(rep(NA, k-1), rval) }) } rval } # Roll: ans <- apply(x, 2, .rollmedian.default, k=k, na.pad=na.pad, align=align) x <- setDataPart(x[seq.int(1,NROW(ans)),], ans) colnames(x) <- paste(colnames(x), "RMED", sep = "_") if(!na.pad) x = na.omit(x) # Return Value: x } ################################################################################ .rollmean.timeSeries <- function(...) { # FUNCTION: # Deprecated: .Deprecated("rollMean") # Return Value: rollMean(...) } # ------------------------------------------------------------------------------ .rollmin.timeSeries <- function(...) { # FUNCTION: # Deprecated: .Deprecated("rollMin") # Return Value: rollMin(...) } # ------------------------------------------------------------------------------ .rollmax.timeSeries <- function(...) { # FUNCTION: # Deprecated: .Deprecated("rollMax") # Return Value: rollMax(...) } # ------------------------------------------------------------------------------ .rollmedian.timeSeries <- function(...) { # FUNCTION: # Deprecated: .Deprecated("rollMedian") # Return Value: rollMedian(...) } ################################################################################ timeSeries/R/methods-as.R0000644000176000001440000002564511545076570015031 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # METHOD: CREATE A TIMESERIES FROM OTHER OBJECTS: # as.timeSeries Defines method for a 'timeSeries' object # as.timeSeries.default Returns the input # as.timeSeries.ts Transforms a 'data.frame' into a 'timeSeries' # as.timeSeries.data.frame Transforms a 'data.frame' into a 'timeSeries' # as.timeSeries.character Loads and transformas from a demo file # as.timeSeries.zoo Transforms a 'zoo' object into a 'timeSeries' # METHOD: TRANSFORM A TIMESERIES INTO OTHER OBJECTS: # as.vector.timeSeries Converts a univariate 'timeSeries' to a vector # as.matrix.timeSeries Converts a 'timeSeries' to a 'matrix' # as.numeric.timeSeries Converts a 'timeSeries' to a 'numeric' # as.data.frame.timeSeries Converts a 'timeSeries' to a 'data.frame' # as.ts.timeSeries Converts a 'timeSeries' to a 'ts' # as.ts.logical Converts a 'timeSeries' to 'logical' # as.list.timeSeries Converts a 'timeSeries' to 'list' ################################################################################ # YC: # here keep S3 methods because it should expect an oldClass object as argument # ------------------------------------------------------------------------------ as.timeSeries <- function(x, ...) { UseMethod("as.timeSeries") } # ------------------------------------------------------------------------------ as.timeSeries.default <- function(x, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # FUNCTION: # Return Value: ans <- timeSeries(x, ...) ans } setAs("ANY", "timeSeries", function(from) as.timeSeries(from)) # ------------------------------------------------------------------------------ as.timeSeries.ts <- function(x, ...) { asTime <- unclass(time(x)) yearPart <- trunc(asTime) decimalPart <- asTime - yearPart leapYears <- yearPart%%4 == 0 & (yearPart%%100 != 0 | yearPart%%400 == 0) days <- trunc(decimalPart * (365 + leapYears)) + 1 freq <- frequency(x) charvec <- if (freq == 4) { # Quarterly Data: days <- days + 1 ans <- timeDate(format(strptime(paste(yearPart, days), format = "%Y %j")), zone = "GMT", FinCenter = "GMT") timeLastDayInQuarter(ans) } else if (freq == 12) { # Monthly Data: days <- days + 1 ans <- timeDate(format(strptime(paste(yearPart, days), format = "%Y %j")), zone = "GMT", FinCenter = "GMT") timeLastDayInMonth(ans) } else { NA } # Result: tS = timeSeries(x, charvec, ...) attr(tS, "ts") <- c(start = round(start(x)), frequency = round(frequency(x)), deltat = deltat(x)) # Return Value: tS } setAs("ts", "timeSeries", function(from) as.timeSeries(from)) # ------------------------------------------------------------------------------ as.timeSeries.data.frame <- function(x, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Converts a data.frame into a timeSeries object # Notes: # The first column must contain the dates. # Examples: # data(bmwRet); head(as.timeSeries(data(bmwRet))) # FUNCTION: if (all(!(num <- unlist(lapply(x, is.numeric))))) stop("x contains no numeric columns") # Check if rownames(x) or the first column has a valid ISO-format: if (num[1]) # is.numeric() is better than format == "unkown" # which can give wrong result. i.e. whichFormat(0.1253328600) suppressWarnings(charvec <- timeDate(rownames(x))) else suppressWarnings(charvec <- timeDate(as.vector(x[,1]))) data <- as.matrix(x[, num]) units <- names(x)[num] if (any(!(cl <- num[-1]))) { recordIDs <- as.data.frame(x[, !c(TRUE, cl)]) # do not take first column names(recordIDs) <- names(x)[!c(TRUE, cl)] } else { recordIDs <- data.frame() } # Create Time Series Object: timeSeries(data = data, charvec = charvec, units = units, recordIDs = recordIDs, ...) } setAs("data.frame", "timeSeries", function(from) as.timeSeries(from)) # ------------------------------------------------------------------------------ as.timeSeries.character <- function(x, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Example: # as.timeSeries(data(nyse)) # FUNCTION: # Load Demo File - Returns a data frame: x <- eval(parse(text = eval(x))) # timeSeries: ans <- as.timeSeries(x, ...) # Return Value: ans } setAs("character", "timeSeries", function(from) as.timeSeries(from)) # ------------------------------------------------------------------------------ as.timeSeries.zoo <- function(x, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # FUNCTION: # as. timeSeries: ans <- timeSeries(data = as.matrix(x), charvec = as.character(attr(x, "index")), ...) # Return Value: ans } ################################################################################ # YC: # Since 2.9.0 must define proper S4 methods .as.matrix.timeSeries <- function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # Converts a multivariate "timeSeries" to a matrix # Arguments: # x - a 'timeSeries' object # Value: # Returns the data slot of a 'timesSeries' object as a vector. # FUNCTION: # Check: if (!inherits(x, "timeSeries")) stop("x is not a timeSeries object!") # Convert: ans <- getDataPart(x) # is matrix dimnames(ans) <- dimnames(x) # Results ans } setMethod("as.matrix", "timeSeries", function(x, ...) .as.matrix.timeSeries(x, ...)) # until UseMethod dispatches S4 methods in 'base' functions as.matrix.timeSeries <- function(x, ...) .as.matrix.timeSeries(x, ...) setAs("timeSeries", "matrix", function(from) as.matrix(from)) # ------------------------------------------------------------------------------ .as.data.frame.timeSeries <- function(x, row.names = NULL, optional = FALSE, ...) { # A function implemented by Diethelm Wuertz # Description: # Converts a multivariate "timeSeries" to a data.frame # Arguments: # x - a 'timeSeries' object # row.names, optional - not used # Value: # Returns the data slot of a 'timesSeries' object as a data frame. # FUNCTION: # get rownames from timeSeries if (is.null(row.names)) row.names <- rownames(x) if (any(duplicated(row.names))) stop("cannot convert to data.frame with duplicate timestamps") ans <- if (!length(x@recordIDs)) data.frame(as.list(x), row.names = row.names, ...) else data.frame(as.list(x), x@recordIDs, row.names = row.names, ...) # Return Value: ans } setMethod("as.data.frame", "timeSeries", function(x, row.names = NULL, optional = FALSE, ...) .as.data.frame.timeSeries(x, row.names = row.names, optional = optional, ...)) # until UseMethod dispatches S4 methods in 'base' functions as.data.frame.timeSeries <- function(x, ...) .as.data.frame.timeSeries(x, ...) setAs("timeSeries", "data.frame", function(from) as.data.frame(from)) # ------------------------------------------------------------------------------ .as.ts.timeSeries <- function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # Converts a colum from a 'timeSeries' object into an object # of class 'ts'. # Example: # # x = dummySeries(); as.ts(x) # # x = timeSeries(seq(12), timeSequence(by = "month", length.out = 12)) # as.ts(x) # # x = dummySeries()[c(3,6,9,12),]; as.ts(x) # x = dummySeries()[c(2,5,8,11),]; as.ts(x) # x = dummySeries()[c(1,4,7,10),]; as.ts(x) # # x = dummySeries()[c(4,7,10,1),]; as.ts(x) # Changes: # # FUNCTION: # check if monthly or quarterly data td <- time(x) m <- c(timeDate::months(td)) #-> c() to remove attributes # (m[1] -1) -> shift vector to match first entry in m monthly <- seq(from = m[1]-1, length.out=length(m)) %% 12 + 1 quarterly <- seq(from = m[1]-1, by = 3, length=length(m)) %% 12 + 1 # get year of first entry y1 <- as.numeric(format(td[1], "%Y")) # important to use vector/matrix to avoid troubles with ts() data <- if (isUnivariate(x)) as.vector(x) else matrix(x, ncol = ncol(x)) if (identical(monthly, m)) # Monthly data return(ts(data, start = c(y1, m[1]), frequency = 12)) if (identical(quarterly, m)) # Quarterly data return(ts(data, start = c(y1, m[1]%/%4+1), frequency = 4)) # other frequencies not implemented yet; return default value ans <- ts(data, names = colnames(x)) attr(ans, "positions") <- time(x) ans } setMethod("as.ts", "timeSeries", function(x, ...) .as.ts.timeSeries(x, ...)) # until UseMethod dispatches S4 methods in 'base' functions as.ts.timeSeries <- function(x, ...) .as.ts.timeSeries(x, ...) setAs("timeSeries", "ts", function(from) as.ts(from)) # ------------------------------------------------------------------------------ # YC: # Unneeded since timeSeries inherits from the structure class # as.logical.timeSeries <- function(x, ...) as.logical(series(x), ...) # ------------------------------------------------------------------------------ # YC: # Important for functions like lapply and sapply to work properly .as.list.timeSeries <- function(x, ...) { data <- getDataPart(x) ncols <- NCOL(data) value <- vector("list", ncols) for (i in seq.int(ncols)) value[[i]] <- as.vector(data[, i]) names(value) <- colnames(x) value } setMethod("as.list", "timeSeries", function(x, ...) .as.list.timeSeries(x, ...)) # until UseMethod dispatches S4 methods in 'base' functions as.list.timeSeries <- function(x, ...) .as.list.timeSeries(x, ...) setAs("timeSeries", "list", function(from) as.list(from)) ################################################################################ timeSeries/R/fin-runlengths.R0000644000176000001440000000422012347663061015710 0ustar ripleyusers # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # runlengths Returns 'timeSeries' object of runlengths ################################################################################ runlengths <- function(x, ...) { # A function implemetned by Diethelm Wuertz # Description: # Returns 'timeSeries' object of runlengths # Arguments: # x - an univariate 'timeSeries' object of financial returns # ... - arguments passed to the function na.omit() # Value: # runlengths an object of class 'timeSeries'. # Note: # Zeroes are handled as NA. # Example: # set.seed(4711) # x.tS = timeSeries(data=rnorm(12), charvec=timeCalendar(), units="x") # runlengths(x.tS) # FUNCTION: # Check arguments: stopifnot(is.timeSeries(x)) stopifnot(isUnivariate(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Handle Missing Values: x[x == 0] <- NA x.vec = sign(as.vector(na.omit(x, ...))) # Compute Run Lengths: n <- length(x.vec) y <- x.vec[-1L] != x.vec[-n] Index <- c(which(y | is.na(y)), n) X = x[Index, ] series(X) <- matrix(diff(c(0L, Index)), ncol = 1) # Reset recordIDs: X@recordIDs <- data.frame() # Preserve Title and Documentation: X@title <- Title X@documentation <- Documentation # Return Value: X } ################################################################################ timeSeries/R/statistics-smoothLowess.R0000644000176000001440000001507312416520314017641 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # smoothSupsmu Smoothes a timeSeries with the supsmu function # smoothLowess Smoothes a timeSeries with the lowess function # smoothSpline Smoothes a timeSeries with the smooth.spline function # DEPRECATED: DESCRIPTION: # .supsmuSmoother Smoothes a timeSeries with the supsmu function # .lowessSmoother Smoothes a timeSeries with the lowess function # .splineSmoother Smoothes a timeSeries with the smooth.spline function ################################################################################ # DW: # These are older functions which have to be rewritten ... # The functions are thought to be used to smooth financial # price or index series. # ------------------------------------------------------------------------------ smoothSupsmu <- function(x, bass = 5, ...) { # A function implemented by Diethelm Wuertz # Description: # Smoothes a time series with the supsmu function # Arguments: # x - an univariate timeSeries object, e.g. a price or index series # bass - controls the smoothness of the fitted curve. Values of up # to 10 indicate increasing smoothness. # ... - further arguments passed to the function supsmu() # Example: # x <- smoothSupsmu(MSFT[, 4], bass = 0.1); x; plot(x) # FUNCTION: # Settings: stopifnot(isUnivariate(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Handle Missing Values: x <- na.omit(x) # Convert to Vector: X <- x x <- as.vector(x) # Smooth: ans <- stats::supsmu(x = 1:length(x), y = x, bass = bass, ... ) data <- cbind(x, ans$y) colnames(data) <- c(colnames(X), "supsmu") rownames(data) <- as.character(time(X)) series(X) <- data # Preserve Title and Documentation: X@title <- Title X@documentation <- Documentation # Return Value: X } # ------------------------------------------------------------------------------ smoothLowess <- function(x, f = 0.5, ...) { # A function implemented by Diethelm Wuertz # Description: # Smoothes a time series with the lowess function # Arguments: # x - an univariate timeSeries object, e.g. a price or index series # f - the smoother span. This gives the proportion of points in the # plot which influence the smooth at each value. Larger values # give more smoothness. # ... - further arguments passed to the function lowess() # Example: # x = smoothLowess(MSFT[, 4], f = 0.05); x; plot(x) # FUNCTION: # Settings: stopifnot(isUnivariate(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Handle Missing Values: x <- na.omit(x) # Convert to Vector: X <- x x <- as.vector(x) # Smooth: ans <- stats::lowess(x, f = f, ...)$y data <- cbind(x, ans) colnames(data) <- c(colnames(X), "lowess") rownames(data) <- as.character(time(X)) series(X) <- data # Preserve Title and Documentation: X@title <- Title X@documentation <- Documentation # Return Value: X } # ------------------------------------------------------------------------------ smoothSpline <- function(x, spar = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Smoothes a time series with the smooth.spline function # Arguments: # x - an univariate timeSeries object, e.g. a price or index series # f - the smoother span. This gives the proportion of points in the # plot which influence the smooth at each value. Larger values # give more smoothness. # ... - further arguments passed to the function smooth.spline() # Details: # smooth.spline(x, y = NULL, w = NULL, df, spar = NULL, cv = FALSE, # all.knots = FALSE, nknots = NULL, keep.data = TRUE, df.offset = 0, # penalty = 1, control.spar = list()) # Example: # x = smoothSpline(MSFT[, 4], spar = NULL); x; plot(x) # x = smoothSpline(MSFT[, 4], spar = 0.4); x; plot(x) # FUNCTION: # Settings: stopifnot(isUnivariate(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Handle Missing Values: x <- na.omit(x) # Convert to Vector: X <- x x <- as.vector(x) # Smooth: ans <- stats::smooth.spline(x, spar = spar, ...)$y data <- cbind(x, ans) colnames(data) <- c(colnames(X), "spline") rownames(data) <- as.character(time(X)) series(X) <- data # Preserve Title and Documentation: X@title <- Title X@documentation <- Documentation # Return Value: X } ################################################################################ .supsmuSmoother <- function(...) { # FUNCTION: # Deprecated: .Deprecated("smoothSupsmu") # Return Value: smoothSupsmu(...) } # ------------------------------------------------------------------------------ .lowessSmoother <- function(...) { # FUNCTION: # Deprecated: .Deprecated("smoothLowess") # Return Value: smoothLowess(...) } # ------------------------------------------------------------------------------ .splineSmoother <- function(...) { # FUNCTION: # Deprecated: .Deprecated("smoothSpline") # Return Value: smoothSpline(...) } ################################################################################ timeSeries/R/fin-daily.R0000644000176000001440000002014312347663061014623 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # alignDailySeries Aligns a 'timeSeries' object to new positions # rollDailySeries Rolls daily a 'timeSeries' on a given period # OBSOLETE: DESCRIPTION: # .ohlcDailyPlot Plots open high low close bar chart # .plotOHLC Internal called by function ohlcDailyPlot() ################################################################################ alignDailySeries <- function (x, method = c("before", "after", "interp", "fillNA", "fmm", "periodic", "natural", "monoH.FC"), include.weekends = FALSE, units = NULL, zone = "", FinCenter = "", ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Aligns a 'timeSeries' object to new positions # Arguments: # x - an object of class "timeSeries". # method - # "before" - use the data from the row whose position is # just before the unmatched position; # "after" - use the data from the row whose position is # just after the unmatched position; # "linear" - interpolate linearly between "before" and # "after". # "fillNA" - fill missing days with NA values # include.weekends - a logical value. Should weekend dates be # included or removed? # Note: alignDailySeries is now based on align timeSeries method. # FUNCTION: # Preserve Title and Documentation: Title <- x@title Documentation <- x@documentation # Adjust zone and FinCenter if provided if (zone != "" || FinCenter != "") { if (zone == "") zone <- getRmetricsOptions("myFinCenter") if (FinCenter == "") FinCenter <- getRmetricsOptions("myFinCenter") x <- timeSeries(x, zone = zone, FinCenter = FinCenter) } # Run Generic Function align() ans <- .align.timeSeries(x = x, by = "1d", offset = "0s", method = method, include.weekends = include.weekends, ...) ans@title <- Title ans@documentation <- Documentation # Add New Units: if (!is.null(units)) colnames(ans) = units # Return Value: ans } # ------------------------------------------------------------------------------ rollDailySeries <- function(x, period = "7d", FUN, ...) { # A function implemented by Diethelm Wuertz # Description: # Rolls daily a 'timeSeries' on a given period # Arguments: # x - an univariate "timeSeries" object or a numeric vector. # n - an integer specifying the number of periods or # terms to use in each rolling/moving sample. # trim - a logical flag: if TRUE, the first n-1 missing values in # the returned object will be removed; if FALSE, they will # be saved in the returned object. The default is TRUE. # FUN - the rolling function, arguments to this function can be # passed through the \code{\dots} argument. # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Check for Signal Series: Message <- " is for time series and not for signal series." if (x@format == "counts") stop(as.character(match.call())[1], Message) # Preserve Title and Documentation: Title <- x@title Documentation <- x@documentation # Fix missing matrix method for quantile(), still to do ... .quantile.matrix = function(x, probs = 0.95, ...) { apply(as.matrix(x), 2, quantile, probs = probs) } # Settings: periodLength = as.numeric(substr(period, 1, nchar(period) - 1)) periodUnit = substr(period, nchar(period), nchar(period)) N = nrow(x) Start = start(x) + (periodLength-1)*24*3600 Positions = time(x) to = Positions[Positions > Start] from = to - periodLength*24*3600 # Apply Function: ans <- applySeries(x = x, from = from, to = to, FUN = FUN, ...) ans@title <- Title ans@documentation <- Documentation # Return Value: ans } ################################################################################ # OBSOLETE: .ohlcDailyPlot <- function(x, volume = TRUE, colOrder = c(1:5), units = 1e6, xlab = c("Date", "Date"), ylab = c("Price", "Volume"), main = c("O-H-L-C", "Volume"), grid.nx = 7, grid.lty = "solid", ...) { # A function implemented by Diethelm Wuertz # Description: # Plots open | high | low | close bar chart # Arguments: # x - an S4 object of class 'timeSeries' with named entries: # Open, High, Low, Close, and Volume # Reference: # Build on top of Adrian Trapletti's plotOHLC() # function from his R-package "tseries". # FUNCTION: stopifnot(is.timeSeries(x)) if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # Next: x.filled = alignDailySeries(x, method = "fillNA", include.weekends = TRUE) jul = as.integer(julian(time(x.filled))) X = ts(as.matrix(x.filled)[, 1:4], start = min(jul), end = max(jul)) # Plot OHLC: .plotOHLC(X, origin = "1970-01-01", xlab = xlab[1], ylab = ylab[1]) # print(axTicks(1)) # print(axTicks(2)) title(main = main[1]) grid(nx = grid.nx, ny = NULL, lty = grid.lty, ...) # Include Volume? if (volume) { Volume = x[, 5]/units plot(Volume, type = "h", xlab = xlab[2], ylab = ylab[2]) title(main = main[2]) grid(nx = grid.nx, ny = NULL, lty = grid.lty, ...) } # Return value: invisible() } # ------------------------------------------------------------------------------ .plotOHLC = function (x, xlim = NULL, ylim = NULL, xlab = "Time", ylab, col = par("col"), bg = par("bg"), axes = TRUE, frame.plot = axes, ann = par("ann"), main = NULL, date = c("calendar", "julian"), format = "%Y-%m-%d", origin = "1899-12-30", ...) { # A Copy from Contributed R Package 'tseries' # Description: # Internal called by function .ohlcDailyPlot() # FUNCTION: # Check for mts: if ((!is.mts(x)) || (colnames(x)[1] != "Open") || (colnames(x)[2] != "High") || (colnames(x)[3] != "Low") || (colnames(x)[4] != "Close")) stop("x is not a open/high/low/close time series") xlabel <- if (!missing(x)) deparse(substitute(x)) else NULL if (missing(ylab)) ylab <- xlabel date <- match.arg(date) time.x <- time(x) dt <- min(lag(time.x) - time.x)/3 if (is.null(xlim)) xlim <- range(time.x) if (is.null(ylim)) ylim <- range(x[is.finite(x)]) plot.new() plot.window(xlim, ylim, ...) segments(time.x, x[, "High"], time.x, x[, "Low"], col = col[1], bg = bg) segments(time.x - dt, x[, "Open"], time.x, x[, "Open"], col = col[1], bg = bg) segments(time.x, x[, "Close"], time.x + dt, x[, "Close"], col = col[1], bg = bg) if (ann) title(main = main, xlab = xlab, ylab = ylab, ...) if (axes) { if (date == "julian") { axis(1, ...) axis(2, ...) } else { n <- NROW(x) lab.ind <- round(seq(1, n, length = 5)) D <- as.vector(time.x[lab.ind] * 86400) + as.POSIXct(origin, tz = "GMT") DD <- format.POSIXct(D, format = format, tz = "GMT") axis(1, at = time.x[lab.ind], labels = DD, ...) axis(2, ...) } } if (frame.plot) box(...) # Return Value: invisible() } ################################################################################ timeSeries/R/fin-wealth.R0000644000176000001440000000237212407027574015011 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ############################################################################### # FUNCTION: DESCRIPTION: # index2wealth Converts an index to a wealth series ############################################################################### index2wealth <- function(x) { # A function implemented by Diethelm Wuertz # Description: # Converts an index to a wealth series # FUNCTION: # x - index time series to be converted # FUNCTION: # Wealth Initialization: for (i in 1:ncol(x)) x[, i] <- x[, i]/as.vector(x[1, i]) # Return Value: x } ############################################################################### timeSeries/R/fin-monthly.R0000644000176000001440000001316512347663061015221 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: FOR MONTHLY OPERATIONS: # countMonthlyRecords Returns a series with monthly counts of records # rollMonthlyWindows Returns start/end dates for rolling time windows # rollMonthlySeries Rolls Monthly a 'timeSeries' on a given period ################################################################################ # DW: # I think we should call these functions: # countRecordsMonthly, rollWindowsMonthly, rollSeriesMonthly, ... # ------------------------------------------------------------------------------ countMonthlyRecords <- function(x) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Returns a series with monthly counts of records # Example: # x = as.timeSeries(data(msft.dat)); countMonthlyRecords(x) # x = as.timeSeries(data(edhec)); countMonthlyRecords(x) # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Check for Signal Series: if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # Count: ans <- rollMonthlySeries(x[, 1], period = "1m", by = "1m", FUN = NROW) colnames(ans) <- "Counts" # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } # ------------------------------------------------------------------------------ rollMonthlyWindows <- function(x, period = "12m", by = "1m") { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Returns start and end dates for rolling time windows # Arguments: # x - a 'timeSerie's object of asset returns # period - a character string denoting the length of the rolling # window, e.g. "24m" means 24 months # by - a character string denoting the shift of the rolling window, # e.g. "3m" means one quarter # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Check for Signal Series: if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # Get Window Parameter: periodLength <- as.numeric(substr(period, 1, nchar(period)-1)) periodUnit <- substr(period, nchar(period), nchar(period)) byLength <- as.numeric(substr(by, 1, nchar(by)-1)) byUnit <- substr(by, nchar(by), nchar(by)) stopifnot(periodUnit == "m") stopifnot(byUnit == "m") # Get Window Parameter: periodLength <- as.numeric(substr(period, 1, nchar(period)-1)) periodUnit <- substr(period, nchar(period), nchar(period)) byLength <- as.numeric(substr(by, 1, nchar(by)-1)) byUnit <- substr(by, nchar(by), nchar(by)) stopifnot(periodUnit == "m") stopifnot(byUnit == "m") # Make Windows - We expect monthly data records ... positions <- time(x) Positions <- unique(timeFirstDayInMonth(positions)) numberOfPositions <- length(Positions) startDates <- Positions[1:(numberOfPositions-periodLength)] endDates <- Positions[(periodLength+1):numberOfPositions]-24*3600 # Windows: windows <- list(from = startDates, to = endDates) attr(windows, "control") = c(start = start(positions), end = end(positions)) # Return Value: windows } # ------------------------------------------------------------------------------ rollMonthlySeries <- function(x, period = "12m", by = "1m", FUN, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Rolls monthly a 'timeSeries' on a given period # Arguments: # x - a 'timeSerie's object of asset returns # period - a character string denoting the length of the rolling # window, e.g. "24m" means 24 months # by - a character string denoting the shift of the rolling window, # e.g. "3m" means one quarter # FUN - function to be applied # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Check for Signal Series: stopifnot(is(x, "timeSeries")) if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # Settings: windows <- rollMonthlyWindows(x = x[, 1], period = period, by = by) # Apply Function: ans <- applySeries(x = x, from = windows$from, to = windows$to, FUN = FUN, ...) # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } ################################################################################ timeSeries/R/fin-spreads.R0000644000176000001440000000513412347663061015165 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # spreads Computes spreads from a 'timeSeries' object # midquotes Computes mid quotes from a 'timeSeries' object ################################################################################ # DW: # Setting bid and ask for column names is maybe the best choice. Examples # are the TED spread or the Libo OIS spread. The spread between High and Low # is the range. # ------------------------------------------------------------------------------ spreads <- function(x, which = c("Bid", "Ask"), tickSize = NULL) { # A function implemented by Diethelm Wuertz # Description: # Computes spreads from a 'timeSeries' object # FUNCTION: # Check arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Compute Spread: spread <- x[, which[2]] - x[, which[1]] if (!is.null(tickSize)) series(spread) <- round(series(spread)/tickSize) # Preserve Title and Documentation: spread@title <- Title spread@documentation <- Documentation # Return Value: spread } # ------------------------------------------------------------------------------ midquotes = function(x, which = c("Bid", "Ask")) { # A function implemented by Diethelm Wuertz # Description: # Computes mid quotes from a 'timeSeries' object # FUNCTION: # Check arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Compute Mid Quotes: midquotes = 0.5 * ( x[, which[1]] + x[, which[2]] ) # Preserve Title and Documentation: midquotes@title <- Title midquotes@documentation <- Documentation # Return Value: midquotes } ################################################################################ timeSeries/R/aaa-utils.R0000644000176000001440000000135113612551406014622 0ustar ripleyusers## Copyright (C) 2020 Martin Maechler ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## A copy of the GNU General Public License is available at ## https://www.R-project.org/Licenses/ ## Not my idea .. but really nice : `%||%` <- function (L, R) if (is.null(L)) R else L timeSeries/R/stats-model.frame.R0000644000176000001440000000670512407026706016300 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # model.frame.default Allows to use model.frame for "timeSeries" ################################################################################ # YC : remove model.frame because more problems than benefits. Rely on # default model.frame as long as as.data.frame.timeSeries works in # 'base' function model.frame.default ## setMethod("model.frame.default", signature(data = "timeSeries"), ## function(formula, data = NULL, ## subset = NULL, na.action = na.fail, ## drop.unused.levels = FALSE, xlev = NULL, ...) ## { ## # A function implemented by Diethelm Wuertz ## # Description: ## # Extracting the Environment of a Model Formula ## # Arguments: ## # formula - a model formula ## # data - a 'timeSeries' object ## # Details: ## # Allows to use model.frame() for "timeSeries" objects. ## # Examples: ## # x = as.timeSeries(data(msft.dat))[1:12, ] ## # model.frame( ~ High + Low, data = x) ## # model.frame(Open ~ High + log(Low), data = x) ## # FUNCTION: ## data <- as(data, "data.frame") ## ### model.frame.default(formula, data, ## ### subset, na.action, ## ### drop.unused.levels, ## ### xlev, ...) ## model.frame(formula, data, ...) ## }) ## ## ### # Create Model Frame: ## ## ### format <- data@format ## ## ### FinCenter <- finCenter(data) ## ## ### recordIDs <- data@recordIDs ## ## ### title <- data@title ## ## data <- as(data, "data.frame") ## ## Model <- model.frame(formula, data, ...) ## ## #-> should be in parent.frame? ## ## ### recordIDs <- ## ## ### if (NROW(Model) == NROW(recordIDs)) ## ## ### recordIDs ## ## ### else ## ## ### data.frame() ## ## ### # Convert to timeSeries: ## ## ### ans <- timeSeries(data = as.matrix(Model), ## ## ### charvec = rownames(Model), ## ## ### units = colnames(Model), ## ## ### format = format, ## ## ### FinCenter = FinCenter, ## ## ### recordIDs = recordIDs, ## ## ### title = title, ## ## ### documentation = description() ## ## ### ) ## ## ### # Return value: ## ## ### ans ## ## Model ## ## }) ################################################################################ timeSeries/R/base-attach.R0000644000176000001440000000265612407026706015130 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # S4 METHOD: DATABASE ATTACHEMENT: # attach,timeSeries Attaches a 'timeSeries' object to the search path ################################################################################ setMethod("attach", "timeSeries", function(what, pos = 2, name = deparse(substitute(what)), warn.conflicts = TRUE) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Attaches a 'timeSeries' object # Details: # The function works in the same way as in the case of a # data.frame, i.e. the return values are vectors. # FUNCTION: # Return Value: callGeneric(as.data.frame(what), pos, name, warn.conflicts) }) ################################################################################ timeSeries/R/AllGeneric.R0000644000176000001440000000653312407026706014757 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # GENERIC: DESCRIPTION # returns Computes returns # rowCumsums Computes row cumulated sums # series Extracts series data # series<- Assigns series data # coredata Extracts series data # index deprecated # index <- deprecated # outlier Returns outliers # timeSeries Returns timeSeries # colCumsums Computes column cumulated sums # colCummaxs Computes column cumulated maxima # colCummins Computes column cumulated minima # colCumprods Computes column cumulated products # colCumreturns Computes column cumulated returns ################################################################################ setGeneric("returns", function(x, ...) standardGeneric("returns"), package = "timeSeries") setGeneric("rowCumsums", function(x, na.rm = FALSE, ...) standardGeneric("rowCumsums"), package = "timeSeries") setGeneric("series", function(x) standardGeneric("series"), package = "timeSeries") setGeneric("series<-", function(x, value) standardGeneric("series<-"), package = "timeSeries") setGeneric("coredata", function(x) standardGeneric("coredata"), package = "timeSeries") setGeneric("coredata<-", function(x, value) standardGeneric("coredata<-"), package = "timeSeries") ## setGeneric("index", function(x, ...) ## standardGeneric("index"), package = "timeSeries") ## setGeneric("index<-", function(x, value) ## standardGeneric("index<-"), package = "timeSeries") setGeneric("outlier", function(x, sd = 5, complement = TRUE, ...) standardGeneric("outlier")) setGeneric("timeSeries", function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) standardGeneric("timeSeries")) setGeneric("colCumsums", function(x, na.rm = FALSE, ...) standardGeneric("colCumsums")) setGeneric("colCummaxs", function(x, na.rm = FALSE, ...) standardGeneric("colCummaxs")) setGeneric("colCummins", function(x, na.rm = FALSE, ...) standardGeneric("colCummins")) setGeneric("colCumprods", function(x, na.rm = FALSE, ...) standardGeneric("colCumprods")) setGeneric("colCumreturns", function(x, method = c("geometric", "simple"), na.rm = FALSE, ...) standardGeneric("colCumreturns")) ################################################################################ timeSeries/R/timeSeries-isRegular.R0000644000176000001440000000336511545076570017024 0ustar ripleyusers # This R package is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This R package 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this R package; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ # FUNCTION: DESCRIPTION: # isDaily,timeSeries-method Tests if a time series is a daily series # isMonthly,timeSeries-method Tests if a time series is a monthly series # isQuarterly,timeSeries-method Tests if a time series is a quarterly series # isRegular,timeSeries-method Tests if a time series is a regular series # frequency,timeSeries-method Returns the frequency of a regular time series ################################################################################ setMethod("isDaily", "timeSeries", function(x) callGeneric(time(x))) setMethod("isQuarterly", "timeSeries", function(x) callGeneric(time(x))) setMethod("isMonthly", "timeSeries", function(x) callGeneric(time(x))) setMethod("isRegular", "timeSeries", function(x) callGeneric(time(x))) setMethod("frequency", "timeSeries", function(x, ...) callGeneric(time(x), ...)) ################################################################################ timeSeries/R/data-examples.R0000644000176000001440000000000011545076570015464 0ustar ripleyuserstimeSeries/R/base-scale.R0000644000176000001440000000311312407026706014740 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # scale,timeSeries Centers and/or scales a 'timeSeries' object ################################################################################ .scale.timeSeries <- function(x, center = TRUE, scale = TRUE) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Centers and/or scales a 'timeSeries' object. # Arguments: # FUNCTION: # Scale: setDataPart(x, scale(x = getDataPart(x), center = center, scale = scale)) } setMethod("scale", "timeSeries", function(x, center = TRUE, scale = TRUE) .scale.timeSeries(x, center = center, scale = scale)) # until UseMethod dispatches S4 methods in 'base' functions scale.timeSeries <- function (x, center = TRUE, scale = TRUE) .scale.timeSeries(x, center = center, scale = scale) ################################################################################ timeSeries/R/methods-show.R0000644000176000001440000001162611414332035015362 0ustar ripleyusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # show,timeSeries Prints a 'timeSeries' object # print,timeSeries Prints a 'timeSeries' object # .print.timeSeries Called by function print,timeSerie ################################################################################ setMethod("show", "timeSeries", function(object) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Print method for an S4 object of class "timeSeries" # FUNCTION: # Check records to get printed: maxRmetrics <- as.numeric(getRmetricsOptions("max.print")) maxR <- as.numeric(getOption("max.print")) maxR <- floor(maxR / (NCOL(object) + NCOL(object@recordIDs))) max <- min(na.omit(c(maxRmetrics, maxR, Inf))) #-> Inf to cast case when maxRmetrics and maxR are NULL if (ptest <- ((omitted <- NROW(object) - max) > 0)) object <- object[seq.int(max),] data <- as(object, "matrix") recordIDs <- object@recordIDs FinCenter <- finCenter(object) # Series: cat(FinCenter, "\n", sep = "") if (prod(dim(recordIDs)) & (nrow(data) == NROW(recordIDs))) { dataIDs <- as.matrix(recordIDs) colnames(dataIDs) <- paste(colnames(dataIDs), "*", sep = "") #-> use format(data) to have same number of digits when timeSeries # is printed without @recordIDs print(cbind(format(data), dataIDs), quote = FALSE, right = TRUE) } else { print(data, quote = FALSE) #-> to be consistent with @recordIDs print } # print message if (ptest) cat(gettextf("...\n [ reached getRmetricsOption('max.print') | getOption('max.print') -- omitted %i rows ]]\n", omitted)) # Return Value: invisible(NULL) # as specified in ?show } ) # ------------------------------------------------------------------------------ .print.timeSeries <- function(x, FinCenter = NULL, format = NULL, style = c("tS", "h", "ts"), by = c("month", "quarter"), ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Allows for horizontal and ts like print output. # Arguments: # x - an object of class timeSeries # FinCenter - print with time stamps according to FinCenter # format - use specified format for printing # style - a character value specifying how to print: # "tS" Rmetrics' default vertical print style # "h" horizontal print style, # "ts" R's base style for regular time series # by - specifies the period for a regular time serie, # note only active for style="ts". # Example: # x = timeSeries(); print(x, format = "%d %b %Y"); x # FUNCTION: # Change Financial Center: if (!is.null(FinCenter)) finCenter(x) <- FinCenter # Match Arguments: style = match.arg(style) by = match.arg(by) # Change Format: if (is.null(format)) { charvec = rownames(x) } else { ans = timeDate(charvec = rownames(x), zone = "GMT", FinCenter = finCenter(x)) if (format == "%Q") { Quarters = rep(paste("Q", 1:4, sep = ""), each = 3) Y = atoms(ans)[, 1] Q = Quarters[atoms(ans)[, 2]] charvec = paste(Y, Q) } else { charvec = format(ans, format) } } # Styles: if (style == "tS") { cat(finCenter(x), "\n") X <- getDataPart(x) rownames(X) = charvec print(X) } else if (style == "h") { stopifnot(isUnivariate(x)) # print(as.vector(x)) ans = as.matrix(x)[,1] names(ans) = charvec print(ans) } else if (style == "ts") { freq = c(month = 12, quarter = 4) start(x) start = unlist(atoms(start(x))) end = unlist(atoms(end(x))) ts = ts(as.vector(x), start[1:2], end[1:2], freq[by]) print(ts) } # Return Value: invisible(x) } # ------------------------------------------------------------------------------ setMethod("print", "timeSeries", .print.timeSeries) ################################################################################ timeSeries/MD50000644000176000001440000002716513612625323012741 0ustar ripleyusers655dcc268ec612659050ace08950239c *ChangeLog 28597f3e94a234edce497511c0d706bb *DESCRIPTION 6ab386909ab2d2628960456511d83d51 *NAMESPACE 7417a25041ce9a1531aa2dd338eba8fe *R/AllClass.R 527aae7078f17503b2cdecadb9f425a3 *R/AllGeneric.R 347cdf20d4b2289ee4e0d28422729462 *R/aaa-Deprecated.R 7f05b9160586788d7769cd477f37bbb7 *R/aaa-utils.R 1ac4eb24b93929cd2649cb0afe1982a5 *R/base-apply.R 8880500f095c7691466346c4d90420f2 *R/base-applySeries.R 968c421f42d0ceb9992dda28dbb92d2c *R/base-attach.R 63c172b91f075db5ff84e56310074ac0 *R/base-cbind.R 5d65fb056c9343690527697a20a7dc6e *R/base-diff.R f7bfa27eb8ad29fb4833629df4cb2db3 *R/base-dim.R cc83c20cec8f9f513caa7382f9b6ec58 *R/base-merge.R 6ed798fb2f8a96ddca7221d2efc6d377 *R/base-rank.R 64d35f5496dc0c4190aed8482d1ab8a3 *R/base-rev.R a4ab768410837ac64ea14dab3f463fe7 *R/base-sample.R 9469dcf517fc0cf345f186de3a21ab52 *R/base-scale.R 317c51b7ef70876cf954798a9aa48927 *R/base-sort.R 3b5d882044aea7a06318630483a58903 *R/base-start.R 668a0499be18f2991b18b43e7e7be9cf *R/base-subsetting.R 787d5636b21ee586692fa57b10271810 *R/base-t.R d41d8cd98f00b204e9800998ecf8427e *R/data-examples.R e38b8155ba182239b14be153ac03f1f7 *R/fin-align.R 35a05ba21a2743468d78e824f64786f0 *R/fin-cumulated.R ee0188b9b207406a9870a19331cfeece *R/fin-daily.R 7927233d883f79c8d7d40930fe6ef2f9 *R/fin-drawdowns.R 29283f111ed012385b7f23844bc9a1b3 *R/fin-durations.R 5d06a2c8bc2f9a895fad418b8705976c *R/fin-monthly.R 5e05b4393f114ed8e32fbb387e4f69e9 *R/fin-periodical.R b7fcc4c21131701e8d0dfd874dbb9bcc *R/fin-returns.R f2dc2572b00b06518008493859833ed3 *R/fin-runlengths.R 5d37cb40e1478469171d33d825395b2e *R/fin-splits.R 2aefc803b5781c629297e053a4e8a791 *R/fin-spreads.R 5dc45f885c86a7205b8d9ebaa8cf7038 *R/fin-turnpoints.R 71580b37ec7a5f795a8fc6aeaa55d4f4 *R/fin-wealth.R c05c98f89b4f32fc376dee43082fd71a *R/methods-as.R 58f5a50dfbf8669c239615e1ccdbf58f *R/methods-comment.R 69108175e36952516e5fe3b75cfc0a25 *R/methods-is.R 1efba2bcd9ba4c471c7c169737d23dd6 *R/methods-mathOps.R b2badf9345a37026c70fb1a0e3013f35 *R/methods-plot.R cdbbc724401b364176385deffbd4b742 *R/methods-plot2.R 313a83baf9d2a2ff221fb09c78bc819e *R/methods-show.R 4e252059ec665d2650267d3fc8b8a098 *R/statistics-colCumsums.R 20cc18c6b8815e6fda5f68be71ba4523 *R/statistics-colSums.R 628cf16ba73fea29c0ab4d0f9ba050ff *R/statistics-orderColnames.R 97d48f32243b61df5214da1acb00006d *R/statistics-orderStatistics.R 4e7187c17a34e389652ea79585e69bd2 *R/statistics-rollMean.R 2127cd77fff199b213284e448c4af346 *R/statistics-rowCumsums.R 0f837efdd75d10bdf5288a57d927b009 *R/statistics-smoothLowess.R 33a1b4c62d31f2c5ce6e5741e653030d *R/stats-aggregate.R 8199839fd45182174f57e337f774685f *R/stats-filter.R 8112f5f7ea44d346b2c57c1e76142516 *R/stats-lag.R 96e4b067a6f6de0b52987775e7dcde48 *R/stats-model.frame.R bdcc5381c257786d9c9b9a1f6605c3c6 *R/stats-na.contiguous.R 01bc7ed0a6c38d466544477bec1ff0d9 *R/stats-na.omit.R 5839ff28a0b1393fcac1da98d0d2eca4 *R/stats-window.R 4a48ebb592e0a9b15969544455c90040 *R/timeSeries-dummy.R b6019c6be24f38b69ca42404d3a48a56 *R/timeSeries-getDataPart.R 56489f9b98c52a583063b3bec3841172 *R/timeSeries-isOHLC.R b6b29df5a4e9370f07e51a740ac84719 *R/timeSeries-isRegular.R 41515d1a8ea45269896af20e17c45cca *R/timeSeries-isUnivariate.R aa6b610c7793a3e0fcaf2ec1aab16d96 *R/timeSeries-readSeries.R 184369cd20ebaf4cc05464ef17aa00f4 *R/timeSeries-signalCounts.R f8e881deb5ac18be0f2ad0f638701f78 *R/timeSeries-slotDocumentation.R 3497ade73292c5dec2652335dd984588 *R/timeSeries-slotFinCenter.R 646b93750c7743c2d8057f6ca0dc4d0a *R/timeSeries-slotSeries.R 28a6e00cdbf5e48b0548239f137b2370 *R/timeSeries-slotTime.R 4918b16308209845926c89ec171d2bd9 *R/timeSeries-slotUnits.R 5dca5b8ed59e58f0890cb60d45110d01 *R/timeSeries.R 4f24ad3daf9dfd14c6f3b3ca847cb0a1 *R/utils-description.R 8c58d4cb0048e1ddaecffe8fa68b8eaa *R/utils-head.R c4d5d58ff1dfb91f1c1db4e742d87c0c *R/utils-old2new.R 2d76dbcbae420743ba74789ec629faac *R/utils-structure.R e83fb0c03a5b5909b6be7103e364ec85 *R/zzz.R b27c91bdc41c37985d6d1826e5b5f3d4 *build/vignette.rds 08783f26722d600f1d895921a23adb91 *data/LPP2005REC.rda 99535a09b0b8189278aff6d651041d6f *data/MSFT.rda b59874b3fc70b45400dc76a7774bd34c *data/USDCHF.rda 575a9649d181e899167b5b7fd7811c4d *inst/COPYING 29ddc76d19a7435c4101fdbd13ec0146 *inst/COPYRIGHTS df11bf613071e8b06eaeeccab8e9faac *inst/README 68b329da9893e34099c7d8ad5cb9c940 *inst/THANKS 26f1e7c7b1bfa86789532fed789ad211 *inst/doc/timeSeriesPlot.R 618f03bbb6cb368076660795995056a9 *inst/doc/timeSeriesPlot.Rnw 289498d99f5b91a9675c9f0ee3be32ef *inst/doc/timeSeriesPlot.pdf b29c7222e33395ee90566ab95a9ac277 *inst/doc/timeSeriesRefCard.pdf 00240e3af8ce216961a315a1c0dbeb79 *inst/extensionsTests/aggregateWrappers.R aff0877ae746813721c68f5dce737e5f *inst/extensionsTests/alignWrappers.R 3c5f9513a1dd434ad7681ce52c25496a *inst/extensionsTests/attributesExtension.R 30e3c046e97879e7293ce8cf5397b165 *inst/extensionsTests/chicPlots.R df134f2efe48f0a98c3728ffa6227404 *inst/extensionsTests/endpointsWrappers.R 6ff348d414cad9dba24940f24d066584 *inst/extensionsTests/xtsWrappers.R c6df0a8aafc7cfa9f914919f7f043ff3 *inst/unitTests/Makefile 89dc29af114e6a2a3c80a502b4f4c95b *inst/unitTests/runTests.R 63d0f736e1454c6745cb7aad063ef759 *inst/unitTests/runit.NA.R 94ab54bfea1b4edec5a3b5f04167d42b *inst/unitTests/runit.Omit.R 42504a80169f26a6d37ceda28a269139 *inst/unitTests/runit.TimeSeriesClass.R 8e685661d5ae69c3347782f6ce75d9a0 *inst/unitTests/runit.TimeSeriesCoercion.R 849fa2a5ae5a5b1f6d16e8b86ff3cac5 *inst/unitTests/runit.TimeSeriesData.R 90b7820b07832910daf1afd5dc224856 *inst/unitTests/runit.TimeSeriesPositions.R c132373dac907f3ce1ee549d855652d3 *inst/unitTests/runit.aggregate.R 54e1197ea897c2b1fed028f45cf3e1e8 *inst/unitTests/runit.align.R 3bda0d794fe86888602d8f23414f39f2 *inst/unitTests/runit.apply.R eb8242069cc228fb00172b9acfb35cdf *inst/unitTests/runit.as.R f2dee6d70982efbc28ae37bbb8ee57da *inst/unitTests/runit.attach.R f53b7fd9adf885a7a46bc799570cab6e *inst/unitTests/runit.bind.R ec0eb8243b004d056ddd14a21f0f4e60 *inst/unitTests/runit.colCum.R f3fbf0a01f8c829180b87766b5dae26c *inst/unitTests/runit.colStats.R ecf69175edcff5551790c179f11db117 *inst/unitTests/runit.cor.R 7987dfe562590cc70bec48bde41142c0 *inst/unitTests/runit.cumulated.R 21c034e99f1666e27dcee33d785bb2da *inst/unitTests/runit.daily.R ef380731926ca03e283be11bf34e3f32 *inst/unitTests/runit.dim.R ddf81974440ba5c80cb35bbe6ea5213a *inst/unitTests/runit.drawdowns.R 320bf5c925d2f3abedea2da686730107 *inst/unitTests/runit.durations.R 4fd8879fb2feabc9530501e63a8b72d0 *inst/unitTests/runit.lag.R 776e1aa61e6f1a666fddfa4546e59286 *inst/unitTests/runit.mathOps.R efacc4efe053f3255399912767bc127e *inst/unitTests/runit.merge.R e0352cd00443ed64c2a0004bd4fb3fdc *inst/unitTests/runit.methods-plot.R e6868109cc1c537fea76ac57c333740a *inst/unitTests/runit.methods-print.R 3ad927a3804d96a9736216041a9a87e9 *inst/unitTests/runit.methods-summary.R 18fbd863b2c420249df32513d41dad5f *inst/unitTests/runit.model.frame.R 334271359fb9c749a7dfde8f6608defc *inst/unitTests/runit.monthly.R eb124eec56065e3395c63cab251bcf13 *inst/unitTests/runit.na.contiguous.R c3bf679bb5a7bdd5e3b9df1cf1a0d124 *inst/unitTests/runit.order.R d073d9b64074dc094dff6f987c519288 *inst/unitTests/runit.periodical.R 0965a3517f6e21aca3d18841387b1c5b *inst/unitTests/runit.rank.R a49a96a4356e8deae4b44daedab98373 *inst/unitTests/runit.returns.R d8ba4ac6486f022a81ab101ed8e631a3 *inst/unitTests/runit.rowCum.R d33bd4274e713eb2d401b53feb7c9461 *inst/unitTests/runit.signalCounts.R 9960b28a8601cb8f6f849107cfc8fc8d *inst/unitTests/runit.spreads.R ae94687a209d31a2a430a8a72f759483 *inst/unitTests/runit.subset.R 8c98a57d8736b0515851139c13a08036 *inst/unitTests/runit.time.R 31c51655d159665b6391203a329965ea *inst/unitTests/runit.timeSeries.R 6248adf1d0d955fa3e004f0b28f3434a *man/00timeSeries-package.Rd 32d10029eec44fc9a457e2d6173c6bc5 *man/base-apply.Rd d75ae564861660dc81bc084f1653fa9d *man/base-attach.Rd 1048bd46490c6b2029b61c71bc0f7fdd *man/base-cbind.Rd 3d4a2f0bbfc5f506a49efc98cd256b89 *man/base-diff.Rd f195b5a72a03bda73799466c6c6d986e *man/base-dim.Rd 675054910e7ea90e392d3bd42fd1a420 *man/base-merge.Rd b8923b6844ca9ba5901e1b9a0ce9f122 *man/base-rank.Rd cb0ebfd5e54c1c1715018119d8a96dc6 *man/base-rev.Rd 9aff98951a26c78039a0460ac86c0687 *man/base-sample.Rd a116ae421f883f17bf73aaa0c3303d6b *man/base-scale.Rd 746db2b52b316d282b87f043083ded64 *man/base-sort.Rd 38e596e089fa1c5ce2df7976e6325442 *man/base-start.Rd 5e34b654492922dd0e006879cb283499 *man/base-subsetting.Rd 5d755a5286f21705477f5591addffba5 *man/base-t.Rd 4f3e467bf081831366ca1e0369ee4e15 *man/data-examples.Rd 2ad91c6eb4ca3ef8ba0dac8729d6b0e4 *man/fin-align.Rd afeb766429f352178e001e1e7dce3367 *man/fin-cumulated.Rd f6185fc68ae905186ce19f455eef5472 *man/fin-daily.Rd 396272381c50bb673d52b50d2d0a86b5 *man/fin-drawdowns.Rd 853986be1cadef98f9f9d64c314688b2 *man/fin-durations.Rd 91d84c99a62f5748b2b1d62a71d80a3d *man/fin-monthly.Rd 4b5e4dcbd88e4d87a81838bd340c2c2c *man/fin-periodical.Rd 3009ab0b4d87d84b0970a10a3df34019 *man/fin-returns.Rd 574d92bbd158fbea05cbfc80c2c87df6 *man/fin-runlengths.Rd 98d7cd9755dd5d255a7acc9eb2ee3889 *man/fin-splits.Rd 2a708241ccbd40d08bdb759bdba265b3 *man/fin-spreads.Rd daebb82776472c426440dc7c7a948662 *man/fin-turnpoints.Rd 2fc6c1521ba972b814557fe0b370f039 *man/fin-wealth.Rd 0e7b27cb79b3af2a2be74725d445a4cc *man/methods-as.Rd 6a2463fb908d48fb480a29cf245a002e *man/methods-base.Rd 03b5db3608a32b1871bc0e69d59bbb49 *man/methods-comment.Rd 6161d1e313a72c00546838ba1e274bf9 *man/methods-is.Rd 089ec1cb847b6aa57b80e43344297164 *man/methods-mathOps.Rd 2489ac779b0700d07d925510ba68eba1 *man/methods-plot.Rd bbf01aa4dc627329aabdbff94687975a *man/methods-show.Rd da7db95577645a1b362d399bd7bf7c72 *man/methods-stats.Rd 699c2c2f02a41c219fe1e756397d94c2 *man/statistics-colCumsums.Rd c9a1c2942c562105850fa9e469d88b2a *man/statistics-colSums.Rd 458a0c9baf46d3b06a6f25b8b823f159 *man/statistics-orderColnames.Rd 5939d663a63cda2f0cdb1acdab754e63 *man/statistics-orderStatistics.Rd 99d24ae42af6303597243a7a8d1451eb *man/statistics-rollMean.Rd 62060fd02cc11cc9bd9e6fd184ab4289 *man/statistics-rowCumsums.Rd 38c0ba4b39bb0956956eaa853b1ec453 *man/statistics-smoothLowess.Rd 13d4d104113b172cfe9130c5be851726 *man/stats-aggregate.Rd 09de66ce87e0629c1e0ac32699f242c9 *man/stats-filter.Rd 8d21291071325c69f9db662d8feb56f1 *man/stats-lag.Rd bd37ef634c58f37aae81f7c4b19619f6 *man/stats-model.frame.Rd 24ce47db3079e5392c6ef2f914b15d5b *man/stats-na.contiguous.Rd 924e06894ddce09d54c55fc5151f02f3 *man/stats-na.omit.Rd 7824f782d2221281ae576823ebce34de *man/stats-window.Rd ecf919bd976dc902a6b1a2b71123aae5 *man/timeSeries-deprecated.Rd 2c7fd99eb4af75bf46cd49cb94d0d10a *man/timeSeries-getDataPart.Rd e60dd076effe9e81253ded51a8d32282 *man/timeSeries-isRegular.Rd a78785a2a8c31a4c0c30084e2770364e *man/timeSeries-isUnivariate.Rd b2cb9021ef985bef1204aa12e1ecc914 *man/timeSeries-readSeries.Rd 3d5f21bf399b3010c4a2f78325f67616 *man/timeSeries-slotDocumentation.Rd 74c0786807844404c83a40ae25ab5567 *man/timeSeries-slotFinCenter.Rd 63912e32f8774fbe52cf1cfd685be588 *man/timeSeries-slotSeries.Rd 2efc541505e045d7d7b08a46479a7efd *man/timeSeries-slotTime.Rd 319d4945562adb5f0d6934000ecb44b8 *man/timeSeries-slotUnits.Rd e7760dc21862c24169967598dd640174 *man/timeSeries.Rd 49800352c3d12eb47acf6bc69a7cb711 *man/utils-description.Rd 9dc5189dda18ea9a45ee9742746d17e6 *man/utils-structure.Rd 2f5fc3b43ee968e0dfdcf69c1e84424e *tests/doRUnit.R d9fbe377cad1b0d2f684d3b71f324966 *tests/msft.dat.csv e0082956f0c082294af55dff827fd17a *vignettes/characterTableFig.pdf c1f351531201d1c5a99319debe31a159 *vignettes/colorPalettes1Fig.pdf 96410e04a3f1eac571ec2de10f40c901 *vignettes/colorPalettes2Fig.pdf 61bf91e727aa32ae300c067888d136e1 *vignettes/colorTableFig.pdf efb5d1677a5e3f01559bf066ec86cc1a *vignettes/colorwheel.pdf 3c2c1851329140ae3c375a6da33bd27c *vignettes/symbolTableFig.pdf 618f03bbb6cb368076660795995056a9 *vignettes/timeSeriesPlot.Rnw timeSeries/inst/0000755000176000001440000000000013612573075013401 5ustar ripleyuserstimeSeries/inst/README0000644000176000001440000000012011023731525014240 0ustar ripleyusersintroduction of timeSeries package in the Rmetrics suite after svn revision 3319timeSeries/inst/THANKS0000644000176000001440000000000111023731525014271 0ustar ripleyusers timeSeries/inst/doc/0000755000176000001440000000000013612573121014136 5ustar ripleyuserstimeSeries/inst/doc/timeSeriesPlot.R0000644000176000001440000006142213612573121017236 0ustar ripleyusers### R code from vignette source 'timeSeriesPlot.Rnw' ################################################### ### code chunk number 1: environment ################################################### Sys.setlocale("LC_ALL", "C") ################################################### ### code chunk number 2: library ################################################### require(timeSeries) require(xts) require(PerformanceAnalytics) require(fTrading) tS1 <- 100 * cumulated(LPP2005REC[, 1]) # SBI (univariate) tS2 <- 100 * cumulated(LPP2005REC[, 1:2]) # SBI & SPI (bivariate) tS3 <- 100 * cumulated(LPP2005REC[, 1:3]) # SBI, SPI, SWIIT (Swiss Market) tS6 <- 100 * cumulated(LPP2005REC[, 1:6]) # Swiss and Foreign Market Indexes ################################################### ### code chunk number 3: univariateSingle ################################################### par(mfrow=c(1, 1)) plot(tS1) ################################################### ### code chunk number 4: univariateSinglePlot ################################################### par(mfrow=c(1, 1)) plot(tS1) ################################################### ### code chunk number 5: univariateSingle2 ################################################### require(PerformanceAnalytics) par(mfrow=c(3, 1)) xts::plot.xts(as.xts(tS1)) PerformanceAnalytics::chart.TimeSeries(as.xts(tS1)) plot(tS1) ################################################### ### code chunk number 6: univariateSingle2Plot ################################################### require(PerformanceAnalytics) par(mfrow=c(3, 1)) xts::plot.xts(as.xts(tS1)) PerformanceAnalytics::chart.TimeSeries(as.xts(tS1)) plot(tS1) ################################################### ### code chunk number 7: multivariateSingle ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="s") ################################################### ### code chunk number 8: multivariateSinglePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="s") ################################################### ### code chunk number 9: multivariateSingle2 ################################################### par(mfrow=c(2, 1)) require(PerformanceAnalytics) PerformanceAnalytics::chart.TimeSeries(as.xts(tS3)) plot(tS3, plot.type="s") ################################################### ### code chunk number 10: multivariateSingle2Plot ################################################### par(mfrow=c(2, 1)) require(PerformanceAnalytics) PerformanceAnalytics::chart.TimeSeries(as.xts(tS3)) plot(tS3, plot.type="s") ################################################### ### code chunk number 11: oneColMultiple ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m") ################################################### ### code chunk number 12: oneColMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m") ################################################### ### code chunk number 13: twoColMultiple ################################################### par(mfrow=c(1, 1)) plot(tS6, plot.type="m") ################################################### ### code chunk number 14: twoColMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS6, plot.type="m") ################################################### ### code chunk number 15: gapMultiple ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", mar=c(gap=0.3, 5.1, gap=0.3, 2.1)) ################################################### ### code chunk number 16: gapMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", mar=c(gap=0.3, 5.1, gap=0.3, 2.1)) ################################################### ### code chunk number 17: combineSingle ################################################### par(mfrow=c(2, 1)) par(mar = c(bottom=1.5, 5.1, top=4, 2.1)) plot(tS2[, 1]) par(mar = c(bottom=4, 5.1, top=1.5, 2.1)) plot(tS2[, 2]) ################################################### ### code chunk number 18: combineSinglePlot ################################################### par(mfrow=c(2, 1)) par(mar = c(bottom=1.5, 5.1, top=4, 2.1)) plot(tS2[, 1]) par(mar = c(bottom=4, 5.1, top=1.5, 2.1)) plot(tS2[, 2]) ################################################### ### code chunk number 19: layoutSingle ################################################### nf <- layout(mat=matrix(c(1, 1, 2, 3), byrow = TRUE, nrow=2)) par(mar = c(bottom=2, 5.1, top=3, 2.1)) plot(tS3[, 1]) par(mar = c(bottom=3, 5.1, top=2, 1.1)) plot(tS3[, 2]) par(mar = c(bottom=3, 4.1, top=2, 2.1)) plot(tS3[, 3]) ################################################### ### code chunk number 20: layoutSinglePlot ################################################### nf <- layout(mat=matrix(c(1, 1, 2, 3), byrow = TRUE, nrow=2)) par(mar = c(bottom=2, 5.1, top=3, 2.1)) plot(tS3[, 1]) par(mar = c(bottom=3, 5.1, top=2, 1.1)) plot(tS3[, 2]) par(mar = c(bottom=3, 4.1, top=2, 2.1)) plot(tS3[, 3]) ################################################### ### code chunk number 21: layout2Single ################################################### nf <- layout(mat=matrix(c(1, 1, 2, 3), byrow=TRUE, nrow=2), heights=c(2.5,1)) par(mar = c(bottom=2, 5.1, top=3, 2.1)) plot(tS3[, 1]) par(mar = c(bottom=3, 5.1, top=1.5, 1.1)) plot(tS3[, 2]) par(mar = c(bottom=3, 4.1, top=1.5, 2.1)) plot(tS3[, 3]) ################################################### ### code chunk number 22: layout2SinglePlot ################################################### nf <- layout(mat=matrix(c(1, 1, 2, 3), byrow=TRUE, nrow=2), heights=c(2.5,1)) par(mar = c(bottom=2, 5.1, top=3, 2.1)) plot(tS3[, 1]) par(mar = c(bottom=3, 5.1, top=1.5, 1.1)) plot(tS3[, 2]) par(mar = c(bottom=3, 4.1, top=1.5, 2.1)) plot(tS3[, 3]) ################################################### ### code chunk number 23: scatter ################################################### par(mfrow=c(1,1)) plot(tS2[, 1], tS2[, 2]) ################################################### ### code chunk number 24: scatterPlot ################################################### par(mfrow=c(1,1)) plot(tS2[, 1], tS2[, 2]) ################################################### ### code chunk number 25: pretty ################################################### par(mfcol = c(2, 1)) plot(tS1, at = "pretty") plot(tS1, at = "chic") ################################################### ### code chunk number 26: prettyPlot ################################################### par(mfcol = c(2, 1)) plot(tS1, at = "pretty") plot(tS1, at = "chic") ################################################### ### code chunk number 27: chicUnivariateSingle ################################################### par(mfcol=c(2, 1)) plot(tS3, plot.type="s", at="pretty") plot(tS3, plot.type="s", at="chic") ################################################### ### code chunk number 28: chicUnivariateSinglePlot ################################################### par(mfcol=c(2, 1)) plot(tS3, plot.type="s", at="pretty") plot(tS3, plot.type="s", at="chic") ################################################### ### code chunk number 29: minorTicks ################################################### par(mfrow=c(3, 1)) plot(tS1, minor.ticks="day", at="pretty") plot(tS1, minor.ticks="week", at="pretty") plot(tS1, minor.ticks="month", at="pretty") ################################################### ### code chunk number 30: minorTicksPlot ################################################### par(mfrow=c(3, 1)) plot(tS1, minor.ticks="day", at="pretty") plot(tS1, minor.ticks="week", at="pretty") plot(tS1, minor.ticks="month", at="pretty") ################################################### ### code chunk number 31: chicOneColMultiple ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", at="pretty") ################################################### ### code chunk number 32: chicOneColMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", at="pretty") ################################################### ### code chunk number 33: chicTwoColMultiple ################################################### par(mfrow=c(1, 1)) plot(tS6, plot.type="m", at="chic") ################################################### ### code chunk number 34: chicTwoColMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS6, plot.type="m", at="chic") ################################################### ### code chunk number 35: tailoredAxis ################################################### par(mfrow=c(2, 1)) at <- paste0("200", c("6-01", "6-04", "6-07", "6-10", "7-01", "7-04"), "-01") plot(tS3, plot.type="s", format="%B\n%Y", at=at) plot(tS3, plot.type="s", format="%b/%y", at=at) ################################################### ### code chunk number 36: tailoredAxisPlot ################################################### par(mfrow=c(2, 1)) at <- paste0("200", c("6-01", "6-04", "6-07", "6-10", "7-01", "7-04"), "-01") plot(tS3, plot.type="s", format="%B\n%Y", at=at) plot(tS3, plot.type="s", format="%b/%y", at=at) ################################################### ### code chunk number 37: annSingle ################################################### par(mfrow=c(2, 2)) plot(tS1, ann=FALSE) plot(tS3, plot.type="s", ann=FALSE, at="pretty") plot(tS6, plot.type="s", ann=FALSE, at="pretty") ################################################### ### code chunk number 38: annSinglePlot ################################################### par(mfrow=c(2, 2)) plot(tS1, ann=FALSE) plot(tS3, plot.type="s", ann=FALSE, at="pretty") plot(tS6, plot.type="s", ann=FALSE, at="pretty") ################################################### ### code chunk number 39: titleSingle ################################################### par(mfrow=c(2, 2)) plot(tS1); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index", xlab = "Date") plot(tS6, plot.type="s"); title(main = "Index", xlab = "Date") ################################################### ### code chunk number 40: titleSinglePlot ################################################### par(mfrow=c(2, 2)) plot(tS1); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index", xlab = "Date") plot(tS6, plot.type="s"); title(main = "Index", xlab = "Date") ################################################### ### code chunk number 41: axisFontSize ################################################### par(mfrow=c(3, 1)) plot(tS3, at="chic", plot.type="s", cex.axis=0.75) plot(tS3, at="chic", plot.type="s", cex.axis=1.00) plot(tS3, at="chic", plot.type="s", cex.axis=1.25) ################################################### ### code chunk number 42: axisFontSizePlot ################################################### par(mfrow=c(3, 1)) plot(tS3, at="chic", plot.type="s", cex.axis=0.75) plot(tS3, at="chic", plot.type="s", cex.axis=1.00) plot(tS3, at="chic", plot.type="s", cex.axis=1.25) ################################################### ### code chunk number 43: flipAxisOne ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", yax.flip = TRUE) ################################################### ### code chunk number 44: flipAxisOnePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", yax.flip = TRUE) ################################################### ### code chunk number 45: typeMultiple ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", type=c("l", "p", "h"), at="pretty") ################################################### ### code chunk number 46: typeMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", type=c("l", "p", "h"), at="pretty") ################################################### ### code chunk number 47: colorNamesMultiple ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=c("blue", "orange", "darkgreen")) ################################################### ### code chunk number 48: colorNamesMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=c("blue", "orange", "darkgreen")) ################################################### ### code chunk number 49: palettesMultiple ################################################### par(mfrow=c(1, 1)) plot(tS6, plot.type="s", col=heat.colors(n=6, alpha = 1), at="chic", format = "%B\n%Y") ################################################### ### code chunk number 50: palettesMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS6, plot.type="s", col=heat.colors(n=6, alpha = 1), at="chic", format = "%B\n%Y") ################################################### ### code chunk number 51: ltyMultiple ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=1, lty=1:3, at="chic") ################################################### ### code chunk number 52: ltyMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=1, lty=1:3, at="chic") ################################################### ### code chunk number 53: lwdMultiple ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=1, lwd=3:1, at="chic") ################################################### ### code chunk number 54: lwdMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=1, lwd=3:1, at="chic") ################################################### ### code chunk number 55: symbolsSizeMultiple ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="s", type="p", col=1:3, pch=21:23, cex.pch=c(0.2, 0.2, 0.2), at="pretty") ################################################### ### code chunk number 56: symbolsSizeMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="s", type="p", col=1:3, pch=21:23, cex.pch=c(0.2, 0.2, 0.2), at="pretty") ################################################### ### code chunk number 57: gridSingle ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="s", grid=FALSE) ################################################### ### code chunk number 58: gridSinglePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="s", grid=FALSE) ################################################### ### code chunk number 59: noBoxSingle ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="s", frame.plot=FALSE, grid=FALSE) box() box(bty = "7", col = "white") # boxL grid(NA, NULL, col = "darkgrey") # hgrid ################################################### ### code chunk number 60: gridSinglePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="s", grid=FALSE) ################################################### ### code chunk number 61: horizMultiple ################################################### par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, col=col) abline(h=0, col = "brown", lwd=2)} plot(returns(tS3), plot.type="m", col = .colorwheelPalette(3), panel=lines2, at="pretty") ################################################### ### code chunk number 62: horizMultiplePlot ################################################### par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, col=col) abline(h=0, col = "brown", lwd=2)} plot(returns(tS3), plot.type="m", col = .colorwheelPalette(3), panel=lines2, at="pretty") ################################################### ### code chunk number 63: rugMultiple ################################################### par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, type="h", col=col) rug(Y, side=4, col="steelblue") } plot(returns(tS6), plot.type="m", col = .colorwheelPalette(6), panel=lines2, at="pretty") ################################################### ### code chunk number 64: rugMultiplePlot ################################################### par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, type="h", col=col) rug(Y, side=4, col="steelblue") } plot(returns(tS6), plot.type="m", col = .colorwheelPalette(6), panel=lines2, at="pretty") ################################################### ### code chunk number 65: emaMultiple ################################################### par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, type="l", col=col) lines(x=X, y=emaTA(Y), col="black") } plot(tS3, plot.type="m", col = .colorwheelPalette(3), panel=lines2, grid=TRUE, at="pretty") ################################################### ### code chunk number 66: emaMultiplePlot ################################################### par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, type="l", col=col) lines(x=X, y=emaTA(Y), col="black") } plot(tS3, plot.type="m", col = .colorwheelPalette(3), panel=lines2, grid=TRUE, at="pretty") ################################################### ### code chunk number 67: margins ################################################### # Plot: # - oma stands for 'Outer Margin Area' # - mar represents the 'figure Margins' # - The default size is c(5,4,4,2) + 0.1 # - The axes tick marks will go in the first lines par(mfrow=c(1, 1)) par(oma=c(3,3,3,3)) # all sides have 3 lines of space par(mar=c(5,4,4,2) + 0.1) plot(x=1:10, y=1:10, type="n", xlab="X", ylab="Y") # Add Text tot the Plot Part - red text(5,5, "Plot", col="red", cex=2) text(5,4, "text(5,5, \"Plot\", col=\"red\", cex=2)", col="red", cex=1) box("plot", col="red", lwd=2) # Add text to thebThe Figure Part - grey mtext("Margins", side=3, line=2, cex=1.5, col="grey") mtext("par(mar=c(5,4,4,2) + 0.1)", side=3, line=1, cex=1, col="grey") mtext("Line 0", side=3, line=0, adj=1.0, cex=1, col="grey") mtext(" 1", side=3, line=1, adj=1.0, cex=1, col="grey") mtext("Line 2", side=3, line=2, adj=1.0, cex=1, col="grey") mtext("Line 3", side=3, line=3, adj=1.0, cex=1, col="grey") mtext("Line 0", side=2, line=0, adj=1.0, cex=1, col="grey") mtext("Line 1", side=2, line=1, adj=1.0, cex=1, col="grey") mtext("Line 2", side=2, line=2, adj=1.0, cex=1, col="grey") mtext("Line 3", side=2, line=3, adj=1.0, cex=1, col="grey") box("figure", col="grey") # The title will fit in the third line on the top of the graph. title("Ttitle - Third Line") # Note 'outer=TRUE' moves us from the figure to the outer margins. mtext("Outer Margin Area", side=1, line=1, cex=1.8, col="brown", outer=TRUE) mtext("par(oma=c(3,3,3,3))", side=1, line=2, cex=1, col="orange", outer=TRUE) mtext("Line 0", side=1, line=0, adj=0.0, cex=0.8, col="orange", outer=TRUE) mtext("Line 1", side=1, line=1, adj=0.0, cex=1, col="orange", outer=TRUE) mtext("Line 2", side=1, line=2, adj=0.0, cex=1, col="orange", outer=TRUE) box("outer", col="orange") ################################################### ### code chunk number 68: marginsPlot ################################################### # Plot: # - oma stands for 'Outer Margin Area' # - mar represents the 'figure Margins' # - The default size is c(5,4,4,2) + 0.1 # - The axes tick marks will go in the first lines par(mfrow=c(1, 1)) par(oma=c(3,3,3,3)) # all sides have 3 lines of space par(mar=c(5,4,4,2) + 0.1) plot(x=1:10, y=1:10, type="n", xlab="X", ylab="Y") # Add Text tot the Plot Part - red text(5,5, "Plot", col="red", cex=2) text(5,4, "text(5,5, \"Plot\", col=\"red\", cex=2)", col="red", cex=1) box("plot", col="red", lwd=2) # Add text to thebThe Figure Part - grey mtext("Margins", side=3, line=2, cex=1.5, col="grey") mtext("par(mar=c(5,4,4,2) + 0.1)", side=3, line=1, cex=1, col="grey") mtext("Line 0", side=3, line=0, adj=1.0, cex=1, col="grey") mtext(" 1", side=3, line=1, adj=1.0, cex=1, col="grey") mtext("Line 2", side=3, line=2, adj=1.0, cex=1, col="grey") mtext("Line 3", side=3, line=3, adj=1.0, cex=1, col="grey") mtext("Line 0", side=2, line=0, adj=1.0, cex=1, col="grey") mtext("Line 1", side=2, line=1, adj=1.0, cex=1, col="grey") mtext("Line 2", side=2, line=2, adj=1.0, cex=1, col="grey") mtext("Line 3", side=2, line=3, adj=1.0, cex=1, col="grey") box("figure", col="grey") # The title will fit in the third line on the top of the graph. title("Ttitle - Third Line") # Note 'outer=TRUE' moves us from the figure to the outer margins. mtext("Outer Margin Area", side=1, line=1, cex=1.8, col="brown", outer=TRUE) mtext("par(oma=c(3,3,3,3))", side=1, line=2, cex=1, col="orange", outer=TRUE) mtext("Line 0", side=1, line=0, adj=0.0, cex=0.8, col="orange", outer=TRUE) mtext("Line 1", side=1, line=1, adj=0.0, cex=1, col="orange", outer=TRUE) mtext("Line 2", side=1, line=2, adj=0.0, cex=1, col="orange", outer=TRUE) box("outer", col="orange") ################################################### ### code chunk number 69: prettyAppendix ################################################### FORMAT <- tS1@format FORMAT POSITIONS <- pretty(tS1) POSITIONS LABELS <- pretty(tS1) LABELS ################################################### ### code chunk number 70: axTicks ################################################### axTicksByTime <- function (x, ticks.on = "auto", k = 1, labels = TRUE, format.labels = TRUE, ends = TRUE, gt = 2, lt = 30) { if (timeBased(x)) x <- xts(rep(1, length(x)), x) tick.opts <- c("years", "months", "weeks", "days", "hours", "minutes", "seconds") tick.k.opts <- c(10, 5, 2, 1, 6, 1, 1, 1, 4, 2, 1, 30, 15, 1, 1) if (ticks.on %in% tick.opts) { cl <- ticks.on[1] ck <- k } else { tick.opts <- paste(rep(tick.opts, c(4, 2, 1, 1, 3, 3, 1)), tick.k.opts) is <- structure(rep(0, length(tick.opts)), .Names = tick.opts) for (i in 1:length(tick.opts)) { y <- strsplit(tick.opts[i], " ")[[1]] ep <- endpoints(x, y[1], as.numeric(y[2])) is[i] <- length(ep) - 1 if (is[i] > lt) break } nms <- rev(names(is)[which(is > gt & is < lt)])[1] cl <- strsplit(nms, " ")[[1]][1] ck <- as.numeric(strsplit(nms, " ")[[1]][2]) } if (is.null(cl)) ep <- NULL else ep <- endpoints(x, cl, ck) if (ends) ep <- ep + c(rep(1, length(ep) - 1), 0) if (labels) { if (is.logical(format.labels) || is.character(format.labels)) { unix <- ifelse(.Platform$OS.type == "unix", TRUE, FALSE) time.scale <- periodicity(x)$scale fmt <- ifelse(unix, "%n%b%n%Y", "%b %Y") if (time.scale == "weekly" | time.scale == "daily") fmt <- ifelse(unix, "%b %d%n%Y", "%b %d %Y") if (time.scale == "minute" | time.scale == "hourly") fmt <- ifelse(unix, "%b %d%n%H:%M", "%b %d %H:%M") if (time.scale == "seconds") fmt <- ifelse(unix, "%b %d%n%H:%M:%S", "%b %d %H:%M:%S") if (is.character(format.labels)) fmt <- format.labels names(ep) <- format(index(x)[ep], fmt) } else { names(ep) <- as.character(index(x)[ep]) } ep } } ################################################### ### code chunk number 71: axTicks2 ################################################### ticks <- axTicksByTime(as.xts(tS1)) ticks timeSeries/inst/doc/timeSeriesPlot.pdf0000644000176000001440000261151413612573122017614 0ustar ripleyusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 3605 /Filter /FlateDecode /N 83 /First 686 >> stream x[[s~?om'd&7iĵk'D\i/JbޞgAQL0 SE,ʱ^3ǤPTL*G4Z[|di4j&}p)%T0-SV8+Q0U:ɔdZ[4* 0Ueƕ@ U 8Ǭ@-%D̖` +2L䬰O[LL;ў9 F`JNc2F0g@!a^9F3_όa@'cYi@J% ' P`0y= E) 0QZp˂1J]PuJa4Us0k!S~QbSBIsGAaшZy 1[ l0[t);a.@#;a5pك#0]b a.K0 $ DAa0 I l I ~=0c~MA;bU3 b3TLyY1{ xx՜Oǟ2M=?7ɿPB@p0?C>Z7]1(^T~L`2 t2Tp=;̚`Z_6)OMwR7Ji'Wֈ1L4ibkxmS oޑE>C)R5~L=eP5bR͹O5]=}lˈT 4b/c2PyȈ61LN3 qcE&I\3t/ҤR 2|'8iUT:̒a.0732Q=a4ᡁli{O!+Q5\M@H؞~k7$*akIU(5@AeaQOg K($ I5#i NJrDb|5/i@em a.J$ez>n >]ɔ-6Yq+.)s]Rfu2s7|EN攕R^niDMeSrVMΌꔲMeS|n.)sEYoMY;Rږenu$G QfFY{kk<'MpDfD$_(*S7%(y3X6C>i'TfO-2yd2;3.g̒)s§*=tIe[+ UgvYGp{&ӋzU.YF{O߾}GMt< sy#yJ/DFOe 0A_0, .3 q9'qנ!Nvmy8]^GGP111/EG;;U,̏!')/9%?'5?LF1t_*~ g#=Ƽ_1#>%GH\O+xQ4hZ,NϪ/57Ӫ _W)a)F3=*wkhac^=hZE&ϛ<!" b3p7JF%]b>1lVKVIUvMZE#6VwA)?K%z䶏r M1asv.J8J5Qɢ 6 'ǹ %wC;4FݼRq t2XA&Hu2!01w]J<&0%#"R~ZvYa +AiIq?MB&eL..a]MY=k+8yG>Aic R&97;٨?;d_td.e!Jؼlr ˚YrYXO޿KJ;~8Ջ PuʎDmwZ~WҚ%չPQQ5yo/-Eh.(lr+ٖbIμL4eǨ\>tDYD3 V=`L 5%eO }l-~= nD݉GUΣ%e;$ܞ({LYEWb'(!M)؅(ozV)V,6vr$JLpe|WuOKDg鼭=8#KD+ ɔ|k{w)3Qx z tIfHӃWZ(leD;3Jtd*uSܮDR|AXHtO^Qv˨y fΉuQ9-v(׎D ss }wݟl ]t9$Bh%ޱK,nwQ_7n]_CY@or1o(}oİ`H'8W<ƭ,71I1EؔڸC-gɴ^HW÷\ibQiVV;+zVkɦ/ɦ y(⚎{Gc/G;>fMͶ-wO[iR.=b$υ3GwY,]1YXupEբ#504*|2ѐTu:ѦS!}m\>\:a-HzJx;%-e]j.+bHoC6a5m":9=8fqbYqHY &:ɨ:+VĤ͛c;nŚ67X)o 6cOW i9*5ٟmo)}q2ל.ZSy(˞{]qם, nf~a-neO^:xсbiζnqu3WmgFz\?!بJF$E<$3kFܮ.XbӤ 8*B|upa8U#ѬXnoٯ/RTM=OvUBzhɑ xt8=*=$nS u|<ݺ66C9ã FO8tF#{ ,f/r 2'D~iN&4,-IIq'?Z&h{͉[>1r;vQ{.bGê$*vIm0_lOV6z !owSVb!t%-gv vj~)%tޭ&op|hϷUFu\))=xpAGѰm6o;X1ٺ%+-E|W~·!)-öxbRȈq &J `SK~nk53mP]3C1F\xS|His%kM#àxרWҩee*W&=`h8+槧xj<#*! {+3ѝϷyg>mqn_Yv)`Nvmr1z|endstream endobj 85 0 obj << /Subtype /XML /Type /Metadata /Length 1557 >> stream GPL Ghostscript 9.27 2020-01-24T14:51:13+01:00 2020-01-24T14:51:13+01:00 LaTeX with hyperref package endstream endobj 86 0 obj << /Type /ObjStm /Length 1970 /Filter /FlateDecode /N 83 /First 725 >> stream xY]oܶ}c/..7?\āaMn%#.$ID6"&-ſ ѕ 0(r"k0hqYP0ڠW0q#uƱY1$|f#X%DpNjKO!UD$B,d-j X 0o<Z'b2C412 Z!͉9B$f~SgƲ`!1+gCxe&1[I$K?",Uh0 ᕒgcR:a1f,A/\L,@sfpKk<إ !BH|ʆBo6&}7Bj|Z\uV]-f{KM`:p苪^}\ϫZw٦*+Vbl|_VVǧBPoo!b.w=-6ai8[aI98lnZl=_p#}O n/i|8-/&{G´y|8m^=_|!N|8_?y!|!8m^=_#}aڼzF´y!|!_8Uy\zurGg(rZ,vd7G7@,SW|YK VFQޔ)ybo{@iJ?.ݺn_,[W㿔X.аوCZRrҵe$-@JˮR8݆cDZk{O5_\n|=U/KuakY~g(~^3}oUՒ34Bc"8VnxC}tWD;"Wպ!Ⴚ <͡;>oH&mAi-<jYdNجe2 $~Xz\6AA+Z/|'5buGUl*COLgI2O)tM& IAPP&GiCkuc21%lPFa+b2soCFA$ZM 'i.6JO 4 SA,[*ɫ4aZCL%,"mtxn $.c~(5 Et2 HCN:=s$6&[u̚PsYW*iI-Ɇ Q3KgbB;t^F4c0Ea)_|8lCEfgX>!|=R&Ko܄˕6ٶum6mlvByϥx—/jh"> stream xYKF.7 ƏIĉ1cY>PRdUK({Ʊ$f/UU_UW?䖳q+O$mS&S3#ٔ,$ɡ/H0c\(pԫLKC8b"O5a,ʒ`ʄDdLXj&2j8Ih JD -IZ4&e҆To'"IJAhN蘂c $SB&\RfJfeR-SRW "# a3r ʠ!d:!\@LsMZi!H+Vƴ N A5 'MI3N]IÖ$!,3 HȘሄ AR`"Ɍ4T*f4\H$&`1A)I̘*a AY2 "i%M n$䜢(ˬIAY-H '0y A>}Uٹk1W,~>Tݱ?#Ty/ Lm\[ܵ=~΅HK M5vl/\`A~Y_:bb3ylyԤd2&yMofZlJf'Ŧ6qtZl:[6-6}͜-Kfa\PkAi})kQ,\ő؏yZ2vnQ7ˆne_${AV]6m4JDtsAqg]/oLeYuǂG26y%",]s҈nȓ_JHtڥKl!6]!'=Hm”G!瑦۩Q^aR3)*s4DWGtEʪ[kl4{Ęx7.a&q ׶ iy)>yϐ>_W+7HqyTgɆ,M%zK4Ћ}/㨚{Vlu릪@Q{ATXϾ(p;O Ve@Ł O ~$nݸoJZg[`c3隼ɹocu=#v\zۛ@c; kn?RRgDga)Q,:/"]C{Y!LΖ7 Λ-mxՅ=1.%ցi64|ϊQv%]>HY2>r鶾lw^e;v"{ت6:# ]=bhw gX G,A؍E#El]${ 4 4 hΑ< ȕ9s 7ޟ;yq<Uendstream endobj 254 0 obj << /Type /ObjStm /Length 1915 /Filter /FlateDecode /N 80 /First 710 >> stream xY[s6~8v:;dǗLZZbmN)RKQ~ρ(K(/6ARW7[suZ{hs,IK` pqGoP(S`& prs ( P4MkP$9Z@0#!K!H )BGJ5V[MjӔ$-FC!@H͑ D9$ r TDs2(A:1[D>B-U HҊHPI%ۈ֠d'i %;M-hhʁ& F6.W0Z) )JiMY0 ta aOV3!8>U.(6 CGpaDXhc4-FɆ|Q%9%;=HB`E$Y̿`93߽ybWR2T70?0"+D"tW2iZR~}L#؏>$t?+3<Uq%UL \gE޾kbv4s\qpi~zxkdjUa,ߍ.zh6@/m`p6 b[A82x?5W': Ӣqqv0S!6[`GȦ#iz /eRU/(>]Gê~!b@ۗX_dQQ ^92*.C@Q2r?.lʡC^ .ڌ2 0x#݀}Epa~*NLo!&1K$vdq61M ?󢊫;Ad]fZT7 eY`q n[CJ6҃FmuуcYS/}N 0KtkMt&qH:PVqFGmDV4$p@ЪY5e:4GԆ*T}>C3 :ΰ{nYƎ<ާ#fT ʸQh3wkuFض_msfۢ[bX\,w2C!Y>F6QL=Ϩr-f,}G]`x*><`TV.tUll1R켊3#) o5v%pImY3B:k˗|͎\NZ(E4[:la,gu/Ӈϵʟm̵XBu7 `] F'sRywS`jKx; o[ ${nƎ(,MۀJi#W*^q VWmmɦؖ CEb7=],!M/-mo+N؞zw@Š+S;,|ԛ\_~?Dn ,=~wE/`oa|L,lgGF7`8qxnGGX#|MB9Nn@8]2Sc&O̜:-3w:fxo:_ Ԫ]Nۢifj>;ʛNEi_v؁?Afo ~endstream endobj 335 0 obj << /Filter /FlateDecode /Length 6058 >> stream x\[su~WG➔[UyX;q)2Ty%)j -zs0p$1qA4n 1 W^}x%.n_핤_/W.~}- ifm|*~*/2 ;K..߽$7[?,6[1 Z37ZMzB+=߈H;6[haB#୒>=J/&sԌV.%~Mo[btc`BNR2,Z?d/+/vAOWu1:M Z5[`.a7)\.?SO馿,SP=_ `eJz8z}}Cw:=;FyO?l MD(Ht@]$uEra,;=R)ƫZ<ügDH20 vzswC-@QRDIH0#mZ[\a:m!  2h)5niP)y8Ec Nm:|.{_YG7)6H?Mwbn0͛7b+)2!gp xf25;ʠb`!W|0EGXԱkzE\W&> ͂w7e\[!րbMλ)ђ5Rr7;>Y,m8n1&.nKOIl/#;xo.?5 } ȟ&’[9K݆=!G`>Ww( ?O Pq$M]YQ X2 qc Ǥ-M#\%wE,XodDUȧ4bz /;R AnSamq:0.jqJZ%+KJvHfeTһHH_=r@ Ita` $.ތ\6d+ ;`i@g[$ow_[Aȸu'v]Vawtܢu1@=T}qSg@KnXZgVQ=qwf$-4T<&IlKClႍ1ǎPe8ewV$(lɆFPMk=v?[U(gcD;FXGd.)">4kCՖrCB.KT[1Q)Quf]јqiZ;8^H15A(tjYլY[حƸ#o5g|BŇVɅ;hm{mjޡi"{ hA2 V$*fGv2TWTs 6YZ)۽MY-sL&o+WlCCy\ոom#c? DAEى~ɠ|=5YX@BDAK]$VT 7 I1cwBƢH+p wr/[9 + GpP27lYPYEP}aHrW_D"db`Ի+\Thf21Isx4%0-ԇZKKU玓E#}Q iq{Ղ)65q U~qDPq)ueWlѩdF5Es{=Nk돲<9\™v>'0TYC|+agnٰtUFZ5Jұ/19ƩNžr/1w6Pc+-AS_5 um6M a_%/._69 Uqd{:Vr+mDDU9m8Wx`X){rX#_ci-ī^:gyQjÙJ*KxJShJvD+w8Ixz)C֊z h&G4^%i<B[t ?%6'?u,mZ]ױg%1 g;eGP⮔kykĘ\-[)qSZ#Ӵ"S9rP y*, p<@GTYMƃw^[++%:eG6S©" ̧cV6rt\vߧ"'"tH.FX?yܬ%Q2F t\~u۵y*N&pBCs+D<+^"Xa@Y?IYEj6ZN;uz~8FЕRqLIs;>R7iss5lYFzXuVi<[xvOU FDfvLTz)U]~Wu`tۙ _ Z@&T Q,d5yB=!$ 㢉*yq VQw >+$ ͆j^fyHZK~˛b )z"&™ ɧθ*ڙ|O;u::NšHq1qO ڣf1yG?I`JK`X:;U:=CA0zOSehk`Z]lmjE30cGOgRR0[\; Gs8kxtЧ0V,fNBè  {l!!N=4=@$ Vm"A̯P$\0}O:>g'sIrˁIqb)v+_({x'cmM:00ڶ*ΎV8 Z b.KtUs'x4ܪ\l6td>~̨'զfڻ!?ukVv*<Ðahhﰓ7(>fRDC㴤e(NNBWWxM&siV=u8eNl#U5ZbS% 𻮎һ!qz^b 7y*V0ohwLC]4;{@9AY rdUBMNr% evqoEؔ8Q9 ,Sد 0+G{v<ΫTo 1*Rvy/Yװd&D bSO<ЅO`Y,xb%)oKIu@>p.z[ŽcI ٽs1ug,X%F\Sht"EDis[xlqKO@ 4:^] w_XjA)hd'*eLRشⳲO}Qru\z燻1x\ʍڋ:&1UCWz9ri (q]X1G몔QIӿH-4Ϫ=h];0?txFnS=Q@4V(ڄCL`}Zb*%`@deyk Ly1@g~9Q22bR%^f,yw c-}!gw4c,S#8s`C RwD6ޱ]ݬWn}; ,Ay[Fs^ /a+W5a^n4*%j~?C宠 W5D&MBEgrj^#Yo>b8L}l KmeJN)Nタ#x1PD#$lDR&;vfM XDZW%; D]ZsKΩ$Bz @8^tsץڄշ# H<4TgvWhp:?#9⬜A#JлOQ㓩b-}H3n+4bY0+\\e'|oqmΑmNQTVS~g|M/3VvcH5%&7_fT#tjiJU+I΋*$lqQѱ/S] 2#>R860ߵȕ"!ĤP)n}~>JU ϹqQ[PVU[֠2*jD)\@\տ];endstream endobj 336 0 obj << /Filter /FlateDecode /Length 3329 >> stream xZKs3[>ͦ\J+5Ir]Z$?hΐK.t 4g_7Fr#_{q{E?볟duS\npN=FQ6oPʌAn*noϾv';~hJEp> ?.ƪ21N{;gVfx N> %RQ 5.*F+5&Co,#b7 ]4ZFҾ[ pd|_!)&)GB1rĆogGM c ?b5jH{5B8$O %dyHlojka^y?ƛ16FpHZm(V  ߷ G=$fCg$h`mB,S:SkS8/tHS붶j·w cۯ„N"~VlKF5a8&)[ A}z0\Wu[1 ʃ >^f bXo2C{S(N8tPBZ-!;|b6,e;0BhH;Hau:K1F+FY 6A CO0.s #h_S C^'W | u|l1ݍxʀK{֘&lp9^A7MB.W(h ~? &I{X;%k BQOP\<@YjQv,+^Ovsuܵw)%eVtvv-e?Yߐ@ wY-!oH7p*4n.tP.E!L@֤b1Ni۴5+RIl0EOGz\<3J&xnO/ɲNC:]:潁*@Tը,VpRK鲬Zp{kZD5Cu tHʘ1D$I#g0(~&SLU%>Rү:`B1UsiABym8e*,Ȟ L=yXlZ2ܗe Sͺcm5R7.|X[w-lpEZҊ`٨r ] ~Eu^rLrnB -_x@`aieG)d,5Sps`o &4aT1Qeryd< 봞)&\Eo6O"Dycsl^4f3?i+*^?`,CD^Dk" QeULJa}Wz` wY~R5KL*PNc;vb3@KH!ZuMkmmjz!ePRLc5=Ok,Af`NIˡCj`s$M&BA fhyл !Lo+/[0w6qeռvL<ҍ-JY_儰:KXr_ FI2ռ =@[M><-WY@ +qA+ƿFyUv e'ՃdN󹫇5.|X[wi-*|~]gjqq^6nlЗ+bn)YtNN&eq=Nwnڐ.wE{/ޔ"S(/%w4[7t0<-v7񶕴X‹zc|8};F[klz+UC뽧Z({ܙ*/mSo3ad/KЅm $귬hRzL,ve9Z$gT;]dn%I/=|V!>WKo3 JkdS \ԢPc?r.͋ 3F&Y[`ŖOi/-J%*T }+1$hQ&]}v?M߳zib9xI8A'9HyQn8|pTe(j488$A}n PRwS:ITĢѶHW%D;n05Y3W0U4 ~yPIC?T.9"eqϤM2r/s F"@-"Nz?'K 0:23{}i?{V/y +SViȒPJ#;J{I0v~Kdः~0 ]5z6IenvCSCmA4!OtQ]cTb h07c:<_SyE$,nˎ(K,߳?x}QVlҝ,'J0vV-U0g?~޸\Vx=B ?>YucE`wXTJ]l/^U*Osw7e ^jdϞ L}5DW钩`^1u?ӭ])NnZONB"@JH2~z}9Yk8{Ñ4k49l>+W\+abEOǔʣ !O ЮtPˌ)G&3rzST̄.J#\m2{YLQj%&\0gxoLGuӦT[N?hy^,1kUP EgILzskP;z ;:N +\s\zMN<&:/t7}Wߞu/9R3ËRnyW'eYZ=a=OJie[Ư_eFhehh^eII=SF@i*#PA5 K5=b)WaVTҫoQXUy.ӷƸg,U.f!e<#Ƥ#ezyݟcٜendstream endobj 337 0 obj << /Filter /FlateDecode /Length 5404 >> stream x[[o&q}q;p`FXyv)j%ikwu9({=/u6Vrot.~?O_\sD>y }՟|HksT]Y}.ҭ^^5;CXEcK()W߁>ܗ9[eykfj,)n/bk~yvÝykɈԃqy4s;+V+Olktu\OuĞr \={R\Kʐ S |Òxϭ~߆P=n =$X{ԕCoα@r܎9%\[ _Ǝ DuC7ɑʊVeo-?OrŇ壼Wqԇ}z?\Lݷr-d+>3SG~ Ѿ%:Z{˃4w*cMREڠuܽREv2h[ dݧ\WdWsz{}3k$gZUwf'\Xyz<ޏ|v N%g[[*0)x%zߖw9~vy i,$ ] |rz4G2bym1jt/ɏ˕ hOFոJ ~=ew^/dJVQmSΏir* ~&&if0ҫm^%P"|p˳vb oXI«3b\fGXK vcnfNf}&T b]Id܋}[KM8B+9yN|^Zq^Dۻ7Fꨧ JڍKkZ9-(4C7^v;JB=;jUbЇ˫(hJ~͙܄~>}mga:.#'*qIݙ}8:/d@Y`9 1F\]=A)౜=QXu5~Dp͞_S!A:)˧"}<ڒoEZ8HC,@<*^cz5@|foRi\\1 :' Dpk,DǓ' $s_B Hj< Aߐ`V}++ R 2Nd).n":!r#aqßщ '>=p:][Kpx. 1aa*/!ذ@zXsU$M;rI"[Rva}*!H=yH JdePR:e#PDO-SkY0%`B;0M.Hn:;FnH>R9.G5$",HA }ZzSJHª8Eܫ]U4 Wv`%'vYY\RB:p2ieGFކuf@ w#2_.GDn,R G@;!AK :|pY589lH_"{1xWm灓N7eP<3&pj Sx8uQ.h!5 š•6*#;(܎8"I\b.D҈ C(1|{qΚرd"iė k= Lv2 Ns?ȢKn$y/FfE kL̈811wr @ī+:89tmUL~HX8]T"Ug\۳-J=BHpq0NЇfӃ'P1i,~[" Dp7}MH8 +4„z@u"L $K֖0d?CGz"u-x!L"wf.@3刁,Ed|zdVdGU$xMjR#  0NDĐ0\#+S" ]W֥8KL'`ϴ]̧f]Lud K:0j;-?vØZ h`tt TJ̘+deY"۝D #{ֽ$wR%jI%4=S q09D/ BmeC֐d{.:@t@:]NviSTBcH#Zd6$SYp'p kA^xRPվEQ)卬kbȁH7]'#a!E] . HFBi2ΰ-y:fHRzoe M*X% >K^kh4Wݴ$̛,sZي8P@"A@rQdlYHY)yc,j!icæS#44g_^R>Mk˂xkagyV7TZ,j温cuY ;}Ddk JjUAajfL3+ :`SPE%c zg'-UQVS Hs&H,kR*6W1WzKߩڵY&iQB_#7qEKLoTgq4]cq"Kt;<,*cCXJVz'] 3JjR5-S*".N{,8: elՒGukEu+E]sXzZiIM: z'$0et9WR:oˡǠ$2 #a>̠Aîcdy3d?']WXIpRG]oC]z3҂ 0/3I/L0ʳ!ه:>Kp_|C#ӆ@qˇ{hD>5َ4mOATZls< Fڡ-FM%O&3k |!:R9G:x]C֕ ዴ]H{Of.GwmiYI;T,Fc iWj?o7"1'\~>P8$IW&Q ĵ%nYdڑ؂)IS[m'ls{}/%F JXC_CTmeofЊ wϴeYDž4<15tÙ&y1ywQlG͓c.Yۜzhi2Ye]5%@E٦CY߄n0d;t~wg_F }/ƌeo50Χ{7nvՒ\w%?%UR $G\|jY1ۛ5z{,AS~3l_t:ˋ{r-jO\D` NpeĻyߟQ7ӫ*V1[exd@Z7X[56qd^͝ņq/Vu iٿo܅UӳlE=Xa?nqOR?Ugw3F$.l7O[ЧVk4o? xF',?va2mMwv?i>y3>1?0Hkg /ĤI?&Y. .mb.z?.Ao5O>3VL5~shNwmuH~ '?Ύs`?vw=;sMD`go?g?b?+Ecȭ! 8q.䎖>+_^ endstream endobj 338 0 obj << /Filter /FlateDecode /Length 10198 >> stream x}[Ir;S\y 2 0dë!`Z?Pw&9ZhqDde59.0_Sw-W}__%;ϻw ZԻn|W|4ݥ,q~[Wx̖K=>n8JJ~оPqMyܚ'8ڼq#C˷޿)I[m#ykur+wUejG3]>QSon\:ݼv4l\S7_O;qs~u2gjUE =mK!I2gfomqV=N]r>rizck.)R@]8sѝWrNG{'_tMfrU3?s"}h_|z}bud=Rk0h[,c>mc| 퐶'Lyt'йS~x}Ҧ!3{*MX1U"m#x;~yf{t[;9XyۑJUޣ1,blsgTrfMݙɯ{R{2nxxM09?bz1lo]YlcoLg6^(d(=}n]ףQTVsEWq?ncc/Q7N2e9?v=5;#݄f*yf~0tW1'Ln9++\2Aᘪ ׯBF\n{kܵ߶ۮ-SUVٺ[#:qGkr6#UW6ZM<_yCPmn`: ǜey̐,etקyh8vJ7u*R^e9Q5֨$g2\~~~Lׯ^=aZ~ "V'(ǧ~~nUџ7&y9~i?ng5͗o^g*wfeQ=;lwx>R߬Q}QݹVJ[Ӈs>nGUGhE@I$ȭ"6QF5%ԌAPK7;(ڴn* 8,xJNɤm<:W J0CY3Jÿvr`JQGcu &EUR- ^[+ 3(݄hTrHj&*F1r_W+:S*Z(Uyk+jv3)?UUNxZ?3'UJ >IPE0pѩf9Oj8uUC:tEU@ K1z8ةΧt5o/[V_ Fɪgo ; [)W4X(+)mR\cOJ֍)PYs`'וL>UT ( #+!3 s5=pdgVBo8WhQIZ8םұ+z_/؝6 (*MLWUm+(dɪb~L\Q 6p ;\DӽLXEΦbmHMA@SZ2F4ZaLM:"`,íUS׮1mMv@2b>lQR L_Ew nyMm\ F/i0!lLPKAU=_&*4]ݣwrUMDR߄'0I_̋^Rҙ|ol]7Еppة+eݨx@)ŕ&xf;tG h2m{׊o4hI I&(PώUanu JEft[L)C=bmRvv}<2LLD7[)y>ɸ'TWǮ8sMjYm}SʮjY3p37XKʤ )E*ڦL(gb ?}J}ӔO~3i fg7 _O)dp0S5c<%W#U&a;~!!l: 8#GUi^@[dF0^Mu>eɝ6$+2WbCiNq+(푕qg ex/i i wԑ+ldxߗF xDHiyP͉amC0(2:R'2dC'y.~)2(p|HCQׄ'M+ԛm_)ÜM;Q\@Z7G>`rgEz"Ɛ,Zh8cݫmxE Bn#r\ڦ5p%C}r~8E{x8"7'tQ' HBfxZ1ʇJ)TcOjm"2 xv6B?0NGmܨt PD")e!4J&B%"u 8a{0 egUU]ěMO2ge:e^ZRVufRaƖqQP#Sa0)!Wً-G]R AWO S;Q.6/BinU3ȥ(2vfGʠi[Zmj7sڤf/-0Y3:479a}K45-)zt"Kݗ%U@)=EBn}dk@Q1}䩭B 8/+SHeJȀM)!/8ȱ)ezJD)9sGl8ZEΏ^nw 4!3{&`UoH+e,Ϥ\\=zRU#P(4LaG: ;*r+vdٱ :*8Б䲀"BG}b :#GaBĒ9uEGD9K"r@MBjItBrTlrب@6B6 ,ctFwGx6tQCE!qܨ*eqV#р4G04)A[x?*d3 n9wq#$cKčFDgFljn4bh4@`*T9f4eifYv))c;4nN0h@hHrf4f1ߜBh9Dh̙uȬQČr0 ]фGE!9g%= 22k8CBT #%dDH{I uHbN?09B3f ; #FsH[F7 ]Lu:f$2f$G. taFr@$81#3U퐑-z!#@h'^$"o\E:xTBH4(ċ "mP("E! .lhb鎇:\dKrH+ EMEvtHR.63.E!Z$Hnr@kGfh61GF&- Z4R-BH\%"v@zjѳE"8Er#1EIf> ==,:E;"99`6)`QCF"Qp`Q=Exax@'}G_ud_.+Y|6q5cEmsq`E9,R EClhtM%!ٍGE3ıQc~{N.T'\}&\?Z+"0|kjD.и f^.$O\G.pppB,q.P*m:'p\qt"Cf 1"4mCEp1"#C-!VdINJ.:CHyxE "m8cEJp9"g8"X"V$}lbEiV$qH9$cE6+vHˎ & PsHAX/"ۤ,"4cEqH@ĊP2G,";T~E  #i9dP _yIm ")3HTyʡ"żCEuH)h@E#"E_(#CDt *d虈"T$p6rH'P \*qF)tP E";Ő":HT-^8Š"m BEb>J!Ű"A"X3 b†颺"}f8eP vH|u<*;"LW@HP*uH\"]ݑ"iI2()DĬ3"E|<i|c,"[B'o;D"}:@@Y:P$S̏D/2Et\ҁ"%hCHJ;Pq:"[ G(ő"*)UqHx)q!C!ّ"Ht#EY`H8RqtHRB)P ))DYDPQ(IOӡ"j*6C:\$HB{7dF!"|'`dW2Hf$;`*9NH /R"MgxxQo=Nh#- dRUͦ{w2=HAΣYEGsmUGoUGu8ÊBcU%tϪ/UGSg)^u陳H-:$<ϪZUG#KˎkV zV%魪Uu:bq/; ]eGK_eG9ZeGXˎࣤM]KՑ'K%Gˣ#8ա&Ⴃ~9_FƊ#t_v tW`6nL^aĚ#|W!ja/9f/οYpT{zQUpFYQFHb#Qmj5Nɒ(6BTF2#FSXm6T=QnUn/bQM!'QmɥK-Z)j ¥`wRS!$=-d!T"B(4p#xQSGˍc/7JHںXlJ4GQ˞YF8xb8QlX"vPkZ.VQ;Zb^kTW1Z̨5sF#=5/ZF2FuD)rAf(Ql"pFxM hkFJLTS,bQ!(6:b#5jȨb:*6j'FM²D(?bc*6x]W=—r$:ʍVzI0ʍnܨ6BN^nUnXgPFˍv ˍR7Ynd7:]s:+usܑrYɬQ:7?~|㥻hZDDZ{߫ڼxv`i_5Z4t!T&gE9[=}l]2>-U^IoW*vuҐMqO!wMBw4I/{~6A6#SF~(({#deJ9ek<6d(/n8M7.Lv2Oeo&ۻX^_͎ߠ*H^X\<ޅw;˥uvqz/=ٿ?|ۘ0=GrN-j1\ ۝eż߸/fѦĽv-{?> pndn8Jn[ۀU叹o~4o c)Gvחۉ~4F6W`Nu @6^:T|^.lCNhO,uŸm;f \5_1뒥[^~ u]g|Ԕo=cD*Mx}Vk)Pv wyC}7[/~rx6x\)է5 ?cғ/ N;]>l/0kV_M9\yAUa@0.8:/n_t¹?)CuO'n1>o&ቶet%[_`Q*vzcx FVF}mHuoߢ0-2IH-$_1]4}#xK6n__胖D5jjOϿ6I6}%~h2m>vC= xj T ~˾='G}{z]řڵ s?/󻇳ڑ_Y%y.fX +>p҅y4oo_ Е |TP-Ӳ.S SƅS|/\\嵜7>"1!gR=1A=1g|7hG?ʲsg~-Mi^ԇͅ=:W<ޟ ncjUȞzb, t|-{`&?1\cҞvHDI}xk ?_?󵅿[fg>wI͐ydż崼C4sLE7bnEDfeY#tΫ‡-jp3xyOd^`?q%x݁='-a[}-9[5`=~>`{̚bKJy/օvDR;(23[9Mt,.ǹt7MÚ~}k}bj >%*D<^ {Q)g㍽w>5pFvyL^ }?Zdgz3<:[%Һz h O>oD7o"[|T|aAňTYx{Ml}ki6-s+i՟?̄Mo+Om,5:Uh΂x=Ht]bZ{|L)~8W` endstream endobj 339 0 obj << /Filter /FlateDecode /Length 10078 >> stream x[%qO:ۼ_ <4 NUI]jZSۍ!O ~?={|w_fyͫ?/=1gׯti|GH={LͻW^fKýS׏PC~xڊ|+m޾|z}ccJmN?oZC|wآ<9Tz~ sVɜCR̷?\ZyT@ͣC*V]L=5jjmڸ3n4ZEH 57YJ6ERh/t)YbV׽-ĭ_l}xI3ƚRn_­](1}}0F|Z9^o|^;S|001n;w08۫@?۟_s@c6L7_bxϡѡci3tx/i9Ctx>:r-ֽ}$q;yۈ5S̒0ucZbB{c abxX?Ruʉ;f0O(ׁsX(pz_uc>pv0K&[~d!o?B1rʶv-f(9k.s_ݛARX'gG jÛjڸ`:o7sٟlg Sx{Xʍ :y1DbTIט )؄o9|<,EO&-΋Ǿ(wt;٠T4á>[2_춟hoXٸXzEi}2=h뼷~<+gv?fqsK u؇}Pd߽p_<&)Z8ϝh3&ˇտf_l:qjn=obVѷ _RlŋLz>Y~}¿ 5rOǯ^&_']TW?⽥W&ÏH5a#9beum>="+  &]P0x+Jі"|o''TYI0pEH- V1"TMP=LLw)M҂i3bc]&oz1Tdd^ K\2 M@Qa2訮$4%Y$ӴEM9W%JdTlgIj4ufJ~~hĄiDOY.\kǠ0`@1݀ dJu H HhI4X=X!)1w#(/LvI1K6}v Fn ?u符$(;8CPR]20 @qՋ*FVq+3)V{[!ͪs6H S#tQe5jI`?NbxUӸdJ$c=o6Ѹp5wJMuX`!bGS9:$bÜ,h!6;kI$ӃQIHhsई)A17)VfʠM Y (Tx(iC]nwdp4K9OJYeF($=bm cT)L&lUPʮDp03z&h0w7`Œ\t:I38 RP[Bi ̓`= | >BBuxY=M $$Å.\$t9 o}hÂ2}e,:ՑzZw2(KRwXdȷ%LwLM:2gpR2L¥skMeבiP !!>hA@ul.f8VU̍&䬦N՚%(ލXS2끿 S:ɶA'K" 6⁄LCq`*r"2( &}R3FL!@M]¸y ɤAԩXq1hR˚|fp*ML7&Il(Y}a&\}/H :kzxG..f:d߽ cl+)p.iMr4EYquf-BѴ%^qքyŤ()NW v VOm=ܚ[si6Ρ\ksm6 %e(dr.Yc1mũoegMe"u%3xƙii+O pse-JHk:3A?tdUV*SZoS^A?/*ZzT,BJU*Vne*yg&]X`ے0db"i1Y˃MH[kMc/=2PaN٠h n~7sDDk@։bgd 9X92\9&fc/WIsc 78Ր7F.yRa6yCwK۾`ܝ=ڴH4]Mzaf|5Xnuk@b;n.$ãaimAbCpv(Ә>v(2Ʋ!m{ȟ~EsG}m*HYn,u7o>|ZF잣Zͮx6\Z5v0fMڲ܌<gm\en'KТ˽Xpk0<^Fn5{L19b.d}:s/&錙QS< /ә]f惇b̀6}OoYfGKhwĘ6m"r:{۾iYp׹uH4sx^TgfHyӻ(-Tm@bT^ 6P?GlPBRfmj) oLEҥLJzKĐ1ee@O>jJ| =2°YySmKIΨ/>W}vʸ;Sv$Bzr>{Qf3gDMb 2s~{9,9b#íΉ?稙Pփp7aT`~?3W0#F,C#F=/'gĊh|X3('ITZ1_҉3f>1[+C/И#&Јor?A#$aaO:#L'(R4Oipb̭ 3ڊ(J&̈nr 3fٟ0#$)f}܎cv2Dv m&:eIJz0EQF9e]g'eܯe|;e,620ם2BA_jON\MOњ]ҤNOe":S4ʈ2yDQ.TC2^$F⬡U 0 LN̘g^0#X* 3Ì+P\QGrIŒVFۃŒD 3Z|wh(#)*sU|".he8џ(c.\1ޠ.hs9fD.fbt f١ 4njyl1c涑c(2fGuh Wtp̀\`Ac֤@FHfiAc F tИmG% 37 38p'Θ3 ;gqۉ3Bk,ΘZU8c)37(^Vƅ8#ݭ㠑/)ЈF8T4ʘ1*̘njjQYj8e ttQFq 2f.]1JwȘzR! ȟ #b8ds(h3&(Ș:d4]tCA!c&TpȈ<;orIw"13LuXN[B\3YtpƸKwct4W'Ѻ!cf s}b1C=iAƋJɤ #^W5k\ILb#EA@p22fPCm9d4+2ZRܦ\())#VRf Az;dHIؽE+2f> 18d(pȘtdD["itwQ$|\`37AF Fsg8fЌ3FA=¤3Jg0zXO 4c4Khb"GTR1Bׅ1ڪYwƘea<1L^*uĘ8$c2sc6b保1ڊ7cXAcfKhQ0g0K[ 2fV$pqCFu1ڴP|1LGmqT/:dT!c&ЂѼl!I4=Ḥ`n+mAcDq3F VV:rh;p̘S̭Pa*;Dəb:ßY1ss|Ģ[2e4-tVD{NM\b1>n%ʘKT(/Ƚ#EmY8edp>]"H:e^e y2 T)#MnQn8HQ"@&SƐU#F5#m]ͅC@/6茱Ci1„o-h]3I`@b;uX?SW 2>'"b3c+(^IOD-(LA{!Y 28d #o2i)#$^萑)fÂDE:em1ENK^16ZK˺0#iHnjvcFT0c!.XR𭣅yxיcl!IĜ3P$sa._WF3N'!ZyAK:#ЈQ 474A#vsG꠱0N;hDkA#4)HZ<q"(1BJ#=9jNi,]kiLS9iE٣BjKb2F 4v "1иKq)F|rƋ@.h,G ,h4"u'' sԘwHrDjݰhcvE3lQ,49mя1kY131F,> FH7rFz'ͪE3Ѕ4"vL=42o!idf4bZ1K:Wm7idQ#XphcBL>:jpsjܮj Bގ.΅pPc .Ԙ'5QZRj~N)SBF r:_44bB(=phq  51|@i4 5s-#us³ZZ3rtRKaqFH<gĭ|B{}Ss˃3riQEqFκ& (X8jqpFj gDXj]'̈X<0cN3:xfUv(mnjDƁ0bU'f\Py=;shee:b~c ȳ . ]p).\p)$%2Cwqr-Fb%b$7z `LH! Ni78uA9d[;Lܺ+;Lyv8d;L$I:Kil2DĭOGb| mb㖆&nP-B|NJVE'$Lds;/L#N&.:#t2qk't b}“o O658(iIXt>w> Or mLvJjйHJڹ}:%7. qUJ\ PZ[(/%zO5|2,:Ό 5QM 2O2Z|cL$)p:y Nr ^p2ͯNCvs.8?DtŢֲ֢hNID=>ddۢyE΋NfYYd4%F'3SE6.td8֬sYp$weł,dj0YprMr' mO; MdIE&O$="2ٖE&S^Yd M&YFdiIE'OWdI:錶B0(F!s-8xL%aNYםN2rj:(E&UuS$%rH MrɀCB L2%~RV 3&񼇃IV'XQ)M&C\oX`Wa`J3SI"L.2x &C \Gqv).y$RQ(k,.K%p⒧6%y>gxnq0:\Q1_\-0A&P?`j.$pcx/.I&]%ej+pq0驃Kԕct.i2ϹP,.[%Qf D9vqI#et.yKܸ!RgphLwLBr<&.Jl2MZF&h2D:j Mffy?2Eϓ-4il򜲋MZ;0lt٤;E&m 84Ss8P̓u2i/dxrzI-ǿ Kڠp,iC4Q ]:p*,i~o7]uaɭ KڀW[8<%KZ KZ7ӏ[9Fւ!x2$&B%a8?(zӐ%3OIf6ә ugbr#[I RLL23tM_4邩4N$6ܝHZ5:DrN$mrEI@k RgPDҲ y'da H"6CKHfG 4&Hn3^D:_DbVU#"i3@L"e?I6D@2|EL{ HŹEb@rH$ - Hwhc6" i#;4 i@2G ⑘՝LNydf͎$!~`י]5B;|PĀ8d[d$Hϫ"SH;؁$ܢ$j8kEsB_',E$j$ʔ̷ID$/#&[9JEh H.Fu%yzQ~׳=#PvQ?Y\'<ӭ=B.h٠\ VB|Nl.q=MWN>R1Mx2ikv>nxCkуX_K'?)uJRTH7&HYꔜ׿,q|In{cG`l25^" b?]z$7E7߾_$E[ FGHʏ_Ͼ^,^K|" 'z^ ͕#[ =`_<+|+x|W=Rޫ4< p^z^۸$旿\@VN~[g`b.?^K`\^}hT; i~5bgQ o-7VoB3,o>J5 ޛo1Jb~c|:| |G.ٕx?=\M}hP&o?6'4o?lUh_>s,ϩ'X#寞lykCƎC)jǔhK@VV֥HYngk>¥nolN |wϿ`C j?j3/sz6[%j}p[Zp:;D~NꜺ?n_QLN= $XH;Hޯp0ެrt4_p:F'#gLyޗ]`We ~bt2 _~g#??xylҧ{1nn˥}? xs g^v./lDif߸8l~@5ܟuK0Iމ39eO۷^,*:{.юQ|/E1oxTBendstream endobj 340 0 obj << /Filter /FlateDecode /Length 7460 >> stream x\]\q}#'t.΃|;$jYk׻seϴ֫HԐEXN%6=϶,_O/^E9pӋ75B̗S%qzonQcjv)ۖb< o!K#K_ݧ}v咶r5[vՂ×-,o[ /~-\~dztB ?cĒ.kVk?|?- ב5N#焩Uh{r)o!Niw46n5c4}-nObРmiAo٦6نA^v:䰯eoպA$_AC˕̠_e+W֢`1}=ac@^bע!}eyfsMiy }H1Zw_h5jK_Qam$ἸPl>_.,~rיbt=E,=Jp)؊Ȩm[ɵ߫q 7bRDV%Z1N<,'`٫wo\1sƢ\u@8\6p@u{dκ+-7n쾤.*S ,(lϕss(8.|~A!UU=RZ l,ۛӇ黻[&yL0nB,?4#Sf05?<=BD50.B8Ӈ R6fNj{ oݶ5N<!p 7w䯾?Z>UvGoǟſx&!J'u$KO7RZ9}:)ȿ=CN냯>.OoIGxKHFi5Aҥ)RD5~͘SD闘&dRDpF :vzQ: hk &粵Ki4q8 Ή(q.Ң(2ثWAAD 6[69^ fߒDn\0g@9* +K8wC"Θ{F njr˛"nFc'&{QdVrcV4qހ8J|$qms Dƅ ?㋑B~; ,j-2eDNBG'DhDq2)a( ܢ~Edžm͈q! gD#)lB9Cy烼[/!t>P}ث{@΍B6<֫hS"Jg$ Dx;J} sLmWcd, l'p^()1D}RX ;$ keUɘ N74X%(+ 6]2@\v,k LئGᾢ @V$$F2*441њRdAgdҩTY/:9O Q$&A4ֳP*um'v* B+('D%UlE5$ 5D*2C {dd 2F-P@ sdH'%/,̜Ą&sCG5`LTI1M<]Fߒ:/¨h3BƑCmx!HCa/C]_ȆLKFP'*cL'i*9ooEf"VM|J_јorOZ DC?aQ$#;klw.f/<70&wSt e[v$[AQ*O SOLtV1a` ht+Pˮ4}&-149f,Jvss.a}Jm/aN`Ԧ]zgD1MӣQ-!'.ljj16v L<+B3JW@:uCT6*]Akͦh3D`"\P؀5+`aN,@$&[⦴7us1G2(UlKIdY;v[H͒ xD€'rv8}ʀg$(;EhS}쀡1 ;FK/Xd'lCZkLp(&3RQ7dj^-B1p r_ZT @sPQ`ʌ-C L)Y mÔK . DmYaDN (ҩX<}MPBL =f/Bd\Flg}ʹj3l#JpnRZ)&r.R] %3JI(vގ'Q9yOR` (fjP*il d,tv@eK2~7G*B[QaV#/&.p}  =LKAif =ocxvd#%gJ7ƥU`ЄHUʲRp,+8f 0®Pئ^o*S ב6[- uɹamqn>s/Td[/ :fY0D2RO悺E(Xd0VR tD?U-^B vlF)(YJcȶ*܀ QZM)\W&; X:ehl z1#cޱZ8dmViwin y3<$97֒(3; &fa(.H'ȉ='Ny/ҍ^I, s48/!;2EU]0T(=SnX0 FtP`NSY*'xY%X&Ƴ<4:D4 k-Ncռ|Ke=0s 'vWR!9D%•K jqX3=Yߋ {?QHz(W' )0uJB υr֌BԦ)q?JTeפ!jĚVWcP~RswUop}U}.CI5,7˸KZgVm|n3(XNG!tXe[^hV•w C04w.iқg$hE7YZM1eĥՏ~|!VﷀwG Nkn^+i %2&l7Ecni䔫V2Ki?hӧXF Mp#9=ےPױXŮIִ eտōAHVʀMx@@_ VdZβ)CqWOMqDq#7) -78 nlpT+ BߛnBHᢍgÍi#I1&>p#U%8bkpUah\4F^rDu XQ.jbQ0 \+ek%=DMCk/aV+T1P?.(EaQ#c1\j(.p,l1&. čk蕽 J1wD DUv72B .ĵqW@KjVTA[sA\k#0A\P& .8:yVúa~ .( nd@8u7 FT;UtGVA.6pm  Í4bؚl *m Ía8*M,7mqWp0mK`n"%t4mN4 v47nw ͵E:k0D[\$}\\4$y¹cIp)&lphfΤMFSqsA9k^N\X)?saù Ah. [h.fu ?G J¹0қ̭Xr4bh.\ܼ h"]q4b9aGs>V8m6WRsm Gt# 2Z ] ~8YvF8YAf 7隐e5t@߳!ҵE" ҵMrH7WH;9m~tW4Gtѣ9pHm6>Ev16%hz69 L4:khA& YR:2*pவN1pH*F+NÕ]dJ\. w$pA.ts BwpXSԅ w8_"=Xவrpc:Bi&~QqlwQ@vMeM*nb+Unb!bA7B&Юk 5n:{EbSMlю&f:y~X^R&f dMynBS2\g 5ppTUWfMCwQ<w&>8k#pwc͉Z/Aw)J:,]vM ͼQ(݅΋ BCE.+6Bw/ڙr&ހA):)NJV8:+pNXܵEltkg[.NG ](dqvg+t7S4f㽖% NEIJJ\]PAxUntpwHH/a/|9'0_ `4 + ӽcGIX=b4/+Tzo7NU>)k+KҊ$OU+}'媕ui')pYfg_9ĕvrnUaû1 f2=,GEFhajoa\_{zD>A?g?w(wyn#XGyv G7Z1)O|Юu=]GZi){寴R-lATwd2;c=dq@8Ū>z}xힶ WT?um%lڪ;ew4xX@b2즩ڗYsCZb]}K4 팡 8Ejl\v0;՞>53ϏG݂ќ3ڟm|y 0=x${׺m W8Y[tk6~?t[",!xYy-iC]vIendstream endobj 341 0 obj << /Filter /FlateDecode /Length 10519 >> stream x}I%u޾?-_;9 EȶZD;H@$Tݺ0!V8,*3~YOO閟ݫݞݫիzO/=[O9v^KTf\w~\^[ۣ|{&zJMfk]Ȅh\,8u`r<v&SMg^HzݐUoĉ C%y/Acuu< u!`y?݂;RR}D5]OU([kAY|F~˯>W~}/3+tE.uU6|0 3:lh9A5c[xpUYՒ-L}O0(NQlH=;!0H t'PF1chSlz){IںJUwufpGhP;yZ:$>xp(Jev[g"JoS{̫ˆ)7`(o4n78ո)(~h 5S@йˤz+ܸy0fmm7HB#6{wl] H&O%Ch&W:P E:\ZC\ t!L=χ~iMӛ[r+ְuMͭHwMwvR 6ng% 5aZ#7r.40^-n< P`uj)QN^Q+&!@ PUBuڤ*tu F3A|D$J)#Q7?j1D`ս`a*`ybg"Cp:ݥ*v{I`U؝̒ fXl3ڎTHT֟̅TX>4i1ӈ6,OMe`Rbb|hBj+EJyrlc`a]H0x D={yҩx(6a؜ ?Jpߨ4uQQ;y"[r @DMRK]]^p2&S24k)f;JBUh~Aa=HA`+Qq?xz0;?H\8\6Zle +0lQ!-jJv?M u^dw#$M1Ґ|>P6YPf1)aSE2 J&eU 6Th\mतҤjpR1B>=A/B!=끀#E\pQMjz+p )[*g\ C )͈P6 ˬiPu*ZY/POfK#݀[BtGMgrB1wo}N L* E;У>ÚvvƻLj8@Ȋ@fH#De;;\Uޙ",*3tjB< 1휁kV9,7 s[ r|yݿlBofbmW-=ACˑR7P3bLqv?XK@xa2*~*Se\ ሩkEL7"#Ҝ`\/V##ʐ{Y're,(~ QC%Y.1n;X{Z!8ʣVBV1=d.۹ xV=:ny_g\sj&Tqv/`Du_cz`dYuCrlx-39/(*gAAi8Pe2 0XEV JS9/fS\;Q@ bVa_--6zrQBS5.F<hj1zpiҥ.={ֺ)MZ2#)OJg!PGJ56rA?}` A:K"48/b3RgkJܓ Lc0kb1[)EvʵYTdgelaW?#{Li <20(eHUzU"b398 պBYewJ+eG:j]1ә2NXĆ Tt?c*xbz7'5ٙEq1K̒&; #i2(m ڑGlّi~iq&闇ʲ&lgReX0t.9aNHU$ ;2s #cM֫Mk^?ua̧Ur_1P9״?F4咻)vgpObaZE108itAC5˜` eHx*B21+v?қa){ l AMfW#%aoBX9t/1;=_#eº* fky7n,|ͲN٫XJQ8tZ*P}P/ dm)-P4{FNtO# MJ[vl)Ree)v rQT]>0ɥ?s4R+wgSS杞y %q7^=W?u<3$?TQ({w5~N]nV'#[ɬ: l1#gIMovЦi9ef;kg2廓:$/oMVYՓrmX< 5iu*>ťe^?R:SL!IzP7~'Sz&3Yv*0tPS]R>\%ZUWSk. R5]%P6T$jPp /") rU*Q `.Y!,y0P:CRjP&U=(1(yGtv.IRdj|WZh5g@T* =(fNyHu|*hOx%+tP-?r”LZBݢ^4aVJ'7,%OL}|J/` ee:7UZe(vC`'e簦enBZU Y#"$ }Q(b_iLY'·9|ªc6,_ sb0h uАFʊ$[fJp2`@Nֈ҂2i #l0$ZН'ϫVNy$veWI=vy,.l:A֠yͺ26iZ(A{Hy%0CMY)r -ڈP+m&M9jx) e[ i)V'H:5@&B{1lwG:O{RQbDJ5C$|jQ%'eA9qC6 &,̝K&t"2X3fIńn >Z LLryi;17k~2lK1-,{;3dnXkSԀ0|rEi!jLBҺxLZOr^m] $4(5,( Dd"}X?${8=J;%O%u<֔5@lG;\SW9<1-w| l)gG[=nM-uͻj]'t\˥(؂Sz{a& i/P"՘ᡆ< ze.0z3PgwpFr=jiG?o,1i45Ge qk{L`/$RuZp>  c k4D"A1'pl= ʙCY"q^ZD& S ls4#E`_bu;Ծ.Vl j{Da@~:߅1gx 0uMJ!3):~mEO sT!U(yx'))=nC9G\ l3oJ>g>T8,"T שZ-VDJ@9弣Q =Tr9UCe:VU={ddN() RӋ4vZO x⨘ E<1jPLJ6Z +.R==m jll+y"1C" eS{^f܈NUF4Tb7y(dVLخة27"Ss#ぃ̍4%At=#"\,w'j\ExLnZ[s!@~ G^\:6W)YWu]Q19|5B_b$im=A[n2!tT[9" "@)bԵU, HJG {=Pd.8PKgὼzSqBP }W9EhcSn=NVsm|6]ӕBkfH%Y!ۆRݢO<ce5~zTW ,Q@Ad)EFf;I@ jzE̐.]tWݾW}u0>,vsEh2JԹ+Uʽkd^tg4XW{3Qo0;sϴcŀ{*e39B \H(U4x>:g\#QY!a2BY@<(9, 0yԫBWe~ui"C?YCh[o%ɨdqUYx$ĔB4S$bh#dƵ,%YV}Ih@DBÛY^N.ЗS, Yg7cݦ)FmxWv֕irم %fXGfDeC0CRbUǝ)eJ]:;eV:q'+exk%I6!vP^WtMI(=V!DV}i9O*OJqсpüq$Ӵ2I>lk2K"dy:gEq'z擊Fjv*+^ Q"r΍ۡ?%Q.2LjJ^Rp/^8Lh=[GBufχvAoc v`)o`i s PjҒJw>9 8:J>Uq%LWg=~G9R6Sh+x%`rVCǟv u Lg(6j&@}o[Whh>9!Uz{u1]5ebQD3>/1̚qaNgKE̻ qŨ 9{VxQїRwzrq4a|@S[QpaājsV`mvcߊ(fE/͗Wf|P,}(kߏ,%>6C2+X2+8̴3*Me:HeH"lSTU ÑK򠬘yܲ@撯GEc| *5 ˤA|W6`*ښ\P| ª2|^pVs:WyZNo *ql0PfFz%}YB3ܲF9)c^XLHj݅Ŗ#wڶ@9?q_͹YVdN¯0kM/^. UYX2gTT OɫqR6"1++á-d%kD q#EVxhԝc;Y{`سd\osb8ݥ" Ǒ6Y0$V:Byo>2<^zkk^7̌ +rNʋ"Řmv%fX ȾRdt(1_`q#XtKqh'U E(*ey$B2SG3HF`#nU"1SADgqp4ϷP\,1l#D2&1KK [E\ ܖlOCwxlʩBF)5VkYk_\g_-6xhwW>d3%oXfU %X-&(p]V ׷!-Va;U_&S܉R^)S@)ثqqϸTrS/z,?Ыbri9z/Xʼnw{96RՋʥ{;zy.JY&T/>Ayhq{{>wFmQv&AyhEi=%(VzӺ4 CXe?N^ ~weپ®rr=|ցQe{𥍏UI˗K_0~GaKǷRfAz&|49/˹|7|~s&B?9Zu !˗ו?k;3_>|uek{s0xͷGMG97߷!{~O*HΏ3@_~"a~s/ZW\?}^Z"bٮbs&_0#>yBxjB)Ls>wGv|管,gG|4յeʿv]x1Jߤ򷚾|H۲`yL[Q2_ _yT׸?x /ykI2#_endstream endobj 342 0 obj << /Filter /FlateDecode /Length 5107 >> stream x]ˎqW\xUט.a^ ^f^Ph49~Pl>'2n5c3a?O?{:}xrW'מs8|w5~O>p>%ݚz .ڭٹRמ+qp/<w{X[>ߋ C/nڵR3_T|k^˛;>琒R{>G|~J0H >vy6\>{`wW_Ȩ?1vuo_[\<{ b dj{|;0ρh`~yG [ ,tƽЀ 59WJ[n H_弄H4|o_>σ[keyk6B bD;זf). `}Dtl?Q[Ydٯ@?}ޟW=_7;OҎ6'7_G"}ASls׭bW0.G+Tn?=ŕ'#:&(0}P|wAQ :\~z>hx_tg_sJ%ؔ}_4ՅMa|V@i0`DO euR>[n_0e9Ե<6w@o_yiՃb21 Ev=N6w,G<_8 C``˗7k@ErHW<ϡߙa6}ya~j e+lB^aCvB+~6w|y %ǿ/9>GHMNSñ{{OQf BXo;xQhBB0 1~_zd0m9ۃz\p8 l~;pOxG5#Wwɯ v:<_B#iͲ?>O߽2ia5~fwZ~HvE?hϯ}\?}?t~I?\RNueؿ>ڔӧ:=""+s{2H@r@\dx?F'.΢d0z? kkDZb@k9 ה ‘D D؂A̒A y逘 ދAAc_cG  E]#[B==9F_+QMQ31p2`$+a@0YqIT5TEd13E"=2VL䒉"+FIB@ DHe`b);H 5 ,!:T Q qAI5`Hch B;Kxz 3.KmMU2.#?T#L^1RHk>[ѯj1Aj W-uA<"e5^3fZ53)!܃`iPH"=.Uo<9EK@D"eBqg2-JElt{1wQ&Ci- Fxqs'`cDk+hP߅{$ W]Dk‰L$2E⵸H_ &ЫFvb4&ј934{3]CUzMùPJRZ$3=`6y QB5BIb;ࣆ-ܦ@#I3׈oo_4s}u@dpgMNb'܈GJPD@e"IFPSנX`V'+gK!BW#yj_5\:-jFj&ڄ5j%ݐR5I[|l,5R[pF3Yq+jn GD_Zpr 6ɺtv[]kːv:A+llՙ[咂6[-sn&fFdfwpYOIz㾄C `IMDɬ&[yV\2!ᆯDo661Iq8Bx") \@0Q#lǡ0XZ He;!!]yYsE` W"ա!0ݝ8ԙN#R1ܡu acvrfGS7z 0@,a5ˍ!:VP8-!H4E`,S+Z: Hb1D$LU9=om`i$ټX2֠*@3(@sD1d#":FS)mi*Nb'Qd]s(#f.Hu ,e #F13e58«8j,J f'xk Ce4gXG62SvNHuѸ-P]%bvٰL5lۈN9ry1(JV!mզ&#<`r-dBhJ2R5ڙsKsx;]RbwĚƈdSkRn1Κr&c֡B <;)\CLwktpdM"eo8z<Z"Iy>3e80QǪY2 Nc֜d 2OX .WƠYVEM "R0 iг HM)1*3)/ئ:Nvy1;N! D#έBLZbe<'1<G)|:V-x;ϒMgg+YDK)hwm[XZdTU٦DjMk5\EI1,N2 *xwDxZ請tJU/e@R-q(3ZN%ÒsrͪȌnu~)TWQ LpnbE4fjQYÌۋ΅( 4KhBm-ڈhub6T35F-,Ht451HjGĦAx"{XN&ٮMʳwiԅICFwݫA֫34G]5là)DzMw$K,L6%^v1{ogu&{YalK]S' KDM@7I;J-ZTy3vYM5&2q;BmKaxNMg.p Nc%D3r C+EEY6'CTp.hGT۪]̒W93,jokqZ)<2JӢ}fؘZ]f[yO*pqF@gZ 5Ep\Mg9$i\+L- $FlDQUq3q$[uDQy(Y2Lvzb5c{YFOƍlhb0ydbxAyv;*v5W!wq׃pHlLt1ۋ˘80 8]FӇ13bvCۥ7^ ]L,9O.<۽О|lxK^yY8z7A#-1qHl#=o6$/hC\8&(1Ҳ y_8 (,mOK7ʊ]g#&V{^cmNbb=hv{PQ[. >#4,yO-y=`ߓ1/yI5.]~:/Glʷn]v% uя1o"(kZr/b_ލGXz~nO}Ƌ%;qpA6eLqf VY]+5_'ayz,/?> stream xZK/#:$ߏ  ssh>$K#n=rb-,V}UU?oD/7wO4^|gnG3F^6He K7:vK {zBhMVz{߶4)/4Ë4Vݑ&ӎ4QnjK)T8W Unݿp)&)G1Z~B+!ݻ-oQ$(F{J+|viw{6B8G K䤓Ƞ}ι9LIHTi+{!t(Oۥc)ۛ~1؝ ॵӹ1B3sZgBpi,L`4㨊ШtE)L('zFj>@rUqv(, 5·Y v3٪2ae1|QJ3Y\jnlXFr} |'OZ3/!2x OfSPR1PNӛE8U@mPf]ۗw¯BLbd7W-^N+h(Sx:{o`iv -2"9ؒ0^'kv#kfT/.&F;"?A#`}=FrtveRx"Qjcea @86PPWy{,d F F"E ]9.F v.:>yK.6KdL^ϑI, :˦8bym^g.C4)\'lihgA,qU]Vh؆m-^є7unV*n<1W*Oc!%I$EN&AcѠzEJTƇcލ"2V !,^yo_9辕*\#~bKq|APv?TpRsalfuD'|Npu {[ H>>׬UXo]eN_j4ܷuL/vKtLQʔR3JD G%'a1.7U'ՇkݏnPə}k<3hn őZ Qp3 R7,PƧHnQLoaa SnJ!I r$O S^&ЪIr[BᲜ~EYCK,Dj%bwMd9U:d?|x6a2ch3lo=+*̆eL6E߭$#ݶHiy'H=qnx9OLN4e!zjBf!zԱ*؊|f~JFs&m&dN^@)$6tGqws_$ rl @ 3s ~5qcA216T^ZI٬LJyWFQJ}?f*+WE$2Y.5 YE+/[Ao4"^gSfc=fo:zGN: YDr,ckk.* eYRH!)u:قqyp+_v9ż(cgLe p:"C.Y$`ӉԶWq#Jn \H`pKX C@NKrY{ȣ\&3l<%kl,P*TLD̶zCq]/ #N mkJ!5oƪlчN)Rrrc :ӫTPuޅ˟J;Bk~o6+kI`D=syZs43:W Șut(ȦKfW5rՄ8a:U N_toDh'^a9gGSí~ńciԽT_Ӯ6M۾ž*Y*/\/_ًw(\ W Oo\8WLU]Ґ:otˍml]k}ꚛlxΣjl,C^ŵ-`fvy5-t`>V1馵x* H@w4ڧ$?~ @Km*z4M> stream x͝_9r{WMwI6 8āā=r F;;4K3>U*yszίS,E^+t؏~mC}?ë_^l#ힷ-mrW>^znۑ; ׵v{e_unuIkq'yl/^(ȷ_؏|csoYIn?gE+{_y}o)Zwo_<.w-?fɳիқ_Wi=]{ Dn<#$?oUG=J};ٯT]}+}]<-=R9<գVm387U*wUg0_OzxO AkV7|^(.myyϒ҄3 n Yca{vϳܯk{RY@9QւHKqX5ΣXShuTt,뾝k%_gXi7_a%Ր3KjH3hإ׸pB{/ 󋜥J[x?sBnyu^N1UC2SO#-] GZoכn5Im wqC p+}w<ӏ3pO_oy꫿ױXrٴGVۨ ʥ+돥JQ/iga7E}ɛ;Xd< ѲxʬRܴm1/X'e+9ī˥ȃ;]љZV$R$++]%U\k$[6^K؁5GB&>jd+noou@/m\ZY-lWT7uoRfjR[ەEG#[hiU[H6W[{BJ^%,^V,s*]f\emu?\һiìGK<m2Dvi%-J1 aj0Rax3ŽuӮdUo3eqE:γ\ҿU} ]k1i -_@}kCW-wY7~]pqS]nZW9opVZ&[o5Rz>&>_ˬm3`w@Xttӻ Prv#Rh#:[Ej_[g`1U?V+&]\Uyё\HI;t3fJ>lam\;fk;wg$aė6v(w'uLucI>^0۴0(؈/i[oMfv0+m6@QR/;1h}>z6wEޭO6b÷0tPk}Wfn.٥MmDl^ƈ 䙲pCw%S(En%[~9_Gٳk׌ӡD䨌 K9[9pF}1p'Q1Hvw/IBJUR|>ۥjZʇݒ1I/ݕ(Pm7^S mYr+kLKX:}<Kwy"\6qjөd sߕ|4=u=%5-])^xR'ufZ%:*ۅtحl^fR_+*Hso:9gP!{N:Hm(n~O^sR=ޙ-)SoO,[gNjj(M|Gd)!kdS1SBR‡ՔSBRZzu$iOxQma:G{.^%!ܻAV*UJ[Ii<=LUOUS9mj~T) Q炙5IZ]yӅlͼz3 )We.Y|\6[Z؇1PNYjLrV̕rV+ބ} v(㩩TE8uVuƺ|ngrDR"9șd_< R2"]\7бp#ر3[Y.@y:Q"m|ڜvW686S#Z`#bsJC{o[:[%N\'eJ'w7W%V$SδSz󄩞uGjeURwv:M|V?X1tZQ81 V![Ivdkuw1wtWڑnFap)t{wGsIny\:S޳=jjߥa=okѰI_:T%JlރcEVw:iO(.Azܤ'6{>e%`tRSl1&JY՘fK:y=pTu]2pq?rZ J 9 LMOM:;@t.-|^%tp4z{g̈Тd("ٜé7-\>-7:"?Zzim{>j7})NPq0׵U|}R-Eo_߾xOԅw32R=/vJY݋~Bί#cESSOP M3kR:8wAzrI|{!j`50ߏJJϨW^HB- Sވ)LiL!~!髙t_l)SI”-"e SO"e QbEe Q͇+Le‡BE! S )L]w~EiΙe3  ^PE\a2^P-@LT]PPI\a><(W0KLa-^x(DCcrzo u f .S٦0<⟆BQ SWUA<(W* R:Pʋ SmC!JZ0u-i(Dy,P0U<, [La-x(DI{:rkC!}r3C!rx@24)Dy`2P0U/<<(W* Ri(HޝITޡLT^P:YP:4(k+LUI] FϠ" SeC!w7 SқT[fC!ʷF Sn2/ SeLC!7c S2/ SmLC!7r Su)ݦĞi(L(<+L; xߡπrkNC!Jg 2޷ Ĝ{C!Jġz S{C!6" Se|rei(DՍ0u&0sM ƶ# S燇BmGF CAJtP:C S{C!ʶE# S=ԡeۧr^P3Cad/|(L5‡BTǍ T Q)W*zP>P2eӑr^Px\a*:{CAw S{C!v# S%m}P^P]HE3k!7#c3S;Ϫ xe SҟԵxeG SuC!<⟆B+L SgT(L(sSϩuF-r@N! SgԆB+L(iNܛTYP'r0; \aZ|PCθTYP2r+Ca-w(D)HԵߡ cCa.i(D=2 ̴7 (;)W; [0U; \a*/i(Dف%HԹߡ0u P6up!T]PSreb*Șɞ ̬M{T]x(D Ca^fK]qAO^B27 QvBR0urPjp(D PHT]zPrߡ 'J SyCa-w(D\ \wNb\+\a,w(DWHT^Ba-w(DZHԵep! SeC!,g іCa-w(D0u-y(DٹaHr~PŐrT6ųá0u.w(L]p(DAgHTebu)⟆BT<٦Pj Qv0R0U<rP*Ko Qe[|PZN SmC!ʎC2; Q9L`ܰ Ĵ]`&/w(Lev8ԻI e! S=ӡ%-0yw(L5LB}vv:UY<+yCl7>&,&v=bV^n_?k4pUw׳$ȓPqwԾU||~%o[= ŅN IT8H=]8H}vȝ/8/8rK!NCMz U<ɳ;=[Bؗ8ؗzhL$}ˏO(/R}̎KA}Q̎'>'J2y}a3Ǝɓ'nvZguI2;N>3?y&/?u.;aNͳOKfMr'A`)Q6~('LNtd&Qr$c'5,eW٩Le_C8 OEvRW Ӿ f̈́\`g'|T.ԗLgR.Uûqh極8ԧ/X>C̊&OɑtC?yJ?F޴ލSm=:c>%2;aFˌV&#We?9Fӿ*grWZnB?E+ĂcK~(J_\[N O`1cN1FލsFl?VCKP3hIƹ )(,?Ck(8Hgo$=)*ѣ^( [n  ŽHFGWO@NH)wĈo[_v:DcһRavRC6NeH#zq?n!8ZA4☃sڗHj/H%ٗT(RVFi"Dify; |~ViwAI-eOm`;I&g)9N;Z%2w˭?z+gI?a7mᘈmO^Kdݻo%[ j:ۯӞW j-L>ϷU ci,{:ˌ[R=ʨ~hV 'q}o0)}PWVjcoߺՊ[MV*FJsФ|jR}\7ߓ*W_OPhT]ܾyBئNUJŦ lu7X&fJax\8)J$$:c|(a09QzoDw/t)۶@Tl l-ۯG/ۋ>hOr'g'Ft czuW}qIOj/پ5QGm?ߎ&&mf=<ժ绾H;z$G̚[`lgԿp|U wLI YlņOǛyJ]I*߂$ut#;zbTl.]Se}KcNS[u+$>]m3sL[dH7ä~}]ͶQVlM؅2G?dbw(V=l5z>(f:D)!Y5ē5C?['0e&>qn讹v?Lw9v:k"HaF]c{ +AKÍH>fqcP!L LdP{xExX|ߡY|Iv,<NUk2OT. 5ǥvF0E$Gж--; X5Iݧ:-fT?x+ǑWY\f;JL|M;Hn$<"U؃ N8'"QۻG+MhBhb98G%8'Z""pΐD\ݬzp Awo0=Nd:M#P(9ky6g "z G4 QazXwă\^AAV`l4#L43j^/e*`h=.eND d̙+t=c=^<"ׅnmRԞb){DoZyga>_f b,0!$[x@9A `lU,CK1sV-Ρ"9s_O:a6IiV9:lyN*(y buwNJlбjl*Ufjis$,=$xR>tǃ텠<]ֆ#ݿ#7t Bn g7|L}C:?Cg~8C5nQ +@B2" R j$@e+HTZNj(DJ&R 嫛@x Q +H(P߃/ R T(DR+R ˯@B-" RL T(H-@.}}P5_\*ց'5|mP~)WEdB!r)_m*|Pei\Aʖrz 6@ @B-|# RT(D 9R @2>eH Q +H

aRC!1, 91SAc TX B!'rT8 B!r?=<P?LTX\ ba*@EǤBTfa*DYhR "@B^TB!BMr(?A<&P RT(De"Ǹ Q+D]E P*GL)*,)WjGL)* SACu ( AG ) bz2& STʋ1W)%*C 9PK_=C )W*C ) kb, !Wj1<" P()\A# xCA# )*E )*[P.B!.^P0B!!d2) x@eeH QGSAʃр )P*Ň RŲ Qe髇Ǽ P7u->Px9B!br)*<P<\A ( C<|P>B!Z @BT] !@ 1} xCA )M*E )a*,)WPGBA SAjA>CX(%0. ѕBT[ Q@BԵC*5'5<P:ֱP:^z(D]0<"P(QBA#G gYBT[FCAN )E*<<P:Y֡Ֆz(Hyh+Pᮓ R T(D奧 Qm  RS Ȝh(De6? )* @BTz*HyL@.s1U؇ R P QSAʷ Q} { )T(D]4z2MSf(k*A )1T(D1ϯNm1Ub(H B!9֩x6|OPUb(HB!*/6w(DŇ RqPz(HB!*Tj1|s Pu->PM, DĴ RPb(H6B!*T4@BԹxC!T8@B2B ۴ ĜO@L[P> QgWo *? CAʷ QgWo=*? [*bso*2 QmCAF QWiT졚Pʋ1|P sSA*J;E s0l@.S;|/PUP=c@#*buo8*C ؘ6 /#(z6B!,PJ;ϱN)T(D]"?|PUb(HeoTMw@BԵݡ u1SA PoRC!h { ^DVABA*cx=~*H>CB!.~P { Xݡ { u P(D5^ʤvAM * )j T(D5 RMj]KܛE>/yqZϋ1yޚV:̇=oq|{jϫz(BO?/t|ÃL^>}JLκ1Y_;_E$Zno3S)R)=q@=?_[2u9Rӝ {"t̔_D~-Qgx*ʟ/O͗oTǶPy4eC)b&Z?S6U矘'E:6/TH=mSzڦ"MEi6m*P_H=mSzʦ"MEi6m*ROT`S!fӞ!Ӗ~%Crz<Ϝ< 2x*])t/^nUzn^S2_xY6=弽R\̕x ..z>Qo{*b(z{CGBn4)LvBG˧$?sE8NMM,-ܛG&Hh2nU|=nv!?Ӵiv%?[@J` :/vx)ů~1~0~}>r3BG7ne,ofoӶ+^Zwe=4⏼u>7u7ƯORǓX׵$5s?}pdSEҮ;BF rO}Y|qǏ5y}$|=uxi'*K-~?n @Xh]N_hKxCT)?|?xo:Q0>?]F-mೞUQIf .P}cpkYGŧ)tm5n\7yY_ѢYծa?1Ӕٶ]<طCSj*_zZ #Kꉬz:o,5dɷ_ ғT!80XzQ [-4-%ᣩ庞2޿ ć{OԪ@j9/CHfg)-BkSS!]<'l޼ذb,WFKC>gxw1@7Sy-eܕ/T(*ςB*t变򱶙uI<:Sizd?iHOjnziAۜNR-_*N ч-M<\7j;$h%[[/ד=˿Őhj~+._ɏXvoWa2moR"q^YK.Ckܗjk{ed4$UͰ?Xu[~n~鵟>{ާMٿYHj&l>sVݷX}PZO_`Ԛ"w7?SrB\y6tm^5 _䛙7㙶9#,w;RVCOI+P#87)F^?f\cIsV6ޗ\x-[,냔L8 ^5=+7`bk|YS,ԜixۯoiFm\X>R0[xZF0Jk=p54OU2|/xu|V4uv4yylcYR4_Jw6ih;Oz0]SRaKRE=b󇵇\4M&GhJ)y`NW$zd>QꇣOyP_{Ge\ؔSK&NO5\:3akt]}}L*ͬ?Zj#>vW=]%YXYpTk?:}G<ǯ׏hvq.bҘ"7?tO3#ۏ/J$8 *endstream endobj 345 0 obj << /Filter /FlateDecode /Length 13692 >> stream x_&7r'_Ⅿ1_>ʶ=~-'8ۻ'$x*v{Kyvn[?o篯^޾v+19J_ЧW9^4yr)]!kL|\OM)cKh—QaMc|% ?)>ɛ>[uGeߚdop _ue_tzuW%H幾Qvȃ-: yTRR՗rlEw37ף&$E/R?kMһxCY4,/'4I-JBǻ>O_&iڧr Ic||9iI'O_zngBWMY>&j-)7r@[+wyt|Fn؟]ˎoߝ']X{J뗯_j/v>O}8GՇ՗|GU&կ/^ɍ~rz?+کʱ?|~z)?9-/?}48׳חry՗c;Ҋ ΗK,"e?I_CzFi7ʗ ZUrlvEiU9i} #=E] )W}^ -q=˥BM~"n8RE[P/Wڶ?ˡw|Ù"iGz*EAs?5EMzH̒UyLe$\(vC ?RlU\qKT~1E^ck zkC[i!Ʃ<@6()]QP?^]ڋ<ϙ/L_x,i}>x Jsyi*KnSB<ӜKT_޲$_zTېS$}z)mLΊ%xzIUơo#ag; KӱIReM"yKsB(vCZWWj:r{ZXF.=JGP9{OCyÔӓTzyg" ;Q$E!iO47|x#AtZg.~in95iJvr"ʧZp)Ah-"dw#yѨ^鯊a˧Fw0re$FGyR=hɡB/M[o( &%9rmrچ^HeĵblsXa!ɺ9FZUpR,aJҲKjdC$~t-,,SS8G2 |DBe%Oxy(>>ˁʓYA.d, _63)%=7=J);;H@dH93 V9- )))7OO"ŠY)7.-F)IJ ɒ.$冞Xn Q@I䢖7"eXe6Lڮ9N3kF|"VMg|V6SZ<I!e(fRnzkG_q{tb60Rnhe֥9.'ġe۹ɫ|NFn܏o&4%W<Bʇ_+\\VH(fQ]jQu,ʅV(C vwvJQNٴu` /R^PTJۊ\闅yT|!׮z7£RMݓ}~GV>9`zN%uAF|,Z/`.۶^KK޼)/*exQR#5\v~.ڤEQI*2֕6 _G4wjGhU66/xe_" =jc}uLUm5.4@lf.~R7O}ٷSD;3i˺g9mvȟh4>~~ڥ8{:挚,ڦWꥣYkJAj|#wC +"l bϨ-,r1> Cxڿ}rjvVK"kܿY棎jQGڡ #|/?'{˧P8wطmj)=x Y㏨H\>`H "C0D"[\I԰p)WqKBI2r)$*D٠'CqPBITJ)W|| %Qge|앨PX\!*h5D)W2Joq*:te|\Pec AH r)R&*Da)WfhNPխ6`|Pո|P!p\aʇʼn %Q3' H-[RJ0Δ+L@WkCa ]|L(3$`a*D[?EgQKIԥPr}ϵReD” %Qg” %Q0#1JFq(c)ى)WrQ$(c)LQP՟9KvJ9Q0oA.$1RrQ$R ע3KaJݮ3KIH1qA$jc)L;Psc$c)LT(j9X Sn#*D]_ Swdȅ\9X S#*D9X S#*D_JFBf9XJ2 Sn0$*De,)7"JnݭHH(ˆ=S0%QG+GKaD(&r)wRJ]f$uTub)9] Sn$*D_,)w~JΟ QUb!$~ť0^SBITKqK*A$SaʭD++.)Tub)L]Pu$jb)LՖP5nuTj5KITRr{/Q$c)LPnT:=ǸKIu1”{ %Q-Ƙ SQ&*D2J[1D[?+MT(c*LPs&ȅĘ)A0%QG󧒨vr” %Q׭ Sn '*D]oq)DvcL)7J[?D[1NT(귺*LI䑣$ť0yBITESa]Dq3>A$=KaJ r!103 %Q S>SPub$juIܑc$f'0@P(c*LG1ՁQr0v0”ϥ *D]c*L BIy&gBb[1v񧒨R5nT9"D~0”%!*D[Tj[SI0 S=N%Q-!0\ %Q׭Wq*LIܑ$SaJ[?D[10/ 3n5T~BITϽ!0 %Q_L)1DT(jw*L"BIT*N($ʦ.1DP(:oT¬'\HySJƭ Sqb*b*L+BITESa꼍-%QVO)f*D[|1|fQ$SaʧJ[;|Q$S!JgXz*T6\I}m*LaA.$fܢ03 %QVO)8rt1D[t1|6Q$0uFBHuY S:4i(rt3>OPuj0 %Q-Jƭ֟ Sqb*ũ,jlRuE[ S>Ps|$Q$ť0%G+GKaʧgJ\/)IT(:sRҵ!Bbe,%Q#+.)L&%ȅČc,~C[Jz”%U(j9X Q1uQSIm$m)LaB,A.$1A0f %QW1TrD9X S>YPuz))Ƙ3>ϗP5rIBbz1f3JZ1T-%Q-KaJwJc,(LTuZ `r4C$&L'l5C.$1R5rRmBImm)L\nBITϵR9Dt$c)L傴KјvQmSщL]>* [m?D9X Q1}QSIqb)03 %QVO)7RlDܧ|>Q$6~0PnTBIԕ0u~*r|S$Saϖ#KIԸSaJbJ- QX!oTB LA^b$b0 %Q׭Ɵ SXどPu^ť0 %QSJ[?D `(D[?pS$^ť05ƟJ- QZQSITSa j0Jܫ$uTuޢ0< %Q SXPu^ť$jj0osz{!ȅ[|1B S$j0L %Q_L)}rTu⋩S !1ޟ S Q$E _L%Q_L),T(b*LaQBITSa,9!1_Lj$e[|BBIu”iCT(:oT̷J[?D[|1bmEM%Q#!0KJ7q*L۔ۧ~/”/CT(j:*L@Drwq$ESa Bb[]?|"BIyIJƭ Skb*1|$BITqE2K J SX n=SaJbTu⊩0+@J[M?|(BIml)LI?$ESIԸESaW"*D[l1|u+BITSa[l1DGΦ”ET(jb*D[DM%QWC`+t1J[d1tmSIy,Vc*D>ũ$j0uFBH̸(N)oOJz+B`1JƟ SX쌩Pn=SaJb\O%Q- SX`Puj,j6$=KaWl#*D9XJ.(W %Q#Ka +1Jzq=[JZQ\ S:6A.$b)L]%(.%Q];kJ_,)q'*D9X SQ$5R5r|ErwUryi+4/Oڂvs\m kͣV_NxNmŵɜj͹}{,I}%>L7_||.‰Gl y:ԗ_fԥʺO"~13> >>|"oU?k{3ix.Nf63BU vw`U腭˰(450Rl =ͪքM|+3 |'_QZ'z^հVʫ,ZWuIw3zL}O4Fgm^l+yssn&a /؂o6d{YUY :nնVeXھnx&Vuݧ÷2Ԫ.a4; lejX*hUM U[[aMss3kbc̰֨NbXNGemnfM;aAK/]k wYSַDB]UurVRlѬ^O/UmAY<2a0,|%MGT*Tu4$V2eFeX]ڝVz݌ϋE4XIO6D6D6TmgluYiXZ'vZG̱L Q|ݡjfa21T;뻋a=j(TmK,0XŰOU/5{VyVxT7+X,[`_A16UW;=ca}CL;6.â2ua. ca2Sm \]^|5H_[i`{w3Q,f, +F'/-^[T13t]0[ bȮ6M>b3*hmC5+ͪM6iU[68߭ bs<؜IõE7&Ww=uo}pRyI9t/>N Sim/fmq{U>**_C1_վ 07>W|>3'J߇ .PJI/'vֆgKQ|diY O:"?I<ϔz\ Sk_L[L=|e- Es&cj Y?Qj+f|43lX l 3>+ށϖ03z[ÜFR3l$ e>gYn|S3 Fg}bSlȷtj65ԭ7qqZeӨ,CbY2Uukf Uu-䊋cU1>3,j;j(ћTk;6L|O0Yu}ీlxlj۝bC2̜qaLYnL-+'bz |. }bɊbIծ I,<“|Qoִ 0i7&`~ ^T >/JTׇ|^j$Vւء 3|mLtŬ kÿn/3 ~_:̑o1ojv ( '6]Ow rnp@cÞekzkf4Bw4U?BRWnz6`׶)l>6l_IW 1[~۟mS8p:ݸ5DX|w2w4s79sXoWWjcasyÉ{vMWo4fWw: `V-*2ݎQ-q@S.P=hg0hns>d.5ZtU}4x kmw uoY}7A3"0Wp/puԷG`\mFa7Ypݔ[=7 nI($M5J?wNjvblnJčYg.LXTኊdZ tZ]jZ=`aD9ɻ:$-& ,A c7gL7ج\n֙r(ڲ~*Xݛzg‡B)>OyZ?0zPPtaC+;4qѕmc΃w6/] UB U|#u݉`J_+w~*|lJ!ǧoW?Z~?_y&Wqq}2['et"%ƣ7'U갋ajľ ƀ.]_q۲sRNPOv6VWŤyK?fUmlף$n%X>5&DC&3!^2K>x}FجZK#765GRXsmT(LQo I#(|XP!EM)"*|쉨Pq  S>CT(5Z S>BT(L@ Q"  (|PчEM)L *|hPn SNT(DEW” SMT(DE”w> SޕLT(DE”w SiKT(DE좦” S7JT(DEW碦”w\ S IT(DE⢦” SGT(vZ SGT(L? M)"*ۊP.( S-< SgCT(LPBo A!0Ba::r h*LyQ0 DBw,(f<'(RP`zQSacBa .A.낦”D”ǕDBT S Sʢf(FmPȊPʭbn'/m [QKEMBW\ϳOg+tJi|涼*N?3lu7zEL+bt'I}2'CV4[<[֟f+3lF`k 'lE &xV*͠NI0mDwR[vFPuETN -iu< VSjk^pmTZ-zTZCQlNеҢRK+ڂpDz[R3( d5̂n*-fSKcCvUJ͍f*eOawtSoXTZF#OLS\ҢaTjcn SEyo/L6ΎqSiXTZT <0CTj'<0JS?au՗e)EPXJn6NXJ1ϞR:/: 43I½ Wiq Ңݑ=(g]`MEZp\1Wi^x6*]gW!')Q̫X踸;*-:~÷ WOUZCm1vh7ҕ'TJ-XaҢOwZG!yXGU)ar[iPEK }3 [QJe?+}f{̻X,RpooҢם{nXQa-$ukp~,R+<ޕS̫iҢ_7S?KMp/*z~4aK쮨h;Va,-ZE.g,-ZʹYbPXJ:JW6<0b_iQk,+-p_ii:iDi:aJ<9mWjI B?VIa55/E$7vDŽ7&J6a#a,-+-:T +JK'sl~C&:`sW)+^3{H*-(p݄*p-L|*-ހ=rf6 4n*- J?7~xJ WwKvNy°H7,ոWdtG-,[p^x6,6“toI.Js ֨kQZS',eDAR>1(Glt5QZlpsNB/(]W8JWg( ~Sa)f K)OE4𷺩t8_xJ1SZZsBBXSj_lH ZxF4,W=TZl^$K$J #fF%K)ﹽtz@]bD Tʺtuӄ *F1=TǴT аRŴhŔe+,f-p&;Ls9a(5JbLk5S*`JLtPաӕm`yL[~Y@JXKWwnKgmRkWڈjt}t}.eҤP0ܥh|G :{vI^j൓hh:,ß 9t 3!^2˴>Dֽ+E'Kq5`-eY,EM(%j*=Z Qu%Q^XTEM(ZeBBTDʢf95LBT5^TfA!,!).}埖~{i)|:K'uP`%t?;# _ǯhͧ^S?iR&:`QT!G;) W/񝝺KhrA{_ rwǷz9x|g~q{=~nr_ɩ5>|SnGzmJ۴>>]o5z6=%wƩ25CR/Շr/y\}vy~!\Co7m,!}]ݟ_rQ$!ͤD|m 7:(huw z%k[jwrmSͣ0-endstream endobj 346 0 obj << /Filter /FlateDecode /Length 13424 >> stream x]&7r+^Mp8H Ķ@2f4Vz}bWq^7 {f,~]d?\r_?/o//;KJZ~/pizI>_՟)>|zs盷׳]Wə䷉r_87ohϒEqju߳x+=7յ*_s>J㽓Dpϵ麮^+kZy_k+̏]W<ݛt?|Q~_$!uW~v*n>_תrQ{N?px%wi}tYGbjgy̚N\ $qD~@ޜ# W)y oήǻwޢYx TʳR \bd|f.i_J\[8H B;㊶j-=>~gϩ^$Ѫ Ud* "J\ qYdAD g,j6嚍JaTKf?yr[S9&+Əؿ~isKxKIu/o|?ޜukܿ~ܿݿb+˞w<܏٤ٙ/Ԡ>Sz9s(Nh0o_/wh/Q?8|sP?I]z R>j,JJB0'= PryFJ@f 5appm&G6dˢ'5Zz& }٭=Gae>n/Ixpvs1t=;z^[P9$%+5Kʜ=2.ZrѼ$(/+Q?eIb( 4cfj͒8iXJѬ*Ca(1Uh?߇ ̛2RRܧKQq߈0$sBBgXe>;Ev,,920qr&yC%97ׂґk0VL5+Qx8JeQ L վ O-PPH^p[tiq&H \DYT ).u&4Fb(s$1 7A =J…aʐ}ǐoCJ9O4ϕP4߇G 6}MCJN¨*ɹB}A qg\v`NmmzdKbzb/yX+Gىȼ34{fi#&źAǕ7~aErݕ:%%;XxH{]9I= 5 M&B |:)qFPR&_3_&: eȬ& Ej&LR];~JBI 52#gK^0! \ j5LDjVeR3 d{T$2'eʔ&ȻԴ,eJ,AKJEBR:TrxQhHi2#.pEA$, u㚢'4ӪK!SBwq-ʅ5G<ēr؀St(ǽl/q\.฼1ˋΊ[r!x5nPWv@Qiø<1T?øwm=ø8hg;㲢hU1.0.9a\1S:E1.G1.o8.O:Au'"8.Nؠ`W%֢oFc^*umr\~n4q7{Mkt4hq\*p܋1q] ^ $WZ3r\j68oaTAŸg}bܠ- @R;p)RT+  cq-^`\Y@CW\dpܠtMOA.AA{@q q 7pe ۓ WQ +C`heGX2.E` Fb"\7zP[Z*%ei~J \4㨰gTlcg|䦊p mxcRWx+ÕS>XF pee+cap)[WnP!"),ĕ@0B(%%k1*ŕ(ŽƮ@q@(W@q9*7? qR\ B[22hL1.]uøA-afSЪR+WŀFq/nقj⽴+JquAqeQL-(.b@qe Rc7g64.ø(ƽD*q+/b0n q(ŭ [@*4PX!ndKѺmVTVPܚli&ƭi%tq+Ӡ,@֜u+a\R&(ƭy*`\L;o+-qef`ʣ%q"u rxPK7ݫa2AeVzqɱVg*ƕTU$%U{8n;*Ǖҍ;@<ǭyV@qs)sR[9Qѕ㒒*%ErЬ ڝRѢهʳDA.y+ȕP [܁[(ȭ\)ɭt)ɕ $9+QKWٶ%ghIgy'>JrH3FIFr+elP:P.YtXa,Q`:7Kc(%轢\s,ER3݉LorKsJ䠢ܠt$Vrkh@Kw.VQnh(7(Ѽ[yZtMYn-ۓrkIMKXanpJopiW8nZ >qns ׍n 339,EssIOrb,W2^ru \eU`,*^wdFneWfr2$|#lU,'v8uW+]_?ScUfW֙\q1cƗ@jd@̟גb/+ШBbY WPSļ0 s^AXļJ>$J 1!\ļ8 S,PDO2#厡B+BJ8_HfpęQ"N*$μصTYݎQ=]8+Iię?+83T(1y#2J|qX8 nx+ڔXVΛ_6ߔX!ȭRb ZT%NJ`\+"17|{GļZw!v  ?= B̓`VBXUB.lBlۀxی׊p1b+`ĉwY^0}G}Kʈys}ѓ`ļB;`ĉW0ekh:`.HFe=81UL TRb %;CK\ٲRdZ (1c^} #ƈy-g)5#M7#E),#f gp3b^?*Jtg;0KYoDs =8ۢFo~#bnþ%Gψea*FLdt{oF\xIyH\diE:i1HL4($.*/]5p( qQJ^J)qrG#|bg‡eC %w!Ql B\)!Mbi0#Ĭ&`\ qI`JeJ{eX*.|8@) .-x*3 xXe*.bP@LJ~sX߳+#RK6gJQB,%I_WNJ34LdNiηS;zWT `Ta0aeÅ{|̎paaQTS^N݊ltMqa*[LEҪ" zN)vazJ32_z~WpaRdXj6^Iɰ(T%ÅgT ߃(#2R vidXl]^G=64LN+;E%ÅRV<15mS3PpP:s+ ÅgPz:dXj&2Luyj_f+^2$'C2W 22\x2,qs92\Sė2L0d\40EQ(:htե;, }p6]Ѱ\䯬3RH S=.)TPa K0a痁E S]JZ+igxAYdd0B| R8Ked.*ZJ)}Y0 tQR2LdBy3Q0,y.<*kaR.äx mU 遰PK S芽aRt}0NF {p{/ay 2LAC h_4LwκiD0\hJP.\CZ `TX``,po  Ssrd\ U:10\z>0…'T\߆toeaj &6e`8Ż[ q)ε=@JpѸV 2%Q[..S帕ZG9nŻ92%dBp]]*%DI9q+ޅ$eJp&RŻ[ v)%;XI9cq+24ŻŻL 3r20eIG$JpX]ؘ]lG .Ux+՞V*d &U ۃ˔:V ۈ˔3w|a?0QrT.l\.Se8>C]lz .Uk]G33(CSkehs>+Jpͣ ]؏]&xmy)Տ2܊w][.l.SK*uFV Vw3\g$nŻͻL 3]ŭW?Zg,n%X܊s;JpvR%h܊wa۞w\/T.9SM*8Jq+ޅeJp"Yp]ƭl2 .UK6z sVkehwacw\g,nŻһL y 3HJp M24%H܊sLJpX&xpz)uVkerһL .\xW9Єݥwaǩw\gnŻZb\]Wk]CehJpfRŻ[ u)5Y&xz)524Źtsm%Q[..SK6*ޕHJpգ\8T"˔:#q+ޅ]eJpfRŻ[ .\xB{)uV {˔JpѸ,GSkhw3\,GSKx;VǭxWJG9n%Q[ xT3]~]lI.UKb*UhJpQE&xo2%X܊waw\>TqVeLM[ u)ޅeJpg2!xQ[$˔GnŻpL .9\xx)ՎR܊wՋ7x)%K:#q+ޅeJpRŻ[ q)5|w\g,nŻpûL ~)޵hJpM u)53\(ǭxΝx)%'*Kg]׌;nŻ[ qV_VĭxW;#q+~[~FVĭ|n!TqVŭx>v][uVkhs3k+uFV+\-g4n%Q[ w݊wkeJpz2%3&Kig4n%zw+ޅx)uFVk\g)\y[.|ŻL y)޵XJpͳ Mq;jɄqحx]W?p+ޅ/x)^[.7<*N[zVkƝ]w\G=N7\=gn%Yx]&:gu˔:p+5rVke·|˔:#q+ޅox)㮿[^[ 3]ΐw\5:cq+ޅoy)5㎱[~VkhwHeJpѸ˔g9]ƭW;єZg9\!'Jpͣ]w\3ۂ3\(ŭxWIq߭W{nŻ[ YUdJpZq߭xW/qح[.v7<#g$n%YxJg\g$nŹw(Ce:p+ޅOy)52܊wwJpqh#ddJpV +.Síx>j]W{nŻ[ JpgVkg)]w\g,nŻV>єg9roVr7˔jqح׊x+k .Skƽ][ V .SkG][ w݊w|D}mϻL wJp'(|Q|=>C`pOZ~?\ ;i;K>7jW}x_pf-J7oO]!ZOF_{P͟-<Ԛۿ?iss޻~=_/0߀'w!? G_aܮ~q>k!/R!Q|f7<P_޼g?Po߼|qGj[jŸ3Wlx]*\#=.۟2w?ZRn򿐖\o43{=wO7Jr|t*6yG{yBy~]e=>ȭ\%y !nST_gٺL'N+"Z|UH|!&RDwN\_}CIr7RY*@I^|kַ| @_H<F{HT\)[o`i>>r%UzFEUwSs,NEܮ_T::PK~D]7T^1}oilᲸ#/ڹwjAyIIU_kD_Dž?XVdNHke+sϛ+:T5Ľ;\8fBz0Tjj' eՇ7ܴf4Co [xR- u )w xM?4)Rv-;&UZ}sx>7\>nAT[T(GbWpuQ$StO]F7OQ{%msYq3e%A ]_o'2&5UniipzZ3+7h8/nuwIqvP~^RM#W͝nd-9| >"6q_JT8<֥A^Cvf;7gתP%=>T<4Ò/T\JU?k{:XU+wo Wұ_+޿ c8XJ/*j3BMz+{_|5o5T4+k|E/ۑAHendstream endobj 347 0 obj << /Filter /FlateDecode /Length 24229 >> stream xK'Irݹ nw"=^h`FA-(-"[]~o?v0̛Lݽ̓o_swˇ_[_???ú}Wuײ}8u߾k/?-m{?/C˲?$u-ˏڹ'.K^?xe~7~{x-/G[y~{to.o/!xK,s_잲n_~_2m/=ݵۺ?н/ajv}l3l[,|GOGuY?ܯ.ve}ee]7vv߽+D[^A>:ڋ?jɻ"˯-e/v7_Ϸ%&۽u vw y_ץmXŮg?u=F*gv8MR>Ik:m}-Ig{_N?ܗ|uwm5fEy~X!.KuOvc˵6Kyfo>0mzUaxFƿׁKޯs}2SY[ e`įS ] (LG?Dj"W<˺5lfn얡x2rr3f6se/~٩4pg}=O 6n9W^ξґˮl}{H_co鳌djՓҕs/Vx٭x|WnOэ' ^ ޫr1.W<7$Ӭ02E;.q+{٭@\w+$HS9wŭlZ!><:xϸuf: :o*V\:ᵻb?:TdO+cRGV66ϊS봔.wP+>+.bs[!A;ݘmBwMu+&ȉ2bCXJ\p.Rxq`o*f…ҜmA#tT,W6& %ZWz펞ÞɳQFƕ;KeϻV7Px Vv)VJPq2/'_(.P;?(VBO$cE@g%Cw+& rlfOf{WyK6#C[upkwF~sdIr"Af,>ekC*պ (RluzX&զzФ^zl<*ysbfQbtN< yZk橍_OKiV2jmZ?-<2VM24*lWQ~eod =1;hʂҕ;~q:tfIR*+6yw+RhO [?C?@/{/_YQ_ywBzWhPhʯaiةX9lbiޖH-]9r~ZjLr:|[A$[וI~cM6In&6np2OW.4Qf-lmm־~7-fQ7?Q-C.H~|̶-!0|^);Tc19/xV[Jg`1=>yK/c/]Ԅ,X9ԓwnͨ$*[[f#1 hxcTm} ?2GK]mC/JVgM_k>X;`GG ƧO鍞 ([7h]U=ƶX cٍ߼q=,?W&ƚj-K7:4}_{\׆2'ҷpf|u:PQ_LǦràzAλ^+pgZh?8i)'g]mUy>Xp3;2ŧ1>aa`&oZs+% &ݔ ۶a Pb)z\ihT-5G\xâ%<'fYJCe۔#re.ƣmbbsrՉ)7'^1i{w4f&RM}SmӮf*]h Ov[ŬksL8: wyH+ދO40D#WYwܬ]lxQ}S4$Մmع)pqxlJ[xrrhǏҦ6 O$wݢix;N+>7eG 0kZ<6 N!)^wn:}Llܣfmjeh[4!,6M-OӮtayVLcu>:f=?R Yt}Cj,rxVIL^}!;sx]ݗrryȒ>A-kO8(E|}()jc)Ŕ V>ּ\`ʍ4cS_%i,8hRXX>II9 tptJ}Ljplͪ]YլX1egrcuÔWZ)7W*y|a¥ndWy3e_K>h=+=iʔլhjSiDŽYiV;{X2jV<Ԏ[Z+bƔC#w+>וLф+o+sFc.fo k[5<+t!Fޱ|U1^:ruLջV+77 1o1˵y~{w %X'v M[n-IQ䨇QtUX]cǫNk&4QQnv,\wK!15-k*U=5.;Ʀii_yHc6X3j|Po2zyxcpR~*}X8+-bw8ǒoq&Vܰ=ۍ~=4~ HyʾϕW?}4HnN_6ax6bw2IȦhi~:<)]d' 6+ w5/}̯۟uY/ܷe`]Fp*jwAO/{/ /+k aŗJձOiqƒJq)r\.+B ŵjyvJR]ZiL.*5ּz!*\T+Ҥ6faD!bP\fW kKcQXqq]d{dRV.0])v5M؂hx[J )v]PQ !0!E 4{BH0K T-_C+$P,W:$> #دSI^&%S@TB Tb(󷐀y#Bq!AJ!!\_s@B.Š+ !5~$RXj ;e,C WSV&Dc]b!k'-By DuGK n&![_;!Q-'!$:b&@B5v,I**OB+*@G~7 1KbI0kS(,D:8gN%!"Ẉն#5#}!P!} DtgD#\}DVw_BD B#'#AlJMXB@Q"djn9o_8#з_@]29d:^Gӯ5),bL"MH$Q :;'$Jːk!!HBFHs"H5A{AujD x 8%Q7qؠ* -cK*J=w]h\@GKÁ(j(Q K^TsKSr垏EL@C =h)_)KLn( 혀$18&PW^@GRr tT-cEqL +z7|P\V@G׭ tT)bi]0e7QǢ+T%䭄 kڱ#(`(AL9jW"ANSs%EfPqvr"rWɊ@VR Phrz[} cf !0?Q{QŏGBao! $hK6I(&&nDݬ} @Xlz\@B@KTpaX_ @@* &@aZ" q7Y7Lie>C y\ _9X حp†uT{!I eZݦH lX=6~B =@0 1 md@p  raYTcK%@?6zBa D֑R'~QE1? ,ax{4= 7WX%b HV B`)L)ޖLO 7푛}?aN?6$ OVTEA"ʐ|Դ%X\$?XUz{ٽu>u-!XeD `Z@ a |)F ] mA o \KmB,#E!_ bb1%?[ޢ:d? U ?b-m6|7)hX}]3`%8`5v PvDpZAR櫈ڵ3 nWnR`:v͗'JBBJt2"4@b>BB0s E x5@ Z >hXP>hXv1V v6胆[_kXW=8}ژ>hX`}аCA%8Y͹=P8}аHfmY %>Nj#}%xJ<\ W$?r2$>'hX_d Ѿy&n$Bc B&rz{n*vs0lm- |mg ` #V^?@$6EqIn~A?*]$D S|t,Ԅ@}w.AЮߔ ?ȩ`T/*Jߦ ?XGT,_R[8~"R`«>ؾBO'} >hW`ac1YqLZaFAy6}# ACY=Q|O/K4[9C!ͯq< !dك4= .6EAb|B`bAC="bGtA[^3|PXb3s+m|(s2}(|9|QVx_͂8>g.A.3vj }*b*>xZ umG8g#7"I4|E%4#>x&]Ax :O64#-!.M`,xkZ|>oAC+'HE3 ­_ݞ`ˬ;ꎼCAzQs V5A{`! 1vç戅.AL/. D3zPmzޟjL=\O8V=hh <<@ɿFs)]H7$sfB؁y44^yoֳ?uPE:hz$R:hcpr?R|ȦDԁ ٖأԁT&؀7;ap;lbv`WַբU$3PAQvrre3mWOóޤ8uR 5mNcI[:hMԁ3L4읾h ~UuP/K_A6B :m.&x#/Áѡ ;hk1+&LNZ?x&bVv.amog؁ J"eڒc~F$!^@!|Ia?)UQ ~Q |}O~yRYUD4' (xsysg!囶p~4@]D*6S6ݜACX3d읩Sԁ5 uP=?$%"HB).nKJq)\RKR\ &8c N.)ťxqrIɮ!?PKqR\5'ZJrp N& 㑑b]ggW(1R\(.)R\WĀyR\D/.)+S%)%dCJqyX5y(}vR\ۜKJqs·]+#PLǗIJq9JP\RxAvR\R\`BWȦPR\Bs%H?dW(R\NI"9]bHDx(&)EqII.5r8%| =PGvR\r*dI )R\ JBs·]O+jӈz(JqI.r+Jqe)& $y).)LqI.1Jq9.S\RR\"j]bP<"]6׋P"rħdc?$x*&)ŵO9{(Q6I(>{(uL#5\k(ŵOsáK%iL="]WC)k!%HHeW(˴%4Jqls(E*B)W@~HJq9U\RC){o%veW(WqI)."]6Վ9XR\N"e]WkG(ŵϵ#"]6}(<:T\RFC.RpJqsއR\=]Ne9PE%q:{u(E/B).'KJq9W\Rk3G)<% fW(kxrتU瞏]!f9Qa%`,.)E1B)Vkƣ]g-]$"+Q9JqSKJq9C)uٕ9C)%qfW(R\Wa?Jv9Mg#G)%fW(ŵˣW3G)&^BFMWqG)>Պ1ՊUg]^+:z1r0:]l أ{jStQkG)>|(Ep7B)`Z_?Jqu(uyJvήPk:{QqvR\GgW(0tqI)^睏R\4JvήP֌P<\+B)s=׊PKvr (٣W !{)J(ŵyϣ5PlP<[7]+jtQ)R\4Jqn(dk,Qk=Jqs>'Jq5(u8̣$GH6PM9?_Ksl ڔC)}Wi\=Jqy:PFwC){q%UFvR\gՋdWcdC)9F6cdC))FB\g(+ x9C.~&]1{(uJv il=s·R\4[JvW$x4JqӼs(uNΡd?̮POɡ:]꘣f2B)c)):9⺧PKi&PM=V]g6I(9F6ǵɿoo$пF[o%L)qo|J7}Ӝg?4>7olQLCs|_Տeum/AGДv>ͷޖeIogoaiq[{=?@#o_~v,_lr*X<,KU]>_~o'1Y|Y=o[ϣ/o^OyRvmvkvkvkvkvmvmvivmt³׶5{-|u_՝ [ W6xvx67@{ _fXKMp=oooB5sL W۾N#{_ݾ\?vq,'wN pω|rY3'6 `Qcx辱$P幘4 ueZ|r$8M3:O Pvi|͎#o)tGTJ`=Z!~Tŷa[M{YcֹQWCgh'GJlQS;t|ט;H#qۤ]C.A~ux8kl\;U}W_}Cߤ &e5uNC^:;+틯w?O?q溵LCٓl/=ݏ`v'|PliB.͆=;lnx4(Eo G^G<;Z9?wlO<'dvޅ uǹ Ok;oot~7hцNDQ5O_zKggzw!kUjerN| 킄ާpcb NEGe0:VJ-=NkGKuL;}6ķp݅<.y|G/kQ -vrə8Vߛ%7l*eΫDžmtnFC~:'a-܆g8{jC~.>w.;57[5w"BaN{=8¥RU9ٮ.8!?('B%8 n_ϖ]AϰJ{Wp0o}?ڎT8x!>h#WA~-^G; 6 Пolngcz\Fuޝkwu5E5㣫:kXDy{AX}1O0XuG3;G+>?TѰi6,wN 8+O-sZg(5{w9XF߅?ݶ?&;vB';S&bWlQ ޣD)GCub\d1NA0_?ԡ+ Fppnn>:vcש)n̾@G'"rsuކLT̾0b:q)F=`d258Jv`ظiQnGi5Lae6L~-{8Þ:7~]Y(qK۵wY>c@g<[k݆n<ӻ nTS{cJv5ʊ*O{wߔ2wԦ?ܽi|ru cT]H^B9Ǝ0h[5srM:=sjԾ1ڻ8]o3s[) ͢܅ġg<}Ak9}'6+,R͎2a߰xoxͺ|/E̎=U\:V|"gww|m^Nvoy|꛺SWuɊ Ǎ[t*c}cmvn;|m=lq{K !ڕc9xُbiX×ycm}]/BG7#{xv;ԣ-rp@n2 `bYhِ܇`%œ{+(maegeyŽc"Y1Jy/J '/߁kn~n[@VSq}{hZļoXU8/OwwZdwy7`$7;Vno5th2㦞dtt`['ErUbʶ:G=׳q /hSꮴ ZtS)j;)^>Av{ၾӑt.tޓ!&x_MSW=nk;ڹX(y^&ogѫHgzwң]W,vؘOz6H/<;fǧzRd@Q| jʱoG.B+#sG.=|\a 1ӎeo%vzb C ;>=?.ʻ[.wyNغ7u*G+y6mђ +{)+eߴHy9yGL;xujW~|SKС h5DZ} 2|ݗZ ]:{.CY([,VDKqqs="ʎ 9Я>WCZ=5~kq2: %%%nҚ\)]̛/%X[ EinaY_s1VmPmQByOR] $⊠R\TxJqi1Q-%%\T+KJqi\1+.[d 5M ӲCjwbQ\+R053Ԟp}5FjkZƿLb |L_ۋpa+[P>_i)W\iAuc  4lzJpӜ&A/cb|B)8аfaO%S'3I |BCCUBLΰ2p-; +BD `)絊A9>}b@*~*aCU*1qs31vOO) ,q@1oVF1A- @0 R ,[ɳ !A@tk1r$LF7Q ,q`q/ ">s AXx [GB- !~$B0IprMA;*} r4̕w)Dt8pBH ;):.cnA `&`@oV 1V *&O%?XpB"x]~H~賕p-Ʀ~-ESO^X%d;D?TXqZkL`8S"y$ ɭK.s Z AXe\qn,a~t Q܅`amz,s~]c +%B,W,~5]G"J8tsio@u`VAm8~K?htDԝw,JvdUeJEu@? o)Xċ>hC~]H3P#|C )@KOEU@  +@`:. c%vN 40!m&Ǭ2,  æA3|W#J!|˰i`e,`\,BF, ¦Ub8D @=X 5D`}b + =D=<𽝅"~, `t'2tqD.AǒDM!Cc!C!t\u |2tбآ<AFa`}S;p;[:f>_2ALWV!s"~W؞ ;;V!_ :5GԁM`Rl D"PAj-2.x:^6Et Hyw3sI;wc}Bo;Xy7vR}jvt}AވAo +^ >8Svr/^cYA%J R8}>"٤LAt,w0`*cCqkR]{It,w:ӌy%#: ;vQ]7k;B!v#bh"*9v}*>SNֽs )pMv;uq%~QccvAI3 bVpHgҢ6`k6OyH+Q‚p@Wl@X04V@7X# 9 V@Th`ŕ fV@QVp O,|{4u-ڲGd#ZUSJ!"E E"8 8UE &2^a XWVr.#0N%p!6;iMXVG8D+d*(0~Cb-V*'/Up ^QAHBq:OpTᰞK;aT"P磃FCn $ RaUB)ڀA~(8o. tڰ )<#OLb8-cop zBr@hL}DR`KRK!S@HfHŌuFa'pn4 oQ0K(xːo# ͗7oe3" Kk𞈂 <Ѱ. BQ`+F w,PhXR't"y$Z7\[=D(44Q N(PhXb&`T Q0ˡV[H(mvTk(=opQh86Eax2 V[^1 yo6+#%(x M@ݜ_&6zA ހͿLRAF; =3 #Bcw<(e v} '<(.vX֬V"V^i >Ҟ!<J  _pZ6FH+,dlxU.o +%vRC4&`|ưKq^' +4DK*+t`W > l~^W{"'āvuU: f"+` M4Z$G r X2`ɽbb `gڽ{ts,"YF*7 ,CCnmwz|CBgڽy{ [&F`65|b/bD,LkIBܓX0eQ@_ 1Sx¢,Xhon \DN X{$@ϯOBC8vc8qXb!hH,rSXQpo"|B3`-$L9bc >y:'D,[Xp%X0%R daTB\6o]̂M=cY _tm m 13zB b6 6=P=3H u.W=82`cvA+بy|,ְMVЙ`,kۄ)byWh9kg9'fʉ+-&Gcb6R쟸BV+ĠvS;2CPp+4z&₼:B+4lZjoL#=LBW qKnW1C^aĞyv\Wxd3аQ CR8v~.,qz >f8]Ă>ĂYaXhL[ܑǞu,L.fgҟ̂ `l fnF,B*b| م(YT,2+ `y*F+/۷g@1,#v拈ر-Y2̂J" g^YKTHȂJF ϞzaOcfoW"oxZt6թ^)ŅH(,jDJiw 6?<,KY+U6T$tR ` Cd/fv=s@uLm>D&WFyuG<Jqz@^z:QR\w=QK3JqG)kdCJqmSzߣdñJqG)V|PnqI.w+oqI)^j~:[R\W=QOG׋PfC){ %D%P(xzpd id7:kP]۲+؏R\}Ps>%eW(ŵ#c^iT="]Qg!U"ϗ]6R\}iiv8"]WFxC)}94] +snR\4Jv_̮Pkss>%C&PMctLda il=S: !{)(զHPkxC)ssil=j}) -.)xEqI.£JqmG)s+<-.)E5B)6R\\7B.Jq9Z\RO1R\4Jvsl(ŵϵ#dC){PlP<Jq]s·]v+4JrM:`R\mavi(uN#d JqHo(uMsϡds$xi8:PC.bJq9 ]\RC.RJqmS|r((ۤd>GȆR\sl(5R\sl(u׹gC;B)c 9C.gijIBls(uMšd )3jsR\4JvWϮPM1WIbR\4Jr O1R\4JquBϦP˱R\T/]+ڦPOd f &g>ȆR\4Jv  xi\=⺦qP"dW(uLġ5`]R,W< 1GJq)2xz(uLd?ȮPKsLP뜨=5]#B)sJiT7ŸkJqmSJq]uBl F Pk;C.~]Wr~(ŵO9?:PCɮ֧P<}Jq]hz(uOd?ɮPfC){ %MJqi9xz(Ow+ڦ8POɡ14R\4JvA$x)29:Pxd7ʮPfC)kL%RvR\\7B)6׍Pk qOQk=Jq5=Jvs zG)UGՏR\wU?Jv yQ{eW(U_u3 +kwbJqm5(LQ3G.~w]WQG)F&:|\QeW(u"jlQeW(ŵ""dR\SQ"dR\SQkY>>ˮPkG)>}(uyJq] i&Pkr~(uN9?⺧Jv :[|jlQ$fW(ŵdI(^GyR\w->Jv Z:|:_kJ~1MWG)cC)<% fvR\{->Jqsأ,{>l@0mbÆ執Ke;wۥz]*wۥz]ڥz]ڥz]ڥz]*wۥ]*nT]_nvkvkt³156&%|mcaՍ +mL_oU"ݎܪbyaF}&/Di뱿#6A^kW~NWhwY}FOuߧ_/>nc=#2\}Ī\/?Yrӈ mt5G_TzSIk+ůϼyO {~Aj]ЫW-FܭyT~߲'GïX5ݓ8yq^L%UZd?ac،\ֶ.j0/eP}_, mWimuw霛kbendstream endobj 348 0 obj << /Filter /FlateDecode /Length 2970 >> stream x\r}WL%=Ua;R-NJ1qSy,[m-s.n.&HQ*=LOb88wi%_<]{r/F#~xGN0ΏQY0xW=$2qB{+'ValG<['(x3[)#i"8o-QZc]DiL,] isw֡[#Yʏj_#cIKRi]RI Ra_ 0 Lbţ{Գ7YL$X Γ4iqs+XwRJkWثfL++׳& )MuxQ/e ;ҍ66zdTF7u\dУIA]j{P=5 \|xڭf·kBM~|͋&qS7*Zx֙$;<8')5K` !X+؄FӋoqtGo^gf_'UmZfh2vxFX-UskVZso(TSQJx#(.pi2]Gqe=*%7`|v6CQE!8'{_%.~yyU pd˕Qj$3!G"!Kӈ4BqX+"`DZm~{j:x`-| & 0Bk.-zqع( $*Xa(Ѵzx=ͪټزb<h0 65.o/x$K0$CX_;/Qns2csnp_ȶ./!ciIhҡ0B 0휗 JEiB$[`/jNOjvx]_` V_`?uC$,Hhs[|V}@Lm? Ϫ"~U1;x'cv:As#̌g}_%~34x&CaA 4&#p]z9&Ǯ^{;v\?x6lׇ9H!b<#uM,a*'\ T#3Gk$J" y脼3ST; 6:Ņy AxR*y&KP(t]sA%k" I F-g|hP'mu *ɇ*Epqp,p*jaNrRqqu kL =:p)4J4o( I(Uçj OY`.–`Ϲ|-|!70;,Q۸LaAO~34~Bl'TFa\IM/8)ovl2%XZlX?f U5\K>O ڭKv4:| EE9ѹвp*8.׾H`kZ+n2"KZ,t1&r?)Zf)A`/1yn18a8|0!,sa)$*Mr[4)w)^KTݔiEp r\4Z0QO)H6Z6t6y\x=dlȹ䆲բfIhemSacPH,h0$]GC#tͳ&Q֋裉nI)֕0xRx›_U4!r&/\Q/;H79/| O0ހ.iqRmw.~+/OrHb^`*Q=McЮC1GP̬㒟iqx@- yeX`Ql~o7.~xPyT.uΨ.4V;ZvJ+yF WJ(Q ?ZQ$caJ5\/ܘ 4G9.4 t,Pp 4y t{J/{$6PM6EEH^{۳gW^;\( +8 ŷmjHD]'K&9mݧd)[ HO+.5sN`mM+JJ4@MI5}7[ilU͛]t/w^b)R.Vw.<""mv߅eqb/W# (kkn#zz8>)O86jGӡ7v/Q#5<c'{"R~'u bK ' 9 MH5k*^ad:.6]tQ'Sm˹ᦹ4JUOX 簰N4\Z}ܚw\^`딿q )`o/BQ>-nwn/EpaGhܝpX}P&*ZWuFUo2o~ $ Qf']^/13|e}!N*`t>7[U/qDrwoї>˯7U~RՐ~\k^N. :@.0Ӛ_:ƨF4dw[`j7ovMoߕ>=3+mֿcwN˹6?g?aR)*Y~(3Z^pZN`hѬ@O?endstream endobj 349 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5720 >> stream xX XWD-`wAHqAqŠ4lʎ(}h]DhEq&FDƜ"̼[@7I7oB߮{s1d2aL3We>(FmQp(fⅣjJM9zs#CwGxyXXOj1bgkkk)3$ ݯϘ>?xz`כZx[  Xis= p `fŁv,Yd,dy芰pՑ{=x{Ӯ6o9kkc̵}}if 3qd1kyxfLd3flbfƎla0f)3ge5YbV2Ukjf0kf( 3Øpf8cƘ3#W`L̛4<ҧWelicbkv׸o@_Inb}n:􋁫>d;%uCf 7tп~6i؈aMG /6glOs`G(FLSM; 2ӖO,Q P''F@EjT?'gVс̰\qXOS)O{:%(9lL+L; e(GnG\<o&} U$WUlS8D/ۣ̭ʃ϶M4wXixǑ㝋yˮ'U38<)=d!ɾ6E^x8trUh,],-S]I;Nȧ[]:\7+ނ+Or,1$_ppA@{IJ-,yi`TlGhGh<ȉ?2ʘ&kKq _R}V,q+?V]!u.XD8XSqNoq!^JDIQbbϠgY E DS>0#pK7 jX"9Q8%KrG!tS=.kHv6̋ K]F˿NqYtB:ѽwd߆hzBJr ',6(Hpܽp :#>=)'AI]@֚K!et/~5832#s)^bKR*h^T4$ѭgeGh$Uih'blZYs4doϮR>jUd&ȭ [Z˔;AЮ(ςxد\EP9~M7 SfR'Çyn~v`n`h|(*<9Z9{%0n%bл:*c'&s{Q:ZP-;iYghr򪱫JQBazv-=nh-s%]\^kaKK7mR#K]Ĩi(ǭn.SKZg ]Tle J_e#׭ QYP17(gF D"ߕ(L )k @^WuYb:8 SS4W` b ڱǗYt? 9e^ !̫dk(vU)iPz$5S-cEgWpmmJ3 !ϭp N9p$EiR{Vx zNYkmN;^PZ@5*OL^Lc砆n_坕D $Qd""^hAFn,p4z \W:.ג^uTUۏsZd;w}z| qw`:x 7IŇE\F0ν>`ECakW+"$0~:/[6}za#v8YlP+.o*pW#3UvM"? 68l2CIAg>QGduw0JԞsP(5]mhQUekS|ͅDtxP"ث O l] t Wou6S4A}LŞ>t^N[i; {XPI(7*H/#:a/6Mzl2OiP8r ͻ<|<=|憏.A"ifm=cH v'Oo%˅0Д:ntd 1U/o>>v lyւӛ%yˏ gN1EqB)_Ǟ) --;Gί~w۝hi˯Y5 $#ވ&h̹4&zww__wzߦ&,*P]AyLk˒暈 mp s {*w{}ӻ_~. Jʲ/Oݣi6ʲ8nw}Iϩ[=t-nȲ&}.=8%GNpl^UjBJR Jd%`,?YJ_ |+GEy%8Xe&nabҭP-=* !6mzJzl?DcNhNzY2vZbBRpĻ8O'kP]dq^I{u͠DIw&Ɨwܻu9ׁ+6(v@+{(6yq&~bWz xRm AݻXslMds ߽Wy6Gф|{ WǯdO_:V:/:5iA:_|fVwW2^Gbї_x%ykY&#!0"{e CFu1ĞnZ%'Ѭ^3ۛ. "tb \uQݿ-N]Zdk+,ZEқU(t T-$X)hѼ ;舯E-Rg/.!q>3CX1&P0jFþʺ-~~BɎr.M$$<.VI^qtdLqpѻJK&AIy .KavMG\:8j\\g<ۀ<{;2Fs%$Fo>uhʸ#[3@OFnj=>{ԞM&E Ձd)VHoq3I疢50Y\dEa_@tecDAdJxkx'S)=Q~q;4ΣeNb4}O# 5Ty\Wz@^F q¶-N].[Tb nҞ[M ZQav0 ܹ༏#aON][gnp8M']|UJS&师vF}gVʫrpPDtEwuڱ{WW[mIaVӭ џAC 6 q1Cg*Zڏ@ICjUgJT jB[/7 &瓂@ 1;I_*.\WAЙz8})̛h v_.4|vT@&es9b8۫Źٺ/ FGG9:.p! ?3S/#1yc6(Sme#}d2endstream endobj 350 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8004 >> stream xzx׶a X`z3qoݖlI[{/l605 pB @Θ#&ro}<3^{3Ν(@ b8ӿ~'# ־[|D;o,w(+~Mo'rE yA;=XC*CYS6T_% eKufP /Ճ>,nj;3tlOܵbcf_[/>:.K&Im٪( :AC]l=k1!xeK<f#D'i#,gr yR4vi:|KzCh CVH>DhuF6+aUtK8 e Y,,Td7hPr! =gq ]Ƀ4PNݶbWO]8~-!T } tk`.8_o->t%#qČJ((kY+#M_HA[EKCSqJe Lk̢JmR@1Ҟ>B1ULbTmԍZhP0~: S"wk4'hɠXiSnЍ#AJed,[6_ңF+$eP>}"d?N96{TV/,q`%qzA=T}O{#/}0 {?D]P@bbv8:‰JA8 -Q(=`Qo302?نsG _*$%x.KgYTC!H{DlS;UD @䎿Eګdo{j{BOY{%h=m.56Zz{B߱Mvh% & cd Sq x4,f%޴DhsHh4Ѡ%GB,9bs7 6gx'fFy ՛˨^s4^`ϯ%;[ݬ) 8{fЙtjdA~H<,? NRFYLW;Ru k&` c9.nP3 .!?M~!k]'aA,d1;QM+N l"RDHg$Jx0xȲ%=^RX2);N"4qhZ~ϒ~edKpYzlՙ`&`a*-k !1aY B{c!ZJ?q>I? ?ĽA @_h/ pfGFݮܻu Df*>kD#ŀF!e𘐹x6Ȧ uޓ%T$$١DQ["4*` c#EَzuKoDoXԉj)>HU7i*a4>sM(%h G_k@XdKE\X- Ɉ΀n~'C%N{~x^^(ȭ y&0`ls2=?ت 7|G >n$c6y̜q0NJ&%ؚTh@ST|鐪p>͑xոf8eb8LߺPT; $BjGsA')!6S$'+*!dmgT"~TX){4 5Pج/yGϳ}.dBFͥ^$rZ%j2xU X+s,M3/[18k]0+d<;a'4O@k%kuIX hT˨/a~0 h0Fiњ\ȅ̔,Š, 2 h!:c7o/3\sNuy_3qU~vFDAyptS9<́?@'GL.#1%?خ k ^'?A3gZC59* :j2|#(PfŤʳ}&$QHC6qGɰAvQQx#+uj6&-5GTonHm6 >ˆ[5M|WlKS0%HNk2CrwsV`-tX⫋(,ҕ$nSK*dtx;->p|bbA</%rt_O e[~ީQ88hm1 "R&*k,D,e (}FbD#ZI1^: kaEƔ =0a!G?}WV`rzFLRǢ)wgWyq /0E/g)܋FڷuʊQP41a4IbvX{]VewH2+E)c%Ylz|C!cCg&@RZQ+kpݰ`g7lDFm SΛG,)BuþI,(P!JۆG"4lqRL'ع=sAUes 4F]>_d(f' uMASZ04$@$I w!Db\YHB^b`]|!!TR>tZ,9ILDnlAVqzialkىsuJp᧎z7.ILTx2 |r݌"w 3:d|V]M܆5HT{2)2;d4J>=@aKe)hB+p\ƠW׹eKTO{\VdG*d1}oQzâJ!GTǨs2xatXi(!YjlWiu<5o+]O+'BiZm3o*Ul"ַyx2 L0[cW"J,PJ=[sBqAUJE`~՚tZmq HD| ^.;EG 9C:||ͯ^2%݄(.73MƖ?iYRr)<`uᡁOŅ'\\W\UUVVE;A}Z 7G( l2mE0R_FBe$dN聜h'8LfN!o;dBy@Wd>4h3(QͻB%UհOO{/9m"u5%#Vڮs)bZIJ#+٬5%&駈WhG*K1K\li͇s%i3l-Fadr] h-SSރ#rZd>]kᐩy*w'lx̅" J"$D ZBX506𞪘v^28–kR~krU%.%(J9^ֺyyB: iBVѱË&O膢ZZ*r4y-^Wy-J5ŝwo/mNEooNkԾJkaYSȄ/W$G:[|*EF3Pnp;4m/ƒ9x/Sio@JR;rhmkr'=%MSִ/mھ5 X[^'8K[T2'ɎϔE')8&9R2RD#R}^ʸ'wk,|mO+pU07y¤ N?kG|Ur˩6=5V¿9\K'Q.˲YT"ٲQk}·; ƃ: .DM-e V,@<yTs9ӚOMn!19a &7?FO|&' }-Ŝ폂.gyxgT ≆3<90}'g[!밗d̃mįyZTWiʫdb\uW}ĘBknř+N2k,/}XQ:Qȥz`*:J|TTDHP% dPmX4_cv瞒$0:`hqϖ |', wT0kM7 h;pLLw#ovq(`0_Ⳮ;I R],̡N?z[(wzEݦH䵉5$7MR"I%t1t AB!!/]MK N܁f0l/p׸fF(``Wm\KtBCYY+3qۤ#Pg=KJvojQw飏74 >3< 00^FFVdyWHbcLbjrjPWmr9~`'a#קK"kt-UQSEv(}Au޳M~d bb?CA 9q"pA v97Pܪy00rE9w6b$./2|ToL!] EL ;K-]DX >& ~0pR{2DJiރ_U iTHb>r 9jz6nN ̹W]8oU>{Ñf<zsƄk7:pٱ Ab^d?F^vȭ +ZĢ3+Ú|a͜MŽ35ijR~ Ocm*MADfT󥑾O8X2'G}m ߾s3'o,=^ |·7Q0eSIC=u1,ܞ㝲1Sw:F-e?pAz/Zn! -S4sKJLs- `a]sX|O]pOq#9v5K.M1-En]]| $GV|V&%;3c%h:bncsbj㼍~U?p5MΎme#cYZ!YS(Ľ7Zh4{\5]ˤ'kqvx5 wBbff'Y,`RDC|͝tɗzSOK,5bp$e=?玡N9HM{;ju'DXv}ߢhp^z)xK!r- -Jj]yX)+J} Q=(Z4Eg .*>REJ~+x笔C$US\ZZP9cpMXa?&m~|%|]f/w^ANZFXժe+$r9Uw9o#](Y'3A}΋I 7Cn! *u;ϙLZ@,$Q қ4Ͼ:|=+8B9Fr<%k:XW;%'q~ FLPyәn#aTt24 Ad(Xtb3- 5F|T%* smf4Bxa XN~^V_*!9EIT+D~izvΡ]/wvEٽe]7Eendstream endobj 351 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 396 >> stream x]JAgj?  Ժ!R A 6Tj]YCbMj2*%t)z^{uGѭ8ݵo %-[J=>ۛսV^y2oϚGsqRQKMg0'WZ$^PnH&L8D)> stream xX\S1T\WA{TFY  "aC #}!ARp8翶ڡXmk'O7H>ws\eԋESN hҼ/Laoߧ.|? bY0΁P IX&[1bYZLma.g,qu & u;<݃,ΕXO,&Mzgi! XurXlB$"߀`wNwEQll7. XD4e!v27a;wt_kZuN>}L6}̏fm=gԼ6Obu$WAFR)kCj 5ZKQc(Gj,DS)gj6R&j15L-&SK)+cj JQ({j:5ZAͤ ʔS)zBQ攐J S4Q>\ʄGSBʎD2¨~^{KNxhQ ڊ-D2wEq}<Weer߂~M{k}6 `tZl)>4tc6 {:,쮹yIC%C s7)}TT կ*P?hE8wܯCi@(15&11E1ը{MVzj 3}#=dǷjTW7:OA4!l:}y(U/"5T#DP5*O6W хDnE𮰄xyBUuh/~\N2)3CU2N x LלbaMvo48+Cmݕá"TbCA(F7x;b1GSgi<98QPj<8gl&ŃK~L9g6w;&9,;u(TJDLIGJvcgaVҼIQdJ1^.|}\&G%8W[|Òbd%ZĖ%& x9Oxo۟B1q/Og1V3~0oW/n.3wG!)˵va &f&IP5W.v K̓<9FG܎5 /~1 ]|3ex͓Mq'ћԢ_+0a>">RX~GǥȪSQ^\S}tֆa+yup/=6k "m `/jYNS}#:^w3ݝwTQ g2Y~CLuC_fp i#(Yʹ*]xNloŸ)x/ݵj˺R.49/1ڈEHZ[ޔϵxO%Оi^ Ywә0MUf5TX9;[dwxFG` Lׂ1UώRNCb<#9Iݎ"7ɇx+~Ѻ}|ij=H=]WzMk/EJWZh8661ѹ*ޠ. AB,#@UKO#PHPP)§CݝI4JTtqU <;vIh@DܑKOP#ަZo%heC)u>Jy9Tj[:\Kcp߸o;zVG?,GJd^:jRTfѴD;b:&3g'7j?.3+3 3ripHOlx;-`JPjjUVyA(W:,ۇz#>kF'WG>v-%ObIń$\Iq#yJT_a[z^QYMwf|~x)GM(8KEvp j`+|N5#fe#5p(d뫌,mJPNzz;糘KR.f6=R2?z3##aC-6Lj) entaMw{wwfWwk#:LC<3w迅޺"[ЎtLo;B I( yG6-CfWq#Y3ռ8r3r aF4x}JԐHb)Z3PmPү4&ݎ@ Y(v"mS4UcKj,žQ|褲8eB$H0zw0͌E(JgGI=R#PzV*`Janw<fy\ vfZ?*K[l3sѭNׂ)8>]RDLdݑ/\O&ߏSTjS nBUih8D?A~jvl)Ng5 wh1kEy[c̨|T sr 3LzG Ηeב. dzܢ#-,O@%$s+>ދ*iհ[oPYZ 7@ef]QsYgq;movnq@ÜadnO-o:56Z,Z2kUuuz>oP;lȌ|lЩgAӰ#@RV3yMvg? Uj$ XejzO=wBC ,zZVX|<g"eүw\p#!j!R%p;c2`EE vNCRe1ͼW11 9i%r@cbNE=A$W_<B;7H:.9wgcګsPĜ[s+6ڠ V.BO*Jj5j:`>})8؀v( 2zaFa㱥o[:B[E®ͥWaUZp;CĿǀNn_:~܅[֯uuuH،<{.nx-̯,Hؗ1%;lJGIʶ"f3xy1b"B|"I47}boV`훦3j=nSGQ(~w$JDх1ih7];f㥹 |Uq.v0F3\n9 10lQ *˖}SL(8^Zژ0 d eG;9':>9ְ$wDP+|邋P; ϳ@rB],(-]ZI)I]%3LY'YhL;s}Hnk1%N.'%HOC?;z&5V"OTGoԋy@HsjE! #2ڈVis QMSw篡}\`"'4K~ϡM3 [# ~?ZJjTR_R[[QQus7 aks7ejzw5جs.l"~=J+R|FtlЧhO6X=醫pxn{S pܙN}D̴)z.]s5ujwLt Vp΃y`PWիUrX"F>ɀx&47=C`0@7=Gru.+}}~_ 1>/,5(m{y9NDļk4x˗_Ϻ04 #ck~dPjRRMNO]D||%j|A6-jL.k17kOH;Jȼܦ;LϷB_HŦPb6GhWn?y2yH~ԑ}V6-Ii=w{N.b"(DVϨCp/l4lk<zK  iݽ5cqy]wUDsBNĹtF"FZTTv$8am%җL}n݇jgٸ$`<1.%p}z:qg왻jcJJj pE'O_ḌϷN[i#}U{z}U;w"B#l'gXMl^U( +LܛQ7xFJBx@iGH/N?]fV; 䳲3sN}do=/-WPD4oU )l\2+7,L9ez9@o 9?Ңd ֯S RE׫!X;iY rMZH>\A{%yLJ3p5 GJ/p脭ū>_sџ?847n笯 )9DMm0dhw߱8&+$0&TV]U^Rqa{%77Zժ׾{viʥvfi/**ãQ4ٌS9QHb2\ YzdFh-BY%ڠo;tn&9s;D=Ц͇PN@q#=83++RaRYwb&:HB%EbI? $t/Ρs%'0Lzgns6XVW{o 25-%8:@;$-0H4FlogW]`CsU}=;$UmS۫hV)A|u.OLQ$&( `oGE+vVh6&hlmk 5b3"+,%I.IMMB ∲=do~eq66MϜir?^V_*)vnfCN4_Y{Hi]AAvWt'o=%h8 5?wٓZ.$@!= \aTrf݅A&#RxExcvaOBL|j?l#pHBDUoeY.d΀X70'nv,$Zt>jH$#Q4WҨ36#8+6'$MrBRjQ8zum!l`#DD'Ǧ%E[ K`_o{w1ps$4X:+f61]omN]uW?lbodi‚<r}MzLL&(dendstream endobj 353 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6562 >> stream xYxTead8F!`@DR**BD@H!LI2ɔLozK/I!! ( ( x]xrsI`uqO9s?lXl6{6-Yqg:(sX&׊ϱ~Dó3'zN@%OgX6;9]>Y6c^KVZ`ŋWXƟ5,-6*), 8cgrD\TZ֌yŦ VP(\(9% fbgJJɈv2?mƶ# ]4m}r =-*eȨ>Z^_۩7e2ؚ͊=vG] /YYW^Śgf^``adebcfa de bg-dcm`-bgf-fmd-aZZz*]rV6D˚Ěx,Ӭ'X.NvèFl+N90*C46%O^gOw?u^§!Vh7A 4{/CiD[\:x"P+R"ᐕL/uy(fml4,fWIЗVu߸ Cpf\n-ARsf4쐃B 5%o"CWTXU:G|˵o~L18 1 L%eF@K`.]fjq754j&sJԩ@ÓrKeVc{QWQUǂW^aaHf3ggfcah5xn8pu!i Iw.tы8'גz& ɴ*Q 8xL83f/s@T\Ce2bŲhj6E_ӟz>C/rPڻmQ_bF w3'5:"wXaVYZ :hf{2 Zc*9^C_ ӒQu%tik> ݎ af -I v]Qo4hA5n;sЛIyRc4:ENʐ4s;_k![Zu.}kŪo;)|\zߎ akMbt-'uBOUһ0vA#MQ-`8̓f5ut$DSoxync4a4VSL‼-zNt *uѩJ ՘ܨ=3zz) &|Zb73}T7U$Pr|Z%h,NDA%&CIenL_ jٚu \ĪN Њ5NLzSD~%do(-,@:f 5tNzR[*irur܀nD~fX&T؞YS.<ܻvLP,_Zo3P>3pmQt}B~νddE"B~UL2pLz3yڋu,A{?,X/ķS54Z'ZrnNc;QMQ|<2[`+0T@z6ZtkͻhO "ȺeH|RD4C'Fx #-9;x[_Ћmȧp;s%5VYJP #쪒Û/Rr8-Lw\"- PjSD `cw+r1N(m(*46ZiRrh.I V}x}Uh٧? R,RWfzOk=mOu8 Ixh}9sTM8T| 3",Ke,ڷvZ-\^PSD_N>heɩoBV(5=>/%34X0ȌS^$LRZ-[<1/3Dpޑ/Ӷ s!'ݡby M]mN`LI;WO574TQe EҶ> tJ*wgq@‡K%G}O3ŃH[~ ǰʩӄC8ý {xs=f- <;!ϓ<ȒZaw@tiڽY)V:`Fw-(<xddOKIK[UuИMDČ-=xe.$.bE~?zG nd-@ ϠHE.r i=~Q随ܟQ2S,jR5%x4,n9hCh"MHANyDY\v /r FΈ^uM10c~ҹ5w2~ 8L(N\}?>G*ڏ5ί<,6,ပM3,曡Swz.-/=2swFI4+JD2y~o?nst[kiB+0:hdVA<e5l4+O]`'D+_Ȅ1a^?=h˔ܡw;?Cz ьȇ>u?3mY ۳p 3a۞L7ZIr1;ϸ%X-XZt.kptSjfܲFϼmT~]a; Fsd$AF9 D=[:pf=b-Oj)((q)SQ#l9J.\8z'66)4)݅azʅzlOb7CfF(aRhn:9\KY.߃ĭ70(wc{,x%T<ܝ:2u 4lj-bN%P;H65|*llR0D43aM;y*/*s5MEww&:za3_w`ofR|E&R/(5 "*~zDQI# 09\^X^WVt{pqB.sc=Ng7x"<Ͱ@מ>mѸES{sl,g3bk.}C?VkN z3KwLVӀ4-Va5szAzEF:-1.4'UF >wm\wPPSя9\;(܁ϧ+ I];a*:m U}M&0)AwE3* D3 6fPs^llH3}NOB/֜|pRAAAF 0W?-Zg7P'QHblԚ\<?zT\m`|[fn B,ʹPjߵWVTԺ{`ua U,ȇ&9xOhXDcHS~op<1__2|DHxcNRNjmBV |)㙚3/"pW.sEgΈySaPQ7F>>44Y 1l|1&QXNsb' a[BoϡcmTIKeU)A)~aiӎmh?>8]}W聽9_O?=hG\~A!!IJ`Y0þ_].]xz= ]&35?oQ(h; oR`zdBh'@Zѭ7N8es(t~ ho x9d7b=~ڔ&RˑPS5*oO LYSqKQyr/OO>f'.6vA D+lXnT1-ބ:"8#鰷V՛zaU h =ZyRZf*&x}o+k+U*%)HLb$2sݥ(td^xeż*XB jJ5W'ήr0|xs#y!&2" ŤNxMwǚbpu }!'A ]-ӮʛO'ǽ AԠK] ED8m?k1x$M /S_kI||-3nάe֞eRĻs^kTRzU 9D\B2_,+Zeɘf0BM/nq:=gHSci3CSԖ㭏"ҠѨuZ, GBD:JڠکUjo0Oitr/'V+u{=by]YthLm:3DsY}e0-PVצ/$<~Bn^x6?c+2P̟'D4:D}IԆMŸ1&4F =aG H'T*JJL/.g8n!$oL+tAj m؅8%<+]ą3ng&"?|Dnj;{nLaCLYz]wk!XquBhLc^RZ#ʉ$d.">ǧoL؈u@oQPT:2ek^uz%VFl0߿ KT4@|>!+Eq iºfw ?Y'0Ņ߰`ЂZU2lP:rk'YDb sq?yy+ǏuǏg 3endstream endobj 354 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7221 >> stream xy XĘq\Qv}kѺ"vz$;(/UM^Ͷc239s{{ څx-]d͚ =L!]WHxUٯf^]k7ؾKk )1Qi#FL>}耉O4<-:2!< Z&4cܸ̱ c)QFȌIX3`01-`YxBdӭ}y„Ȕ)Aap㼤 R.ڱDTsY]+WŬ]6>aYeޘij]u82đ  "CǍ纺;%%Uo dNrf;h2[v~{pFP+{o]l+I}u$_֫X^8Kwk/ 5_XQ:, A6DftܤD;{S}O:ArJ6@Ծ)9 pmx˯dϢ$g< :E"a/"'s˞k}Mg[ f_'7>!-ӤK,W7ݼm23A; κ6CP_"aA tv?ow3+hB'vcjIg3d:6d#~\UIGC_}+eI!?h zJ4سJK3&؃y`|ݤ f )gNqDc*D;d X4-Cs8oaCJT@MBQx@Mp! ]|dd=Z3Rp\;U=AW4%| Pu&PyBNzR x: %ʼ:Pſڊk?<{ .Z?&Nu|NL/9:c Gp)\&H~,귌lhNBv4S7:ƳD\T"ɶ1rWyɗQo󭟮<,eQ`> #LM'o>fP+CU26i5j{nw`,<@Á^5R)][1h Ԧ*Ll4Uu+ Ocɽ`49ڀ"A'MQ3T֡L֦)",P䨼GѠ)TmYE@>*tLUO% uz~x0p0:끭r5zl/N'P3h0c_c`7N竪3)0B)td: I>sY?fG.0JD[7^U0 3$]r.[QdSμ<־ϬK(g*Uv? ۆxѫ;&`tXkUWi]vV΃qH&_wbI.Ke ܉Z FW?#G]ҌU͞iFS bak ӫr2m(Ow5FDW](yB\/Ѫ,iԖHWQb\Zz5? s2xR76fLʧB(<﫷߼Q#A'5* ln.Y1H4Xovv~A9t]9(&4syzAV=TGɉ_ C(@^ j@kLӯ4 ! sP r@fu *jT/n DxB`fR"$SiiüBe5-4Z|j[Ҥ=Sko2XU_ҪmVTfrh@{ nL3u"0BGIS!]jA;>xůƪྗQh`/[j' d`+ :i{9Fp=OPQsZq;9=h095sVFOafrgDN7y ;p=o,qy;ݼ;ݷt%z܄j`T9 te-Ф&lRc.DoYr*%1;z晠?-s"ȣ)UI K[ h֠7 Cƒǂ7W'`O=`|i{RDșO_ WLP qB&BҶ$ESzR{: kl2  d=пx9@ ove1'[cMgwGЎ|PCUg,D&\*^TnV#X O(tV Dpʛ;M(gHO4y{$??tG\"F'jKEH Я!e7؄cF'</!w!P~tKAZ&, Y~fZ궶s*:}߾?pZ.Qa"bRAŐ+~4 *{`4[sG@}((- Þc}{xXd, CR3` kf@9{r="kKƷ۷ 8a"#}I8g?G]X$gH!qyG,Y>+ ʏ9{nm;xjaţwREeFR4J;=VU*Kzg`IuD޼*-\M7&r5(M :&oԂWi$nεݺtel"R5l=`c٧a1<ϓ~R  ^6npៗK rCi͗iHwϾE~VERsYR[p\T Ռ^ܖ(eai0װjK(HAj=4+^#ivUg-8zqբJa|0%"AciԿ'}tF~c>SNC,A>R8cSM"\edwq7FgIE+@$lIi?R e44hEپ9}o!"6NdYm*c#_:w o$f[Ae$/rsTށ_܎3oZ &lCjX8!sn_:).q̓6L媊RKMN<1iIA?/VwNg#,t $uY$ZF?tN"-zyy7:L})/Z-s1-kxv`g[~M]8o߸ȧft#z.~ w!񣫓_/2/ +t*:Y3|t)&yoi@ZV]:b}R,9/z5ua`. ٫wD(`\a H19Iitد Գᓙ;x<"iC|Tѭ$_fC(L=nMm0 kds3 ش򭿛0iOJ,ĻSϊH]>Rm{[vJ-rPQXCi> &Ai!ʸym0dZnqQH|6t8/;U^Xwۢfh ^\:A$`s aZHJ>jXaz,X| IBa)[SI:@)}J+OFw*oB> >7+n0u=&rt "S HŒFKCڴ~p:\Oӷ7o]v00u]R.)P94OfCݧHpuR:n#K@)V @ɤ,lې~\%X=Խ(4 \X2z@JFڅUbKs4:lNZi.4BG)xk&kJሏ&\ejO5HǍ|`l7y|]x+U[Ι5L2A k6;@UL 6z_ZA7:2F!)T롤a쮤]nFib֮X뎩1Τ; \'U tdbt ᗓ ňө[b5Yr%ERڕ6d7l4:m';]A^ڡPRe2,jkZfԘ7[ Kc*q3X3ֆp +|AI5RV;/?{?BջD؏ zЍiu11 I{3?UTw+lucH.K|n 1)Sf)%.Jk8a|m˹`*&NJ5Nu[C2 B@B(XX\d.̪Mwel+/ndBl4ء(5 X`*] ~_.;?Z^LG6sұ 5лURb2OAlL-Bw~)q$h[Hd&l &Qo;s̑EG债~]U57]ԱyI8!zI{W޽ I i8m/,1ԙQL1h ]^ XuK'5Nz%a}mϸD>g%Q،k3&IkU)eeHY<*Β|Uge;G:-\Y&Q"Ȥ䅙®?<&<-,9*.6) &˸O|?4SW4vz, xr\<ćU_]̳|x 6޻Eƍ5<;|P"JOGWWwendstream endobj 355 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 214 >> stream xcd`ab`dd v 5400qH3a#UA];nnes ~g"(ꜟ[PZZZ&Pׁ? 7~H/(>GhXKdiVB~FM|w> stream xXgXT>p (":&iT"UTDZؒ(KG F (1@l %ˍ-֙oMr|}{wwBI$a>qIqi+cŧɂD3D#݀S~G c)-EZǘ vD -!L2rY+Ll:2S+RL'Az\Қq)i+WlXo(Z}Mܵa%22zEQLʜ fQ㩅5ZDM`ʂ &Qj r,Pj.eEQ5NyR6eKySS)ʎGS5F-S~ ʟrFRnASJQ2 (CJBQC(cJJ(P 5bDJN))UL Q)gJrt(Wj65CEXEld$]rj!Cv+5HH.i)1BIb0M֘gs\WshЯ vk8=`8!s*U|Rx\SIՓħM;v@sRH CXt|Gk_ B_n 5tʜ.ħ 6/ f 7S(S% Dڅ$7Ā^15)|bToF 84 Z:֏`e?ߞpYvQH)QJvu296Sf4;LFe6MRJy rȀtr^sXx2~'jH:: [l7OVv36 O4vǮfxP}\ϲxډw2)OV .%*%*)̇n^Ԍ\V!Y(Tj]xF!B?J$5unYܭMBЊ.,+"SqQ7S&C&]el .!u^0yXhϼ{<r;p,]Ч>+Xy!%14j|Ӿ[ އSRo4߻S>J(VJt xτ Ln>ŕ5)=0 AdU,V7vBvhnڢFؐi0B/' i͒N)|Ix5LŔc_S"oe?پ)/q J0صBIJN* wָY3 h͊ T ~c'P)EUy:̋\`5Cc[̣ UWp,pJ_?bV R(lq M-]mV(9֑>SE ?]fev<X 7 =`&:7US UyWcCl|;p]̗wN#5 l^BF-xXN7KDޜeSoMo4ȿ9v},GkfLZq|޼X@ѷܟAܟ_0\>TC@sZ pBV/d`..~~1D!_1e\(+aN!q@!=VV6 _bҵ 8D\ī )l FLBX#&NQG4x4srq.dgnn{dˑϏbtzç:v u鳤WeNZpڝT-"FU?~Vm-ϫpƐ8q$p[Cƒ:8Aڶ ck 6 ޖsC$E%DJ[ʿPQښS(?UA5ڻar8GG5D@64f"E}@1ǙNxڙ+/B]軴ь_A:ρecAzЏ6P5YUF'V:ac?k\2%_4 59nw&ԑn1_*5C)}]gQ.h*!טԸMQ;ݔU'_qOn/tY*tA&[L_ IDKR 0WX{yy41OX$m8dZTx,6nK/v>"|3yscKBjg sђKeۦ/( e-R(`U} aAܑե-X=BT|h96泝vy/u} /_=qq.Kb7?\BQ{!\lG9(gO~<({_,B?jw.(8vQTo- N}|fI5^jWf 6xB"xn/LXGpښ2 % MDp"]5C)s:Ľh575I:a‚5E.OzB@0&K<&4fc E pmThjpR/l fb ϸh(L{rAX$ &80<-Sw/omAOL'6`mY3Z~}G эA`XsL9dp) oIF`?1z9i|Iky^?v~~#/W?8~5s8tigi"wV:Fl'4̼,ŏEr^zBk^8!pg D8Ԩ5,ehb]1A3A[#m~({)<'P]ica/CYmwcΊ?dLMqW}f"YLD~hVF x/k?oI)*Bjf]DzEXJfo$Nc $ 4f3,ӿ5[3vo@ª{F(߈OkJ)RCX,p6d4$]>-uϸLWF'm[xY,ژcv_Ch.Q Eժj(j7jc_yyUv u| 7gl#f*v=;rC9)( f-J|,)3XsJU'Tv #0䂙^l^v@> cbn] fmaB%P[ ; RoE&x6[UN!Zt]Go=up3%W80'{$<޾K[@[tendstream endobj 357 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3181 >> stream xWiXW:M-7UvQQP1*ʦ@" C D#MBQ;"Pa4K$qb\o17l3?G{rsν`fBKΊLZkH^+/J LiNїtj͉ZyNS<m[CR /r^eqs ӓ3=&xc|e$% +.ٰ!%.534)%vc>"&5C/W3 6;9g_ZzF`M1ceY !1<)b '\f4ƌa0{f!3"ƙY,a\2Ɨd0nrƏg&1$&d&3L(32cb,kƝQ23.2i*Ps]aO5C VyQBBЉ@koA\@]Ϟ\H64A巇@= m=!P%? l 8Jj%Ll9P]ცzK3m"␱3+g.ku&]#]m<ҤqZ88څYS p  s7P6pS^FsoG%sɢd_^iL0`hQtH;%3aсz6rJ''g_́K䑍B fr-~;V߆7I.5T7T|g*°%[?"jcs:M_y& )i(dDIvAnݚ1-auDZ8E3d­0bEvqNilxqQnM'k]U=`5Mf/>R`Aa8ܻ31WW w _$9]FVc{3T?D!2rf]BGt9mu`]MC 歄El^!?]i=p<vm-Xm)΀aښ~+R44~Zk]Wβ&BO^ |!#S-܌eqPۯZF#H m^r\z-Oׄb|K`HV'-桄KqH}*F꣋>oWQ'#4?(?ށPQgxo]!ww%/ƿ=z qwp"NsB5j|;4"%<Ŝ/d_na`ii?^r);S j2V襠;T ܢGFH ˆo38zh3Xt.q20K&o2Z;ɞɛؾ6HmYvqa §5m:_.d<ڳ1{SR>Il˹E7FQ $c-כ}\VFw>yo] EЦǪ6Jw$Zҙ,ઽHܰ6#7vǫ)Jc̿^Aۃ" 2/M5wn wQ dAz&@ߥ? M< ڭY.}HA 'gei2`5zV (Kf jk%=yܑ :7\m}. ^νL]څG 5VFlKo oRyt6zFrƴg6` +e-̭ly}eEM~PB~a3:MDW]:Vq_՝v>'#RWC0^bMi͂^УX7 "9h,Y[:48:c ql߁~BtI7qϪ7u[g7d w/=V]HKI &zoɑidmsE5 oB;s)u3gN'@ TLX)F8-҂Qrmsu\!M`G(C:W{IgNI&ԃLuH)2T~/ [hbk *-endstream endobj 358 0 obj << /Filter /FlateDecode /Length 162 >> stream x]O10 ڪb UqP(/ СY:ߝ|mwFEehvK@Fˢ@[;'l{Ol&ӵ̫r 4{$hjcA=0y&:?M%K17MR{;RB|oSendstream endobj 359 0 obj << /Filter /FlateDecode /Length 15566 >> stream x]&u;`8a r>)}k-:]0$ds?\z:ϧ'0_}x՛zsƿ>_~|<(%=D=t=#=>i<|r{<}w<)=w/n#˷x|.7O>>Xjy2_8oގFʏOqn}|;nI)=άG-l!iGY+vӷ9Y{}+[^e~[U_:@*m(4_[V-8҆Uѭern5Exj/۔y,g;Ojs~S|FUaMƊ=g^V,֫e q>g{3.dӻ-XL41{¸זnW ޥayu^z;QQs8zV]٫>^"HV$bU-=_3/Ǹl!,yk23[[v^a<.9h*} jz}{;tDwlMjpjf= >JӷRff."q>mn 3c ج8ӟNF˭U}<^? /ci{l WrzVWQV۟ܚm$^o߯[xe~7nFFǗ9]/6ڹfM?Ҹ|9E-}zu=~J՝>lx\8l}ٺ˖.3vlu>+_O#kIRlnMJ|x6v?0|5aH\+'szY*"V+ӭQE`h?s\-qRˋ/9^ +N8f[+O%r!\ˏI&@,V- ^na\sPmgfTNL1eo0tG4=̨Gglo3@R7_'YUe M 'n\c[̮fxYrc[^6yϣqܼ}sni݂~$OTa7݂dyh$-ފ.XN.,WRGXNWftmkaniިr`LŪ'lƒlA hibÂ^Tl9c_Mr庥c\KR(_xS7^4Yz+T}`i>GtcF 5_TsXmwQWSbJ j\=aTTmxUWj6ÕGGU~F/_- 7#bs-W~a>>gf+W*nə3= -R*![VJ̮4*K[CoVSyVl'b[xmHV]C?sA] i0\ְbjn}X]E_ _wr;L)eXp#j g#jl tlbT)n勾"ٿEqQcaSG{A6ŕkǽæqa-%oe;,a([a~=8a0*(Z9sɱX 9y9Vъe<0]% _;,r#XzP$+m "˅)X[|׸Ȟ-δmR76E'㴵V>mkg(sd%q8:íߘ*ے^OKhmi\ }C <qV loQ\@tmk,BųbUCslM[ֳmmtg+M1V}WT.9fNҰu|)J{?\g3-ҹmubM80qߧBڢ"xƖ:6a N4-􄮙8b-S~%ٚ:Y=EFVidzw3˖4о]A,[ Ģ*"{06`hs+ΨQb2˅hR,& U֩0eic(S,zx \)r;zoOXzLkۗNk2M-)O1xdD*vɖA>V$Wel>e'_vŲ%Al@_Ι1KGwm.>p1䂍m`oĚ\~)];Gr{E>´eT (H s6uH_'ֆS,wKjpYl)?Y ;*\}P+yU>1RdRmn+tF,&No7N)ع`ɭ?rg&DǴRb`k6pgw*Pfz(Qv@-a5jYٱ Q#{G]߉2.fzXoeeY} ڍWp?9SpGj|+|_m{s9t[CC:Foto.D;;soՎRv7dw|{?N'uT(mas[>o8T{fԐﲏHn82 92Or?}\ ǽ-m}y3[۰meEjqweXƵs 87NKG_zT\A1lڼM+aG9VF7!Ăܨ:GrvܨCȍZqbw`Flǥܕ!rQerԬy%٠LQk""Gb?GI0m"7 -Iܨ,ZBn!!7j6VXȍzFسLnsˁɍ"8eɍ+t?yX?5+ pQxx,GPM!q#DIGmp98kpr y}n#Gg'G-#"GE#\M<:N#O@);Qv̓a#A"xK~!Dx$ OO;"ͳ9JdÜxJ`*! ܱœU< UF#Ye()1uGG&ȹ Iђe露);dɎK<[BYUG::DGpIt$MY.: I#]#i6#5%:): Ktn舘cj2SryDvI*7v#Df($P r Fw)<*zSx/@GU)<3U9b)<(l# N4GBQ &<*]HJ#FHxTm]£BQMUؠGEMP£ؖ𨜢T}G%mIxT8-,Yva- HY3'ʣ"5х;T%ʎ O.ّ=j3.^:,DG_&KDG&:6 jBG ] yNxa GWK"GrCБ|NEttDDrA*eH G0-$G$9-pɑ5 Q!9RJa7shU_˂G^ yʨtP6 ᑿ`@£^Mp"x'"k"њX6 ё[ΛhiL,R -G`S)8b |HDQ6u ܝHp8^#ޥ88Js 2Sp$`ꍦbf 4g GKt IMQ")tx)#)@6G:Gyy(I#ɔHzo#]#hjH'?,͑6KrJoZzBDFT/nz#yzh+b%6Ÿ҈ڣ4YB# tiͬ/,Kh'EL5R]F,yʩ$4[BKDk YBK0m ѷtF$h*{H%4*:Shb V 7In;uFOQٯ2*"LQՠ'VPSfxxɌߔd QdFgH%3rs$4)4rN8h`X xF'v Z\hY(4Z ڐdHB.|9FYShdF=T5^*#bį5 $3dzaʨOѓTF/aF2HhH8eF|” }S]XO` vSHl ysǺBȏS{DX7Q9=ja2. spQ,a/*6z2ŋdȋJ"P$!yVrP&m^ y1}풟KOٶ^Qq<~R}eΟI:a Qby=3疙~շQq6 *j**+|=F~0lyGx-) 7+{OsDȏ^ZѲA-1)&-)a)F4,Οο οΏt̟G2Ѐ(.Xt.@#7]=1;O@.xU?n\QAH #YY :8DDu6d<B'XRq~~G+C`AA[Ge)IE {D[mhS7Q\|EɎ|. c=dwW Lj8IXx;xTš1~' _S~I97 }Jt P#]'O~DpWh,"+A5Š"aA+D#047˼`x, ]ۻ. ƃ6aH;OÂdƟ oAA(h-'~ݼ^b5ef`F׏XТ86+B/Svo"O~τ.>iPs`} ]7 M̵XoXE^NՂGD%ztVWѱg^Â\?Z"&~Vbqp;G͡~":3 [5o\?ǫ\?^.~9(הF쇅`?,",e^ Ehg>2n: ~Xt}uLRHWy]X?1c}?,66鯦G.<2x0ZR0͔$!'~%$>G}@a BgG_ 4,@kb_c #ԏpP?&wOL?v>mjӏ \r /#_{@A.ޭ= 鯝ڭ GTԏHp͚~<گen  wD#ߓҏXPf%>i 󣟵.K<MצB@?,8A6OeaI r!Џ r?+dP<-}vp $[#_aS_<`X@J+PAFdfX. roG<"R'J"߆r/Wr\G1/B/><:04,h? hET/w6om`yy#]z _n-H(K3[/.lm!(y ol?-0֟ %hǡELa]oLy_c6$oly'Mlk:d[K'ۏ׉H@aAjx!ٟ\s/~i4O-nؿY %+ׇ_ O ۄOhh脆\ 8/lț!߂AK*62kp `4x_(~. .}Y2pe$SCS 84J!rޭ*P y|ITѡQyeҡ!P 84ڼēphD84jծCV < r"Ш2M84 o , 65u! ِ hY`А;(TIFGDC%]HhhZ&BȐo Cu:Dcaa&" 5HDd)drt0@"" rRHDdqa |4}ɏ(Y,ݩGD>Ye,T"]APD4/""$}(\E 29'%"\;2Z;!Qi;$6(2 zHdT3 Q>I96!Q30`$#YEE,  n$Y/fPp@CV%fiR]Ye0YBw89QU'T0YO'Nt'HY*YQNVdxXQ8x%*XQ>I^CVda$'+c',aQT2FNҢZY&-j  Z3D!-C1ѢZOϻ 44:vZd)_YEI@lZ(eZ࢛!xѰ (fkׁ2 xu A⢑}Eq E>{Ѣh4M4E ZVE^$WEn|~NT"/ c/iU8Y1aU/\bE1πYr"$+0(”] D@z]0fNYQ,]bŔ֊Eh.eı EG@](IB KOB@F 6mW0 `FauR0k~npnx2#La2b180(Q ^3ʵXx90Z#mȍ(#d:I" EAHA,C߳12$12EQ,u1>S;N3 '$Ff]jHyH92-cG]ji$FC,ܯ yhI_0}F2Q7 4*G,>$6Y*F!62ˡ7rNK8s IoS㤰Y(#5p 5ʾk(҇'RGDx"Q4fia,jjFWk$6.˻̠/YBlHl A_㘿Q`F1ZH E4r#fc uFNPe؃ReQxhp#F1`"#7 @'70o%72˩LXFٝ7~ 3F9nCFٿ4N)=E$7l! )5%f61ẋ,Tea'5کQv_S٩}1Z-<URPǤF 67WFQ]j"62.%668`. ppF֐%erxeWZp,>8 k;8yX (rs ?nd~Gh,ЇΧōbnP"zhJwUQB["՗]U3fSUTxK$}M"[B0eE:dEWч$+0$-U%%T]HUtF*]HK"\"?*Sy<yH:J0ʂ,]bITt%**Bz KTT)*o!DE9DEDEtX"*hOvUtF͋@%+a,b3X¢麟"/Hܖ tLmQxʋܛ^)/c$ʋ6 E%/GׇqK^L^2ɋb"JqW$uX/K]CBGݥ"Fq8g!.d;9E⢸&.ɝ.r44RŅEukI]W^ un.0E^2;:LqH(yťA_J%/A`DRy:0F@0GJE0r Fp0%1% $FB)hPb[ 1J%F0#op1Z W#Jf4* mKʌ[Cn) F#gI41Ii2'*|ک=Ai^MJѰ7M}F^*(5r~h/56ShJB#OHeNoBN&:Z HEB5Hhkh 2Bi>5$<ёFI1{b':h1FC̩4M HJӖҨLQש):"3F]_{J^̤44ۮ=HMtFn$2HqL$Sc4Sc$1%F:i$F2`_*#?.Q]ʨIg$OTOQtn t~ q :kJJBF+;RW/@4+4U B#_:#_::.u}E:^D:NtFjKg+Ψ/Qgۚ2>̨ yLQ7|Jfuݔu]7eF)3T/Q -uTiTF]nVa,{Ke$RI3FK3FLъ5Fj v`^B#}EB/LNOQѨ3RO]:NZ:#_:yE|~$3ҙߥ22ҙ2gJtJxJtRMmR'QMKe4f*M9/,ʰDF ,KdDR$2I"#]1EF*I25F|!4FJJ.hFBBV5EFWl"#]dD#Qs{UFK3UFWMQ:SeAbg۵ID0-P֠TFnv\eEE2'bxLN2#_b=Kf4Uh.WMf)߾6ieFUF%/.3Y-Pf[<?xԊ-dSxPh &45:FB#wXuMh4x% 3 eF꛱ 2QC-)5F~((¤):WQU#_d^ ma1r ӡȟE15FL c(1Z1E"#)h[$"[1Cg*5F~H)Ɲy'hhK1&"*Cr4FyؘJhPc[1rKi|ߠ19qyh_@bC{;͚췇PJí+t %wndB-_xWJ=g%ʸ1ZUw~K)͖9 hK<Aoo6r4 Rlrw# X +ANAb7kKF=L=l/>h;xVtdT`,Cf!>3}|)l `޺,sݟ-il~wo߹[?Hm_}ۇq}<=t:bF61bǯ"n6Aʸ,b COo{֜3vL|ֵ+UOGed<@`H*;Z}nsV}WZ~|{PZ,}n km_'Zw$l|n{C4^Z~9ܟKgߋ<6IǰԯŰ28] 6)GXUh{u}U-;X[Q/x- 3yN_5,!o`endstream endobj 360 0 obj << /Filter /FlateDecode /Length 1639 >> stream xX;s7 Wl6|?ΌSd\q'Z:Hwd%rW{x$>}濗yډfq'ӷyO;l'ͨSzN*3:/(Uw.$}aÅZx< b4!)O "Dmio*hO1hW&r䚑*tߠEQ Oda'*=9t HJ)" A{mp JTN5I\{لm_WHc[9h3#IH<דVl'ho[EMZ@&TsR%U~R]N `QJcVlqHz3 v5+OHR0[ H7C?n١H]ۨrt 0  l0QaiE5J|"(YeƠט^eǨcnKFM%->.竩[-3#+h YxEfOle 14v²mE 4pEټC} 9,hzP5\pSio J*DL 95U!XւN0Y\t syaI ƅ($Re>~ %Lnl[l:0Jh.-qڵ~_Y)-i[_n2->zfѴbefcf/^ *> stream xM/9ݷOq-C8/Ir!2,6t^(h䧺Z=ۋ'Ή 2d{ci~g2Lď_˅O5ʗwח?|wO__â~Qk?ܩ|+}iq?}_GO?\rJ_a_Pu#)q}_N7?V?W3K'nߟ+Q S Wi7 j+_Gz}Q|'_}]寿rς19,ׯc~׿=Ow?N=ڞfyK#7w0{`KuOߧMgӜ~ {{PB^[G\kOV% q,hF*_ݺS?~_|y:䪽j}KYsDžQQJV4_W1:{kyrK 3/˞of> 5VK9Z ߜ3c~C*>Uqy-h_<_W׿fG/=?Vq660q2^2?~41;[Q9?_ ?_7t3/x9ijb?[.Wm1.~ ߩW%ҳ%F>⯥wB?O~ O?>Uj_:q)A{jK#EͅJZOs?/乔j_|NО/?Ac2\@s*eYT:5*\̱IJi*s4mʸg9LS(s~9*smsSk~Sw s<׽>.^}A9Lwؚ>.ϷH͒NeNF> X]R0I&svq>b )̡l*sfX}$sVEϹjOP7`P*X-=y9ji:U3nTGCY:\*B宲~ _̹j&d9jTY>yyq[:ݪ?"fmNaJ4Ws2;l`[0e.Z}6G.P挑7/ E-uhʜ˜/(O=ļp$k ޳+~4]͸2f)S.} ϐuf\p޽>g37uTVD{jz"5qGyf̗\+7=[ c7< ʖ20sE̗Lyg.U@q٪xYV3/e&tl ʣf/%w>_uu}WgK~P>b]^ْ >9 j晝>[⿙ _S˟K53opVV3y޳zߦφ\ѵ67L cARgxٌQ-u'=1eW:zy”aof[ox4 g+X e`錁)'7YϺ |o7e e8lbU_☭x@j51z c` i8,β<`~ueok*Y_ˀ ,*Q)Cb5aؐ) T\`&Z)wc,N/?*ɆgP/yv;2^|fc>_}aT̷}Ys;fFJzɩkz0MŜ{|˳7؜dȇ11՜|4*q94뱚uf+ƨ6;fDכnG3mkEσ*ۆTِ1,CEy H|Px ˦k6d̰rm+ף*OP95ϗ ƌ44Lظg麳-c\7٘1.f&^}+ܼ&-w++mbjЦmXLkTfLu;fXLeؠ}fBT y$oaʴe*smdՒT͆ҩdGUmTs ߳guUSHV)ݳ˷J(T JA`R`pje>TQpS e5[1Œ5[Ju6ZU=[1z2_Eկ 퉏z+X]`6atw*ݺf2k~5 (dʥbJx..}7ǜZfSv9$lz tc-Q^SWke8XN,?9ZїZS\h8X럩ؘq;md|Ky$.u>@_ٯUU;;C, -6lIZ kP0UU*/<0j'SxTj4Ii7tmeFm`1'RyeTZ\6&Rc K tB,lt϶J m1Nsj+Y'ia[(vM֎b3 lgJDm9Q_(l~e>:v1/[˧lö FJc""|RRJ`+ؘ6k/@lkُqtIGBqxaTkfx і|; c@B8ԦY{~ָμWOo$Э!TlQli0<2~O]nMͥr(͆q{o C⸼aٔ1$bͯsSL|1|uXnWnumvmTYjrڤ`BlTS'C1*v &6lk<ݸwT-9Slʏ}>骧ҬcݕabkF<cKIH讔ٔs;dcxSm`\o&1mͱ:X𠘥2%1>liQ]Mż3ȄItI(9Cq1"Sy>0qFy VDņEP>'"als9tSGF4eβhTDYw{cRb$ͱ^8o~Z6O?{(tUFN)TuDq`v6g3GzRWS+cpQxl620S%*s~Z/Ηwt*c:_-FxzU=߰ ||:X'?:0ݣY&60;ѩT֌ʦX3)9::[YCĴ<`Jgոm*C#7:9ٌᢩt%^FSg3q'T%[+g^!C̢Z:[㋒:2Iٔ}()tS(8p 5+b'̤tV;bHO|k.E`5Wʷf~e~},7msp!KZ.bxY_B#|B9j7+)*z_}Sj+_~J1Ѽ͜JۋṋukJ}]V=խ2G[ekahsȥO_O<4l-t0Ciڳ7S]4XW ]4>MQSq2և& ())8cuuDvSI,m$+$4Wͳ.ZL}4xB>4'Eh0xX9qδɼS%:iVpc-'WpڅuJ .æ+}4hC+ܢ]tg, [`C8#~> drRlWfs\._*DܓS1^`_3^ie, `qkKL袁p e&PMVqXm8(aمL ${nk,cUhC✯4*q)}6Ơ!S0=wQ@(#lMXb9Wjl0懫tC~m &s+?tSg}ơGyZ戈噃:[[=)SŜp8j#bte[MBf!1>:Y_m+|;aRoCb !+npT*Π&>3hVŞ4=h`Sw߅EB&7e%VI?_FX5r&[,F+V'\⭕G@ d86Nb&>۲ ۏUdt^Cq^NYE' 6#vqqKB"<tVMzmFF2]SGFYxbhOϦl Al5!uܮd3{>_ 32lUݿ͜RG(U#tD2#M?ْM8p@&RvN&KFcu1lv<4C7}UEZ>j>rNOFܤp`a`ؾ2K bZl6.d6lbGNM)Myl\DlD9.[Mx6ʇ%t3G]W:kϭw),p )pJ Fy2 ``)Fk%2z0.Ù1Á񫮁Qd*?0T-50` )ĩ`Ttq=`'ݢdR5_3E/\Sg [4.q-ZH qe*UuL~,c840۹ԜJRy t u%p->}5j7aMgwN%%*YNDM%h cY.6pn<1?等L/3e)M,;8ouk-7pڳ}SI ݃7Д!fS?)2pJإnJOT˭'|vXԭaQ/8,ۈz"lJ,¶Ehs"^qXQ E9+P#`Q&H\>,C^=Tc/B$ZQ:/WyH>/XIH[>0v*Cb]M:M?b+bFkԥan%f=0'q%2WdFs3#8\3{Z6bFsrflΌj4sWEČ<\3:3[!32#ܹpfGfG6Y5 2]!3v)Uv(bFpj!"3N&Dfd3⾦υ kOfT̏Q92 $Fp1$R.BFp2PŃJr3. ΌRȌP21A!ɆbĕU3#v @ΌoRRS8!"3Ϋ.DfTZr&(f+FxA#m\[FDȼRս&=K3ƫυu[3ҮŌp'QB1#\>}!#8 Q2*vBd0_D[Č`g̨&fZUbFخu^w "#zO 1/DbTN&F(w}.^Tct^T2^rQatx://_W/(yl"N@&"<-f-Ѣ]!-BU:-5~NDH=ӢZ uXT(X"{ HKrX]mE@\ *E`.EHP?" Eŏ*1H*4DXڙ"z,EX0N0;-°@(\T`E?o4"Eh]b.\OḨ`_ :hSC@ez?-BiQ(d(?r44M9"r6=m=pvc.\a/ZSE^TEe4ka@XO/Oۘa&1EB+M gE*F&XQA~"$P=nCPuRT[@"|(B$jN{ =BEϕ/ U QںQ"܈}S"(%Q":Jn )lDϥӠDUQ"tl!D2DF"J =;D=E3''D"DTo"DO >gIE&\}Yr# FI|_"Zć^B=Dp!hpBhpeB8dM\Epwl/9~Pd/ 6_R  5l#; a$Pd 8 !fC\OdpAZ^:CxCF'C|{"Cd(?&'C;_BʎՄQ =|..s!`%#r!t !w \HMܡPd (8z;BV q :2!Ν !k\2d%BBf.Hut':B$+Ӱu$I($'"]!B!6fGBYn( tTІϽ !;\P]+Bx Pߡ*FP׬ա)GPu#r(_Ą(GPL(P/u&gP eR!(BD DLB,B ~ Bqa .2Bt H(B !$Bx #IF%X\0Z`s Y.^U\cVgp|ٰ%:UݴBŅpo!?q!d ȫf$.Oj\z3ChF`@>P+W`]:r\4? !M :,!+8δj tM>ꃬfȉ]l.ogC՝HT|MV$*$6M6 $*%'b[_qG QqDqDpg+x]<CIģRvQD=1D2RqQDIFjHaD)<(A0TWFˆo0,SDÈ"*s(VÛWQЎ I#(60(N"'5ߊADW,6EAD)|LbCԕsmW|QˆM#(>ވ"QD1͌(2)("_DQ#hx (&QDۯEԒ((d"J~EJ>KEW{W+g3E#("0DtkKCEDNE"ZYEtG̐G)CGADD9ю VADCS#ȓ5D QTyEEDQ"(VC!Ȇ!D <׶A4<20"KȲJQr"h%BF'!MlB4<"BF!W#b<͊!~3b"v*bZ(Ox#y8D#|?EX.",DU>9-´gQDkB3~0#e\RŢ咜+93ȟWVtQ.Jr6b]1l@<Fs8pl+FBl"7@|Eh~us#,7X΍$a)(6(:7ZKFDx'7B L$W S7;&D6uGk<+zvrmn"U#+|i9I#*"Gؖޏ܇"kN$GGX+|D.O6#7h pԥ78TumFv p8u5gv#ԋb N9 DG#qrmQ:B@GۯkM&DG/Q;:B[ !YV O;#;[E:C~K0訠$:-u!*zb# --Ahȍ T)Fs7H)i 8Zѯ~HGZq~I9Ja +۬V*f/ q N=qDu֔c~]0T0n8RV`ÊPyrX3j|.5>ςxyWyrX_ yB9a5^>P6+FB9w 尪/g(UxwnFެ\9aU^>PջrXWa5^[(voVV :V}n|BnO Ê{w+)U~yB9'a^>Pp[J/@(U9}.6ϫg Bwf7 wKpʯ>-ʢ&+)U{Wn VCج\9aU-y:C9t/_g(B$6+WurX՗3y:C9nwJ/_g(Uy:C9 pi/_g(xkVxyWurXwa5WuYyʲ 尺_Z(U>5urX3jZV ٬\9aU^P /V(xB٭YrXo+êVa_ހPv+VVÅrXwp尪6a^=\(v+)՜-ڄ+U~ WrX=Ӆæ[+B6+W /og(U}y;C9a5^ހPv+mVV *7yy;C9a5^Pv+EmVVùrX՗3êVù[ùrXaS+U}oVݿrX3j/og(U~y;C9˷aVeR2rI/V(U~B9a^ޭPn[)qrJaU^[(B9ErXWeRfa_}C9EH8lڻErX3 y7a-•ê[+wrX3jVspzB9p)/g(wrXo J+Uz;C9aU_PB9n0Ha+UyoVa_Pv+EoVVa_PwrX3|oUÙy+UzB9/aJa^~P [//W(U}mVϻ5rXwkpe ea^!ê&5rX;j|V߬\9aU^>P n ʕ>}.6 尪/@(U{yB9n3*<V z^>PyrXnSWa_}[(U}; R[NaOe)bN`ojAXN!a,]%5G-O9mqT|95k ,,MY(Ζe3ȯYl>-C))e)6d#u4f,VT묖-'y7|'.?EޠC=oM.fuksOЀlK֯^YMzyX/bI=V{JW/98mنk砤 Sn54vSlvb/`s@[q(p8Ф*2͎JP=QTvDJxShbr+=I[_gSyGڔ7lrh6}ݬp)6QݗE[7Wn;Q|TSIo~]T-/|[6&xNZbkSfDeSln+:ؒXl`̆&o$LoSX^U>II|G@XT;jom@kśLj)ƶJr#񴊩-7.L \q 4WM T, `Yc; )NgmП@Ҵ g*ÆX9&۰;)dZ񋟝xyٱY9]@tYNPr_\lI^Ԩ4ͱ-|m 5 MݣjDT+i0\ק̏iz?ztÝatkhT;DLYF{&FNZB w({: F})5?ʣ2)a3b8)w8kxz:z!KI5KZ :k:0Vy}5@v,zOȄAWe:D7#zȩ4NP_(qQhUxQ|n p`>.zR ",ws ^qE>7\tCE8iQs"!ҡ&Zs iȕ.\q~t8.B\w\ٕq"MxqQrS.hqug$" *Eg踨υ:pQsᢞQ(z%\|bAE,hWzA!X^tE/B y.^tEph?;/BxLpAIbAE0NEW;A"/*v^ﴊ#`_ !X<Fk0MFPTf @-NO*1By,IqH|Pׁ}* 1AȄFDs FEFPWF#dQg12?=o$ba!Qt*j #DMm92B=뎌ב(""ϑIDHß72B8Kㅅ@ځőBTDF IQM8{W?2TBFq"(4K-dX7!A7BFx!#čt>ѨC|h4DqhtGgN+sbDp# P/"[t-B^q%ma芘`%1((28aQF"06r !¢!Ŋ6P; ё=F(#naQn-e GrE ٯDF8VKsX @" 7"ĉ>,\J(X!̜;,"AaD`Q VBViH!+'@ T F E6J!)”q'EAo)"u Ex":Pqw*B*R i0Q0&뀜%!"ĉP,D1ONdb"tzD#|Ή58`gp"X<"ID7Q':9f EN(iJ"^s.iƥq-@M"P@ (tDPdAz!"*H&hW :>H6)49ɋ]q^ߘX.w^4KɊYm/^h^WFċqi e|l En 2>Q\lȋ2>?:E&t"$"+*"{a'";ځFh,o-XТYjS Z1@ƤEcـhegE.F."kXmmOh, [f"+Ev`|b2XdK,ɧʂE"Z DxEV".:Fvx*M/:oa΋LbJ680)b}$Fv9?#;-]`ȎvȎzn$Fv 1.#; ߳ѴyL'!0y٪ HbdF[ɀ 0FetV*1#=3#+ +Ȏuc(ϣ3ʉ~3i1#1i#3Sj3ʉ}327ڴgE(.8"5ʉ'~5hHFzЈGz8\MȎnBDOɋ}yYfv<{hA#;\AB6610A#+Όjy #32C1f3F&]_f˝6ٹU]u(v89#l:؍7FFi7zFP&\6D =푗ܱQs1؊6 3z|F4F]I^.6bAEwpC{,cs^d^dbxu{ ]9]ّ%]xtъG% .I[/Eآ .Zӭ"G .=8\ .œiOjآxcV"!-^EcPآMQpѝW+H/Ѓ|\TVŁytDytQDtQrlD|nE"ȃ"h@ -R e8|Ȣ:FdoZE٣SEqZTAZib#"1'".G\u0c0t3ņ{EqA Xditq4ѢiQ(8֊hM괨E5 hQD--RHp/!Ѣ-dtZJhm:uZ9ohmwZ3ƠE ż#hѮaŏ⠣pE}Xu ,,9EE,7"pE>\E9}E;yȢ| 1YYYg(QFQF[G 1{ ~9 lAFҤ ˃^3ƨCgO1EwVcw #xby'`~-EqQFp 3-? 3)BfW#Ԩ0#HG2̨sŒ 0~[1D+FA,Pe(:qFA3`Q$6gd7Ìp, ED!LDaFۏggԓG{qF1WQ\dr=ʨ?w1xAPDѥ-3/Ϥ#cebi#lCfI1]!F]a1&yuWtW>3z8WF:߈Fx 1w]((ҚEѝD!F 1 1b4[U:PQ$t2ҥ`[H+#]$t>_))6E)"EY} BKcx疒Η+%_tR-n)Rr$f"ęQ$>sd92ZЂr1BO8% d@F5 A.M5"ĩQ`FWsojtN"K`Px&u9rj4WƩѕ85AbAP+{4FWWsj1n0D.<]585R])A֓;4:4Zˡuy=hHGӱwOGTP^Nx$Fngu]m7]h*IH y+Xh˩ѥ->ASъqj˩INHnEz׷qQ9ttCJG7`U.G7"э*h] * ]({@#p`}N^ h Gt˷89ş9򤡋]CiSGB-p)̜)IFHFoL lt3Q l?7ltW`63~963ȩh* ճ96  lӁō"gLppC7td 5(*HScuGbA4~-lnCrlT\qnHWpWwAFv3!69mw/jW!5Zee jS؈9, h 4g h#(šd4*FШTqhT4 7@uFŷK4*;4əxB@#y bFyx33 ({wh`FŌ8ܘbdo"MX แl2G93e+vfT3*ΙQM$3`F%{DgFQyyRŌ<c0Bqf93Č'pZ`Fk1#T̨*q`ܘ[̨*X #D Ȩ*`7VWǁ#1?8Q2R0U ## Q-tm!ꁿnx/GFG#6u2W(BFΌVpfڀ3u+gFnEn0xpf4,#fT83*3Q0QlkΌJۙQyB33.ϙQŁ2įtGtcLѯ:55riJM7tSFjrFU)St%y8 _?D>OMWt#; đ^ά<;]M#OOۑWz:P#(rE;bQn'kptW"7]͋tVn^XRv'b<;өN)VvǷ1Evljod[鞈it%a "6Ǒ>FrZ=ߟ'UHN7 t5B<9](9ftKtH/"%骜_ GyA‘ra(+9{_Vr:߳vtU&98j1.rӅOEAܨgtd/4+7]Utj:OBRU򈕙γƬtՉPdNP媋t-N.J܊*Rb:xa!KOyŌP~KwߞLy"N䥻ɌVޑOKijDxZjC3;"ľδtNtŏ't;ιIHJWIosެt:ȓyHJIZ,yRU'GE'{tqn?OJW"j̓~hL$Kqp'KkƓͷ+OJAyV6RV^>r% tݝN#8uQurx:#[twOJ9GrTG&r\OK7xZ{E )/} F^KYDV^VtqUK+SݟKOY!Sntt*|ni.m[iZ"G}(JKw8i֭<-+xHi钟i𒎐Л,9kg?Zy#iRwij$t<-]ȫKWx^H2y馉{j"奫۲bC7[1?qjDxfQ@L7[s#(.yHNG疜zx[$YHG?Rn=Fh# l4bDda<5]$Rtȍ ߹Ep#{|q#s}nč0` > MJ_וyoVfăn>?rpxGsw̭^ uG=gG]w 6di~]LJSv]4u(M.HSg#dG:ˆTREdb)i(Jivi4uXH`:E"f,uXqg"guN OJ4u7MقwW:(KiPin1F娻͞#;9B|yyΓ<8Q I?rrt!AN"~rt,uBB{RybGؘ$#ww,xti^!Gó,xydֱF*FKУixУ;9p|ю ]%ot8%9>8QnXO ~GF?*Qt\XkXQ͑N=Ѧ nGN*$: Td#H~ :(ȏ晵ARvI_7/AYNj5Raݯ83'H%ZuQ񃗜 o %^Ds\Hᮁ};eqQ \ܝ F/5BVvv/%өF0{ȑ9w:芎O5zS0 TKYT#tg0N5ZhN]_X+9cX#l`\ҹF"o1G45"6.O{]~ l"?{:PFwrWlMF'st 'FId!ZlDxjt{z8(iqF TpƩF8('`įxQ 5?('9~QS`#v`Id;؍#+- $e$_ Ë_?bǎ6:}qhfQaѲqIG]~dziƞQV$5>[VzgZ|w6ڴ4;liw6Z4ecF[Gg#:fv6 _QsQdVQom4yFQHQF7hoE")Ꟊ1R3ub[h;Ш54J54}m-V ZX Ʒ>^ÿ'gw:PxGǿ<0mkIFv7u''=[FuX:I}ՙ&)"Ͽ{ӛ?}G=n7_ksBvߵ滇Oo<&q۴ܟ>{ßopin s:6K,y*I Yת @*uRH 5,d-B2ɺdd K9KC^ZdB2霞%òd @$WH Yӯ @>`!tΗɒ,sb@>c!4Z3X3p @e!d]B2vF$9t]%%ZH Y @i!ȒS~w{dsi @~ ]o. @ Y# @ 5.He.$Y#1%ie4f$v$@zR1 I I2iLFHHc~B @:,$ggs _ dҘ$ $4&M$@lEH I2 R@:esFr11#9d;Brq eIH31$9p$$Ȓ8 r ^ y)I2iLUIHdʎC`cҘ$Kr^HcFM dv\H%x9]HcRO d| _ [e3MH@/A|$HcBR @Z mcȐ @j/|qHcJT @dҚ4R%}lr,IriLJHcV @:s%gCScҘ$Y{ ~ @SʒdҘe$ij$ȒMF 1?-I bes:` @ ` qY)r843| @Z {e6 @l^H MҘ̗$Kr2|1diRMH3uH%|9]—H@ڙ diwOH@Z @M*dWoH3uH uH+uH5F$  &D] K IH ͬ1 @*1 @Z @;$$Yꛚ@Yc(icQR{Ӯ5F;U%(ieQReQRcȒM 5FH C$\5ndWg'i@HK%ic.1MȒs@*L HJ.vYtH3tH tHtHi@$& j~ ee.2IXcȒM8II5FH5FHAH RHCd 2*4TdҌ*cHUV*WH;ҌWl2d҄RA iERE iG %[H36*vd5Br MiE҆4=4=@E$<CY"MҎ4=@j$9T҆*cH iz,521 U  /xJE15Yu;!94r _ m1Pc iG1@|9$H%u eE1KRcȒ-h K%ieT Hdo;R - ^6$ 5/,@T"Q"QiG K5JdD` 6@jH@ڑȒ-v cH+* ^K;Ί zH j T1DY̓RA156@j K0$:+z ] U@Qc %[H%t9\BH%t9.A};e#KRa.ie.2t @j ]YDCrif.ia1IT @ڑqVI$]$]$]Rc.%=5$f&&V& .ΎLdۺҌcH j mL 5~| dv  Cd @ZYcTYc()1;2_—H%|9((i/Y;&@.eY-~qif.i/Kr^—H;t,!9T.IIv `m3% @ @*L `*tH;t,َ!943M(i{m4&J˴3M<(0M2MTYcXcȒmCH3@Z0PҊ*vT8+9v8 V -2 @Xeds*&ieT_xJZe,~ _d{| _ -2 @ژ @j~ _t|3|9T @ZJ/Su,Yݐ@/T]T] K7$ SuH8k[x@j2 $K43UT @ZYeTYe3UȒ5CUF?K2Hg_c(;kY'  \*kkY!943p @ZXcٮ5F7*py$%ie1p @j \Y!943p @ ]3T利UZ$]$] K֬;$f&&6&t,;tHtHICY @1 @ڙ d$]I$]@FpJa.ieQ!2$yvIf -1 @ZYcTYc(%k H5FH j~ ec4Yc41| @* _V/HK%U@%ic.1| @4vJH)KRe.1E+I `&V&*tH;t,ȒRa.ia.ic.(Gdv$]RaQ$] s{+Ƈ͜v6w]p:76ןs{fMgM{'ˣoŽxQQbO#ƭ<~v;SwA{H.dxzu޻?}Izxx=t#}#7Qpw|2tEy-w?W<=zwkV+ynSr+no~|Ro_?M+k>~>M?}zη-Sxگǯ_z=_Nz|'ik;2~s?v{;dۏoӴ~F۷W>񹴏KoS|o_ڶ/>ߟ1ߏt?wwZZooϟk~HLג..OxoZY;NA]V'oyxy8KX޼;nwq/m/.>< :fvޗ,uKo[K>v-$~ysY;l;鸸ti2n?O&o-w&~+,nV8zm{9{K8%zwº<>YX6WV7ߌ"!endstream endobj 362 0 obj << /Filter /FlateDecode /Length 31347 >> stream xM/IrݷOqmC*2 Xaƚq4HAԷw8Dfݹ Ejeb++_'?~9>//?f\_83g|?cy~._~,G?ʗv<g_~SjO}ǟNl_7o~s,w/~{[36cxmϵoc=ϯ=74g赕VM8Q>558?8I>w~^>9/>|}o8+.wǕ&ﯿN2o|^q缕ysYy'W!C|OysD0u_evekynF9g>i)sh獍q}m}8u9>Ư,ܴe|G:Ws>>Gg~8p_x['?{> 5z)}g?9hU553 yu5go??>_>QkvWΏ~Ջ;/?t+~y__)w__?ΆO?K}96~Ľ3?woweUu ?:poו?ɿ~edt;'}:4\ayN5-976GմyAKkg>$ZZij^\* G=m":NT}mNaՏ q͉GMow=gmi 7^ix%O/"oJJQ>ڼpTsuq5lzi|6:i e/lӇN-x6]!2[OKCK Kr(6ٔшpUϭ0_1f;נsX<[p_-/|̿p}OQiP#pk6rق ._C{Ŵqaix!6r;pu'^L;/7ل1]|`7߰gay6d6#φ7CK?Nh9q.zxr\h;TgK.xcxْ<5n3[1&g?=;7x1g sxa2km8.20` ^Wu10¹1 4zJc>PONc6O{1/8l DC|a^K*_XZ:{o=k+|uZ q ||+c]e'ŗ[)  z낡ixb4,tϗlP冽ԝbic@򾦥ŀMCo^3[-f0-=+G)Ulrِ<b*:hXc^i)w6--T"0GzX~+sDZqrT*ڗib<,YfSxX;,f[xX涝iѪE3i#?teeV˼ Z^m~3\_ʹl||%sZJ 6 _G#NHg$z(KCrR1َh8'{f|?[?5-%߉ok;`X-Ĵ㽬8-OuKfK}(lGƶ֛•8B+F厉OKU.\|+'zr/\m=8-[i1*>X};Eִ\^tY}3-#FcX|0xPbT|9yK2{VՌfw8ixSi}g^u;lX,W%nMȧeFN%zaw,r1'7<5F /k<b.4Bc>N67c϶bLr,1&bѧkg,mp1D]&1$>+Ɇa6لg[:yق㵌^=^NKh1OMK1I}4VP/k^Ky4>=͗rj<-/V[zX~\<2baƁہp'[ KhW{DFXl<&1Afmوѧ9@Do6]f Xu`1ǧ=ݏ10Ot\ªp ca"| \z`yu_,Ug:g(>glYu6_r7-%F>r1Rg p1ݍsӂt,Lt~Rup u6YD+lₙѱX%F)ubL'c2b4ls:㑬n.Mhz9>b[b(RcD\O#bz cXln2>N8xْњ|͖z׉ǽ9 m:9pu8b8|/t"usLqn.ih|3v`L9 TxXoj zNwu.Cx8qW# 1ė2b;]݅E7yH왖ΎwN m~>{ռيKyq8f@G,XMK?ty~Ύ!n`وxQ^r!ZF|ϦCb CXnEpǙ 1<&|}Gy]1$3g+~9DK kMKC4;{nJ~7)cyԦأ6-CcCu˖~_U^=[q//}g7E{u-{^j+49V-l|Z' jq/l,7=4zD_2a 5fSzlIfbq|f>-Kǟ/?aóa5Q&~}w2x`cAe 1V2 p+-V?8Oٷq8O9,X;lM$1eY|w=l5X"':m+Y^[6P߻moSǟx:Ə?cwyyDxt^oٚ?W־v4;b>9GgwoĵoMB椚 S8^IԴЇ {T>F mmmxٔ&SWS?x~TFg^q^M']>sϦ|;x?Sz׉IMX_= -῭`*Mm`MfK|p*RvL =Y-OLIVUBn◺lɷ7CSb+1(E0ms/rVcO 9Qw!Pub}oY8ίl#mقI# ka,"C;Mn3/byރ/ D,s=n{qS[Z'<a9 ^ߍkЏu-ǸxÍm0C |&o<귁~,X؆~,6FKÊ3FE0[{я .ca/6ћt?׋v,\##Oq#vria)t,L yp>]D We72Wͯ_xߍW:-O+O',[ᇯ,,j"ϲ8h /2L pˌzNN|2zp#i,,:W엺A3,g6_Gt`K/Ea9e(w^Qey>E<QGet:7gwڻ'>uop͌mF8ϽT-sg6Fn #[X]Nk 6:l }!T;nvx}q4<&c4nn9Xj0\¥\68/*7<\ӜMޱVXmc2B+/DFTF|:0@E^|ڭѝGΥ`->(79.X'r"5`s}N@>r{.NSjъ!4rˮ|W,qeb.5Z/Zj\j]_ZjxI"K <l湴:x[f(j롏1E+>5ǚ>rm܋{ĸZh/L&obcgkIͲwF#vj\*K7yziз^AectDv/y8U`"8\~u>r,G(b\cx5}n ADNKu`4^⚞qfS5e\cMYHgaѹ,.i\w]B#qS3?t;\ 3swøς=eXq9&Cմ`E|gS8C2;-Ckև`u`ɦDBJt0ג]-m2́1$cK.iy[.X/}u=o םn[sIOʸz ޅo ݾ\=kIpw=p+c㪑 ({3ڭPش4roِ#ΌN]cB *]wkkh̸(7!0 wpF>-Qeհْfn2[r\vՓuի3=< |vSb]U_;-ׇ~w<]b^͟yh\Sמч'W1r~D"]>"m2r$|\rNK>);wk18^lDT5m1:-Eүs듦[4 #?@>g>~q-hڴ<9 @UW#Zd. 4MVԹ\s=#ub&lƴv[<$Orrp/|ǽ}I/n-yޖ";S/|^ ~a1O6y0`|-yQ yQoŌ73,dԇDF$Qh"d5!%#1SY#ZV71ǝ3bE/?$F3AĨlEBF4ө*c#?2"2z!#وE> Fs Z/- *a aJFc-~\AE>ZțU Ta. EA:oLp2U)}.Z!DZ[HPFDڄvų$,&aQut" ]Gr"9/7,BN%X1(`QŊYGYߤX M"C(œȊp ,dE%+M5!".zDV~p+P`2+-dE=-FtF o5iD6:JFk(56$l&TR]y $AI7KlT)44[i ()[HԨ>Lp FxEm}Q#t&BF/}5B~F4B-#hjrYeDS\(F%\hTU9za]eZB# lF14Z14B̀&S#ĘrD!vFw1p45\9Ȓ]`j0t^zJQ&DЋqv)jnO BMC(i 5q5B/4DęDp"FRg{416i"Fw&FERDݣ`=dIWꭈ?_y,!2Bg##$E!&FqkL71B%%bnQY |BFsi|.`|#|1Fϣg^.EOc"G rtr"Ew؇4%I H\l\̋"ոċ p/z.9J ~^p7.p$EÝVS71Fм̼阚v"/RŋjF|.\8EGCqz'$"$g\½" E.\^䒅c,8D\ .@a!BE]]|":b("E)NR&)B ~q9A0  AE xX"\EZߠ=+R.Fڿ"E!=a=0c8xOBEHS&'ThzBE1HQ5HRQ`C>E0a05M$E{"$p*p~HQUCPzՙ :3@E/l^A&f?E(82mR"|"M܈P!-)"*Qiy19Ɋ2,Y&V4UDEte[ dEp'u!z¨D"E7iDcDVliъ4-62ȇ Ztv%sLZH$ZG-h_#dbCE$K"-³ KLᰢv-ѡ |* *Iat>Ra!T %F["F@BVe$Y*6F Iդ5If 0T]JUF*J%Xv}(E))/J\ʋ6E)EDIa~@dyC}R^ZS%//bc.Zl[3EHF+-EuhY\g ]E-ZTڢ"mҏI[t{ڢہ>).zRdqѓ7juQ+(EH#ˋ)`ʋnE-Qh hݒEMi-3E-BN޶EO3qOqGT5~+,燤F6a@f(-ExG:"(BIRnJ*YRe*beEQjRQ(ͷ*n/EKzcAQjz'Z뉶'zR0zyrҭ\J=˥''DK=QFק(~N(9'ʜ'ZyDNzSOTT!YOԓHO5q2mC*,'J!Fʉݤ(U)'JA ',0z2zEřa9Ѻˉr)r0SV=y}W2$ʉ;INt{Ғr;Dg)'-H9]C|r&DNuD.SNBH"$ˉ )'j벜qDDL&ɉi(gQ)()(.AQ/Vգ!YQTcM9QoOErqXNY$',05BCgc:[Hv lC1闅th;PuC5cRN4.9ήM&xMthALp?!<7֗07[g6z6C9o@ ` V4, 3$PȖ5Pu^"!!y"څ#z#" K#2"䦵zfͶ1o+&ۈˈ!_(DGFdD"BdDm*^߭ꅈֿA,P^b"ז[W+@ZND%DMD(މnZ(Yj)@""r"BDDPdFw^ \~|)bDH˷oFDD(FDH3"JbB&DVhB"XO-Hys9 +w^gVfH36HL⬃oUZVJɹhfٵUZ9~@zJPp+=e$eA]w6R\o[<,Q}+Y^[ETط/uh]/e_ yn=Ii9hqyrQN&WrsJK\w{oX#|aYo?>l{XkV:)m90,b F,gHڈ wG܏S0duaXq%^UeG1Mcp>bl ُàXq?#61^OPq'#()q\Y 邘.Tq\ܛ[P};c}ĵ>v}jq}#q}~ի>ةn+Cʎ^,v>Uq9 \qu,=< <˳<6\tJu:ȓCV}Q}p}p}ĸKYd}8 !X@/KѐuzY@TDBrUBBU!qy~\!1M@b [@~K,:[G\G0#.ו#f}fluTq1*-6 |5aUG֐YcUcqD c?gG[Hk#nj#.k#n=j#n=j#nj#.ǚ#.ǚ#nFf29Uq[˵ǡ#/\ #t8=8naqė"@^3#fEFvd4>;酐$ __1"#x[$F_<:G51IEpQ@ JNhP4\"ܓ؂@^8uj'"P[/bEVE^+ AЊ@hZ&(Mv )s"#5)sDmR[Hpv1;"YA@JcA*Ýh i"fEwbVaxOY_䛆Ew#XBâ5IQ$&yEwHzM%i'Q"DDirR"Mh%>BHC(ΤD1Oƃa!&DJTBbD]R"$$JDf2čHJ\(/JaD^ۋTH9pv"&‹&BW+"LqGD軅s ~ }Dk4qDYpgLs1lLsiL!"&ˆG1Qfxna^0õ0FMq/Jn(GO AiQuB"@ vˣP! "DDE6 DpG%.AB%B("BY lrMF;pـC_xۜ"=C406'V|ZC|hM$C>C )P=UtvE>TC K𡊞^"0=Q\D|v*E"<1.Ds~MhHSZ[ t^ЕO@4-2 %Q=ԀUq"{)Q*h[b{%nUhsEJ4 |hJT)QE"fAJTѥp%xqU|Q`ojD,؈ 9ɍ[aiNTO T A NNfMs; (OJR4 DiQQFwETTC!xBPvV{RIå'TTϦFE24*$ DEW":z,-,N4K(*1 /I[ish)R[ E̫KRciђXZ+NVueڔE)IiQm-jgڢ_"/kʋ$ImS['EoڢKK[Z9{R"9(?Tu2YRt&/XuɋdD5۟(S^^E&E,%Ehd$^FNFR`* P_L@#4$0cީQD$0d;5VpGHmB`&FFU JncXKoZ`iR`teb M_$QEE/$%apFH`iFk>eQ;$SkF1-H_dIu[_N%b /|/}RJ$}nhP_E33s/Zv EY,EXH_e}Ppbڭ%]ꋰϡ;4ZKǯoj'DDyc"`-/4/yE OyK*Du  "8r*="0`u$!_ouQ?ɍE8;ɋڸ-Œ^6*P鋐j"Z&]ߍ%}|jVQ_ {FF/L Q䈦pJDF8wJh&FP\/Qcϥ0J1AJ 8$(hKXSIb7#J%QZaTQ+j ^2)^ru?\caJ'傋a+ .FQp1^cJ삋+>bmXpe%c**[~=J.Ƙ*jZ*os1s;_\ *Ȓaa(\"mlJn銋 ;A$oY\M Ysq%ISň)Si m4Ut1,[Xtetݮ髢+.*8JN碋ɢɒ%*,ۨZb]|x璾EWJ]03osqP\XE0.fB\*abôEIwU*|et.ƓNIzVŗ_ .~ 8.2#,,Y]3ȏJ6]-,_.EYt1EYtq}OJ뺋 Gib<SYTx16 ithhTxqbuŕՅWK^d0<|;Uw1yW,._.2,M2UwQa`E..ĺl4e[TE>ޏUxeQ❻#.qu5Qw1$'mB~]w1Z) ..Į /4EAƟ.YKecw!FZOWJW^xU^Ԙ.-^ܖqY~1&7*X-WX*T~q[Z򋱓tSŒ\%1ӑYqE|~d`tQqq[`&ʪX2+0.L m.U`V,-5T1,jKݸK*U`\-wƘ`k/V`93w~Dݩ*0. T' *N@ZE]q[1bg FʡJ0vjZ*%cq:2W`,?%#hFeX1,W q ưp2+%#~r/`mT%#Kcb\q%t n f0$]q78m"\1H3;/_\KW/g_bŕ dň &_wh9^PJ[ǠGX7W 0n>`,W_KP|KOtQEД. ]b>;V^ܜuR=ݪǫ6SޗmXRŭQŕbӥ7oJ/n ^\n U^,ϕ0Tyqs@bܖn=*/ ]crrrbqg_\n*_nεWsQ#ڋruK.zX^Lg+/ʕVg􉫳Hjq5bI /. /‹%Scbly^,Uڋ;vŒp?^^\ߺk/.k/HWgڋ]x1i.i.J6p]3FeiSE6ȴ.> W^\;W^mϭP_BU;Enaŗ/u\^-D#V;$rfBF ANRH`݈$DЏ"N3@OFx1"EDGN$xhR"k3%TW@@&($M 1a4a-Z"L%pt3 '"&rdIRI ;*'%FBF bDmHS2!#]K(V A֤LHDR_b8!,A", nYZÐhTej&!† +% ~!nQӞsC"Ly`1^A"l҄`Րz9QA"\/HdbD,3LSbD(*2bD);#!5"#ȝD* !tFBDGH20WߊMHUlH͈͟pKDs\˄"DFAeǧ.F[{#깮4#:AD[b715Q"E\#@ B|D%a e1{,Dr1;}D=gD ar %"XbX=0|`DCD21 E1^8Q$"'²us"%!N9WzD؄9Ѱ/9{'Bb4!3"o^2(ݭI+`I) $E".4mEs$Ex8K$EEhJ"ԠsEXu AxBP5EX_A8DNW-P%(AUE)6Apޝ$ErIvѯGYcPښA|z&E=I"E$-DEpWq":D2hIR Iz"}At-/nڋh0 ݲa۠E% 'NP(r4L}SvE(sl'(Z BP>$Oޠ~E[oB\o8Ʈ.DC6(7(!bP|`EE=# s@QwEH ܤhMXDPHpWLp,$E<!mHrI0Iel"EN\' U#w'N4MN1R/(Sk''Nđ:CN =A/Aݠ:"(K(q"ޜ[.a}0av=gliOy7ڝMiY!9HR6BR;a Q[CUBF`MZ"b#G%bכQ+36j36-F*27j3  a#6T2: Wll+Ȍ[3B<U۰03BQ݀;d3#%\{R)%3rD3B.(&3B &3Ɍ6n!3sALmT3ZmhY3#DdFA1Qk"A- JszFFX8($2jtr$l*Nsh62\Ȧ 9ң$&fFp$532Q"`Wf^3qmaƝl#rz33jW V7bh 5Vbhf4p=mhm=bDFe$5:ߋQINd&M L'ˋFN,EETe}26E9h8490mɋJE)NuQS.xT5X" HqQqWs%ڰT4RS8EZTVel}rhuQOeuQNcuѶXjv.rӮ.;6b/W#T݆D9JlMdqQ/q:~HqQ u0h)R\TO\dx&E-qIm!`jlIڢJmQ kRڢ|5-ʅY%ENq0).ʷ̓aqѺiykm#ia-\--!m][C" nSI*efj`)Q\EX]5-6yQ)ETJ8S]2IǃhWʋKEI"ttjRaEX%HBu BED] E?EϗCK_fa$VP^$C#ʋ]0ʋvKȋ0Swv1@R^I_=j/ M>@}\aJbH#<[ib%F*$FQ|G#lsQb$!\^I"ͿX%FB]Le,#$/ƨ=S!4_ EvoQcK ъ1RHcQ1B!ET1ej!l]@"#\Pdg"n;@T!j*#6&ETeʔa:yK yLReY"SemDFQŖ1ai Qc\M$I'h@#'Ŗn]˕I$1B!*Jڐ?%FL^Ƚh ]0J7EQNBtɌ0qJfN$ʌ0 Qfa)3ZDZCI!ZnWeȤUF1__6fhPe YUF‹h/7(\Tt*ﻥS0jBƄFsF Qj&SI,chbO Z/Q*uG*Q'4eBT'4IVB'4Zh(g쉍,\ب_'c#(_(0OjFn \jA'4J}B( k)hQ45JR#= iDF UdFՊ+}0%3̗ ܅[f;1_20$1r8V"\K'2J)FF 052:_4"Fw)Ѷ($1r "F/b,&F^/bԬYĈӌ$Fڿg.fRfd.:V.ǖLFOj%sٝn(Fben(/ѹFg?F 0g% V6:UXYf2$.id2:רdtl0eLFLF2eLF+LFLFlt뒝..3f:͢ttRttF9Qfˁ45k 2]f4FלV*=ҡd6ǙYA%{KV@{n6{p2sh9s:=lt+eȁ=9 k1lt?FdtO_([螒!{(v73s$Q.|XJVy때.cm2]c&{S9]ltOltXщ1];M$JrZtt́9|3ӭr6'=ltTF8'ѱ<疍W6Td6uOFekO0%;ݣ@f{ߕ'IYqQ6EE.,x}EvEJ,^X%pqlv۞Ew GCYxeqlML+ E2Sh\(%0:@ 2YPk]YEh`L`5{G3lb_g# Q.sHh#`,I`2QMbОQL)f V&Fe6fԾEj&3#\Ɍ_AJeRp%1zJۀa~N Kq rzhhToc`XQfN`nT($0Ua'`.t"Qr!1 1?SOGJGL(La00=yQEؔ`(E:Eķx(,.4&/Ji^ɋ\^p񢕭Lh=cƚᣴH5?/6B4E8%eyzy 9F'0Biiބ|ITtE.jN\mS=i 3-R%t^ i(ew Ң؇g-BhQ+G4+߬4PGDEO+YyE(cג&+:1YhƬLYѱDDEudâl Se{MVt(R-Q[Q7sE~&-ZgZtzʴhNHm&MZhX=]¢',:>a~.X4?.4$XtKU,O5aQƾ&,:MX )*ۜ i%MXtTâ"Xt(9_"\EY~"U\9i:iѼO[D =ِhEFDytmEgqMw؁+hڄH"?St5ٓS]R]djJ}S].,t=&-snM4(5U:.}+7c27][#ktZɌ" DF=JMEWj>qSeLMjNM8.S=uj35Ċ"BTFӧcF/QϘ>C^C#<\gn#97$XRnYtgLtM煥QOC;oũ2`:5]qW;]&SyRgRMNMWqJB7e;=:df~\}eO2꽺3iNMwZӖyQ>Exxa+%^cC^2ٙyQD!Jҵuċyfދ6$0ZFb=P[jJhu60Bz!8h /ZZ"aҺ!DRJ#E##MhD60B2h1% L^nhM zKSFFM*KDFkidԳZQW&"Lg9G7/S͋0".Y׸c(pQx@Z/MIaZ5ݓK^@#"(ĆHVPDzEثE=Soa"h~DZh&p s(Ƽ ŋFXl^ibIċA"/B.SeN͋F7/WV/y G,Pd6^>d R&E T  #)H]HV^qrIh M.lcMKŅvEe<"U ѓd q.YPJyiTwX^OHŊ,B̊`/VM\Z#q:qjE#E82-E*"KȋE!͋든@~ pаqqy=/]XGs㢑#yp6tއi鐷Ң LJKwNi22HSt(Gt`!J|.qĬtyL)+qtGYLìt)mW)eCxv\4-Oꏘ@O!ìttu)+8zOYzk\*rŬtǓPJEkT9ܔAQV:l:=Jw1-wbVJKwCJKmc([xCϾâiWSYޔMbZLKwzipcZ: cZ(Ksҡ=ZIDR7qEu+|bF1)1\)BuIZ; 8+ hR:tѡ 3*^dZ:tY)-݁*l JK+-J|t|TFJi:.!n{;.2DNK7VyN"-ɰ3+n吔YЂ r oEq/qex2w 2IVjdE瑉Ċ8|ȎŊ;YQYea+$)J}e1IҽH/RT1YYtgV0Y~fEsdE5.T(BEeLFEQQ{)Ar$(j=<9ᘭD&':ZșHPTN3(ZR*&l" 7RE\e/b$cRTߘJܔ2U0QOLt9n*1HfDg<)Q&]/OW\tU6v0#J'@2ǩtEQ AĈ08bD1qɈ6#ʢ Ɉm5Q,Q/V7!VHYN$jFsDӽDY:3 %Fm(j8DYǔh+FhFDX pJhJEh $u 2!Y|*^$^2֪]6xfLR x;D=DDuC$uvCp>DϓJ$ۡ DDI$$@XqNHI7!KBt9`.3!%k^Z$!jYr:/Y%+6z6D2+kE8]Yn`t\蔻:Kv,&c@94C*]Y(ˀria<4*㡶`У,\tE6 ]Z@g"{pQ-Yڈ2 UL:Է^e[5n/IQτY趻d-rլ[T-3JOv-T`7(%0`J?ϋhRSM os1r]Hr,*η5QV,%e͢YTϞ5jn\QY\EI*WѢCH5g#{")\(U(kbj 'dsݞe[.zEY)1= zEͱ^^QsW&+n8&o4 5Nhh< aUY#!D{ 6NhgC,:dQ,YUgɢ鑜}~EC/N!ġ~˿^ފHH*8]oQ@d.JYdz!,JLg"۽'_H"+,ʌ~7dQ&yȢbd!" sRyԆ@YҴldUHYTL!F^E+cU RywGl֦;}N=Cpv!ԣYUZvj DXl&aQvaк^矃XaBY5>j?- 5pQdW!(jRʱ"o/Eߘ6:Y㡔[+cԼ}9 .2pT%N/&UIE5v\meFP*ɒ.7.K!Ke"l]*E+<QܰEe!4آIآ{ [4hsF-ZH"h-|ԢBEF>bCD*5u6E礣rez{^L7~ۀdu~??O_n>>~W LWMq$;{qtYs/m)zjF`IZ5=q]i-Wo 飜s|sӸ_-ڷEM%'XR~6ϵz2+VWg{Wz,e-]}T0ZyFy1MkԜV-G3`ḌV KvVJKvVjhMv 7gj2v +Ix _C-;}> stream xK.ɕ$_*J;#`$HUh-8(lv79=_/?nfuB荄A-~oǎm}Y??~?]?^~7O߬/߯|7o<l֖^u/ͯ^Oѯm_>}˲oavW?_]??z_esDz96ݏS?qR?}ڗO9}ٶf\/m9Wߍ-v?be3w2N88e9}^ﯕ]0no{߸ݱ(czmm._qnw]6/|7aym[8`?SzmY/{?};qvu8 qGMT'خa^˾x綾4tz^}w}>vgG;}\O֮m}[kIf7ar\x}[i6>O|=|wcG'-8?:ش~S y^Cqm(m4oމ^xY;6]h9vv:n(+>tui܎_ؙ__o>s/q0n:Tmv}k9n|GFoWe<lnobwlݯv]#xxy{okLgpmxۼ!wy%ݦoǓz;1ޜc?pOߞ۸Gmwnt;V>_?C__p:u?ͷ?{9?}~3mgOi"]|ϼ4{}?d_SS^?3oOoOy]_i}r\zk6 or,ヾ/7~/cl3˿zm縪q_ǁm֮wηc7dtuΉ<⽍byqַuroׁgs"cau}Dm{9髝DN߸s5lCe}\rɭU c=P'(ǼL;pR_q)0݀8y]7ߗ  9u׸йռx7oa+m@}A||@Ӗ1p\ɶm b"M3[_pǹ>.|\ ν =kKH׸9ofGoqD1[wFm?>oI}ֿn;ֱH_FoWXF+X\ÌX2^  ٲruNo͇&2o abmQcSȸDlAmh.t>o}A%8ʺGx-Lqfg}Y/ 1tt\z4kFg]Uȍa-b#h D\EyU'8madxq敏0;:Z@Dۻ=c^ 4PH7Hq $mۈ~67DO<%D qNFض\ #kem;܊8"HK\a'KZ8>GԘ_1\br+{7s#F{ZCGԘ1bq`" QcƈH#h!wC>l E9GԘ1b\ (#hl=;!Νۂ1b 8 `m~ 8uO !b{˼c.{@! pGgX-XFs`gl< i21ƌ#p#j,6t4_hc? #H~4y_o@V|@[7ťy<֮1o͡g)7;CvfKs\9$tr-"|yk&p??kq/ҽVsLKE. ?km2twcPh'c5>3Lgȫ<;6wa߀ok%!0^̶a7ṪV 'O=>og'1ΘQ7e/D@x1kj cym{,OoL|cnqL%#Ld}F@ld)cڽ*HBF. ѯš}A3ttBđ8Ӎ(,c#Mu 8uB -=g ^1w>}ʈ#npho1n|g?yQ@Dų3}#1 B}a}s/NJF@5ݗsAk NqFa!1[<bȶ/-zLqq5{L:7}y Fj]R9П!e(gv6eA[w~2njc'<:n蹎ώz@݄44NȍAFtS6mrsش.:ı!r 䴞Df{t.օͣt4%Kc>!uc+oďNnC_{nmˆ7GD{m4Gqc=o;`88޾AY'od3"{3C} Ɛm H16bץZ ~01` G5[ə_㾝;xhr}{gqLR}eKcl7F~+ʯiC2X,ٷE {b{9=?6<-4=9eRX,Gde@7>eJ/@. G &z0Qb6XwY eh|Q$ D"%H ">t$}Z)HHI&Э$CC7!% 8equ&G8N 8dE"p%IȶX Y6.JQJ>I jP 2 46n%9Ԉ,#qG"Q1 h0F\$6 D"QT8\$'^*iDP"{i/%"HDm氒Bdov\!J"Kiĩ+Dv I!j#hr^@d QT D8? DmvΏQ/KE! ^)Dmcp.b]"2"0A#҈첐Fd[d<]yyDvR&j ͔G d"/DȒK cBNy*Q;ysȮyDm\-9TD<-Q%-Dm|LԮqDTQ2Q\2e";F2d"ˢ!,:9D(I&vCy?G8<&ExR,9GJ!3ںRd*EmDK(1T}TڍSLnwEK&j7|l+H@TT(A%~]Uf@%b=T̟Ԉx7?ЈZSF,Q#j5"_JDE.r$"hWID 5@$e*gؤYоJdADȥY-D*Qkw(񸐦HdҭZWW*QB(ٱI'b=t"dEDU P'p':Q_J'[ANdB#NM:d(҉, :K Dޤ̈́҉À NdQ҉2}: u"tJ'ju"ElE'r'ԉ2m=҉3:uoZ։lDHG:Q:;D]%h4ut q:]|*8Љ:`DCKU:?veK:]'Rԉ!,ȾDjP|Y(Xn( CS%2 DTlC$g9\$#Hd^T"Gd_r*Fԇg1CM YaL] O%>GTcMS QÐ="v<IDv]E!@(u$5C! qv T "s?T {(DtW8 *A A3Hvw OS'@dwA@d~(uB@ >@7<)ׇEQG ` QQG؇H {HE!A j=4n,?󒴡򑴡c D"7uY@D8|c%irwHCPRSrCj7bMr9"Ѕ1Aru3&P<*C:lڐaګso D!Y>`uCy%<'d PwCT@؇Ty!U}ƚ}d:m#EjI>Jٸ}(هNw }HٰY C9]@]Vt!XC&{=tD=tskHN46.@tI"X"4"ѵ Do~.a :\G2(lR,CC_il]C Z|d grđȲ@d*P\;.V1FmA4J1"DE =D D7 9.҄H- Db@tuf@t5F7ݬ>vѽ3,(YnCt7iWb"pBtKr };B VXll-F[B얆^蒧Q"]n!Y,Kn!eu %#n!n&ry,q-%DZAt0D h D!G"rРIo|(C. r2tʈ"K=O@"{Qh : u?tL`8C!A!}(هBہ>³5C{@!ՌwH i:0!M@!KzV\!a=C<[9ΡC/;!9tlnކ[u)ͺuOǭCǁ&!9e8}YT!uh4C|'  C;I(r;Cn>qΡc#JH8đDྡC oȒa7}C^!ݽ0'nrc(76x}Cݑo(6o(ox8D}C]# !_ߐ>Z%$uv!6 )mH mCT lC^!7bmMnRrېe65ΰ yۆ*C3"mH53א!Ukk5vp \!=0 ߑLC0 ).)K!ˋPb_zFsE=C'{34BYS ٣5R!kL74YA!۠9d!CD:8~I!Cv"U|Ms(Ρд ,}V:_ ?F^h!M},h #af,ʬ%I jl&,*%f̢XB o ,*%g̢2XB2rqb ,Jȉ%+g‚֜YDKs,j҉%$S'šu&ى$qg̢XB Zxf,% g̢XB2zb ),HE$('‚4YDKr},J%$ 'ҟID2b ),Tdb@b )),dbAb ),db5Bb ),T(dbBb ),T2d`yy,<$bDb )@2%PBYD2u%$XkXB M ŚRXN#dJ7@\wHf#>2Hb$XdCKHaһq sXDHB M bY%bQJb )n,$BAKf,$:k&b5Lb ),dBLfI,ˑjwHf&փ;rEHfV'dwKHa'd|KHaڟL9,J$!RXk,%B}QfI,ˑºKƁaiR" ),+eb Sb ,5%bSb ))^5dˤKHft*d˩KHaݵ_Hf*J2Hb<+X8YJ,!52 @+dKHaGƑbXb )Vd@,dKHa]HfH-*2Hb-X͎Vl,V%j5Hfb.8YK,!u>a^" ɬU $XXB |DgG2}%GƑb_dIHaGƑJwTf beab )ѫq$XXB 묹@2 D sG6-^#"RXѫq$X XBKr$X6XB QY@氼2J.3Hf 3ʎVj,p&5Hf3V{i,&ºWG2%$XQ$"DRX#&;Y(FM$L"YYM,!BRXѣq$GV.Blf,&º}G25%GՑbmb I,ˑU5 $PH ?z4dyKHf7d KHaݏHf¹^Hf8̎d KHaޫ#9EG ZL,5'j5Hf9dkKHfP:Ucs łRXgL,^'B1v"(^{6dV{d)Vs$jHaݵgHf<c!,֊'bxb ,֔':klz89GO$!Y[O,!uמM @ zi B`9RXWdIHa>d@>V6G2%%Z*YO,!zYޞo3EL /2rnȬ멓c XɎV/}2fDRXf,KHaYD2RXwUI,KHfXB2nRX#*;Y푓 ګ $hH,!EEN{i,:3KHaoHB zdG2FRXWI,BKHf$XB =H٣$V@2Y$Ē7%Xʎd=,%Y$:ّ̢'&Q@ ׬b CM"(8Y$ºkV1̢?'dV}G> (,}KHaO# s J$!EPb )8Yt%jU) $)RυDRXWH,ژKHfڔXB ?4$,Prz':9J%̢}*d=U%GTv$J,!<Vb(,ZKHaU z$Y%j/# q #j1̂,df$$>K,!u=b#EZb )G..̢-dn%7Hf XB Um4̢c.8Xrˑº6@ЀHB2Y4%:LG ?d @ HB ="#E`b )ꣁd%GDv$XnAtV uV}4̢U1d틉%zY9&j5Hf\\ Edb ɬk@ z{'DRXWY4b&:klzگu^|e}~]ebZ̿J?J_1׍x߻}%k"/iٳj#?U?,;ʷ㣸o^?}/3I?o>VO/]Wj|w.̷lSUÏ/?jR]?|_eY_t /q| ^sq_}e|߿:o/7Mŝπb,.>]=岌/rq~XMW+,[Ma೛NǣwGuъ2a~fym!=W㟿~5~b|QX~<2Ga}(?ǣ>(QX~<2Ga}(?ǣ>xև9<*룏Gi}߽//N/&R _w92_aO r꘳U3*(siΙF+ iFtS Lly`t{j) stLO0LSy&pci_10wcu'09wnKL?N)F}\ 3;5O~Z'Y >_PDŽpO^'Uq9iᆟ1y;pYhȥ#>̩NDx~pd:Эpւi,H,x$+'`gVX'Lrv v cՑ點{91A=<Scy_o!`QHZcDz?iym`YCښia@ȴ+DŽiDiMƃ!OD8Qh6ύδ8\}Yr7>d@rWNJYEt >M<\'"89Ɖ)mŹ5>.<̃Mn[ÄNXiOD%<_0f o"g^xo Yo ZSμIg`qVvst.<|Vs74e`zᰗ<{ =nS=L?@|y&sç6N(O@6&K{sw!υְLD<_h\xGl^xmĄciCKVA.?Z䅁ViZ19Re5j+G6fpzzXVޔ0ZқA<rG)z4ՒOφ7Z" y&a@ }&Ap#ʰ9''^Zn&/ 5鍤fxk雙S#397'o Z<ޗ|. ӢDJjw4MbhJI3LIjygdHfRpLʚGFpLc6%O?v9&eHLBCF{1^\>BTO;fʦ"xJI1)vc0#c@Ybd+{`ffSbD%A 1q1Tw`"'0}z| `N[cl ɐwOEi>6ڀ2腳>ƪ] E-8`6`OK1FQ{ .vA~ ?kձ_L> 1"ר|yhd!ykT4q `&&\+bղƨvracdZliq`OPP7Bu:_Wcƈ]y+ <>Bc,wGn+y}wIQ<9 >0XO"8IӮ ܘ.i,,Uy/G$A%D0:~'•Q;4<V*?fn+jt'YD*lVŒ۬MWZy#\d lhwErm|X'əP2xXQiPN:^_&N's:Oe3"΂4 eMTn 1#3VM2N*ĨLu[1d$wM$:x`"F~^1M'S£pŁ#ryA<5fe" y*ENu}X—"ڼ /}Xsu)IJ.3Q.o(sK QO Ye ԛ7e:AaX,`+mH+"nX: &+Rhj٨*Zj AEuPgqU/<]'j'-Eǀ5JgU/j2:l&Ç6SJ4d=#KC+! !;JC6t=3@pmry}VZ4![Pz![g"!4t(CFn^Ґw!{TPU ])Cg %k#ihiz, $ THak44ވ=F"Bi(64r ]]kJ{еKӑ44ƕXٵҐ_KCKCMyå7|K˥PKCc-ۺ+7tICݵBpF(#PF@꿒Zq 0bC jBԙqV3p,*D5x3س蒈:EHDj,@pDԺؕDdǜ"KCBd+v W%.i1)DmQ\ }ͯL0p!)DBd6@dEF^Q[("tC ,(;v.`ʥ\ j@v&4qP;[5g!;6!;҇,%)J\%Qj\y-PZuPjZx!K V}i4CMK'Jj?QLPCភ|ׇl+Pw(լ@$}(Ѓ(Z\V*q,Љic-f |(%Y%ݍ+кPp`lDbPJdDEB:N:}@עٷeF:Q|%:76NdsT҉tȾ̸Y҉&]V:}2ߩE(ݖRd-.cL7+X(풊%$yvi9o׊,OKI+2HEj40K,J*j^}3.5)Zp @VRx0NӽITd8Cir-\xJE68CNCZ"RҒZ_jfbk^,x6pS+"V:G+Yb¿Ԋ,썴nۢuH+:TjEIE}auR\RQ~9$JE}|WI*7g-RQW"KoATԏ"" + ۓ㴢q( ÔC^Y%E3iBXQB!\aB?bs7Yo.OJ*<S)QkU,CJQ<-*E"RXS)$#ߥR-P"C0";R-W"VBPdŽP(KPBZSY{-#ZQ#3Vm?"E+|{hEּEVԭOIZe*ٓ:Ԋ K+7 *W S+f!6rP-IyjQ T2g^.xEZ- ?/\jQBejH- \n - Ȓ6vM[Tqa̴,,3Y5>Ʋޒ8[Ʋ>Ԣi0 @הY.tMea_a Hb$j 6:M:\4wY% Cƒy-h"#sx.h;,Ӛa(k~!Uic>kWy5=˚k\y+aw5 FMqyPw`Dw]0M8%aEz FQT`o_%)pB`bL`GL{u[=;bdw-Q0+L&z|`iB'T=ܛ&T ^:ˊ-#!o5Er-P.t67u˶b:)=Ϸ%kEk>zE%pYzSuJ²d%ZM].xumx["t @b!bѥGZ.Y=n+>"RX.Xd;%DbjE5I+cS*54 ,EJfs܅"R.B~,t a.RywsQ%s&Eۉ0G[\-H^h(h„WsQγ sQ"\>xw"EnJJhFE_dC6YE[T"{/&HݍAR_deH}V֋dd=ddV` F ^ _d_C, {Q %Cۋ.:n.:.6>wr踴Wd.p$EwD zwMEE݇$nd/b->EwwŤtX-2=E\.n-=E7{ -E-ҁZ4BIa֢㗰! ZdeeZt2֢pkѥ[LE.ϒEFޝE++g+,TD"+ EAH&piOwΝE/6]W kx.xZ  kZd(Tk !ZNZd,Md%Bk*ZRq-ϕf#XT$"ZE TG֢΂ V1[3߷)>g[^~Y]mҁ1]5j<\ ӺƮ۟$s|.fEyvceƻNXGσL1? FC? e6gGJ>79F.nDZCg!1Q<_u٩cuD"Y&%$$XKHaQL,"%a3XB bg"IAYE%$$KHaQ>M,"咪),ʬE$$KHaAM$C6dT` ),JE$$KHa-1!%8XB pb,YҐ%$$,KHaQlN,"E:$r$TKHfI‚H2G*w"YTKHaA","E<"YKHfQrO,!>dRX3HbI#EY?dD"P8P3Hf" 2Hft ΎJ 2Hf j2Hf>!j2Hf!j2HYdk KHf0"Ys RX,"JYH,!j&bFb )YI2Cpڻ $XXB u E$T,G2"%z89,+I$!k&bIb ,KHfL%]{7dYKHa%d^KHawHf<&Jf2Ha&$JkHaڻ $XXB Ay]sEHfi"` ,M,! Hf'֬$DY8XB ~M %8yqbI,Y]5d=\ȉE$4?rdL<RX#.;RXk,,!%$4]s]5duTωE$|gg9RXף_Hfi` ),LH2GJIHfi` )8Y:XB >l ID s4udºّRX;$O,G xfG ?z6dfj5HfiF` )ѳq$4sw]2G|IHfݏZ %Gtv$4ex8XZI2GIHaGƑJwNS(D2KSKHa]^#)΃%Κ[$8zdȦRXѫq$4zV{j,M,!S;ˑҴRXw2GIHaqJ"Y=XB |DeG ?z5d5Hfi.` )8Ys>XB ~_,MN,!$ s4}Ɏd D$4+~dfj#u>rgO,"%GƑ$RXףHfi2` I,YVI ŅDpGHfi` ,!,!u%Gdv$GVN@\U/ $PA̎dV4:WG ?r+VC+Bsf,6'j5Hf:dKHfV:Ucs ŚRXgL,^'B=v"(^{6dV{d)Vs$ʻHaݵgHf <*3HfZ#EMb )f,sKHfѱXB. (,}KHaO# s J$!EPb )8Yt%jU) $h=J,!uWП(B i ESb ,zKHaGƑĒ*XV/D2VDYO%̢*ʎdW%J s>#E'Wb )V@2>RXe$bArZ#Y%̡,d\#u=b#EZb )G..̢-d=n%7Hf XB Um4̢i.8X2ˑº6@ЃHB2Y4%:LG ?d x@HB ="#E`b )ꣁd텉%GDv$XnCtV 5ZXD2vY0&7HfXB cܝw?oϱ'[G>'r%a|^Z\ß_}.G39(oq-i:>a/ca}3_X0և>a/b|+_Z/fpw8K88S98닳9D|BvofoWk=>`9w@$,IخSjNf9@&`\6`Ss n.;''_bbyƜs3^ӺϝYo->.fdt^aju')a)aޟHKO¡`ʟHYuOX?8:L1+:s&|byU8:硎̋OƴpCiHNLOgKyA}|~4P[ > >.NF{MǝG6 88n;:k%&v߮pz}Znv;DXV":ϭ#mͱgY\yp0Y}'|6BO^<vK+D&pCPE8s#;f\"}ieaz 2 :q64N;{ޚډt褵[:rv"+gqFώV؉`c^k:UKIK*|ɵFT*a[:HglFgń4&t"Ϲ摥3#0sarc87q(.y.pd@Lr~DNS&ܒ5VSu)xȞȪudLۈhD8<܈iy^<<òD8;܃>=) r!Tn(}Z6&`l&…aٛU"yqPZ FHCL<=vYُsو\hv M 16|@3[qPỡ]m Tִ:[^xR8<gᜦrk?Mglޘ=>[g /XANQ,x@ wyç5HCkC'sn U'Thn"s+" )P8͗S4_ N=܊ؔ+FKRz5h?燵;5J !O'rg"g꽣C6scp søägv\&7i0d@˜4ˤƘ㥤 fެ3<9xinYVh1iPIfh<LOI }46Yiȱ~'d6$. mϳ3:&@}kxx3&/}"}]x)̋/"q%M掶 ʩF(֙Fc/IWȎQӌe}ƉDvja%C5ȓx"Xs+BI99{C@x"\pwV罠wKa~uTf&/w'1Y;|Q;OPH!"vrۉ`kC!:,ɒٴc硸H/JaӅu\e9+^<;FjT:ޘԚu1*V idBT/Ԇ[u AgN4ӻ1$#{;e2 1ZǢH2b362L5K̩1}X"YYFBCL_p8:(̓-fOe^$33.!yFP|0yE{b^tK펕wa/9KRg\()Ʋ&.3KnR][-jQ3MK֡ʣlDR2[oӹEb3/}(ڲk 2-F WZSiVE,J%W dyUTJ4MEQ۸j19  TTδ)%/T;W1;SJު*XDAPANCC0xO>Le H$C}L yȐ#Y`4![QA4V43\y߹_$6Y r?XAhC7vuh?:d36TφCw$)QWy,CֽAGoY/ ;CmYCvpJԇ'ըApbC#,K}.KnZR\!2 ~uY7ezš\jZ!CzZwl,Q!ĤءI"u(CԡfkE'r_C9ԡ%]hui2W,Ds9aC:t{C8dWVPZ 5_RP ҆2mҿ\vP8 6d Yq_hCҐ]JCFA^c+HCĔBih Sj+sK. % /ie;ICm|zl.fG mR\ VPe IjX!cBn 9gC:![ b䡹C0塌@c@}n\![iB} .1YNe}nAЇ+\9CH#uvR %pҿqȺz(ֻ݇@ #I 2Q@4WZ+A]hևZ84!B^E(,DAݸCPZ!`9nCFٹ/!TwCA'7!K50C] n!_TnZч,pzԇqabCw&}h~!CEN6W>_Ce@(D CPqJ Qu:"Q"IA ]m/%"cPzD|ueID֥FQ"(F{шup&B"jZ3%s;)D)kDԎ5PYP;0tq\MXXSP;8d#N/)qA<6Cp׼ #u\!HԂ@.  <աvR,m(mDqݧ68ԴC=P+SJWZġ !E!8ԺP8e%XwšjFC}](OHN.@8*D8T,1G Gw"P;2>Bד+~n{"Q_UpȢD" 5i_JDݲ u{@!#B7zRl@F\9QkNR )k+";(.AQ< D}YR1bNC$xzԇ,[¥YR!tp)]C}␵+DC$Y%Y+Ru)YR{8d9a.)Lq[kCWε!{ Bm(ІE PYLm>HJ@!CQB꧖5ڐHQWY6oa.mK6dY ! 6,ŀ) F.mW锇zwP$>N yWyJQ<,+}N @5XR h° ˺Q i#Τ`[!DhքewY3$,~MmkeY?f. ?1u LSX\`y2TR(YFrPtTҀP@r7yy[u0!k<!|h0nByB7Z!;RkFT%u߬ruW].޴J/"nW(T,*Dk(V" y߹r(@d`/ b3rHںjQ lُg,NeFdʍ{6!!ZNKO'Be=D$M3~#jj9#RM$=|D* ,tGJ}D:l#*d#6"ELD4~|CU(P"44iD42TQ 2 Cuw >ԕr &7C# &n:>o% DY}HKهڇ:}a@dGGY }[٣)A"gY%@$e=N_MP"  Q4Y)Dd%YYIDÒl++nK+T@dDzJ@d|z(@d B+!3#Ȑrۺkd(Hn-!CI ˤ;H"O"[@qh)D|y;q(!T9p)DՂd$c+D"xS7K sQ CQgo؈~j#ZmD9'Qm'EDzr)7."EDS\DwF"rQr{$Q.tQE/*fw2|4]'D֩rp&1Y:ijND@v LdohDCEY"CHDHdWU"D("m^eF4G@MvBG!y)kDv3&vG"Qڈ"ѽ"=z"+%!D^u%Y9=?zEC4+)$Ct!=DF%s!4>ő!wp mfM>%NQMf{5xAd8 :E=HDsPS(B%=H `)LQP"rCKD7ٻKD^A'膥\Pڀ5HQDy\lE}hPoYuI;C6n PumVD!s(m=N?쥡Cȍ!J=Dh"!=3oM1E$>Eug$trV[s'yv$isNS,AY#Hfi` ), ,!u<5$wьARXѫq$ҰS' RXףWHfi` ),Nw$s?iVj,:KHaGƑRAd$I:ˑRd]Q}e.Hf3XB |DeG ?z5d8Dpz*Y j>#` )u$T;,!zR' IHaHf5H թD$T,!*` )8Y#+Ha6db%GƑRl:Y* [g9RX&dtDpGHf7XB2KY* ºّ:Y9sU4Rq̎d%GՑꏜ#Be)V5@2KRX,>KHf:XB2KRXẂd %ΪY*bvN=@2=rV9@ˋHaݵgHf;H D$T#,!` ,ՒKHa56RXlIHf4=XB2KRXwY푙 X^,G *فQ|+Hf>H2X#͑R!~VY@2i\v북0SHE+EvȢ(Z08Iځ/I.Ew¯Oː4K/~XwA3,Jg+r`P~'UODqPdQܜF@!(J~5QKA)( X N JAq俒b)87(RpxP GURXSQըb)xU(Ppcb1RP NJ AqT(l(RPwRU,OX !JAqT:)ThĉD!(~5QKD)(RP %N)B⨩ʢX +JAqT_IUB(QcaEB(QV_UTRK81ӈb)DQ &G)(B Q̢X i XAb~((ŜFK! RPRU,EJAq䑲^H(Z"jQ,(HJA"#)Qӈb($(Jn=Q ВBP,KJA2)QSaEb7)QR_"<) k,J)(QUJ*B)8* H)DqT눪XjI"Xab)R BaE\)QZ*B4,X TfD"i)QURGMlFCId.DqTpFE x)RK!ЗRP58*눢Xj(V Xf"XXXdQ,cJAq俏b)&S BaEQJCRQ>L)(B48*ٌ*B48*uDU,5kqX ֔b)_S IA68**B,78jYG%?QE旴bg~/ɶo曾nm5x׶wmo ysgo57vC7M7=K%p*AJq×ROmzj2Х +RTԼ-Z YKcRs^_:H469#ItR MBL*5k^7^rYbppy;j[j;j;j;j;wW;V;;V;V;V;V;V;V̾e;̾k}϶nо BP/ ԋ8 ;9[hTv-6<%l8^ۚ"ۛ!˾~w;bjX<ߤA0VWlے -q2ki5(qe|2iDh: ]ob4&[#i34ѫ0qz-eCۚWF" G_=fÙYWuAboqTAT2(&$懎Sl ?6晿sKjXnxÄ'U,ӣ`3R\tQG \/l(<"|]̓GM ٜ~-'QNivVԛsԂoޝ':GKnUksC gKMMt~H}5!5xRFb3P'`#]rk QjrE5Nb|]bT#ang^أ ͞nt%?_ap×\$TPהG~<8s|y.LsD1٧!eH9Ϲ S浴!ʟ9Klֻ*n!-/-Ѵ[;gBjxk6*!u\m>, wc>'Jp<&S@ 7yh:j(R^OO\4[ns*fdyնoLihߨ]n36vCYa*;ϏF-G|aJ5Z8߄sF3`gcLb_<RSen>J=ѫz{>pacimғ#_Դ}?q>F*֎޻v15W׻pendstream endobj 364 0 obj << /Filter /FlateDecode /Length 9424 >> stream x[%ǑW{V060 [퇑8In#CͿZVVndHȌjKz_ߤoӛ}?_~xY8{//F\He|Ûmoӣx.=zJe|9U"V_<?nw߾}W'/oς2Gysn#,?H|#:R깿~ 8Z[?cN|cǣ17G1P{dUFLx|>.AJ8^m~RpY}]vS٠T/ھWDG^q~GzCQ%Z`_MwO^w[#?E3K-[ TҤyDZTxԝ5V}p(Ѱ~OGF"Տ*UTOVZ^[rC+oo|ۈJN,k'`>F:wn,T;<ӫ|NOlb>nj1gVVLoʾ߽/~WUg&LVjM\)ԏcoϬ\/X,2J{{.H 5n3%Mwh[+87ٓQק_]ToVwn7oT,6 GTSeק_]'dz >]3W?~~קq}ۏgo?>t8_vi[6u#?F/|k_~F,|GDMGE/ JǗ~`!@b/Q(ˤ 2:U ǃb#$8BD t7GA5pCdw#GSjn#F {b C1Cq Va 5侺2o'7]hlHV9!9'?5*= \>@!}sՒp3U#YOfxHHP(V#Pu(zZ{hB'":82EHB-WwcHPJR=gRQUNTe]%bg[հK 60DS9'Y`%(2){FZJgROZ޳jǣ7Jd`=qXXn^}yL4:m"Ph=cP k]`gu>JYPa]\1]tqUSV8sPo(xLsHZ &@Ma瘛SKpN ]5Zn] rJT&J]!SҁzEe"ɤ%AQQ T Fh4a^{Tk`q*SB=aHј%f0eeZ21a>wt[2iHX0 I`%VS%$1(9|+/$Æ4@VR,G /WBr UQ`B28pc)FGCɒN8yMWIQR AN,G &eIra_9d|`"7j$m T)q`8zj=prfI=kmm }&Ft'+ũƜߪ>}"ƌ@+sh8qBrHN4yCymT U:+`X({6JΉQfl ~-}̶zga+Z63a=ƴ6̉M9++Pɳ9:J',Q<MXbO1Xg\}wT]B:%B,% ^|$!X^!SgNT6$`j@Y !'{_mܭxjfHA{>m2p@L0e8aHZg>AҩϳGhSDzk4wMoUS!eNk!0x۱1 +d([]vt:g(&+DzI ~ɐ.}JEԗKHcvV8X?^+N^C0|"Ŋ4Z&bra4Y@CcEI몈.pKt! 4̦-sy]@7"K[iXVl+߳w =2V%ٟ -?I+{5X1шW)N.h1dܕ:?C5 [UP"Tk{O cCpD.fk WnѤ;a ϩ'm3XЍwRC{B>1*C 4a6k㑦!e\ 3(";^ّZƯ:wɌ&A:t}ҾQ} &ݒ)%-{A֥=2[+AP0˓sj 6sj e s`\k` OB$i/s #WuDF瞿GtwpTHr+^ ^}o TLٹ¤.$]BO}L)R:pTN&xqGÛ>$/Ig>._J>eKuAB .S!N8B셖Ǻ .쳏{p{gz!w(E ]7w9_OU5/ԝ'䷦Ө|F+} ߽Ew 3׽Ka#G"a#E2H4lq/^X߄+a`c)촱{}QħLi#$Ӵ?Q8[$gopcs+!8&y+`ہcey(RMsiXCbx'X NU⍕FH !AJDy#:⍕MjC_U$S1$o(_m%ϧy#Tkм5y.o8V} 8Q8B}6p%9-+AFNz8L67p #)5pϴIF"l(m;mDC´1`(;1n7VNr'ƍ$qc7LLbG7n ]p#tnDzx#$;l6F{ˤ2'5܄+gU9NFHqc A @<Ҵƍ9,=ʥPwXrŢIiITRw\n,ڈzEyChcr[QօiceNE? 1 +vZ7(7V&ل oBYA2oL,\$Ӽ.2nLޑ 7R ıLIy p#3mNKo[>$1mL/*gȃ¢49EӖ6&fE My[f) .H i#5-mЕ]1C7>\q6nFΨc3=XnBaFd 7%p#Oj(jnaO]q7*CJF`]q# 72epc( Ըin)qnLpRך[1n,m &36nĄ FxB1nNP2Eh_VSDH/`oL+ᾰic%&bqcЪ i#$+-UL*}ŹƖOGC6F;J7U*.667 QAqci\ EN!WFh&(hJҸUؤ"qZƨ\q [7L2!nlص!)^|ļ176!o(xc!&jzB;FH1)))p52p#T\7pEb[SQ܁c8b6"7qD 9҇2r}7rvF/86:+1,1 U!c!I'I]"*oV%"XqdF8>ILql|IK1$"Fos]G5sDj`I2Euy.XTB碎X#_Ա7*QVO?|$fw1G(1Ǹģsl\rfk96B!*3G3i1$cf i2sl҄1$$! :8cky1#qnfA*AG\L !Y`ظ:B#$H:* џuۃc]Ni96 9bM;z3G(y.)ؘ;t 8Ԕ#vPDfR"b]sS4tЍðdfӌOktbgnb1sl0ji3sD[9L@!ƤB*;Ykw/K7c,n-VE丰Ս' /swM^f꡷OlKdA'*yrsBLdKJާd,jT}aHJ=ʬU^BY*ByTgd@|ΰ2+9 .X􂕑4$ h VdXʒUYRUVJ-T3'*k:/TYW,rJl_akD롇*QH%#[?hRY"܍^2ZTQeH%]=VѨrUVfhdeגּFKƩW9^2&JsUh$~άf`X˰2>wXYY*CPZVX%$U٠ì2U*.V?*0aF|KE@rSBЌj)cY։S*5`֭9n)+ɒ[TBikTVL@.u'z *jo@e< Y2;Z:+'9oPI%TbɠtwP1>JoXoj_VL*J'$&0Tp-*o9%Ri*2;?y{E)-]̂KZ Rޒ)k^,H'HyE)ri=H%0B?8iRYo_HeIiE*6E5|hʼ̳ƍ*F'T ^՘T涘"H&1DoJJ;L*̓"9H%4$Zн-Tjd4䖮 RKtg"y/RO?)RӺaJ0ũH%7t=hPB PBbow@%b#-0%5_\Tޝ R"nqJ~jS2VMaJ4_2B%m攸&%SV Ȝ2h'r[Ɣw?C)>OEn3bNya TTƬm *Qd")#”ѩ%S֠sFĔ5Xj|O JYy𓟢;q؟E~QJXdN2$F))kH8"\2Ȅ2z&H PVȞȀ2xJ^*hh@(C"4/17-@06 (+2T$$iNJ\U=`YUW5+̀èsj1 ;ĢEg> IO2N (cq DPBRL(+Ϝ3sJH_k|!Uʽem6Ɠ@%Y7PBM(D(Qs &} xrFA0ʬM|ccXS.#>YOMb>YIxU7C\׳?}|T?Y*R\:^CV(wPB<j3K+OɍO<Цg0y{ ~= <5|Afl>>jfnIJ·åݥn]R:ApRe)&lǻw.<-NtOA[xbB#]e Q|-|_ Ll7$&rA,$xzi/揷}o^VO{}}7w-槾~:d}UG~oVq3Љʟ]ar;WlxWwz}T;O?1̚|GK6Ku?|즸O^MlT|3&%DM^nJD R!kZ?0yO;!Fqhq}v{" y9߳>~ [0XlZbڑ-[.\|Zny.}7siӋwMWa97g~8iO?휷9Ng(?SUoGR'N K^kv[endstream endobj 365 0 obj << /Filter /FlateDecode /Length 1610 >> stream xXnE}_}EzMȠ@V!a-F7a|6{kv JDzOWR_rgrˋB-/o:N,\/VIeT׆ŋί4໧#"mw&O6+ջ\4݀ee2{o5,")d͖#Q^ROtIbՋn(Wbyg .T X D3ЉHPd-> o>RQJL᪨vQA2do؊i,}w+`7Pf/J*uB0#  58ʐS`~j=S"\[eSY]s]`^|R67ϕ`޹Qf\G#0ZO>؂@`_V .Ҋ*v4[G%8=6Im5ÁOR3s:߳k>r*<\XPd/W"Lda>~YYupuFb53bNHADՊ>R ~3 by!O =pA͢8YŅdN "a1"T󰂶C={,eN '],v<`-97Je.O h`5lq+ׄk(MUeSA,At,)@ncʔ-z@e9idzeb 6f], 9>?M9Pf! 5 8/r&%q?؈ Bȥ\O9ՌfubyMI7՚w>&pw7BELȨئ(CxCŔ m悊p2 GdzR}Q~iiZN3f[kEvQҧ3!|.qtmϧ} KdE2(b6b}UJmcig/wR *XQZwo[V. ]@4dzꮧV5 L8Fohz9|frHvL/d ~[@KdZU~ɲsڶ5ʢmw{rKAV4Cfq(WWC؛ o^9qJ,.gZaX8=2s׮M"7rh36}b.?mid)^h5d$Kay>@ܖ7E> stream x}K&qݾŅV |y!h؀ J CRg8pqlQRZx"#"#_Qv ?7p?_~_}F}׬5}N5֯|?W-וSz?~u_7VUNoX JGYߙ1H`{o藽L_*\Wz_گTfz=wo'ݯ6X|UzkLurbן߯~?r _ٚc$ G'^J:/gZ_-d׃qׯ_zh33OWK_|Fcݫ"Z7ߒ.7F5UBcNA(翻[ 'f3!?LQG4̂g妜C^e)l^ʐUVӶO==fƂ"=ȸ,2_}_}`ebЩ{?Kj$(G@0V<$ע/z~7]|.Dl9>~uO礿ڒ}]hG['X|rhғ'>,g'a71H e>oO~9K -fX7a!ƂŦX q5X/B__/b}˙nIJNwoYw)sJX{9L8)lNd?~xnC" oƯDJi8/3+4cԘrH~D;$RxH",D,:HsCqp 7JH,4Fvxݧ$66GJ%Θ#Z= g$Lژ뙞dʖp@V44!r#q jHY`j6HHz3wu?3$`鐭(<$5yA]Glg$ BY#9!`V fxo2|tXY⡸][jbDGHC'OKSh}M>؈#9qyk,Z}}#Nm^Cg;niGۙ)8=3 %32rrBk<rrgAgnge>5 =Rj?θ c~|BmgI$m Do@'<:[#MgƉ0]793Hs@WXN YIʦMA둹 T kgQd"@ m'RN*K<7B`Yqil\bGrKR#M6G$GfnGr2HEXKZ88.l 8֓GҼ_.u<,@`=2Nw)="-qrZvFb2b35vW?''S/μH瑵FH493b%-X8Z8`H!3l#K3+ykg{<ؘp1c[53|4#D؞ȷYb?&q6qtdSO ʙ66O3kInxkyqƩ'Oz!I#~b:_8*9!$U?|$~flsxpُLܰ:Eי$rKq,ݬ>Ħỿ3# ,q2[Ffk3oc_΄2Dx5#+l5fm ap'μG[v=MscZ؈53ˬmD#ֈ kIvp%X7Yb!bc>,13&'Ƒ.'9XSs(;s~Il̓3GǍ*ΌZ{7I>Ê+<-ڡ̱St='Hg$VC qɁL>AKKrX:q::jTc>s"8r.k}7晹ָ(: .tMv&pᙋ_(ć'/2Aۙ&fhS$-31n(WHD^"әX;ڊI4F?~@`n3+UKufh 4BbNoOgzjG #CBB=ӝ(߫U8 cG.Ab=r3oꍤG|@ȂY4w[T(,q9YQmCo%3 Ej¡vjN_NY6P8>r@?kelXK:bi|BC G<ˑ?k//f@&/Cxd>cull̰g,_ -T }#9#.$ylWƧgg8),Ъ wq~d7370(4%<}rq-KNC3A$N竝9OFF|HEɦg:ݸˑ/C8; 9G.dn܊gБDݏ\84^OќC'pT9r㻺8.b9># [D9RI-#k•[ g$r 4gzPBi8GLYǑ*̆IĹK`yǙt:cO8)ɔY {8{uiOq6Gr\s#.S.t:™HldDGeZXs>oX%8BG$ƈ t+j ~J&hHYّrQl%m _E`'>n=~}ِ>O?^.\gsiIۀ@BA4z@ 5'GR Ff=$Gg] / њs][iKz_+߹w|E1+kڿ+yyKVX_4, qr|/dv9(+oaGm^d n,_ aų r*XT>,2XT6c m ,A*. 5cƢ58rVQ*!J%kܲ,Aj>n`)RqZ2n@MլU:I;([HJ2Sr@ pI`@8eו"l26JToy"=u3t]=hk-hfB> kQS i[JR Oc zd Ҩ5)+pY4h]pYD֌ZHG\#q6JjE MۥH7ڮ/EZ1e{ח"-0P!9YifR[ 0f[ A/diː:G7mba*0\o:r$)/tݴ 5\ Lp =!APn 6ûVjH%ne5MHckK^"J cOd )ꘒAި.C:"Pb)ƚ AT9,CU;%LT.EFcW>Y w"G%5xn 2YkV%s $hm9!)2PўUp#K$fR?5/YP2uحԐxX 4:>eX5JAU T{!mBekVCVhd{$l5NGo ?g,/ NaȠۥȠ'ŤޏeeZmՐzj5ae֓iːIiצ-C0 Q#Ko-G -VʣೆL++4dOk=v)2ji5JKIYen \֏ݺ ˢW%[Ak6})kTC b)5Ԩߣ ^cJQ[HO$ R7YD Yܗö!WLWl">MjJl"CgaP Tk[Vl"v})2`Ƣ)զ/Ej.VE ,A|0KdȠN~yن.'L M/ ';4n ,Ez;f)r"Ka%(h"X9Aiד"Xh'*Xy H9Yڍ,wGG5Ya)xM3 `CFv4\ypR{)qVo )]vn`6XդH#۴rRXiC[rг*8e,^OY,Ex&0GME![p7 nq6MS0gm311$z Z"~D Dتk"~s%%jRsM`)-Psq™/lf-#Em- ihja^wwɞ5q#D(y.$664 #h} p/*E0LK{ɞ(aճi8[6[-XޔHQ(Itm7[ߌFҋkXee47$o2Yۨ!u& {'6qnVuCXݔeHu30.Y仔OnTv2$<øU"Ev4bimJal0Kj>Wֈ_+o2K,A VOW(+%H3L"󿣺 )TV2`OM_$lRp@Tyfdd4𢚱r2dE+K>=7@ή!4Lfv jQai+JSgvE R]%nB٨!5(A6V%n[W I)(~|n g~zv- QwC?⋮>$ͻHgk@ )CRKhn*H7CG;P}GKjM+p B?p'o.Žp:+P Ag)Xva-$g)Xw=KqX,ERijcX|ԓIxV/{XcCC4ij#)8mCC>Vp!W7\H`ힸ H܃,E<+~[.ijIEXrUѳ{BKz"wjː=q!y=ij ,Y ,XV9܍/.$ޏ8ּ֏ Yzױ B|+͎eH`ɽSRijXE)8rԓ,XYz9ڱ ,YxVK[ g5k2$އ?\׬ːk֞gkù!AeCCk}hcٕ퇵[.ijʶcX9zeۑ B<+˭Z2$v?\go2$g)X'.ij ,YxV=q!{B4$vO\c |H B<+>X\,E<+o~h@E~ORij"cX.ijp*!xVЀ{XRBk}hg!ɐ{XV^a-$և ,-/X\,E<+ힸ*[/.$Tg)YZ YZ ,LYxV}q!%e\g݉8!շ>\gi 2$ބg)YZo± B<\|ɱ ,Y ,]XԮ,E<{?Y] 8!Bg)YZñ XRó;~ϒeH`IERij !%>Iٽp!k!U[H`^!eH`HۭCŐo! ,.Xx!q,Ck?TsfА{O\gi#2$և ,|H N'ijcXmÅxV≱ O=H`m~hh%G2$F\H`m~h@̭YZɱ O=gX}ÅxVI؃ {BbYmą O=gX/.ijcX/.ij !eUBkƅx}o߃xVڽq!U~\H`xA4ij !Sf8={]eH`YZ˱ =gI.GR pJ< 5IBkēYZ˱  HVij !ːЀ{YZ=̱ X9 B\H`~2seH`Y)SX9ZΑ =gi:2$v?\gi:2$j<3 vO\H`xAk3cY}ą{weH`ϚiGChZA~|JzeH`xvAk~|J%ֈgijX#xVs,CGYu O=gmVlx*X,Ek=?rlM|;Ck*Y۪m}RdU9Ny/Cna>K\9IDWMWuH{S3nW֕:x _c 1Nz!_g'ǥ|a2-ҋ?'q|L"=j1Z˟CZ_Ҽgi{֧W/`\/V`\/`\/`\u(TqTha?m4H+ kqr||DK *_>~gޭ Ȣ>~_li@/ |Gp]޿:>Gk;p@/ G- tW! J_Ǡwg4r9> stream x]&GrW4ϪJ [`8aH699YE6vLVVdTfdDcoG/R=VG5?S[oYS;'4Pf}pIi ;[jSz/9b_|KqşZ+cKhARe{lqǞXJZ}j&thXnǵ_%6nam0/c?Hy8A;'8`cH}pQq1xcUG<1`t[2tpV蠌Cc׀반rTa4/:Nc7h{췾tZ4L;~n,W3=⼹=` \|t[Χ1Z{V˥qKo>ԬwwZC]b5Z-a˟ӁL3W_2dm#o}hyg˕rk鸃 J*=Ϙ~^k$VvoS}/gUWq{\#%^˵^ZAh]UfbrM~e5;*nSp56gKWa x?[˲9`7̜8yf,~y^쑹j_ /Ww_ E{`>2،oC/]9u}wͱ텮#3zg'k5  [)p+GW ~xu:~s_?kgS)ؕΗyy ^^~ ??_jJ>_O__uWdy<_/tx=Wt{_u?u+ ?Wtd/ƹ}tDyO ;oOeK{Oz1QB߿7;أO8l7  4^`b6H2$UYޏǶ[tB?v/H0`Ca`0-DrVY—3MP}Xc9%V( %tu5 }:kKsO4cOaF+ k Bx7$0! `QwxW Hx'Ϟpk?0&RQ2a-aRj>0eQ?ԧa2Ɛ qM&nJ6,1Y%Fy4ji%1G6ja8E?ݫmÆz}m<×|l?g$IeVvHL`Z}hkłiK6ݱPm$$;#Wk,eX۾.{>5>r-v>lj섗U ` |}g*]Ûȟ5o6I$۴91hfiGf{:Js_DJ_*ϼ"tݽ"S5+VOrIWx̾d=;s{RHs0g?A${8Ԅ)gڇ&$]4GtW!i$"̍($q&O!Cf1uXe h[d81l;RL/^N9%rWl}H"8)٫2jOYA@Е f6HX>F: 4[gb^C-NT krKYsN[$*͐I{B2Jzlw }2ܣ9G3g77$;sTXQaBbrTWcd^³-e^S;3h}jo4H^$nzPu8M2/XWZgqdw,Yzʟgͤ2˱+#ȟ)"OQ<7F1Juct*:rI€*T7mpAݠD(sHRKXe]tSv8 *sGuoa#٦D~HæHZ$-򛳲}FsWwgD?I1"QڗZT>VhQ8ڦr ++aZULU:;r:cxBP= 8zVۦ۠X<9[FX7W-wlY̪:_܇wm; &p!63LZYR m4fz|e= 1zJ!Ɣ&GH3My/w}[Pe*Uti0ϫGc]N(uEc }fTY)EjxNtHzd7Mؼ%8Qnþ6fݶ/ˣqeJqZI-v)3ÃBYE~s0 xIF2$. V]Rr 8P !O8ce_Q@/78e%Q\G}~ɺ\7q o[m IpkDĕȂ[#;> gU?w[鉫 ml릶Ȗq}o[؟o]J) :o30U!-8I,qo EZ'}oZu )󤏐E+OJityʲ&'&u${)=مL+-#>G ?(#fȍ͐x_cuMì1Ǽ1}alR-}ĩchRm@Gt<V$k( | uQLe>$qzݛF!iƊI 1ct+d 090z2KJ"cb1+$#$ÕFLj4a/'{D|:\X6{ķpL~+>fe KT G >#8!uzwhT+G~؂00}t!Abc#Z#ugN!𱲤cceR$X>–>F/`["XY 4|ZUh:W#$9ce Cb (2|: 8| *{\%b=VS 2D0{+3,au-{D!dnَ#=]܂B`=,VIL+7j.muL![&qT[ce*s<.31,m}&y )c*ic%ҩo@qr 䪌1'1zL_z1.o <،#p3z/Bk1C9Gj=B2o1z&) }Yxa6FIusFh3r b\|cs1/8Fp a Fgp6Fi؈T6oDs7";Mq#T7nxj7BuFHyq#z7d_qcB ƍEʈOĈ~"F&wHǫS0}NI1oIqz)MH ezʉ+cTF2 1FLCG#Ft&b\bڳ_.o50cmNOĈUocX$1a.i1i1Kq~"YK&Y03,Q_,Lҳd>td>nFW4#2YΛe'ĉ% +:zhSX2,~Y6d~X.RV,gaB'%F~pR1I. CbR²@d9oT JTTwͧ$E%!g* KN%S͓nKaI-%SwAĒRd&XrK&\ % NI=?i0v߲<$)&E'䞨GŌ&˘D;jF7I¡:Ldި>YYГhr g0nT)0 Lr(zaIJU &<$ i5$oӌF$K[e}*2.4LDMh!HU"44,<$v㒬L.ɒ$aYkr~D3%3#,39$R\>u撌d%cɬ&dD$s$3ד$+j~QHrIoL7Kꂞ0diC$YSQ{2I΂qdz5$Y7&ɢd4@2x @ $c<27Q8PH#]@{@rHfÐ*kJb Y\:y5]'L%\4rHrJYDL@rH><&d}R{ɲƈ $ O YdٲHI\  $GR|@nq>R9 $KqsI{ HP=3h y͔ $W$=}}#x `>A?y$o&LZ" fV@2>Om"I&s܈$ID{ ymH^ ${ٌr0 Z O6 ?+ qEH?]<2Z:H)FA$ F&qjݼD^0$9ZSU &9Dr} v"Ic< I&޺)g$c3<I(H 6&\%B鼫b"E#Dz>DtI2sFeIm^$ ;$'iJRgt>daĄ ܡ9'dĮㄒ{zLqLMw1dozgB38քdJ#8d:~ƴWI%:bT2梛$Ւ:JL*!Jr>i*y'Q 湎2q0LIde}PϢ5MXm(&tP2f蒡f'nR(*Yh&,VFT=] %cAFJ#d&y\I4 &y- %+3Cɘ:P2\HEJ7Pv ;r %Rr-(\C+P2x]dkJid J.WT2&WZ\p63T2׾>YỴG\dWJ8|ĒM5Lۊ%!Idg0%ؕ$9$a[JVoSmRsK?JSя2\dnOAV_N2徛yL(KJДg &+1z2KM.A$m2i咕>yݓKVÖ1/4 .~h& :J(cPV26]2i7IU"@YID 'Os PVJ?֧ +g>YR<+%2y4 Q~bFydRu̧L(, BYkO& &aBYa }PVfϚ\&X|SPlm@YFJ,dL擵`>YMxœqI|']u#>\|2-"3D7ɛ$,Sm=𯻁eI8+g> Irld>Y|cdq[DP|W'eq~JH\~Uʵ%vi7)w=J)@ JH (ף(q 0i76d>Kn@F#N\=W4AAbydeaFķO>L> @c0^rӚCNJ}>n)@Y]j%ڴH(o]llԀD_ PNZu)yyYGh ,&H5qbz93N-]'-5*5Ȃ[ڋ,2YpkĺXݜ[# js 9yJ2:e*5T l)FyPv pøxۗVdi3.u8L>q7EK'e{3ıQk2yLz%0Dd&a;5C1막HHߝ!n~ }ow-^}Lwk+ ROomT+h}wˁ5䍷M_>fo.1@`}@(ϟΏ|)Uoe5?o$)_z]cm֭^גsx/9sv$՗O+ݿ|Q֯Y5?ϟzz!8s\d@D~y'׹w}`iog[?75v9Ϗ|#;@,1񩎐$/n(q4)Wğ=jԩ:'pE:Jk5pĉaWXt_%l.$/7_KeEڗYbr>,/z_amyC}xU"8 I X&:|˅ݯl|`g@F7?sFc-fw|ノj>ŵ`|Lū_lZ_ 9E|Z<ӷj>.`5nkZqZ,x[\=t> stream xkfq7N'Mn^8@8F$F@hF#E3#+Z{#Й 7/E>t_(O7>޻zJe\7izJgyԎ7~/e3痷8y>Y`_n;+ӞeǮn?n*\GFyi>|~ ^W?j߾ɞž8QnǑF~~⟶}i:j՟"=t_X#=M.uYA7~FJzz^oTy\o9Sϛ2SQR5Y_r?L{KlVjϫw*Qk%wV_ncyQK2rM/~ekyJiznVl߮ٯKJj5?k. gAT"|qػD?EǑ>γ]ԌTN}l.嶞wy,?[xٽFcXc7X`J;oYf}o_$;}Kk,/}է:ӷ[Ň^_e~~~7_kxU* wnXֽ77ê9`:g۟x֣JG<=naE)7P5?k6 c_w|)}jۍ?~)qZ?td[v3wC=_Σ"_uo$kln} 5. 7~a; +w۟{OPtbSwyڈ9}_fG߭`ZGFٟ*y׏37Ueʇ7ԗzrOf{b K#؜-ݜ7XuMðoGKeF}9k|p{/?!,edsު0:iMWN0ذᯐ>oͯ7ɰ%]x )%%[.{i/|^acuk?G͒_,\-|U VR ɰ[|0pMPvV,a]`".иS;_RQk~ao\6.yiTT\=foZ~bC{i^L6qjx+)G7韫zاᖋ7?StܒȧՂŞc~%j4 0PR|Xʸ5Sֶ~ڽ؏jyK%@3KCô6ηtw~isCoѾkC!)29ѽ'F j(TK stp 5Z{䝴Yl ?̮,C nplgͺsX}GRr7$/&PGucZ ظ6UK};,6]Q-e&\gQuOdNPeþXsJ斋M״&~jb-+cNbd+Y—y^/>evf9GqV8O6zJ F {L^6 ~d>%c=A%svpܺ[n⮀ןi^}%͡,}65 +[/, ,jn鲙7-\V`9Zlpռ:?pgͶY/ ?՚l@X5՛:|Z$2pQ1zDNW2loNl桤skR;l/aS'lh <}6({h>(T7c˿YnQmzpyeq[ˆÆam6ʳCmYĬhՊmRt].lw`/X k-=OZ^[u6U8Zݺs~^Kwcwm\rhkH7=԰moUaŕXQz1>8mϟk€c2 ټf_GEFKhUÔFU4:6fY58+ټ+GQrsƗ9[?25uyelϜJζ:my]~ C0,6+~5(48szW%;ԄܾI&+f5ȧ}7r!8ӜVsR{*3qIY*-֧NYSlWכPxS1`冮5(*kӸ+?Cb5'{yn@` Z3<ɹԳ]S *7YVUj.@9Ī;cA-}Nځ>LCӆ9~`j\׍U!-s}H΍{ØMs*h)hVl guh`qf3_)l,'s ,ŋ X{#a`>lû7KC;|rwNrNWAn6z.6͆~˷2\z9sg匶VfCJl Y:zU_-hX(9lcEGtR* kWji{l:u6r,c [Z¬v` /\Z uL;cܹbnnM₎ʮz?e\JIA?0H$[WT^3KE\Sm|9wRЂUDr'Z0KRW2l0\e1se`)ٜs_ 9Ⱦyz$FuJwd!22K%"22;XȗwhM!DF9Kgy$q"@`F?,dFgBW"dd!Cdtzg:Edt:͉̱Gx(R2YRN*~mKj)@&5r +j)rCj45#jHU5SErMB@F:;679"/w< Q>Fōr89Ę1-nGn,[鹸',FytЋ9zm 5*V4*CFj䫮X5rMF%{wX>6rL`'}@jt.^FjkـFH._s!5*>Z }F܌TQ roA',F2F1|Q+k)M|+FF=["nkZF*e@/@bk26a#_⽨6܇"6rsnTSf7jm TzZU_QLtM':!;:;БI (4\m;6F#bGI٧:;,Evdf;y4=q&Mvd A Gv$GEl `@tdWcH" ё&; Gk *hلG4ɄG6G9y@sT\(kQheW#Уvz4 IGV@XqУ́ =Yē@\=`QOKzY!=<ٯ\ܡho#>(ȏLI~49SElh+cGV>"-GsU '?\ɄCaAd# Z$+:!9M~4&`G`0Z({ 6Mh-!?d`#~4 r(&ƪ#{\ɏfȋs!6P4pr$`HDiN`@U H"Hz 2E4nOf< E "?u)"G>#3G^ 6D|80 Z%|0h 9&">-Gs9r%Q[&>* .@|T|&~q&|T&(ʁׅM*G =*I{~DJC4QIW"$=*bGxd^#=*'uѣr3-Qq7h('8o]ңyӣb^ 9ȞT/o`C&PXdGH vT|bsQR#{Kg|9X#;24Js`ɎoN\&;* 䓾QAR4MsӤɎRdGflgdG&Ɏy Qr.|\h~m<80y"G%yd#pT|6 &82*:Q3AAJpTƃmUM IpTÐ&;ɉ&9*"92HJIhV ɎHã"x,>V ϬP~G0iQq,)X&;-`G; /LdG4;*%Z&;*>;;*EbG*E &qM| ~Ɏ9V5M vTj<`Gŧ dGWIdG6zwbGvN%)Eg/]8M ̹4ãJE8 8† #+KFzd<@GGo£ ܠG})4+:ID9C NȎ{td?’f5R4 \gigY8OȚY<=# YGyAYgo ]erF&#딹H"|dsʃ!b>*sN#{$|d͕{A(# 7oiG4 JXn= IfjQ lG=JܹMz4'/R6%,z4m^I 88j!(XGuqУɇE|u@E<ϊ8r_ݒ&>:?_M' &G)!)ܩ$> >:;|4X!F 's,>{; OT|4 g>:zQ#xASJAGډpxŨƹuTQGWS𒢎d;wx#˹n]cFuucԑ('(~vɆu‏|$֬Wԑ¨c:bP=^EEu*:ufVQ!Nbѥ5s*p9RБ/Zj(ȧE:'xQQ,tYt4BsdU[(%v#_`Q"0%H R¨Qr#7$#g_; bG!# وx#pk| ّ|;eQZ;JKAbG(#QDȎҕvJea%ё\{ԑIS!t,R֒ff uDt4'АbGd3&{P%M;JރVdGI<&B,vYȎv ؑUyy%w V[)ᑯHπyƫy>-GsW!>:/.>f F&|ti3_G$GУEBG'/`/G6rY./#_!B#>r '|tB#F ݝR'͈ yVA&AJ ti  "A;JEȋ@\( $o Ch Q0Q:T~qOHzlG} b6@;OH ɇu Uh |4>Z;>r V#߻͍s鑶.x[n/JV>G(:#w|tG3ztvt\y{CVl =УzkVQazdKPHGWRB\)H= XGk/ =RtJ58BJVАBWKj#+IF0#NأYأ )bG)أK˕+ȧbևXG3B֗YGqG+r;wQjŽwRѵv~iR{}Ž="aG>D碰#o%uGGQŽ|UhŽRŽҡ>Ḧ"D8)ε-H`E܂2 :otbY)AG+TAGtskDC$E:r Š#:btt(X#o:r |DQGZUWؑT,*ȽW\aG:.ø#ȋm1hb3 f%;v#ȁ%w[ID ㎼Gi!Ƚ~;兩#LBщQ;X ,3I[qGk6&T,R ;:8Uܑ_HVqG+Ywtnc7(Ȼ+|"F{t:ӎ]^+-@;} |.O #ǐh <=xΎ`dW+1( Cʢ >rMG>Ly**P#߸w( YGyGzCࣵGPGe|QG1 >'| aD >, >->rK GrQn!_ϼչX#_>#/7JWwrފ=)s$G@9ߝN;_];_ק-hkԱJS*9bН*J|u n|u松;^RJSƺ҄x=垱G]ST_)cu7Q:w:̸2)Xt )tGUQc UF?ǎVbGrYfGIe#\)cV$x w.xԴ~;uI |IknNfGθȮc  7;Y$q=EDvԵV_J Gv 9`Qs#_ |nB|]UkKU7<:rzãu+Gץx%#]?ZHS]HMKu\3UZ_)*q𝲮|uk=i嫫JW]EtuUWKQ2+_]ᶑdSrsWTE*GnLi7Jh%qYȗ BܑOK`GwA#UcReFWƺȎv MBRdG ]$#Eiؑ a7Б^d>DGǡv#yvyGXEe24AX72X$ekE2# LXeiS{+]PHJWAhtu]WW+WW~) h&d@unuuNne0% Ze_ zjJXS70%] 9JX7&j42r$P#ϥ* j$nA#)@#@h֒הHnbFۭmJY7NY7VD@iȌ; ͖I HhbFaqJkuc(gjw+gk4jrֵK9yYW@ry crY Q:9Cuy#W:N} \9q4[&u+ObF6&,ft G'3F`\踡ѡm %;X( 4: F6,ht*F4JQ>e4YqTFčWss;^on(oQYq@Fparq#w j 0"7ZIV8G> !Gpt,rTqw#G]x@ivp BGR7BG-)Hiq:tQSn3[Hotu.tb&etluZ%$#9H`/r4g9Z9 ȑS,hhC"G60O"5m_h"G2՝QG8 Wpa78jyYH|7r$G+قG L0q70EYm J- !>r J&|4ࣻ[iM"#o'Qrߜh(YȎFg`G"Š7¶=hZHtnTE)gOQu)=(z葏3IDz_.z{Ѽ,uG>z7o{Ѭ6DfCD?hz}t*MQZG!+x+qLGx >`!=ץD|3Nn~nz£w5wVGse£+<,G~a8GG+قG1E?19|+G@GN &`<-A<(ȻVb`:r $G)1h}BH\s%m#IsvYFRIʺ<=e濩2)̍JYKRֹ0$s?fp6ٸ6r |/Ay=ue:2+I9ZSҧs\J[(+˖w:Eu9*喳n4utVu}wκ YNJ7 HbʺF6\)벎b7r?b쭳0S֝\nS֝QXWUvF˒ 6nj"7+`%FMiX7tXQ9IG8&n4xaQ:/u+JZᬤuNuׄ#wɺJ'\pk Ge9rGh .C:h#0ȑO9?Dt :ʣ {t-r Gb]tQ#0%;k"_^f֥Cu>2tJ[Wu ;%"<|xt$Dx/*J[zӠudx{:uYku)/GjT[:(b%J)~~Gi?<ƽ H0u{G Sap7:#wOi뎕cE5;6QA(~f+kS NPur1WN NtԪ᭠#%@>:[yNB'#?H~)tn\Mc"-bQJ͏ LR7/svs-sԏsŏ򩓓ďrYӋtT3:jt $J?q?tAG> :Z;HOAGg !G^= /D!Gga{Lƈ#C4 =x% 8rǓaJ8r1 9HTxHyX$ؑ/Q7J|C׋ (n4ݐY b#̢+l䋫<^`R|Ifh01%Rk?"5X9KnE|D;IrVRQ#ojFwga ?F% Ml,ҁk|hT4&vGh}x~_JFjCwJb@aB QfF|ft]ԯȌ-ft,ŌbH<  nEftuEj]b1k3jJdFEȌJW'v 7'4|NDh9YfC &fh/NtDܜD c:UGMO8$P %.9b8Q+Y趈_+#r]ً€ĉNg-#LT۲*`k魳֛FG :য]YuuJ7*pvq|nT|czZ^b>EN5ٴ7ӵ|8wӍzJD\.:O`HF(vp(}3H]JXGH4~fA{N"-(5DJ4}-܋a}v!"Bg MGժStw',<ۨ1QymM!YGy'JGe&6ȍ6zuQX6b:ڨiNǢ3¸)2"k+FV|H$D46֐|ƁL1FR /2`D>smoetIN6ʇPF]Gج''ծ'lN6:TFRb>lH$2|pDdev#%jW-JTt )Q;\(P(Ld%H4tۂD<R"?+aFVZ&ʵB%rxIjV`(w[)Ds ,j0ԮuQJhNn\ȿ=t:ompKpFKD4<,ntdEtt4:vv&ېpM  N((783DEhB}H|'FjD lu8Et\|ݎ6J'P=:h#PtCuwT&zhF#~tu<٨hӆ`3y΄AEd`uQS:(,^s\(5:H5:ԏ vH"^'!ȗksAZxqXEhkDu`E0}QUXo@_gI;Y"`/ؐyǘҢthgX^,v rEh`Q X>E#_'"-*hT-$"(<ȗ\y5J:]g<}[E>o`RE)@&DX`QG-X= X/BQV="oZe",VH|)`05jPxjL֡F߇YGExQiʓS:hp>QnN5J T;&c¨&>cEXCccʊ"-򅂶GIHz#=5]ڑ''F>d#^QH'}>d#E<ڔ=:Q^tQ=;652hkDkti3}QV5ƎF0ֹFC[hJs:_5E\"k.jtF~3P#;FSX*F>tl䕶=ms O5 ՛_> A|oOu⛧z/.ɣ:ʔ-MKm7~_o}h?ś~oOŜ?IOvyg_F] ȯ>"IJP[Rl]4kCEly_>7,-LD(kiSX)?W}6GQs.tM Oﭪ,D,M'> kWT<kSU83kWT8Gk4htT*ZőzY v-Q5(,Qգ,[6,Qբ,A5<"Aq^f]EKT?,KPaSŮ%F%F%!cWU-Tظh+U#Ts.!jzeWqoȦ%=,KTMT6*ZG/bY ;Pv-Q59~PUsJPTؽhGe *rUDe *lUD$TDU^ {i6,QU,AM7q яX†]EKTG,KPacϮ%f%ƃ!KPMA=A3 AfGU׃!KTZ¶]EKTB]IJjYj<6*Z=`/*`ATLѼh*mUS9o*Zz"d v<ֲ@o*Z=xEo*Z>ֲ*UMo*Z=xRo*ZjE4H_i`fDD\*X7-QUY7-AŬٛ>,Aڛc,A,ܛ]ܷJ>,A ޛBV]KP%/oWUs^PTؿh/` *U*Z?xso*Z=x*Zj/E0D͈> Fo,QY w-A-^,A bMEKP1%}WT?7 Alރ,AŬ𛊖,Jo,AŌ򛊖:FDUye=TLQh *TSo*ZUe0ۗ%CuWTصh *TDUyXe%H-KPa쮢eWqk즒%_vWUH-KTB^]EKP )#YzU%wWT仫h *lUD*KTqZ¾]EKPa/eSiZ8-C`.%J%]yWT¼h /luEDUe *lUI*Z5e vDaYò]*Z [w-QU**nTD ^5ڽh *lUDU*Z~IJ*Z [w-Qբ,A绊x,A5"w-Qv*ZF/bYvwo*Y ;w-Qh,AuE,KTE,KPa%]CԴHj%IWU5T̿h n5=TUDU>IJv-AJq^B%j!%h ***Zٛ A3v QHMC aUǕ% KP!pbWU%`hAU#.ˮbpƦ%ڃ!KP!cWU%.KT8s[BȮ%ڃ!KP!PdWUC+KTBBɮ%X-KP!eWUW\c]>,A@]EKTB]MDC\у!jH-KP!TfWU%Rh+e **ZxUy X`i,A]EKTՇ,AՎBBٮ%C+KP!4mWUeW1mSTaDCZA.% KP!HnWTUDUD~Y v>,AUb%hTUDClv-!Jq7bw-QբACМaUʏs$YjD,Ap]EKT?B%ʸhTyUDU{T34r4EDՈvY6*oղDU^IJ/w-A]EKTzY*FmyYQKy;?o9}ZgϤ#R9a7yp7}Vy '?#[z373\<[7aԞy^{LJ#ћvٖoOz÷_Λ&iU~ӛW@G\? }~8~x.?|2OʟK˝ɾY.ݫoי Yƿe)÷uϔ~4} \آǍ_[1A1|,fnXY~U`lP} OvA6>';ؠd>';ؠD4`lP} OvAvW} 5!ɂ%YXKD?da5KD[_~zd8ғ7jS}dO9iJ_tyQJunvE+e86> stream xO&q_ۆ샍]CX/ 0&)VόLR"7"x`OeeEefef{z8?W÷?9}_oA!j-?|784=\×{]=q?=8Jη6ީ߽#1>|=ZFyُ8nM>*x\W\5e޾xJVEkzM=;խs?>>wӤ};w]V":w ~R8Vl"uݾF3㼙rW:sl[,UՏa@)cJ yrZ/cǯwK)tB#Bо۲zO5Ksc'q($4rę W1s%QN@whp{Pt[>q=ԗb\>?҈؟;OܗEg{vE xP¸0Hk=%߹&h.g6ZokO&o[ NNO?|3ƏOVyG#_t:1E<=S;)~*Jޟ퟾?O\x3~~~_s{.wyR[Z~;͑L<Ç714s47toて%{Vh"*;u7iYIͰDCcu?yȻrD#2S1 (4L.fRQpw,:S{Rhzn> +Pp?6Ľvy) /sTi=fɒG(+sM Az8<$v)$ą&"ʒPh?64V%84wTh(ReB(:BBQ(4)r)xn. t nCC*8+WZ(9ձ4#Yu0quVyI:cAαh.JIɉ[(JeDj}Z>APP$|KR:v&$PpDo).Mh̀̊P +A J hStHm\JlbHRK8bB'mZP(~ٟ(\gJt>ݒ:"qT+7:j"ؗLwvq+]C3 ZB팫7j6%-sTؒu@K,PFIMft ''d +8pLAlh@ /QPm!^@m_#2zy өN@e.JJA:(*:4QDkƤB}xxJߏCE8ϗոwBjr/Β `)O}^@CGUFdA"iX2( BDY\FL+b S)CW2(2K9UD2hPͲGQ\Bs*3>n#kU `+<(󨨏mT2Qf*ngnߧ,ruV&ow&H;vMɏpyv m]0Z6gC&6S㷟8b3{ViKpsaDx=(-P8AhR܀nVݶٍ2g|ΤP{(.PxbV\@zb6@ͳjQTdr %kUf]3 0 T|!o9h#ech2rJ|ߑRf@6e*C B |tq<(,% dGA(y5[@_$֙2SHZO0G{jfGLX.` 3ÛT&T3d`~dyS /F|gdzoTс3smO s%U A8[4_4M?aqU?,A;@RumArA1$C(j $Km߰Z 0"^aeY_Cxw@ @GRJAshfCJ xElU673gM2Qm_ !MJGm%1TE g!?82aGfAizW@9?(4~%RG?J} nv]hm,\d5:W2{ <7hN9>A Q(e@Z7( t *dŀTgH%+pvY#(X!^TaAF (T VX5?mAdg@(n%AY'i`8g7Ad8@(L 'R3@27(X۠)>Yn K?Qа)ESx uw@ O7+.i?()E2N 0~@}Ay.;dA~ m0y@j_#86}&~]X SUџ=%=3{ dNSB&!y -(J^Q)h 92@fU!:h)y  W2xsmC=GA=mk% 'K65J: J?4@Z&Ngi{E<()L{2W?ȃ" EOH9yP~@A$ S4<u(䁔l(z Gu3R(z@DMfAd&UCc4m^P)h}48j9쩤Cos  .|tP/T5\J%iGSDrAnVA:S0gŔ`BLgXqds@W0pd;Q.pC]uN,j-O\ii.IR*ΥKJpiιT.$8ʚ;]$BKBrԻL qE=ȡz)yURŻ,zL .$` BhN֙T.Ӟ.Sk\cewi>4]fKL2%t+5mk+ޅ4w\i)޵t+%)RŹ4m\[ ~V v2%$\dKBv޻L .Y*%Y|oR!x-u+ޅlw] *Tz)%@p] ˔ӥiڂ;&SXwP.SKwd.S pw\+FT w\.U w\/S Pw\Z*޵b;݂(L[ yV ܆w\vj&S\V w\†*um[vm[~m[[.&eJpkLym[ .1KR|Ź\d*.ڊw}.SKpRŻx)%RŻx)%xMp]x  ǛL u)\ǻL .Fx k;݊wkڊs)\[ ce&SJ]oR!x9 &U w\6veBkL .K6)T.0QeJpkLq.ek+%,8.S6]gRֹ]m˔jHm% .U w]w]׈YSvm[ .!K]W9S u)ػL hr A>]\=T w\=zOŻ4{)Uj9n!xf̢w.Sk\xi2ŻR{)ڻL v) ۻL KK=ZiR۹\xWԭW-xOWDk+bT 4w\זֵ1x*<ݻL kK݊wc.S w\/SKxJp͘=*]xy2Ż{)/ڊw.S|x}2Ż{)52Ż{)5B&m ރɔjh\sm%jȤm!xt+ޅw ˔XmŻoR!xẓw2Ż>w\+=x)5cTk\Vk^ڕ ރ(ɔX\sm%Zw 2Żw\3NŻʵn%FwkJpE;["eJp]VK^.U /x)52Ż2w\#{OŹڊwM2Żvw\׊S.]x-M*x^&SǼx^.SR]ں]xIǻL y)޵-u+5cTKqWk+ޅ˔j17t*%oy Smk+5cT / y)ui&xS&S .y)ޅ˔jXV}rơ>ߟAum8pr1zw>ޫ/s}6-_G=?/|)tPj8 3 MNn_zl U.譕F+I+pיOF\ݪ~VE"I!ǥT ֮+}?>_ QU8ŀ[ cdmT\ZߜD?Q=ӵSÔ4G?/wb*/oYػ!:4ycbfLC.9|z.aW3jɟkNStikvn+֡hivj4:P\iQmtYGUw'5ĔeM02uV[Mnp\endstream endobj 370 0 obj << /Filter /FlateDecode /Length 12676 >> stream x[&Gr k9ϕ)@`e.!Y{GQ=ے`oUeE9tMzͿ!<riÑ=Ûc5J=nǷS6~jN)vf^-cV$S7qL:-yt:q;ӬG92R9n?|K _?J'Ln4T7Z罦N7wot1skoOR6 ~| r[:nu5D^(Ok9d<9J?-O,/p>+ݝȚTbXcq/8Nő+,FGHn)OWɌDU}GNV}M-C*Əc3#1OGߢ-%VZ+]o ,PKI"j͇w|dkcv4p5\X8w=gz?k6#F}ڬǷ~hT=%WOt?~?ӯ?yE?=7L~~~Zם y?O?}_><3'|?}u?Ws7u CJr%Yܵ9_9h&O7dąPeIa 4OaT.:Y NSU"UQUnP`8 E|zI7åy7FCC* 8j(4r,ceilYiZdYQMZPD)T )%s"Y֡\Pk U->Ebr}KI!,E5?SsA=qip( G C8\\RR\8N3B\؞!eHi. ]g@U>9D0>+7-VdQ%zQZ)Ҏ.?ǐ$j=Bw\jvn%pTRv@QP&QdW' tS'aO8"6QPB. ^㻟 D&QP3(S7 j()y蚢P\{Qs* I }O͗NM 5ρMP'hzO}0+4pqxCD+\^\sP[26++"&!M}|TzZ<4~c2^qu\AFs9g(wE=w=mk$ƈ.:^JCcH9qvrS󢣬ԱXJq+CBMGS$:}":\pyk;;\N-Ok<5PuRj2m+;.W ziEE.<+TqɳԹ&9O׶6xX Dm"8\Էq- U`.͠ƃ ,ryXkNu#,5,v3j<_4HaQԮUV-y]C*NƬ&9C!(A< h9ٕI8E 3ņ 3 OA= '"3!2MtK1)6Mnt\)qIE ;+ 8+GeHIvc)m#' sDK3z'|Bq3z[Q[Si1WD^+C|(:ų}4`@e w~wJ:wPhdAy V eQZ*$BEA<R#iWCxn .(SV5\J񅔁Q\^4x=4&vLk>/k&ݖT*3x#abUC8 EEY6Г2$fp, mUXeVUgkȲunM4cU'"Y5ˤ^or8|9#D(Aڟ\z#8Ԇk!e4&v+JkXH7 yLkT!d:5wi9) C-WʺpjTi%4deaU3V:gu)2kJw uQif,ԌE-*heӯ4 Uah$tY$g,tSiULff ,.u.@!1OuU3eұF:}F%ɢ: ّRĪF$( {p,Ycŭԭʢ @’jѡdI v<|4d4uFr.)qUHyE8UQ4A6D6;p iZchg964@ h@N 24`W9#AAHohKC; &2!c20*duEd@P DQf &$[ -=e,R2@\QdAZ<*l{E 8? Fd H؛~:cWxD^M[9&Q0ȡ23lL:*)2cd3豌 Hd"[`@*M3$-60AGl0=W0;捻gU `o+.`YN032m0wgA52@RF8P( % @4]濑Mx 3SJ* pb]KPs h=(`0q&Pr$4N#\@Mgq4މD*^&`@Ϣr& frMJuȀt3Zy-ȀWưjd@r {ڭ{ TJ 2y|d< 6 9qr)乀A@JdM14qR#;Āly DA>{g葡a)J :m-@ @'R  d!KG @5 W;tD>8hPW%500 |@} P,[f&ݾ2@<s[Sĩ5U@ݵ( x|FwhT"e@nk@UI4>ئ)yTf#u >MTg sе0><7j|)<Q<@rh?iY:@_ 1<+"xT>y@dՙ2`Sz0LOWGax7Y«9B/c|*7L(9 xFqx*FOo6ߔM𝭥gyiԢO Df?Jx. Bxt] 8ׅ0G@G:APwS Tyg42謴ؘRU9,9K+sPeG9/=&KT}(D  HhtU@HEnNyWe7pUVyʏ0"MC?l/-ʻ H 9EZd  \Z9 r&Tx@UΓhQʶ~@6s>*d'X(NK84XAE9Q8Oe@jb~r_"?Dp%Fj`P 6 r5fw9gitd_b1 dr`8~wAN q1L88kQʾ8tZntstNf3+4̠Xppԧg@=S@ax!pba:Y<=| \sdXqT.|&=QHu&53LKWTvdDL*SO'cQ!O` 9Kmi@+MH<5ǐpCxtN,j-]p;Vk+ޕ5u+5Bw Suk+/Jps<M]׵nŻƵvm%s<]׵nŻ{)ӻL u)Υsm%fw.S w]@˔xmŻ{)cT w]˔x]˔:B&m ރɔh\sm%ZȤm!xt+ޅw ˔:.ڊwK ޤBG;» ew}2%%V*x^{&Sk,کxq[yW&xޣ&Sk\cesε1{*ޅ3eJp͘:Z:bT_Vk,کx.SZO\Dp]xĻL y)ޅQ˔:bTK_Zqxd.S ox).Jp=›1ew2ޤo2%F;wE2%5u+u\kV /x)52Żֵn%fs[?εxmŻvw\=NŻ-"oR{ڵnm%fw\+G^{ &U By)ΥG9V Ly)u\»UeJp=;XeJpG;ZxmŻw\3NŻw\/S y)5bTk]kVK_&s׼k+ޅμ˔!)ךjew62%=AndJp]Vk\VKޓ&9Sy[ \s /JpK]xeϻL ]xϻL #fOŻ w\Z«ewA2%Ṿw5C2%fwD2Żwru*5bNŻw\=NŻ&w]x;һL u*ޅ(˔:bTkBkeO#w2˔j1v*u]^#>YgpD&7t?[|{_Ud=:5|_]|enuį{ݚu^5v:f3,y$YN&^FSJ -Cw>9l50,ݾnOzOzOzOzOtzOzOzOzO8= Jg]$v}ُBlg q~c,? o24ȗ2T.["'$C:NJgOP;㓭I5U*;~H-*D$N ]󢩑> stream xuTn1 ObK9Z(KKC=8㴈lE/%9 ‡!(w=:ն{]cytwYmcH=Ӕ|?^u*}Fv9]T!bxXPOa^Z5Jʬ v/;HD)9I]}c]|,D C + \X:՜^+p }{?FzuF .`2_9x'dBtH**q28 #[Epi ԘLxeٌuIGDf{K{Ez7l1W+p;B$!kTкaJhOVaǰXS"}֪IA"w0]˲]6%5UjNד?Ыp]FJ=mx\.x-4BF$iY6Q9S{8LbZ} Q8s{xeچ9D5[z8+JE۞ c$7l K^b*0S[T5'mmA^U1GH)lJZiy3sfdL6HE:'v)֢>%[lXOStr=EDIiq.(Nm"q2kW a}o&[endstream endobj 372 0 obj << /Filter /FlateDecode /Length 22519 >> stream x]-9ry~\q-'I m]S9]_?| 232kZ0ήXzW&Idގ{;?>kt?}roo{͹WKɿ}O{s>ʑ_η}{|b>W:{/Xq9:_|1y$}{nv-> Q`~o7Ks>|yz?O鄿@ѻsO??^$o߿i_G}H8Kr{kNfTLd˧/޿폣ZLѿw+Ob Wyxߏr}g_:/Or%눹Cg:]OzͿ0wWw B/]_/EK݈!vɃWߣLjq_WYjQDWk!{Kw?̫N\e}Q Յ^\ .WgW~OW{i,K9*W_Y]kfM!N^/~j>}׽izE6uE]w:)_^` 磋Mnm^zQe 8j,?\ziB=J7ޘU4V{]'ū zwhAI%_sKc屽חחʽj?>|zha뿿?Ϳ~?ο~t?.g:?qSRbٛ?~4~eڶ;mh~=mDžR<+XJ`Q{VS>7~>_Z~_gŧaU.\_ =/T <~u5pzE@@sf/ A} ].~ ͕xo?%s[z>s%d<ނ p?}oSfW6)fboj٢WuʧE{5{.J."|ݢTM;6)@Զ\c=^GXۖS{e)Fw mS},oLsE1t(5QLmRn(M^>RseXꞻͭG[Kw(K{E|)k٣{RQtnϣn/ּE*xQta`==mC\'b|^v99Ԝ^1{^f+蓵z}-NW,5ǖ%D1-.T˯(NWtZT<򞺓^)&tZuTnM%-s][n2vzKߛZxa{(7)v-üYdMkc$-l@1J|'fs@Cn;q Ğؕ2'x; P[bPmTkh}q NNŴ{ST#ܺYE*[Z#+ iO-(uK4Dɼ~o x0,}L{n782bʪXwD$2gxl Mx{6n|y~lC1Ig[{s!< UMJԈh`żlj XBEYA#J`9o{+ \z([*O//QU^W>]1I?븥 k8Meb+_8,q{LKX2Gz1k_BWc"(qcoptE,Yb3Ɣy9+= Ϭ+~bx9t2[z* "q+Hy 1jcO({]1!ʳQ`1V ދ/wł0ϖ)[{ ņe֢D0jXׁrɽB##rbTtazK۞ 슸[=C^ F؝ wܖ뇊nO OӍ]uŜX;}9bKHعCEe +<Z=ꮘ8kJXͣmY7A/qysv%%-OXXwbR^ ŝǔўkۭXKٵ"ƳU`JW{r[ډ(qϓ-b<\\8k(&8ئ1ͱvS1 +C?4p왦.u;m0bݳ+8Vݳ>,oY yIz[ısC]슭ԝXw{}`BWSkq4X Evv_84{Œq=Ce6ryK_Ue>e S-]1Qq˓zUK#S1sZSOR1U+_It=*{ ܞe]1^>b%rwEcxUegfݮ;]1KhgKUltX1eoR_~sݫZ9M:u)F$ DQJSt'<֐qV^.rAT8{[olU`xb'Ub uM#J$SfbD{m " zHXv `Ҵe]kiju;X9סilFw(ӫT1dv'bU{RƝhdߞbio۸_Wڛ6bwd )&lY<'*q˼d1t=weRޒDEV)?@Mt])WMT]+oM%V=; Qmq52bA+fb<E";{kP,1ljAm#BR(=mcWlG޸^o̬<{ZXݲ@;juAV _ qY=3`ll(vE骑rMR-M U;IMteNk ({E]J&nE,h=.}u-ט7MPl{\Ѯd9:aOW ϶r1e yZ=AŴ'.|- M(3<cM!ba8w%3K啱c]WI)mmnb֞nY#B1g@Hǫ8髓{9-+  7)LP1m yh6S~rۘ`eOMe'y&Ep[a}S1lRB㖵Pdp 5TXY0L2mg cʥ=iz~D/Nli˺b.ng %;'2duhN}O~XvFsyi*谧˞\t!WU=yB\t{ҨAxnrDN4L!e{$,)&L݊`gΨ+591{(sxlJ U7q`~Tܓ9P1l  JMI Ũ=iN6ŶsfnoY{y4ж lNkϹ$6MˮX*ɀZGǞm8iIPl(-'6(ֽybJzĖy8Pe /z:/_riPA*e9"F**ӯ?}H>^4,;%3\\Ž0,QU 0`w+yyfyQ?6+56F$o[.-!BãWIJB3^B2N *{ ,XJs+Y"v-^h6"% [5B ;.A7xyâ ]@ oD-7!1H,ez'v7F^}d@t 4IKyu Q8  beYZhG$XWQKhʨSAfX0pWufVח!DZ YۙVۿeY ACz u1ifd}⎯/{O+?²u%e NjcS0|cK eu{/mIV'zu-^X(r,*,'xVsIr/fG/1?@mO, {5Kk ~b[yY5;G੶&hqy%^ wAm b H%˟MR㣬c"PWwzrHI;ע@4Wa5."JnjDH\>_ڬ_tIV^f ҋMI4V2{~̫_ GaarK*p/+1+3_;d7q AKS9 :cJ#fHko*T ;IRnzْKtwͰ~ZH&~/>2˯;QB{Xj6=ǥZ_`-ZHW]6ct}¼@Eliy]!^kj!VHzE Y)Dtu\1XY`rES2](\`+TxM׭fсՂk)Kwui/ĨїG"'C W{ @%k.;dl} VmD6=_˟  k P]`yl#z?c ҁQT@0^N¸av Kz5~^{~Եa܆^5 3`wYZEtGҁn9Ve 9q68cۡGke1uOD<[6I(  &--9:y`z.#KX ?~ֲtϟpNBQbrpȽyanp^s utd 8%AI:zQKw 4t!-ష9zxaqR9Jx-BVPϑJduApX +I XvJ~@>Ox'sQ&W;ځOc([W,^/+Vpgw#;Aj@<&A+೴k2\{)ϼ"{Y8wdr'i_( VuKr7JԲ5(GľV5i1xW)9nO$aI2;v~з'ScARxdBY?i(yU;e?l/t|0^+RX; ɯ M:0L/Al9PN8oeenbFSVT(eL;݁z16wyXUuiBG`n@].B !B:$Y[v潝AHq MTxR D4Z}d-"m^iBx|r,1(VO4f zL.8g*!Ȍ Yz1mwİLoMղMkx&ڑ{ cj = BBJLjW4$A^_ʆd5RL[ &фO`8'V2I|^Wy^4[Cu)(Ē9 l4T']*1|~ urf 42~o_Czl EPmqmfH(fwBv5N #z)8q}hvQ.oCy)5^'B!`5Xk[fdBX9Ʋ0qXYD{JrFˉP XS@tw0PsXBBbF쀤s/Sma=jXɾ"+Q}7¢[mn=ZKu]ANJ,mO82y*ΊGJ̬-@f^P{ѩl|xyEѻ\m:׵ Kg`k>/]+ؿO]lo2D(`7P:+eWɸ ~[zR׵ץu;bUÚXtjU'\?!bM,V2fd"^Y7VbxXc7ĚXt:2Y!-{ ѱRc٧ dr_F["%BX@|ĢX9^Q@=뇀7瀌Szшu[۹PGFd@bd%߸Aad{zazaAA?|{&dPDIpNzP O:.i׈#ڢ-8E7&D)Y1QmNE^1nT)hsb{P8 ҘCdD0%AY&*2#qx^*1rK2*͹]swHH xE)墴F(#pSH'TPMXJ'2~L8눴,'}2UVdCm 3tqs#$;zSȯ W^BHr@GH|2"\z홗}:L1XoPYpE:b=@8~Ma*s]&7$Zהn+5|'CjG&xMPLaY`CI"oJk ^8 Jgks)2+vsIr<\D+$B{x %Dƍ|ψr4hv0Qs(DUem<I5^,^19 DVɭ9;,:ET=&SJ_%\xTd#xJʄ]5^EU ~!db7xlfPG1pʞǰ3jU+0 Q?:`CmvY.S؀|01 %9PGy=:xM uU%'Cj#]<,9,zaRԚtЂj'q0nUL6*OTZ$L>P;Tu}ĭv zMj t6pϾPI ^PZLt6 $ƃ*:uMfqx`DhLɨ 17SKЎs -bl#²ǡ:mlwExOPd$ lH .-(I m[ˑ'I>PpÖEG`̬'{^,΋(U9`E5 <x0i+2Sxc{Ud{2Qmr&9edS,\`C&gڲa47S|Ŝ^VA =R-Nˤ`92PGx!~,N⑲)_2$-ޓ*;Y! 5D̶d!;[0Q<3hi6Szƒ?"ZrQj㬟bl:~O6W\$ ^Re31UIV0wzkHa,3q|D*Cjc.cD#R {*Neϧʯ%FFE f=w`OtZ99 Kdڞ'Cjg.;_,'@W&ヹ2le #;%_O&7d]l [Y"mUk0Yc>9=vxR{TǂǯKYړ*#  [9}0>pe<'Ch)sfTj9mؒ 8^PsCt{PFfo˵qGao"'3zQru\z: d{+n8~O9>%9P8JwV21}#1l$ϸ#Q]?~ns^Na1䵦@|{9V_/Lȯ2tܒ 1_k*uK &#*J\.ʞjcmKFdTY~WL.Mxc^,PGx ]7&:[}׫,^0C^)2COtOZ(W|CޛFNISKj 4n1=qN;|DPEeUf0,#,kIID~M̨@Be/'ͿWqܼI $ uT[ւ2աR:q2i3%Ğkcҫ(ـdr$|/F@Nrgii%7Z>.䒒$N&kC%C+E|GXkNf@ [`G%P$F@.L"Jp8VƌD[Ve˲E_L5V﹭aPʼnׁkr|%\e8Sw *hȥa\p*{ck`\;(SI@ИdS@6=86VxiF$4pdH~2*is⼿pX$/~K]f'"x@h;,pp# T)`TG%S-N[KKLsDI|2ԡ6NRԖ%xMájO%ޫv `f `TGmxS8A6bd3ڴu,Ғ4B%r.kR5 f\GvnPGewGБPFT'SzPPڑ3oW`\%lbv)kˇCh\؍  C ~ǂj7c^}N}(IPs BrzsZ <6@UH'G1\ON:ѩAΨ#mTTaÁ}$5?& ]=[=GI.Ǔj7nhQzM  QPL vY퍹\R lƁ20bv7؛dMHcdj\(zjzvC_Mffc8G1P j!dE5V uT8C"VzxQDr\obD B E* 6dc܎CՖMT.ߙM&G ⒡$E?˾\a577\3>UT8}ro-cגL ڢFWB(ҲKj{,ǜ8}2[%D(CyՅtzm'2xXf4_(Łˣ^%y`"O2b#bww6~0={JX1IMT,pŒHˣƯPizy@. =r M ȩ\z"Fë~gx2{Ć ueBeV^(%և.vʵdI}Ľ6AҖqM͙+hdžRב]Ms69.#7fdތ&3[؝ʒ pewd0hahj8~uDi, 8aI!?c;#!$;*3J8nϼ>Y] .V[^J)Ð5z0Y¾EU((G|m0t``jm r4\vJ{)ZS?P;VncI)I](2r_O&:Wd_V\\ᢉsW3KG=F mƱSH,2'à*dCmO 8fVjcO&: .vf(T+v9 s2H9u~"ts IbQr&&taIɈ(c+4qrz aHcTPF+r:*I:+J! wER 2vdI$+l.jFqk.K>gn_1Jy.c$' ^hm8ړ C?7UK0d.JG-ꨶ= R24&lc=P;;=ތw"]=L7s܊xP V;\91[U;9d'Y:0Dp +[0 sqH OF3<w;b]ݒ9tXFF*1#ws$ѨsCIBH.UCnԮu9dڅ]Cfx0gt93F3D>ڙ^@l2e(eŨvH79-ưM<;&ƴ]27@&B.ٍ:/ Ku|L <1ʬȓA3ԓj7o#J̰ WCMFACRDULn2~7SUYHDHYW@-9pb] ףiY@QZf%ۧ3>t d2`ڍ;nڜgZ(-}0yn%/ktؕŪő:DIv <1\%1d.Q>(9tDG{Q{i[ۂ9戴!.p`H0sB`sˀ,˱d:c[\Jۢ+ e8"N 䲖2G3I/)rίB0˺#LJrud!ڍYfۣW̵^H_wI1%g\ 9ݏV>|w7d0s {d.Ltc)-h|2LW*JYw>vn2YGNKVd1>ܩ*'"t2, Q +9.Z˶&T3YvwCC\95q8BDg%bHnҵ J\eK릨th-MKPdX2Qχ#oLDNyɌ3,])'Q=#3#ݓd$(ET)jʜ ~EPFdU8D*uBUӊ&",T]ڒ)کз{|2Hf!n~ xrzo_m= [r$}2U׈rO:U͂!9|-'36tkd̂ѕFϨ$dXQ:&حvbҍv<6 ٓ94(rΠX8!ɌX70 D.Q10!rEcɌ8(q̓{E;ӿ$CGz;?Md\HIf;#҉^h&ҿraɌ tyEkb"NG F"#8ҥ99!'Cj{O"k=٧+=F I=|Y2QmH랋o816eL$3c(Erܣ,Xq'r8JP^m9%r $xՓcPPE9O05mLfl z4֊qs(9$t-}P0X6ΨjWa X+Tr2Y[u ci Hq؃*andI-sjqT^^" |gS&?$. uAtp=dJ-%md24hˌY@N%NCh d.cD)e[2Օۓ qM8[&v! ΌL-w7]~~FU*:]8VU dRIl@./&[e[!y*-gZ'Rv]f9%TU_$!(cהA4H?.9Mn H--sWm3CSfjsvw12G#g"ytI:Kv;*s!AQO&(.Y?z< ]V\*I !̠ N3 3ɞs 䐙xZĿ Nf sɌ]_${cfnIS%dډy2RЉκO=aÌ7qPG9^FT;r43|0h@<Ǩ`Cq'1Q.DH!3ar7VmLsq4h|fiDdd㓡 epĨvKl@'RG8B"Iv1792p誴OFddV=r7 Ak̶g  O=M u XȊlTQ i @yRrŒD8l5/cpF*6|vAC(O&gqj["in!lAܵR9߆x)CU@/4JC)p)ʈt;xP-;-zt!H, X413V[,v? !Ӑ7QɔC8eӈ :rnƹpҌN8^1D(g5Q|Mb'<40@L=+B2֙Vdd͹-Jp4%RؒJAɱN,Z%CՖEr\sMv$zhɭ=rnP0]1 gOZҍ' I,$/cVxSFԚDHns1FB4m, LC(GgZ丹7UĽRa2.Бz *9[O#4O~oot?ε S/7to9PXOx>??W)TɽMB!Tqxp2 gzqg.qLBH)-Är+.а\!_Sy2&Ħ:Hi]/_ ~wnG~wQû Oq:f>-xeXԴ I:[A#YC ])XJK5Dm E`Xn1I RP\)>aTDkl(Z,% E Z,%ݬh1WJ-h1T WJ-JZXJơPɬ$b)d(Z dwbP*HJR*PXJD2-*rzRde(Z @4XF?o"jAd(Z,5+75fX,%PN<+KP 3,JCU\)XJ KU b EJR*P + DeZF ɲ< R#Cb) E8WJ-PUFWJ-yYCb&iZ,%^hBsNjZ,%EPNfCZ,%aqCb(/3WJ-\`e Z dRdP*4RdjP*JRe vP\|b)9WPtܕRMP}X #Z,:-j>}X Z,U:-zbh1;RjT^Y_)XJΆReotԕ2zr 5, C0+KmCbfi1 K[>,WJ- C(+KɡȆRRR%@b0̬],Ô[iZ,nXa12kX,%spP<9JR˕|/԰X*aTbFY|X,Uo'^)X|a1{hlk Z,n*ʚ+K[>,ٵWJ-*6B<-⁲WJ-J7/|X Ń^Z,u9M* ExR CP+K囇:,WJKPbx‡RxR Ch+KR0r蕡2yb(Azbbb( zblb(ybtRƇP\)$D5iTXZ/|Z C@Z,U:-bb+KeOa=iT^XY/|Z %h\!,Si1϶RjT>*vwZ,>-jGCQWTOx:ĕR§PX*YuZ,լ>-WJqPbj=i1OWRjT^ʻ:,J K5Ox•R a$]ƕ2j0Lr66-J7|X Z,oXX\)MRl{yFmDmZ WJ-6B<-j66-b+K=,֛C1Rҭ7K=,b+K՛o:,B.[gb|P|aT3bvPv~bzJ!R$2jLb(& RjTboXa1_)X*|a1t_)X*aTi1TvXa1i_)XqRa$2zj=4,j{3+i/԰X*۹i1E_)X*ݼaTyb(d uX,Uo*=,7tX TWJ-J7{X,na1T ڰX޼a1"_)X*a1_)X*"bvӇP81RjTb(fRjT-Ji 5,J7|X aTbjW[NJR#C1cRC[iT,,q l{%=sHQk5R-6<,b +KErZ,na1^)Xza1^)X*aRAB K=,rX,S_V0RC1R-6,j7{X ,b+KgLJR+ՎKś=,y,Z,U{iX,o*7|X,u6 ?C1RC[iTb||a-ƴXza1)^)Xܢb(ItxhLa566ˤ=,j\Rzb( RjTQK%;;-j3Cmm yK_Qha_629"o vex8w;q mP=lEN] j)aIH"KgjZVњ=2)ÛUΰգ* bw ἒ{8WsYGYlV \V\VLVYZu7VE?5ZT^Q=0({=?{M|mQw?+!w }9/wqN~-URZT[ WqMT-Ċ\[`B䇟10KEM*iERWp--B^>=޾Uo~t_gʩDa#>#]rWj}gL~sbQze*_{4? C./?\孾^$3o":ku8ܿ^jxT#~Kˈ]yN9VR}B7^^IC)ڳBwƯ/R [A^ކoȵn{hԛ ̗S}@k.GfzD0'Mܭh.UonںqawV&\IUi{pS^sh{Gz:bendstream endobj 373 0 obj << /Filter /FlateDecode /Length 8749 >> stream x[eGnWljwީb6X  eFR|g4ߛ/_VV;p3v[:EGzG|?w/?Z+߿f*+=KR<׷W}x\GV<Ω28.~xϿQq_%)=Zߨ0:ʸskϔZn륝~ͻӞ5fWtIޤSr~'{Z:d/|\z3RZoԫF/1Oca~dY]2^nݗ8TGd}+gGlO.e߾/f:e4_QhUl>Ѭ-XfkNhq2\}|?W*UxԊ>^m櫍y ٘\u> ҥe(/Z?3^!BdY_j?bTO*y&SœK|hθ ӆzC>TU=hTgt^__77_ :*5^4ͯZnɯ)UxTM.V+=i+~޿=0_.Btߟ?9z}o_i/_{%fnѿhkd}7";-m__}|[x>06ۣHW)E=h}H=V''ͻ_R%%ꐨm3!U6 €/YU .Cy5U֫4JԑVUA iDLRod>F IjB׵6&iN/gH+u4)Hz J:<'eNʼch9^dG'DMŇtNFCK:u,]:3+MlVV-])QiY%ͯ`MDjo_tL53ekIƫe9h^%S[FV+zI+A+պIUB1_S !/Y ڂ^1|D0VJ:]J@MbsmXLL LJt``innNt>Gx(0/mrBd8W}Rff`wJ4#j] sU4u.Jɠ'v־BUmUUpȰc ڸ[?i霝ș$56*Y2yJS,:/ҁ4 Wl.TśtqWK5k[ThcўU0zp)sfwBI#G`ʻ4jEj4N%7 ZX$ȯIyA/f\hF#JB:*%FU5\ʊPizD+U\`ueމfVy5$N+?IK 5}Q~W-3 I47O G; dPh:a4M iչ]LFG vU۹Ne]ngARC Ѡx0N=W bmk `upgT]%93]ǫ%@thff83|kwU:]ۺ ,jPE 6|qႍkX и(ӮFfj4S}GC+MŞeᇩ ƪ&2Խuo>t9N B Pw =Ol:3q5.cY nCiz؂3S5˚2չM< a050ӄP0ip ֜Ce~=X"xC}3a(։_mN0lt99֬λsLum2Vɢm^wJW-䢴t=_ҥl|2TgW^. URs-8%ڲ>yz7qU$d5bb\+jٸ*$㶥ۧ;EUN"FCO7$K%e>0sp!qӗ;T%B/j*tljҥBկɻlwyz e96$h`cۥ;A1J1#Ctݭi$9|&Jhդ3`sljҀ3&-E[ZYvmHy2\,$T^Sldb{=3IcN^`I>}Eey{۳۲e[ yYAhzenocb h:9YefX7AJ%UP+n >eOul-ễyG7ypc;`tF8>F AL<, cjہj[eц`[&mb{vn|m렒ìmC5.;wN3-G3֞JY9 {n!UpA\VCSUS_|s/n65cNfJ7:eU8U #Hy:Z ' "S$Yt:NȀO9GyfwR|F o绑7ODnfɬjdH+}7m|ƃgäΫyW%* ?Xǟ9,79=O=ͧB2vJf 8Ӫ.+W^o碄t;ǦŬj*4$G9u}5OT#5V$*#[7-)yh,R෴ nIqm0& :-T`yJr'Sh{|'4GiPȑB+Gf#`"<0SAzi (6=:$Nz[=%2A'fv 쨈T<С`/7p4fkȝHpp44b !Ƽ#d$!<}#f/ GIv.GcF:5tc.!:[7:)ˎ3&GGpL:@GS.8qth,3h䉲@GQ!kd_=qB&VM>.1;g9i KpI[͖͑?97ZeDFK̉#s$:N*h1wv##AN˟DJF&gGK!:R7<y#n:=©(GNY8>:H{:=R.AyӲ#*3]bH,#%u|Dɉ[G99v94sztJHnң5G-#I|9 S7OzC2BBz$Ia v!=һ) uG=&=7-NnGn`G4fvdɎGՐO8>RIE~dwʝ |W㵜(-<Ώ?^XD~UZ͏:7~tH*>[& 2 ȅ&.xyH/S`id?aH=?:lHMAI0 AH}0"AB v&Nqy$t0HH P dPIl Q M$"Lh"G,gVZzGGFMDh Kw9?H?F7ȶ|# /\=` /C`jaxΏo;?IȏJG JΏGh׊G+? ,f/yãHEaH#[tx$f$.|0]C@x$T U+ᑀ8q"<D񣿜H y'I&m#+0#јۆGbGB\Ox$`髺 i'<<9aFᑀɰ9Gq  YvVdHpvHꦁNfI}PFBS7 #A&$NGx.Փ<_GRh#Al#!4ؑHڜ^i)#}#i)p# M1ؑ4U]52voJ>VU_G|!<D;HWrtY/#iɑX7 RT$'GDp$HA)GXH,?NDrѤ? w%<#i{ڳ#) #AO$GȑJ7ɑŠ69sd.$G ӂO9^t9ypLd3/cX\ A'7R$HF`sZA PF1Y'FqĐ|ř lHj:3 Nh3<&1Gq 84d_ !{r&1htJ 2#؝ 8DF)DF12D!!#%VOGF8_Ed$6dޑIV`FzW3hPΌPXә>' .N3#YugF,?i+T?Ш%mF b]LɠQCDШ%՗yBP#3j'cȌ4"پEo}0fqfX![\CfԬPƘQmȨن#Fږˉ.$F iM4DF2Hq:2@F'3;3һHl[HyJHIJd&$F2uJ91< #FM$F_ H0hDdrArZ7E"mH,k rl,Yc쏡"4L"vTdmYN*rxF%XQC:VE&1\dRi[yz੺qGFYoT<$Rs6qdH덒̛!gF8 BΌp͹3##f͌2ұ^^DfSqfd3)3#n*A3 d83:rfdG-]Bfd4{eȌ.dFH{3#(22"T"/2B _EF8\0OdJ D,2j/)"(2j-Ny̌LhEFJ^dKx(2ǎ#s">{4yQG">/vQdԧEF@`"$)pY8PP(2CuFF8څF#{7]aB9m]~3_}_6@޾/@g_H§g?{~w?xfmT@DL_y齯Reӵ]E[k-f^hK|A@x5:o?0I5\6(C^gȆ_?R('59v̾].b:\r\$Br^NiE.9.f^ S]Wk:?3̅"_>oti]H'k{_NM?߿WOn35m:oo~{Z)we|/?N V>>Ns_8jX t)m߾'2endstream endobj 374 0 obj << /Filter /FlateDecode /Length 8856 >> stream x|[%U{OrjD2HF@Y#.ăn7S6Fڑc-u~"#oWo/37|Û7&?_~z{h/)=Wk/r}#?S^/?٣=u\lQr~ڷGZ=ZHoKz+o^||{W߼}WF֟[4XۂwxkGK_zڨ:_}x߾k9?,_!b4~~~Joӏӗu_pBz}#&ʈ~O1~:eOO_?O?",/a?}z#Wq?}ʠa~~׆+Cv?}!LiY Tywԕi_߽7KܟԹߟ|c?~~D5iΫ_[6mʠvr49`.13AɢFdK&cA43/& $&~JVql XfQhm\pmD.n$&3 :gܨeRҠ8߲5YZQ|2{Mڦo6TL+48V#բNJigBv[s}/!%VnS&r[np_-[ئJ:rHL=2ysɢ'7 Htjb|vSHp_[.r3 *h6_nDYf<"f^,,,rtS9Ӑo (CbBn>BߟGAbF MwFxJy-ML6`%$vv;/J,u/fVsy=.)R>f:Ga.qeSrkS|]lPNzfavcC7 EVoXs.tmy7IeG iv `ŜwMa00znHO  `?[Rp.1/;m]bKv7յÜh7o{Bbxp7l_Ofd.Xs4Ò(4U{(f [/:\ 'e sm0bc in5\au`V8<a!ԫ [T6~Sp݅a֍iwNCL7RZcyoJ2ip3-#pG77J33bf R<29V0ώ{y\8 fZd1mOۜB/@6ejC6>+br !ˍ|2q$fG}em|߲JNo," >/q}*`\$O%xReutᚵ,;:\9\jv'#ie[5`gAqUrb AA?HrxF{ 0_/?[+S8tg!Jr,4Ig>rʏēۜI>fbq>*%?$9a,/:x-E 䙈:o%YhVMn >%vl{mmZ 6@=4ڂzI-$7.fKzS g㧐9Od0%m[Lҙgǁd nC_qB9V&<ޚNr1,/!rIW<~%]N;Œ% G'n8HЙ"JArxHB/&NHY$;LL tًɉgL*$:=b t?!ݻ##AXY|lQ[,\IϞmj˛>"Kj3i48[+7N, Fސpvܭ'i#oGfH7d'7r +< f[&M<4[jL}I9С@Ϣn=[xk.ip,voUmI\ɷ,3uq0GOs+g.afҦ]-0r,qF"jwbSFֶfjA4[/?E$FL</{0fm7Lkwc={J:}rVSLh{-[y ,\OD޵%]-D[6EU:]֮ՙ+Dp#ȷ1ǩ݂:;XڒyN2IQ԰%BJh(\֋U",(8uJXm+資z -eW>E*Lvcz:*_56E-)yW ߮lע<*7pVebgRP y[+~o7:siѡ2Y6;e|tQcTiCwAOF L;I, =8`%^EzyԿYUU̒B^ vuJ(%€kl&YVPڠ6}5Q}c{,cxƣ[P_bg8iEy, ෪j=%qL ΤpKCzJGP&n*WhbWtxԚƺ#w.=r,"x=j~5>=$JL=y҇m--Fz97JHpXG $hdy  d/OON M yi#g$h,Ւ6vR@""hƎv4HјE  <wHQW>DP}8z4PZ@著H=M)FPh*ulh hmFAcG^]DѴ`q<#h]G𣉣 ?Z8:~B  ?.h:*4{ca9𣕫*m-s~T:ejQG*JIP`!#(c:{v<ď&L>BXDu >B##( A-5]7?BR(!|`l#Z>Z+?0=B,=ЅwU=XTQȂ@2I} Q"~)!~T1(q$CufG VɄd HEQb+~TAGj¯?7hGnp$>oQ=ZQUŝC(Ⱦ"|d[ >U0( zTSKG&i* = 1GjZ=PvKZY'EUQG `[U(&anG5mxTMYWUUebG5ƅUEMY8#PRЀ̣*V'KaGW ı#ۻZz&vdC,;BBf3v:[aG6h #{К;PyOٗ aG7g7R&,!,Xؑaș ;yQ-pQEuXG&9"xoٷ#jI+30Gk7hGlz O<6`}ȳ <2?Yx\LĎU aG($ydڋJ ;JA>vd^в ;I҄ٗVIĎxT KQE"zT %zdox#K+"|dw/*WK g|TÄ>(VHQEbOuBBҾE\葍o zq 7:S࣊: -Ui╚* >c,MQ6bGq5"\pGn;ĩvd ".I;= ;JhR:&Rؑ͐N; 6Ď -\ؑ:#vdY #ӭ+Ž.N쨎X!쨎#"O"BWx #;;rJ9rTQQ|ȑM?OM"pΩ+5Bl0\Ă,&q*!rTQ(#XQNЅQ]4Џ9 P!GʺQC]NTQ;jB"?܂j tHUȑT2!\ 9jHyBZI#ৄ5Ժ92H #&B\BMQ$9j83 r䂀<0IV!G <]S@,Q%m8#Ȇ#;;jDU aG&bGދgR"1Ď0)ȑFQC4Q]UU 6L\PnT I7(з+nTSDU?{-F Err99č,8 7^F*Pq:HFuF6ŽpZ#\%HrB@GR& !ig7ŽP8 ::r DpR[aDJ+,F`HBJDzNlNF&FtIHN Bx/@#~l!#d%ʑE Zْ|pRZƟdM9r 4ڒrעNъF4EB(㜜S5>#2!HGHȈ4׌NN72:*"6( t33t̹ttt@:#sއ0"FH:]77ƅtuvzU$IGsZprΓs4fs4 Is4AE1"HHs"C&hGŒ|ЎFHYH QܲZ9B{DY9G^q:gA8j+eA8BYd".P sp9.uܴvA8BVpfjp̂ { p#΍l#UBQ!rF-MZoZ-7j#J7jIoL-ǍotN*F++|6SF "ݨђ(DЍpXn, H7—P%ҍ0O-A7Zt~ nVn"*!ݨ#j! l ZdSklͳ]crE׬kmثFFe;J4' aCb-6Fj ,z<#T*r QϼyF}) @QϪCmMn,#t{ÉN"㦹$%t$8-aӳ֫1 &Ӳ#@@N0Q_pp"7 >"pV tAk PԎ\*,@쇑Q@̇w(B$q"tRխp3NtbeD1GmPM1EP̂c+j"&c r}t}8"LTyxDx`"$P$ARo#rC..m Q\3S ɚ(Fg8"2Qp]ҹ U{$!Y*! %NJ$# G*tW$#|78d,LKBOьfhhFخ+D["r-)hFq8iF34#T)ͨ=/ьx=8hFv76(˓fTqeXNz7ȢqD;c>IFEIFKA2b0^HFќ# ǨI#3.HH}sĤL1 trj %8F-cT12cTn+oѾ9F'(5cIH|r'7uEcas19Fq:9F]I13(KplX2 ު36h`,{.nQ˪3ldymQC(ڑHFA$#DF1B2EQKQ1ZZcU , B1:WȋT`~d҅a$^R0`W$q=F`!a k0hgRA0t;OQOJ6 5+Fd`! j A/ $+.ҋPыp'EHY zUuchKD/=1Er^t~+E}]Ћ6:}"ܢ[ \G% !QH.("E䢎0ExE"7ES"v`kz`nW] `!ev Ӑ]zE\1"P&$~n1p"L_/_ ,Ε^4H ^46Hѕn~3~Ѩ3DB/9~D09F.M/yPHt#qH F`tQBE06hHE80h_h+E( vDEEX4v#r2Ut#5`]zF,v.r.ֱE`$tJ.H.J.$Q"vC/eQ%}XI?Ki/r%W Ysn/>k$>zjFC G/c9~)>o38#7&Fu}֥mY^$ |ݑoyd2sflMEB?JcrF+{HK#Kglk#EK#I.bg= u:ŵC .?Hi)G*f%)Iw+\0N2br .:xr/ 0WK 8_*6/Ə7?qߛ|8ʌ/chϡ}6=̧JqXCjOW!!G}n}ïiE@}go:Lh.3˫7FSoWnUhh*ˋfGl+_-™TGl|wF:Wޡ}ŏ;뾛D_sTw֠?DsL RΞm[M:f\Scʩx(CV^#DI7Sh. Պ(EkN,ZTbzH\M[X7T9Gö\+*knM$WSO7o ;dd;_Qw|Jׯ/cLϹ5[)'3;ұb?]~*endstream endobj 375 0 obj << /Filter /FlateDecode /Length 1163 >> stream xVM7 s*J5@ hHzx^{gQh oZ H=>Mw2~qEk7lvl_գԑe l6*k^m.LI=^;b{Hshyq'6gON7~1%Vg8ԇ<6,cLsABfm~]m~x~YgZTA%agY&%SO:\.,N/85|hL nKof٩OmkɋC4ؠs2I+ xu/e_XIX5AE&b?~$f-AܾԝH2u¾8tBnV dz<?a&p12h")g9C;|x*qmAY1: z@샫H)e(_2Xq26CG&=F *!@%I =wAHӝ8{k݌9xh/߹$ep'^3K!r4n~aq@䄋"JL4$y. gy5,jr i^.՗XhJ14YlfvB9kߒwy@[+Ŏ`9V˄2 wYcjkH<5166 CO Y Leu91Kڏƿ4~\S+I{[._(y "1m&=]9|S۲͚1'wd> stream x}]-7r~7&d@'c?Ȓf$+Y#Y3俧*6{F36j6.V"v_67o߾^~/_Se/~^>\鸷-ԭ_>}Wv\om9ݮ_'/y.S>VnC{oL~vK%ۼ߷m/]I~{ ~v-՛岞yq+Aku/emw㖛)Wo>wRmvZW؏~v[%K[M*r;|yVMU&!ۏoSז2&$e?7E2BrQӦxӁ!l.Yڶ~T!+2WtԭF ߎ~ H?ɭ&Z@?˶fWUWRWHs?ׁ(W~ujU]hَI %˿S޼OϾȍ Ү |[JmKf9Uql[)n^MvNxcP[PUg/qL{ފ1}Bݯ{]>{;yLӖ6!4~nӯ?8~g qo:!^GS_>?v]??K~_g}}Fz{]3lj?|/2sxw1Jk0C`mwoB㧧Vœx;/?qs}z⯞<쉟wp-?"|/첗kʿz/OY/O Ksl)n^'_ALgOټd>>V }h^(QM/^=/ljI{Iw_ϗo{?J(1?٤n"vo./G̱W@Rr%K|F", Cnt?CCRn^lHoLI]ViXB4v(.VB@A4`]n%i=sr!罽H%3h(=>ڽ' }f򩹊!WUUe L3;n› fxJ3U:zY.7%'B$q $m6aGrh˽r Mȑr$ҮgA:$5Ա7ܛtHVv:\pkɜwiv ]fM(~ΓM25WzCA&R<nں!LmB~ߥEi&|vgItSn.9lJ'v$3uU56I}Rμn6,?,6SlmkNSGl~ڽ%ʹ&[!{2[S q^albt)"FM:x?wCiVv[;CkIֲDfkr w*lPڹV$UcfߨYc16}`l>1'nƦ$B&I,S9CNX_7p1[ڽw2j5Ð tflb$8 f@dz} ucӆǦ/f%n&~;sldhy 9YE>/)fDSple!/<ly #xtI9 _ӱh #tm7sfRc;qU7vym,fL-e ܴK: c4pkZRl|9NnFOFnZËxj䖧Z 脊Fns<*Ҭc;'~?nxgHm j@4p'qavV)pn¹3q &a\)v۵b`)uswa?hbQp\΄f|zˮm:?O R!VJ&+!?ȏ_EcF,f-Z-yւ%ڱl%LgͣAi;K 1)8Y ZʸZ-Պ;(C~"Eu-Zγ,N.;2K|ixl_QY _lS `GԆOZڨ",Bܦ,#N,w5BCxS nsЁ჻ KsB!Xd([z0OЁ1Vt5EybHЁe\bV>#-2 ! k- !X:R:TVU` 3w!X2#p!8kC5o'%?*i04TmP&,WܩKzס[ P0/_ c)g:3i'C6,SW(PjBi(l Bpj B=k P #:3<'`rCsl,*K3`sPɩT%Tn2+Tm()f:u +ɳl".l`st0l#} \\P^l!O A)|-;eٕ`1g]@ڬ&3TJRTm˵'Q*( g,Kҝcs:p@u2\ܵXJ\6ۇC EB3l& Z\sp۰CͦlY?ZgjYdJ;̭G1 bMq`^,!Z01X~t sbp=kx(FQ8pFSQOP\ VĆZU6" 6ϵ`lZjYsUG̹u O`Ԃ͌1ԂuخU8lv6nւiB-X\P:G-8ksPè[])CV% 1V5\C"{Gmrws5סK+gQ[,Pcl Slz/9k+gMYZYpx۰Pgmzp,6 @ *u"&d{(&ZwL-J@ ފ=UŤP Κ@v)XCJm (ےUmF)8kv2]R ̚JpVkrx* 5 jYby8g2 `y1lkD/*TDJMj[nR+<[0%׆ݳqO+&b-yTMw1n^ZŽ+j~5$k1!ړKP̕`ANL8<U+ht؞ OUf{[^7F3t"pV E`+hc;D`rE`}m ?E`9&2OjT?X+5`[+( ûi_H1 rDŗM8ЀmݻjMp%LMKiրԉGF5`1wimtc1Zo"V_hÿyDXr AOݹKfl-H 8k8^Bqй%q ezrURcso@T6˿Vg˿S]7]nC (R[= OֵOLu *ixim"i`@ au4/D xKF_"3Kh턮q_KCf=-ϋE'ȗE,"_UVE䋵MhGmh>jDQ+zr>`}̎v(m|R9˛*D|tڶSPJJ _'5hx7-m<%pUcVkWOR6iCU:iMtF6N)')iHJfU:ipUi >ҲRpUpI !Lp´{|J9iE}1.Lo7:QNV3eU´֢xMFazjׅiSa6]Vυi `oVڂ0oQt1w[e]l,79|D9k凖+̭qL(LtB0lӥ )otnD4 ۈ!hT?̨MȨnnhK'M]ni{P=jSPLV wSCVπCL.Lk&d_V89$.LduisdV -i{ݠCNZbF].$9csԥ6!ͣrץa: *4檴5`4:\Mi |Br!0)3r-P|5ua~b0m,O #z{0\Q%8FaZ}JUZS6>8 8ICJ]!YCt5hK| AQZ..MkXGi♈oڴЦVA'[ {[;8n-qq:灵i7@t-MqZl42YNz.瓥?|.ӖVF{;Xr: *P[mQ Ԗjo .{M!D~vfM*Ks) 'M1ZߓIte.\O e9}%_ϷU=7:, YפN@5x'8,/#uZ5DVXlf ,jHdt6iHdAY@eE${k$;J0DV_X,M,"eL2 pN$"mwfniX5Sy"<}f ,HdAY@̉E$*dfHd[f=DT$X]XD"˄d@@aI@+>D , m~"H@"Ybxbsb ,@H"$`f ,n8XD"GrWL!Y&e50D3 H`q'"YeY7 ,':uӑ۲n:YǽG|q& ,ۘYD"-#3Hdet$$=#e H`qO"YeY5 , @˪H`a"YDzj:Y}Y5Xc ` $Z\5X*3DV@˷\,"U4 , Evf3 ,nXD"kIY=wM$"9Bsfv]8t4DV@ f*qH`u=Dy`vHda#Y= =L[f %kẂUE$JXǒm$J\5XT'ŹDVr&%H`%Hd.d@%Hd-@f$Ls 3&#3Mg_2́D, d d%H`%Hd-@X2́D$$}Y3%H`%Hd-@.@" YK9jK9j˪H`k:9K9*/#Ub6ڗ\s UUӑJ[YK9˺H`q+"YSHdet$%Hd-@&ŹV]́DֹV[́DV6%H`%Hd-@foXD֒m$%Hd-@+-@"k6X9fDΒm$r:Xǒm$ls u٦#3 H`5t$lӑnE$JN[sMG"봭_3 H`qk"YkHdetdfq[r$lӑlӑ¶$Қo:YuY9 ,n*t׋1/M,"fQOcƩR(D֒q?4֪u$֌ӑ⧚&Z2u׌ӑ:ӑZ΁D֒q֪t$֌ӑ*kHdg{T:[V3>fU`=fͫ3Nz8[tmm82ٟhխqf׌ӑZ3NGAOt'J'6cɯͤr_s':'?&Xa:gs?9ٟE$|?9ٟY`u_DH"g6S?^5*b $θj$Vs %H`-: ,~2nb%H`K9Ź֢s:9K9*K9ŹV%H`*@"k7X9Ȫhfŵlkד2WM~ޮҟUube`T0KVm;ggj@ۮX%_E>Nh_>h`?G?8aY?= ŏ~`8O ÿilR vBMꁦz~~?{oi٣}'xv;=-N斷[2At%Zr?nU[zS_{?nw5GoWb}&OVe2[~oWLbؿU,ǡRjKuQ bñ>M|95.$?NO:է lg) m%./oB=yn3p~6_!t"aP{;*qێo޾ yH_)./˦WltGA% |A{{iWBaar,Uzw~wZ3:%2ݯJi_[۱O0&sÕѿ`dV4pkO|R{Uᛛ_d)?!RȣOJendstream endobj 377 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3417 >> stream xWyTS?!rΩEkO-:[hUEiAB$aR$;0(8@jXo=~'~]w'+go޿FD": $lsgDT7Y1Hg'W.t7C cN_=}*zŌ"LQ ONOJHT3gɒE3|ΞgE4=)6FL(GzylTD2̙֬1)fd&)}¤ iz4ML"so<%U2|Wo+U1۲cCr⤉aI7$3{y3(9j'5Ej@S~J*f Mj 5 S *ZL=EM&Rw~c(MK- s-!1$vq~0=f 鿾h4hH."e'S{ua8g;{ۏm솃p8-s+C<$BHYR W܁N! Bs*WYz`!wXn+{5X4v:]y!nDM*fA?^%[bQגaMWr[vs£&LtkFKΓV^E)eeRͪ c9_Z'cki뢶JJ4:-bce^V!ɫ+4ac/ǎYdxRqÓ dendstream endobj 378 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4031 >> stream xW T׶P锈C5N *cLT^#(< 2IFFő! Pb!Ɋot= c"o3ZVS>*ABrhz;W'(hƛ{WO`F,)aYx&KrR^g3-f΂gut\`4<(&4/f_\HP_f}d@hP\ʹ!qqQo͞8/v Z52"6!*Ѣ IER@9K[;G8%əZmvΚUr8{Gр9@<[+-vd,jw\G}pyx\ITIzmjZK)DlbfQ[VɥĒLtZn_uFȬ-}O 8GFkoɔ%;Ԫ]q51Hݧw,~1Ihe+S]J!F^&N݁Qd: dEb^_ -1|](=|}_OY NiR7\y1?%[y_ TsAaF~92Nuf Z<uOh񔗨pMqEo0]J &l 'H1 5}E~8:}WmZz 4ktqV j!2X ySQWg?V( ۋViP ws+*A{(FNhyʣwCscΝ5c̆ѷ܃ |,ĩḲE8T!P3<_mBNUwO.*^ӌ-seIB(>|[b#*OQ ^6Os9 I["] %nU64U2mϕ[8[oM*gs?QtnA=˿ƵIJl`Mp^_5pE[߶\rRAEꧨAdy=j8 uС=| y^]^vyCu]2Wuewm/[2U"bBrQ}܉.Rɱ2U[2];!G+>a:}U?[-xʵ'(thV4ҙィ'S ɿ%KVЈ:~_}Фo8})` Vʮ[_C*&HRh7o+J=u5mTLĄ&2pyrXLf @PIuJpӰs6 N',R=hyvdT1N)Fd ZccWq'B{p߶mBZXRK6Oӧ;Te[y@m'=y(_%+'WN'CݺsE 2sٌI+NoWwmFE,z5UʄCka 6ٙ,G,Qw _ C`(*;;?8q54VTuE,*q_ $6A )G4lw>*z[9 o4M{(<2J]!QъQClbD7/Ooeîk!-S6m'XS3`x^VRT7S-P_n&҅h}!VApr5pNe%}W; sm !?2'/0eߞ}E.}/[FXɯ[Sf#$s0ۀ$HB0Ly[pZm=&X^`yWq‘qbgZ-r iyap'skѰ;i`oz]g6pc%:}𩐑&\2UMݥ\VvdXGe?h8UMsPno{GGh!0őMGx+UzVW(U&GA8ZT}uS'-G D/7؛4w_XMU}~Kr])up8[R[Ѵ G)nH_p @ +HݗOW-5l)YyY>p.ݰb1[Ffz K?[$|RACKi6#w6>0x|X!$75Эb{pXW;KԮ gl=qoꙿ}뺥H7q2'E.4$KQwǜIg)׽ޅrSS1f=D} #doڐcG7l k4v< ZdהoE~l)!/6h0dOf00endstream endobj 379 0 obj << /Filter /FlateDecode /Length 1306 >> stream xݙMo73czsmIS\9u]rb;_!JrlUBѫpgpԀҧ^ϾzԜ\ҟ\>04f̸afǬt  5n_oXstjނfSޫ큍VCmkwg4ΒF}2i~Cs!S0u*&'.Zee2`I v\x=!HŶr}Gv%m鵬KKN!(ƪcFԱN 9t6-w'Tkdf:Z5R x{zZ̍8 27,Ny72a/eùȨs$Lc̪;퉴വk1˫M?B7ZkOK[OG9Iٟei{ }dӢ&OcVO_~;R,~٘>fƩ$Yi>Xɒrsʫ%Jxi-t!yiEqqj4X3I0u cbtlɻlI|נÂ8M1,*z[m?Q}_WeJFNbT75,~q<9ϷT:/JOQ[2:%GA53 oK?ɧETՀr&#r2&L,㐱*ȴD!ZYI&ʫrH*Y2nmd~7z!%~erEᕲ, Z$[zrmAX}T-m, e 4l dnaa)&^]15k9Os3FJ˚EtS.tII@r/!'CR+ _6YN e> Z~jEA[#nK sOIɒ;&}Vqwm+hs$"{Kmm?WWg، "ՅrƑ-Rr0IrkM4hv˚Gmt")G՝MF:n"!ٔcRxݦ:)(JC*ٶW-*Ro/|V_utD<; ].tBWؤ/>}qr~hy?_&OY\νs/Hf~> stream xcd`ab`ddpt24H3a!ms Nuu0w#=O{&TfFƂ6ʢdMCKKs#KԢ<Ē 'G!8?93RA&J_\/1X/(NSG<$C!(8,5E-?D/17UN=(휟[PZZZdc r|LsƏ3'M=cf슖l76wWJvWNo>-{9M=sNI._Ɗd|љF[;a_$j'vwtsTVWOi,e.^^]#Y;zޤ z>웹rqTpc`*[endstream endobj 381 0 obj << /Filter /FlateDecode /Length 44689 >> stream x[%u޿j}X^u__sq\|,_s>oA~,׏\?tY6?_qo +'1{~ t+Gupq_oo;ǹ.qͷ~8?z7kD㘵#׬2qu{zc]ϛs?Ώojw*w#׎}cW_5z}~Iȥ9~(]lWYm| zCYmwTfZ?ku7?OԬ?8G*2αo7LԳ{Nٵ~9I~awz~ovαO u7\t*\Ra*L=_^Z_ׯie 9_DZnd}c_۟G};ӟ۟~O\:i79~O?}g?_LE߾ş٭O??ٟs;_Oh?g?_7;߽FvX^-۟矾]gV2ڿ7ο?>m?=+<۟Uޔş}Ž+gOsm~6 /_{KyS?S~_~~O+7⋳;;Io[op^Vh؟wf_ů޼'[ϭ?!v>]_\uhܧ_iߵ` ,^յ[zW)C{ h7~wwW?}~7~)ߕ?)Oy+z~h>f[3u ^^vz}~՚+cɿ[}uku߫^k?꼯Fx=1>J]c>|OH[+ktUZsXYC5*@(QƚE7R:$A RU5^E>лo'9R/JЛoc͢ben5o@F~[wy|{fWj=HGbe̓^SW×JL )VMt⚳|FQ^-u'>*-Xs|܆Y6^K5{zpP)pcYR]WG*TjUFj$hD3*e~hTʔK+).R.X}HcʺPIʵ.Y)V(ԃ uV+)B " ){xڶè#FzW|VxbuO”5f\W&T5VF)V$j~Di/RW.Q'ܧ3j;(T-wz[W^'m3B%}yfBs:^s W8M{u |RtCrc4/oZ)Jؿ^Z(} L GcyQveW%eH" ӨܕBv۞35I*^/T*4[^HJqp (UWڮT*\i*pBFTj)k]hA( -}&֫ آ^r7 :zSQ*7zWS= "gB{ڍ'eߗBeX=-fDV3E逨P^PڰizWTIg~k(n\.6ku\XD&*T}ޗQʝS|7pi5*B\MHWdބNyK?s ҎIPW.!QrW Um -g` 2B; #B;$SoV3UYQD|~5ca!,)wUd %veN\t&V[pFKjBWjTku E1uv:<*63,i gqt)QwWV2Θ*.(r? Q͢i%_(mu:Τ/,U:ӥĵgS:V\Qw.!QuZ-q*!Q}h%$ 5o 3Bè+ƦP W@*TBЄHShE>(urݹ;P޽zZGez-ZGT*>z)8 Vӫ*5piӕqNoXqToW|;QB,G fSNliӔy[|Р;SB>"'Rq'EocFjTuKU%xBUFB Q|R5J6dik*[)ڠ+ibDMIֿVZZTeG t"Y`%|@Q(ڬ*T1ߔܩc"})wm"}6[(?*[[CT44;UB_[gX.hץ^@ ҧk# aihmNz:kk F8dkwNLiޖ((^_V()|+𭷴ԩ 4 =ArAKQPmUbƝ+QiGF:dJf:Jlf7@M-97! }ڕG wERQVi8)L1^D[/0%JTu̽+ֿ}@8W$v?Zi|bEbp貅wABTS)XsOE9Ňr"toPؙpMQ;@2B1 IR ԞS686R] ;œHS,PvJ)G*LΝa@YS|"R~"#P Pvh0PʛvH<ę| :Q, q-N|D)"; jz[1̩J19*nϽ"fcFqw< oujLݏ+ޯ-1ʩ/8?xPƃ%Ȥo"Dj>l7Rat~%P[#?L@tKK7bQ)mԣ^7sm͹Lwʣ9h=tC#ڱ@y4ƗR{ <* 1%T{\=R Kz@fdLGUDn|.R%C}S"k8(u*ОHjvù 2K#"*;-52k2O ##Pi`FQH<4*S~3Pg3SyJ{L]g|MJ(kz/MK{Ӿ5pV4#ՁoQ{\rʷzXwneg+gy"N|9"Oۅ &Q>gS5?ZSsz|w654u:ԠG9u_+IfRq[Oԟ)9x)M?ug~BQ{7BL@ 3 㩄?PgY%5 6FGjosZ2wRH!@}7T8U)\5G"5kfn>NHr B+"*I)\y~_N\5L7w9TMx, )>Np$RF}95W+ 2QysGP |?Qy!gSNN別22Urç"(_U?3w{%WPͽϴ3is#Fjd(>uĐ+C};#Lk\GriC>UPQ255ⓅoG3kU3M;L yBT-?*%3!Pw)X5r?Ib"8UsN6F_9PcQRK$*JFD:Xs 9^$*Gp=};3 řz#{u݅ԛ{~@o75s}"FyB*Gu@h>fqcrD~@y.Yc#bfF;5Sy,/y"2Ejd(+>P{DID4Rϐ)s)| P~%1CS):92]}(*d*4HfD>Z2D*䆉oc&J!N=͗@G)"UvκGdʽ>FrIV}l-B~͙Gjoj~$q<rj@@(ԛJ]n, ya)j?wx (ΨcũQ (1T}V}[yNSEj^\ɇ!ש47 i@@R@y)8MBr*7眪ǼFq^HL9ž,dCH_gԝ{xBߨd1ϏQ#G28CrBd\ ~NAN?J:=j'~A1{~0[τz*~up }eѿҎ}ʈm7*v 8SN<>5ۯȅc?׽Ƶۊ59ԃ?ߎkjkZׯ¼^ҬI ?w_ Ϻ>%k2#2w>x!^LWQ &NG[Tɲ7꓅m+v/J0:W|퓮닥d>y?k޲ԵC]')H$PPFD,':ގl0 (0@HuUm/ (tX '#J=idID9OK/@2NB(cVs_(v2/K=ŀb1J\Փ%eN*tC%ߔ\5_(Q~F/ ;NCӗeCd(QgIDa+P;yTe2R;Ie(U.ke(QWUID2dLYsբo2 (k=]&R"LFJwPI "{Lʠv;NZdx((6@RIx8$ \c(Q.wH"]'z0F<&e41)q.Fm.(4\ 'PFw1)VycxL% /=&qEʔjߵxLʘW6m'ޑM&b%JoAm'd(VƬ#&@Bshe(3F[Taf2 =N$Jn&RNŶdqoEm'ڔLʔQ3#I@v&Ab2 NRL%QIv[Zd2RAQ8H;Q@U<&bɣx,RVd:yPG}=&R/B<&bb2Bb:I^fF@2NU1 6̌Cb2Bb:I9Vb(6<(ͨܥ?ysr]^-w: oLZ2Kw.$[ 6JsܡB[h;)Uj$@к$PB4ҞdH"msZ 'bHB'mC%bsƻ$PŜ$P*>`;s2mM%bI2Q2Rp)I򔴗 }@qn;Ej*vK7.r$=پ$Pt#R|:U$PG^(QVl_hNCdq,4Z%bc}f@2|]%#% ;'Kņd^(VhLb/(5QC!^(QVd~`8InLK߄*jzl0 +4ՃXb0)U֨Za(Q#VO壞di a(b0 *8BE+*\bTMS/ :1<" Z&e5Yzf@&bI5RB&žAD6^2Rb8B7Ro>wIorZ:^sW;vD݀%:ܕ%#%43kUvJ%%Dd$PbKFJ_n'yd@2;ܝ!(9yT'1uXmc(UIXz.#ͿN҈7e.Sm ]'E1)q< zE!RHuc2R:g =qQM'Mj+{Ì<$@[kC_񘌐*E"TKN9@$Mt\!@>Bc2R O-.@Q#*ǜ"\>:yЄB+;QT1 (+c(vjɣ)%JIzL%yQ<&eMhLFJ˓M&bePl2 NHk!L% UdD,%sGƓ4276@RlEm&'eZeQ(Xe(Q-.v74U\&bIZQs2 Ns$P;I d2Bb;I'dI؈fS-}Pޔ=)m7̉ϮFPxLFJa1 (v1 Ԑ K'2hZ,&jaIDLJZ,&#J[YL؄XLab1)Q踞!c(V(,_{)]'i %+{L  ds 3dID Ve(>Yv}':V{v*IwSδ`H2B[ըCID>Tg(Qnp*BT>IQIk$Pв):OFJUFHL6Pt S3)qrϢƓJl&eGu$@,Xf!]H2.edIxrǶ$Pt_ID!!"缏(gf%ō$-HV|&>mNbV%B=i(V.BW1zr+qJJwЧm$0l=I!nbsوI{ E'S|dT34 (ų$@[pdDCD$Pl>IS71O[ I{״yH8BH=y4$P=I;&:IDY-Lj2B,4 (i8M 1ȑ"1mЋdT^#N@BG]Dzo'(Q&e~H=I'7,m͑N"eE!܁zd&q9Ѽ'B *F8U1|Fq4DB|Q-cԎs>(#FqJBQ)Sr7#,$g%X^PJbBD*k $#gaqĩyb6P#C 2QP qQN=[jra*h+AН)n#H#ـ*9O$zd֐D=Jy9ǗD*8ud<kDX,T&fekx,0q&vNM#+:5R6x1Pg.!?_xKh;Po޺\ \P~Q.t7r_#uLMD\$]W1#ADjLL9ל1*69utPTs&~zjB;P؞HAdu*9Qxr)PsjcWH)HP1NN]k gۇT;3UϸNHH fxJ=$ qLB M3SW~5eOH<8_@53e@9?{jmM'HzTvbҘ PWi+/\%S{jΎǨr47YK1PG𣶁Ѷ"Lk DrC_Dd{BQ|P8&9b='#?@gkǴ?=T.NT}}h ԣ'qkTXF)1]d=j}ϣOT{͸go3F9_x#0qQ3.=Л/=f| 9D=F SOzx|﫾0BƸ@ݏߺx3}4 a%N=F(?V<KTy<|POyg(;5ZgF7SRFʓTƑ!)\ᖑJk,qk8Pqhsy(Ԝ|v@Kx3S*23:&YAj>ǽ7O5F*V{[w^9p Hw;IwsbvH|84r"> x[3#GL㊜5R( U3%fçm@cX ("*_~{ye*g7w4JH T/(w|P-5zdx| TIC!`u1'$ ݫH V jTñdBpj<5Y+PٛD=zϣt¡HP9Ur29ՒOȼ;#VG,'qw♢HdHM!O`fU<@>4:R1:PsfjoUm<zcA?Q/Z2'*{AKjs;s'xȩRj$ϩ;,)N`"RmO@IԛPh+)3IV=01Ft \ϯ3\PQs3j qBIԣ|&5|R,R!KY<&p;g-̣oz`>TϫM$Sb(J{NU{Τ@8L_9q:E*xr+f.uHhd+P7FC'͊I6Jъi0 TMx|ި+ZÀN D.wtjM. "R DLF +R#ө<ƈy.#/IqjȤޅR ~_Q0̿CW2>yqZ'}!tU * =(._qW y³+,m\z1~~{ggY(_o.v^宫b^]2ܔEq*\BV?U d%2ꓵȨOV0BD=+R,ү/}5&̱ڛ`IywL_>0kmId@vb 6G  ;oޒ`HJ hx8vRN*I&[5yZ:B2@"XA62@,ccW@IԕN,,ROe`cs0l_N10CKLfYbflg^U2tD2@,л6&*ȯoQl+$ªC":m˃N9#.alHMW-+2x?pV:$-YъaeusYpL1KD PQ+NR*aPhپ[e {Uf Q+y %qtH:8*/c6&T̤2@"\$hj~jQ Pyu ";PL>e2ЩKİ2@"Y'攁a٭toV g.UgFS1C"cbaltl)LX}*$ig̔2@Q`F,)A{(83  V > [$)eXzQHUlvObN 4'@moՈ2@,а_bEtFrHM(YNwW@v]SS0$:Ctm&Ԁ2@"Ph NT'bL5p۠C($B;W`nlbO%~R{l:V[3~bНmyC s2aPmI92@[(^w>B.cq3,:5hu[|#c_E2Rʰid`X8)  ItH# v~b# BΦõև.`ᤔv"\ZA!O3vbϽ(k,l=,2@"+!>袚GHR-["dΖ(2@,ã_ w='38>;lЍWi*5 qmpz+5  ;f~-z.7a#B򡱬 ^ת/20"&Cb ؈p ofb ̸aP@k v4X2 Vb +apCmpgA  2`H "RYN= z 2@[(2hb {dVg*ʴnT tIdKf  haO'>b<+@:BO*.bq gT0 @:#}35&OS1@" jcX!fxbdT7q 㲉?H!5~tB8S'Z&Fb\!dDHD(W@N#1@,PpԱLT@]QmJ9fC*ІEީLD8dDNL rb V\ X mcD8_TXjP+Lqz jFRcDXݸ?H'@F@! &T _0=<\=$eju| ̴k]Q{GDVq{  4{  RuW"Mk 1@[(;Tz  NW"[EXm԰LT'1j-m̡^i4,X$*Ѱ&gS7pω9:-_EA LgGgD8Cq  t$:f 'TWGTXIqp GyZ:n::SGpj9:#M´}S@sid3lVKԹ1@"cX5uqC*Է1@," Q#Ե!hL5m  jj/QRGDSp88H?a$96:la=4Ֆ7h eޚb Y/„ۛ85#B{' wqF-DmRoR$KcP(d/MܞPa/GC"P.B;]O $uO /^^3F>w$vug '1j 'sFgce+nB`%b O@ѻڙD/Լ, ę10ΰODb5v[|T[pDZ jVPU@+] OŸ0<92:#5\b /cDhOt=O<tf  ίݖ3fPfsB9<&,Ӂb ZaGFGb@?6?)Rh@ vxP07J[cdS8\ FB~`s'f!(#N9p.0 5`Z) T b惚j>)TptCNaOҩ&`3(>\)?n3V.q*&Yq ȩchn:/:慀@Q-<|ڃjo)811NV;Lo$Il Pgjwz',XwagxPAݘJ!Q+=E*D9b|RY;Z~c6`XBsjb6%3HS)<;0H TPIq\OBOR=Cԝ3ƳFpXwj.k^LT|~6Z˰w[8L:R:PE~VGlYbve G+$D8bPS=9OHwX5^dK}7 Q)TSHGZ u/W+";_otN S34H@W3AF()1v:R#,V`J!ՑLݹfqPow=j,bG*_&gX]A%'L|<-|6TjoKM½=s?G֟m^w/DG=bS*o#|TB*'51>%βP{8Jr0d(\HgepV|Ox'z8㙁zכ~p4%9&!K+$~>P5]?@&!q澒'lD }1HgS5x9P32@N#-Q=<"3ޙB]oj>j>=or=G@Շ{R 3Q@͒}QMD\+;-H:P9FE,F:Rܙt}Ov*{"5>j*{,GꝨGu?MiUjKTgS/agf ԙ;Tz|0-|O̟ϘN!˩d*aʙyD '*{E~>>!S2R2P-x)@Kac a t$'3q?~鱋QC@9&rHy0ƃaHP\bZ@K9%R@gΙI$:9Ѩ zKy5N=^#zp۩{aOiԙP|:)Zdz*Ez91zg"o,P] Y~™AHF*F x6ݩ'#1*ߩ#7*?cy(T}P-+!S-ͺ`iVv>4)]Mݏ~8iazvUФz^1=!-RfrAꑚ5SyNr3Eʳ5[UpJY19R؆~ߪo~v7&NiR*BIRN'~! -Sp*bʽF8) ,H=>{ N:T{@G5TIPz#ZGO'*iK|7Ph= T̲CZ̀ T#GS5+IqH#Ni:dԕ!nj=q4' "pة6!߉SKlgَԙG!kS%䣁oR TCƃ/ rFϑFU'x™'YH/?$1js&Ԩz!ψ?M,TJD=zϤ+Upz˩`fZ%YP"u?=/".@ߚ9T}7Pwv$9q9$fzPJi*t*yB$RTEH̝fdS=qyrALxaԙ1Bsp=$TijuL:Gu_Yr/RᬟSO;;3C2g*D-5R_YbT8T6$dG5i 9u~:8ur?V;@Ys5Mu=Ɉ֌@=1 P1\HNJrs '- GčbH1IFu+ $ Eb^ Y ȧa+g0yﴨm?دNU̿CW2mꪰz)j{!6SD53Dl + ]mAѾf]wJp*.\T&Vxm(@@OGJbDj'J)bDj%Jv׋*@Q+ c>(@m)Q"^}Rm(@[_DБ(:  Lμ Q"R}(Q@T-b%JV9U#% P (Qf@vJH`T /7;Tm*@\gTj:JĘ0Pu:c P u;SΘ)9*@TgLj/k% Pw35R1%Rd)@]ΘTK)@ibDj&%JwR+;ì;~ Pۅ(Q"6Rm(@ԝzSڦ@>>(j1RuvZnGTl%Bd%2@.`[Us+ P#U"4ިTTTFz75sQ%R#YL*YLz P=ި) *@)@)@ݹQ(>(w@TAG, 2(@M sJH!Rc P;(QSc Po(Q"ņRS 1(`}'@C%R)UR b Pk*@TkD ;FH\kT*XLεFF5D)@)@TkDεFz5+DޡR+Uڞ@FJvDT#S#Sۿ R % Pk| T*@jDj;% PP7%Rd)UR;"0-#Um(vJjGL (@):xToLJZ7S1 (*iԢ0W7R1;SʣS"uQ)@\oTz PN(QbH;FJHZ=/URd P텷%0ۡ Q1%RL)@:@ (@U:(@m[DjǔHmTj{% P(QbwHԶGJfnIT{FJܒTK_G.G.DjT5Gj9G.5rQ%R(U*ԕk*@\sT*]L*]LqJ~r+Ty#% Pi PiJ98R#0M]}SW5?mԉ}+@]s P wN]m&ADRRkFJ*J?u4q%Rq)U*؎T=0WS)@\kcbɑz\49RuZ P-՚G.mZ#B 2RQ%R(U*֨TMF`n9uk*G51n)V!U֨TT;Bd9Bu^+@ǨEyԬ#5sԎzEGJ TSWs P#>Je PwO]ꂨi1ZSJh SpTOF7D # P%S Pyb P#U"ؑR3cScSިFHvTF*TH)jTSWʣSʣS P#w\cYԅ{p:FL=)xžwZTjCTm*@܆)v*@=uUj P=UΨ)v-*@]ΨTuFuYSTgL*WL*WLNuF3D# Pyb PW30:F{ĽSW"R<^1;;5pԕHQ{TjyLƘW/\"3qԕH}ཫԅ;Rb P=!5q̕HѨHTB6D\cTjJT>G`:xW"u1U1^nq^D PgjCLJm)@ԆTO&+UL*UTz Pw7*DިTFj7uz P#U[JZT@T%L;UL`+@UqJ]j^+G+5JPEkeԝvJMRS1%Rߖ*@]Q:^)@ʹeJvL`+@ܒԝ*@\oT T=ҸE`j7R1vM*[Lyzc PW7R1)@ToLT9R12 %m P)ǁ+@L,5S1%RdxnS;#IyYN>3֟J`^}RUiriCו㸿9gU;i]4c?Fs}L/_Jxmt*_?~W~oձ*,TDz@޷gBK셖QS CO/N?Z6vķ{}251%?W;qXm7Id(\jXG8DY(J>* X9\^QE!NQQNu(i3B)+q T)B $7|^HB i)V(1:E&(N2\Jݴ+ +,mR-PKrnTJ5PPH)Vz J+Ҏ ޼(rU˖vъ,P\M-r֨@bar%?žjO VƴHZ7s%\:f5qΥ#5>biˁeNo]Zϥ# e"l 8rBç**k\-)ȗvߧ]ڠ5nXEշa}Zch ߨ(԰YYM>6Y]S e#jJQcoԔKJfݺS8_xEQ(aW촾('~k'ΡtnHxO (Vѽ}=)X6qP*;+PP(Y\$J_)K[h)ch !Qڼ]h eNy~>Ok)cཫU };Z:m$H{_#',UjV`騲޻=*jSR͸yi= רֆ\d Vhg.U_]1OT)^ghߩ(WTk)7SQhIɫ>E{QfKN]+ڇƛlD3ֵ>(ʿ (R嬚x#(Q7HOHP*Pw*# M6Y.JYz.U^u~i SP苶E>\8f|IsXiM㬋pToQ*Vx(R#|*sQ2k5}8zyZAU})Q&?T,x moTIτLJ[?Uia_*GQϹPP7_$-мO *xKz`B%+-+C-EiWSb:P xugcZ,T_Hr8PPأ5N# )bШEDj4q{e5G;*ԯhҢ5^QK4(QLԣ@0ZfN(}rBIhu]'s;kBa%auEEӺ>(z SeJUyuB;-"TC53Bkn:lkrHBmT@4 f"T "T}:JnZ] hI/ʚ_#>(T_.J"T!~U/F^ջ.7f'*]W.S뚩-M" mjޮ܏BaUuF;r -f`2(ԝ F )՝tAqET.5)zWm{vpV:WX٩?=b>(P^)VD`{7Y%S:  B{2R45jƖJ +rSQI)J,.J{~_*I&>(3o7>G\4eU{1brjGh-F޴C- ޻(q޹xDKxD>#w$TIcjEBv]L @^)tbS+*Qĥ5,(Egj@3iy('Xk{5 j9%%P^Π'&K&mW\ ]g@Q6t3&ӸʎzF(Vv>z-Z:# 59MkVUif Uuؐ~cNXىis-i.KiJף |@QbCCcT* 4H(*Gͭ( ^*dKqh^ Ҫu &k4QbcO;P8 @B2 )Dy*S Bv H0E.p6dr#B 떚 V(0BgnQURB-p+JE V r uZJEO˪ ` j ތ*AxEQ([d[*Lh lT]S t2fd+ZM'yz=s RQef qK~= Q>92*u}:--SN|hfjAr#e5UۿrߢJ~ ݹtDK}7`@CfL˥# i'E"tT976rǢ8mAHߥJ4ƪ֩tTJG6EX:mж*6\ .R  uMIYPv)dҁm*c ="ܚQjU9n+ }!.bRS{e2t=W< pOŔ')s̴iQld>(J3֘}s-6|A. YRxPN+v)☢u (Qt}:#_D%^v˗ֱ|LշQǕ!O% ^Z]Jn-wΩ|D2Sבǔ/*xDPLǭ}%T:l _-Cj-z8h_(zZ\9PnR 3)pe4R/J"/m`eJXP웮d-Ƥ`qW\) ǟsU2WS)wdVJޟ> QK}X"\Kp S٘b3\6lck`}%+Oe/ UJ¶WEJuJSшRT(A>BQ*eDzQVB=*b(.'*2 rr㊱)t>S+ot5ZJ:wd [ȆXtl +ti FMLq2J#B} %O J\ J'0:yg-7(U k 7խUHgl(:hSʩ }NT[W{*.2 e;RHB8 RGʃ(Hy[: -R%K6 8[S@6S; Be GÃHyEn-pP@!؃S|/R~,) jkN::"[|EF Q%0vj$PTW䈰HyXZ]u߽G:@pz,(Y% TX7 ԝ1tH^Ȩvo6J2ǝNu>R)_{bjG eC۔@e(ǽ"Us9F|v 5PUb!*a1P;(wR>ja}S SZ/^WVZuo;jo/e_L5DlU>23S@5ԙ 9( @*?c}-a0PwBjjeN&RqT}WTS\YVji y5rS@xfJjZSg_~/PATbysE8#=S3gRwO@ /$1&l( S T\ ԙ/%PguuJۇ\-@3S|Rsd*% Pyʂj=S[[o4qګ@y !@W9(?"?vu:j= sc^,W@,NFw > jy#Ra#Rwrmc= %S -G۸!'P+ %}Ȥ#*kFi(LԎS"J TK3.)P= a7&R8O"h=7_F12${yU}EM[TyUysWWnA<f9@o7r;3sw黷-NH@iE#>3uj6iCvZJ >Fr=QyER$*dAqtP+øcTOvESv.#q)ԠH&/I< `$$%A؏o&-"]-h@UWd^Z{Q?*+;"jWVƌsլ0Q״9cBM3 J`PSlD/^^sokM}e dJO,uMkxPmVp6]}!''PJ SSԥ\!%_U Jux> ! .{V9GWp_$ObSc 5lT5/v9A@rqImAK_DgH6+J7YwCM?va5RۦԦof34(|Jy(3AϪ#j>i9dsԳjz&C,LO $h}-O&e53VAgh:itMׇ/~#|_p}Kt9.]{htѦHa)P|*܉Ɲ+ &wCԥt&P(=Ge|3:9@2p@uM3;[G @nJΣ_B,}]w<댠c*uJQqPl(T$w :QUS!-|mgL,+jYbYuhR5HUȢ,JwjrȀj:jV9&Y_@)_.@um7U-Jd5l9RUȜ>Qӊ*+Mj/O5!'KA!=H0 :b'v;@ɮ}c+ PD4Qzõ0 7!?wEOgzÙgN㪗J^I(Y Q۴.Pe17Ror 0PۂSS.[)ʪA#Uڴ]PmG(=OqG!iRPBiW3%)+~TCjD!s6(cTtR?X7túdIYa1PMh(+Wbh BUƄ(@5DvPRVdg^U+VkTUu˗VD(Kë5p*-JT%ޔ՚WGɞ-GT+I d&s)u9 **:5ZHU<Ƃ7bu߮=\CWR/m;U=>Q Q^(W8Τ\!J@ Qרlԑr~_+D <~jy9{=*2lݏo|Mˏei>uuG"տ#_z_?3v'oplm.(C5> !)B%O\R?mpxI' jp>8~x}F _gR-7&Q毹.K=Vs$jM)uX_(W*nDiʙIk.gZ&@ DnreyVKޙ&Q9Ɛ|4rͥeRivD<{4 zG͚v򼥨xvDrمiejO#/idJ?4 e gIs$ʕHw$5ב42e[i":*&Ad$Ȅ4 2e,Тr7M_s0 Kw$ʕ44)˝ԭoǕQ/n4r{enI+ɹ&Q\k8v[%^idKnI+]4reii"ʨڕvmLD2Ҵ|5Qg}fIl. 6r?D*ꀺ&Qe{w0Bv@2 مie_YkIl.G I {+JD 6Gy&Qf!'gi"Qs|$F!(vҟ )o' 6k&QOqWMGP\N(3\~$5-4 2qhvHzmiegjvD irhvHAuȘضd^ |RIk.ƻy4ra^4 rieZZ߻JjenHU-Pw$5GAr^;M\&AVA+&RimnD|anDӢ$5\F해\L0`4jv2+r;M`s4 /[YY&Q\Yn|&A&,ev2J1i" NufI+ܻiʒyI9l.I-~Hi~Ґ5$u%cp?MBl{I+wfӄ&Q\s?MByVmy-$6\T 5CM^Q]ri"V $ʔI9lz_?MbLՀiJ/7)D 60.en2˫ /yfIkBI&B.ܔ3M\ie8(i"J˰0$ʕCoA2ӽ4rЌ4 1kͥejjFDb6|R팹&!Y%4 eְg4'M\yV屄q+M\sl]y[>T.Ѽ4r傚I+^D#|[Y.B(^D2Vy-mW3Z7${*ignHc>nDZ42e5EBy7@n4 ep$ʕ42k<5;M^z &B9>inDry73|tKGJoeIk1lH(vZizkn&X(G+YZ9IoOj1&Q<j"ޭ A<0tM\3V]4 zmL4 23h"J?2^-L42|ƈ㸉&Q<_V쌺&Pa_&D؂hJ/O7$ʕjryfIjql&AGgnlP(w+R$ʔ>=$ʜ5H8kX&QZ^&RW2&Q964 PFxD8⹏&QrM\ך6fIٟ!>F(W N|rLұgFBij>{c}4 J?$Ȍ53gI+{x3Qʳ1+6k5MXsDm4rgٰ$ʕqJn7 >DHPchʞuG(s\SkD*ՠh^6jnI)uHInIT(>2\B>H\$5g΍I9k. ;&Q9Z}42gͱ\i"Jj7$ʬ5G"H(Wڪs'MBBޝ4r>"=4r1Ɔ;i"ޚV# I(WF@jf6}C~yCߐ{k;i"]eIykz Q A[Bw8nIYkQ%n+}Ϝ0$ʬ5ץH(\=^7$ʕsLI3Dʭ51ϋ'aFD͖h8IUReiJU$ʔ(C+Dʝ5DZafI eo35cl42cq[nI++BF(W&u cuɰ&Q9֥1uMBIEF@p{qfP(lsM63D2*!%u^q*c gG,@ʕ~_DҮqM\YӇ 4re3MSst%$ Dw$l}I"3,4 2a qI+Å;h2 MR,4.[hec2߼lBE[hJPXh3H\YP@cIk`j `$_w M\13CP6pF5M\uI+- &PltMLStI+^9o9G)m4rcacþ2F9 ehnkc4|}4 2irUЎhʝ$aI+L0\Dʍ5ǑtZ&Q\1&QfnIktF)7\Ʀa&Qextv}?o;NG!3\Fv]~7..,ҟSQPۇkR:z Qs/yDunP.6CVNBMR[_V6}!QTJg~#$ZVmѶN96JWg.eGKD}M#[>w=Z@"uOw[FϑG-4& @Ie̛jyT>\;IM#aD۹"ff?ۥ\]J#Ɪ5HTp_ 0ð%DӮ 5]bW =AӘy~4 O|>WYH~%#~ ;PY(Y1CQDM>=S*iwp޿Qᇨ:_@. %#Ɪ50ȕ U4Ԧ>u2|_cx'Ꞩ]g+}H+BM G1-XPt__NT?So]kTo=4(+vJ+1DfQ4Ͻ?s-Mi>y/NIzDn9݃ܬ>oAP70-(vC:D $.PWZ@<ju+4!P(7@3uJ{??%.:TIao+RU(uXsVlqBP(vJD!huJڞ-aSG/S8Brn>?UC[U8JB<).jGnC@ QMſڸ@JDU8vQD(0NU)uu:ޢr,o!RUԐ( iUǠJ$꘨i<37ߍRmB54zbBT=)W2A>/rt(9ng"Ι_>^__~Fv}o~>flY#l3e% |(Ri~nGՒ֎i;J(#Ҏvojn|Guo0E#Wm-7禘ҖU)S)&PU4,0ria2j$ͻ&RTƚ=ޏy`dڏla)SZ c4-02e׸0*H22)Wm LL| T(TӷAIL덑 un mH㦘2 ֤vRY L\aP*HҪ{X`"R.a+wKWD3~-0 elHxw#jfQ<=xb"J቉)Y8-02Y%&0#;ܰDʔeH2P%&B!Sb<%&R<@W֧MΦ@(;} )Sŋ1;Ld^U:502e(W[Zk&R!^3a T(W+C<*-!Wε ?)WF?6ȅj%B-4uCL\N]]̣%P;()SDuK^a5"0rh{~ +c*^~)ō~H2^Ҟx1Z5%0#n02e,E|02eQ::/ e]itIe fHSF7DȔu|aS@2z4tKL_tKLeEDʔ3:dhFt47LB[΋)SֻTwDq7Wֽ n)S)W,TPU>T(s/Ld^aAΗ2t4K\ŹSMPF`޹[a"eJkWX KLzӽ0 e$a[_"e(݄rVpDʕ )7ȅhޗ6ҭoǕ,W}9,!SV۲rʬ/ri٫%P|V)`~HuOL\ihH2Ꞙ@2V[ꉉ+A&B.7  FfܡcJ(#5)WZũA*dc ewjz\wRP>D7D*3ӈ*5f&"XxՇ㖘r; 02e?ǮA`8vLL])S04) 0rͭ{bؚ9Mxb"M!+]fB䉉)cVဉ+wyt)&RNɍUJyPiH~ fգ0Dʔ)Ss̛O)<Pbn g9܄&BWQSL\yD)&R4XsJRҘ-0 WDȄZu&BT-DʔBK:dHe=*3l12e b"Y.a+{G &R4IuLB`"di+js1&PC>n)c3%RY0lRγ &R cL]uL\8DϤ&G6I>Jetm6@.a⩌P%Lk[9(LL\Yor(J۷Hrծ_MbFWP%'PuH)J )ʂL0Ml RK`,RQvNTKB=%e2HU P]9PR (n)x==j(6)P'Y,3I1a]BPGṱB̈pjPoNS-8/v=+SJUN*()LJ@b"@R,=*('xHqnHs:.Jv5тc6.D]5g< jJShDQTNك8-DOiP"U@I A8 Pr*b/BGH }}kM&$3R*?Bb/PE1]k/JJmQ4 "a(m B>ٯzQYw+.y DLNTV^6ٸG< /]#2y5Qõ4jan ԡ $"su );XP.3gLMʒ?ta]}v19ĚX@u1Q,[ yQCq#[@mjgWl꘨uI8uzaJeYfHaPnDӵt凈>PΦP<^PZ0/`CT)Zq#BYUhUxj(rl{)̠ ,oI?OrޓS 5)KD >j)E^+DJQV"*\Դct?c*1f^6zK=覑ߍe:>Pf- Q:-)Wz\U r(WN(Rax4Wg9*YxGF7:$ DBԉ - RfT(D DBԛL+Dh\!uM$$h\jKR!jdAd1 WzrwO+H#R QohQn Q# "BDBT. (Wzorkt/DB I+H3$R:C Q3$QuJO Q} D\w Q y rSZ tm5 e.HBԪ&P:ՄBԥ&nm5 eHBTV QoQuj &^K\ MQ#v}R!'ޭ5\!] RfT(D5}B!$^+M\!]2 RT(D3DBԮO(D:BTמ$ܖTz}9r]T:/IwL+D OL@L> (W:ݤB%&T2PB!j8d1:kISZM*Dum5 m5TyK*DjB!V1P2RB!CH\!Jg-u QozQ efHBZB f'α'8$"w\A\Cbr:BkJ+D]2B{M+H]/Ri/ Q"uJ/1*A e.HBԦH(DjB!V QPոY" QM[M(D%.m5uk (*tΒ Q;9դBTV RXR!굒%^+Y\!굒%"*DBk(H+Hm:gI(B!O*DDB0%d̘PdI}~ Qo0\!= PZIHҏBtH+D! DY" QMT:ՄB)btƒ RXR!jV QP:ՄBTV Q.Q uɜ%btΒ QPՄBYRA%^3_\!Mn"ZM+D%A)DS Q{RPڸ)M)D|^ Q IM)Hm+RjnJ!vS Qkj7ۭf,m7m<ڦ&vm7ui)Dum7m˾h  4*OOK!R9K)H2g)秥ui)D|~Z QGR:J!jR9~A HRGB!J B;((wP QRnGBAj&bPڵՄBԩOGj4oٗ{V QPڥո@̩&PӬe_UZM*D5i5uHI(BZR@f*9SGMTM%5JAjM%5J!Jj4B%5J!Jj40 Q\)bFS)DIRM KRM%J!JBhJCj4B:(&t֒ Q:kI[[M(Ee:&}W@_v8/Vn𮣮jķQ"dsյ۞Я[ͮӅmhk]n߶?iFyOtJsZpgv|?ßqQd}?C\'ˏl_+U?nb&jXV 1VB*?X?H5@沬gu^62]^_}]wױrYOiT˯o> Fvy׸oxnp\گEg%s{ӧ+㿎{$9mmr 2_/^ǯm?/uڹݟrA|9oߎ^weT_߿_ߛ}}k˗ÿ?O=oOo1ӺO/w+?)9>Hendstream endobj 382 0 obj << /Filter /FlateDecode /Length 19560 >> stream xŽm/9v?Ł_O" 201D 6hMϓ|g< ڛu\,Ϲ׿ŧ"f|9WxW '߿o^mV^Wrm>Y7wv^G-~T{M_?u[m6ur׿ֿ8WT5mv&-9[ro *z$y~/ߧ|%J,/Rzg;ҿ̿T}aK޼η:hӽTr˂(SWvo[?~o@bGu.ZsH>n:j-ܣȓR>OOGTIOC֒+S\wpyS&6qY;D5_R.9qu~9 YRtkPkjԠ~:ߎcH|}}e??}ʃINXyZ[r~U-Z+mH~ ʟ[FF~X:1^_Z/W/1dP*Zq! / X3~E q+Roo__?_?v3 `aOiʠWF]r!}on}"9]nף|T{V__"G<ɓO}8k ma{/h~5į\'}P޿~S''k׭ڪA[kuڿ@h~l.q)kz>hkl*QZ7:$2_e/:rC流6Q$2ogV`sJLyu%Gzh@2óF&ʹ_YgvMO};!tK--"%GqV^F uvS&2P3ߎ e 5Y-5Q#E jS΢s}Tv:u01Ltu. ̽jJCݒCٙ3:ƝuJy ʍH;챥#^kg*nRHT.K e"=ThE&mov9U Z2*Ez6qn 8-9Mg:V!hAy \Of4:-ĝt0rooyQS*L+ҡڔ^3B&X>ɭ4ֱv=(4䍮7jM%p, O{@_g35ElqʰlQ^p-muv 4M;m:6Χ[Hu28n^j^*\/]̲mҡjb4߁Խ*fs &ڍYIF%slfK,R6Rmfmybv\)oJlda77kvQk^M/asMA-3:۱-.%;>n nl={}ҕj2bMsi^RGsK4>{40VAdz؜*3DlU sUL](f1 b{ [z6E^5>[GVeXܫ dԌ)Q=,9Q՞: r𮜛!]/rՁ7T/Nv&1H# 302ytf/XIZ-5뺷{z 2=cLPQ&W;jmyQ)OrpxSnP:mޔ̓dsK}oS:TX3HwHS!H[#uj4Br9`tQe,I=B{rPzu\ڇ( b:Rqސ@b|[f3ѠEa-e"ov(u6@: W?x40w>49;24eK·"Wtj [f@$V Q! Dyi-D4;:*bD )#DDr@` e!"I}"*  U^"*ù#z:jrD$@DRc]7bDr:#ňgD't-3E`DZEsF 'N髗dH߲(bbEIM$1$dL /%*|-JT&D:sJ$/,;%N%.k%BI/J0%jlȋ )Nn\< Jtw.c-JԹ.辸>fwdDza"S!&E&D:)Knc48/ɫ!@QE.`E8(oHnY\ Pt9IPtu,PtM/P$#A,DP !(پjS4{6P%"m4$YEqIUx"]\#>Y )('!'iEJ "IQ BH%AQ?}A:p"}wGD NS#,:'u1,9'js֚?%9QD .5ΉtHRCNt5ɴH1 온 D{rI)\1QS`"]o'8"'_98'eM^V>+r"["'<WrP4@Ѹ,9,HG&8&j]c" 9&҅l[GL5&&L(D *D@#Ԅ@LDE3 c"]˘hua" @DH0%\#"$ 8$4CⶂD&Dr/B`"]:7)/(B %0B"X)@H$Έ>5gD:ΌHGΖΈs$F-Όhz#E|8XΈͩ\0"QdDf쐨GgD};#DmER!&ŇdLuw;&"rL#a0Q7@`"LpL$=UDVHS" 7L $IDZp+D6꘨*ů!UqG(ܓ^"&R5&> Sp` Nso"0n v`"*HƎbcD>KCN[Ήt16st$85'jz {5 1Qӡ`"۲ 1{ZdbI`"b}1Q7&:|1} I[c&&9HS"bq]Dfc9[`"yr,:&瘨"'iXOHEO6^Ucq"}8'*']=.U'dAzȷf-Ttq>PQbCE/TԪ+֯b8P!8)j\ Rt]|V`.GE|/Z2-Eb4EHc<yfqEȋt‚vH3 !.ßHWo*E77\KUHE Hk΋FE\H' ._Jw\4_EA:.ݻ.E.@"} Ha^8/×} 9ἭcH y*@A[E EP0EZ$o]࢛.z^2ċvh`}"]Gs\$-h+Q8g:* k<@$)< Ew)NI BE+9|q\Py90?r`+@n0&H[@ .*\eBiG:.% ]U45Jgr|H 'p\Q!.*yxQ2rZؠ/*nZʙga"B E;.1N5._91}DHtKHҍ׼#_92ҕ֌,dU;Qld}Ȩc>.:V* Fy$bͪgd 9ZBF5ǑэɉѢSN:EdQ+'Fm:ŋ*"F9]A"F$FZpk'FFm^YtRJ9U/%IJM]&Ήfs%~銊45 ND!H)P)X/rEYԺo~r*l'tr ǭs*{_甿u_yU)8.T"9...}WG N(ݰ_^8./h*jC(Q?֥/W(+ es}^Q۾Xbחj@VsV,R!E{@q1ݪUڙ.F`\5:ӭl˘90]Qn"H2]Q VV]mӕA]gROAڀz2 P2q'0]7$H׆ҭZpL!] w'`U[uLW4=XtG7@2Ƒ#k"]c4 ,sؑn5:f\Xqkk2`ʼnn5e 9=i-% p(ܫ4ItwZSN #3DD6y8ѕ< bHW~4<}@6(T ڔ[t̓ @Uw/܀@6){_3[u~;v+6E'>y[  [uo[`#?)UpDni( CC2$ѭtulDצl $6;?U@*ݻw+?Dt?]{OT[UW x#5dS]uh)xn߶UhzA[2wDx6ّnռyѵ Kk["x;ډ {jѵP讁]cXl3Hn#]F VFZ`,@kokZ0Dk}<RnUI[5BD<$ѵDޙ3 x;Nz]%6L[DW"]uC0]kؙILtMnd0+0]_u}k mdI1[uH_Lv_DvkcUpcgA}JPjCzB8n]mX'Եd4AݪK6.B1kS^f 3kʹUgr22nՕH`PݪqX;%֭GU C2nAUSݱ-0r#=w0nUWn-̑Z0ԯ!5{&2rkW"v8ϭ|svD ϭ{rsMi{j2l@=I1( lpkOLݓ\(;ו-uQz{uOD!ו_\|_\W &69UqG~Ǻ:zX\^DrI׭\}_\(=*;b]])ܘ\Ɠjó\p] (\WG#Eȁu~y eL +c`]"6XwWu 랅'@@{=ѽtpnLp3h1t>2dFڝef#\\vh7IddQ ]8"3؆.H׭GdG}Rֱ#ˏ"ۘftTG2Ό"26HްŌ|bFo3T3*/hT!:^vfTE1:.:*T9Yy=PI-\trE.R, ;.ҞxE:Z-"́Q FuzĝˣDƁH`ۅ0QFQ0 'Ec+@JZgDe `ʁ̚Ȕ$#`$01:rHxHFD8b+h8aˉQg |_H/B$ 820wC{2:.>y0#( 23u2:xBF#'FǙ91. FOј#{&F#2*SGFI\ $2*C1*OtbT045"t^T|EXyQeY.vwh_E7'/Rtv%^ˆ@>?ŕ%EZG/H30B#ya< `=b#=а(G/HE/C\븸ܾ8)vh+;X]ů~#[t_seI]a$D̝@e\q"/b[oEH Yq6[[ ޅȝhتPRn$f Eb 1<Xq΢ ~2}IYqaIzlQ9w(Xqz@bcF V\tٶB0AANװ Rl@$Ŷ]¢3N.|")Hq>tR\t'1+H).:_").=$E G2{l]x{(b[?BIe[8¢kO (. <=@qu4pbC$(.7C5P\C6d89&o0qѮPتĝ0 xUXĺmBݒKJLXW4aȉwXZqv.,HMSd Ŋ NuALv"D:dH QWBŪHO ?L8==H-uAr'R|hT#y%)jx}W2Xz{gʈxXH+"!NJg:<&X<~5 5:!s)4fMBl]˱Gnq]`M= 6YtM9EBlbظ)cc %NsDls F*gx{o )h$EcX߾B怸n"c䜂!~8(4@l @AcXտLBl $ȹb˝tLeX$[zIdƇ|=FeС5Ht>,Y mA>rp$pDo9aۏ)D˭ImdZaeX &;{5*FpxoᢁdX%}a7. 8\aqphU$^S e} p#"e|a>au8\t65t8\tExl6Ar< QpCr1A^eAfp \f|!svu"x!ZFt A~öst8[ObE8lM:!֦$_6Aj9 Fmpx{E949p T.HLX;9uu6pQ6 U9?B+W&s[A C oO01>u2\Tl .B 2\,jr'EYOh4+pQq`h&̽9 {1Y3?U`^#mZc$6 ]".HM9Ea7J,l3^`<Xfx(b XXa;,:JaB3f \T8AR`0aO *rϱ o ƫ;V2B , o or/ba0&XxE g8V#lɅus.|FN.& ΅e? W K\^vگ)O W]'say?^,rayIU1DpaSpayEaSpupUEZkXXr ʝNH4#aOF;c \#.Y;Ka3#p,lo Xɰ/qH {HEata{ RIYJXhfJ+]g %%tH/Lt05kI:4itth4k$g>}RQvt4_)4t3>ycAPSldG`!P7pHs&:Ce>pBb^66GZ}8W8!xؐ},![XIlHQ>!; ؐB!]]E[dCZ 6tp{H!ߘf;gq6TcOZ,6TPȆElȧ|S%ɆtB mfOgCls4ωE@ChH= 'gdPbcяF$- $5MB0BI#ks! 2dUY:<΅.ֈŅ\E6P :h$EB:F{ rbȅt&tL *.Tt;'/PPRB<,Аc'"jj## 5~b!='|@CqPs Az8##nV ]BqHѠeDtRf0;O-Ftrq3}#_9$ (>NHjkMi},ȴ 0A18"I ]&{"*3N5$%ҡ=9ik,(:#"QMȰgDt^GDtErD+,6(!,aqDT-(PE ׻]Ž ]GDn_Έs;BDcQ&"xOpDy}?mjCGD3+OvDtV:#ҥB# SCAc<};>GXr I> =$QCg|Hv< hC|hx @4z ?"heD"O<~@ D; D7?Y]kCqHCABq@kY+/)`k@20NH C@TQ\ BT}$D~t$E? DT bDTϮ D$>4~̥c> wBD'׻;z, zr` ǜ{'ez.$7-.SbL|S.S:P0=ƐB2 WD!2]H&>2mYEz)olV*E}?.G(İE >B%<3qUPR~ Ee]$ rj\d悒]f\PKWKfrQ.%HO7Q]PusQ.#ɄHJvG)\JvXn.(E%@7 C$}=ːJvgRI.'E%gRI.e=YTvWp]Q$;wzDWk2<ؗJvo.(UЕ2t%.W.*Eֿ$W{DW{6}E%-ѕ|pvd@]϶Jr~墒]iRk>ۢ+u?ˑғr9]Jrq7梒]Q$]l.*JvG9\؛W ;vE%%dwAI.lL]I.&\T (v亟ѕjR\ dϳ-]YT_6zEW6W1`?a(u2t!yGK %z.Pr6Ž%%]-_ B`3n\dף\Ed6.(ˣ ے0AI.n\\T?E%iwAIy

aѯG<ʐJvgR]j\ɮ(CW[6zC Ý[JvG\6zCW6%-ѕjϖJva\]ɮgKt%msQɮg[t%Ƴ-]YTk>ۢ+l.|\d6.(l$wm.*م| JrĶ d(EW{7%gkt%pwAI.=L]ɮ,C*ŭJv=ۢ+-JvGBHld,C*%mQT]];s\ɮːBpf]vJvG\Ϋ]T w䪏vH!{t7AI.9\T]I.=S ?!yM>vH!{ڳ d6.(u?ۡ+5eH%F}!zC íJv2| r]Q$n.*e[ JrgKt%G)]^$o.*l$&o.*eF Jrg[t%ywAI.n\T]I.n\T [wzFWK?rJvg9RIldx#ۼ˕zGWKZL.GW?ѕ!{ѕE%l[zrA.ӳ$ld% ɃJv=ۢ+Ʌ Jvֱ䂒\-]QgD%-ѕ2\߿d׳%(dx+ub;梒] ]I..*e%dW{+ɥwH%}wAɮgKt%x梒]>\P?ۢ+u?ˑJr݈/\T]Iq>ˑJvg9RIldW{#r4v9+5Jr`E%P$WyGW~+0E%,c7<׳5]]P3Jv=[+م%zГP]I.՗Jv!2ewAIldWB@f=V9ݛ˕js%Еb\梒]3[ff]Jr(?W>"\PSJv=a\f]]P?۟+uY]F]P~F|y1 lsQɮgs%-dWݥ'ZRȞ(?WiJv=۟+5Jr1msQ.;q<$W}BWkB,C*5e8?k\d(CW|DW2H%><ۢ+P62\]ɮ,C*뎚D!{g,Q-JvG\8ewQɮ\vn=WJvͼ(亞Еy_(ɅhvzC ɃjvyX(u?ۡ+՟eH%p8]vH!{ $]T]]v(yzBWk<ЕY>Jv=[+Ʌ3vy_(Uϼ(zDW .*ucd׳-\8hwQɮw\]ɮYT ".*l$8H%$|FW=ˑJvg9R]ːJv=[+ '{m& eJv=ۡ+ɅCv2t%JͻBɮG;<8l7Qɮ; %p^]vJr`E%Z3JrgKt%/yX(u?[+5H%p]϶Jr,G*՟HesoJv\$]TcdJr+c(5޿P>Zc(5r9\8nwQɮ;> %ڣ=]= %z~|ޞ%?k~]W=Jvg ޟK?(A*5 !$Ϭ򛟵C?0qZv~>;9Uwɟϛ]Ͼ:xxCڅ(_ߧzX7۴~Kj7}znkgBMe|ጽ_}qv86d^N?|rMG1^?,Wi_s~w}~:KG0g0닇0_<1\_<1\_RO?}k-˧52r__$39_usۯf_wֽ~n >o/`O6U~xfk2نY?Zk> stream xVMs7 k#D[߼KezP,qji*vr?@Yf|%;=Po9n~=n9v? 6*udܐ펛*[^orvѨeȔ?xMz>C1dß_4uyh֤nf{FkUafQŸ!HF >zD; #e!Sf6qǞK9STXKQݬx`1L6fSQ5r{ٍ=C0Fj" qq K +긬nWrwzJ|L+LSD7 O6zhm*SJ˶^yza9lLFzgLĩŵtR y)l@VK*\Id>b^?5NℵGТZh0D&%Sʎ2 xn>KfK%zbL4C׸&p AG>n+G.K1`;\ŞQU%@;dBa?CWUp";U䥢6ohF[)key黩Fe*Ͷgpm6 |i/}jasZY5!JQ{9p?U1=+G*KdC)m9X(9]xe)ݧϻoeendstream endobj 384 0 obj << /Filter /FlateDecode /Length 1103 >> stream xVnG+^1C\bȁ,(ʦ$ꞥ^Vw^U7NH/oo\yƟé{SԹ8Hm뜏[eKNӇd~vHs vqbI.co(]4C@~[g]''uݐnf[J;kcX'8c6/F<8W]2"dp41h-2mUEviH2dw cAe 0;y֭$/O.Y ERcA% BNJ3k8,H/dܫg.+*⭸6K"1qnD֋f(>교MiJa,A MBU`AGOTsTK-c5b4w56h*\3yTA[ .?s.91y8Qd,$QhNkZ |>!^6s5̹zjTc~1(o=TrAkH+"`g#2IEb 5+5rdwM$A!p,%8rPE&sC%9zo:|CQ +^̫%M!燑Dű6׵"_U䋹jd=K a@A9)9ZP{XV!G ['jaA :Mx)5]2sXaICoX"4aA\Y@aim60'.nDt~>]q>/- O' %agNp]G`JsF|i5+؁i  {=zmٛ\ :H0ډZ[ΦY+vA1$1/}YAؕQaq_'P@ej/\}3̪v\Lk$,RXbWRubsZh0rϺ(Y1-N۸Zj!s!R`P> stream x[OG_qJzn~'R*RPA `llH!_;w־o9jhogvg3s{gΠ0 ~kC<<uޯY1#`iJ/5&2` ^#&deƑ49 Hgg!JJ_4[ŨG'J1,HQ1=Qq*f+͟V TTaw2 /o`.$MB+/b,ʫ)7_}HD?)I M]jjfĴ-"I@Smz< 55TWS){iKM]7'PibBE׹usV!2UGG-FScMxJ5u!1,@T8*jIXC5hg8_SM]OG@!]<3wU~ ͹I*gM_gR?V'͑ KҎ̴ ]\8Md9}MzqL&-3\O`Fxb_<zX>Dd[  D%rv6A`>$,CC 3\MGTHVSo5A^.ğAsGw].+aR i ymBCBa }Y^$ZJEǐX]N48>1`A{q$ T:w@o:l{`&߂1n;H8{D߁3C(;W5D p3;킮AdI9<φ(q>th"ʥ<"-:asL~`2BqbĠ3UfiTCdc`)Xy_B9nu_z ;+S@A1 dd-tg _N@(#`% fK0ܙcș&L?X)RկW,b 037Ĭ:WAX%+uO b`݁a(@S@k\StG4K!1?ZbO69pެ5j->vT 16iq\seMPݯCcW6gǐ.6KUNZ2 KSZa2R6RedQ:QџZEGW23YI@\ t Kbn/+j Ls!51* W'Ƽʖ*ɔZ̟W ;|30tKʳ tk]آ抵sb:3[wS=&'CvM788(dPWٛ, v(~&(^*t+.@MPpaނDK T"$ Y?{endstream endobj 386 0 obj << /Filter /FlateDecode /Length 3218 >> stream xZ]sw.XBPHBy K)(Nq;:3{vs!~{3绳-Fk?g^4 `؂1Io&aR6Z5j,-Lx`b*Ԣ1)B+Uz\"V+w[ֻh΋Dw> [^TXABFx 1DUpPJmfuM1غxXeBƈ?ot3hXRFFʑQrF瀵%T3g͛3a[Ϝ9{ќɅĶI'hh705eçɈ8pH Y9p5^dALlb U?^x?@5Hco-H(Ti6~Y{-(GOW5B%sQ$دkk"<۽v)t :h ϖ" OH0?X=36:j\IāȜZdi0 :8ԓ0Ypiv]aJh,lgpr} ¸Vm61KQ(k-3 }f]EE)щt"l{̌.]QpX9tU@6=ˎR -G&B'b]5qP6;pU e,7$*y`CVc) R)(;26e!} IpICU" !{]ZC4SDJD7=m!JȕX3frT;͘f\ MڶOه؜d*5t)-vAKW5ce&7 l]4Rά^"zzlB $&$uv44& E؅#w'VN'~35;\I32@2sd]zD*M.g]S%8eiw㢱' )(Ϛܝbwvu;?H3{*f~,`Ƶ8\Xǐ Sef\1bfs1ݥfEz/1N-Pv6z/jEa70c22eKPz7 Sr9TK' WTi3Y`3U$Wj*EWsu̔ڸGtSG %ص$εAXug;!H\O\g(,{07H 7π=n̆^+c?n<" >͉|?,.ނ-:y-ɔR5 :( l߭% NH!LlxmUvv:5KQ0֞ nu'a,[j59.:]nކmݣ&E vuO1K{o?`4Y>Bo r?έڣ=@nxɃx)"C#|L#A z8F:Vä􀬸 9=A?=y?L')VdHoM?IW]jqi:Ci8P4?3g ,gRJ9.Ѝ`w*]4= S*‹~QVTW')g\( Yb_T5q)N5XϬFls)u2 *nB}u0ٽѷ7f/&`o1ẓ {Rvw-62]b֐~Ue[B'RG~Յ|H!@ #n?+`+fVIZyC Q?4}ӾdNj1sF}>Pd/2_8NK}98[Wjq~5þ.~ )~-]|Gn~=a_@wEX#' 4u=uQ(iY%ٮ\QiU"*<*}8*_Uʕwkqe@x %mڟf8SRӐ-7]OCVSso]L 筤H0,"Vʴ85TRZ J$HLBEB+O+K|o r(y$R%}9T+0l,/%Zh;V}Qi7׎pc!?J A!: 8endstream endobj 387 0 obj << /Filter /FlateDecode /Length 1616 >> stream xMoF{A/CC Ft)qCiɪ2"C>8 ׯ~|sN5Wq"[c;)Mvɂc_Ά<=<8Cxxa$};m`rvṯmC6{LyO.9/pD>(1gnٝ}@lJI:gx(:~ˡZK'l>zq`dls5 (}-L"Jv0Z 3ch![t^ߟv&ƶ)D:NЎgxQDŽr:g&(.R.P-QPm$d\Z-/2megŜ!#\v -ǵHCÍ!>6m|m'ZLA\Jxw>Z޹Z,F[=f88#EQʪ.?2&\!4BUdLkW03B8µ,BE1HK"( 0) ¤R^3轑qXqA/T$$/VaO_xlzgu8w] :!8=ttA*$9q.BE!V_MLO6U)cGIbiĢ1x2˾'ALe:$!N_;)ؠ4xl/3qbd13!!V]Mligɦ&{#s:v|A*$DXȢ3{,Ÿ; '/BE1<Ӣe_舓 &qbY8A뭾H^Jchq6&R-'Eʡ3tjNV$A3,̢2{g OEg$qBt28A3tNP'A3u2Mli(WزDk;c M6U̇θv(*'3N'C13N'Cq^Id1x^9B f\wNL47;9r:"{u'ekx!&OƕP4OF0RC6 Ysfԝ IGiԩ;Bs3!͙:u'Csn!̙n;Lt{24锲E;#ԙ:u'G Mn~i>__;Ehs%OSw2?Sd!8SD,bL: y,'ܩ;AG#|dϷ֝LbS"y)gIHܩ;9[E!rI,(>sdh bNP bN̙;}'39}'&1CˤS^蝑r,UFֵendstream endobj 388 0 obj << /Filter /FlateDecode /Length 45914 >> stream xMHr_UA|l96F46MU*IVI6Iߏw$; &*L=9mz+&iOS'om\|+~[?oKmoazsFQTJ<m?_Z'4F~Ӳ+i*[_15_ixٖ,?Q7=cP-ߖ6ھ-ey/[oSYoo׺ҿ6~瑙#FF?YF2hd)oL{[+oБ6-6tdzy6omUGq'o:@~2OLLgfK_8/~42ޚPfU hh~Dx?S;#?~4^>gK>ި@ڻGY7~AnQmFSC}ٕ>UFqH\~VDT if61k)#ddH)\,6k;"MX]#[Ns9*d<&^(bkD?3?-ˠo1d`lol1Q<E-:׺%E Q+~UtB u9iUEӪ">runYrv;o9i&,!H(ޮSUP'dXK*!~%ېPw[uZ?WB!m^4Ҧr^&eL9F Y-cNڦG']BM}dөeh=Nк- eUmC`Ѫ^3o+4GwOFpzWIP܎v㓕dUGT6SZ6ڂۮl vj[6QtD;Fa4nq诲Q/+wՍwV\;Fi'ksWt@yZׯ<@|<<2p1;ѳWS oB>Oy1fD'F#Nd8$l̩1NFn8pǑN.G:$uWw;wԒ/%S-av).6ubwI/~ \ aU\ 4Je W3U@Wsurtt wl;e_\m۶Y)}? EtGI:Ս)hmݻݯ[CvLtɠӆ86hASX{@djCx6;Pz!Zb5?4)6O_?_x7W{=ګ8'dr ΗҀ(AvЮSDVط[<m 5n)B i{o3s45 4.8]yjœZw.*߹qn%h 7he~j:n9Nźzߞߌʾ&uF'2|_e: &f4>@NZj$9Ȥ1%+=L"u6jkV@i*ie6'!̻cZkmg%\?]FwEP 4tZ[<_XI9WRq|X1RS\qWIrxR|tsJm]|a`n~3f)lU&f". 542YL7X_d̩imɻC#m]&z<@zΖ+aj\)Kw]|=5*K݅ļB0WN%OE]&8b߲2%:[˙AVsTe F?N!Q+ʒҳ9'|(؛T8< Fj_ @a;gPV2DYFY͌HR(x Rw)#L;S(j̓J7 ,b~J1e/ԓG|磌+&I^a|5Y5^ߌֱk+K3ZBHhdB[ {BXh#ZrL[dTtܥ]yaԝBOs})7XJxD8v ;zxi5]|} JoHqF4iDؙUL1ON\: .Y唲Hgd'id0kd9nTt%tLv5EtοX6 ;5:PC**" )(dc@  )`dU /W^u'#]al%}k>:GxF]Wt𧠓ś]\ voA s8sý.00a5!aw,,F`'.m󎲃 fDYψ3igOc6as6fՙژxgs#9rV8r̙Cg#W|v:rޙ쫛 QQPN~+d&Û?BqÞm\.^@D e".5p@l"j$QwD4Y}-%gcbC6>⠛]?,=`|<Q(w lp *ݕ]-j !uqJU]4CGeDf!@LlgFiJH϶m;1ܘ ϒ;n%zFL4 4%nkƉV0J6z~TvwOˎ~@)M'K\}wlwV&]=FN6)rZ9U|oYG#:PhĔhӒ)ḊH#Iil6j$4bIȦI#]pM:J#Ň&+ H32rx:ZRxGowW-"?sꝮJCb1n*iͰKf:gnN``bV3P6bQ  tYi!74P`6r6Z{˖;:5{6nɚx>RSWJM"y2/šbHNz;]S(ZPG?#U$Sr4D3&뷟5z3`6#k!lyfenn:l*fLnA)3JvY;(=FukٵjQ^XTo͊]Z*?m ?\g0:9ْmgc-o;X,p je:r:l:}#`:}VLg=ݖMgu=AS([LgIb'u| :k6#ʞ*Wi3ڸ2kpj^3c9[pl?eVgV#ӀNc/K Zwˍ=p Z{4DGCTE~uV=HU^FKT"c]>/$bXZJx/E"]1f1co}RA TOɞ` =< s9m&Bc9[LwOpWM{9S'߅r\Oy w{SH-|h~BtʡCPvicP1߄(PI!: QV :fqw#^Ⱦ SGyn&ѿra064L(ުQ0xosgsa6=L:ʇ08% 4 洋 QQH2JboHz#wV-.Q 3)Pƚ`}Ť8Ayϋ_<\|7ǍwVut w9j swudMWYvCî !TD (!P#TX: (PT +@_b ^N2|Mo߽#\%h8eɂk.'±6`Y|0r͖Q˚d[RY '?;|g'E(wjіֿfuD *hb*>*>O1)ScjTVOmLOmݺc>&W.„Om&>"5[٩5V9.uQ+L?R[JOó1ZZՏJ|{ j@gN ń+mo/50hՐN[ۤSwJhAn;M잳;m-kس;s(0<"XTHwOPjoC/pױNWќ(#l( Rsrs ;H^ω =o,ghҞ\{l<]utο:Nv !2!929CH0BVtсJfBt"B8X*U_\uGc]RNTvo2#f[0x&oimo]5Ca;5ކ[x;o-/fƳ-QQa5rao5z}t-)6uGv3'"F 15&٘Xpcq*8H4#WٳIh#ھ/<#j 箽+4| LXZ]]oR_@E^H5@#;4=.q6r4K\N ~ڀxԾ RܯwsCa $z$S7D kV4nf> /+)&i͠vg roйà$FtTv`@2 Dg<{z-vMV ?uS=MThnzpa.s9/۹MoKniqwLeN0 ĝ٘dh%@6ӈ̜bJl;iݙ?۝Y0!]8Òw.~\rȓk9 1Im[ŖW/9>qtwF魘ue\]gWty3'LqFBbXtF]&fd04216;dFmi]=Qi)w6M&WOó1B,Ҿp:|w(<5[Fz\q[Is{ΜӖ)14ls<#Yaqe:-RC#zr6l7#ܚӹ-B-CӼQunov0^ T>zkL/,)Pg%ŧ\zIޞ^uۼ ! svo+ UV=.;G·̨GzgO̼ C>f$bD*='sToxi5<A-$x΅u —aa[l ^GHì}箄*SlTjz6ӈ@8*;Q[U%Itb#@K&BgO-|TWO|oӜ!V;V)f(W;(UT^PAUvz2⃎PF&YJeh7 eVz 9p-߁'7-Cg/Bَ }vfA/^lk˰HHK]?'02R|OW3"[3PVU^G70S޹b\k(#Oшs1γ<9st-.r/0Rcded((hd1hjOt0٨&g<9ȓ}=/#ty+Xt@ 4DOD@΁ ,x (0SG]u'Qvh-Qz4ԛw^MkhAc  OM?-,*hsahN4ŠwM75hA|xysOզQ 0Z8Yx;_E{gv2)@Ftli #Ulf٘u'p#3q"8HB'#Ot\vb: QqQOy~;_P8HXT]dæ:\lz^B.0õÀ"/xE]#?=0~Dh3@L]u :ZDkn3L1aAs tpã~m<`|<;(hP{?^Bw~x/5:ўWg8O˴">t{mP42sBш66@<P42t:T#Er Ue@®kw>"'N)L#Mܚc9Eed֫'Zx'}@j9gitE/ /\y^uw /{GGo!:?w 4H8mp57/ΰ, Ӵc;]RII__i'iK&}̺╵*42k)k |^]Zeu'Ӣj1T xN+#LEF 2B(|T/kԢ9$*Qwc -Oe~Sq'k#BSkl)E:Ki #X~>%̇,2,14*.ӈI|񬿪dH#V`zMY|b]ddQh\Wƨg[=`z]ӛL0<ҤH]+ajZX*MHt2|N_^KU^Luc;]KT~|sz)$5WDgޔCY,Ę.yL^{MVnY}k 9ߠ̙ rOk%g kt4i̝wA3(J%FY۳Y(Lb핋R\m-󍱹s{ m$M@SltjGhU70K_ J# p/ S# 0jkY%;,Ɲl\tRCN2GP$߻ΗMo77[l̜ѣ.2Fic&6l3 os_d޻󒙺`G83CLH3Y#ӚB5aF-6TDoy%D,;մo߽#ŇOzYw1Ǚ/@YvsѥNE24V:4RGb*ZT^R5%<(,s4Qi)ϧN#mĒ:VutG|s-mJh@ᗕ[yǻwiڿ6Tx}Kׯ%!hyPllHS-fm)r^ejR*YL8-i:#4JҡcV&FˡȩY2*BVMƜW0Ï?agQԊ*y_y5=/,(׏L~ h8M \)FVj*X[*_2d| Oښ[TFC#Uqn܎C#zE,;ïkTtma*RDMTȧ>Bb|nx>RKOT^EZM~i۪.bSt6> 坞2(|Ԝ)*߇'QV(^|j, `Y CTX ?@Y$g;(UUOo;&yg5E ~7ZƮus5(ZEֶP_1E&Zd^km4/:(WK57n c䶿ЯZxd)>|/T QԚ.j&'JR^GNLrAOgjk } )NΨF,ux;3)q6& ^ m'.S(fO-d0'#VO0{mT6[ٽ2þ6ʬ,¾6h̍recY{mKT"oLfr .¾fK| LFaօx!ZP#7+Ok!$$V|,&- Nk~m=lّ(dM2[%&0ՖAh[:'R>Xq\;磘 *VPxMyJmI쳭> fh!TEC;Hʤb$^| }N@ %TRRR K%VRd %p[\ޡ b|I6w=w^'&F%ɅbhrX˚,&NjcqgN벓:X\<' d@r w\E>aFq<M$גrGsϭ))~fhR9ʮF 16y\LS1NGv8erV9r̙C'#W|v;rxORw/D1SQPNB xX읒*˫ w  \$ Bb`  e5 ,(В+\e Jl3Wk?HQ,suu K8Lj %Q_u'Kv1k&gwDàzx7arR CNME0f?R0Gz3; ; L?}÷Kk˯mJ`kB) bkqX#2[pH6tgni6ڈ۸Ѐ޶2g޶&ܽmL#lmURjN6xFի6}mlK:L[Y%yGB"!F ovr,۞|o/0/?0^)&ARP*6MrRSE$ڸs[kEυmz|QtkV}iwƧJj[ \BptRRwQ.yW͊_|n/\S𵭴z-VLmhFV'69Y|Φ4xMm+8`j['2Զlzs|t=T?4GcA-\5%z.1Zi"`v&+|` TLLs1@/#IA"tܷ] cݥȘفy0G09=}],m97]Գ$iu!>q}bx)RT  ZA/**xX#:#M Vwyiz>#X 8bg v i;nV`*v= _WPb)v)Ȭ\ Os4 . ]hH^@~zP`9zUK5>uxu~%umΓБΌ-JZgv Δ$r,h݀Phf!oY4}koFUy7<";|ү+qr"ى>bW8O֔@?R"]=Ԡf1o1axmR lbKD'[%ْ,Җd v9ߖA[Ys0^ c[E/K6$FAI>4 a v$ҠI2 i' hjH) j+ ʒk- 7;˜!_B5R=9;qxdL4WiMkl ƚd94C'ɒcxv]OkǺ2f L;L dbBe/&f&cg` D%lI lIj bv3mu,W)%7KIt:IM9SO5Jjeߒ]l2k6+Mmo?c=<\=w肃R-A<l>Jd^FFO/ew8˯YL6=(.7N3Y 4iDSp4b^5LFxp;3`bq3K&<-jMUKa:Ǟbidl}#fz%dXA_^Z9хμ_gzxI ̐ICr\g"-;k+iK.i 0=ikF4L%˧48 X{F.+_x8^TW,o"ļ%6jI^߫iaBW9U:ݓw&dw*OXb(m342ͭ54]oz'ݢC#z_3l Xzz$'jT9+͍8|Mχ^;gC@Ϲz.J_J}RaxHy7: O|FFݞ?b5G|%S١ڪ8: +J,'rDrZR-^LkUcujz':;(T$hUSoML~wؖooE3e3wH"F#U;ȱ%~r,2l8j@o]J2-z!=/>gE#Bn^)iگT azg\w|DYS-߅|H1ratz5"l̆Ӵ1aN'Gƞ@A,{'+(l`-{Qr(^bٽ<חStxlO`@h :h#4HG$S:j&N?:@ ATB{5,õp\ߜ(8;ˁseN O[.6|-śac]wa>oê{yˏsa  |CuԮ7Mw@-lI_@<7]aȽxARV4GQi%Wl(gLI4y77=F3Z9%1)ONl vwc?3q̐2Ee f+RW!Hsi7.m&%0`2` &&Parb&961U2.1m3@LM@4ԄLgM`̴O5Nw1 Bg*^6#/?`Ҽ%4I4fQIXRkV&fIjR rxsкÿPnIpp ];MF0H-o47rXg)e^UGn! ۥٰx'd#\lasߵfQ t>QFիڈ OHQ|a7[5eC28 /[pKa交Ǟ檕 ŐawtW>4uՊmC9 UBWwj qe;6-R%'?N3;7!dd%wn]uԲpfr̅cx6ZTU% ~a8ʢeu>w./Xkٹxżwe$ihI&h.^DAqE?6D'|Yhexv]FU} D.%(2Yj-,3i]uN"= H=xE5l $gx JY-]^ABl6/)ڬ+/BQlfmDbq Lk%[HXt@0,ߜ4#|Aiyfn{Xo-="SrB)$YK3^)X&!Yyn9{[_}fcx:RRRM%W4t*~Y"ڊ;VU%uZ#"oHX!o󤷃?33>fiKotN1iU<A\ݜ?/~w+sC%+igpr{>6zanA͍~THԝ^Bky{g4s#<:ҰfGXJ *G5%x>ZWm my%O;.ܥ/|"%e#ɖeyi7-M])K[ϓj[NۜG)ך~~l.~yc~jZjuz0^㮴rii}5`/?t#6j=-dD5|HuE T`g k(aːdžz*Ȩ,_2v!XUsWVMmXw |#./ٰdw܂J"wVGYPmU+0bA7[ih l /+ulG\iAc5[0WUWz[]GXdzGuU6@;ʟ_22A^aP:PJʮkuuGBw?,*_^QYYybeG4JIUi׈31'ƴ9S$pLő"N&G9t֑mGZ;gv;W {ԕ3쯫+gS] hA8Vֺ뀀.$8G@ $lť5.q4˨\g Zl1k\LuGBwzp`A׃_]f,X*<ŠmUUuKKn{׭1}&ZgؠvN4nԉ&<Ȼ'z}ྡ -p];s/sQ^jW?6D!oPJƚrAUr=%2MιʈhaVݭ:3\Fp40FUL#'U(k);@kWvBͨo@ zebMtSljF ^"W5죞hVr3U>)5샇@ OY^w~>hؠPEY$(: B:qJ" ,S(݁w DeN8g5 Wwp@'əORwOFP*,C ̀~|:uUʾ>x8/H|K|՞|jm̐LBG֒;i>`5GE xj`/|H)xp<i>jjUUٙ;Q*tc'&[#wc )XN" ^s>-o1sx1}A#EMFpFdo|GҀ&s(⮰@sR:x #vWC(<0$K4@z  ᕋ`.Au'v;?B.<_[VwC с².tم= 1,43eNtpxsCw~!P/2=o;'c+`p[q48}=[8x7x#x҈sӭogdcNysf7ߘ~'#ED4r92͹F#cӎv;2߹Ww/qǬGm9jXoGh{BABd+xE<,r4IL| ,0+N Ι>#&x#%zS7DƖqmdUv iDVݮ}[zwO !{ѥZx%;wRNzM3>AvG.;#^h7$Ou-uID:ڸAYi%(\B@~4EnӀA'H/؝q_;+ݘco3׍)]n7- ycl[ڶ)P7GJ;QwDQ/ԡyzF\}i|_ۨ64>pZQbF^ rH 岸R6D"&jX\Ҥ9[p ޽bXNLrjOZNлME],4Uw A&FNfH;HQnwߋYsT{ni|YM v6p`FLlQw(zcx:RPIM~'y2w‚bI=O< *܃8D#Uv]g84MI*a~(aP>wmM8oheƷ.sJWGm|%f3f 3J u9SuGJ;ۚ`"h(/,*&q&EA-C6Fѯ ܒ pc-o6 7o| ̚ 5Ĺm/6xBl|/ovF ~ הn7o[iӠ3 _ UmSgA]Ҋo͍os7up a7jrs\FeƷAtp=Nc1(o'pmP|o7f ({N-,VJ3=˰2TF[/Bt= )'R^. zܠI/0L36g68fZea[7Ka[a[^|6u3ƙ Osݲ Y.0~Z&u6KLp\z+uG\1ndzהx>'^U9(bs:eۥa; рev"Jޛ#)v:00];'#DU"GO_WO+OFEx8Uc L(Mjv.2#J*cfarbsRVg)Pe F-b>9Oe*=gJ1"agN3zm_wzGl|ؤ(^ ka^oyaa$|$<]X'zl1 i:+g}9č3ALl<[0䮨 A7Q ?ŔpbNRy Rmw3c(*.fylORw OPJZ&3Я~OX)=7~9Z]9On|󾔧Fln]gvd1M=)sʞ# =T 18nO=*:ݫͅʺx) k@}m=5*}!u޺h͛Vh8C-t#E0H#KG#!p:b QM|BLupSH: @-_s0|bӺx";(Ҳו >5" (< _}~61x^oïxxzKߏw f?CNIw!VQ সO4XwOq[yy5IY`P!8p)TƯF4ΈK&Řܘ8g{crp8ĉH$'#ٜ\mXg#w31ܱQTβen.<_Ujg:p6GH| ߕBBjdW,xƕ<.r5K\ R-`iN  R`K݅Baފh ܆[U[u;Ktny\1q&g7נvMЉ.<<Ȼ'}w!n (pp]*;,kឥY:1hn2_쪱OgfWcy#VIk\ eeDn5{p9_Hӹg(1 J,rgcND3 1ݔ &Z݌?bg\]maQt9<{nhd2riК`@hs$Թwwh1Dtov>ڑ00];(u۷Z$1߻hT+Zu*ƪz>i:D,׏]n)otݬQ|٢;&n!Snf#BաUz"VdCud@>WJ ! 5u\;9SuB`|U9.VNϖ.'vr-"Sg 52.ܞ/:go ,dR[U(0 0,/t\08Te<@.8ejx&p|w&|RGQ{tExkz:2XHei~?vk36E ÉT=-1}/1(֢7.&sA e5PP4f }h;E@FJ+ut)QV^GJ'3ٲjMJjc )XΦz 'v;p5Og˩vvMuK4.t0{[a06A oqwгヶ> p;a~B&e7q2}=7!x#|MV4ʘ)ƿ16͚ifw:82)H"#ќydtv:ig# FuRws3=1̊o@W|_]}<_PUH2-;Dn4(ќa%X7DƗhͲgN&:n7DWFݽ}pOPnpp];W¸%OᾤKYoI֝"px"XjS냻N ̜j}ζOQis+C vF2Ʌmޔȴv}HϖX&YY; LraEv"O\oC0HC3M yWFk4jL#\ߦ[CYy^wő "~xYb6xӧYvxQz'JXWW k~j| 8#ň6ZF7},4L @e7hp%H 4x|;- `]->nsn8pld4bL*s%[_NBN#&\);WUg}Y>YHOȢeEƑ⾳<]\I:D#U{0jXMB4,Yś-bnQBk/˛42 ΥϚ|7^[Zv-ԁWZOT^FLܧ"v`O4i2];(յty aOU~tt~Aiz@0?<]ZvSzT> 3!H[є@4!X 8^ yqjsƸs5samkl-|duP@,ZNkndƖ2-s+a`ɥ5R:/,-Kβ,O"H Ǭu!5 c',y*ܳ& |Ӗa :0A{;eס+2MD^P_eAR_ lHuk[B׭˨gp\uGB#2I7t"h\޲  U[+7xwJlU.e+7YGtr|6ڴ2IeT|D̫-S/|SC/zg/O5v}5 3JhJW4ƅQ N5Ys)7˽i0^ N)tuhЅbFu{nx+q-_%QD꾗hjg9vM4nÉ&ۭ:;~wWPtp H`&KuZ w/:N鐖tm_ztؤ={Dɀ܌{gi"1' WF歼5}6[L#C@ eYYm ֙FfAQ`P #4R8]3-s4~MNMP6Q\u6~\wDQq+HiJf.ǿoóEa37l.d(9,:VX^d/Z.k'#v7k (LjosK5 4R$ V;!Y!F1']hoOĐ~+uul |ʲV,?q*UNPXR#3n4Ku'M%ƒ6D(ّS[sG &UMwTxC|wTC=uM._ŊՍF4Rӏ0#ьwSaXB!w@^ WY%w8%ʫ}4<[ZqHW@ogH<.\E"KLjɗyrt$!j#Jyߙ9[9k|ESWo綬;(UEXP}*Rf:hxZ-]`/S% m&b$EiI:caKafghSwS@*sW,0T']J7(ҢJ4i>cQE)¡* 3V?-,l'|W!]GZе=JG#h} B<;.UKt:e74O؛s^ٌ/|ȼ@)$zp<=.AԺrp.JQuŴUexzYJ\Hr5lD[7[>N%#A6#H#Z{*FFF GփDGe@RUwGqWV`QVGlYU9p,e vv!&!@p( `ĵMȟ4H{\E4 Z,`PtӠ:q]R毳m:DDͿͪ[\uL44;&kwwN4nF @$>F"pWۑ.+aYp+x 2q>=o7{g!aj9 P_%`2"n6#\ 4H+%س K#Cgwq3EL#'L#]?qwF~ltcrAoX7tقԦ9Mrw0imMy+Ք 6v 0^ @^F)m|](VF'?-9*L7c$ kW1DƤ::bcnYN^p ?x=r/_$#7 %ޮ [0 yf"pAboS r׻;#0etqhղ925HY-Ź]_.(bdhdO0#50GY0k}?iQsx>gI K-? #'@jt(5`,>k:| l 2,0Z0jP|?eQŝX`Z U>GXVЎւ՝/jA cxlAÇ&^aAy؂uY9s$g.KuuRw'8p0Л_/l6}v\qMw .788omnh@.N޸t'oN8&Z 9YF5'qUǯ[ % g  J302SF;[/·m OVuJUM߽pct9xBcUͅnLNɞp+u#r"pX ^ p|lN8>Vvq'ܺ[g UM7n'RJwGQjPyU o׎%o߽;S(mE޷U0жl|[)n`9#/; 01Q6|\L3?tYd`Κidw(6TDtRnIѯzLMO<ݷ}Brsf8Qrs:]uhqiҫm":e^%iPGMi 4v>=q~чGx3gx@>RKw/QJ!\{ "7C|tNxhj:#)Bգ '"Xk}BIy̰NǞ_0{  iLrٞAx{I@bPNw/qWOA{=vݻ?b)w$(!dCG!-:؀x$J,!b:'PGPKA(+DWGb!:Z3a=z^zxZsڿa53(ޛeװx24N[0x[fo}x~/4[00}ix*;"INBI_OB<5Z{P1f4Ep1i&r6fܘug|N G8qr䠰ϑNOG"g;cǣY9=wEw/%.6mWbcwE/6L !0kC\ %Ќx\ Pjh'WL\̅Kwq޹d2s[Jއ@ F#l$RDjNk^?vS ZhDmƚ{:9AhRQŝ(HtpѹlpR:~yg'`t$-6 Щ2"w:J#];XY1˙3w`wi`LhfN$1 Iɝy9L#M 7>̄u! vgkl̎nJ~ZMr?*;WEIO=]άY߶U R}JC9: CϞ>^ Z-MLW.֨T蜄C0 E)rɏI2W1;!sI#U15KVLi*Fj6uǸ JYQ<E)+ڽU]A\Z] Į;Ɓ_Yv;#4L|*xϖޙڒÅF<D씡lm>msqOۢݹTuܹsZŤ l!w!`YPZw RϱW;9M{C!{b;]^wll}E~DDu=1"^: fFݢ_s9*jQs.F ^VT3ߵ,X:#E&{Bj#Hv8_TvVNJ%fS JH^_y$U%jhsYUn3PSӌD{ulj+́;{|]E=OLP XF -ЩS5z 7*rG|c\A -[r=2 e1m|v^s__/t=sRAJ+5uG|eQV^GY'37Zև\Hrt^6"-f.f0f412d$ f$h$8k#hm,o5qO}0h4*0J =JH}i=5.-/a#XlC¡(P1P hZ(˥EPT\s* !]8X>[AwЕc࿣r9l5u擖dhe->aXA O X^х/038haAc#w}!0)#L>mh(;&G[דOgKj\RRR}4beLj)Ȧ916͛1inw)$r$͑hNFG2:avޑ΍fx);Z=iMgk¢c$!2`.Fp90@Jpx4{W,9r M M2Tr8 )U]Y웷f,8}U)@hjLfu|eR0SkJ_u| hZPi gnPVBUp?wY&|-Țś]xCloj36wk>l|mxjg_JV_ ϕ̅AOkڇ_-,B>Et2瑢sYZVFACiM-'9z% Yu|gY䏼#,\_"sB!t&IS21Y;lMb$3xd 0WJ(jYeݲV(IE2L2S.+B!^_+1j(H]̘oyH}$kYL+Ŭˇpq=?SIPq?uJ )'yZjd~ w5TgfRTn:uY7UUzsw "kUBI7&i5 HZH+1xkuRz2o2ve}Eߡ;T*f_^,ŵ!e]#Pz S۔P,G8!|rB*qZrƟ&q "';ԐCzef 1HE>U?}3&f4w2Fy MLWwQ5m>VWGkZWZ]}G?/mKE} B:mHm`r$-,Ԍˇ z*r13$ 該fK5JpZi{úcx:RSu,(ѿ^VU~;RzBkU;n>0Ux v+T;g ֻk~G{N&Y]zOhl+}a ~5{ξzY1^q?g*g{y5?ӀiZ&Uy F{~9d\ўY{9mܷ,Ww/Dљu/*c?VTƬ:8 VU*i>4D3:0-1SLt(cFxVV:2!i/tUw r;4%cДm#+kٲk,?܄ͧUA537fxFL1 qfvvp-;>X$Gj(K*̱1,K}=  m_||;k!^;.)2VUFYy?gge=`y3iD0 # id i b霅H$PufCX`8 JOGܔq_OTkqZR3;R{~:R]B=u*&Ŷ\=SJk~J -0W9jafZ9ꉙc-B%Ȓ\b@U6qy3U@jfٜ>I 5fu:m-Aͅ yYsrJq (;z0qx Vrg L-wK+0|?,6=Ⴙl98u2XgnYSg:~rWPk !E4{ 7 !`wPVw R  jhqz[uom'+kE)1jyT9o?jm݅r&<ܼս8%>mfg"[>C4jCϕ< q"]3SbgB(JIKVo2>VRkdYu==W`has+qmO5|hBUwE)Gp pIt)\I1F<Ӑ=;ha ؉&GJ`+̨1œJL#i/vuH0Zqd,%@vɈLp^e׃-4oF*F2i΍Q<7Oֹ0 N6c kQo4y/L x|}n(;)׌*Z3e.&>w>ɾBem\]6vM7EJ倸)&S"TBw)4D|z4tUhaXD?i*i>@Nh1%pFp2"[f7m߅]m  jQ&ojWI7~cUE-٪y%N=^oi3Z*9g }=m_h$!S23 iQ sT&8Ho1,=eYuUcжuF< F|#iZ o0Je-\/9EX;WYL:wyle%Ci<#Y*~ٗyT$BiwR穔͠z޶Q{ۊ\|o|h%W_#߶eU(oMƷ QocKz%@JgqsWpF\mѓ(V[_:V_OCƘ'6 . ףoBP8o\n_UQg^j!<#pŔŴAl D̡ID[9Smyl3ޖΊ[;qnuBI1<}9r:ﯧ.³jMle-UilQwQ} hG.QqsB: ʸjpSD.N享+f |~k%^qn(Ra<t0AD~?|"<[YKܓصUn*-,֥:YXvRcMnvk5n߱->Ļ 2&D7$zguLw|&_q;x$;vvSvR%9K|X!bTt9#@dI+6h@#.  r,0$[4Ⱥכ;!  B~%<]\|Ϣ w^ k JA/ U3m/<2hFnƱ ;֣x7X @dV8.UASL'섕v?sWP{+_N(tb-3a*xh@xxdi 7\?^844]n(p,sߺYY( 7y`Yv+_y- XZۂVSzoe9aF)H~HZL~{ cV1+=0`(uV8>G6G'E+ vONigN]ή3̣HDSوF/ou^RO턧yyTtXت-8p}k2\4 Z; ͸&juSCErrЕk\5Z!9 ^X@ ,@ $>In\Fv͕ u?y~}1wbXkݧc-{yMw vzpSq0W9 # 3aܱn2`z;kOx \`<idXC8' B>ZIkOƞ ,{f 'l[=ipOzc_Y c2Ses;يjbc .rn"/&:,Z#6:0A)RLt cʧSGTVV&:2 /Uwq';39S>³UUŘBw tCӼ*ޣXx;m1sff4A_nB` `)p];gC+0ҧx +?O#<\aLU84Mm?dCWm< j{z#zFy042Xʝ} $W-@M 2 s$+sbh3bF 42-nFpF/!ʍLȈ4TՃBx-\˼Xy427ȌW#~<[VrVO} ݘӔܯ7 2XFmAr),I#I3uջMݤ2l[}LGiڦZ,uVzhiV>Fgn՜2cx6RO?A0gmDxw]7%[_}^7J/d l-&.{Wr o-lh`QoqV1fֱ)tC0T>]3cP5kL%R # 6&$$o@Jm1Ě&'y& R^mw:^uhBx,ݏ] r].KU#Fc ,Ri^ z) ܲ,9 5ut d$lfP"cǺhd(K#im/k.KFVvH]~2㲖66ȊW*D.utBu )/sF'EmRx-\|b:?ʿDb6x=0ژg>M5GhY~lu|,:-R*u.d7&W/HY$RycǪ#0@N@G.xd-׊(Je:D4V#QD2x*Xl@/3cږ4!6 ) J1fu&>dPc51o.1$ !_![LFa JMjMںϕUGoM*m_ϗ*7wU/!~ԉ3-r?YX"~^" 9FeԑlUi*$~{=uewIFOTgK5JYwXJ_RuJXC1 H_"/Hm~"X[4"%˶C ZWk\+{Z+-tm>9*_d+}B9g)m}_QC<NT>aIY֐J(je&9' ^~8a#<_Xqd>, h_fNX[->-0sfmbr;%B%@/rzQH/Hhl`[L,֘&1-)f3HkڶUwRYw/qWZڭzjJ& ;z7ս֦>PBb9"d7yDDxzND-ei5b>n+ gq7 XSexM-v,֬;Ãxz.^k~6UjQ/TڵZ3oKYԹ+ۮm7# 0*1tDh>uk%UoKdgMwџ?Bڑ|J|I `R J2H1X1Xh5c=5XqO}#_Y@^ ^Xƻxu* ^p\'q?_M t `"PK&&j:x1񍉣L@ud"c)boX]m&pݑɝbCSy?g_9O+$3axyŻSxkr'㝰yi[6w|;ޙǻwxH؈@jd\HKuZ wv''49Fvw4?p_qr)Sm +#9@HYwBWFKr™)mF4r9M#MX,lL6$ `3{!7q«OΜ\d mZݔ̻z(^"WE$}Ȣ%DĮ%hDv'&&-!`PYwQjp|T~rFʷfe%fCa69Wz %ŦuUI}Q[&TmqHq!|,DID?t3[T#)Ӈt͜2=4o*-}^8Vw OP w5j*TAenwVkE䟌(bx{L  (:#H @$4Z{@~ ( :-Hbs %8 d~4hx86hy!oImA Z[xdG^kaA zqz] =Ah 18@0 ?zuTwP0nmgKkzx;l;b90,cY=zЍ1B'H_`#=<<1s8hO7=%5S8qO_YH^u3sV.کdʲ\|S,x”HV:.1EӱoLu 4SI:): 3Ai[w/Dq';$4sЄo,gK>^t1 xk:,޽;\xloWʹyo67|> v!P1R]aƝɉ 35}Ȁ錽0/^6$d-F'{ dDǸ½9c 2RRp l-TW' 754ҥL#uw3}҅ qw]xjM#7p(JO0}&f!KStYDaF<զFc>R)z驅9`Ls-|8u‡ݖyX˻eh0#,8ju-f'}ȹ|3<_]J0Ju@ﷴq3H,٪,C#Yg 5e)鹡%/f_C#U|sp9EW?mik9C33ǒ%ΗAZZrD{vDRR^0ҘRHywS繗(m?3m($Q-6]r[v#smԴ]r76)6N]rcЃKnlIfaFi6>DFʢQ4,9;~M}yz1=sɍt+\rhksɍ> ܠY .Ѧi.AXGܠCIRlD0qQ{0 0ɍRC&Qn݀In&+KaאROa3jb⋑ߗ!ߏ1MF]q& #8zɍ(I}cMs6a||>DXm6A\6Oq'#>9'7xgY uG|G0o1>26.z2} !X]Pfs06uudK'g9'm漵sۖ[V;Gn4U 7*0Jiz+Mzj8<]Zy /^)t×xW hPEGKp`˛jUR@Hru(d jhkp̅]lse8   SJ׬&unSX6kp*cMiOvˍn˱~ۭ;֓vYk6!kJdۍFpKQ n[,pH EM6vxYj|^wDU kdgt0x1w1'K`o````ɑƣ|q   wx-|pbR05#@TI(&P7_@% p , T[2(nP_@^ N:6t1lBqU\haA Ys ׅY0 5aA_ cZowО& t2&Dh nI2h[T[w/qyH <{_OǟB_9P=[p=Ls<"0p r&Ls<`9n}8"iS w̱ȩ2LCj rf9)n}9a۶ Pj5_AgW|LIr{ξкK@Cvxzrkޟw  rv9=Svn9>6Go+,vzfMr+!W 0Ji˫t/&ޔNo8g%=ߌ\oKZ#='?o ++ Q^WF4rqa%q6 ƛH8D Skt81HG&X:*1Qӑ nLud$YIhZGd&:j38cDŽ bjxկA9FP]9`5wH ym6?7|zoa  XL |t(^lٜ>fk!z_rN?Qvam< l<ȩHol/ L •r!4)#+gXOWg6n<7)nr/J}QQτQ7 ¢*x%\ԋl= =N@o*.߽ $rPcդaA/ :+scei.d%$wZEkM7QRZkz4RS\+Nۣ*K#U1֪ HU)M=9tp0^U%ق,/j ھ^R U[6KZpT>F\bmMC#Yпn=94LT13 OeK GU>]ě.iT)z簹hyt,aaPUwQ7вZ7V1*;w cJ]w&A<3|RxNF9ajS'RbL}[cmڌ,Г/yd!]3L))eRwj8?BQ<A'}b=ϳ?TOӗk +0<Iyn]:i_sKz`A]w::xWQ%0%ӄɹ[2 9_paQ'S UZ-Lsw,/E~cx:RSub LWTi(zoy׻rڇ_mδmqE'G#YTGoo5o"C"mrs J'j@޷y(=okhӘ[gH_(P2_);(%ϸJ9WiUy OSB590uG]={Ë O$Dߌd'mmUBea]iGi)SGҒ'L/PmXj"G@ !P.Un@J X% b+X@0h L’uA܁@hG lY E K F4Q,\0%NtpXc CzovП؃0 tF'⯃+`t_q4:x <[V}Sw=U!XP ќk$fìL6wN3xb=nd3JhkY=7%Hv/0#?W`ư?duzu1|7qILNt> stream xM%9r-_Q˞Ť_`)J2yO=Ѹq->doʛHvU5ը7m{K6?|?~o?%o?Ѿ6[O??MRoc<<~չ~ﷷm%~﷟0?/o)= -Z~~_z~+ ~?mk}¿1ƶϟe,??O0Ͻ?yMowW?ohYm/[y۞joۿ@@ $o۟)mo{Y־# "#&AʄgH}-)o=HߨNWx<Ϸ}WoՄt?y(1c N|8x+w ~Gġ >x;?=‡q''[7uAVz_eOGo4o055)l^?s]*#ꊿ=q1#O׶FNH:ƭ(yӸß8բ ֲZoH+41`'H?L>ۤꐌw6ݾxWȎ1ç\40[8Kʬ(rQO&~փOm%21Jêʟ*)x;z6HS8"?伙Yc8[5#bq^xdY^ս˜dU]pnaǹ.yCnȐ- ,<0{d T/T Qʂ7=~L^QVP+bŒTV?SV#WB1'l0iqj0Ie vwä3 gR@&8va31S1x;dZ7>V2,cLL)3fL'֫;Aj&kue+!֥WBg,)00 <Q7~j6#Sm B@=b pÎg*4y*#.+N|3;61XiV˕O4Uw cH%U!YҪ2Y`Q/WOU%ܸQZ;O5Fl˚Zz pi#̵Lz[]gp 4vAy]>d8P }8Zpd:uo)~\MQIxm%GG(TKf}@e(GvP7P2kҋXˡ]-(-m;NįW<­qph\0u.2KXKέz/ ٫~A!p$ MAܞ-?au1< (+J9 XSj@D\DhӦLeV=ʾ(C,ϭ2>{(cy2ϞN{*y,2WW;AtkJ Ք硦!2dEA7w j T'tZ & EuK1*m:QѐJTFuTR#/cd{cÃOa?UzKSJS 9IIv0Px'6o9ՊmUuUKzX1$yi5xm&kͨcMy7Ï 2~|C!DczE!\ ^N! lTP?}Amp x@O 't5 vbŌPfHITAT<+ T, 76c(݌mAPĘa!8c&L p=0mbaS.Fvĕn3W%q[ }nB>TēK0W,'pRٴb:Fڃ#σOD0#k`z"S-r0YF;t #Tb^F@W #W[3YWhߥR{r9\ T*Tc;aE*?VTOȶcyUxG$EJSΨ_%c׹`iބTK.!n*NRbSY2%pr;ͪ#pΓ ރ']/#9Efe[-;WHUb`^w楯!pFA}_v???V,F?Ėtx2)`~ h CmW5 pJwcM= vD ,R\f*UVP#ZG9scC*0uEջ=u.WUiUЛaQqh=S E`dIJ&7A@ *Мb;2vN9QbyW8sOcsT8R,7i!2\;|+RX{7uY߬VHKŪF~iG)ްJ.*9Pq! +TdtB+ G$OA:VHT}uT R®>v_T^I-|Q❦NU_7]V-;cuxNmcM9rQ7׎5~? Ax` Z;k<؎PXQ h??~/y(LRX0+loۆ`aXpJޕѢ RҴ`8ByU()Pj&xgad6`_# #;5HJHJ( hpw{30F5%a0vA<=JE1eJGExp1Xፍ¯C, a{m\N7q߸Q'ėV ^AroS G Ϥ 0"*NKQ!FSnA,l:SAFD6eA**HET<-[| 0¦`ˆq.uX-;AB<̏S5H3r]H(Z`ꨮQܚ['0R9kԣR6e>MM|,0y߅F8o3Vl&#Hs= d>NL>iF#.(GľGC&z6J}gWºBZNz\rw72=)  PN!&'9Z1oaZ*o;u۬3,] }d r6Sgm@-lc&>uRp酥Hi\,,aO8o =NllP00l{6K6ai3h1Gۨ3ۨ ?b5qubbШҙ{b0m(g.Vw cH55 _VW 09׫ yY;;OQ&άl#qͬlFV>=zFj1m0603Vo=z&! xmӡe/W@f^ijA[S(M 86^Udkm)p #8U jfm:)3Wgh`x59NqY3HiMB5Qdv[)r- bVRӉA==s;r.Rڠ2¨UH.T :1)S񋫝q\U䪩@%VMZe&*n3"x@{.+;/@{Oӎ_Z桇2nF~ +ڳEZ7h@=lv#n~ =ӻG~7)7!`]Ņ( w/ 7q4/x \J|ٔ a 5RhV Q6%ڬk3k;Ö!F[lf$eՖFf[VmՕr LU1*)#ҟ{k* <\%ݴ>[M4d` `h I*a*1ЎIL.5d!+] }4k۫T_ \T.ASSXC`>͜bW55^،2.:j3Xݸͻ{wR}DJ&F5uGp1fPzIa5`x$_o&RP k[o+kvZ&m8Rr x&֢m@~EV`WBMFɼmlmH my'޶f涁5hnI>fn#l÷>=twzA| ,so hgXV> b|@]lNx]AxՆ)]#k>E1W[wW[_i>܍gDMmxk6<NU1O[y;{z{z:| tp5TS} ~N3SK(aQ!_rQqg|6K[Y:_}~^62uts<l=֦߉5ollQC~Q:ON-?xwL ]WC0<웡mK*QkP * _\U\}<ۢж͚ԆH#F}'fAmXy›yetuHSkcف0ːS^Kww"9)^EZqQPu/P}ʫo+FL6gN+}8J!VI #SS"b_@Hevrar+RuZg(.q) 1 W"Fe+eĄoκ Z+o|e00ȍfd @XW+itz41[\I!OK {]:Mſ$1éaŗQ " :#$:KȊoiSJ)r/HC\m"{H{DxS|JVv #O29\Mw WcHU{T j/߫_WQc>pԠ6_s>`x V 5T<ݻF'[HM`xTM1ƙE\_1Nͤ#|y*N˩٧b]YTi{yj,0'jYaF,<~Z/,-<[}|\--wxR!LuD0?C)PⴥgԦ$g;*1C2_Y؁,=yd~YfL:Cʐ iU\ n <p>SSbt GyIڂqڈ CWXPi %CJZ@&CAm`/("ᡜv>0S{lSS-® ,C(YvQwH ߮^}gU6~|]JE1 F/*7 1E#NaCNgѻ-ovrO5i@ԧ!{YǑLgH_;~+bo#': n$PoAKOq#HyS Rg_}.RT^w#-701RRLygBc-Sl6[Hp ZVZdәbrzj[-h;dz-&:o (|h`$F&C(QpmL4ca$M GjXWEc*^S'ՕG;<} u߯GyO|9휇?M4É5I|+Ú\X+lBc l6+5fױ,=H1K`!{]m~`$Ngu\""O!x8$hЧ!B6̙Pa^WCiaO!=͔^TT ڳUijh=:QKU,˪JIvղ*(@5>t竽}TtԠ# }E%J1"b:QӡHT-uDC.U]2{#(:SAuOnՂJ(;١cx$Ã.o-ia0B- #7"#3 F`6;nm&$cMQ;7HOB = / raF yC70s٪7AH㻰7xo#G)6(%z˧_f @^ $#|0(=%hyɡ"}Y]6L=4ͷw˵K~M |BF#MgnKMϾ#RŸ )8KoM9Fc#W mJ1n*Kxv/k ˼lCSiӷ|I;|Q lUXHʝ pS'%jHiNNh`[(|nycv#G(*2#B9ˍ? #YnƓ])ԝ?=^^_ W|D7:L evBz _;WH~ q%~{q:x \X T.9p m1P, f,<)SRӆ~qjQ/G}"tCioTkEh鈇@2aĜ'mEY(^"A/ ָ{]eD7ceO{^Y$\ |B@}} L?qK3b:97*0IVcFR;mj'))aDB† 5!U s-Kqc3<_A@䅞7$x­u|<>bizt,^Mndl0֛ EwEҚn"kl+=gl+LC{_΅H;I- 8J0reF:sTӣ2w0z| w:' @?HhxMmhxm X4 Gڀ@ɬ1dA5m Ip 4a5'#ۊ`D1`7SJ xFJ#lrA% _e8 e-z߉B`"񰦴S/gXmI]`uv6B%GlH'nw3RH6AA\ b&w^/&>0.廇$iЪ!Bz6LP>Y&8dŞ6VS^XE 뿈"`j hD4XD O=":0b4@'X 6 0i?*!\ axNޏLua$~zMqx;*&б%4b fBs,@&ͱ>;֫yYo^!vKtGB)bDz>ES`z_tX*x_Im+y$)WZF$a|*8W50B1]YPFLFL G@V5 g +XMVV Ee [!ZWХT, =ePNU ʠ46hSEFpղl7eF ϞвL:҂Ggp1l[aY.Kq=-,/|`\./>s)vS!7[ an])O7v@ S"کIFqHYkSvmHyv rp@#3ɟ4|Cc$ ,muGB6LL}gbB̉́'US$8 輕CDMԠ7ʩ8/UN4_۬YSc, ƶ0mb66w#:&RRpMLmɪmc&:Rkq&m-~^X\Uߊ Ņ^t<rbyH@魁hno9mCJ*mCҊ>mhmu fmg m&6iچm0kۀS-kqx?EAfEp"(;1g-F4,V63 -ېF3Fj|c3Q{4 ~6T&&!5 mwжYso=h"f. aJ]&E.ח,6ҥcgԸ<*'()X+(,Ԃ+h. ./Ywa`PUǁ]uWcHN Xi ^kFz8jv덴#xpH&Hb <#!/Is p;kqF=1q=}=G\\x`&5N&d=J3ԯM> {(liDg՞g{*YgPZ(^bdݽu]])p2H]gV?_Ut#MCJ%*inQӡ*~T=5A(`eNHL\Gk~˺x%Q(v8B* ++ !mZRux*k㭯Zh=Vj.[:މǻuwhC m=Ā;_Mۤh|xc(Hul9:ܼE\OEU\'$y&^ov·׉F-pV`Ww܅cCŌ=q/UH ׋*  7`^P,ǘW9ҧ.O9Ϧ79^(3sρxHyսC$(h{ %J%ADktt*!,&>9p ă7qkGdAs݇ᬖgk0(8^kOZw$/F U0!"8D_p\PВMpֶ6) ?9 -r6ֺ:eӮ(؍͆Uֱ)F#물׺:[@fZsΌ`tT+q?):䖈WQ8 J'2.d9,^-j̍µi1fΨ`@KJY$ΒIl dd%k<$SR.\;WK+0RZ'+p:QshsP* Dʣ'i|)`$(X *ƅR=AKlVOAt[aA_sn9ja\ cA_d#VjV1^۬`84X\o 6imUF`9XnvWt#x0HiEH"n 8?p7r X7&Z#$o=viNZcp$[IJIaF**Y{c^Y$ݟl $C>#s=rz[1(DN>֊_2:\%wx`l%8 0bEz ZkC*x=| S *h#'pvƎ`|FV-:\jYeI~+H%@ wq7H dxp\hGҎ# QWoiI@p[!"F6zٶRYtM;7}MU(s\;1ʼ]IAqxWERq.SUFNs$8"AUn^S84REJo}K4 0L HO;mTŇ|?6NhP &{Gh̻Β> Pp|DtLyNJ}OL\A\"^6y#db:bkn\QIOL$6:a'l}k)ɜLhxfSH%NZƉ?+qjL!C᫒d"5A=KV|ظsApg;1jJ{]U6zZ\1.Vho?TQ(@zv3_ҹ5fuJ bTG(Q)3XBAnxvLTwV*d)eVDut]oTKuGp1TMٺ~AZ_vZ8ׁ_cH338!cY+ޜV%6f*orQE c|7أDZC]7;L++=c^΅#ԔGPTw׃uUeW*-j9\V:)~9,&3 61ɈR0oJi8ϯ*3&I<*L ;7Ъˁ@<. bFբ\iYn}ޔU_Ybe=m\SBQIkY%=W3K+atz K롰NNjdz#ho[|W@*TKt$z U$jEM5~:QᑪTfuRC1k (`G* h0Mַ_{[PUwjeNV.%;bx׬k}㽷t?Wj6_@N_p]*;yp-9iױZ*PlZ \ `%_?V"nMo?D.׸] d)J#$n(1 #- 7z7#((N pb<2twa\34OGgFa$0^;n}m8 Z=BȬ.MΓ`ԏk b=w)ܿ''n zM5*Ep:'eTS Õ҆ʃw fdMa8 *AfTJ hjF̌yfP;adcך*$eLa QB%gMyL'ݚ8 p@oMUQ?r?[LA#IAJd\$7i|G$^eYWKF`ɈG*>eJ hY.bɈ(ĵ@bƞ \;jzqk/A#6q&3"YBMQE{UV;ZU||9 t܆@bmMxn{>kԱljE=R{|rOe~VaEoq8Е5x"km̠M}@{'h<5؃DyexmͱOxomJRܙSdp85 5up9\UVM븉MOЏ{ρx`)j5bnNq6sot2ʖEF:[1hܵۖƁ[Ona̕Ca ou&ῼ;W bF{ρxҮ<0% 3L4(bS6 ҘiRCF*v2U*T5fr8|bc0iņZcժ`VK5Suf|f1F{fX[m>ͫ͹y7ˏf 2CFYzcuq!MVM_V< .|Nps)'J=TJZ4o+%듢OR>+C9,2͞jJF{:*a)ߞJfx)j݋KW7`Mf>VUyWwQmW!Ti4Z#+FuOG=":0RDu4q?[\Av J+/=ý&w[Suxoq]cSV5j~[}8ޒWvxk YE8.+aƋFhd-؉D,\- I\[-@ HJ-HJ?$¦u 4v[.xJfy ݶpCxPwDOЊYQ yF!|"axfoo-P'L=7 .WV"7M*|@g$XT6,H%]ułwLX67 8:HL3]u7!FX+ei-*ŵl#0»L-FmF`N eup1\S|%K`;+k |`\_A߭z <$j\꽚[&aG 00y#S"ةFujZ]čS@G ;0PYWOOkrp@4Csnt8&QRSRRUmX+9X)RU\*1NQ &#Z0)U4ۄC6 pM<~F;tyICy#x&^mbyx[FN]_(^"d ²BަHY\.=վmTU(A%mě 6pmoz\oxMz m6pFhzxc錦7"~ihz @J.TwW#H4 ɷlAd egr#1㯉 |>bDoSmwݠ薷L[l3^ɴxCPa7)6Sb7-o8 G03 E?#u .*ms/)Pĺ<3^XݪE;G1-cY5jНՉqFW'Y_^'5<,1~YhM5g5֔u[qM}'͵:\PYw/P[NkmHSbm%g;Un:..*6p5Q 1\T⺥@6͸%RE jrUILUxrB8\_0肱`3RuZ,R@O7hmb}cvnўM8vQG[s7h,)0or n?$0Rd8y^@V<5.WM|`"xS4J8UЮpcfmRy3~(`-GJ<2riGc-gٶ6r_ ,Zw/D[a2vsp&%OpYϖvt7uP!LcTa*S* ixO<,2ԠIL~5f4q?UAăl($@/hx/;G@ͧb]ZY55戱\34Fj3Xmc |7+f2-EJ(mGJ8LKXieVlV`#;5?w- +W;Qc #4q9 787 tyF ov' NOM DCFXhY}oxJtNxp'1lӕyp9TNes"w4}~>~`&\NfN ~>_,rnx|^AvɉUHs;:@Мp}n|Q9 Go8px~l>8<o1\y'zCzlQk#A*>_lVB|./,(܃??p^(INBvs*Lp|3u2Lp=Wp{PvɩCNp}9)WI_S'zXu'QF08>v$ܛB=\ T YWDؓwp;}]=upA)|{ C4|8f̈RdJ<8>ܦO ! ,ڷ],ri&GSj26rZ6̙O;Kz|X(^"Վu#6R>1^hV [=Ⴙ@6 f5! *b@Sb>`NyD pp342W,ʀr88/OuSw cHEM{ IЯB~}O|][L_~ >lݴ/ʼn!w =98UL{UHZ\L8`Xwҙڑ>"+Bxv`μϸ͔?"tT(RMUhK Erë DGXVLNΌs!PƱj0p;U3tΚS:N ;u bКgNRk.:dΙkiRs8^㡰:q__XOMt\̂B.@ J".h*XqS y\oJ*|rʞG;{)5rmMX%=W3v)%_VSJ?^hxGK{gK*DBt " U!R8EL2x:QU1*TZul/h r ?_U~$\_廇;Oxw`]X`V7ꤱ~Z6rǻr1x㮞oZ#0'ѥRx!jPzKNG?lc6LCFZ#'MC)Y;nJx݊/#Qz]` rE:_W"du%$^SQasJW yEZsj*ޜ?; z㋔AN33?Y{k^X׊5Hu<2h$XT6H'өL*-0Li0D1/+~ݐ'v Z+ R OnQ1A{[a-*BFm+e neFWZ*tcz|/]%UX{5@ AV'|"!WJ ^-V+VM204>JG l?|*?-;|z`DnVOc:6U[գ!x6$Q=F0ScͿ. Q¥Xr./,,1<>֐-q:ET7$qvl>p~2H>Ϧ51ZbnPc)!˱ @z}( @c0W r+!: r#$P#~Wp-8NqxX)4nMQ6qFlodɖFF9[-mh̵ۖƀkInaZ̅x%2*}e=5 ^#(f~wt7)Le4aJS+ i`TO;&RPɫT53q ex;+_׹Y:r#( XiKͿby\55擱&ټ4G:mX7ncM7"b\F6iD+uG!<0fa2flazf/pyu:Dzڌ C)jPaF &nYay} QؓHeO4%=|UsZ n{%?HqťK)eޏF9@<\]>[U4p b(DIG**_:D'uܤ:c+Z|kLϴTw c^"Kݓ?WݦzO!U7aV}.dX s㝸r[Wwj_-@ KȸR!aƃ ɹ !`oado`>zr_U"['˺o}<SWhswE' 0R1#YohxVHJuOD;+O,rBw6'{^_?p_p N] L/`dF ݐevO_W_CCjmiϝ tfQE*l淪Ec/=Ǟ W+U?~C  0O($d2o#(8Sg1NKB6Fp렧WDJMPTj i*H*(\KuDuGB*E!B DF$RN.-m7PWw׃e@\Ī눋 OKZU{8DGO%f=Jk3gͮĚ$[lid֚k[m9mqV\;Q<VXg 빣pJ5ɀB6/J)tRƖ%*{")칦2؞r{^+dgV;xٽg]ǘˤF :\_"nU]TA_U8tafFiHDeL+*u:Q50襎TRu$+erMVwWCx .:Vj~ES*ޜX5x<㽲lV\<޸Ǜ{Yo!Zd<}t0^ <:^SsiH t%FFVpKE#d_`xX))pu&{sadNu| v50BS0Ry0y2)K]pW>Ȇ) tc^R4TSSY(;HW̨<ă홓;r_[Rps3bmo\Sʺ_:EN%Â,2a"$#d 6 Q0a !.rm #Eq"B2Ta&*O9EYݖ Ճ #lx0Gx!\Svҳ|O߷.Wl蹹1xIFm.ex}HSLيt'Ib 4j{Lt̽#zu  l3М;WK9CRL+aڰbr0=у k i'3>.Ľȍ@晩p"q: />>Ge8Z :19,딱ʚ%Nr_)ϬSw/D@[a2p}“Vct,{ٚg邶vhE&A0RA)SL4,cL jɴWV2 ɼh(^A!Vh }ˮ *>:?zPX6kece%6Cfڌ9|wsX o k'T{.pR gKҥx)?qgzga~(+>!iWF'b: TkMq8píq/8p ~`| w0g~v3!P/n<Ylpf8|Z1hBh R5w{]$O߱V~_%%|YWw&.g8$`#s!JW;OQGoq}n|:n$~9u{Fs87ϭs]w`޸ad޸2pap(G XzT⃑'aa YN~a\X}JXX@VZzM4f.0_\WpA/Lpf(IW[pz[2xIԌ or%e!C%n11^dkt%@RyzWTBg$jW,S 8Rx^log=\ #m%ڌ`p5!]JZmS h+v*zH ~w8F j,PXeA[?DuRZ{ yүƒHO'S]igkCԑbwCܠi@{m|孵zbZm|9x!o-;y{q0y?8Bǡ)ŀPJaaF+DbtKqHUFv!<ƸZ(qN:NyTњ_NYk :iԷΠkIfs8^㡞z:1__OOM/=×quwPk \TXZ"3UQ9&*rmUɯ \U*2Wzƕ0P)|XQFzGYA:s?tvpѮ]0ٺSF_wh͔vwo6Ѧ-BHn$q}=v''Nv' w<ݳ?"8LFa&RBgTI_u%-1;Q~K9hA"=IDs],Kw cx`ѽEY)5^H_{wh Ph@D*6P=ajUT44ʧUGIUVW*:S3 t^w* '\I/= &L N5xS^o\⽭:bU׌ꬱ6Z7h;{q5xn&dmy8. Q"uY Bi݁H.<Wl'Φ/,/S8WK-ٍ@hIzijogpAKg71J$򧗲%Rd˃|h91kj4πPYw cE[,*F*g~բۻ]q[+w$˖l @?,R,ʞ؍^yd̽m%IRˠ܏Ax`$pkughgk#Db #MIȒ%ԙJX;IGBi"v ݯlGw/qG=Fzr/tA-hŮmؽc»Dx +}I8 @<ۤʻ# Kx>c3{w}n <[H <~#,$A!f,ӭ(Dݭl-hcw5A݂m:Ai!݇t AKtJwp9 Ggl6W?2_Z@)Yu‚6a^wz&L <W$y"Y]dj h9/ڃ22kej#[]ж2LJz.)Ֆ.ԃz.3˲ٿ%i6ZFLa?'/,ZER/bjɋ U$W+#ˤBH^$4aIWNF7ە_e+㭞IU#R~ VVNIRmWN+YH"%_W1%-FzȷNҲn4IX'MEQ[})%"x}zY%rl9^$հihdetvDjxVs%\Ёf5Fj#KVXw/QKk#T7yW@~_]2#<-/U <[a We TL`fX8% !q0knk)75CUa.ji0qK־H؊sl*oǁW6;W¨e5t`ej`ڬcx:ZQso#T!| /y-lEťfDMÀCdY<Lu(#Ҋ +\Q7DU84M`3VБ@H1^d3l(`$QX:.̀ uuRJմ 93nu+s?1F\vë|:4dB,g*Uc2aO8`E]ff g n< n` & nL؝2A!㆔r:w! ]BT NKtGB$@$@o}}ȪQpinK?T2 V_IOgd`mPt@gхT*#Kc:O6ÿMa7_iZȪg+!HU\E9-ZFgu-#6eo(fpi͘q ,kv+lDG35myf=zhF9ŶiQ)垁+5uG\KcXKm `'xZqx`*%cNqȇF\aA3L)m 3S#--KIʚkN^:ԭ9 uea]& _@VS+}<[W4mҲqk] qsOvug!Bj!DpBd'n8n1ptM.z3L;`tZSΈ#0d%]^Uw OPk*-:@_y[MI5O}OgkvJ='1j;J7&74t=C6cN2XQ=HWAΡGu>?Y6) ZF4 QBYaF,ܼG"%k}JlxTU8} C\XPv1Szo̚k1s]Zf~P~f>$yHJL)O=e=+udR=(տ[/Ԣ#)pGg>{3<I~%A{*{ɰ7J){DM:b؋\3|d6uLwdc?Re|V0<~BJ i,1АfㄙNrjuȻqjN;Ad@keڏ(%С٧ :cs wB-P* ϭkJO[01J#V.F<]p('Uۘ5Wvcf]w8EH"#\\t:Ei#]ex%;Y=*eUVXxdºV락{/6}0b`3^d`oVNf`oz}рD: Իz5whyNu|w=7f%T8*Hy䳛S%8{\&{e:Wv3MinHi!'qr{HiD@#eRE1<ýE2[>&SG錣pƓp(B+DvaW S)Xp%/ԥ#:Op@ *:RҠ S-} ϣ,#L22]O܏w͹@IP# ڵmdjr;>lTNTȋ7“fmWǷH}ш^ ,x.S1GݼJݻ箷,rHwmE\oxsYۖMF6mC6U [ےv}Ǻy1627Y7K~lq:Vu+x45vo ;w7ݩ m4@f~ke5zao s޷6'޷&\Ah2~}k%i zZVqu| ZG ~d?3}gkjnpYÀûm]n5@:>h|kߚ#u5h|kMG[7֦b0aDӌƷۨ](;Wh&0ɺv. l]-Ӭ-dYk߫Ax `RerRrR&SJ gQ=BL M۳5to=C>`BQ1<}AQ:ﯨ&³5N,# CG^tHGѥt$V`&xg(7EաUg~E !Ztyƅ^uLw(0Ȏ}&ӕ'sg!NBD5l.Nf 72NR9l7έÚ;;<>l@Oŀ0`f# 0$0%^tY(dpK"G#uI܃)_wS$2zZVH5xZ8ZG'DSjlж)RͣcIaF-JH{VٽP}v ~} r+};lz1 Ah,iP@^^芃ȪnDW ?UBڟjS7ɹ+׾n)w{kz'nNOJQ1<C5P YjWRdo|gK*EcV~s0f 8-q ȘĭV$UF?*X}mN;nMyV ['l{x;; H=E2ukd$7OC܅x>VTǧe_#7>VLGTxTdǑa[uPiBD8YޅIvR1u y7{$=<"{&-xjmLȺUs2i+Y]ujKkZpzkA&1cSHK`! ;ͽ.>pPq\. +Z{ȉ5!sw ^Xh+ ;AЃ74D`T%vW:#,`U&A*(^U1vUP g³55ݮa]c m)ۜ֩{HS봚ӍTG['R:MZgfzV]}CX }޺$~0/ԓYG)`Tg0bOy)ZY3y-RFqN~j+<[YzbkվWE& %EY6u[N]N_N,5bN>udOК=Yjgb(ڞz{F0YW7k.Ay/4zj+<[S0iVlA} Z #ZCX%Zf-'Z)ZM,ZҢ@v;ÁNVx%>UGа8U ۋٰ8 8s8;8[nr9 |E.{DY$N>p/;g¸-v⩭la5UYEGC:CȻPsҕܘ4W{cb]w8ąH"#\d\nV# IB+³!IQP.\b(<[QuGbK>`l+ hۉz1$x276x37Hy57Z\y/6kyOnuJws;v_ig !p'JPPwMuGKPYwƘ`5i!vxi!ç* C h*p0]*;gC7,Qpҧ w,{-<.B{Xp׿iJ6ɣ?kZPhPendstream endobj 390 0 obj << /Filter /FlateDecode /Length 3424 >> stream x{E?b鮾{DQ E$b`Wք߰&ZviQ{3*.FwaXv75{,J]+l{8|WuZWGo]qyqze_ߝޟ>ܮ(C&2Mbuvn+v;=7s[׷<{wHX&)`'dHx㎼Ԕ>E߇7/ood|pLmp{ k'2Ų8){l:hCf:=]ABT[]]N<6>dc?&\c~C#<<`pS)bGXqHZ+,X,!;w{B.8-)u5&KÊسx,[0bjJr[Q6yƫ'(|K\``Z\&ku[ n 3%X>\SW:DƌO-9yjL8EY7%'KWmJ4OƉUn6 Jb^4"YlLwydhK꒫Z|׊ydbra5N:\yu < ~\X@]Xp\}MkUUQ4GJ4 't\d1{4Sn+`mgG[= mH/l(Y^񋖒ʖU[zsC׭.,tCk^otҀ FBoSV c;Ztіy5Ǖi},nW8sz͛m0+p{'},_?T4oUqq&_-7;/-l&4G޴0 EpEU,Y^ 'K"ܟh5 _㪣A%shyK-3$TwyJU%i `AAM& G^P x;_lk?y9vڴ8.MЋ8nt8P{N@SIƗUEO89g0:($<_Q1 gEXƷfI yziNC8~MS4OxIgpD[_W?&ɯd#وi %Y"ecNSjarܫ`RDazi3N~k*"2mc rMNi b Fq&[*YRF =*"'(R/6vʆ%~ kHLO zfUqGАl*XN`А)BI vm <v-G`[ ,1LkBw(`TИ)LjGaLz<yoTИYQb h0*HLǤGnXq |tJ䶨`uLWLl0|wTZD}+:s *Ё5v;N1:2D?% $rӸ̫{*"ctqb s~_Sd a|*c@S$ 9zȝ0HJd~fipʌAТΉNk*CȤE`2:Ę`R΀'ihQU0E ihQuce7T8ȤE}pA"`zIMNިjZקH-TSDg*"u¢@ ` HUd1Jx1%p|g} sc b[*'|[s-d5sPBg9BNz<6K N] r1e~r$+N^ rpfQC׍ G@opʔg&VwU8E΢(a pwg{KJ`(:j{U8EhQuhxFS$ٞ`<`B6FoU0E~hc ECh5(evjQ4. pمCSd>PsN/T FBk#H\:*Dl`) UC8NU8ErjP4c) œ[:1ƾ‰ B]C:'%zTt[S$2ȅݤ;*ⵅDcy|oMKނ btE/'gg䨐=N^}πg_*"@G"oPy  :л5>-]M>}g0WT`2yt )YT@a MIx7wYxLJ]; /;Lxqh5qռeZ[``m CpVg]ai}. 0WLj {;gѯ$ji=1{ Wɮ[MUMH~jjeZ&8 ~*飉Ȕʦ"\^.aK_xaa%e%e%wIvI_]RjR~ PVya> stream xMk0b ò&+KPMhiC+y7cU7C3#^H5 ҳ}uճ`M첺cmp Q4k/Pdj@3BXU P6x )+k@t[fx||&Q;~c1XM eu HaW~KNP,AcoIg}TTP'j. !*4 ;vr08'B= D++Ѻ׶)TZUc[Uc˰(8s1n\{?D&kF/UXˬDtKs"Pj ^Fx]襶:fpk"(+{ĸM6XAj"YHK> stream x[YoF~ׯ ͠ )½lP`KJKn-8%%qg(~Ⓔ4s]~4% a퇓55a\>Xƻf23"ϳem>UvPF |KڑZfXV!,OǶL{[cz \+\tRwvi{4+#W${,GJ k's>5)0"+nJrc~\k~2m[Qui 21 ) zi*Cu gs (d_K5^A7 P ~0G?QVP_AcY UP

\\ㅂ 0Mm} ȹS 6a,M±C+ c{lvb?) 9.ھ cc\lUX $;9QWK*Xx>ԙEJ`Ec2KhjGRgQ,v0[[<-ET5I!s)ے "]DM@/ҮuF-; CKlxg\ 3t]se(bNNɨCi ="A`{̤C&hL|q_|*1m(-2t$`lH%k)4iTz BKXLx@ $MA7F0TT<+J`aqBr.i$[Ĥ! "rDE>ΥOC&BBE"&#BAk0 zWߡur.45F yI,؀Q䞝.7,GA]?OڨGPS8@D K JuK!/ȗ/RZal("S ZaٮȺ|b-`6r`.fߢ#qRpReTV@E˻si;/|M-YzX~%vI0IդT^(w}ie:Ҭ&6g8av\MO񭂎4yeo;,0Sj8P;`.-&χ\sҽdX7s͟ K 5dLuGteB{}E!ۨ#lj@&Tg]OW:P9#dxmo%_P{ޥ*ꧡ9ifһf^|7:XGB/[a '\̊՛7kƿ6{endstream endobj 393 0 obj << /Filter /FlateDecode /Length 31 >> stream x+T03T0A(˥di^b2Wendstream endobj 394 0 obj << /Filter /FlateDecode /Length 5334 >> stream x\[o\Gr~g#HfINn' {W,8"%6ɡEʖSU}3}HJd3}^͟V*/_@|ϏV0n7Aq۠VxxtqZmmu\]7Ќ9zmaj1C8nVNz="4 S[dF78])Lpr]Nyl\Mk1emƭQ-@ǜQk7@mVuX]@7`)AC2N= Q05L]t:ni ns >_Q* ĻD8_瞂:WXvw.9!)La L Vix::A{ <#P);}S]~}FmXD )SL7zFa͎ȡ$>Yoa9FeF b5ƳtX@FG) !n4/c}{A̎5rx/g=q <@2}{1u =,~H)O$$j"j˺b78mxj"U-IqI8ݪaH@]~D\]WS[Smz^[׵_8)L- !}{p 3Y#Q#QrQ-īЫ,u6t=f AaVXC26W_8t 0. OgT0[Iv Q^ ԯ}Ơ4¯K$;܂B7~7ZIZUnצ p0J\ЁV(4m*t&G8{#t: ,3 I"LVeVoZaP -{M@5e OI*FZI:DC`Op X .oE*vi(4]?QaicNЁVQ+kKBAT.ȹ v髂}4ƯaXqpI0sW{d'"ۙv4>&A4ILɎ@68:<5*0 3~fDzC[s6r<2KF=2ZF70GizUhkP] ^zt+ 듔Lf6$Կd][/v M'aF=T dMV 'DXϳe}ח X ܟ{bƛh?#۬dCƀ5uuI}Fv(dlnl%l;snO7EIN<Md*rtL3τ3p*IQ7ɧ/@|+xąCΞ;:;DCxU_ Ŵ`)态 dV[WKbCkm@` x:j&,Ws埥bCsF}aUd o.  H},X0,߯|QK&.WWakK y pqI'q",yf}M`gHh,ڜtl3 )KVcBcО 6\4XRa*;h% N`rn\gem=ǵ2T~N(b$;0y^лŬݺBV0lvgVA3T7‚wD?eF$7{LM\?Jy!cW\SB*M oҾZRx婐ȭ%b757mc+nh ,hÍ|tSÁ(Ω"(٪EF6=ph:d!,aIo+>rDO.2ctڀSW$s؆`8Lb{23 f!x߶Ry'F˹D&Ǣݓ]/"=a,"e'ӑ%.E<^VJl)y"]4m@vo=x@67Vq8G\OD*Iy$]kuJLj!xҙ噤`=kNRطDfr=!݋n3X*c>T<~t iKr:eR ѼeC4QbMAeC"x/țWh}^8.~',I,JJ$ZG#hnƤ 7uZa*967KİGpbpڤN,6dB3hW: /K,'Iy7Q׌Ҡqlvn>_n'°M+=!T^%θ"C #H36S7/¸,7AQ4يcL$T/rBNlem&eٗi+*aQ]\֘pĒGl(%z:0₌m!Ww@C~ &uD@:u MS,@+ eɣhq#A9 4\}sZ7j묶N%@QW|,-Ro{׋ixU[NBl'e!)NV:悌սWP HL]Uhc!55^y)KVhp:ZAƕlwFb@D2nhx™Ǩ 3:MIK_GJ=FoC:&b!noĝbX=q+~[L}h0#nYL85P៤>&<^}Z6Y]jiMƥJM)GNqjL0Tsv( tAyJ9wR Ge&I+ sD蝎 l\Ж\Lj3G22T%.40]1Sw7h#Ad|hn SF[nUbkypyGa~ƦSol3,޸_i^0e*Ø癑14,Gi>%ڪ>1J=F<7r O0_& gaIfR|ԎՇ4Fo{kwi PXrv׃Trn#LHIAkHP=ÂmiRm8_Sg,-$fetX)N5 WHTEO)P & Q"`gR`5V/R mud mYR#ad_3QT'稊mULTsfaߩWƟ/c^#K6.u"#Ѥ ;G%VT{Ju]pX?A+2j1 Vbv@ 8Cs[,'QS˽͵-ziiyLfD(Th&]9)b(ߏԉԝ\qP"QT_n0/]w~!GUzBO()vskiR#!F`8|A*ژK4ʅGEZ!妪Ho_#^IZ{"".qھH)~YmYmfN W_Z?\u|\3y3Jy?{O:?.~mkvk<}lr1A:CX̦n|zǶh?{Ꮼ0h՟M&7s|,u2IejKuZCGVd]m C׏?H*o xyaOܕe,NDKCع O;˵K?z>xvow& n+o@U*PY[;ӑ[GY~`ZlOkCi ܁R;JQzo4 =աY~!=m諃nvțηǃXy4kڧsendstream endobj 395 0 obj << /Filter /FlateDecode /Length 31 >> stream x+T03T0A(˥di^b2Wendstream endobj 396 0 obj << /Filter /FlateDecode /Length 31 >> stream x+T03T0A(˥di^b2Wendstream endobj 397 0 obj << /Filter /FlateDecode /Length 16209 >> stream x[&Gr+kCӪʣX A%at1K)J=3Rq7r%5l ^𛷟:eEF"x:O/G~w_q>QS}/L/~y걧~t{GUn)$H>Qnx*cސZj}k Nc"}ܾ%ۏW?q\5Vq=iЩɩѦ|4htS>鿦07 \cu9Ǩg9xOEni|{-[O/GwgK8oS>.x3+~#H:j7~x>Ǩm>>G߹u'kķo`nwE~!יqXS\cWwj骇_>9͝{` lOh'ůz*n|M/׹@㱔Re-Jx?ѐ컟~3SKT\/jY :59wݎV~Cg'_PcDgR5?֕jz_RװTR%P: *WTD}駂)J4^-RPO-P#>)jxFJ@Q7G^SfO)! RI=ÆW4%P_O ޔ@eꤔp.UUhLw`ٛhJzO=P WE)\QUACRE W'S(Uʙ:r2%PTx\ U/1E4ZTA+)jRj "e RZ|FSTK\ TgTE#5 gL T#R uQ=R<-Rj%?}]AFױJӱQ Evk+H:v|nו@խo RlՕ@V]A$ڗ+*u)]~+*W4ו@I)٪+Hk Evla{Qq[W*imht+u)Sp%PeG8 P$ڗ+[p)]J֏v R4ht+[ONbp%Pm Ec}] Tj+H:WU R.u:R)SUbXJFKA$R)S";2%P})H躤@kR";$L Tw)H:Eʔ@X;I)@4w)H鈔)*ht]#eJ5 eAQaRB:W5 R4Õ@V]AFWL Tj+HXj[^ Rc[^ P$ڗ+HJV;\AFV] Tl8'RDhtDʔ@؏^J5 նj[ \ R2HZƵ!W8gԹ.%PjRJjRUjRjR=.=.%PeC UֺAIJ7%PjRjR.))SǶmq)Im-b+TVm5p)Hm5p)[p,=.=.%Pebd0 5V;\pD( W8HWuo Ry{\Ju Uǥn{W";,|Q1\()*[pBWU6[uzl0KAmq)Ho8"+j[pBW6[u6O RWl=^osK 6htR5%PeUWj4ו@Е@튮 eJV]A*osK 6htbN٪+HD[u)]G R4FڮhJSp)hn=.%PR-!3cNulrޯ?ɇ!mlʖ@% UvTTa-f)H:ڪ+jԠu/WU7 R4}W,)X;\A*sjˇY RI(/W,)=+HqD{SjR[+Hm5p)jq>z)ZwFxJ8ǷNjL "/66ʱ_|2$)jr g!W ×sL6R/{ rD;PEE^B(^^GH^^K3sHBR/@}z׃36nΰs 廉ی3 j{8Ι2O]4xxs<[:™W _1k$<3Sig,Y5VyJ#FO~Hv/:#wRʷ߭VY8IY"ۏ%۔<Nz^h/O^,&&_8y|`<_ß>#:2XcR?cKΆj*u0j|xGJ gǐ{UR)LrzB9[S=BN:3;P2%~Isҟy.z$~ds;Ii,j3<?Į)5Q Kfȳ( =W8~2mwϧ xOQ1<=qv(A#!r]S}gj'QdOd1tE )hZEfJin_4S= p[4.a4]M{81Mߖfe<{&xQD+k.K5itϞ]fDK^$z S]ѵ5w *]8tQfZ4)fܶ *3ݹpYͤ$v?Ϟ\4=e5=,xI;*5ŸK҉ ɫaR @|gO NAʦٿ)/kV/A3x `HlBX=fҫ^= '$4][8TQde5 t/GaZf\FE2Z)f.ڳgX,H*1,+ptK$ʒM gT-ay$apKQjϴgOۑOz'xRbYI^Y {̢gO$DCѧ"IԠ%8Ђ Yj5zvFb_'HPbisG }ekdk,dqkDg1tf5ww/_><۾Ft^(]j>{|:u9Ptv's '_t _]g h!4(z- v^uezuQpay^:$5β0p%[uA]]xfyVP^c.|U..]GO OE"GIpf:75p0ezE*$AgIhXqa"dA-+UES6.$ Jt/)f[>kE..D= %a2c=ȶj9ŷ[,1gyi,Yb uեX<ghah`+*Z ? X-\v@omNzX)YL  洚µ|'֢#N ţ$ D,L?I5гh #AJOT ,\4( $j9k`y LǰK\ M)׸ق&<H ,;Ǡ41̥H@c`.XjmAà9+"BCpAHލBE֐5[3xmFhgi:{; M$!S[Ep Bf m,-]H2 ^PHғ2UWsY+ \'\f6$I !Sꛋv ɥBV\f$yYP>g[}YB T6teA +v9W f - GCf$Yk$!d @ۆ)խw ɀCV\Y Bed!d B%FU. ICr/ K &!TPև)mo)-oc)myKHR2Y+ DB\An$!S6$%"d @ys-oc)I6#B m, yD$ !SۂRڍƶZ]C+̠-7Lgזb"d B[$e!S4R*~O3fo7FPQtŻR8L3:Hˡ@}&z9 8zyWzy" R/ܑzyX=5^nLԋί'NF9$LēZ?z?zr/]æ%!6ϼd?//l}v{l_/0eL8TA*C=|D@jiwe+1y1 A|^ޞv|8}m;2ʞH4Kˍ0lFBs=ex/aP_7GWu'h˶#t πp>cQG4atWfUd(cy3Y6xK$ ɚ[_IM=dx#k).K'[ZVlG e3h>ՍKQ7;dg4%bmOWvIن*;K|>lMKѧ%ys)k< O fAn/#܏䲃뙳#5K=gށ%[˱ffޝKt\ɽͼ=%D|=%J'PE%AeaE[I>qَԖ)0[Z+ۛ[^*o+.[*(q;^,0[.@MYDylr<*l ѼN=%qv26y}$39XN̹V9&YJ@5#EXdr%ykpKٵeAvR&^AdFT$s' ,Mu}Id/e |'rܛ3 yKw4Bމ63ȫs-AؗMmTI}cЖ0-];br`MʷRo+x2KEshw1n/I_'[w dW{ZROwiXvꗤ+rf`fVXngX"* ˚ZRxQYaPtdp{S;)4?נkS.]ݓlXIDeYa,툚 yc'ք"P4{+e 銜FӂV ޽E~xY3b=Z!4+HYXI:Bds|Yo ZMkĚ-0e-Kq#$v-#YK?:3KgfKj hH^ezJuo"Z$Y5yfp▚(E0KQ攛4mMY؎Ʀk Z 񥳣QgƓŎ:qbkr/`KX57n]N[*YK)ڗ֤V=Vwy9ȟ:͋3!x/'JC4!멳:#C'Չ%;e wE]*~k"̜Uf,q5*a]I_L>UAY5!rgŦuO]嫏!6R.>2؛,I&\ svlhh]&BxWÃw[yy:H^):3wkEygj s*3˛:u!u)XbZ54aO0).GZʵxZʺL-IuYRT+ןbuЙK'Pt`W-sCǫ#}$:5S2'46A6_prk׏Oעr4iw[ gNծ$%ViPss|xeZ|:KM^}Oþj\M-Llv=.iLg)O9bIKI;ʈJO٤ax_\e I,4ќ;hxNF7Wn4%q"}fL:_dMtɟMn-S>>l? ΞYil\@2~eF2H:K9Mziþ=M%r|\m~STxYZ2kHҔsv>$1[o]?sG|ֳ@_i'Hms ^'+ϯ':hv܁e2W]M4HWԉ2|9Qԩ\[Kz//G;FS&j(]"A\ٔ9 @ٹ>~WdA$+)_s}y8ˤ6/ϰy6 9^y` B3TcC2/S;}43P[isRYKy=57K̵"Y!1K?\xs*Y| hy.&yJV.7ƽ'=Os#juJyHMOf`|$?S0.H I{5xD-*ez1<>jT5z~NW.&~U$#[#CO#)L ]~?+6kuלc76<`:-Ƿs UT12+DX9lOZ8t'0f7HBZ߇d'mGfG^ۤzUuNbe*ռ}ٮ\i=k8s.=]jJmNKi]&]s gvm2px 7f67%cfGfO1[6.gLV8㸆!y^ek`19Hhw$xT>SQB%6&]I㗇LmA!B;!Bsf㣋jl|xNJ!Qd햔1;cuă!c5d(rd_54Yc4o*Yu-noұ(+MYy itjW? ygяǛ,ki 2V3rlmRc^hyE\s{2y ^%'/ \pE%+ J%9J8q ,^1e |T#Ӳ3‡Y]$xjM(\>u S8{_􊕌s4sQV.H3S6'r̀'>0Shl<g l W,St{p~‹.:69`7Vk[%lmΜr;s^VLgf(m57sl$mb3 RW?7`lȮ%8`a&.2#+ט7u |٦.͂wNhu+kgLH2rllbق̠gt"ʖ'eF&^X:1G_oh4eѩZښNӉA+}Ak<}N`ѹ#*U jlF]#%/an+VQ/iַkt?ަ&)MqP3fftd2Ɲg Qn0Ạ 9hӷ3GJSu(MCsC@V d\*\ĜK/ypFw8> =#cS_x6nik"焬F^1xr3 v+]^.߯Rȅι#N3yfQKY~~~~yiН8s9_`|.Tkqhq$pr<yL57WMsh, C 0Dxc~m%N~Zi-b'rh-Q3Ӳ!n&P@YV{4{urg‹IwQUGl>LtP z}5U9'ZnO OQs}r`8 ~q];}n?ޭ%N~3ۿ=< |,Fz͛k|> lDR7Ny=Z% /Ӄz.UOZt{=ʀWnP)%_3ȍyu_qv4{= 8}EXrTb zIK*Soζh/y?Aj 0w࿆{y/4!2ǣ[Qt1 .q7ǯP;FwA#=:p9;v^S Lf/kn^n5b+!WUU]3ѭ귏>I7a>>q<'|괷]-ݚ'>WfnS_(#C~}_ok}_ֱwvKs6TeFٸWx+=zCw wzx֙:v'jx5i( ͬdGA?5QyI R9@~qNjo{aNrc%Ejb~Hj_Nwr`_[UZяOKM}3h%ճ癴4+eKjmdߜ)OVkW#̾߭pEe4pW#6s4i~?;ϋk[WtvA}W0+1l.d:m͌(_=e{D>3U_w;gn~w%Ι_0^:=kh{PWL+Kn]~/h1 >; :_Jt9@ е8?0:bЬ063-gk~w Egy^Z)' t+o^ݱͷw z6 Jmd5^P$_x ]׳ SW͆=6/co}Yx";bU{ c2n8~'ff듿+ǚ-ED zҸ#sFHOq{-yנ'>oI3)FRSI79hK1endstream endobj 398 0 obj << /Filter /FlateDecode /Length 19127 >> stream x}[fGV{#Q; #Č #%Prߓ+#bŧL73#F[qbbE?=/?7?;yOBӟ}hpZә>|p^8RʯO>LۗPѸGW/]Rm? F=oKϘd~UïP<>K!3ȣ3G-u7x 7ۨx g i g8_q/%GMW 俾__}Ʊ?K!kHWK+|nS~ }jV.앧Jr^q~9ċ^og*%?w ~ٟ\vr迾__俾__}Ʊor*֏mFUV尿&ИklU}<ףߧ\O',6~n'jh%lmC`= r!^}gdxܯgMW~+\5(N:NU#*=JY2oyYpD<]?)y=C2en?2w/)kǝ|#v3sZZah S7kv|ϵG#6F|jW\?l\x _NN-ѧFɭۘjLo_\WLyVƭ-ٷa3򐏹q++ח>R~un o__⿾|넧CNx^ۃM?ټ2w>FSO7ot o1_dVuGn-|Ƈg7xg5xx]~5^ׇc:"oo̿qooWKu' //vSo67 M5gct\sod`ꍗ'xs?m&v^5gӫxz_=ӷm2@}5y1ŧւ~@n6kCtΟrOQ߷?o=tG~.ڽx׆߅;^Wzjnk'G6o}YDV3ª{XDfz,! l/3j׼,>gfUӾ"j 9̬_|E! ,5w/da]mLp/"^ YXMrE" m2̬9N+σ%deH.., 3{oUN3*ڸ^WU #+{d"+ͮEderRW-x23[ V;,,['dVjfqyD6#YY{eYYmv/"+ͮdc][ V;*e4+ qD6VjuJdc%'6^Ade(lU"+ [Y%Z9Y[_"+%ʂ`1$j,{DVV]/fk V;VNֲJdcYX[KdcAYYYƫD6VƫDVyneʊik}6^kZVl{DVV]oW%6^%zD6V*E9ob䷰YYmvlzlVNAdeh"+ [KdcmlBdea+D6V*Zl{k}6^D6ֽU"n*mvD6VZ_"+u@dcYYgZr"+|YYgAdeZ;lDVV]/֗jd)X6&" r/"njvXuGYY"+ͮ֗j%6R Z9YkAde9XiDVV]J[ 2.2Xh| YYmvWuCƪkZ9YʪfaeYYԕdc@VV]Z;VN&lBVV]+ kjXke)K+de9ұl{G YYwZY@6֦I YYHYJYmv"njvXe+DVV]ǕdcvYYX&-deMVNEder"+mj뵬Xi+DVV]_+ ƺWjsceX&-dcm75P@!+ʏb +}YYk"AQ~!++ljBVֹB6VZ!+@!k= YYdc["ұZ"+ wdcmjU65P@!+, :65P [QbBVV+'k x̺65P@!+@!+mJ#de-(de-(dcˏb [CdekDmy˛ ,beXeDVV]*[Y%-(dcm:uoG!+m{"+%'6>Z>,beXV;D6ֽU" +#de-(dcmG!+E+֒YY/"+oʺ[Y%ҹDVVNb1-(dcmG!+͑XVV,fkKdcm!U+YY^,3V*umG!k= YYmv Xe+DVV+'kY%zm}6Gڮdcm@derU"+m*a= X[Qjבu9BVV<ʺ׏0 [KdeݛF*8 G3+ŭvYYy= YYeXFj뵬Xy+DVm|Xik}6^&D6Z9YkuG"kYY#"kYYZr"+ ֻʦ X{)$ XyG Y ְ-VNYʊa-BVֵEدx({>Mj4Os~+m: >XXhY]X]\XZXRYXgȅY-ef}>>5[X ,Ώgv =|]_Y3O,9V'²X6 +C߆gMxw q:>Y?M_yop%WZg5/?~owfJiKk:)Rx,fjìϿy<˔f콴@X⋯~Oц0g~[$~;sOa"ȼ-};mZߵ2!Z i#چ̡t۬?\%g4YU5Cj߇Odq<߾y?lյgp8)NHDe @].H?Whx+<@E-._꭮lgh/֮^L2}ef+z=-f<#ߩ||;e(-73V1JCme02>X"_wVȶdamkh%Z"GktbYivُE&(@cZ<ĺO Ӣ6G @Ky8J ;4@8iچh3Glb:7E.?, Gi1+m @Hݎ,"fyA miQZ/cNZZU"fW/ Xp ( %J\4 =1mlwg H赱?LffBx'zOkqZzo1VOR  Xe/L?{="Qj ˥{ȩ7!tY9#wY v]VD7Z 9p&F`"0{?m211keRʅ!Ch3d>$UTͬ~d*X 2oC(2 &`^dZYD{)#%˴彭"3!(2^pde ͨ2T*MVeG(Md ^'ydd'_.M|Hv-[`2xoO@X@_?c0"όc;Щc׮]9>s sPq156ZJCh cƊ\ۺ;Or ӯbw'(rذF+8&8 )R${kn* 'NKU5?9El܏#h zva7{ACOpحt6{81 NCUsa>{pKaG}QH֦~6m# >`~i= x_BƺR7YHU[ .p-6M8k dp bO񭔟n>By>p^K`x+OYEOк [ۇm7nCpfp[1L 31;ZmUQLz~52L QδwͅR0j2mGllle.l[Lc (8 rla+}|>,` 窜xrm2$ܮu~󌽉M:U8ҙNS4q;ԙ62 {2!߅T& ~KS|A4Lyrɂ 2Y蝒4O1%3LUǃKdZq/"=`tvBt%jNPlТ$WlJt~Rst0t+I9tYaǵ0+)L=Pb{N(1DZILWeW}$[, Eɔ(L]+ɞ.=9"LH8  4#L>0q}t[(Q_d3Q|PK(yx(KwE\hKK[LY%{U[[Oq,}GiTԖĩkK}:KvEmɔD֥-&qbM%.,ER*kĥxCqiB(.!J\Z9/KYђJ]VR.M%IdK>Euu)c?SWZC:,uߥ.XKRAdXHRΪ@%r@s3 W"*.pեxI]]%!zaʹ%AQ]t+KWpɇR`su*UY%BT#d (/E%/K"%kE^ݵKּDI/!AA^)yɂ{%1Q$/Y% <B  L3٢Jd Mӕ)[d\YҥK?t݌t!EP\K6Dm棤P[m9$hKv|*Kv}Kּ,ڒ]-Y9,ҖIK>tLIcKCC}n%覜noB6H<}RԗR/%1$}8aїn Z/Yc %w#.})S硾dJ(<җRH|//Yӆ!}f(/lNdAE^]^aJKDpSRj{Dn/Y[җr6})_l]`3e*LYE&^&RZ< S9 *LKor@NJNcB&]Ca'0Ȏ|KaʩOCa* o3Tr8Jbr@aʭC)[ 5' Ԍrp !xPIL7ƔM QԘ!p)JL(1gX$KLuf<ԘXB\Ɣ4D&{CeJ0ȔˆC)YB) uB4J$&0J %&Cb>qzIL~A^_Pt$11hdau|+iLG㱤1BB=h1Y4jLSpiB14HcPSIaTG/U'Ҭ PcDiLAT/`Ҙj{vHҘ7"Ҙ QԘH T(2Fi5JctU'hLG5dq})J(b+ 1pQPTkamx| jL~(LO&Gt(hLG15Ҙq)T hL 1G#1ߣ46vԎ:Acj:٤Qdm 2sq{ヹ2@/U2 AQm%3YDMtr*ҙyQf*Jf*Y݄djz)L$AT U$2 Ad*2kL6Hc*E_S=NCN>KSw,VX"U>2E&ZKdzLLE&Lv?Pdj/q.2`>M(1 SEV[fr7,LR |CўaOX/JvԵX&D d;aH2'fwu;_e˷+E(mא*mWNFO}kLwˬcǽ]/)4q׼!O㛱^Iw ׌]2.'j{]b6vv@撾,nL.r)[;-ws=v}3}Ϯ6!ܹ]А=ne ёl~q2-@(m:}$ >qu@7X!8 <Ʌd裹3[('XIp[kPpQ{h`1»?EQWvWo\35ǒ6NVюdT$CMݏjGi^(!Uu[zVAEF [oA(Vꋢ$|lbF <-p&=lPQxNVEG/BnT֙KE%xH-Ԋk}N)\,ܨCZ3.ʆ!x?HHa5%0e ӓQrpq,!ֶnڟn>\e?*7k Zj~+RpU:9ĄvőP͕؅7P蹥MRj_@梫6, ˆ^K Bdk'K=i^C i#[cJ}HvW>zLiȍVQǣl}i3jY@w:W rF<SR'Vc>q5`\|i^#9->tɨJnŸGOKp0Ɯ6]ȴgi%nTG2*5DF˖`avB {yN6UMD˚w§r=ېZ~bӔ]jyYtJ~ &Xҫg(TB/;PObb7l\o|+J#UG*}{1ᄜ~uZJ@=cyuj~7\z5D=8 3Vιb EBXu +lC7U4_s 6?dӺ͋3lad|8rntV"N@P^3Ov =sS@: XԨr^rB'FVp? `(ׁmSP ݯ]`ϘqMp8Sص/0ItݨܚfuawEK[h"WX*R98LPS8x-ZAחHd$5fՌ\`W3=0d9*.ytsV<"G\#dpGvE[~5AVR=F&'VĞ;G9Ӗ "M*'ݒREjs\8ͅ[rZhc$'KU: 5_s+a? 8d2o<+ԛ+u{hħb.F %C*fX/O׶iȅ:{<^Sf>z ̀g+wbp1")]kAZ1^6@pZʭXFQ4Cya8!]M>:q[ C1nCX>s(P;BQDBRVGU>7x7nc֋#%F%] k2U]<VL+ nEԫ%!U_]G: DsD wAqr@:!$`8 D2*92˥ĈyBF j'ђߏ:?P3':ToO-K)1F=Ȇaɒܼ[:| sGb TRB)ꭶ&!U7spL=1`VP#Z|`xN#fq3(t>` E+Si[V" h>Hx U7@ ^^HV:IZ-D̋o_dRj_je)+XM71|=iĬe1-/W/mol,Hsb*: 泊Fxyc yZ.iі@F Jd ,]\MwB*R50تwLT-@*dђCۥSdA[(֐,j"`4T4WS-+RY"XlDžk!O#z[ Z{ ^.Dn"+9pXys,8@*{X#s(uC%^T.ԱY2 &ԋkQ/'WsT%A`aߠ`d[ DЋzV!N#ɨ^P2&ɨn/hUڡP3*RˡfOddО:J߯iHF6˦FI2*Wq&ԕkA22;P2)6D;IFQ5#K:kҌܗ+i[fdM*vYҌ,LPq 5#{*?Ԍ,RYZ5#QfkFT[ 5# @V[Ҍ&Y4# IѬ5'E8<5#CɨE$HF$fkJ2pQDdT qzCȢH2*fd="aԌ Ƞ@3 aҌr}fdwY=T!ɨTE$Y'x$QwJTfQ-!A1)YmB$_0 Qu39Ќ̦N=?fԳ+ P3ƃ|þ\}[ A>&Q7^q5Gģhn>@_!G ž Nh ѣ^~@=@>=H%gz QC$Q/!!eҏAsQQ걭h^ژEۉ h Qq:HM6+H !EsSB}$l !ki!R Zw!EԐwYԐ5RoUx$^huQC.D24ơh'G)Z(Hd% 귗>(H1`h[mS-To*HіKPZh ȃԏg)~XX' R -H%r]AFQh2+HD ҂tiF E"(HO)~X\~RZ6R _zs(*ݨEQB}TRo(mRBz(!Ed@F&Ԑyj7.Hy3CDGA[ 4h0kHEŨkH!󠙢d֐ZC}RԚku 'Ro,"Ep(HB{7 А惠!P0!Eq4xj HǨHvUqEP\"R=4QSmItyZR0Z%I, *RЇ7uVQ\Y*Ri PE}@DMv -z+B_"RPg0t/Hbq$HR8-͜"E'*%T^=AEny]EZU~&P G;/w iAN= m9[t$ޫ(Ҷ:RbX.#1UxjH!)r")n؎Ⅾu؎ :lGusd4G*<: < 4%.Ȝ&z3՛GJ֣*#y֣3Jq :J#B1G֣H߰ŪzDqYe1'a%n]#&)QM9r두a=Rd=R~Ufz|Gv^LUn)9lG59Bߑw4!ҵHkкTy4Jrn;ό R_yCwHA(Hv6;\A*컂dH#lG$k#\IH(2+QCAR9.C T6#hHmr ߗ4rHv IKm ЊYn<ƣxKOb};&%cяF 㦣t40U n:tm$sQž&sTݚpQ[]G<&QVtQbMMV#[i^mdۑ iD;V D;7G#pߑw|>ia;~؎,NJE1|Jw]n;H wF~1#vhB;JQw4nG#m|0|G>sQJ(w4a _3G~)w%}}F\7#OwѝےG~䦥a?Rbi ݧVwȓ<yۏd#eH@ [oH!@ɸ0 U9d@JZ)m8=HÁ@ҧ$=İ L0[r$;޹H(F$<]ߍH#EieMLҊd2"e@cl*h ![{ɇXcLdWFrIP\zdDYD\"4"Q81}HkKɇT /)#LKH]9kHA.#R_yy֐:2KH=;p; A*#+ȡ.E)FC#Rc,F$8 W4"H(DC#8JF ҈dϋR!#&,i'%B#ɀՇdIl]G!2}H+(tJvы>5#<}Hݹ1> iFC2$,>$;svg;[$dIOᾺjo|tӟ}xGdbkzWЊq{eoeçw~髗V^xzoН==!Ib?Oz|ӗ4z"~Dr_O(3ɑ>_o~Wich(-</cebEiX&?^8q744e&H=+/Չ$d&13e"ymNw;*aY/-Pk7b-ßk; ^ruKvxHp:ގj7ZXYmN[?vqOv'uaϿ=5/5~cMn _q`{{}t6nvz8x d2rk+1@#O43~>}HN-}~ޭC ʸHkvoq⻿C+ұorP[V|~kΦT3ܭ|>3ۯ^'{cw9Op빿:?^_y~}y[x}uF}ؗC z}r4.ѝQzq߼oߎK}i7[u\?k,uS+ۭ_/@u^FX(}K;en"1[+coy?T#[!j][;[RW/mzZ~}޿Z迾__ן>׿__ng_Z{K̊/<G}H1^:ů_x_} lv(I6mަmHƃQcendstream endobj 399 0 obj << /Filter /FlateDecode /Length 17405 >> stream x]&qS ru&tHvwp`@.\l$Z,8>~ʲ-k?o 뫿7߾w;OLomwztznW˟~8u|{&95mw>ϗ+IHr^W̗}|K|ϝ/#moWi&g)k?}hk3=^~BYl]g \ȸu?5k׮30߾g7 MU_+د7$=JDz6 . /.-J= Gh1-!9_/<<承zNdyNId)GdTAl,ڕ3:^7$^?@Ca`Pp^CɲӒḞ\(a^7*_Y5˧CuR_c_ޕ Irɾ͉rU8s@V>%(_8M ʗ ;]ܣeRmLTd@`щէbqD@+Iџ%;RQСߏUӻ{CqSI&^{6Б3KJ2ÎWe3r@\$(_rl [3,9g1sCFZA2D9)Q@SM#}R5=c)ϯ#K]OqQH7CA6Oބʞj]K:s0AKD@3P2^{ܲm8go.dl%DRh^mCd:&%MA}:ls»F]=d( )w3U&$9DBαaI j (WN~kqᒕP=PnW/Ct0P7 dRRS 9}(O҅g,IyzhɉIP96gЊm?Ul$̑YwEs\7|ZT*M.P繹3Aٽ4*@-iR٣YʖgKW<f-ޕ+N?%9NA=MGvrNG`wε *fr-R^ECx*{P sxWXǕt][{Hrp1;iX|-XVIxWKoQ:Q¬2U  %+iv\*rS\UOА dvY!Iӫ=KK FFWR2Rrx~^ SS6TE^w"?I^Fs*pxRrBEqZ۶-j>Pdtg:omX:lm $ I_Oh*NB SgtSǖu^1ږZ F:=w&UMI`o2ʷKA5}x{gB`27SrBwpUi;S;^)xӒrt{)8dR_ZSp*\vfR-*.%Iwn{${^礤:JzdnMPRʮ4Px5fKu?%vb줦|!ӮTlR2YO)`㚜ذ9qfLISSTۋ@d{&;hS20Rҭ5z eb~`pk=\vcVTTH S% HRl6V'r۵d rm XS>Q˴s&llURYeO;F˧i V]#U طI?f}HFAGf}~I6n 0N+zn,rVJK?O/f۔sDdjuVc!%;9k!\Q^X::&YkCN^͖Lh.IJWnp1 7gv*9=Y?mP8e'%IrrhdעﭔX킔\ar$4pz~.cc:YV>t)X(4ߨVw$}fՖHJ[)9uen,.#Uyz~كHe*Y0McIc4rbkX&c͵uT-XGȲsqk4iY12`.[)2=Ff>^J&W-Q1zy0`Ʋ}k3>%4W SL͞/v&mɷw?gHxaw뿿3}>kKnh}F?C㩟ĘJ}WsIN8 g2է ")cǴ0 edJQ'iȸ c`3d#c[dOcț2v\E;(F)c߱(-NX%z)ȘðהcjX 3v4S$eqWef;hCEt}ZPӶ"1cG+f(ƌ$z+ȇ3v K 3U37gSJ"̘ ƌ:F`8c7Ul.%j=mČTJݾeqf|j8 9co9coǰ>4g sVgSTݽJH7gLI+&&И$TcKMXA#ߵ9 Ac)$lZ;^A#ky'ds2if$s=ʑIHc&5idk%s&FIcfI2܍;ޠM SƎqj 5Qco1j8 JPc0"jv?F 5>I$DSA5vL(Gcҵ5>IWPcVE) k1*Ǝ).6l4aҴ1%[4Ǝk܈sUƍq57nDO7nEPhcgwH0Tޫ.F>Z 6C 6v{\fZO627a#"cMo{d('ъ(Fs{E3I22mSmoD$҇"ic^{Ǝ4m(Ǝ!ep(ژIK:.B acfm/ؘM|>mXbTMiu+ءG'wǴ1%u9 acfM9CBQ%lLYS1+n/P3J3Ӱ1hT 6l6攭+9 9 6n+ؘIFUS1%='֘!!tPfubk3}.ٓq5r Gy2PV 5zƒ}>,~!ԘӐS\AYHc͟<%,xJB>< '-4RqE<_}/Կ4d}"^a)'p{I>}vq3`[JS;Ox {Gǖo Pb|vPpW (lL(@o N_0|1|qsR5l܊\BџS>)k@Fʆ}?$@xRl*$-Rʆ c ɗ?L{$FBٰ˒ܧ7}\܄{Q&qЛPnkPׅ"8!P0'g O5mOx3ΔxrOŭK“1_{A`03\$4|t^0sOtt2{c|ɢ{jMS'y 'w}_z\|;.z 2I1d>sk ,'w:=g>Z'>fⓏ1P|rJOәO3 -QboD٘Pb{,M(&{9E(͡P.JuL(M1E(ۮDL,'3 FpL'' OFxC擰Ocܧx{\IXh<׾$f(L F' dY|21@eȮQ,\2fR+@OE|ks-03ʥV&Z e`jS2SM ( ֽ݀2G|ep3GOiy n F#e`K|2`OK:'<@trN'(8AaB'8!j(8 ZeN~ݲ5 lIQNdXM'$t#_):جN}`射t2%e3NMaƐɠ{TYV7]I'NԾIJ|-t2>>_tnNbON"|“4qrE 8mY@F@d/E&oDLˠ&zD&oyPt[ Obƨ*n>٢5I֎i< QQxg!V“ 54'{~ԭQwObYW6Ɠ{I佮xrOB2L'A!q` ObQ$@Ot_fQ֌'IV #'qJUxO~qmAIIO™42\l< SENN 1o|E'TM%.䓄t2sKl:(dzapf/i N\5$w0R5[)Nf瀓|1dCY@6sIZi'rMr>M P11|f,$۵bk4l2gM&k6IW6y0ed \$-͒S%dNK]x$|'T_d 'd`|KN27"sFI Ʃ}Ttrf)˕ d:I }1reĕM'pE'754L'htt'9/8I a8g90L^-8n1\{Ap2e;KN>O],p6ֵIv\oA.e:ifJV 'odNa;_| "XgC6 M)4ɕZd`d`jiLMfq_NkEmMm~ED&1sj!ե$U0rb疀K.jX2߼=_ (#zmR(*$%blې2(Ub*&V`E%iyLK[s%va@3i Kfξe*Hꛋd4| m3_-*hi 䓄TrJH¾\o&*JT2HV*I?c[djL%3~LPhF/m"C@EiHCIhS*fo*ldK[Ēv K0p'ƒAҡ$>[IX22G$́[]KFRGJ^ NQ@;)٬VM%4P`*`}P(*O'*iv3S ymsP2P덄PwJ^`H*(Tb*]Sƒ)i~d\`аJ%SuAQT7F|JЦ|&(*h5?$, Xr}JX2snu3QX=TI%W d ̥_=L0ՃI |VGqJfI.yr_NEX'.i%ouIģ]ȂD1,xJuy,-Kd,77K\U>8a,}ܸl lσӺv^bzmPPK^dIY~C[Do8GaٗymHIxpLI$\}flT8y.Q2C_8t|:MP^u N.hw\ mgp-qh B{zjfd>A9_>i3F 3ZrctP3#ơ4~0g?/ϛE[2xQ- ]|1"peZT*c xy85 -# [CVݱŌOWIy xqS =lrEQ[ٜ7<\2FPpHCROQ5|3 PP칎7EO_ xތ=#F@gl7uIc8A@\cL]ѭsTtESѭ{`*9oqC:(qYCѭЮn)8.`xa[Wpz~8, \[C[Av?X1}$n9 ΀@D4b|"w7α&%x> %9xM|m{>x6o\og;=Dgp<цX:| Rhu{\ޫA8}4{ i>{Ow,Cc*c ( 8 `@w(ϻ3 <_x8֎KB52I֚z*t槦Fu/*ƬBVä)A>`0s8fI̸<^pd7T{4vE(yYo ңMdPa (>^5U\-4ӧ¹Afw+d&v㌦4V_ p)=r=˙JZ \Фq0zJKP ,0Ʊ;k'qH Mn^J㢮8\:EJ"\qg*Hk1·r<@ޗ`hLz_oPN*QJ\MhMe1dp3 Ŭ4_:{Z_qBN,q3=qWPkz?jC׊fvF tY#,8 k'@$[>8"z)-N2Z8hiE?l`nm ыPgF:Q g*1 1E 3}ѻ)I ..ӵB\CJqҋ\/P j퓳+u Ԯuyc Q[t{X[xLmf(zV97{ȃqMe!o'y=iPrI5,H[祀2c* 9˰8$AgM%T 8h҃CbK>ܻ t4$<1pZYr:B_Wz2E7߀ K0u2|3ӶsWSxki\y:P[FΧޅ%uWKTy(aC0ܽR0Yt*>[GySkCj/)1`Li(ΑJ3*uyk8@ W<~f#k{ qQ qUӐ124Dj[U q}B\C\}ȰS۩A✎q}GOgzU1RL&MtAzu)fQXüc>9E[ Nءԕx`B)PP.#l(f/tDqVfm9\z2a)nh5E3 frʪe'.RnAW;mG`X(:W +N"CA*)f8zq*|a ƘT ט"] r~!uN,}:#Ӻ?MG-TH^:PqQ ѸNۗqeh~tCQh#z(vu{`|.EَC`Wqh98x, ^T%hthVMG)Qk=^#n,*[P.MAqZTvxG:k1p@+@aCPZv?tjA+ӥ߸:t/q'dzdi"^`sϡէw ku$%kD[6..>פjpKR:d)ܽdM7)˺ZJo15n%.2d\l5]mfΈˏ/RMz]/Ͽ*ձt_WT!vU9%퐙S7_$?_l4KS+|d-N)8e*erINI[9%cl4ZY0/)&P)Z2|O0r-3V4tdwس#j!(e1ԕn 0 HV LQ-(%BJV[֘!eT]6/J.aJ+J))lJpPm>Y2SbR2lR2b )i+d6rSD R>dt9UԐR2 38 R!vSJښ]hД(0>4)J4>40%m_S>aJKS2ݾrJլ2Gt:ͥFǂL0%݂bʭ.ܘrc7zޘ&e=0%~jf-a%”0U)aO7 #+N \SnuK[E9%$Oח1%LӘr|0%n !cJ7(4uƔ0$Srj ”%”p$1%6-E)BϘRs斢X+TM)qrlxf3!% RRa(iRZ FɋѪ%omb^%lQbvi(Fny1JSb0OݽfI-F 'DRrI܌7F1=Jȿ%go3J|Sbi% `7% 6(a~Q@%jn&F FF% Q3%2J2OJW@Įl ʸSs(ibh]0 0 #F_2ڰ7w~dZ5OL݌Rben%m )(Q(Fi21g(T0\Ԑ )iu RrP %75U>1JnXl Rr$ )i2 RfTQRi %#iHɘ&A?S2b7n*B b/G+dPc\1J63J&b'FIT% (iob~%"Jy+񼭈R"H[ % lF(Bn0W DD(0}|6NTA[{aH@yǘ/@\dvo,GTʭn@x%bXJX( +j@VCVIoK .nU\-]Kށvo.o9]%%Y81sɾ?`S+=:,aclItTcr{&;62dSLn={1*6d6n(*2(Z&;{I$#$_("6v=@ v|^d+&^&;4FƎM-~VM{PT- &rV`aG &SrVL2[]`> &;x.I JɎ1} iUd2%ZdRAwED&;;̶D&Hdc0T`l=1d[%IǬh+zI$Bk)4 RnWh& 4$ӜƎD7.4ٻoJq4cTPBÿd[I dJn+2{? LRbH+2O=IlQw L2m|y7KrIE~ m*0 L2h䒌>V.r˘T\RamXD%;.˟xbO[E%;E6 a,IEՔGUXcVX¦؀&:6Bj=}ndGi MS.{$2^yG,b9d۩M*)U$AoGlX4lRE`pBP*qQx/m|Z ˩KVG,y#5UIRA tZ 0|JeS*hI߁01q7uEܽ U؟?eP~] *ȌLvU6WVٮ^*:>JQFV(*u.P U22qP%P^^BɨːQ%ɯ*TxJ,FYf gV{JcVU(W"bڵ^|q%WK+Xb\ɐiVȖ)ZYҾa%BI`%.*qE+7]JUPIJx=QJHR*sl )ToX"Tܾ^B4M&sඛUbe2^57\%b{}{fި%L*VI%)t)RC.Tdo T2&@e Y˩ hc]HZ E=)c ixs;)wĐ!%13d' N R2d e*ʛQR}Jɕ,v3JC-I}[VRL/C÷-Ok{0@!JE]%R }|>Dn^W@@l.")[Jj?_Tcnnf% ="@ɰ'@^Q%5ԵJi1 'ݵg>V:do>I(Hj3G$E(Մ|r!JfS"J^QRB.D-J.եDZw&Kqp_ϗ(ָ8gwJfchD@UPGcD-i%V')(;F((DɑKycLnǾٳQ@!{*#JNXQ2%Ԗ%RM(03㫠F ]苕(FXGF'DXE)LR>MM)D)AwߒlwNm>DE(dR򢔨R2~ R֋q!vȷ d4V0CJZ R Z )a+3ʽ67nFio(q)Ԉ͌EdZ4r7):CY-{Cʽ>xCJ,ROiJH~!%ƶ)%A_x4CޘrVܘ2SEXc>bSΎ%”xS XQ%!*N:U\JVbep*^NEβYevy^*2]KAFy_d5M+1 KH+d*V %mtWL 'i2fsaclL|hDG W2Υs mf6op%v!.ʴE*L6 _ W•LM54dyݚ•J#|!R{])ZI?[(J+7VFJֺ)ֳMJ<oY(ٽ9bsv)ٌ+p%0ø2W+s/+aM W 05֛L'&V^| O2L6}T2%GJ2:b^Ixe ➯.Wy)wʔTp5JJ*%CxeJ竔 omSXRbhH`I_XqWKĒ&7쮼ݼhhWgv%JP,2dlVM <"E+^V5)O/VZ6Ly;@uGRVƷ+i$N`%Mi+5`%fs3Jd)q}3BQKM+W`eXɰs4AEpL+qQ[E+2Rhe ۗ=ܯU "+{ν0`eڒ`%mRGihe̳nVʒ]ie @i%{fZ"G\+WL3Lӻ+ŠW>Xƨ6E,ɩ&>}P2WMem,b&y"h79KE,Ya@`S[`bBeOhؾ'I,Z@e̊cbɌ&mEE,97Ql]/SI,NI}[R ^@^vZt^t|VW_;|`GS=J~/jZ +<) 6!K%]R-ewpHii?,i?;t~/QrŬv˧a[l1FK̗[_ w\o&:w)p (—z|6$M/E+ͻPYPm/<`\In رl.~OOz?~>˯??3emx3k\%˷j/_2MH| L[w鈏|빝/E씴(NSu?uR̷GsfҶwgZqeNשZH;ޏLv-姲..ӥZjA o׬CV< ~٣maz~-i*ا]m_/hu#˙}O^>wokN2yO-a4]|yJ?Vw\AaF6ovվ)音{i2/߱!:^ s|"McfRsxG O={W_&sb z܅+tgn˸_]U+~GE~&qZ/_-p13<9I<)8qq5TMa~>8ۿ˶~G ZK6/_?ܝϗG>b7m;#v3>S[eV_=e|8擭į_->oi=_.s:_l7wkWu~e9&kx$mǽ/oN%endstream endobj 400 0 obj << /Filter /FlateDecode /Length 9261 >> stream x_&qS€m(;@.\׻+g땔}n̑Ă95lvH^3$Oӻ|ww.?|z"(K{T^c{ek?[:G^l)|?׵Ztkg{l1ky<~֩ ~ýOW4PzHG `6A빯L__˻Z"J/ٖw>Rlпf ?D9?W4-TKm!)tO3ٲM}{]x,:?va+ǞgPMyj,4--i3kaeֹ-ln~w lQԙ}^՚{yXבv!;kqH^wt ˌmo·rnì4ǽ·;޻HOQlCkY}?)R}mk  c-\3V{kBX81t:6fn;m]l-{Ҷ[~fֶ+?>M 8Οy|Nm~c:GF}FZPyt~ӷOuΟ>!sO?7߿qo\S}KFV?/l-%\E@|dK΀R,y& ۨ|#K_«{}9l/ 90I_^LJĚIrN(K}=KsI^dimKJ} ;(hF;5hvg^sRПB`gDvɑ\$qkoA_ =ֳMk! ̍b6kwd2ӁN$fY$vz%:%˕i]N R̴4Ix0 x~ժ,DkWsgQbqc `|st sf x65;ЏdрPkJ u,:|$]U| wJP&Y6iC_L@I.e,hHIe Q@ .,Q61؎6jAbf:Z8m=AA6G.[[S0mˆAmԯD7&9mLI1+Sr`5y`\58 % nD?X짛g~J=ۂp}(/Pl CtᱛE~v8i>{dRl5JrumEi7rJ6Z1TJ2N-I[tȀ`]e?=m,%${%.)^#6uAuE:%|tn#,c4aMsmtTwֶVŊ f Mb&t_jU+ASvl;k2%$Yδ4vlLU u$2i|Ch\J5_7AFd /`6Ѐ\ ڻZ))q`с|X66EKp>zi&\)1㜅:hʰ"UHVtl΁`R2\n6»:ۢ~B?EXpR:3(q[G-Ym*wNlӐ$fn׋i! ܭްq[8QgЧ#>/YBt}zK #lmЀKs.T-ݼ'%| da۝ϯ͵ڦ4Iln׵ rzlc<[Oڦل & Y̢&MvÆ[RO*c׃re.9/<ӺK<٬<Q6Xꔘbڭb_ZLMnQǾrs=%عt8jPX6ʰ\jkؖb[*ɰsg`ej e:Y*Mqm~iQ uICvbcW/,ivTs uu$rwPrI=9ڮ}(@Gc8oNW[!D2[b1.d>jىsV㲘uYG~ Bs=8]2<8wH:w`سM2":s6髱i.=,`D_g +?8z}WV#~=L\bvvesPL #6'Wݳ>L6&fs9i9o٦6{d>sxQ1 u$V5ͤT~gUӚ{llCv}"1ɠ>՜iuRy+9 :9g!# 219Dj#, 9%svlnjF$4.WDɣ-R-ru骵 LL2=7<ӖjgQ-T5Z v*@"lsC. m}^vt*SSRj%-V u<`e6#WtcxT$s#:2`$M͙Wb-˔ B9f<6CW,TҰ8) NL2MpY@Ә:a#ZW:RF5Y,,* kIرal`,`wﷺL2d`Aot7MIIBEPki.Cd!SaVC`*szFğ!)L۽zVڢ>@{8'nnY:5;k<DyjTj -ouSOb|n3S,"`<5J.!Q+8oCS|؎s}6&Ř+*'38V˱_%hmy+3 ;róbP˵9}ap@пL9^m;SVhsVň:sD(9<;HEfV0Ihd: 6{)aL2=9 ugEn,3ksIo4/V@XV)LD |&Z,YdR\Ϲ'b\H|*v6Fb6&Ĉ0\aU nڡsΓֻiAf#iNU~:}COMm+QӚ?du<ֲmِ9%jxĺFv@2C8\QWqGkGOG|N/hg;;փ,tMiv.ʳwi78xcZ7'y( 3&jsIz;VIѳ D8KHL$r+euD:,x&#xHŅ ɓ/cv !x:tܮ tn:drbuȱ:Pw7]2&rtK9.AH"NJb&+tIJ\Ex8rqvKGpBTZׁw#Gh 9ZRX X"{ىc'#phG9ZGwXypX;W8ZTTp6+9 t^>]ºc A8V`G$!(۔D+ L$6,"դB0HXgAw dM"qUY* 9VgjnA!G Y&Yq#0rJg"G VdmD͢>؄. q(w&8$c3"~sǪI+RTG{1I興cE#q35"&1)ڂ6$&ɚ WvX98V^58VPpcba_уFI91_U6Dum52$k[ıM-Xד8VĠ,8ZcE&B,XQ"##s}Ll!NJImw .!r\)Iڿi}GKIrq%s*ɤ:2"=G+RǛS\Fı"$q1LIU&jCX+q 9D`ι#b! f2m9kJBGvs9ttGE6GGbx:kLg9Yњ;k]1[6 زHh ¹46k$-BhHhPWp 5ڍjB.#$j{9MP΅M[akDֳAdG47PD Q= hf02 PN qHc˒D z&jܖPczD Ԙ"@_@o.Ԙ:QccF\ED3B`F'* ҸKsJD7'iǒ:"Oq4nƒ) ƒi(곉HcyI-!iS54$ i,{iUAKe"H҈ jUB* Qr+XeZ; tcpšbk5`=X# iFHX +QDXޫ,^nEd7~cNV{'.\J*Hx* "b$!R/Yj RjJD`YP4uJXT PlLCY *1ZKJ _ P2W,)ӊcplEHrJύS$Ax┞S"l7NY@$9[$DyNe"N f5*=TG^+2O(EVẊ8 %c~Q0')FAĬYQz QJˉ(q' *DEߊ2>#= D@/E Q"Rx(sD'0^dRDR=$ )-S)3C$D @@JAkVl@J695)}@'AdwdnG2r`@%rb`%(,`^fe1R񀀔%0 H, HyKibiMJ@]BHE@G2#^_IPJx4"{ L D/r'4+Y`G,e)3b2>aJ] Jy8D E)A'RBDR9$)%*`*I*#z>Q%< P~Pe*QE4I 9d~h/Jw d6UիS9aI'TN#TYJȷ */ҝYP#}qΝUKG=J+ V>QYVw`/dI*}Saʪ*+*+Un VS"y`>dgZCzm*}E} )Xe6+j[w\i޼\iYzl@w 1#ieE^+xZ"mzVCpCL/y[#j$QmȫF{OiWiɷrYz[)vq8=ɏ6_$IWQ$׫%Z}~ǫ՟fȁ@*R`eTɆVG9!j̍zټ/Tba,my-ڠWa9fBUW;Wϝ&_ {!n,~zC~>_oח}Ҿ~}?wƿ}Yy;/×Y>~k[Wۇ_ou}%ߢj9&p97$?_?Ͽp]Gcf}Dc7|c+>-f6)Z_|_3q7߯?\6F7n{LMK5{|&Ŀ51Sޕ?5Ԅ/+_+?aQ}l?7,,?t-}d?yl{{ȾOPW_x|XrSطXxOdZxBoZ eg[)?ÿZ F[%uw zym}5.*\TAZ v_eV&endstream endobj 401 0 obj << /Filter /FlateDecode /Length 10149 >> stream x}[%u$?< 4] ΃'PĜ(dpH!+>eUgiQ`8|S]Uֽ鸥ÛU~O><{HGzZsz7~4=\oO7xw8(_}Wڸc>VV>VzMZN󨩮@X{>c&+ڞ]2wP+ >F&3+q=7ڽ]<9 DoOw|&2OO_}'}.c8ʺR?k.忏QjfMEp%ӊWZPo>Xȷh6suk:R?oJn28zkG?y1m͋}>Y᯾Ja:k]k+c-4|F۶rߟNЯX?ha3mw<޾[9=1{/ "&<;`j"Xs#,Χ)Gg<>n=p8:kM Xxs t_~ڧ={%TĺSk=;d&H R߽y~6Lǃߝ~}mt @Kz, ''}Ծ|1kL~`j6{*{INQ] (~uG/";pU^hgjmcOs-pe9Joqi. F׷z쿺N_ߜ+t_~ݷߜg:_˽Ϸ/_o_߿篿?߾6?yl]v 9_ݏ;ovv,~ZrޝrYeóP<wчWhU}m߾2Jy׶HOm*zA wW9(2=a{/v۰Eaxa!ߌC]H?b,zk{uElOiL_/7V1ߤ'?94F/T(> S=zv \0*+y:-Oe\3aA?i #:dOl@pU|[l*'!c۽`>01صߎ l" *gL g ^Yfd2@+=-7ts;S˳V"`u!\u<Ԛ,̆){Hx&̽#bŇ~*coD_ę)ΞVȸnS)s~հw r rEm!@. ;e6Y`N'.v T3i XSۙL~EuՌ2RKad2t-c:=e`2 @H35'e`s/yt#2` &&G7,8Kpİ*O7VE?H . )<3-Tֆ%$shĵ_-i|g:~[ q9bg3Ypc6 VƔ` IEcZ%<dHy1C$5N;%!&16XB,c 4֩ Ebp9(hs ^A.H10 ުspK!(a$#2FoV"i,n|lz5 TV VR8/V Y+1B5n!pvk0eihc-7 +(-I +DJF&7H.+dіw=D疀JwI_c~:)YIIhC;%S#m eχ,r sN.A.dT-$Powi;HxY6+N~_MzkFF\8gZ_̘u6 !k rAFm@ΞD:]Ohn h1 ԛ{(:ySԮgmpgrj|1y[3To)֛^9COp=Yj`Ě:ɦIau71q *a1 F^t7<U@XLNkԇ8gWI(Ί`Re9v@ZПey\mJH,"!Ex8+i;no$N9J!Y;*"Ug`uJw[,VtJ((H BM!PiRXЫKĪt bU"dDf)tHSGff%ã^nc  H&^3~Q@,lX 4eG S KX09-t:m9 ._+&,Zea^d~II^0ϔp®j>N ȒY@E?!hl59HpM=69Ec~^Gog$,<⒴fd !h 3_vEW}]@dߝJ6״A*A_=*(`3`y[sw jٝ7#EL烖$:.KJk9W.6]涹C%#5,eTOb9" @a .OO}SVSWj8L஥us[Yptz{IJP:BR$r2țKNq&plK@C j9%H,N=M wٱM@6z ~-#1ULF82$V6BqV8[4e rHX2.8(m.]U8ݻ9Ra2if%Mk=Yv@U/4A܀Jf&$2fgxH4(;>A/z 27VHiV^)?\ObpD{.~ ɼr<%\d^"O ]Y\] GQNgM"ʲ;,j+/S%zq(;jI eIX,nͽK]+ˠѧD¬ZBTZ4"3NrXch&֑de]a{{GBW)((]p(_Zfz[pRc,oըb N۶q>P|6[@=XVF*VH0Ͽw% ߃YM CrH/:2C^bpVS|uL)S8dq] sgִ] dzޅ2 `(>̼j23M۔Qr\j<;VD 2Ss x@/? kRD}y񬡴L;En~({ X^IM/}On@JNMSf &re/ g%j^"V3^ s@_N#TVFyU-ۙT U#J+\|x${I6ڗ`iCGr= VHX%NѝфˈԈ D-O1@&?U|B;!Ϥ!}D,L9\Ȓ+̊n™w3T nY采@* е(;8t1CHSѰ qllme +isGwҫ-WaDrU@U"mA J'RlP@;Pc>w${έݢx)ofbFJ,tx4,LTD$ė0_zt3Sk(yKQǒJ\ˆVU@Զ^CU݂"6ʼ`򭖬&F_yPydʈ(sI<3j f#V Y'4$4T)ȣxh!d0@-+w;*9B5`k3iLz %>C"=ajgIr(;攙t63*R,i]ڲ:5̅PZixl)*b%D?AC <9'J%MbV}H%2\PQEZiUj.f&N:NG,V"-1wuǢ.B\q6K4JiniiW7ǞPF4lw#2=n ?pf xƴШ1:nF]s8xkT^f/fی=ApȊ)oqB%8ƞR> -!R%%HuLigi=ciƹ\U I1`{Eu]YbȚ+{ S5Z%TyHDEf>+JTm'2êTQE%NR.L^G)sb-zhEi*}*?[ua*HyͶ(Ri0'z.:WGLb:P.etVET*C)C9ҜJOE'j|h d.+0X+@Z9~d33}6PHxt@eStC/T]C[6YIUō1,*h%n2D)|[n[LhcJy%25!̨ePa鷶6s(t~g\S b"z9؍,/<p22FW@"dDڈ(b'(4M? g+#ŶT6iޛ 27=͸+ ᘍcb`e,L?,2޿vvcs-@`e@TꖕwjҟǮevArK O%3lvcmf ҡBl9]*`x}sqOwܢ>[QPHMFVR#2U~q#n`g 5"Q{ɌhP -I`m"%ulu[Yn␞/|E )Bi+9TtQmB9QwiK؍]XhH+ 2)]MhkQ~bS8ܵ@ Qd6{b;NA("UZD7srEYT6 I4_O;JBVI:\WESٹUS;2`#LmF7m޲RfBjb -4n Ȱ}R[5f<̓ѝ#3;pAS F.LC!J*"R³LYAh+кQ}k9>[qmh ?ʄ*r6@R SsdsȊ !'o^'*cSUe4%|gwPF"n0Sy*{+Bz?IP-*y;cɈK[0@4ޓ!A dD~aW6{xv ʻrarMwަVJq]/9~Fμj{*"Qvh  AZާmE)&dDpD0N"+&ǰ2.݌{~]ؕleD5jE\θms"# 沮׽>lsz{"LQq܃Q#"4Vy$p r~R"pIq5H!i'um8슐;] p=jdO#7qDMHMGS:>NVrqfD(]Dm ohoߒeh AAr푶/ R-xARܞa&؈+@96Ǜ!%@IH~yqhHz ?^geh>zrq .4$exa|[V+k4Q[.%1c:׳ߎU'1!S*/wF\fŲZfrj~jSKN-6}X،O.媺r]+kkjD._q댷zpUd9GEOŚ9>,˻8ekS 6#ܭL7u+429l2XS:\},y,Z.^2 6o+ȝ݁¢.`ژ{7]v%˪v:*a< _x{}bY,=^`x+-6GkKQw}:|M6fx0T:b5ˮLMsmް6]&ז\SY, rV0RkPs8Db\T錧\vI<d W#1VYZ'G0]Vܝ=mm 71ңrﺬ|)ጺw\Wy:m"ntZNRlFh2 ym* %r ՊV1 nJEf3OCOW^Wq#.x;{lti6_\\G;\wm^(ȨXV}֋_okbY;OLÿL^SYQW."J 1^Yb'/2*/G/0=vJKVd]V|ȵՋ/#9\^\KJ *TpG.ՠ+W[*\Kәbnyljý2ЪuIK@ZSCXх?yS<Y^}лŞQTsJk;d_剜y?B^d?1qgkCx]*yÙ&?ܿw^H.I|E?EOVwyW>K›6ϒE)b|%沺Rϟ~u\w/ҷf^i%%9Vȏtݿ#d>T_~+>+]G~;^)bǟ;bn~PQI?cdNG~T7 }KNp1Y>OE5?yJƦendstream endobj 402 0 obj << /Filter /FlateDecode /Length 31 >> stream x+T03T0A(˥di^b2Wendstream endobj 403 0 obj << /Filter /FlateDecode /Length 31 >> stream x+T03T0A(˥di^b2Wendstream endobj 404 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 226 >> stream xcd`ab`dd v 1400qH3aUA]nnS ~.(Ȩl䜟[PZZZRYZ^  I+IMAS>r~2Ft''%'u5u6t7rTM^"c˾HLX8yq|>EUJparq1Od`Rendstream endobj 405 0 obj << /Filter /FlateDecode /Length 1286 >> stream x]An7E:@dBo $hMC  ^|_l>~u_˭?a ?oߎy;/~|;J9qz>> stream xmL[eǟ[za@n7E^C alc]p-T,I cΒ}03>.8h"0 ]lԎ%l͜[&z췓sNI%ah7U fANwD{P +(d"Lx+MQH0]'6y|˖x%S͋vUjrJЬ{76j8h4mվd18TezkJkכMU{Gq)'3F1HE1$û)r8#MXq0c(gߍFǮt26|G~&#?uo'4Vѧ t{][juEӼݕ4>7f1SA}p'@?NNaS l͡Ҽʁ֎J5>f~9Q\1D]3%dlY' m?A%} )WT>t׹/ΌnvvWAir.^-x $4 T# 4o>jY-7%0A Z$-3BC0"6T1%Ky_QVwZ* E170*7_Rg+T$B ;%_WiKK.|HL|jo7wf稚sJ-]6"H,\"ZfB;lP+1u7)) =x =PQw_\LП&фendstream endobj 407 0 obj << /Filter /FlateDecode /Length 22210 >> stream xۮu$v~v)O0lf.$Ejaε"vƗ ;aeƊx???7?z>oO|s~~כq?zq}}ל?s~۟p|o7ۏcqzG߾ӫ}}>~Srkm OF}q9sO|ŭρwqMs1Tof*G=NT 7j\o}ю~}{]~]zҝ1'~Zy XG}gk}"痧%93/̟<Α{ڏ(CcZK-5|R'?_3WyR~?wG-^"_z??}_go~v8uoqR,-y~/Kw{qzv=X(~p?ouFǒf;O|?۟^׿9NsSNk3>g?w?;/Qm*D׏?\NV_e}Sb_7OmOݧi8F;U9OOǮM>?}ld~\2 Hk7PM{[+{9h[y~4;DSy_ }yC~'9Fx⎧Δߏ G83w#)ign׎#ܸ&=4_ס{"fq 1}⼝yWe] jrS/].|8})Ø03+'?W"ϾB!_Z>qOr$}HW~w\a!y#ˎگ글L<ԇ٥z# clwȐRz8;tvk#؅r<<"8h_`8"m),]_";vRE4T)0Qu}iR{7jM/C&j%K`u{HkYVt4WML9ymş8j4GFv>Qs[91KHg rTcE]hr{7km8B3*Hs[@j+.hП^ງd#~!rvOqݴ_ڃmdP/mLiyYP݆|&KٜM#(ːsAk-ߜеh6~$Zyt}9X]c8@Ģgi?&K,]4ȃzytG&8O#aYN\^]4<,t^5nG_.3s[9D΅GxK*̭Ԓf·[@kZwY;kwp3HHCsj B 8_a^iF0z;4V@q-"h~_ZQ` iC:3>P| F] A|;7 CttC Ð cnڳ$ c(w8ҽqvvFCA} #[Vҍ3MCB@hiOpvׅp#騝2`g/ rB"3m unyj2iݿiv4pA1a6߉itrܗtP5#h62P9KP܇}ڿl{M~+}ZeKv<{1wT:.M;8;x8$1i, 8NwÉy]Hg͠5 <> drn>.)>ã5ѱ>7F-s7>`jtpi o ew?8Ff={72Q I΍v |w ݧs *ykIld!3? ȫi7NJ+EF>7aBҗ\ȍ5{I gvWi3.S<\k1H;8j̅ZOTφe\bE$,L )(wT4-!!"uZ)ڻz=carS.z3^hpm 2>&nIvUw:Av5S)hPm2rw͠gWC>igN{WHgcS߯sGC|/eYw79w4pēD|.6ncwp9\c0LNmd zdpsx7F)jbj%Қ;JO/r.#7F6u ;s[+ߍoG[&<_pX^ޖL}?#_Z{3Ґ;˫u2}3w_$78[f+Af1ʁ-36?'稟ȯxNh2iUΖk͒~*(q0lm#Ӫberɑq¾g-w dHZ#ߝ񠻓[O"2}ټݡ5D"Xu^X0k~dbB";*GLȢ1q3|(pWL۬=dq~+2Υ# Tph#m|hl!톾A11hpP1\:@&c6$HG2rtEQ D騟IYCڑĔ1tԏeWAs_ե#V4JG໘t%??%(E'Bg [f( Hp(#k0D>jGM;E;$vMkGj];e#G\=DG 1|$AA Q8ԏB?\@3& ~#DsI8<$A"!uD D#HH2'ԧ6&!u"(!f%.%>l4$y n$;$F(2AB{A JHr32 IjJ~VQBऺIHTz(!IdHH] !ə1AH # &k GHH㠦<!JHD$5i7ߠ)H㢠hG:д|4NM>Rӈ@>>lѐZTq6 ĠZ~4$&ChVAL?Q~$=@?H"q/N~$ IA|42 J8ԏI]1sfѰp#9Zh쮅EhHG v?B?O3%ѐI(JԏT F;а|43h쪈kL>#y* , &O*G FwFC .x&$:lЍn."I4'.D(#FkW M5@KhȔ+MhɗmC(Eĥ&E)3H^1*F2{(irF}vh$=d89!PQ4{f%#vǕ(IˈGb$VjZTt剒IFrb2\2#|Vbԥ[R6* F:`/ .m=NCH&y 犑U [H8ZNJFrQ)IJyQGͨKȁ[fǓ@3HzJܜiFY1hCѨ/.ɫ/~,PPL3ChrH{Tӌ8!QD(XM3Hn1IFR@d$!kHChhѸ>)FҺI_dj;4v4 b$9޺IFR c&봣(Igv$#)E1E$#0h7hKbL[CW>I p.T h4vk ID1!<8{lX BƂV뚑@81hH#퉚 R)Q3f$' DH*.+jFcQwHM3wHЌb4#`4)sv@Ĉ5#4yكf$UyhM2C$#g(M#U|b$[|Bh8uH4hvS4L2:$)hJ?C ќ7&L1a+F2v\BHf0fQ\ќ?qhJNBH& P02L\(}>'bPd4e$%#9f@d&-t!/uv4׮I[ک!A1Zb#+,P."z& m\ #5Bh?~B-I(X$4h.IYQ >L,͊E¡0Eh"!X$EQ>Z䥏b\zcLHzA AVdu#rH Z 䠻HE>RѲaKEю"փSE)dGHEVEY bE2vQZ$І:CHqASdZQ?Z$6*EI4H'@, g|(EMzx@pĢ6nbp""= s!@HbpŢ\ҁX$fcQ,S,RenBXԎ{صT,Xdc&QV)wE(YS(CC#D12Q;i6IDųP&jY&iP| Q&dM?1h4hP%Z6A*ŘPÉeWVJ&]%D@auTaGD #W`(5D\$g0hM*#&h#E&SOr"Lo(I8[FdWF$C$j;M$j2q}S63M%TJ$^PmYF;}UnճROvRDhd2Wvy RtTf\):{,-yL7p>C(Γdʲzxcci1dtALFK&ph2:9L0#} Ѿ0n=F2ˎydqY6T،lmF E،,'|FѨ\%h.;9,(FͲ8j7F m%sݖN#ʅ(!tݍ4VSwf52CXX̆NӽGtM&FP4bB8 U4ZFHN#˯ 4< iԊF_*ٌZsՈ6fԦFf3jfmmFlFی}Msh$یf3,hHzn3uiiҌ}`U}F%>qq}FFbQr8ޫψSVa3ی۲3Hڽj3w0E]F}QuѰyjsόPw NHFG.#Ând.I-Fi2Q f1J-Fd7I&MGT|>f1"#/1W#?C1Zq%#Z(hjijQ+E2¤DH8*Hfi(h_ -[v;D,F"PH{H-f1 EMb-FTgG+jb-FHƜ8,F2Ԃc#oNbGyP(MSc4Mw1m{).Z4fM{c۔35+n2j&#(4f1_$C"i"˶Y6_]10;_dh/_>aEJ"K 2"я/z3Rv E߳pLs/y"idpfP\d?,zY7b֢f=[KjOsXcv:>MYu+eoūtC?,va yWxwݏ^v/_^OKqMMqN*r$iV{$"$.D$K8\כ N˗q4?x{S gh)\yBn}!zU{1du PH&@!i&C&Ȥ]JpPTL1 &D2ID"PHK[D"I$HD"ITld@!AM$D]7HRKeNeLIytD"Id@!AmN$D:H4D"PHKD"I[HD"I߅R L<D"PHj$$AɕY>d PH@&Q?dҭӣd@!b`D?H2)A2eH2 BTDL8NeBBC"$f>ɀBB2D"$GɀBBD"Ȥu HD"PHH$A #PHH$L PHHH$t' ($Y(sP782$A2]H2 'A2H2H) (^  [@&1%H`@&11&H(1e45[6 (sD $ 9DfH$q4J@&g(V2 CByr e2LbQ (Q"2IR] ɀBRa(d3d@!=% V$DɀB% $$ 9Lb V (V" i9LBVpPfH^x9B% -$ x9BBNY"$ɀB%n c"PHvdڂd@!YPHvdd@!YI*qs™D $ 9Lb^ ($$%B;STR1j\@&ͻT:dCd@!5;HD$ ոҁBZ5jv ΧFҬqD PHFd]߅!PHdɀBsv q$ i2yA2Z$&ɀB>z2@&1;8HҨq PHF$e;ɁBzj@![:ILc4j@&19H?'~g 2߅ ݲ< PHILlĜ PH*3dƒd@!/;IkD@&1dVfI$ y/WB;S 4LlDm (^:2@!=% f$d@!YIɀB%n DS i9LK98]($I2ɀB% QD 9BZ% ,qsDu (^2ie&6Bj% VH$};ɁB% hK@&]g-(V i9LA=Hz3.wWL%ʕ (Vcf2 PHO(Ycf2v PHFdg/Yd  i2kɀB5^v d(^#f2k%ɀBjcvV$.$ i֘ҁLJ!1z$.$ 4BZ5bv D (Y#fW(QJ2 O ~ʪ1U+d@!1;IX3 (Q#f2dɀBj5t F (F,sdҮ=WpҨ=d@!I)X#(](O(wL8IѲ4jD@"#NrzH$.O$ xفBZ5^v FҬRd@!Q:I\G%HRL$ɁB5^v K (^g2 ɀBju.ցBZ{v v: ɀB5t L (Q H$[IRQtL8PHO+(Y $.$ iX2ɀB5jv B~*E|^W\e}gc~d@!: @&q= PHOI* Vu P (Q;f2KɀB5bv l"'9PHFҪt](󽜆3+'ǀB5Zv R (V'(Ue27ɀB5t S (^#f2u(V (U#f2iu(Yf2QɀB.I\*HR$ڵ:PHO(Ya$$ i~g2@!W:IQf eǁBZ5t W (Qf2Օ(^;f25jv ҪeȂd@!:@&aw숼P;SQfaw/;PH:$_*H,rՂd@!QIx9BjE" V(Ȥ(W^+H@J/R}b_8U#ޯ[(%20]:qV 6I:*g8SV'uda ]3k@z]AiyEn?XvUv{̇︍_*ůI?Y"/-_Z"IDs~aa|5;o^_z_X=]ݮFݵ&r.iWȉUF%{^ ag'NaK3kz≣N)65c~bww4<1/Sw6l,JpXL*ap,] uԟKb'KlgսnHd m]<:KC<=үf>7²Vwb+aeE"ҋϴOLdtE)RO^4Xi#\xR,tq_`VS؛~IjQF"t";W)ҤG%űnP>1 @zv]?qZXGGa9Eѣ тl:%un1si b=ZWw`bV~nxiKa wB1MVH[&JGqK.,ɢW>c\Eʈ.+a}N<W:Q b&SXD]t=Ȑ:_1BPn]DLcʡXon6 ZVPp E׶Цp! m)U+I,m ."U|^чCDׂ{p`/,π[b mVC ') X s%[؇ ls^H'G*PFq5K#6Blo* zK_BK>q; U|l2iK( lxIfϣ`PpO _2DScf?oKm@CAvAnݫbL۵"Îk=l@/ 44oZEFnHWV,R'̖͏J/17NCn[!BE  6On^u'kyZ405ɞ3RUMorߖ%lۢ ^'oʹXSR EV*yth)P ~lT*HC33Ĉ(ijRN, GdNgHXOHi]vx-:c ~ [%K/6qcbgf %nnw{7 F!Dt62߉"'.IQ\hd}#9bTdލQ#m!M0;.%B Јq[|fA9 |f8 p8𶽴`!o~_\y,-(#L׏8cac4&HʲSئ`1 s ,dc2\Cmq}7ئ81f`Ǝa%L0ݲe*4H{!90Ӑ1TQ)>`,Etbi!/ލpwKe-{45BҬR&Y *448 Q7xeDMYy,NRm,Ofy*7SQ6JY,P|6הTA3̝`SWP{췩QMTւ,ΠhL?UIULUȿ HL:vt"H>Љ6iCӉDtXzSD;(-mxh7D7(GЉtaʑD{yM'H3 :-P(QmYD$hSX}mF,:iZ։ԣNtSh_:n&:Q> :-;В m۪PtsthPtNqZ* "}UxY| YL:RH͙atF :Q <&@'G:- ѨxS't[GA(yo Ev-Ef*:1UA>>B':o5 ַl]M':o6 RFlR> )0AQ薭I*P(3 "*@RY<*E3*ElJpBѦ@(* Ej#@(c2B0S7< @)>6P)kt@6tJE{vpRF:gS)ݲ[ED z_bm ԊyL,V9Ģ[y mNc)X灺hSNAE칀FhPĢ}iAE GA,QZ۾Zșբ4Ԣ浦mdP4Z?BբX,^TnHj4NQ-ңTPt"+E3>q)E:qr\@T,ҵ jC"R8oG* uEyPR,*ETE6}S&erQA뿔řbrFEu=|t:* Ԣ[*!fũmřVEAGRM1K 1;Kh?Tc%ZGj>jP-wy'b-2"2HŢt}mnnZQ*mP, "m8)@,Ҧ obѮ*P-8tArQF iӉfr6-Et& SPv\墛LJEh0 rEh8)iCr~r )i(HhkRIQd1IF;FBRH0+ՌŽA3(wH'yhFYn7@)h}'$cF}5h3i thMjhD#Q(FZjy?x FY4%N!~OHσ.Ѿ!Oᢑ{TOSniWyfHSvEFFiteը %P5νeH{JT4H蔄Nr=q;PҊ<-*G]aLh<ţhMv#)7"GX)GG̊~k$z3׏;~$e GQg#P?ڊ~t#b3KH?"fB2B~GmQ@ȃ-nA~T+Ҿ sH1i#L12 * e~7{ OR 2DDAIK- FQAxrq@BҪ-R> A i⧩?t4А60 @PCҧB5$?|=jHzAUI'CG I[ЫhHjlLD5I:DHi\d?EdH4HR_@E7IgPk("'7ً"6ݩ"jQgVv{0)oTvQ~b*>jOPcY١]YU X[OIODŽw͢HYh:MDe+&"e"RATDҲH CC:a#I% GЏ9ZHgUi?~#9 G™E?.ӏ~G򉏢:MQ'&.Q40ie@գ6#uțHS bzt4Ց7th}8V&]=rxtfL_DEWrite'P(y~X.}|}G |t`#yE#T 2=Gvϑ{s{,6,G~9r{L={W"j4Ht^"0(#㲃tCH.MGݙ|$A|.y,l9&Tq7#)Tt G^]= գgt$ưܤ#MCH8ґ-\:{EH8T(Ipdߑw KȫG0cMY> G InjG ytL>J7ƍGq Ss Im,Hfc$KJ$ Ҡ-Hnq9d^8 Ҵ% ]u=HWg tE{.3(~(<b* =L.cڨ{N==H25$]C)=Hzf XԐfiHrMC:!Iλ$@2%$ i͡)ED(!SNdfIH~)SddPA:) ɥД$GRTt0S|\ $Sw$/$F$9]$= g$[q(!I- '뻄$&!I&$ \B$(HPdV $kك\ I;}JTjW:gv !x5&I">GӎݘptL=p$c!1OQ84GвDHcvɬFt# tP{4T7 SE|4]2Qp n$p^GpQJpGhTN}41k#tH>dՍ$|kFS6wG)u$F4j$yF4TӅ.F2;{P$lɓ._a|JQB(e W/xti;I9XCȵOeeIo$C({>c_/gka9iFX9ɐL2H&1"{J Ԯ]osǐp D',G5nJ*db),&EW&¢$cfTY:ːʢ*X@ ˔`),SOE&25XD*} ejl)"RYTm Ha,"Eu7)"RXTr^nJqPTY(;ː29XD*sb),SEP'2:XD ˔`,ۉx @@O t ),ʃE\gb),[3XD*:{b),ރE$bOc9RY\4-,"ťC Har"RXhTM, ekHeq}RXfic,"ńRX,"5jOHaYBT HeA8Y,C*k‘bBDTS*g~ڑ²\`QG ˒.EkbUG 6EF),[D6XD*Z5~pmTάу# :ːj5zpmb),[6XD*k(‘²pEBnb,X@ ˖ ʚvl`VG zf" _ITVq#eHeqIRY,"kHa"RY\w8Tz# ),O$%G/#G*Tz ),[9XD*d,C*ՆTz! ),[e9XD*kWc͉KaHaB"RY\9-,"^C ֆ²EKaHaٺ"RY6$|igRX&uTx" ),[:XD* Y'%pl ,X@ VuHa*"RXvT|! ),[;XD*Ն,"w;ːʚ/1!e|HeqRXx-,"u Hab"RY\`<-:,"e He͗(²˃EKaHa%0yTΪ1%ѝdHe(²ӃEl9`ERXzTbO, eKHaٲ"RY;RX/P8.|Tz ),K ʚ/! ;ː²Eױ!҆T| ),K, ²d`),K@ z,#^F%HaYFkeHe=/Tz ),ː YgRXI,"^zjC*kD-,"p!^mTz ),] XD ˒El`2jHe~ڐ²] Elg`Iw;0#J?m@ؾA"RYO),?!XD T/ʱD:wl`),۶!XD*9VG ˶wj5~pl`),"XD*YVG2˷p!_Hc[MHaYxTV#eTHeG8RXU,"e"RYeHe_;RX\±d QX),Kz5p$<9Y%He[;RXX,"kHaY~rFUj),7$XD*ڑ²`),9$3k Ha= XD*‘2Ad[ eHeW;RXfA5p̪,"e`YFo]P9 ^L"RYKkHe͗‚"Tx ),.2He=/!#EFbRY%0`,"9VG*kՑ#CHfARXpdj/m!^bC "RY6YTVsTz! ),X[2He͗̂&TNY/=!LfARXOTV#eHe=/!5xߑ²݄E^FH @<&P96$|"gRYή:RXQTV{ ?RXUTV,"^C*k ),w)XD*,"^FTzi ),)XD*kT֑MeHe(²͢El`Q),h*XD*D pIUTxiu ),*XD* ),*XD 6 /!efHe򍵜eHa/#$3K6c{rHe²El?`YyG /1!^f),2He͗vא²łE^B,";9ːʚ5ڑ‚0T֨Q0:F2V),%-XD*kV{q8RXZTziu ),ۉ-XD*k ),$cHe:XٛYG 6 ²EVͦv/Uf|]e~]i}]i_.~:u3_3u}] uW+_g'6udUٿ᳌ŽqGV}|VO:ǧ_8_o乛~YO,$,w83_β{r'<_ѐ=meg}8rK> jB%˩_ק&~-ЃwH&B?gJmMoKjf}Q-/6FبbZX_lT 닍jf}Q-/6FpبbZX_lT 닍jf}Q-%u}W_ZDI~i|?8O@T-ſb3ooeuϲ{vo5_ }i;~gY|73WG 9o9r#x5dv3-$ x؁m%폕Ӂ?*yMJ.AUpu|eX oxſޜ T,}9p?vW}_rWv呞|=.Қ*}}C➟R7!OeC뉔&4+k?3k1~ԙ ].з_o+"2 ǨZ&Pw?x6>6G݅M^˲#lGn1|;M~N i>>}اϧD]J~_3O[:[bk+?K9ܽ~mKGw} kS_s}iuQ ִ[mow8SV3[UiOK?_~g+Sk}Gku(ǫ牑̿lendstream endobj 408 0 obj << /Filter /FlateDecode /Length 31 >> stream x+T03T0A(˥di^b2Wendstream endobj 409 0 obj << /Filter /FlateDecode /Length 31 >> stream x+T03T0A(˥di^b2Wendstream endobj 410 0 obj << /Filter /FlateDecode /Length 728 >> stream xXMS0WVS (Vo3P 91=$!Z}wEyt ~{e4)|߽a"$Uj({#w֩,s%E6ӹe&U1N njgT0+xH2w}%cFFҴVC6{ ߋQS[ުĦ\씧athĨт!Q~#f+шќk+8ec (2L4_T`KK)o6Ost0DRRm >]RP%9ha{6i۶hP8oc`{Ngh:6cuq[ pH#ֽ۫S/ VYoįŏGXYX8 yIkяBSxv"m*&kT% >j;7s-m(( /Αd2Oᱥ/]%πm9 ]WzҟpS_q]lI ,tR0Hl.M gvcMNA [ (h}JI^˺Du\{ВD3`sUBJ^QLb\M!z\:̅;~I{e}Vإ^H5ڊH;D]mF4:Ү$reeWDG Nendstream endobj 411 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 229 >> stream xcd`ab`dd v 1400qH3a~',lݻO|=<<<, }SQZ9?$H7?%(O! ((&>r﹏ϊ ?>'hIWUUg n)^}=i9[ ?]ACL=sa弒ni?|w|"{r\y8s>Uendstream endobj 412 0 obj << /Filter /FlateDecode /Length 31 >> stream x+T03T0A(˥di^b2Wendstream endobj 413 0 obj << /Filter /FlateDecode /Length 31 >> stream x+T03T0A(˥di^b2Wendstream endobj 414 0 obj << /Filter /FlateDecode /Length 31 >> stream x+T03T0A(˥di^b2Wendstream endobj 415 0 obj << /Filter /FlateDecode /Length 31 >> stream x+T03T0A(˥di^b2Wendstream endobj 416 0 obj << /Filter /FlateDecode /Length 900 >> stream xVoH ~_ag$‰kԝ;O5Wɫs"G'gXWLֈk7pW3X!W0S6^W6$Ȫz}jD\&*Do4ƒ ])đITZmj/" &rB4,CgsK6-,7}ͳ6M~z+5C.*&a\p`ʬ 1B4.Hi%(A0 dhh@v|C\Z ȎUha4EcfV^FV$=Vf4R)rmr"+E<(~;zXSae4$Y: 귳DE6^;w٢;um?fVPvH*+ @@H]/WN=5=4ךrd]esY˩I~)\ݯNu"_r6 ֟nROW2 *jwhon>%`VrXs]/zhϮ2N/kT8^n {cSw[v> stream xWMo@WyOZ%@Bڤ=߱c{f.MP~ٝ7\0=g| 6.2ز{8+ 湷Ҳ)k_RJH = ]({(އIюYx協W5J+O4f Z+X׈/}{; Z#:Ft( :G@th#{QDKuDZи;lR]Vp*. ȨU-Q*υ mcl˚ͽ+ʒ "7{7R{DQ>3M^HQHm~*Z.n Se0ݢݰ~~Kh[Pϗ&7{ToۨaRKѪxmQ9&AKL$h}707#L`蒴C4@Ed&x^yV/Uznm>gBtAendstream endobj 418 0 obj << /Filter /FlateDecode /Length 2072 >> stream xYKogulJ9%EˑE1}_wUut"1xధ_}USW_>nTwemW~]g{;7qCR* @?m^_mU07۝Uqee>zt?GZEHys1Һ6XI[^``I_^ߠ 1*wS*Y4ڥO7Ň GZN6bXbv&lo?mp}'_&]i ihL?+~jp07,펤%,FtWmr$aoxQ }[t = tCT?|ϠM+1¸t@`ћ "j u Qހ2Pc$3=/.jgRb6%ѻy'@\1Jp_Ԁ_f JAE&FV@g>+"_R:رϠT,i3m1E.!zP@vxQk84 h4" !c);b baBԱ<*lڠs*Ih<':CaPQ[Mx? AxY Sr$&eG Nfq2w5JjsZПZD-ܲ܇yñL!Ŧ[[F$)S0D <}Y"55?l PZT- ikԏ"w5c|,[k&=̻lJ7 6gpj%LCܙ]`<4$`2M~MiLI6@s[ij_ɵeeKP\y@ rJBxYgl? IK -k[wA+\ɸӀmȾv4g͇,2H,Fb/,1,6/nR!\D0س=zќʮ֢vNT4/M[ָ&pV#y jRXqjT纙k4WM'A(㔣SZь)xIP=Q6ti|5SH֊* ;wEbʓʋ@DcvVKd#~Lk [e$=r!|^^jݗ$BGh`Ą^ hsS,jW,Y&.vP':R q"腖9 PJ!.Y,1 :H[7ǧVZu=u M_K#[5C} 4~I@"XvBrdUX5̴:pgh J6vHxМ-rlx.GByT=P9Ƈgg@](*G,'T#@WTL3Fpd42˗'Cjl ʸΏ DT[ C|&&%?FKyW2ٖ":"h2KEHcI\ eHnQc!2// `E=~u ++2ɂm.^(ʸ }=665OWg!,G?<;zBJ8tb-+3<ऀΡ {e8 >; OMbh"riУƱ))'sZ(d|%XZ8ʏ*$RT67ʙxVG }kq} <6}g]LJn\9h9m|IyyXt*//Y e_g_y7 U3U;E[g? !ҿ7%>endstream endobj 419 0 obj << /Filter /FlateDecode /Length 5286 >> stream x\K7r3#jW#-ku-Y"Cs8R$)I<2 !W Ԫ2ѿ=3Ճ~9~K=+|uo|fއ.>3>w.]zgݒǻso9y:O%+ry~z #7b/9'?A`Y" ~.]ſ &YL pB769 ӡH9/|flrHa鲽 9Sw$1)nl(Wyz$f Ř]HvzY3y0RFyn~&o!73s + T9EŒ !سsoaD['Җa&mcM!Ov >۹e^TZ`7{98OOi 7)%3g`L+>XPS"4=ljȰX)('@_74G9,c/48Z-2]Ny M2/ĤzzeBoWBɎ-,(Tea3#M9ŭK7kx&!i2k:<1[mr(c,,<("VHX!-`*=M5 fP0ZƯ܂ٶaں};.paBA÷;W Fe5{~TD:o8*FKT &@v|#No",x'/ovuw e83괯a: FW.+ "-.ٙ0y}NT½yKψ*odoYMhe < {޼ af"G8WcH֡~dF%~opACUl^ ]uQoq{,mܭ[$@p(~wX"K Le'܇#ۧIAN݀G  ))opA>Z}eVᄌQ5u ϻΤ% ~gea2Vme9"s44Qpf!iyQuE/B[.={[aAZzNfP3jSo6Z SSL*F+Qq`ȟ͇nOAN,2_쒃[cUl)ÒD>v~}-v[x9$0q/päAJ"l([u#%|A?StU `? p\̊d,!Z-\SrV &\@ Gm aܢ9֠naDEW>\ARZ>Ǖezxm_uޖ kAtcP+6IJ[b{7QF%fCTQհ|c ?İj`OʲתiuVSOL'(nQ=<-˃ { D8Ёv{p`ׅfT`t끕9 zΔmĥ'('#~;Wxͼ427u ܒnt! -I|QWĥR"V;26QN3Q!.%##`GQtAA7 X~aᎂ,#A,#;XRcg,xh^Qy؀͠8/camYAim`"\/gGIQ&U)h|&iMasahPai!2,m2ET!|gry4svZ) $Փ \e=C"YmAp<Ú`Os*l9ڻq5UiKhOBoUdv|kʬJ$Ɋ}Gy K < I=JbI)-ϻ<-nkM#J싮n7  'ts)2˙"uo39jtxڭpNZ! ae:R.:`ӞJ, V[dZ3h]ǤMgT1wwW}p\TvxD$8-G<6[' DΔH{Fn]*nIS{6*B=DI]L91u}Zsu<-acV>P|)xT,*(h/i3nvkm8c{$7Pv2bs31lV>A)hbQ (%I4h@46ȝ! ,`"Q&BڧaCu<*oU[u=o/4;z)W ɷV] Z.3~׮5wa^ۛ)iG&b`{k ZY2WѻLfhl?:: 02Zl 2ԉX:[8Q ꈥRX^$v {[P#ᆋ61<p#f)wQ3$,zůHW*JQ.:p_0C=_@&⅗݂ц.q2⚦D$'doق!X ٦( rHLCozh.ojѬ(3SWiSs-ֳe| FcyV^]/:pJE[~%(>O$V\!}^øݢcRbCAM8+Q}!:(xK^BE'ةV㭌nY /K~NBeyueKs YF-}-]AǘzGLq2<-)qlf-+3MJMeHMҩm'7<%[?-$V'5ŝoPsi(i8,0܃wW<_w}S@N,mt+_ ! %˪cHyR?E>gCTu^r5Vu&BE\MPU=3u7`P QE -ysoyX%N7IWHxـR>^?pfE0dڶ#n,OZ] ƫ-ڏyV} &"tAx,-HR@cau5F_oHݩhCQ*Mt/DI--BT/Mq<;pwO`jNO\axqX KoxƯ"))qɛŠFqX;;4yTKЯm?_oXMX:X%[P៾qW/a BlNqP?џXq<~#Z+UĽ.\Ȫ+B֎#_ o^vmO[Px ]%Vw5lkamʂv??,0[endstream endobj 420 0 obj << /Filter /FlateDecode /Length 2951 >> stream xZYo~g>a߇+İ$@d?0$E6Hʰ =_uLWRAޞ:F/Wz0+MgGO_]#S]]>>ae|GY뇬*8[V'GԓkuPlK Ʃkz-²F-ߜ]cYw'_Bͪ %Hdcj̐7٥n@רmBN}.'S ZczUc֤]8~j2|,vpEސbu1e՟ݴ&N@hBRW'!{\LĖ;SAܥ*JV%*VCI#Y4,UhZoM#vKyrKt-eW)oڋu3<5 8@F'堌O1F}Q-,#Tup35HW \tڌzߌz6606UDDid<ThmI2 C d5VcaJa9j$SJO{4lE W;Jy"2jA!x/.Hj 3߬W'UQ%NXGR_g^f}lJzcۍ/ք{ )7tjh{iHa /{"夔w3gOprƭrT NB Ww-f 5dxBNs51 pJ{? 2*xD&>i%`OR#!d2?bsVt4WfSY8Y? f NpᣆH?x蟡%`af3 0#98Bn*1Yko٬uU2jac@ףPL|HBde! :0μ%cu>2{!l;PkG7qzӬp>SJ+3n<Nlqd0d=T#Qg[KN8e[%V"+b(1B%H]_[_np|%RJfTVnBB5T$%GZ,R"D>!9b>L8֨OmJ'_@;llhտ2g;o%MY%✶柴* qQ0. ٯA<X,y> Lb; .Qp(mIqV#"09䬣}|3. SP=t >TȮ:pjFg)xw^]PXhY[!H.:Hշ76Pcn>Bj/y#L`tih9a3iǩs<N;ſ|HSQ$_CX*4 Y35Lj@" _;̖Γ *;Ma_1hׂpgN#TUo |'Qq $~/2Tꋫ 49@ժo}"h>~®yYM+RvA^\h9S[s6[\leXgrx+0eU :Z(HS1Tk8W 5Q8Q87C+EjXpr>iDsxMջC}SN(NGX ol<؁7㈤B: Yn^&cA6$B/CN_ↂn}]eSidkV3S }? endstream endobj 421 0 obj << /Type /XRef /Length 360 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 422 /ID [<80baf084a842189daf0fdd052d06f11b>] >> stream x+q﷽bBC6.Pd"%'%'Ʌʴ,"9 Ғ~w'x>=={5%QRb)»bǝIST'?o:{=bSh-{|6æ1KYag7윁 Xq[PB?X e 7yD*"2'`CU5jhqt5t]:܇.럠v4,LnZ)]sxU}]"s;1/LYl7 g;mm5N%{cBnӗ׭0%L: endstream endobj startxref 725201 %%EOF timeSeries/inst/doc/timeSeriesRefCard.pdf0000644000176000001440000026055313612573123020206 0ustar ripleyusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 1396 /Filter /FlateDecode /N 26 /First 190 >> stream xX[oH~_q^JMBa)!Q/Š 4F-;8ura*3}2HHIRJ%brddB1BRB"KD$$O[KJMB%`P$]aG2a嘔񄔶¤, R1&o aE*4!--//_Rgt)Sg9:߾z0>o8,ʻ̗w~zO _=`2gUF2F<OI-S q/%]#g۟h):|oQOc^|^Etʩo/DGTf/|>d/_JQh ,>ՖR~VVedi7z.=J HV>|Q1O|}Qk?y+rO/|9;)6JLy|S:>Rg8ҏ*܇;AsNEvͧ%+e.-@jg}_Yx.).]㝋2tU5/Y6'TYu6)ɭ"Y;R~a$a!UNth|wI1+q)v,'#kTnNVϧcFƊ}-l;p4e ' cqdƧj4zxmbdv FGW6g`/lm]VEl@~2X%݃} ,)ǀE)$`@o`z"!ЁL(AX8!K6]P J)Ccfu(UʶwhqEDQ<+TTe݀2h!+ܭ m.GcuӚiw@+P#_> z+2\p_-—oU.ӮZm^?=FZTIeOR6{R?H#I endstream endobj 28 0 obj << /Subtype /XML /Type /Metadata /Length 1509 >> stream GPL Ghostscript 9.27 2020-01-24T14:51:14+01:00 2020-01-24T14:51:14+01:00 Microsoft Word Microsoft Word - timeSeriesRefCard2.docxDiethelm Wuertz endstream endobj 29 0 obj << /Filter /FlateDecode /Length 5811 >> stream x=ks9r+hQ 5xٗzȥ%TJg>%+w0 !)Qu O6O닽?ѻ뽟DQ>)bFԆȑ]QRʩ{tz1nb R.G'1K, IP\콪P*3d RjʿV3Ȭ(41Fj<{#R|[ `6'o{y#5$,֊2X`6!+iփ)7(\RIb( hBqc{RYZd;Hl>L=gJ-DKۢmCW+o[ AHXKX'M-Vp7 o%S#*)̭2+KFN [$zFŠAQ D[!AQi fi>`±#7KCrM9Z{ L,QG-cJg31efb@aGz(+7үh#3q_LDȣt껙?T'*TYP*R9^nyٿ] M>D&%YK~c§H2и08a-d`Mcȉ(5{h 5qü,^x4= ^D0c``0EC;>h]e1feDpT9":UC:$iãnTp!f8a!c~` (Ÿ:5l(=}#L;$mXx@}d$;H,NZ6' KvTב'M"8c 1ίx1B~JA "NӠf;[U@bK5R^$ >O,}䙑0'!|?r8F{վnqSZe< Oi lIU2=p /E XuǏ-0G,K_*OK3(yHŠ&3l Zqyz2D5y1 ,k;/~ ijSgpZ ƦVBCBhQ9\9`ogWg7K.kWV^-")%Jum5ΐ%`][SJBd *C( a=AU¦iΔ2!GO;b>sT2LjCQ^?Fr39ѩ?B0hØB2:Geę_ $+ a-[MjQ.`ZQ/W˳7&7 `3N g(hw X4dly}˒fH *+(X r(|}/o*ny8"ZȚ@8ETeJ%LKz!X!Rጅg62w9 ShޡfH P;c(Y>JuMPtl߸Ċm 27?_X^qju viiׂO45G&GE( l`"|`Y^G3I޾f)al]>q=lm&%dzѳ jꎨZk.(Ś>qP.o4n5U@{l3JF8K!G`4.JoWn纡\rٷeeVibq3rB.<+\XRܛ5bg}R,I@|DQX=`AfeiN)04W!aE(${2t4#srApOfa'S鬁$C In#z#zVfק)QVYQ`lo?(oҟb!o_Cht,u_w^,}Sy/e}"z9NhSB̢(.:O8FA2sF|SGjYB߇~64 MDyP_tb@xqx|0zt#w8vU|bd(Vtҕ$-~$I 9<ljۂ4iQ=w8]Cx];bϜ0] 0.?H8ןǟeꃆD" ;ce݊Z f!WM[*͛T Uha5f/+S/f}+_ƕRF0i)O;:{Z!e4V۪S[iŖ\8@&ر)Z5GzuCn-jrm~K k..a#̛P d/0}[9{ؓ|yݐ~MJO{{nص̗dZ``.eٍ- Ė*1@TSmJH(X\k^^iz%0voK3p\#NE6q=] .x6jlۄy1Ɋ'7l)`˵ͮn%z;y@$3q*hE_uYnb0ې3i͗GAԿ9x2ޏbyy6Qrk`9nU1S,#*"B} 3Ɗ4C~;)>cof&~s-5hպ=W+'8h"6 ljڽ>j LШjmWvSE>[}&z/ՅZ4Rc$u&˖F*P2o}ewoR1{ySk@ Á^j}0EິhW )7XX8tZ!RG&bHs$9˳[_bgEkS4kZ.81նٮ_q@a4NQ';^xEz6R#{ UNŻ~:J[ⳃ cX]xIP'S4,S` ݩfX;Z6xcz:Z-}6J)Y}=fcP=i<_$Zi)`p5~/[%kJ4g.ޟ'd^+֔K|mhٿ/ yOWF£˫w(r>- ,]{&wG`bA R\KŘ!Kr?%8* K"b? C|,_fNi|c٧ԙ)1ցWdPc|ZFsVWg6GmwsU)Iv{~Qꓕ5L(?D}r)Z:8\Wu;>2iU9j7=vcyeGaMoan{ƚWt/t0.P)oU-u-l҄/0IPFQ8pu{q\I^}\M4ankfr}wx *?4ǿ\/oֺgkj{.sJK?*%-8@7.,o]^ -SG_?/Uv嚑OZ&-x* \tulc~২* vT^Ur >\UQ4)JpȷzyRlwMi]GXXN&~M~ޘncv)?U9rGya*̂XWB`KmE%c (߸\ɀvxS/ξn6&6`#6)6XXЄ鴗&ɗ>Dd(|Gfi㌻ic 󟒍I:@*MN4YME^XD3`ჿ#mI pMlHIvjP\-nF߹Z5ܻ)p;kmLAF(贑HwlЀx4 5Bd!]ؤ-\h3>|+If+(??36Tendstream endobj 30 0 obj << /Filter /FlateDecode /Length 367 >> stream x]1n@E{N <0 ؒ5ӸH%^€0.r)R|cg}ٝ/qX2ϴ0vKM%1+ʼ >㵝鵝~攣 ״/.6Svc[ߒ?J4`iH911# {kcP|plƈDJZ4֎c1# O;GŽxޫVHto\V᭛{oVwWxNn#oUtp7:U[U[TpU6~ Wop}ҷ}\}O3 ,i\9BaLs> stream x|\ŵgWڦծJͲtfUKX-[rô c@hjB x.ؔ!`B!BbIhw]Y6${93w3gܕM(!DKtvtG =NYzjLYH=뽘&/SX}YCtW`:rw-&0(JWCʳ֟b8\u檥9ph:k ip~otU'^!(rji4>K"ZI"#VB&N7{Hu4C* LL~btEk =B&r5,=Ye\ΉNhj sFK6br)\N[\WVr5\K~@#דȍ&r3!Jn;A$y,}'$沜} r/1??Hj0h"?}endQ$CGЏOB>%&%49@~N!ϒ_3'/E) KD~M^_;D~C^%%7a6x݇_xʼ(3yJAI,e~/+p=Lޡ 912 gn{Y޹W3f=tT<6~xʎf~(lr&ll'X=O]{j'4~ L"ZǭJeY'mϮeװ!DҌ=_c#1\<!x) H}]{ OK3N& <8~v\+J b*jꨞ@sbz*7)EM 5TVjꄸn>>->?͠DE>uJXͦtC4L#p^@i -Ƀt!+!/_d-$Kș]?ʈиxQz=s:;洷47nl%TϬQYQ^VZ ft-hk*B.Jx7I<bpb UebĒ\qRIK S%[Er ~o`;Jwz76&璠B+ 6^90PUu媼\2RébY#4'\VCGZvh\mw|}ԉudu1X4frw$F d@H̿lpaobP,_ yy,_ ֹS71iNO &4sN#N -X[HĶtbK8Dby2c-ɜ>U ߳Wb[xro~!Kd\>쯯GƄz8013t"ձT-iݽ%bu124qU,Pm]{Ibsg)&}1KtJawيg s }`>>K~C,0'Q s}@m 2 ]bhm:I%QP$@]٥uMN_?IDbZ]PL OY 5J&jvr ֝M,>#tT#X/ڼ1/^lbv[R_Av2Ձ6nӳTdwXof/ xhYyb~8<8:e nXY7/wV9ŶnBZikOm^.Ğ?kDw kY=qru}#׻K j9eJi.$by^-bDT饣:ERGQuuc$J012=cX+ƨ8dʿ62} נ^rp 8,& !NC'EWYɞ^AX\m!ޘ2_hr zvlAeKmBjP&j5ᢥ7Ё[  '!FX4nNc*pF{Q$ܬ$@˗!k-!K1Y!Q\.ʙ$Z)P!su Ii@ׇS% 15(8͔ :ASYџjF\9YXŚ!j˓+XP'8Z9{r ؝NɁ9&q&}'+b ByZQ=<~h/v<NcT!Ӝ?N1"` +R: RNFL4̙9+T7xiK֞WL؈%?}wx ""F v#v!v"∑xZ! O+F|C|>=ĻF?!ގ[o!-u?-? D>ni4^GV[īXoCW/ce^B " x/?xp/xogXٓ'#CGC]%/" ;G uMÚ9@~$Ssd'ؖsse]NDbцhE MوFDap!NaG1pp+c GA 3OW?_Agw@6[лA^y ρYg@~riQG68x3qеC\*sd75oZ]}mTx-7㳵Z寥krPjڌFVdhXVX˯iZ]}UcժUڶU V]gJm^Y?E~n@&j>nP17!L3!N ]ˢKKpt}<(J'wEnvD瀾=mm 7E7E;pc/ Bڽ}-QVծî#.~uڑ4';.p\p`دoK Y%[mb%a2rk;|~c^COwJwVxy 40;"mFKmQfd6h:456 4ƏU*NPAI%7^J 5x#j4?P)HOw(:*St.cnvdHtJ\]O,ӗlJj]1Wwo.W_kl dNkBjB [>.E@~~EP8ֳ +aH,nh^'YjX?O?7c[H Xǿ!Ii'sH~w+絛W$Gy !$Ȯ⻌5R37Ays13Ɗء|jEIqrLOs%Ңj8Oq/*ts|jRSͱ4o6ftHi(` viC*QxBYZnhIQeLseT@Wp)'Rݱycw+z3djNTܑ6glRH+:UN-UiVW`|X:yT4 yh^1.G',mZb:KP򧫈WF0SDCSx&ӕUZ ))QijjjR"#Xv"GX!G;l 6_vXԏ'6c7;ܭ ? X,oO`iβO2Y *ɼ \U 4_]41({>BW-1KyAK%:Z"%jW[LόI)xH9ٖ~Cm6 {,bo7ՎLX,(g&<AUlcb\=@plߗ,1$fn9tTR_}|aÏTum3/>R箜teeէTg2s%+s3tT?fVg[&bHyZ3H4R?+~4z{舍 &3ִn ,X)5-z)ⳎհX8swlHa(N)-cEsc&bn%2fP%{盗.;U2^)y7hhUoOf,sSWЙLs84f辕k?ėUBJ['K2^҈4 X.vɳ]nhiܠGaQ(/t^5PemjQٗ*DmP_A[c4eћs3%tކYgTtYɠ_&He?pԳP34@ɾ3ywFaFf 3+#*X?I`.hf91Z_;c!cEE$b31Na11C&#CzX\H+,KO2^ZwC-QUUm%iKV.io^Y*r\V7., !scesWzjœ({rj_ϚS̭)όܩ:rh|Nsu`w I4 NQC ]]hXH#2G)?%b|_+'kEA't*` lؔ34l;ǮfZ{`U"F^Шs sb9ٻi=WCqe#lLL5/Et 34 4?9`U*h-FC[E mrQ,V=ߵiΞiC0h)^r͂92`H=v@K^_ߔtx^1cN]=]2XRPJ?M`e8oj_Մ fs]ǥ;*N[K/͚]0ޛ&}$9 ;qnV,j7HMQ \szAٞ\* ^M'q_a_6} "*[OvfY9.j+(|,n*\Q^TZ*5rI>AؼkOon5}% zToG^ rcZjg>nVP|LDt͂2k%ڥmɈ1}7}"e`p6Aev{ꆛڗUŭԢ˥i.--2d; JIZ2qMrBn UY\eJVDzr̕eU.bAX3 Owj2,\bءϗ[xO my9 innfj5Sb69Pv WUVhvDf f497RN|iUx;l9esR6[>V/AœQn`',o)גhoE>2ʟ__< I+iL%%ɵB.k^===t|VKn|GR3} Tr)gL[s`!# O F̰R=w`74c_'7{!ħJKlEx ۪_7u8@d>Xvw9':Wi^Z*֌CŖ+Uㇾ޽ g\ҘٻO{ D# ;e U5 ̉˼e/W*){k[b哩n$/ c{‹?n} Iʫ 4[4F Et&2Xњ^5;:ݶ~Nj3f97-=W_#іI1fՙ*7:?ՓM }K%#\ѨMylfja;;M.mReekS8A0 ,/di *{Ǘmir̔J#7oq}FuALH}Yij~㵎H v8c@ĩR{_f4k$R)>SS5k4Q%a{3ՉD+[&nw3JTe!U9l:A/fԬjti 7c̊^|cq0G*34XX?LVɒ*.>SٞofA"*L_柔rBNEniHfYkܠèPXjwM~Jws>eK}9XsxR>fg44o)3sBCFxSNST`d=,&ʸo&#̊v 5^)B̖7=Nh܍LT,M'}R'dsA@c@o$7,^9SH{(T\*XX1n2oZI$kv_|++&P=3R,̪XO?F䩯`2a) $FoL)K:ko/Y]FiEez^-]J{*5߲N-5mNK")cm`^~jNK%! F(P(ўGz}tK5:gX^V| &h,pa[V ($}OE=ߍ2O%\tBUz?yg1w;cʪ%|H.~!_ʾYJznnhήΙ!UjR^-9[X~[ڛqlZa"HŝvwI[=V--Ti5iIc"ο)Z"}@fM(OئVGi8MVݪ# smˍ/?Hj * CS @ ozͤSE:n^czT..-?eQWGj''cGHK('f'b%vrDGDAI+牆=]`4N'E/KKI;(_@gVQwI,\ p ͽoYzHlǣU;>{~rǷ*?*~endstream endobj 32 0 obj << /Filter /FlateDecode /Length 349 >> stream x]Mn0`<)MɢU1"d#颋08_Ӹ:ϴ8k5)+}ޏq{8gI9~Hoᚊr>ݖ0hߐ/qq E`oX) keŰQKyV G8:w u`!(*Ë20*e^&ä Ee8\,ho{cu޲VW- x k[^q)x +ۤU }[; B]pz7!е~ިݹ5ϳWx_4m0vu8&\fH |Ფendstream endobj 33 0 obj << /Filter /FlateDecode /Length1 17588 /Length 10839 >> stream x{y|Sי9^uK+˒l_۲$oپeclbc%!$$4K@оAdj2id $L.,-M 8 iw$c1mk0BHZf4wuϺxƊػy#/ $rٺEŝۖ}YiC(ugҞ;PQiVoܒ@[VMWP-M^/n톍rxXui!]~DH2 ~!Ώ,0ѶD __6zz 3!/ shF|5߁f6th.ZV@ztIZM@ '5{? ܊aQ#WnA?@O&t/=oՃV (B3ݨ-Ճ֣50{':EKz/VE$6K'5e?-j#u7GѝI;9z={[xD߆]DtBwOo=?}Vy$zchچ;N;'Ϗ^_)>a-7v9X ~uZ? ;oG64R\v՟נEUh>Evz+0~6Kl8ؤ"ed>HbNO؉5o?B`DZO%R%Z 9&cb]OPq"aw7K_/H"y>V#IccwYW}xtS<H%Bt֍1k>f6sd %(YՊY -אAyH2O?|w/䦇!!sid :;綵hnj0>\[S-TUVN "oaA>qY.3#=͞jZ&Ac)Jˤ0֨neVU;NgFp글 **5!#*ol23Jy2.q6D9'}DSk{rt.e[@%ӣ{ Dьdf<ieăV"RE&lh aGC(6~ņ(6̀%_?v&:tEVF#t:ר[u`E7EOnR)kK @ )U Q n+P)Ck@}z:+žn`a \[3Ĺ"ڨ,nET艢=Pa-ggA{CvEӚZ:AStqaqu} In01uHn&:Em.Lj=ZQ 4lNYWp88Nu N`9a6ne 1wl7Np%+׳7A6bDŽ*#+ɒWm֭,W+W2LtGswg{]ڄq`h׍}'{"ILy 멍 m"Am `F'ܑ%tn;Fe]B'7HFFuu#Mua(U^qj|S˄[͠=9Φq/KxS⨣Vh_^wr݃=KRusbc?eBd8^}kS0'*Mi11@bnkSCvs$ CGrbe n'QCwVI( <3<$NHaӞa-Bv{̡%H`nR31%5ɚNiɾ=s깠WԿz#ё6QyyvN%8NNC* E-ؑ2 :,ԶCTMO"2YkQdd8f"GWN[ʡr‘MV0|oІu:YUOh숦M("XL;[d:;uŔa,?&)L.8} u~pvMQ<Wӊ֞R=Qdd+Oh1fGM^긙ʛڮ+ML+ mz>9xt2#*u-;8Fh7@7E{{:$O'&ӣ AZԋ})zY{" bhO&m_A858D71wD*]QH"%v(dq%԰^'TvsmgdGiK©θ'*Qd 4 A$`-CHѥDX>ORj1Y=c*_%+I$EsK2'IRd>N2O2&I$s>ɜK2o%7IIgIf4ɜI2If_L2̮$soJ2I#ɴ'$ӒdLSiL2I(xLAO2$#K2a\>g"Tc",K"(D?">/߉RoxTgD_i*WDGDX'E<$">"">$}"_{EGă"O")F_,m]"&%"-7F)k{j `-v8hb#~s !(Yscr5`Q0jF 5P u1.кZ#D\p&@bWGR#W^=wu*'sc̺j%e> p`q j܋c/R"V jZ(VIʌYucme)ElTX E 0N=!̡=gq~ǝ7~mVj-[֘~kMFS򕀖h_7>նVBP( p>GǨǑG=tCEjdE{`Kg_0hsiw>}D ԾFg0:&橻;]V8yj[nۨ"]N?!aj ;1u+ԓvk@@PQ]MG6cP?,Yw@S;A<'ooxj3P"ߔtYFjnC材-P^"j1p6J:E*ULHI-DS~3&(? Z=nHKvHK@!`!la*$jҁx˕P&tj1*EMzݕ%;h9p`V)o0A e>A󠣄V]e$KJP@JI[bũOI4AKKD?_% C5P()[PVFQQjJTN)(h9 o8*0 c80H2Hi@`tT @BxAvg&< M@ m|Tq"3y'G22IazzR6!ۓBcjWPGa|Rh&2ક Dh$"BaAD\qeIV~.2 rK ?)!_@({` OxO<gx}慟RZ{z5Z|i c}eOoxAw^rp)·E'F.'RpbO/f(i<]Ÿ] J[mm6D{n8ޗb}@IZ!ψo0o3'IJ~4Qeft_{_?iGLSZ.ËK/d% 4e i?ŏbˠᢿ8(\HC[nZT‡'?Oܽw~ope.0܁z=e&kTboRL"5Bӕܕ+ۓ)6˙fdpZ$a%T"Ez4DkYZT2f$j8 R:.kJۤL1ЯRR*T4UAw)6ӏjԧ <kThQ㽲SW]WUW+ǯD"AXu{=!;~<ށQٳa$ݰ1!3㮋D|R*>x<^tcNs'WEm$m$kx9H$>(D_oyc]`HAZCV7E#Mьh)zJ-]Q6M!!Dն QIuuW| .|p "8p-79Fx` n]ttt444x 2"yȧȥG#Dޏ.N䗑"3#ENG^y92IǑȑȡȾ=}ȎHd{ȶȒHK!RIc?=Ӑ?xн6Q*FM-G*_aqP_̔\(7RBF^ۣ~[^xQvT`Go_J.)v;R(4ϠLF(&,:U&5e[vmu%WmStLf9I}UJ|]`6J<6o lj5f3(L++ 4~7_1_|C R%KQ&Bۄ\Ȓ\VJ͚9hI$533;bV,gcc #s.gYTZY:}]ha%^G`z}No vx<Tj2-& pe1aM}VVfUs;k%͙rϧXˑ*F 1F;Z5)VXVO-ZB@5-rb4aIS C`2TJ)0g)J';:&#kU*+ ϾlsR,)[oasTBb}vof%u˿U}ӸE?} K1Iy]Wb]{fx8٦$d.xlr 37 Ӧ~ry=-~X%plF,X 5-7URR\HyJ&pNYo2QDپTD.7 q_ˢv|N&Ur cWiw!R |Co Y&ϧ6rD Me+23a[f4<6N7yvˎwU|x{u|`ʛؾIo%>fQ*3r,b(SH;i]//5>2 c_K:=SbÎY?Ղ:ٱ6T;2&oFJ嶅K74}%[67_G[wՀ׍Ѐx_c&hV&ZTLZC3!No`gYŒ]jr.d~tHtm@i _m A1A(Cx!&BHz3[Olg;gG cxMۊ7߾iwѼu~QSP`glz;}o릦e)kH'}vڒbaV-zN zfb Sؐa:Eiv8C!j`Q70#lSD+hkci6`43Mɤ - ȡt r/OtC2J|z_P`REX_ϻ<$%ٮxH@1M]KǝiG5oș0suGwM4zcƩ?oKyk=~ÍřfVkl5"A "s%tAAM:3qj1ڎSQVpi]"0mE$8'֪ X3{{#oT7et̽?R^)5#i gY- uXV{4̚FK{&r33d2Ѱ ɱr@o̢ĔĽ|Whń D~f82gd5D΃j+x/ L $'5Cjm'6UGy5OL֙96U0S[s3YcC3 ёZǔJt>ֵ}5Ѻo ʌq.(dcmm1惐TtA5=rNNOuAoҬIltÁ隤P#ehv/?goKWKniQ}4-ձfO|pv7]u#> p+_%pJ\v4,7z0kr7$#6ft!=V:SV-Z/ Od#nJRO]K4$zHpN2[nAlyۤm4b@笲^CQk.>]vp1g u€T(\ۣznO7@^$b{`K?FsИ0(^y)-?0RRZQZնVHf^2;J4z0 AO@7li*ꀗ(YDI GMMsps]FF1ySwJX @hn39TZhl2 d[~p"o!7¥ lƒ\<21A!%LJQF8&b%_R4tpb̢;~ԜPszmxlUgv/=z[u o0)ta^rqYwW8b xpaʁ|*ʧLS]nfm㢇[U=FpqEރ mݶo.Ks:Ci%y6a2YB&ڥraAsrs&Ktr VX!(Jp''+1G_)3'.pdQWpLvDBë]yչFgjl'ˢϚ#2c.H\LgUť̸5k~sa,>Ⱪ^O%S9EmhgalѰ͔Zw4i2 PDЂg# /s2z}'kQx2âa?VI嗿k 3yjɼZ'y orfT$h؈L،р&MPu-&=Ud ~NWL>Mt`fВt1}u< HbH&"EL"HZYҒңc-<^Ŋ^R+kj` LtB┡Pa@M(*Rǒn0N3IgHHv08%JS;%)hSHwӄFdn2L44^PemZS^S4 bgVYdJ#0=-]ê&Qń*\ cp][NcűX3\,A)VMr/X86 $dK Mrru盂tV[ -%S`ɸ'5oLx`%^;jSXX_vUΨ-+4ʆr E~qZ1'|g82ު\Vpc)~ PWU9ކwUsw;gNKx8]6aY=j"c.SFZ.Wzj s=X? ru (xrg.pҝM l)Ro\3b'ż'}/(:NqƳ"N%̇ԪYOR1JeS9Tw:-Р77xu K{ՔK]hfՂEݭ($BPBKGl@?YY@dT_{IM,^0afa[V_) '~ҷjj.kYnYlmU]-mO6-\]W崭ZS5w,·Қ C|~U sPA@()p7,m]\cIyF Am0-fJb5- Jt4lW~" ELHM>37ub`շy^OȇJ,`r˥pew+F>\1_SU0m{9UXP,|i'o.xۈYGi&xphAi6|8*ypӄv4xS.Zt  MF*PC*6E W_#/ze\RbAi(P߸hƒF2j@e0.,S8EIxK0I\ HU%*D-0M=+ M4f$L!u8P/!33|=¬bޑtIHe*y"8LUSYT?TyFe/0;T4^-5[LFJ%c7)bgb|`(HmE,#5= ilȀKR!9JE Ъt ;2tY }u_~ы/﯑GInE/h"/ѻ fZAQ,sTŬDDs|T%>P6,4^Q!s ȑFVѪOeP󋵡?!{|C~ BOWbSe(*@[&endstream endobj 34 0 obj << /Filter /FlateDecode /Length 169 >> stream x]O1 y?J,钡UL!:-wY u$x^n %ִ\[kUZgbIx䉀frA> stream xml[gg;q/NC^RiMLѦwk صSЏW!J2uR l mLnR4L 6:MChL+}ID{9s׻/@c͠672#ڼ}?*hsvܽ[rW[Nmz`:Q1D!B;nEP=@aӮ] ;Sؓ=X3y #{֫}Ym'H*}3Zӝ3S3cP\ 8uf8\52r|Tz6y+RpW ia#wF NpQ{I33s}[~ a0\8u-.vYUr R*-ԉK5^|@!kme3`F?/7p 5 sz# m,zp]8$uɭ-7won uvl_޶vM曛Vk>j2[^qJj)6"#@NFiE8EbDt zԖKXE8u$jAZr}x /Dޏ?qs:K>'~.ZN|jC$d}IZ5;奔<2Hۈ[+ a%Uf,|!j]k 7cʹu(%T'Zq[5[ɂBFQ8˃Ѧw R&'m*C"IcҬpmQO7-"wϒ|b"9ܛے+N$Oq | ҒXaM68Ai8ϟTP *4#4s!NB*NUD94ARDgi'SR236i-vĎ< VZ,vQ ߩ o019JJ,Yp~abf+9>joǎ,Ffz X&`ac;#SӜ@df`.H@pQ5-CDcrTئ!&@>I\G ̢ZQ@V\b:1i=̨+*)n&kF2ZQ󌈤LJ@k!ӏeb^ []_;b@-,bj^UFulYgeMyu6^`Ԃ3eaZILLL`2UIF$S;G[oA6eT5[ mbbG⃾yAķs&x ,F,XVmL'Co4;}͵Q0pRq3~T̜1U0 f˺*ť>*nOȷnIҍ]{weGӻ2:e#)~D{S߳}=Fs`[YpAƳg3cgqJ>B/IwIg9͜脌ю犯oOk牴=qS}D y3cD:h+"8'IO`720]z\=cchX špvnQOg8._v9=5u~F%{X!kDGU]vE=[d.nw8Kb`4Yu"+je-zvGus-`YaY ׍:^'ib#6q\z;1!tb`o[k5A!Xޠ' :! B%A+D-%-R|B'f)N=)+׷>wMsUnk5[f+>ֿߝ+wRݰ\6r> stream x]=n0 FwB70-&N \%C =ױ4wioan[fvsp8%!ʕrK7Rߑې'T Ѥ!Ct%`=rWݑ!j{2|C:U~ *c@#AkZJX3U~ z`f ԏAܵ3WG]|, w,Ӭ]Jendstream endobj 37 0 obj << /Filter /FlateDecode /Length1 15484 /Length 8578 >> stream x՛|յlUmZiUV2V%YZ{%7ɒmٲM78$D I $H a4H(8L $(K߹sveK}[sϽssˬlB0HOw_I9>we὘_r -[nݍYB死.܂yBƆG|[WBjAY XH.Ho.CGRR{y=ûR65ٴ|Xhd n#d9Cvgyl&MrI3w!hG ?=?;w4;Gs rff0%?7MMD%ղ//̙l=W<{zƟ{Qw:H'1%!d%@6a2BFBmd;k'Ev= [8K r) / ȡ/&@B^$.%?xVirgYr\I>źŹIr\y v!}jiF07@K07/[$1E)w;*a--;k+ _˯AܽĖZN'߆Dzuk[;{&T3+ȟ_s-uu;\.x|mڳTrOԙ)Nu3':'<9܋kݹ>[%ҥ=7X5u;Jai.f8o^Hl>|ky*yTJ?MUG$ybYI~H~ yVRtJ"ϓdAS^ܓiv/7HD'nڸaxouoO]m+Z[ښˢpuUIqQa^0';uXVR*9/XZ|PB |`(>P.I$3bK,,R\d RSTk 'if7髛Ĭ^)eA)5|-m;3kImeڛRMcB2RCR D^`WH 6eKZz2<鍷4IG NL j@647 &# c(hN_k6@G)`HKwj-N'r8h @c `,_q%eASځ F8ZtɕPӖ }î5Pe.jOu0Hj(pcIEGK_<0@ =qlv:{hQ#K?3l`kȕV)B/dۖ}@g$murxz)Q2mm#>:׸r]Doe"LgcQ!=S)o0~G+Ia,~G(iYJ mi5dHaT&)4C$"c4:CZǂN:Q c(KM El0$@I)kXcBhzG ƀs49u *N\ "GM']~ 2k?v+ zE0i]!}d6 'Ђ2XJuh8B@a$$BR8- F%@47a*rP(o/df$A= @Ȑ-##}긖\%QDJX\ZJ(Aiu1|00rGRpoCB = TӾ*5}6;MV.vZjI6}M k: j;?=wB9h` l20TX**T,j%B_ A M+8]yZ(s7&!G D` %dzgU0,!&޽44wYj޵}!SJn(N".HzԀ%=dҳ0!"ƓZn 3n@lOے&Vb16camBlLf6 #!8b-b "GF"z݈UfJu!:vDbтhNMIWрN@=."j}(AjD۬@c2D)Q( z`Y>"ADVF^Z>AW2p"XfGPiEXf,3!4`NСR BtIg/@@DF|x7{IG]_~_F #*g@o4=wbٛ ~xM~%*_Gդ} 爟%k ?ESD 0<9Tq#?@#"x1|7ivPȣ '4Ӛ #އ5<)I-@9Mo/ޣ{B]/ީ> ;@n V[@ r{ȗTw{ An9rj:ϫVuޫA\3\i&ĨuC?;$Kb.>~Q {^);~0&;h9x ׃LA Ò@l"DLLHLȖ'&^` (^25ٲ;:=5ؖhlhl$96mlm2[w|06ւH,v?鍭>뎬Hgxg#k?[iÓLC/3ʄ{vcKtz%#Iggx3|iv2˜:99+: [쿰mE{~q+l>gf[*YV%=J[ ت2zʶx 1n|Y0!)h/6g`? :՝ EϺse"^Jx\bk?aLI+4;x@g0$DqOH@hCq 9 ͅ?ysPʓ?`~H+Zk?qlH ϽG\KtCE"A̒v"0%>* 3*dlNXƽLoW_{ukdJ^=5k8sj2FQkWv<+,+5g5o\1'f2APfN6N}$ \YT V&?,o;C>lx$&uQ=.TƠR:6R%DQO˂2RGz=^J! m G~Q[u{"G 5yҮ@N1rgأl)9YQn8tdfq^:cRԿTYmn٬:l.W t7Y0FSǫl>V(ܕ*[7 ;R7\tcɣ/ [.4_4:+_*d2^˔VQݟn[6U=Jٓr7~Af{qbd+H=f6~H:C;eB"V BaR ]C}5Ҹ%6n0fP=Cu4^~Y#O a/1#r: /nbyAUskõ뼹s[?28* +67 M|utmkI!Wa;͚ wFN}O<9,nozN-ir|MEMŴ{r[2 x// W?^^n^ +e2f.X6zD(纃r^AFGn%%Ez=x cz \.>AEpgNzyE/DAp -96ʲ ,hVۼaby:sUe< c~RzmS աPi. @moj_gq { -@k}4[{M4nGLSh"_FU4%*>42UU(L}Yo/͖H,d0WZadVAJʄԢ-~q:v];xdI:^nhٰ'R&ǢOW4Kv5W7gj;vtgC7 z>/ܞH/U5(t>Ҟ&`MϮOȑ%јIԑʿyyWW{/8 NV9-ŜμDfh™h u^[55Du]]ɤFЙ5:OY2qԣhP`P(eJ{}Wnp^GC[V~;S۵gkp_Og|Wk;6S,Eݤ%~U,(Pf{2Y\n+( "ו~ٱl bK!KEc=O\#S^T1 jYeX3 v #1^&/mvqhXSro 1;3-gf[3v4KҶ_W] zL:{>L#oxTe3㼠qU:=w8Aͦqah^?\f(BM-hpK73J}#a29@D6_B$X캛EXl~Y0/f;Sk+FvYׂ4SNIݤݖ^~3 <&rκX4ُ U*{033ǩT:s>,K?;] #̟ FdŒ1XZTU- )#C?fΏE?oaM]G^ҟhsQQqnZGἨd:yb]ElEu̅L$y؈^):DmkitǩR^Il[YC4%AΌ |yMT]4-V^d[֬ gp"MǢjw[3ҳY۾X]YppGK]xe9We%,pe: X?;r\:Y,}]ŋt8`kI p5P ˊW.]TyyZC<uw,)*8^_xE%qsdӕZ~ܑ9K}U->g:Ҏ%^Ȍ↡ \JoY˺#5WFsLUabw|ý7_spI`yOj<~0R:6=Zzf3ݦL΄7\h:LyW='v>#V&>hZwUlỜ'ةeoGߒJQճ*RB`ҷ\YյJgeMWW.g3;,PؓWUµe:K0j6ztqy]AU '6+֘ljgd2$ CPB٠l+CҰ=l'mEʐM_1(l'S߄gf GE j#1Y]8+JKVRoRWۦP(((|%ꈋynZ#טEx&^SZm6jNe4V(UJ^8A;*VVk>95r|SF))5)q/GKv@AԎ2g\ɇ=ٷ4< `9 ꜳS.|R0u%?i]!2g QROm=rZ:uuZoWr-2=ϼq{ʲ-n3פհb2w#rIF"*baw 0}IgO-/P}jayzfF2!ka͞4&wǗkb9ХѸ }"ʢ3T(Έgyv !f&C_slL; 2- ^p.(.!7kU z6A6QPmSD~(#W!>7h5FfSr^XL&lw=MJA։_.jyLsm$enY^,ScQ[K,2k53e/f/:q-qH/~ƨaTS 14pss9MY{]u8pkw6 W۸S~×LW}‘UXerA?Q*X^o7*,}eNɷ9zMsߤc2e8p#3-J [{=L`6sIϿ"?_R!(nV*Sթ~ޯ~V&_sTMU (:\OMj3mv+2J/ȕ:UUW7hf Fbd|C&DNDk|~w)T'u|'ۈL& \?iE7_zӼEV!(o}f,O:;yc|h?ۦ?I_.qb{Q>{䞣+PeQdw endstream endobj 38 0 obj << /Filter /FlateDecode /Length 487 >> stream x]n@D{}@ȝq Hy4T"hgfdHt^_˭خzk2m9˲;2>mXwoZ^=g/7u0mX^Զ4eW鿿q?yUӶ<aaaak0VƎ;_t?Od<Q+N1za(F(>c0>*H1ۛs?#:j#f1y! o9 3#1V)Dc*7bBT a0"c@ a0"X*\,T,X*\,T,CB`pP`pPC@2Jv9sR.-LʥSI`J0)L &҂)\Z0%K ri`R.-Lkkcrz+[꫆ tendstream endobj 39 0 obj << /Filter /FlateDecode /Length1 20068 /Length 13063 >> stream x|y|T9YLfl${fɾBY( c-UjR(RD*hA n5hm+ji.Z4桖d~ϙIXj?y}9PBH).sK 4h%K]/wi.v+_&"ܵKz.bբ|Yw!͚[px Cee(g.[|ytDK !r ϗs]W[PΰW-_Q(Et,L /$łUOVS(o#B1DޥDumD&P8֑[Q;2߉[*q4ZVb'$/@w6b3D!z';Og/1:q4rTAEOڄg<@@fQ釴>{.$s:S֢vޏEjJEZ|D9ZxK&^2'LNE[X^:ŴRLcH1JjG*0i;JJ_cO%(EV@P%e)x"dzoxI)+HlD rH$Cku'1mC_ u]y"x݌| R~^byψu}/?y&ğCӈOR#HFV}Nk9MBnt3o]D:; Qby:{q- J>~_ jX^YEZ]F+,/KYDqnd!h{%d> @fϡ76W)8J,/bͩ|Na9|\Ygq΄cp&o~n:x~!4^:0pjOq-Z'0\&tp5׌RlLa1`sgW ?Pg>O3x#8$ O`u"ϋlj;|D:d5\ߢ(#Ox=y%zm$b ?>N^>nsM̱!TaEb+x?+BK+ OE3)1ΰD \C$do$t|e,/++5sۀ}VX|NU0PrnQ]%ߌkqnװ3{X rEwLDT$xSD>דF[w݋$2\1IkRZ1rb_fnk1LIcAcשtHG2#:RF$2]S91X2%MTM.4X>1ɥj9WSX#ϥNT޾#龬/&~C~G{{{[`T(WihU4XU-eNԍPQf*& 0Ni69MJG#Bn&<)XBUqSJawE˧<}Hb)nq0M$sHRXx *OE!LZ% QuT%c4ZRܸASIrq/y(^E+ZGjN 4Iqo:BW(RiDNoGEY1ɤԩk.=/$Hxܠ/ŤB+Q \!+@ E"zzL] I/TZQeZK}I7uRXͫiЭ:n[޿󇭩\jV}](P;6)h랗fN#"H8:g3rA*G們A2pџTYl5Hao >bbqJ*m0JtT5(IiiYJceEDWҽGz^K.nODr^Fip8bw>"BLE|cׯ2^o<{r}+_0-u=_yE/h|!kۯ)i:miKY:.___dWPru_YAc+lOb,҈!͟UBSe2s0(_aZ*^$)ISTVM@Gzd+UXw{0ݗ՞dԏ(D/>!cL*x׼';&E&g4ilj152_]% E6]Ź67vkdžP} 2- \F?4 Mh`4Y4boLzR*EQY,=|VTs2(K}VCqt6}G\XB>Ax&r:hWl02-%F4t]2]#|Tq+^)p|!hBt&ҡ@V'uXRՒ^^[A*`ʛIU~\"7{ZzaH\?lpBG^e-Nz.[)̰Z.. F>Oѣ'E}qDP[=>[{<هd'*'\:`ύl6Kݰ*3s`g>?-ώՉEUojc[~)$Y㪄 LݫkLإ7՘55rSȦ_hɦl:D_04Q,Rf5#׍mNF:w:=5Z7^r%湱 ;O3rv =^X=,3LV<Xi+8] VmKWHvѭ3440޾4x"/ {J{xAzqht@lvUqbof~vnn3hg_M==Ejwx')[UtuݨNUI Gi=^NL`|햿ja`XKƊyu5WG:-j2 !`-y-T4S*m߀R'+f'S z5!!ͭneМLfR3#~)K W_EqG >e- N畠B{mCA_[}nʕŗq7W!25Q(Qزb[w<2cd BLa^I Wr\@g$iA ŏ/Xnq"2H)>D7tP{"Dz kh#[3W)tIm okhM[MN3 ' {I6rJJٚU,퍛|/Zu٦ӏ.d~mSK]si먀.59l_:{l+kGU \^w>p=h"J=Q1:qfeҚizECo>qDcY^^A+%ReVO*a дFநA9ɽI?ؚDv>L'ni.*19iu#O3+T00_SQT%bMD0xTHzRW$k`gCe0X4ȺT&m[j~(^?۫j賤V@x5o9j=3 fG'ysȘ>I{"MZimEkp_3hKs;LbLCA99Z,\JfzMr!M2OmV2A G9+t, Um2!fֳ yע,WDϪ%Qו#Pp,y%N&&Fj4NqLX 3Hށe^.L/Qr XwYI࡝3+b>+쮺VDx DsD3[-pD"JR\~+{j4!o^Vc Mn2bYg/_g\!# Yq{E響2O C;-EG_TUtfM0p4@p 8v{i2T{TF8^3ݖS4e\2] ˲:uI(Z))ug l6!!$'ik?by칿9#'-{|GvYހMq-7w٥rI^FIDI>O>쮕>FpL:'V)*zTChhy΃J{Emih"ah@I 7p URT9+H0k7'Nٹuji5;x\KPt;WŰ#XDE)䪒J(ydma9+,ENމ˦   &rBlم޾^9u03͂꼥-[3mu솱ꌮ63{7s%3uw=g?s~62-r sHBө^gwN QWhYSk`u}r}fǴh/ޤ &g7[>؉/ݶ癞O=?/{smS"~gGAvPFva}i~;Ak'wNl>x@wvLG y | مQ>A\L+CS97 a*̓j@wo7)蔙b};i<֡2*nG@oJȫ@?Yaٖ]$}$Ͷzb(yCq]5,޽#gW_^3K-O燣@n>?^pIkl:ޗX[&ԓ/_#d$yH/Dzrc!A>9INSMp :`tZC I$NT7 rvCOV"=5DZ4G JNЯ< LwH lF_aX#r#`Q5:|ڒ:* ~JO׍ o޹'4i4r5֫ug>pp.P(= 顇ni`cIgBWu /667ސ _\ H^kZ # ǘcQuAr'<<4H0,Is5fj~L-~各FDy(Ai54AB 6\nj~O$ϐSp{~HBW wѻdz["D`0ޓWe\s{ۡf7H>rmrs/SфK4"MU m^ݵ. blJ߄ $5(Jn0"3OAs_<;}W;8BOcluO Q![&xסP$BS/[ҡ+fn['T-32wֻ4Bjc?cdB1OC[I3e\F])jcТQDJ# !vQvmhԠĈ8jL3)]5rCCZl,}L2p H&-$jZxK [ Rdm O{wBTuzJ+Ct8Ang,Bu?9C1 li2`gJNQgZMQg{soxDQ mqEs"WvNyWB^k ӝSf erم5k"Flyqe,4 B|9>0eom=ʖ-{>ϩs=N/x/wGuc>f؇!m3a}A؁vpO6[ H'->Fmt$2:QSjN]  a;A7>T Ɯz̩d!y1<Ճ|v@^h;ְ>/ e}+ݖ)?]so6FEoD&ounB!yK@͠J+ GdSS`%ۀcڣùi 7jJɠQB;jnIhiMZ'B0?i'f`s!yO}_7x'AطfO {_8fE= ~{`urid%K{sJF9 wi-p;&mN]{`)i<$^G"ϿtNa 7nA~w$Ps20x?lINY޹ t x6Nk6 z#웣Tu\{n'Z  aĚp?r&G>eVqSTܻE\2YvKCڲ{-Y)uafQ_zdǜo٬[ ӛ%˗޻. D 8RQ]7`.Ί.;38gNC'?gZΖTPz !t9?cS "' QZ^@{ ؗ*@J~F#(nar)"gDNCfy8կ\ `m|H ",JjLwl恋yXyrb‡/ֳ4 CkC!_HcQ В@^w5=$.Kj?) }-@Z8z|`WRHЧ`*7W >O% Y#i:`,>m .x\}p+:xnAݏxT ȱkl$  C؂P=en&d)mS[u)Թs a%%N.V[ % iswo;أ;{<+v;ȭǑ4Ăc2 MբIl A U3~ GV_b:Ǎ*pTmk6ϵMoԥkanKQLrЋddayBNN{|Aߛ{7ۏvs}zI q=$W4 _Ј,_߉e7%aH5c9_Be\ގ.? g |fV(y>7DK/ktBM8Nsws hiPGMq5`a5-9" AW@_{J R޺,ʙ *ȨUЀ_W? `kB>VeMFrJ0[ a"UqY意a߂;˅4Tby*q,*|W5jLpb@mZo3e>C13{L$9>\ᔄ=KS3f𡆦*%euc xfFu(3YUBsLD}B4a<=F7A׊jv }GQlWSQTErы+Jn65KMkrm)b8Ѹݴ<ɼlEk+'Z56IS?*ec%akI3X.*.am h2Y+0;ט6bgy>? =DcD2{}xɗU: =(endstream endobj 40 0 obj << /Filter /FlateDecode /Length 487 >> stream x]1n0D{B70)@&iRdd2E*" S;3JblǧuZ~[;/׏^j{otrv,֜V[,ǓSSRq}}~sS(ٱ2/]B!,'Zl,0Dڔ%m%N;d hB8CS_c`ts+][hK`g)KmRIYBz`M-Mvm;1pmbٌޏ6;\x5XMI5xVg`5F4:N1tz fY!`vq'x )`vq'@B`B fk1&.H2(n*!%':] F52M`M5 a*`\.M&&39-Lsz$kR9Z vݸendstream endobj 41 0 obj << /Filter /FlateDecode /Length1 27928 /Length 15002 >> stream x}xT̽{ڦJZI H  mz5`؎ܝZI8⊃l%g_ww施s3g^lBZhJX>> _%!XO]) W.ZFүR]~BZ./^?ݺ]>T/ ]on#+Keח—ybWX/?&W/`y EhV43-Ekѵh~桫ACc(^BweHF2dFh詑CRݸ[dՌF?[G #C2R j7xx WEʣŤ]Z/ޑGh&f^ԇb,s-C˅rضBi.5{}nh%`5Z֡g%5bl[%ס g#mBU l-FhܙA15Wkס YaLBэpnV}6t;] jDgȶ۠>AϡC)4zFXZe`Õ`-«]1߆1k] m'm%t#wzюdϫaOzzY^` Tk-&\x|W-,sP"oӷ{>ĪD4U z|c/DxDPiàAB~GOszzRs 4:wt ߵRX,: :<u/Dž:Z1 ^32D__O N7Я;X WcF'F:T qYho?wNY3{:M>fRurbńҒXNvVz8L9,F^V)rTsep_B66fr*U%PU> = =c{bUdgĉڠ6Ot%aB Gk Kԯ_7VkРJ R *\9+ A)g|~bJGw];Pp&!_BfujNp.n׮h"#Xg4yA"+X[d-S~'!Cп_.>xkY/D$i☙`; k=GM~4ϝDX'-kٲm;/ O~#}?; / _Oy /vNkAŶ `>hbD,2a N;@܃%ӺCJjuv $ vtA P!!בM ꞿ0s\v0_O{AKAC"}Qж f;C 7{݂ =|'U.H 7v#Q |lɡ5@O~5IC Ÿsb|ѽeԎN*/P<ۥ#P6!Pi*r.SIۈ2-1[ۢtWKi)V NJlnbiɃ z4Zn]j*Y-XF5ZY׷#4WpZw[֩[ݛOP n霔g`_1O}\Is5}z`[?Bq#@4 a8BۅB( a$)XFC3:$..ԑ$b01:|r{,C:8(+1'$T$R_Eh1 qHL8Սܘ"ONp N(fدunr<4nN4%pxأ^8#4npv($$zGlH`9vzNiPg)/M upmhZ7qC~I+¦>?X[XrӚ%Tnq#"Cj*́_9KJCzB:qmCB WgJlj"K%DN17Bd!-IPS?zj`ji\vCCdg@c]V$fEj]K@Ў1;b2sBϞ9s3RsާX)~dLbfƛ;X8I0q371=&0q# L\uL\5Lf????????????????????????????????===e;e;e;e;e;e;e;e;e;5'>ș^+Z*-NK(]jJ)mtES 1@i=utZZZCi5\LZIite.tY2h)%SZDia2h-ͧ4@i~J}RC륥ٔfQIR7SIi:(MNi26JZ(5'M@MfJIw P] TK$TE4RsrzxRJ%)ѓR*gɧG),F)M)RR& J"aJ!z4JAJJ~zR %7%W5Iɑt)hV)(6%=QRmjJ*JJMAINItN&@J> G>W_hϴ'Z/JPzn#h(K~Gw--;I @oQzV~E$uJ~I~Nwy+eJ?SJ)cZz1J/m/PzV>G(g)4Dz{Yt7v;)zt;(ng>[趛)D{PvQtmtM:h'օ@;(]vmOZ!mIk1Е÷6SڔJ)zUV&@+ɖ=QeRZB[Li=(ͣO\Jsh{ͦ46z&=unJ3N?EIi:8ДB{B{rr5P[Ғ JwiԜ@^hROZKZMZ$-ہ&%M@Ք┪(U&M0㉴T4MT4(T46$@IL"RAҘOKIrF7cr(E2)eГSP S %Jiz2?=硔BMEə499@a.`h{h){Jh%O)~`D?}, k /?ö/|7SPS ?|W"_t} _}?;o^{G{-7a߯o6; xl?u.A R%i~];cK1~y*sվ5g5k}GCP l;@]0HV_{Jz V~<x: ?c_}>p7\w¹~uwn }88ͪɾTݨzw K}WRߎ]W޵kkוvbV֖qLkSеqgkBxE$,֮_kuC xڮ]kB޾:Z2!ZUCv{[Vk Vtܿke]K.ZQ] (_5kޮ٥3fS5^յkZiG]&C}[iKWƮ] ]uxbHrSJOuO%ȝps&2N\+ۜ79yuwddh]b3r`x+i^ZyEB[lpފVY12oGFu|\WRj#)zOuU\\]USWg#1F+U`b;E-C 4%2+Ox̄9{ b3a!O5{IgZw~OOKb;8 gІ&DY&];YB #($׬2N(w~n@sg-\G3ȋ գN4p`;`JVf& u5Ue>\@/`6``& t:Sɀ6@+ h4:@-0 P  @9 P (@>  rـ,@ "0 H N`V`FZJ Rzyc#a73_/?4o>|C_'>#=~ව x &׀7x pK/? x2g~1%1< 8<888H ӀO<x (À~! p'`;n >̀ p=:k?c?c?c?c?W `b!`b!`b!`b!`b!`b!`b!`bc?c>c>O埞 _q̝ߐ hsH .mC!km"[+ qM\/ᴇ]"U=ʫ~-6)SY>0|,Vbc(r,E\Qa8ㄺJ VSɑ2f&>, VM/z]zV&R슐aڬPEGeT!O/ry]F1)&1ʇ/՝TwFrٽl4*'Ɇg@t Q FBn2jkg_kM!HZ鹆,3+#(mn "<4z S ȷVt"Ը--S8R=A$1h/_AMPcL5uIPUU,5ˌ SxnC6L0y:>`jg<$Bfd_*s0cNJΈןI6?Ou^Q #*JTIjz| $ˋw3ɗC[sx8lZYd,s9Evz4zh.K=OЋ4t@M3ĵ9+ϼwsӕmVtf[!% B߾}%E7j[QdaädDܝ~q<=t.%Ŭ"u׾e۪ñH&2 qOU瘉-f lv@kG KK1.6*6=ÃR%o2%ڷo_"rB-в,~hDx#UG8c\4~xVĵX pX$ڎРl{Wfń0b_E /J[*RBD z2Z6)hk&6*F* )f SBG=(766666Ci=CNN?$RbǍec56|'4L>֓ :]TZ/7@+6*"ʥR{?NܼcAK%c]/rlgǃHM3*ӈ:4O{D+J!cn Ah"h""E44ĸ)45X_M&W&cŭ0`|>ۑ,6{T@c|R5СNUa5$f]\ xQ uLJ(,oQ $:k| .Qp?fZ;p2~V4pG hB$&D ѳU%TBsc0tQcp7n5`wsWȢ] \ 5AVz9VrX˱c%o"~uGpc'匋_c%ݺbr=$ILmVBtz]b(D DWc1U}޴oR4X`>G˶Nh W zc۹ ۆT#G_B|$ 3[. 8$<XLq h\^q(CW4($*䄁C?-HztO\ %5￵y{{ozsOݡȬ\w^ut{;߿s?ǖ?{rG>HRP8&""Lr2!2vC1hCfZ2`< i͸d:|!xa /72  gT;fDHtE]brȟ<5KrHk`6 7M#ztW&MW-ƚjTC\V<7[pk~3|Au6&,G0n;B=I*49Gq@z\Wkp<+TUb,1* =TfL -8e$z4k8e z.0 tP t%G-S7?P3&Ր)tSV5֤O]|Ԃ Knh0$/Sձ)iK/V/=S!c%S J&O+\ޱmz3 ft)A'wRxrE~i顯vIvl$V;H㓁8z|LiMblV+LtzWeC2qlHdU F"ٹ5"qk$0/F&D|!&Ѱ#rK&Mo(`'M_X}g='zTh`̬/n]/R= SsVוU&ՂuuߒB$G:*P,{ŢHYW*FI"ub(1a9SŕȪ*. HCXL]oh-9(m#Q RUa[ [Q6*!INM T0E|f\Mf}`Pq_vYFf ed+#QF(!VƊƊ=6&+FJeԫ"n.h.9k+Skg?MSwAH#Ƽ'%rc,75pym:.O)Z[U8mhv༵Gw6pjoׁݱ|&XZ♱ż&,DYd"֢KB|_Pm(G_V(O"PV L/zyf wLOJD{7OR锟;~Ŏv?D BzqH`P9/NzWv74rxxGVW`m}Wl825@9VUsfFt+7 mZ{䪺5wuwi]PBƾZF5O  -F-7Vn1EgrWs3CC'&R*npO6[ BvOf#_>Vpu++ml|vװ غw-l2՛u*JIBLu j5'i`ӛ:Rttϓ]47,hVeιnzV1S[WP%梓q)4o0ֆѯ 3dSd\7vD{ ŵ n [Bl/$F&?7aݙ8ϕͿLj+?hOmiŅ*46 тĸvH/HaJÉ(/bu1L+#2g68`>WkaM{6Lpaxl8%L‘K fUK&{u5+^eeyX~ȗV8֌6## zsbcis;>g8;׷,tkeylo0Sq=*Wv=5kb_8;mSgRb"iSzB_I*NHVxr+L~ q湥hѱǭQk0,۽tQXzV&Ttћ鄉pvsZU„ ĥ6:&&K,'߯01בӔ[’nn5dԦuw f5ߖ o'3CCV@7 WyDeDOFVm }I`gT>򌐼~ih őҫf2g/ĕ5K[ m7ѷ4v@˕rYyu,dF'LUF|^*yTaّ*\ 6BX9_Tp5;H»-ONdѫ6ب$<T uXȰWe7g:ӚI062Rd1# O GF'2|,DTet08,Ǚ<%߿8Iֽ1V[x,"km%&': 5!&-οW+Z^\5%O+7- 7.,?rmˤ+nҴc^Ym; k #{6dma;Y[D/Q^bG%^%$1V ,0+t Mo]WԲ%|ۗ?':6Y,VI֑=oYV(#j*{J\]`H- TX(|{Ȭ̰|z]U+5y#wN뮘E?um 򩣤DU"(;g6LD|3L5ԤI 9dj.%sgC/=w>fEF|J|yFscS(u 6KQ~y >QԳ914!c3ȿ$.$ZN#E8K sE2a@ː |.WFzڊp/ ѱ\xRFp"'S*vOՙ[T0̄<@G#1?5*J%d8qq6*R'1z{ Z܄^kb-U--Zn{ody|~7Og  dLbYoqE*A1 <49(Q}jb34ӄfG3=J$7=H8K>H^+cr\JBDf#)]HS3r#LZˌgXS#XWw9oӒ3CMP0ݗ^Qߔ1Y `t6MS3+:ɽ[&y31-<[;d 5vm`G{ޘGo9 'W'ӥ=ɥ_nȱϏ{ԛӄ,Q4R, R*I5蔲P˚ɜ0M FTs*T K '~:B<(B<(BڢCd[>ih䆶n&븈Ȑ\Rb8'59U&U*QiI %pEQ5L$LS mu{F-:GߗT^X,ZfNЊ@ +;zɋ Ǟ!/$(yppK$Q ZB"ךZlA.Hwէ$%>wPk c21Hx}WftYgHH.d*uP s+8,1M*ym$Ѧnbf&g{4o?kc_ռxvN,I7)97@.KiJe-#N,5gPʗu2:2)5_;lmɩUր*1،uaRI<|@ 7{A,YitZS~BQ٬TUo/S6MwiZ~jlww:Fs;_q~puֺN~.?)%)._费%,GL`RiN3dx!^竊bڜȈ}X(X+ Dqa( 1 PH*>(BJN~L5Q_:P{{PtPFQNF@&oG[oн8M;>{O?;W_/;_~Gw=3[(* /1endstream endobj 42 0 obj << /Filter /FlateDecode /Length 168 >> stream x]O1 y?ڡR%]2~b!C_ Ce>ad# #7tmA!pĚkbJTL 7<].(s4F9 Yw I`26}\4@=XyMsj )T6c y糊'/kUendstream endobj 43 0 obj << /Filter /FlateDecode /Length1 5880 /Length 3430 >> stream x8mpuoI|Ayu#!A (X6IA$7J#يE#GTm v[J&Jg6v;ӸNI;mƙ'i;n4CMĊз{ Eo׾};̀c ZuV:] bG\ho*0 誜~1USm(OO$!>L~Ɇ4>}Yhz$G `icx2B4q; V>hlO$/oT^OhwϝG1GY?>ga{^P{=_@9V— 3˴Fq8 ѧP@'`tIz5-q_>M~tg̯>awГ/B8}BNpS,G,^ϠE(, +jO_,|X// C;RpXB(Rò0gm!dP@8aUnORݞJSc A0ɒ:"!ƭAP<. {k1ȔL$F\3aT'̓r[)&&r\&Ԉ{pDpgvpx0|~n)_. 1n(i+_Y.tB9I"JwzeNc]Vţy*Qb$S5ٱ©* 4lLE"t 4re҄4ʜlx^~3YT<YfB'FV .$ՌTmIlix6藋 96e^buWwGP S"[ffJ^K—dҬpGg*jpD0mj5\,{e Y#O9AΨFP8̆1I!masQ#MReФ7P6כg2_=R]B-ijcKlBjl({P͎YPYyGՆ>z3$4uPHP-gVknwLOe\1T|9Da[5Tfحp&n9~<UonN2JVJCȢCx&J<9rԈF$s`#Xa5pE#0;Ot8ϛ@i&_1̢dixA} e~H~/jW1^zt>k|:[ߒʋYdX,A4>+fURTҨ5"5c#Oc'+oVG! Q*/b IT L[eP{m#g9-QL="s 9`,f&V/O=}*y ;Fu5Xpv{/ggLP6ڢC-}퟿p{o|/ ~ }I/&>[E?i3;=r7:]sѪ͜ Vӂ鋢yrbdݞrdH6ާHH0﷐A}'.]$,gp9.:CJ`h[05 A栭?(Ƃ)G#vxH,"vMf{&fA¦ `ߏ~ױG5~*5nvoz۫֫.׹ΫU >lrmv[X@M,u._'`'iO> ]iGsd'd6'BxᷱY0^Do'ѝ&J3!'B`Ÿ% [BL@bl0G? \&頖 :esHFoȥ%7rr ~>#L|f ?khZZf)3k :gF90Ne5 ]AkgiOf;SQ5uV %+eRfcL7Vi5vdH,-sؑP&Զ#Rdg"5 zK ]oyWP=A~n%0\`_߶MK \7.ֿ>'Wo:_wq%Uendstream endobj 44 0 obj << /Filter /FlateDecode /Length 8477 >> stream x=v6Z-u[- x&;w!އ>r֎.Zg " -{sQBIOΟL\?zʲdb"tUMda4&W?&O VVM7Ѓ&?'?'OO|"+& &yydjx_0(ֈjuMGMb'/8 n|waYQd er,jIij/cbR1(\^~2QHQpr5jl{4>8.85Ҕsja"<ۏiz`X~=g\ [/GتgSUq؉Rz%]48G=0 d▆`zIšDj~*xu:4QuIZx&%o&nіB@/X0"ښtgaQ 3pqȡvG=h3K q2rw!037TEIqbakȌlpDxuu8R8PnDJj!8aX%¨|E99h&-pr1_]gOzlgӆ ^4z vR%w ]S5G,0my[-m*u^ Ov۳eGrgJ %Jfgt{P`8. Q/fDqܑ'!R>; JfqT|Vb(eS? v[M wOڑ~ykwю~T=B2]Yz2 z q_6+|'5bb!8\ dN>njuY_LsQvVUQLJS6]9m]qa6%/PBD*5w[osOBom&9б1az`w-m{9<x7/- g A38o?v//TpEۑx>巎uU"cQ}\Zp{apgGw4#;9ϣ[c#/x'w ._ރL<ޜZAx^^l.BJ3HkE~St'E wPؘHk.]#OsMz[:Q7:Gߓm5pi$͞J;fu -7:NOqpбvbkc@j'8_mNaFZD?s"TȕDc>aHу)UE$&Ŗ v$>4&̂m0@mŤ.nA$>a@ #XDӇT΀z #4) ɤpYͱpzb@a&OA"?d@HݓETH gԣ~sMA!jnp//h0 @X)VTRd.ߜqȃ?',+ek]AĀ>%&{e/b`r*ەE,Ѵ0u^o({^*J4TW L@ri1Ub-AXd?|ˆ`0L8|]Ea0 J&jnFZw:*>>WˬXDQt4 0^twe۪@7f]=N Ll 0Nx*{Nt(PN r;Vxj {BӶYW5V1e11k\:'˷o;|ӝm{U<^rYk[\7 jFP.rT 6أY*R#EcHT.;0x,yVn~Teih*xYxԳlTp0Uc2ʶs6Z} 4v:1Dp1ZN,R jyrX@<H [5~="7EZ!MێY(i[limc%vEFµ3)1e.@`ZvzMmc`df6>r%5M N=qrq[<Þ!lWfÀS"ma:2 u&~Wõ ץpY㺍t Ws tEFQ'L^*O: 7zs~%5b]1oEYENd+&ofGK(n+FkuA_qs~z1J]0 f'Jtv5([,mQ{l e8]VUs$*3ZRqkL^nh6!Im|y`|wuAmqTE:tgu`A+\APv }}sַ~&9X-ܾ2R~|؜3R\* Dt>;n_w ܀U^$7S;$=c .F}y@8\8D~R/bkQmʡ /ڿ;X80*=d:, pV&2 SӋPx-_HeYZoZ4\ot{y%jlPc{?5[}dpGXTRKTav=`E@`HC꼔MJVރc@*}wyzrNjIxo[8n#Z [j"|zIhn|ZjTUECܨNϴ 3]Yr'AV ][[!wֶv[||ց\duBUH8EVU1dfSdᕬ~HF-=Ͻ=6rfՀP'W|c3]ʚv;c#emw*H_.+& ׫wg>oe&z}/\\k,Ү /v/.2nP~ G6,$'g7 !l7-GEHO\D>G&) e0׾'yG'NTP||Q\RO.sPjiNq:ZVcjON_R5Jr[K#8mЬ^%]Njx Zh6Cّ`s7xv~716W-%sH${m.57N{ӊUSE/u=t'Sa+27 p_}n!+V:MɰpjUTԱc?S QS|=I `ENR m"WS57I 6 OB&9`\;S<0Tt$ dw0@) k!/B+k]rm雋7uޖ1O*TŴ2-$s1EM_רVd ^6Z=Ӏi/(z99iݢrV9*<「~sڬdz4&tӟ !y\|^V3 h(dDuY0'RYGdKV Ɖbɷ+^U-9 ~0я(YJzuz?P|m$-_dX5 L#+k$3Hr1er5MEKݕ#v%4 kl64m<KfMwxt^eWR36}{T Ò'"7WDrfU<}ˁ-uOnrg"_C]оGV-,/"DטL;?'W4@j #`i4fR}״}C;~!itK=%(c줿f,TXd<͝eKVP3vlpMYE{y -SOw fNyƠM]@C3$Y:7to}. s…=2=%J $j ӓX+`~`.ɿx2u)h{!*'ŠlĪUBs/_fWA׃_NJ'Y[| x.pT(Tt&'Yqv*wuߝk"eA.fsvPi,=3^?G_eP,eL!per[1Y8Xm `7uKMI- {\W]vMt3qHܤ t -Bpm ݯ]W O ՕCGL$46򢡮)1(M<> ( %U9`iR=c@8^6}U54Ue9یty~:Z8YE0+g'_DT#1Elj1h]!ޒl|d Z !1Q-mpu3OfU Hz]6| ́dF9$"QD0KFS.E2|3UKA[!RAbS p>NP)>K/ 4ײ@Qiso<6ꨅ uoaP-+>s %1hev ;BuX_H2@T0QP 5@.LXcSo֛WoB\ܕJܖYdAӸ>A<{&Aba0+v"qӨ+T;|#љ8H$Ő:u2r>4?Υ6K2${C ˬ[,>`iݬNCP$~}i{\Z+J+r/ NmF/iϵN@Y>$2jJ'%m0'dq+ZU|CE[:j?Zk.@1fX8w)iJ к])`F5K4F7siz׉r>9MM}ͻ`k5)JLnF7믡/q;ޘ,3{10Ehd&-ōeոx6qR=+]Au\}|.[^;7Ly1s" ጙsz{7B`)GQR{붱eA)հh^-^obfRjY,@tipn~;31;";+pZ坒RBv{ k/Q3[A#._BpɪVh97u 3a-dA,8t7G'}|uS Ĭ?uI]Ο_ H|P-D о_ endstream endobj 45 0 obj << /Filter /FlateDecode /Length 168 >> stream x]O1 y?ITKVU0C "d tplg1בlzaƒ-(ΖXrmUUj&'|*f(qRa4#Θ!QL2ۦ/KhSP+~\m! bf,/|VjsUendstream endobj 46 0 obj << /Filter /FlateDecode /Length1 6348 /Length 3613 >> stream xX}P\u?7. <@Z V,6:vC^}`Wv, ْqV4v&~ɠD&gu]$k0[VDv`>{{{7L jJ`@Q/}G: {F J<9{;XZ{O zB]xWGr{A:>0_Bh<|hb2מGaJ]#|f  zM Z| ->iǞ#32 ;9M/|iFZ.:38KZI`6'o#7KQ ߂oW`2 5x 5{t1 Z`^G pԥ]㮯K/a%s2 =xz$ ܗk]е4FDỸѳ3E>yc8km6Y`Cߺ[\0[;8@dxL?|hdXMJ ml|[-}ў͑M6vvܿaZCk[4ikRMuUXQ(+BY۬I L4Miy4E]r앨kڒBq $PUYmvQQs=mi6% qIbZM"׏*mKK<(~ IFst:*PV竪z/'/ɚ_{h/,ޡgf aڨ#^xo}J)oGW]Ĵq9RwtXѠKPYt^LfQ9:V8QdpgWlcV܍12r/jjgb3(NHh$MaF6s^ؓR\JRS `e2>0" )vr`'2ufB{٦k {Q&"aE uII} ] 2 zLѰxےҶhDf3n^z6AK]7;?ؒ7-g.4c>3Ƨ:˧*{ ['c9vw@82mAZc.5pwggBT/ G{՜(g0̚1MWUƾ)O[ʒzP2+S!t# @>>$&C7Dc;<vMs+?R'K}zJO-N%g].p,%OPͪԛʐ|Xw8-a['eF薃bhfSF?vt{ (T3Bvdѡ]I<<~9YىԘؾˁ9)v 43=XSI.e5]L3,5Oɸoc[/}Rg?OOouP{Gn닣I(8A41@Te o32*M΋aUa#hUa'3U5(x) SRywSY*I\-V22xehd6yze>vĠaM,78b4)a&“;)&efS)S*.-^K.31ҮOS'fF%҄3$Us'ϦRy|%߹Qߢ˫[WjLG'5"@OV&grfpKgɗ"DS=ju qL*@`o/ vn/^Lq x}t2s!ĕ,e[E,%Hʸ $T3zJe Fbd]@+Kc=)0y7wr+ <;zJ 8 "QYpꥹE̠W0!$LE0F)oSi S*/u&ԁ=8r=Eonl49b<S*U6hr@}hZ>- l6~XiA4+K\"bSEQU) W ;1 W 1 c ĜtPZvW8\Ϧ63ԉ5,[\\T3_72ӿg | sdC5u1(;/;>.R&#?\4x;'Y`P:ӾZb]X/{dB)c$Sp ߺ<`{N'ࣚ~6x.S^gB_ڦδ|vV(x0~vKMȾtKϡ.D ۤ9Rg*LY)3->d{UAɿ%eɚ7R_h y*ʟ oD%Vu:FQ wz7v[ Mϟ#sglw%N*ғԴMlĂak4JK_e,~ʪ8N,ʱ5gNe)4x?_{6>o aHhWaMa4ZTnG|Xzp4)͊V.=5R-r9 .2-. jjGpk4M;&xF&=߀o8(@6U2\\H"zBHH/"Bks)nׅkR:,aak@{P_ZLCەImJ:FYBXE)3x&nx$9Gʙf0BS*J+TJL/mT{dxt~b~O[)Nڦmi# U` jq4@q:zWMjM"h܃X00=Y702\EA#UHHeHH>"$ɁdG"Y̑mc]Kڛϴ+ke'%GڼC-fMjSIi)6׎iGAm@׶jXOW+/O[ 1⇓YZ9RYnﯼ׽IF}d..u rm`oV-KRhzR,b$o-m+k=ֺrG*|67U 7K ~ZMt_7_SjC%umOUjLCצ`Jou ?{ e&@ ޑ슬@ l qnOCp\չM|u͂:p?8ҵendstream endobj 47 0 obj << /Type /XRef /Length 96 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 48 /ID [<5b0a868dd67024f6eeace71823c3e671>] >> stream xcb&F~0 $8 / ANDjo?Hw`vT"Aqd?||{AbH  endstream endobj startxref 90108 %%EOF timeSeries/inst/doc/timeSeriesPlot.Rnw0000644000176000001440000015272612461442310017607 0ustar ripleyusers%\VignetteIndexEntry{Plotting 'timeSeries' Objects} \documentclass[10pt,a4paper]{article} \usepackage{hyperref} \hypersetup{colorlinks,% citecolor=black,% linkcolor=blue,% urlcolor=darkgreen,% } \title{\bf Plotting 'timeSeries' Objects} \author{Diethelm W\"urtz and Tobias Setz\\ETH Zurich and Rmetrics Association Zurich} \date{May 12, 2014} \begin{document} \SweaveOpts{concordance=TRUE} \maketitle \tableofcontents \setlength{\parskip}{20pt} %\SweaveOpts{strip.white=FALSE} \setkeys{Gin}{width=0.9\textwidth} % plot.ts <- function ( % x, y = NULL, plot.type = c("multiple", "single"), % xy.labels, xy.lines, panel = lines, nc, % yax.flip = FALSE, % mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), % oma.multi = c(6, 0, 5, 0), axes = TRUE, ...) % plot.zoo <- function ( % x, y = NULL, screens, plot.type, panel = lines, % xlab = "Index", ylab = NULL, main = NULL, % xlim = NULL, ylim = NULL, % xy.labels = FALSE, xy.lines = NULL, % yax.flip = FALSE, % oma = c(6, 0, 5, 0), % mar = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), % col = 1, lty = 1, lwd = 1, pch = 1, type = "l", log = "", % nc, widths = 1, heights = 1, ...) % plot.xts <- function ( % x, y = NULL, type = "l", auto.grid = TRUE, % major.ticks = "auto", minor.ticks = TRUE, major.format = TRUE, % bar.col = "grey", candle.col = "white", % ann = TRUE, axes = TRUE, ...) % .plot.timeSeries <-function( % x, y, FinCenter = NULL, type = NULL, plot.type = c("multiple", "single"), % format = "auto", at = c("chic", "pretty"), % col, pch, cex, lty, lwd, % grid = FALSE, frame.plot = TRUE, panel = lines, % axes = TRUE, ann = TRUE, cex.axis = 1, cex.lab = 1, % yax.flip = FALSE, % mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), % oma.multi = c(7.75, 1.1, 6.1, 1.1), % ...) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 1 \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Introduction} The Rmetrics \texttt{timeDate} and \texttt{timeSeries} packages are workhorses to deal with chronological objects. Since their inception 2009 under their original names \texttt{fCalendar} and \texttt{fSeries} they have been only slightly modified. With version R 3.1. we have essentially improved the \texttt{plot} function, but we also took care that the functionality is almost upward compatible. In this vignette we show how to work with the recently updated S4 generic plot function \texttt{plot}. The function is written to display Rmetrics S4 \texttt{timeSeries} objects. The basic functionality of the \texttt{plot} function is to display single and multiple views on univariae and multivariate \texttt{timeSeries} objects. The function \texttt{plot.ts} from R's base environment, which displays basic \texttt{ts} time series objects, served as a model for our design of the generic S4 \texttt{plot} function for \texttt{timeSeries} objects. Similarily, \texttt{plot.ts} can be considered as the prototype for the S3 \texttt{plot.zoo} method. The \texttt{xts} plot function was build to display univariate \texttt{xts} time series objects which inherit from \texttt{zoo}'s objects for ordered time series objects. The generic S4 time series plotting function can dispay \emph{univariate} and \emph{multivariate} time series in \emph{single} and \emph{multiple} frames. The plots can be tailored with respect to several viewing components: colors (col), line types (lty), plot symbols (pch), line widths (lwd), symbol sizes (cex), axis layout (pretty, chic, tailored), minor tick mark appearence, font styles and font sizes, frame positioning (mar, oma), as well as tailored panel functions (panel). \noindent\emph{General Plot Settings and Design Apects}: \noindent\emph{Plot Type}: Univariate time series are displayed by default in \texttt{plot.type="single"} frames, multivariate time series are displayed by default in \texttt{plot.type="multiple"} frames. The default line style for a plot is \texttt{type ="l"} is drawn with "lines". \noindent\emph{Time Axis Layout}: For the time axis layout the function \texttt{pretty} determines in an automative way the \texttt{at="pretty"} positions of the ticks. The \texttt{format="auto"} is extracted from the time stamps of the time series object or can be overwritten by the user with a POSIX format string. Alternatively, one can select \texttt{"chic"} to generate time axis styles. We called this method "chic" to give reference to the underlying function \texttt{axTicksByTime} from the Chicago \texttt{xts} package which generates tick positions and axis labels. Furthermore, a "tailored" method can be applied which allows for fully arbitrary user defined positions and formatted labels. Minor ticks can be added in several fashions. \noindent\emph{Annotations}: The annotations of the plots are reduced to the y-label. These are taken by default from the column names of the time series object. This gives the user the freedom to have full control about his views how the plot should be look like. Note, multivariate time series in single plots show the string \texttt{"Values"} as label on the y-axis. Main title, sub title, and the x-label on the time axis are not shown by default. We prefer and recommend to add these decorations calling the function \texttt{title}. This allows also much more flexibility compared to passing the arguments through the plot functions. All default annotations (including the y-label) can be suppressed setting the plot function argument to \texttt{ann=FALSE}. The argument \texttt{axes=FALSE} suppresses to draw both axes on the plot frame. \noindent\emph{Decorations}: There are several options to decorate the plot: These include colors (col), plotting symbols (pch), scaling factor of plotting characters and symbols (cex), line types (lty), and lindwidths (lwd). Note, all these parameters may be vectors of the same length as the number of time series, so that each series can be addressed to its own individual style, color, and size. A grid and the plot frame (box) can be added or suppresse specifying the arguments \texttt{grid} and \texttt{frame.plot} in the argument list of the \texttt{plot} function. \noindent\emph{Panel Function}: In the case of multiple plots the plot frames, are also called \emph{panels}. By default in each panel the appropriate curve is drawn calling R's \texttt{lines} function \texttt{panel=lines}. This function can be replaced by a user defined function. This offers a wide range of new views on your time series. So for example yo can show zero or any other reference lines on the panels, or you can add rugs to (return) charts, or you can add for an example an EMA indicator (or any other kind of indicator) to curves shown in individual panels. \noindent\emph{Example "timeSeries" Objects}: To demonstrate the wide range of options to dispaly S4 \texttt{timeSeries} objects, we use the the daily index values from the Swiss Pension Fund Benchmark \emph{LPP2005}. The time series is part of the \texttt{timeSeries} package. For this we have introduced some abbreviations: <>= Sys.setlocale("LC_ALL", "C") @ <>= require(timeSeries) require(xts) require(PerformanceAnalytics) require(fTrading) tS1 <- 100 * cumulated(LPP2005REC[, 1]) # SBI (univariate) tS2 <- 100 * cumulated(LPP2005REC[, 1:2]) # SBI & SPI (bivariate) tS3 <- 100 * cumulated(LPP2005REC[, 1:3]) # SBI, SPI, SWIIT (Swiss Market) tS6 <- 100 * cumulated(LPP2005REC[, 1:6]) # Swiss and Foreign Market Indexes @ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 2 \newpage\thispagestyle{empty}\mbox{} \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Standard Time Series Plots} The \texttt{plot} function from the \texttt{timeSeries} package allows for five different views on standard plot layouts. These include \begin{itemize} \item Univeriate single plots \item Multivariate single plots \item One column multiple plots \item Two column multiple plots \item Scatter plots \end{itemize} \noindent The only argument we have to set is the \texttt{plot.type} parameter to determine the layout of the plot. The default value is \texttt{"multiple"}, and the alternative value is \texttt{"single"}. The arguments can be abbreviated as \texttt{"m"} or \texttt{"s"}, respectively. \noindent \emph{Univariate Single Plots} were designed to plot univariate \texttt{timeSeries} objects in one single graph frame. Nothing then the \texttt{timeSeries} object has to be specified, the \texttt{plot.type} is forced to \texttt{"s"}. \noindent \emph{Multivariate Single Plots} will be used when a set of multivariate \texttt{timeSeries} objects should be drawn in one common data frame. For this argument the vlue \texttt{plot.type="s"} has to be specified. \noindent \emph{One Column Multiple Plots} display multivariate \texttt{timeSeries} objects, such that each series is plotted in its own frame. Up to four series, the frames are displayed in one column, for more series the frames are arranged in a two colum column display. \noindent \emph{Two Column Multiple Plots} handel the case of more than four \texttt{timeSeries} objects. Then the the series are displayed in two colums. In total, the number of rows is not restricted. % ---------------------------------------------------------------------------- \pagebreak \subsection{Univariate Single Plots} The most simple time series plot shows an univariate curve in a single plot. The axis is designed from "pretty" positions calculated from R's base function \texttt{pretty}. The labels are printed in the ISO 8601 standard date/time format. <>= par(mfrow=c(1, 1)) plot(tS1) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The chart shows an univariate time series (here the Swiss Bond Index) in a single frame. For all plot options default values have been chosen. You can decorate the plot, making it more conveniant to your needs, e.g.: change the color (col), add a main title and x-label calling the function \texttt{title}, or remove the grid lines setting the argument \texttt{grid=FALSE}. You can also design the minor tick marks, setting instead of the value \texttt{"auto"} oe of the following spreads: \texttt{"day"}, the default, \texttt{"week"}, or \texttt{"month"}. } \end{figure} \end{center} % ---------------------------------------------------------------------------- \pagebreak \subsection*{} Tow other plot function implementations for \texttt{xts} time series objects can be found in the contributesd R packages \texttt{xts} and \texttt{PerformanceAnalytics}. Let us compare how they generate plot positions and time label formats. \vspace{-0.3cm} <>= require(PerformanceAnalytics) par(mfrow=c(3, 1)) xts::plot.xts(as.xts(tS1)) PerformanceAnalytics::chart.TimeSeries(as.xts(tS1)) plot(tS1) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The group of the three charts shows an univariate time series in a single frame for the plot functions as implemented in the packages \texttt{xts}, \texttt{PerformanceAnalytics}, and \texttt{timeSeries}. For example in the case of daily time series records \texttt{xts} uses U.S. style labels whereas \texttt{PerformanceAnalytics} and \texttt{timeSeries} use ISO standard date labels \texttt{YYYY-mm-dd}. The plot decorations are those from default settings.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Multivariate Single Plots} Multivariate time series plots in a single panel are constructed by default in the way that the first curve is plotted calling the function \texttt{plot} and the remaining curves by calling the function \texttt{lines}. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="s") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This chart shows a multivariate time series in a single frame. Note, we have to set the argument \texttt{plot.type="s"}. Again, for all plot options the default settings have been used. You can decorate the plot, making it more conveniant to your needs, e.g.: change the color vector (col), add a main title and x-label calling the function \texttt{title}, or remove grid lines setting the argument \texttt{grid=FALSE}. Note, to change the color settings you can set the argument \texttt{col=1:3} which would result in "black", "red", "green" for the three curves, or you can just set the colors by name, or selecting them from a color palette.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection*{} Now let us compare the plot function from the \texttt{timeSeries} package with the \texttt{chart.TimeSeries} plotting function from the \texttt{PerformanceAnalytics} function. (Note, the \texttt(xts) has no multivariate plot function implemented.) <>= par(mfrow=c(2, 1)) require(PerformanceAnalytics) PerformanceAnalytics::chart.TimeSeries(as.xts(tS3)) plot(tS3, plot.type="s") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The two charts show a multivariate time series plotted in a single frame. We use for the plot the functions as implemented in the packages \texttt{PerformanceAnalytics}, and \texttt{timeSeries}.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Multiple Plots} Multiple plots enormously simplify the display of different curves in multiple panels. These are the ideal plots when it comes to the task to create a quick overview over several time series. Multiple plotting is exclusive to \texttt{timeSeries} objects, \texttt(xts) and \texttt{PerformanceAnalytics} offer no multiple plotting tool. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{As long as we plot less than 4 time series in a multivariate frame, we get a one column layout. Annotations show by default only the y-labels which are taken from the colmun names of the time series to be drawn. Feel free to add main title, sub title, and x-label calling the function \texttt{title}}. \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection*{} For more than four curves the frames of the plot design are arranged in two columns. <>= par(mfrow=c(1, 1)) plot(tS6, plot.type="m") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The graph shows the layout how it is created for six curves. There are two columns with three panels to the left and also three panels to the right. Note, it is easily possible to adapt the margin sizes and the gap between the two columns of plots calling the function \texttt{mar} and \texttt{oma}.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection*{} If you like a design with a small gap between the panel rows, you can modify the \texttt{mar} parameter to introduce a small gap, here with a width of 0.3. Feel free to modify it. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", mar=c(gap=0.3, 5.1, gap=0.3, 2.1)) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{One can use in a multiple plot the \texttt{mar} parameter setting to create a small gap between the rows of the individual charts. This lets a plot look more elegant.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Combining Single Plots} You can also create your own multiple panel plots. Just combine single panels in an array of rows and columns using the parameter settings for \texttt{mfrow}, \texttt{mfcol}, and \texttt{mar}. <>= par(mfrow=c(2, 1)) par(mar = c(bottom=1.5, 5.1, top=4, 2.1)) plot(tS2[, 1]) par(mar = c(bottom=4, 5.1, top=1.5, 2.1)) plot(tS2[, 2]) @ \begin{center} \begin{figure}[h] <>= <> @ \caption{One can use in single plots the \texttt{mfrow} and \texttt{mar} parameter settings to place single plots either row by row or column by column. Here, \texttt{mfrow} and \texttt{mfcol} to the job. In this case a vector of the form \texttt{c(nr, nc)} draws subsequent figures in an nr-by-nc array on the device by columns (mfcol) or rows (mfrow), respectively.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Layout of Single Plots} There is another option in R to create panel layouts, not necessarilly in an rectangular array. Have a look to the help page of the function \texttt{layout}, her comes a simple example. <>= nf <- layout(mat=matrix(c(1, 1, 2, 3), byrow = TRUE, nrow=2)) par(mar = c(bottom=2, 5.1, top=3, 2.1)) plot(tS3[, 1]) par(mar = c(bottom=3, 5.1, top=2, 1.1)) plot(tS3[, 2]) par(mar = c(bottom=3, 4.1, top=2, 2.1)) plot(tS3[, 3]) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{With the function \texttt{layout} you can devide the plot device in rows and columns expressed in matrix form defined by the argument \texttt{mat}. } \end{figure} \end{center} %To be more specific, the graph \texttt{i} is allocated a region composed %from a subset of these rows and columns, based on the rows and columns %in which \texttt{i} occurs in the matrix \texttt{mat}. %The argument \texttt{layout.show(n)} plots (part of) the current layout, %namely the outlines of the next \texttt{n} figures. % ----------------------------------------------------------------------------- \pagebreak \subsection*{} In addition widths and heights of the layout can be different from row to row, and/or from column to column. The sizes are expressed by the arguments \texttt{widths} and \texttt{heights} of the function \texttt{layout}. <>= nf <- layout(mat=matrix(c(1, 1, 2, 3), byrow=TRUE, nrow=2), heights=c(2.5,1)) par(mar = c(bottom=2, 5.1, top=3, 2.1)) plot(tS3[, 1]) par(mar = c(bottom=3, 5.1, top=1.5, 1.1)) plot(tS3[, 2]) par(mar = c(bottom=3, 4.1, top=1.5, 2.1)) plot(tS3[, 3]) @ \begin{center} \begin{figure}[h] <>= <> @ \caption{With the function \texttt{layout} one can also define the widths and heights of the columns and rows.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Bivariate Scatter Plots} For historical reasons, like in the function \texttt{plot.ts}, there is also the option to create an scatter plot from two univariaye time series. Since this is not a "true" time series plot, we will not go in further detail for this display. <>= par(mfrow=c(1,1)) plot(tS2[, 1], tS2[, 2]) @ \begin{center} \begin{figure}[h] <>= <> @ \caption{If \texttt(x) and \texttt(y) are univariate time series, then the plot function will display a scatter plot.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 3 \newpage\thispagestyle{empty}\mbox{} \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Time Axis Layout} The function \texttt{plot} comes with three options to design the time axis layout: \texttt{"pretty"}, \texttt{"chic"}, and \emph{} (note this not a string argument. \emph{} should just abbreviate that we have to input character strings of fully arbitray \texttt{at} positions. For the first two options the style of the axis annotation is generated in a fully automated way, whereas in the tailored case each tick on the axis to be user defined. \noindent The \emph{"pretty"} time axis layout is the default setting for the argument \texttt{at}. Internally the function \texttt{pretty} is used to compute a sequence of about \texttt{n+1} equally spaced round values which cover the range of the values in the time stamps \texttt{time(x)} of the series \texttt{x}. The values are chosen so that they are 1, 2 or 5 times a power of 10. \noindent The \emph{"chic"} time axis layout is the alternative setting for the argument \texttt{at}. Internally the function \texttt{axTicksByTime} from the package \texttt{xts} is used to compute the sequence of axis positions and the format labels. \noindent The \emph{} time axis layout leaves it to the user to specify by himself the positions (at), the time label formatting (format), and the minor tick marks (minor.ticks). % ----------------------------------------------------------------------------- \pagebreak \subsection{Time Axis: "pretty" or "chic"?} Our plotting function comes with two axis-styles. The first is called \texttt{"pretty"}, which is the default style, and calculates positions from R's base function \texttt{pretty}. The other is called \texttt{"chic"} to remember its origin, arising from the "Chicago" \texttt{xts} package. \vspace{-0.7cm} <>= par(mfcol = c(2, 1)) plot(tS1, at = "pretty") plot(tS1, at = "chic") @ \vspace{-0.3cm} \begin{center} \begin{figure}[h] <>= <> @ \caption{The graph shows the two flavours from the \texttt{at="pretty"} and the \texttt{"chic"} axis designs. The first style uses the function \texttt{pretty} from R's \texttt{base} environment to compute the positions for the major ticks. The second style uses the function \texttt{axTicksByTime} from the \texttt{xts} package to compute x-axis tick mark locations by time. In the upper graph the minor ticks are calendar days, whereas in the lower graph weekdays are drawn (therefore the small gaps between the minor ticks become visible). Note, the time series is in both cases an object of class \texttt{timeSeries}.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection*{} Now let us plot a multivariate 3-column time series in a single panel. Again we compare the outcome of the \texttt{"pretty"} and the \texttt{"chic"} axis style. <>= par(mfcol=c(2, 1)) plot(tS3, plot.type="s", at="pretty") plot(tS3, plot.type="s", at="chic") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The only difference of this graph compared to the previous is the fact that we consider here a multivariate time series. Three curves are shown in a common plot. Note, when using the \texttt{"chic"} style, then the vertical gridlines are narrower compared to the \texttt{"pretty"} style.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Time Axis - Selecting Minor Tick Marks} The \texttt{"pretty"} style allows to draw the minor tick marks on different time scales. These are: \texttt{"day"}, \texttt{"week"}, and \texttt{"month"}. <>= par(mfrow=c(3, 1)) plot(tS1, minor.ticks="day", at="pretty") plot(tS1, minor.ticks="week", at="pretty") plot(tS1, minor.ticks="month", at="pretty") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{It is worth to note that a good selection of minor tick marks makes a plot much better readable.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Time Axis - One Column Multiple Plot Layout} In the multiple plot layout the axis are drawn along the same principles as they are drawn in the case of the single plot layout. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", at="pretty") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows a one column multiple plot layout. The one column layout is generated for up to four time series. When the multivariate time series has more then four time series then a two column layout is displayed. It is up to you which axis style you prefer, \texttt{at="pretty"} or \texttt{at="chic".}} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Time Axis - Two Column Multiple Plot Layout} Concerning the style of the axis, there is now difference between the one and two column plot designs. <>= par(mfrow=c(1, 1)) plot(tS6, plot.type="m", at="chic") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{When we have more then four time series, then the display will be generated in two columns. Note, it is possible to modify the width of the gap between the two columns.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Tick and Format Layout: The axis style} The third alternative to style the axis offers the users to define format positions according to his preferences. Here comes an example: <>= par(mfrow=c(2, 1)) at <- paste0("200", c("6-01", "6-04", "6-07", "6-10", "7-01", "7-04"), "-01") plot(tS3, plot.type="s", format="%B\n%Y", at=at) plot(tS3, plot.type="s", format="%b/%y", at=at) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows plots with user tailored positions and formatted axis labels.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 4 \newpage\thispagestyle{empty}\mbox{} %\newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Annotations} Plot annotations are elelents which can be added to plots or completely discarded. To discard all annotations you have to set \texttt{ann=FALSE} in the argument list of the timSeries \texttt{plot} function. To display annotation you can call the function \texttt{title}. This allows to add the main title, the sub title, and the x- and y-labels to a plot. Together with the appropriate character strings, you can also specify the placement of these annotations by the arguments \texttt{line} and \texttt{outer}. There are additional functions to add annotations to a plot. These are \texttt{text} and \texttt{mtext}. % ----------------------------------------------------------------------------- \pagebreak \subsection{Discarding all Annotations} In a default plot we display only the value-label(s) which are taken from the units or column names of the time time series object. Title, sub title, and time-label are not shown. To discard the appearance of all annotations on a plot you have to set the plot argument \texttt{ann=FALSE}. <>= par(mfrow=c(2, 2)) plot(tS1, ann=FALSE) plot(tS3, plot.type="s", ann=FALSE, at="pretty") plot(tS6, plot.type="s", ann=FALSE, at="pretty") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows a plot where all annotations have been discarded. Now feel free to add your own annotations.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Adding Title and Labels} To add a main title, a sub, title, and x- and y-labels you can call the function \texttt{title}. <>= par(mfrow=c(2, 2)) plot(tS1); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index", xlab = "Date") plot(tS6, plot.type="s"); title(main = "Index", xlab = "Date") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph displays in a two by two array four single plots. We have added title and x-lable annotations.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Axis Font Size} Sometimes the axis font size may be considered as too small or too large. Then you can use the plot argument \texttt{cex.axis} to upsize or downsize the font. <>= par(mfrow=c(3, 1)) plot(tS3, at="chic", plot.type="s", cex.axis=0.75) plot(tS3, at="chic", plot.type="s", cex.axis=1.00) plot(tS3, at="chic", plot.type="s", cex.axis=1.25) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This is an example how to change the size of the axis labels relatively to its default value. The upper graph shows a font size decreased by 20\%, the lower graph a font size increased by 25\%. You can proceed in the same way when using the \texttt{"pretty"} axis style.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Flipping Value Axes} Flipping every second axis label in a multiple plot from left to rigth might be meaningful in the case when axis labels overwrite themselves. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", yax.flip = TRUE) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The graph shows an one column multiple plot, where the axis of the middle panel is flipped from the left to the right. Note, the same procedure can also be applied two two column multiple plots.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 5 \newpage\thispagestyle{empty}\mbox{} %\newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Decorations} There exist several options to decorate plots in different ways. Plot types (lines, points, horizontal bars, etc.) can be modified, colors can be changed, lines can be modified by style and seize, points can be selected by symbol and size. \noindent In the following we will give some examples \begin{itemize} \item Modifying Types \item Changing Colors by Names \item Changing Colors by Color Palettes \item Changing Line Styles \item Modifying Line Widths \item Changing Plot Symbols \item Modifying Plot Symbol Sizes \item Discarding Grid Lines \item Drawing a Box \end{itemize} \noindent to show a few of the many types of cdecorations. Play around to achieve your perfect layout. % ----------------------------------------------------------------------------- \pagebreak \subsection{Modifying Types} <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", type=c("l", "p", "h"), at="pretty") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{If we like to consider in a multiple plot for each panel its own plot style then we can set the parameter \texttt{type}.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Colors by Names} Colors can be changed in several ways. Just by their numbers, e.g. 1 (black), 2 (red), 3 (green) etc., or by name, e.g. "black", "red", "green", etc. or by using well designed color palettes. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=c("blue", "orange", "darkgreen")) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows how to assign colors by name in the case of a multiple plot. You can do it in the same way setting \texttt{plot.type="s"} if you like to display all three curves in a common single plot.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Colors by Color Palettes} When the number of curves increases, then it can become quite difficult to find a set of nice colors. In such cases it is convenient to select the colors from color palettes. <>= par(mfrow=c(1, 1)) plot(tS6, plot.type="s", col=heat.colors(n=6, alpha = 1), at="chic", format = "%B\n%Y") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows an example of six curves diplayed in a sequence of reds. For this we called the function \texttt{seqPalette}.} \end{figure} \end{center} \pagebreak \begin{verbatim} FUNCTION: COLOUR PALETTE rainbowPalette Contiguous rainbow colour palette heatPalette Contiguous heat colour palette terrainPalette Contiguous terrain colour palette topoPalette Contiguous topo colour palette cmPalette Contiguous cm colour palette greyPalette R's gamma-corrected gray palette timPalette Tim's MATLAB-like colour palette rampPalette Colour ramp palettes seqPalette Sequential colour brewer palettes divPalette Diverging colour brewer palettes qualiPalette Qualified colour brewer palettes focusPalette Red, green and blue focus palettes monoPalette Red, green and blue mono palettes \end{verbatim} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Line Styles} In multiple plot to each curve an own line style \texttt{lty} can be assigned: 0 "blank", 1 "solid", 2 "dashed", 3 "dotted", 4 "dotdash", 5 "longdash", or 6 "twodash". <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=1, lty=1:3, at="chic") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{When we like to print plots in black and white, then its makes much sense to use different line types so that we can distinguish the curves one from each other.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Modifying Line Widths} Not only the line type, but also the line width can be modified for each curve in an individual kind. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=1, lwd=3:1, at="chic") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The graph shows three line widths, the upper's curve width is thick, the middle's curve width is medium, and the lowest's curve width is the thinnest one.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Plot Symbols} To use different plot symbols we can assign them by the parameter \texttt{pch}. Don't forget also to set \texttt{type="p"}. %<>= %par(mfrow=c(1, 1)) %tS3weekly <- align(tS3, by="1w") %plot(tS3weekly, plot.type="s", type="p", col=1:3, pch=21:23, at="chic") %@ \medskip %\begin{center} %\begin{figure}[h] %<>= %<> %@ %\caption{This plot shows how to assign different plot symbols to the curves %in a single plot.} %\end{figure} %\end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Modifying Plot Symbol Sizes} The argument \texttt{cex.pch} allows to increase or decrease plot symbol sizes with respect to the current plot symbol size. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="s", type="p", col=1:3, pch=21:23, cex.pch=c(0.2, 0.2, 0.2), at="pretty") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This plot show how to change the size of plot symbols in a single plot setting the argument \texttt{cex.pch}. Note, for each curve its own size can be set. The same approach can be used also for multiple plots.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Discarding Grid Lines} By default grid lines are displayed. To discard the grid lines from the plot set the arguments \texttt{grid=FALSE}. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="s", grid=FALSE) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{By default a grid is drawn on top of the plot. You can remove it by setting the argument \texttt{grid=FALSE}} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Drawing a Box} <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="s", frame.plot=FALSE, grid=FALSE) box() box(bty = "7", col = "white") # boxL grid(NA, NULL, col = "darkgrey") # hgrid @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{By default the plots are displayed as frame plots. This means that the graphs are surrounded by a box. This box can be discarded setting the plot argument \texttt{frame.plot=FALSE}.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 6 \newpage\thispagestyle{empty}\mbox{} %\newpage\thispagestyle{empty}\mbox{} \pagebreak \section{The Panel Function} Multiple plots are very powerful plotting designs. Each panel in a graph can individually tailored by the user. By default each curve in a panel is generated by the function \texttt{lines}. You can define your own panel function(s) by setting the plot argument \texttt{panel} to a user dfined functions. In the following we will show three examples. % ----------------------------------------------------------------------------- \pagebreak \subsection{Adding a Horizental Zero Line} In this example we show how to write a panel function which allows to add a horizontal zero line to each plot panel. <>= par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, col=col) abline(h=0, col = "brown", lwd=2)} plot(returns(tS3), plot.type="m", col = .colorwheelPalette(3), panel=lines2, at="pretty") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{This multiple plot shows panels with curves having a horizontal zero reference line.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Adding an Rug to Multiple Return Plots} This example shows how to add in each panel rugs to the righ Y-axis. <>= par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, type="h", col=col) rug(Y, side=4, col="steelblue") } plot(returns(tS6), plot.type="m", col = .colorwheelPalette(6), panel=lines2, at="pretty") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{This multiple plot shows panels with rugs on the right Y-axis.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Adding an EMA to Multiple Index Plots} This example shows how to add an EMA indicator to each plot panel. The \texttt{emaTA()} function is provided by the \texttt{fTrading} package. <>= par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, type="l", col=col) lines(x=X, y=emaTA(Y), col="black") } plot(tS3, plot.type="m", col = .colorwheelPalette(3), panel=lines2, grid=TRUE, at="pretty") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{A multiple graph with EMA indicators in each panel.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 7 \newpage\thispagestyle{empty}\mbox{} \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Conclusions} The \texttt{plot} function in the \texttt{timeSeries} package is a very powerful tool to create plots from time series objects. This includes to display univariate and multivariate time series in single and multiple panels, to select from two styles for the time-axis or even to tailor positions and formats according to his own needs, and to modifiy annotations and decorations of plots. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 8 \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Appendix} In the appendix we have summarized graphs and tables which are useful tools to create plots. We have reprinted the default color table from R, we have summarized several color palettes as available in the \texttt{fBasics} package and other contributed R packages, and two tables with font characters and plot symbols. % ----------------------------------------------------------------------------- \pagebreak \subsection{Margins: mar and oma} <>= # Plot: # - oma stands for 'Outer Margin Area' # - mar represents the 'figure Margins' # - The default size is c(5,4,4,2) + 0.1 # - The axes tick marks will go in the first lines par(mfrow=c(1, 1)) par(oma=c(3,3,3,3)) # all sides have 3 lines of space par(mar=c(5,4,4,2) + 0.1) plot(x=1:10, y=1:10, type="n", xlab="X", ylab="Y") # Add Text tot the Plot Part - red text(5,5, "Plot", col="red", cex=2) text(5,4, "text(5,5, \"Plot\", col=\"red\", cex=2)", col="red", cex=1) box("plot", col="red", lwd=2) # Add text to thebThe Figure Part - grey mtext("Margins", side=3, line=2, cex=1.5, col="grey") mtext("par(mar=c(5,4,4,2) + 0.1)", side=3, line=1, cex=1, col="grey") mtext("Line 0", side=3, line=0, adj=1.0, cex=1, col="grey") mtext(" 1", side=3, line=1, adj=1.0, cex=1, col="grey") mtext("Line 2", side=3, line=2, adj=1.0, cex=1, col="grey") mtext("Line 3", side=3, line=3, adj=1.0, cex=1, col="grey") mtext("Line 0", side=2, line=0, adj=1.0, cex=1, col="grey") mtext("Line 1", side=2, line=1, adj=1.0, cex=1, col="grey") mtext("Line 2", side=2, line=2, adj=1.0, cex=1, col="grey") mtext("Line 3", side=2, line=3, adj=1.0, cex=1, col="grey") box("figure", col="grey") # The title will fit in the third line on the top of the graph. title("Ttitle - Third Line") # Note 'outer=TRUE' moves us from the figure to the outer margins. mtext("Outer Margin Area", side=1, line=1, cex=1.8, col="brown", outer=TRUE) mtext("par(oma=c(3,3,3,3))", side=1, line=2, cex=1, col="orange", outer=TRUE) mtext("Line 0", side=1, line=0, adj=0.0, cex=0.8, col="orange", outer=TRUE) mtext("Line 1", side=1, line=1, adj=0.0, cex=1, col="orange", outer=TRUE) mtext("Line 2", side=1, line=2, adj=0.0, cex=1, col="orange", outer=TRUE) box("outer", col="orange") @ \pagebreak \subsection*{} \begin{center} <>= <> @ \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Character Table} \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{characterTableFig.pdf} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Color Table} \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{colorTableFig.pdf} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Color Palettes I} \medskip \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{colorPalettes1Fig.pdf} \end{figure} \end{center} \pagebreak \subsection{Color Palettes II} \medskip \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{colorPalettes2Fig.pdf} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Symbol Table} \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{symbolTableFig.pdf} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Axis Style "pretty"} <>= FORMAT <- tS1@format FORMAT POSITIONS <- pretty(tS1) POSITIONS LABELS <- pretty(tS1) LABELS @ % ----------------------------------------------------------------------------- \pagebreak \subsection{Axis Style "chic"} <>= axTicksByTime <- function (x, ticks.on = "auto", k = 1, labels = TRUE, format.labels = TRUE, ends = TRUE, gt = 2, lt = 30) { if (timeBased(x)) x <- xts(rep(1, length(x)), x) tick.opts <- c("years", "months", "weeks", "days", "hours", "minutes", "seconds") tick.k.opts <- c(10, 5, 2, 1, 6, 1, 1, 1, 4, 2, 1, 30, 15, 1, 1) if (ticks.on %in% tick.opts) { cl <- ticks.on[1] ck <- k } else { tick.opts <- paste(rep(tick.opts, c(4, 2, 1, 1, 3, 3, 1)), tick.k.opts) is <- structure(rep(0, length(tick.opts)), .Names = tick.opts) for (i in 1:length(tick.opts)) { y <- strsplit(tick.opts[i], " ")[[1]] ep <- endpoints(x, y[1], as.numeric(y[2])) is[i] <- length(ep) - 1 if (is[i] > lt) break } nms <- rev(names(is)[which(is > gt & is < lt)])[1] cl <- strsplit(nms, " ")[[1]][1] ck <- as.numeric(strsplit(nms, " ")[[1]][2]) } if (is.null(cl)) ep <- NULL else ep <- endpoints(x, cl, ck) if (ends) ep <- ep + c(rep(1, length(ep) - 1), 0) if (labels) { if (is.logical(format.labels) || is.character(format.labels)) { unix <- ifelse(.Platform$OS.type == "unix", TRUE, FALSE) time.scale <- periodicity(x)$scale fmt <- ifelse(unix, "%n%b%n%Y", "%b %Y") if (time.scale == "weekly" | time.scale == "daily") fmt <- ifelse(unix, "%b %d%n%Y", "%b %d %Y") if (time.scale == "minute" | time.scale == "hourly") fmt <- ifelse(unix, "%b %d%n%H:%M", "%b %d %H:%M") if (time.scale == "seconds") fmt <- ifelse(unix, "%b %d%n%H:%M:%S", "%b %d %H:%M:%S") if (is.character(format.labels)) fmt <- format.labels names(ep) <- format(index(x)[ep], fmt) } else { names(ep) <- as.character(index(x)[ep]) } ep } } @ <>= ticks <- axTicksByTime(as.xts(tS1)) ticks @ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagebreak \section*{About the Authors} % ----------------------------------------------------------------------------- % Diethelm Wuertz \noindent\textbf{Diethelm W\"urtz} is professor at the Institute for Theoretical Physics, ITP, and for the Curriculum Computational Science and Engineering, CSE, at the Swiss Federal Institute of Technology in Zurich. He teaches Econophysics at ITP and supervises seminars in Financial Engineering. Diethelm is senior partner of Finance Online, an ETH spin-off company in Zurich, and co-founder of the Rmetrics Association in Zurich.\\ % ----------------------------------------------------------------------------- % Tobias Setz \noindent \textbf{Tobias Setz} has a Bachelor and Master in Computational Science from ETH in Zurich and has contributed with his Thesis projects on wavelet analytics and Bayesian change point analytics to this handbook. He is now a PhD student in the Econophysics group at ETH Zurich at the Institute for Theoretical Physics.\\ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagebreak \section*{About Rmetrics} \noindent\emph{Rmetrics Open Source Project} With hundreds of functions built on modern methods, the Rmetrics open source software combines exploratory data analysis, statistical modelling and rapid model prototyping. The R/Rmetrics packages are embedded in R, building an environment which creates a first class system for applications in teaching statistics and finance. Rmetrics covers Time Series Econometrics, Hypothesis Testing, GARCH Modelling and Volatility Forecasting, Extreme Value Theory and Copulae, Pricing of Derivatives, Portfolio Analysis, Design and Optimization, and much more. \noindent\emph{The Rmetrics Association}\\ is a non-profit taking association working in the public interest. The Rmetrics Association provides support for innovations in financial computing. We believe that the Rmetrics Open Source software has become a valuable educational tool and that it is worth ensuring its continued development and the development of future innovations in software for statistical and computational research in finance. Rmetrics provides a reference point for individuals and institutions that want to support or interact with the Rmetrics development community. Rmetrics encourages students to participate in Rmetrics' activities in the context of Student Internships. \noindent\emph{Rmetrics Software Evalution}\\ If you like to get an impression of the size and quality of the Open Source Rmetrics Program have a look on the Ohloh Rmetrics Software Evaluation. The Evalutions gives an overview about the Software Development (Code Analysis, Estimated Cost), the people behind it, and its community. \noindent\emph{Contributions to Rmetrics}\\ are coming from several educuational institutions world wide. These include the Rmetrics web site and documentation project supported by ITP/CSE ETH Zurich, the organization of Summerschools and Workshops supported by ITP/CSE ETH Zurich, the R-sig-Finance Help and Mailing List, supported by SfS ETH Zurich, the R-forge development server, supported by University of Economics in Vienna, CRAN Test and Distribution Server for R software, supported by University of Economics Vienna, the Debian Linux integration supported by the Debian Association. Many thanks to all behind these projects who gave us continuous support over the last years.\\ \noindent Rmetrics Association\\ www.rmetrics.org % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagebreak % References \begin{thebibliography}{99} \bibitem{zoo} Achim Zeileis and Gabor Grothendieck (2005): \emph{ zoo: S3 Infrastructure for Regular and Irregular Time Series.} Journal of Statistical Software, 14(6), 1-27. URL http://www.jstatsoft.org/v14/i06/ \bibitem{tseries} Adrian Trapletti and Kurt Hornik (2007): \emph{tseries: Time Series Analysis and Computational Finance.} R package version 0.10-11. \bibitem{rmetrics} Diethelm W\"urtz et al. (2007): \emph{Rmetrics: Rmetrics - Financial Engineering and Computational Finance.} R package version 260.72. http://www.rmetrics.org \bibitem{ISO} International Organization for Standardization (2004): \emph{ISO 8601: Data elements and interchage formats --- Information interchange --- Representation of dates and time} URL http://www.iso.org \bibitem{R} R Development Core Team: \emph{R: A Language and Environment for Statistical Computing}, R Foundation for Statistical Computing, Vienna, Austria. ISBN 3-900051-07-0, URL http://www.R-project.org \bibitem{quantmod} Jeffrey A. Ryan (2008): \emph{quantmod: Quantitative Financial Modelling Framework.} R package version 0.3-5. URL http://www.quantmod.com URL http://r-forge.r-project.org/projects/quantmod \end{thebibliography} \end{document} timeSeries/inst/extensionsTests/0000755000176000001440000000000013612573075016623 5ustar ripleyuserstimeSeries/inst/extensionsTests/xtsWrappers.R0000644000176000001440000002451012407027076021306 0ustar ripleyusers require(xts) require(timeSeries) X <- cumulated(LPP2005REC)[, 1:3] for (i in 1:3) X[, i] <- 100*X[, i]/as.vector(X[1,i]) Data <- alignDailySeries(X) # add: startDate Index <- time(Data) # Generate time Series: x.tS <- timeSeries(data=Data, charvec=format(Index)) x.xts <- xts(x=Data, order.by=strptime(Index, format="%Y-%m-%d"), tzone="GMT") ############################################################################### # Class: class(x.xts) class(x.tS) # ----------------------------------------------------------------------------- # coredata # "coredata" methods for time series objects strip off the index/time # attributes and return only the observations. # xts/zoo: COREDATA <- zoo::coredata(x=x.xts) class(COREDATA) head(COREDATA) dimnames(COREDATA) # timeSeries: coredata2 <- function(x) methods::getDataPart(x) COREDATA <- coredata2(tS) class(COREDATA) head(COREDATA) dimnames(COREDATA) # timeSeries: SERIES <- series(tS) class(SERIES) head(SERIES) dimnames(SERIES) # Extractor Function # getDataPart # setDataPart # ----------------------------------------------------------------------------- # index # Generic functions for extracting the index of an object and replacing it. # xts/zoo: INDEX <- zoo::index(x=x.xts) class(INDEX) head(INDEX) # xts/zoo: TIME <- stats::time(x=x.xts) class(TIME) head(TIME) # xts/zoo: INDEX <- index(x=x.tS) class(INDEX) head(INDEX) TIME <- stats::time(x=x.tS) class(TIME) head(TIME) # Extractor Function: # getTime # setTime # ----------------------------------------------------------------------------- # indexClass # The specified value for indexClass<- must be a character string # containing one of the following: Date, POSIXct, chron, yearmon, # yearqtr or timeDate. indexClass(x.xts) tclass(x.xts) indexClass <- function(x) class(time(x)) tclass <- function(x) class(time(x)) class(x.tS) indexClass(x.tS) tclass(x.tS) # ----------------------------------------------------------------------------- # indexFormat # Functions to extract, replace, and format the class of the index of # an xts object. FORMAT <- indexFormat(x.xts) FORMAT indexFormat <- function(x) getSlot(x, "format") indexFormat(x.tS) indexFormat <- function(x) slot(x, "format") indexFormat(x.tS) indexFormat <- function(x) x.tS@format indexFormat(x.tS) # Extractor Function # getFormat # setFormat # ----------------------------------------------------------------------------- # indexTZ xts::indexTZ(x.xts) xts::tzone(x.xts) indexTZ <- function(x) getSlot(x.tS, "FinCenter") tzone(x.xts) getFinCenter(x.tS) x.tS@FinCenter getSlot(x.tS, "FinCenter") ############################################################################### # endpoints # extract index values of a given xts object corresponding to the last # observations given a period specified by on require(timeSeries) tD <- timeCurrentYear(2011) tM <- timeCalendar(2011) ############################################################################### # aggregate: # from stats Package: The function aggregate splits the data into subsets, # computes summary statistics for each, and returns the result in a # convenient form. # AGGREGATION OVER NON-OVEWRLAPPING PERIODS # starting point: aligned daily Data # Aggregation Statistics: open <- function(x) as.vector(x)[1] close <- function(x) rev(as.vector(x))[1] high <- function(x) max(x) low <- function(x) min(x) spread <- function(x) max(x) - min(x) # Aggregation Levels: # weekly/biweekly: endOfWeek, onTuesdays, lastBusinessDay # monthly: endOMonth, lastFriday, lastBusinessDay # quarterly: 3-monthly # half-annually: 6-monthly # yearly: 12-monthly # timeSeries: Weekly - end of week tD <- time(x.tS) tD <- tD[dayOfWeek(tD) == "Fri"] by <- timeSequence(from=start(tD), to=end(tD), by = "week") endOfWeek <- aggregate(x.tS, by, mean) endOfWeek # timeSeries: Weekly on Tuesdays tD <- time(x.tS[-(1:5), ]) by <- timeSequence(from=start(tD), to=end(tD), by = "week") tuesdays.period <- aggregate(x.tS, by, last) dayOfWeek(time(tuesdays.period)) cbind( open=aggregate(x.tS[, 1], by, open), high=aggregate(x.tS[, 1], by, high), low=aggregate(x.tS[, 1], by, low), close=aggregate(x.tS[, 1], by, close)) period1 <- as.timeSeries(period1) cbind(period1, period2, period3) # Aggregate to Last Friday of Month - tD <- timeSequence(from=start(tD), to=end(tD), by = "week") by <- unique(timeLastNdayInMonth(tD, nday=5)) aggregate(x.tS, by, mean) # Aggregate to Last Day of Quarter - by <- unique(timeLastDayInQuarter(tD)) aggregate(x.tS, by, mean) # ----------------------------------------------------------------------------- # rolling 52-weekly-highs and lows # xts: Mean on weekly Periods ep <- xts::endpoints(x.xts, on='weeks', k=1) by1 <- index(x.xts)[ep[-1]] period1 <- xts::period.apply(x.xts, INDEX=ep, FUN=mean) ############################################################################### # xts::apply.monthly FUN <- mean x <- x.xts apply.daily(x, FUN) apply.weekly(x, FUN) apply.monthly(x, FUN) apply.quarterly(x, FUN) apply.yearly(x, FUN) # timeDate::align FUN <- mean x <- unique(time(x.tS)) alignDaily(x, include.weekends=FALSE) by1 <- unique(alignMonthly(x, include.weekends=FALSE)) x1 <- timeSeries::aggregate(x.tS, by1, FUN) by2 <- unique(alignMonthly(x, include.weekends=TRUE)) x2 <- timeSeries::aggregate(x.tS, by2, FUN) by1 <- unique(alignQuarterly(x, include.weekends=FALSE)) x1 <- timeSeries::aggregate(x.tS, by1, FUN) by2 <- unique(alignQuarterly(x, include.weekends=TRUE)) x2 <- timeSeries::aggregate(x.tS, by2, FUN) cbind(x1,x2) ############################################################################### xts::first(x.xts) xts::last(x.xts) first2 <- function(x) x[start(x), ] last2 <- function(x) x[end(x), ] first2(x.tS) last2(x.tS) # ----------------------------------------------------------------------------- INDEX <- seq(1, nrow(xts), by=21) INDEX .period.apply(tS, INDEX, FUN=max) .period.max <- function(x, INDEX, FUN=max) .period.apply(x, INDEX, max) .period.max(tS[, 1], INDEX) .period.min <- function(x, INDEX) .period.apply(x, INDEX, min) .period.min(tS[, 1], INDEX) xts::period.apply(xts[, 1], INDEX, FUN=max) xts::period.max(xts[, 1], INDEX) xts::period.min(xts[, 1], INDEX) xts::period.prod(xts[, 1], INDEX) xts::period.sum(xts[, 1], INDEX) # ----------------------------------------------------------------------------- # timeBased is.timeBased <- function (x) { if (!any(sapply(c( "Date", "POSIXt", "chron", "dates", "times", "timeDate", "yearmon", "yearqtr", "xtime"), function(xx) inherits(x, xx)))) { ans <- FALSE } else { ans <- TRUE } ans } timeBased <- function(x) { is.timeBased(x) } # ----------------------------------------------------------------------------- alignDaily(x=time(tS), include.weekends=FALSE) alignMonthly(x=time(tS), include.weekends=FALSE) # error alignQuarterly(x=time(tS), include.weekends=FALSE) # error tD <- Sys.timeDate() + 1:1000 timeDate::align(tD, by="10s") timeDate::align(tD, by="60s") timeDate::align(tD, by="10m") # error td <- as.xts(Sys.time()) + 1:1000 xts::align.time(td, n=10) # every 10 seconds xts::align.time(td, n=60) # align to next whole minute xts::align.time(td, n=10*60) # align to next whole 10 min interval xts::shift.time(td, n=10) xts::shift.time(td, n=60) xts::shift.time(td) # ----------------------------------------------------------------------------- xts::to.minutes(x,k,name,...) xts::to.minutes3(x,name,...) xts::to.minutes5(x,name,...) xts::to.minutes10(x,name,...) xts::to.minutes15(x,name,...) xts::to.minutes30(x,name,...) xts::to.hourly(x,name,...) xts::to.daily(x,drop.time=TRUE,name,...) xts::to.weekly(x,drop.time=TRUE,name,...) xts::to.monthly(x,indexAt='yearmon',drop.time=TRUE,name,...) xts::to.quarterly(x,indexAt='yearqtr',drop.time=TRUE,name,...) xts::to.yearly(x,drop.time=TRUE,name,...) xts::to.period( x, period = 'months', k = 1, indexAt, name=NULL, OHLC = TRUE, ...) # ----------------------------------------------------------------------------- # Convert an object to a specified periodicity lower than the given data # object. For example, convert a daily series to a monthly series, or a # monthly series to a yearly one, or a one minute series to an hourly # series. data(sample_matrix) xts <- as.xts(sample_matrix) # is daily to.weekly(xts) to.monthly(xts) to.quarterly(xts) to.yearly(xts) tS <- as.timeSeries(sample_matrix) % ----------------------------------------------------------------------------- as.numeric(as.POSIXct(time(tS))) getFinCenter(tS) indexTZ(xts, ) tzone(xts, ) tzone(xts) <- "GMT" .index(xts, ) indexClass(xts) class(time(tS)) % ----------------------------------------------------------------------------- .index <- function(x) as.numeric(as.POSIXct(time(x))) .indexDate <- function(x) .index(x)%/%86400L .indexday <- function(x) .index(x)%/%86400L .indexmday <- function(x) as.POSIXlt(.POSIXct(.index(x)))$mday .indexwday <- function(x) as.POSIXlt(.POSIXct(.index(x)))$wday .indexweek <- function(x) .indexmon <- function(x) .indexyday <- function(x) .indexyear <- function(x) .indexhour <- function(x) .indexmin <- function(x) .indexsec <- function(x) # Atoms # atoms # Roll over fixed periods of length k point by point ... # Functions borrowed from zoo timeSeries::rollMin( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMax( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMean( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMedian( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollStats( x, k, FUN = mean, na.pad = FALSE, align = c("center", "left", "right"), ...) # Roll over Calendarical periods: rollDailySeries(x, period="7d", FUN, ...) rollMonthlySeries(x, period="12m", by="1m", FUN, ...) # e.g. rollQuarterlySeries(x, period="12m", by="3m", FUN) # e.g. rollYearlySeries rollMonthlyWindows(x, period="12m", by="1m") # apply # applySeries # period.apply # Apply a specified function to data over a given interval, where the # interval is taken to be the data from INDEX[k] to INDEX[k+1], for # k=1:(length(INDEX)-1). # ----------------------------------------------------------------------------- timeSeries/inst/extensionsTests/endpointsWrappers.R0000644000176000001440000001457112407027076022501 0ustar ripleyusers require(timeSeries) ############################################################################### # FUNCTION: # timeNdayInWeek # timeLastBizdayInWeek # FUNCTION: # timeLastDayInMonth # timeLastNdayInMonth # timeLastBizdayInMonth # timeNthNdayInMonth # FUNCTION: # timeLastDayInQuarter # timeLastNdayInQuarter # timeLastBizdayInQuarter # timeNthNdayInQuarter ############################################################################### ############################################################################### # endpoints # extract index values of a given time Series object corresponding to # the last calendarical observation in the specified period require(timeSeries) # Daily and Monthly Series in 2011: tD <- timeCurrentYear(2011) tM <- timeCalendar(2011) ############################################################################### # Weekly Endpoints # ----------------------------------------------------------------------------- # On Given nDay of Week: timeNdayInWeek <- function(x, nday=5) { X <- align(x) DOW <- c("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat") X[dayOfWeek(X) == DOW[nday+1], ] } LastDayInWeek <- timeNdayInWeek(tD) LastDayInWeek dayOfWeek(LastDayInWeek) # ----------------------------------------------------------------------------- # Last Bizday In Week: timeLastBizdayInWeek <- function(x, holidays=holidayNYSE) { # Extend time Sequence: x <- timeSequence( from = timeDate(x[1]), to = timeDate(x[length(x)]), by = "day") # Bizdays Function: FUN <- function(x, holidays = holidays) { holidays <- holidayNYSE() posix <- as.POSIXct(x, zone = "", origin = "1970-01-01") check <- isBizday(as.timeDate(posix), holidays = holidays, wday = 1:5) ans <- rev(x[check])[1] ans } # Create Periods from: by <- timeDayInWeek(x, nday=5) bySec <- as.numeric(by, "sec") xSec <- as.numeric(x, "sec") # Compute Index: INDEX <- findInterval(xSec, bySec + 1) INDEX <- INDEX + 1 is.na(INDEX) <- !(INDEX <= length(by)) dates <- matrix(apply(matrix(xSec, ncol=1), 2, tapply, INDEX, FUN), ncol=1) dates <- as.timeDate(as.POSIXct(dates, zone="GMT", origin="1970-01-01")) # Return Value: dates } LastNYBizdayInWeek <- timeLastBizdayInWeek(tD, holidays=holidayNYSE) LastNYBizdayInWeek dayOfWeek(LastNYBizdayInWeek) # Can we attribute the day of week? ans <- timeSeries( data = rnorm(length(LastBizdayInWeek)), charvec = timeLastBizdayInWeek(tD), recordIDs = data.frame(DOW=dayOfWeek(LastBizdayInWeek))) ############################################################################### # Monthly Endpoints # ----------------------------------------------------------------------------- # Last Calendar Day in Month: LastDayInMonth <- timeLastDayInMonth(tX, unique=TRUE) LastDayInMonth dayOfWeek(LastDayInMonth) # ----------------------------------------------------------------------------- # Last Friday in Month: LastFridayInMonth <- timeLastNdayInMonth(tX, nday=5, unique=TRUE) LastFridayInMonth dayOfWeek(LastFridayInMonth) # ----------------------------------------------------------------------------- # Last New-York Bizday in Month holidayNYSE(2011) LastNYBizdayInMonth <- timeLastBizdayInMonth(tD, holidays=holidayNYSE(), unique=TRUE) LastNYBizdayInMonth dayOfWeek(LastNYBizdayInMonth) # ----------------------------------------------------------------------------- # 2nd Tuesday in Month: SecondTuesdayInMonth <- timeNthNdayInMonth(tX, nth=2, nday=2, unique=TRUE) SecondTuesdayInMonth dayOfWeek(SecondTuesdayInMonth) ############################################################################### # Quarterly Endpoints # ----------------------------------------------------------------------------- # Last Day in Quarter: timeLastDayInQuarter <- function(charvec, format="%Y-%m-%d", zone="", FinCenter="", unique = FALSE) { # Description: # Returns Last Nday in Quarter ans <- timeLastDayInMonth(charvec, format, zone = "", FinCenter, unique) INDEX <- which ( atoms(ans)[, 2] %in% c(3, 6, 9, 12) ) ans[INDEX] } LastDayInQuarter <- timeLastDayInQuarter(tD, unique=TRUE) LastDayInQuarter dayOfWeek(LastDayInQuarter) # ----------------------------------------------------------------------------- # Last Friday in Quarter: timeLastNdayInQuarter <- function(charvec, nday = 1, format = "%Y-%m-%d", zone = "", FinCenter = "", unique = FALSE) { # Description: # Returns Last Nday first/mid/last inMonths of Quarters ans <- timeLastNdayInMonth(charvec, nday, format, zone, FinCenter,unique) INDEX <- which ( atoms(ans)[, 2] %in% c(3, 6, 9, 12) ) ans[INDEX] } LastFridayInQuarter <- timeLastNdayInQuarter(tD, nday=5, unique=TRUE) LastFridayInQuarter dayOfWeek(LastFridayInQuarter) # ----------------------------------------------------------------------------- # Last Bizday in Quarter: timeLastBizdayInQuarter <- function(charvec, holidays = holidayNYSE(), format = "%Y-%m-%d", zone = "", FinCenter = "", unique = FALSE) { ans <- timeLastBizdayInMonth(charvec, holidays, format, zone, FinCenter, unique) INDEX <- which ( atoms(ans)[, 2] %in% c(3, 6, 9, 12) ) ans[INDEX] } LastNYBizdayInQuarter <- timeLastBizdayInQuarter(tD, holidayNYSE(), unique=TRUE) LastNYBizdayInQuarter dayOfWeek(LastNYBizdayInQuarter) # ----------------------------------------------------------------------------- # nth-of Mar/Jun/Sep/Dec Nday in Quarter: timeNthNdayInQuarter <- function(charvec, nday = 1, nth = 1, inMonths = c(3, 6, 9, 12), format = "%Y-%m-%d", zone = "", FinCenter = "", unique = FALSE) { ans <- timeNthNdayInMonth(charvec, nday, nth, format, zone, FinCenter, unique) INDEX <- which ( atoms(ans)[, 2] %in% inMonths) ans[INDEX] } # 2nd Tuesday in (last) Months 3/6/9/12: SecondTuesdayInLastQuarterMonth <- timeNthNdayInQuarter(tD, nth=2, nday=2, unique=TRUE) SecondTuesdayInLastQuarterMonth dayOfWeek(SecondTuesdayInLastQuarterMonth) # 2nd Tuesday in (first) Months 1/4/7/10: SecondTuesdayInFirstQuarterMonth <- timeNthNdayInQuarter(tD, nth=2, nday=2, inMonths=c(1, 3, 7, 10), unique=TRUE) SecondTuesdayInFirstQuarterMonth dayOfWeek(SecondTuesdayInFirstQuarterMonth) # IMM Dates: # The dates are the third Wednesday of March, June, September and December datesIMM <- timeNthNdayInQuarter(tD, nth=3, nday=3, inMonths=c(3, 6, 9, 12), unique=TRUE) datesIMM dayOfWeek(datesIMM) ############################################################################### timeSeries/inst/extensionsTests/alignWrappers.R0000644000176000001440000001720712407027076021567 0ustar ripleyusers # artificial 1 sec data with missing Data tX <- timeSequence("2014-03-07 00:00:00", "2014-03-07 23:59:59", by="sec") s <- sample(1:length(tX))[1:length(tX)/10] tX <- tX[-s] ############################################################################### # align # extract index values of a given xts object corresponding to the last # observations given a period specified by on require(timeSeries) # Random Seed: set.seed(1953) # Create a day of 1s time stamps: tX <- timeSequence("2014-03-07 09:03:17", "2014-03-07 15:53:16", by="sec") # Remove randomly 10% of the data: s <- sample(1:length(tX))[1:length(tX)/10] tX <- sort(tX[-s]) tS <- 201.7*cumulated(timeSeries(data=rnorm(length(tX))/(24*3600), charvec=tX)) plot(tS) head(tS) tZ <- align(tS, by="1min", method="fillNA", offset="42s") head(tZ) tZ <- align(tS, by="3min", method="fillNA", offset="162s") head(tZ) tZ <- align(tS, by="5min", method="fillNA", offset="102") head(tZ) tZ <- align(tS, by="15min", method="fillNA", offset="702s") head(tZ) tZ <- align(tS, by="30min", method="fillNA", offset="1602s") head(tZ) tZ <- align(tS, by="60min", method="fillNA", offset="3402") head(tZ) toPeriod <- function(x, by, method, offset="0s"") { open <- function(x) as.vector(x)[1] high <- function(x) max(x) low <- function(x) min(x) close <- function(x) rev(as.vector(x))[1] cbind( aggregate(SPI, by, open), aggregate(SPI, by, high), aggregate(SPI, by, low), aggregate(SPI, by, close)) } A1 <- timeSeries::align(tS, by="60min") A2 <- xts::to.period(as.xts(tS), period = "minutes", k = 2) open <- function(x) as.vector(x)[1] close <- function(x) rev(as.vector(x))[1] high <- function(x) max(x) low <- function(x) min(x) SPI <- tS[, "SPI"] by <- timeLastDayInMonth(time(tS)) OHLC <- cbind( aggregate(SPI, by, open), aggregate(SPI, by, high), aggregate(SPI, by, low), aggregate(SPI, by, close)) OHLC xts::to.minutes(x,k,name,...) xts::to.minutes3(x,name,...) xts::to.minutes5(x,name,...) xts::to.minutes10(x,name,...) xts::to.minutes15(x,name,...) xts::to.minutes30(x,name,...) xts::to.hourly(x,name,...) # ----------------------------------------------------------------------------- # Time alignment: alignDaily(x=time(tS), include.weekends=FALSE) alignMonthly(x=time(tS), include.weekends=FALSE) # error alignQuarterly(x=time(tS), include.weekends=FALSE) # error tD <- Sys.timeDate() + 1:1000 timeDate::align(tD, by="10s") timeDate::align(tD, by="60s") timeDate::align(tD, by="10m") # error td <- as.xts(Sys.time()) + 1:1000 xts::align.time(td, n=10) # every 10 seconds xts::align.time(td, n=60) # align to next whole minute xts::align.time(td, n=10*60) # align to next whole 10 min interval xts::shift.time(td, n=10) xts::shift.time(td, n=60) xts::shift.time(td) # ----------------------------------------------------------------------------- xts::to.daily(x,drop.time=TRUE,name,...) xts::to.weekly(x,drop.time=TRUE,name,...) xts::to.monthly(x,indexAt='yearmon',drop.time=TRUE,name,...) xts::to.quarterly(x,indexAt='yearqtr',drop.time=TRUE,name,...) xts::to.yearly(x,drop.time=TRUE,name,...) xts::to.period( x, period = 'months', k = 1, indexAt, name=NULL, OHLC = TRUE, ...) # ----------------------------------------------------------------------------- Convert an object to a specified periodicity lower than the given data object. For example, convert a daily series to a monthly series, or a monthly series to a yearly one, or a one minute series to an hourly series. data(sample_matrix) xts <- as.xts(sample_matrix) # is daily to.weekly(xts) to.monthly(xts) to.quarterly(xts) to.yearly(xts) tS <- as.timeSeries(sample_matrix) % ----------------------------------------------------------------------------- as.numeric(as.POSIXct(time(tS))) getFinCenter(tS) indexTZ(xts, ) tzone(xts, ) tzone(xts) <- "GMT" .index(xts, ) indexClass(xts) class(time(tS)) % ----------------------------------------------------------------------------- .index <- function(x) as.numeric(as.POSIXct(time(x))) .indexDate <- function(x) .index(x)%/%86400L .indexday <- function(x) .index(x)%/%86400L .indexmday <- function(x) as.POSIXlt(.POSIXct(.index(x)))$mday .indexwday <- function(x) as.POSIXlt(.POSIXct(.index(x)))$wday .indexweek <- function(x) .indexmon <- function(x) .indexyday <- function(x) .indexyear <- function(x) .indexhour <- function(x) .indexmin <- function(x) .indexsec <- function(x) atoms # Roll over fixed periods of length k point by point ... # Functions borrowed from zoo timeSeries::rollMin( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMax( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMean( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMedian( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollStats( x, k, FUN = mean, na.pad = FALSE, align = c("center", "left", "right"), ...) # Roll over Calendarical periods: rollDailySeries(x, period="7d", FUN, ...) rollMonthlySeries(x, period="12m", by="1m", FUN, ...) # e.g. rollQuarterlySeries(x, period="12m", by="3m", FUN) # e.g. rollYearlySeries rollMonthlyWindows(x, period="12m", by="1m") apply applySeries # period.apply # Apply a specified function to data over a given interval, where the # interval is taken to be the data from INDEX[k] to INDEX[k+1], for # k=1:(length(INDEX)-1). x1 <- xts(matrix(1:(9*6),nc=6), order.by=as.Date(13000,origin="1970-01-01")+1:9) x2 <- x1 xtsAttributes(x1) <- list(series1="1") xtsAttributes(x2) <- list(series2="2") xtsAttributes(x1) xtsAttributes(x2) x3 <- x1+x2 xtsAttributes(x3) x33 <- cbind(x1, x2) xtsAttributes(x33) x33 <- rbind(x2, x1) xtsAttributes(x33) ############################################################################### appendList <- function (x, value) { stopifnot(is.list(x), is.list(value)) xnames <- names(x) for (v in names(value)) { x[[v]] <- if (v %in% xnames && is.list(x[[v]]) && is.list(value[[v]])) appendList(x[[v]], value[[v]]) else c(x[[v]], value[[v]]) } x } "setAttributes<-" <- function(obj, value) { stopifnot(is.list(value)) ATTRIBUTES <- getAttributes(obj) VALUE <- appendList(ATTRIBUTES, value) attr(obj@documentation, "Attributes") <- VALUE obj } getAttributes <- function(obj) { attr(obj@documentation, "Attributes") } obj1 <- dummySeries() getAttributes(obj1) setAttributes(obj1) <- list(series="obj1") getAttributes(obj1) obj2 <- dummySeries() getAttributes(obj2) setAttributes(obj2) <- list(series="obj2") getAttributes(obj2) getAttributes(obj1+obj2) # returns the attributes only for the first getAttributes(obj1-obj2) # returns the attributes only for the first getAttributes(cbind(obj1, obj2)) getAttributes(cbind(obj1, as.matrix(obj2))) # matrix fails getAttributes(rbind(obj1, obj2)) getAttributes(rbind(obj1, as.matrix(obj2))) # matrix fails getAttributes( rev(obj) ) getAttributes( obj[, 1] ) getAttributes( sample(obj) ) getAttributes( sort(sample(obj)) ) getAttributes( scale(obj) ) getAttributes( returns(obj) ) getAttributes( cumulated(returns(obj)) ) BIND(# Add another Attribute: ATTRIBUTES <- attr(obj@documentation, "Attributes") ATTRIBUTES ATTRIBUTES <- appendList(ATTRIBUTES, list(say="hello")) ATTRIBUTES attr(obj@documentation, "Attributes") <- ATTRIBUTES cbind(obj, obj, documentation = obj@documentation) # Documentation # Series: # dim(@.Data) # @units # @positions # @format # @FinCenter # @recordIDs # @title # @documentation # attributes(@documentation, "attributes) timeSeries/inst/extensionsTests/attributesExtension.R0000644000176000001440000002312012407027076023023 0ustar ripleyusers # Enhancing the Documentation Slot # Series: # @.Data # @ positions # @ format # @ FinCenter # @ units # @ recordIDs # @ title # @ documentation # attributes(@documentation, "Attributes") # inspect the Information use # slotNames(object) # slot(object, name) # Load Library: require(timeSeries) ############################################################################### # Data obj1 <- timeSeries(rnorm(12), timeCalendar()) getAttributes(obj1) setAttributes(obj1) <- list(series=series(obj1)[1:6, , drop=FALSE]) getAttributes(obj1) obj2 <- timeSeries(rnorm(12), timeCalendar()) getAttributes(obj2) setAttributes(obj2) <- list(series=as.matrix(obj2)[7:12, , drop=FALSE]) getAttributes(obj2) ############################################################################### # Base Functions: # base-apply.R getAttributes( apply(obj1, 1, mean) ) # ok # base-applySeries.R # should be deprecated, use generic apply() and aggregate() functions # base-cbind.R cbind(obj1, obj2) getAttributes( cbind(obj1, obj2) ) # ok getAttributes( rbind(obj1, obj2) ) # ok # ... more base-cbind.R # cbind ... getAttributes(cbind(obj1, obj2)) # ok getAttributes(cbind(obj1, as.matrix(obj2))) # ok getAttributes(cbind(as.matrix(obj1), obj2)) # ok getAttributes(cbind(obj1)) # ok # rbind ... getAttributes(rbind(obj1, obj2)) # ok getAttributes(rbind(obj1, as.matrix(obj2))) # ok getAttributes(rbind(as.matrix(obj1), obj2)) # ok getAttributes(rbind(obj1)) # ok # base-diff.R getAttributes( diff(obj1) ) # ok # base-merge.R getAttributes( merge(obj1, obj2) ) # ok # base-rank.R getAttributes( rank(obj1) ) # ok # base-rev.R getAttributes( rev(obj1) ) # ok # base-sample.R getAttributes( sample(obj1) ) # ok # base-scale.R getAttributes( scale(obj1) ) # ok # base-sort.R getAttributes( sort(obj1) ) # ok ################################################################################ # Subsetting: # base-subsetting.R # .subset_timeSeries # .findIndex # $,timeSeries Subsets a time series by column names # $<-,timeSeries Replaces subset by column names # [,timeSeries Subsets a time series object # [<-,timeSeries Assigns value to subsets of a time series # Should work by dafault ... getAttributes( obj1[3:4, 1] ) # ok getAttributes( head(obj1) ) # ok getAttributes( tail(obj1) ) # ok ################################################################################ # Methods: # methods-mathOps.R # here the multiplications "*", works also with "+", "=", "/". ... getAttributes( obj1 * 2) # ok getAttributes( obj1 * (1:12) ) # ok getAttributes( obj1 * matrix(1:12, ncol=1) ) # ok getAttributes( obj1 * as.ts(1:12) ) # ok getAttributes( obj1 * obj2 ) # ok ??? getAttributes( 2 * obj2 ) # ok getAttributes( (1:12) * obj2 ) # ok getAttributes( matrix(1:12, ncol=1) * obj2) # ok getAttributes( as.ts(1:12) * obj2) # ok getAttributes( obj2 * obj1) # ok ??? # More Math Functions getAttributes( abs(obj1) ) # ok getAttributes( exp(obj1) ) # ok getAttributes( obj1^2 ) # ok # ... # Round and Truncate: getAttributes( round(obj1, digits=2) ) # ok getAttributes( trunc(obj1, digits=2) ) # ok getAttributes( signif(obj1, digits=3) ) # ok getAttributes( ceiling(100*obj1) ) # ok getAttributes( floor(100*obj1) ) # ok ################################################################################ # Financial 'timeSeries' Functions # fin-align.R getAttributes( align(obj1) ) # ok # fin-cumulated.R getAttributes( cumulated(obj1) ) # ok # fin-daily.R # align(obj1) and alignDailySeries(obj1) are the same # deprecate align Daily Series getAttributes( alignDailySeries(obj1) ) # ok # Can we use the generic function aggregate ? getAttributes( rollDailySeries(obj1, FUN=mean) ) # ok # fin-drawdowns.R getAttributes( drawdowns(obj1) ) # ok # fin-durations.R getAttributes( durations(obj1) ) # ok # fin-monthly.R getAttributes( rollMonthlySeries(obj1, "3m", FUN=mean) ) # ok getAttributes( countMonthlyRecords(obj1) ) # ok # fin-periodical.R # todo .endOfPeriodSeries .endOfPeriodStats .endOfPeriodBenchmarks # fin-returns.R OBJ1 <- cumulated(obj1) getAttributes( returns(OBJ1) ) # ok # fin-runlengths.R getAttributes( runlengths(obj1) ) # ok # fin-splits.R getAttributes( outlier(obj1) ) # ok # fin-spreads.R SPREADS <- spreads(obj3, which=c(1, 2)) getAttributes( SPREADS) # ok fails MIDQUOTES <- midquotes(obj3, which=c(1,2)) getAttributes( MIDQUOTES ) # ok fails # fin-turns.R INDEX <- cumulated(obj1) getAttributes( turns(INDEX) ) # ok ################################################################################ # Statistics timeSeries Functions # statistics-colCumsums.R getAttributes( colCumsums(obj1) ) # ok # statistics-colSums.R # returns no timeSeries objects # statistics-orderColnames.R # returns no timeSeries objects # statistics-orderStatistics.R # returns no timeSeries objects # statistics-rollMean.R getAttributes( rollStats(obj1, k=1, FUN=mean) ) # ok getAttributes( rollMean(obj1, k=1) ) # ok getAttributes( rollMin(obj1, k=1) ) # FAILS getAttributes( rollMax(obj1, k=1) ) # FAILS getAttributes( rollMedian(obj1, k=1) ) # ok # statistics-rowCumsums.R # statistics-smoothLowess.R getAttributes( smoothLowess(obj1) ) # ok getAttributes( smoothSupsmu(obj1) ) # ok getAttributes( smoothSpline(obj1) ) # ok ################################################################################ # stats # stats-aggregate.R by1 <- time(obj1[3*(1:4),]) getAttributes( aggregate(obj1, by=by1, FUN=mean) ) # ok # stats-filter.R getAttributes( filter(obj1, filter=c(1,1)) ) # ok # stats-lag.R getAttributes( lag(obj1) ) # ok # stats-na.contiguous.R # returns no timeSeries objects # stats-na.omit.R obj3 <- obj1; obj3[4, 1] <- NA; obj3 getAttributes( na.omit(obj3) ) # ok # What about? - They should be deprecated. # removeNA # substituteNA # interp NA # stats-window.R Time <- time(obj1) getAttributes( window(obj1, Time[3], Time[6]) ) # ok ################################################################################ # Attributes Functions getAttributes <- function (obj) { # FUNCTION: # Check Argument: stopifnot(class(obj) == "timeSeries") # Extract Attributes: ans <- attr(obj@documentation, "Attributes") # return Value: ans } # ----------------------------------------------------------------------------- `setAttributes<-` <- function(obj, value) { # Example: # obj <- dummySeries(); getAttributes(obj) # setAttributes(obj) <- list(mat=matrix(1:4, ncol=2)); getAttributes(obj) # getAttributes(obj)$mat[[1]] # FUNCTION: # Check Arguments: stopifnot(class(obj) == "timeSeries") stopifnot(is.list(value)) stopifnot(length(value) == 1) stopifnot(!is.null(value)) # Compose New Attribute: name <- names(value) names(value) <- NULL A <- list(value) names(A) <- name # print(A) # Get Already Existing Attribute B <- getAttributes(obj) if(is.null(B)) B <- list() # print(B) # Join Attributes: JOINED <- sapply(unique(c(names(A), names(B))), function(x) list(c(A[[x]], B[[x]]))) # print(JOINED) # Assign Attribute: attr(obj@documentation, "Attributes") <- JOINED # Return Value: obj } ############################################################################### timeSeries/inst/extensionsTests/chicPlots.R0000644000176000001440000002521312407027076020675 0ustar ripleyusers x = tS1 FinCenter = NULL type = NULL plot.type = c("multiple", "single") format = "auto" at = c("pretty", "chic") main <- xlab <- ylab <- ""; nm = colnames(x); log = "" col = 1; pch = 19; cex = 1; lty = 1; lwd = 1 grid = TRUE; frame.plot = TRUE xlim = NULL; ylim = NULL axes = TRUE; ann = TRUE; cex.axis = 1, cex.lab =1, yax.flip = FALSE mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1) oma.multi = c(7.75, 1.1, 6.1, 1.1) # Plot Function Extensions written by Diethel Wuertz # ... first Version 2014-05-12 ############################################################################### # 1 Standard Plots # 1.1 Single Plots # 1.2 Multiple Plots # 1.2 Scatter Plots # 2 Time Axis Layout # 2.1 Pretty Axis Layout # 2.2 Chic Axis Layout # 2.3 Tailored Axis Layout # 3 Annotations # 3.1 Adding Title and Labels # 3.2 Removing Annotations # 3.3 Changing Font Size # 3.4 Flipping Value Axes # 4 Decorations # 4.1 Modifying Types # 4.2 Changing Colors # 4.3 Changing Line Styles # 4.4 Changing Plot Symbols # 4.5 Modifying Line Widths # 4.6 Modifying Plot Symbol Sizes ############################################################################### # First let us see what plot.ts can do in the multiple plot mode: require(timeSeries) tS1 <- 100 * cumulated(LPP2005REC[, 2]) tS2 <- 100 * cumulated(LPP2005REC[, 2:3]) tS3 <- 100 * cumulated(LPP2005REC[, 1:3]) tS6 <- 100 * cumulated(LPP2005REC[, 1:6]) tS7 <- 100 * cumulated(LPP2005REC[, 1:7]) # ----------------------------------------------------------------------------- # 1.3 Scatter Plots: mat <- getDataPart(tS2) par(mfrow=c(2,2)) plot(mat[, 1], mat[, 2]) plot(mat[, 1], mat[, 2], pch=19, cex=0.2) ################################################################################ # 2. Time Axis Layout: # Changing Time-Axis Size: # One Column Multiple Plots - Each curve in its own Graph: par(mfrow=c(1, 1)) plot(tS3, at="chic", plot.type="m", cex.axis=0.8) par(mfrow=c(1, 1)) plot(tS3, at="chic", plot.type="m", cex.axis=1.1) # Two Columns Multiple Plots - Each curve in its own Graph: par(mfrow=c(1, 1)) plot(tS6, at="chic", plot.type="m", cex.axis=0.8) par(mfrow=c(1, 1)) plot(tS6, at="chic", plot.type="m", cex.axis=1.1) ################################################################################ # 3 Annotations # ------------------------------------------------------------------------------ # 3.1 Adding Title and Labels # Single Plot - All Curves in one Graph: par(mfrow=c(2, 2)) plot(tS1); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index", xlab = "Date") plot(tS6, plot.type="s"); title(main = "Index", xlab = "Date") # One Column Multiple Plots - Each curve in its own Graph: par(mfrow=c(1, 1)) plot(tS3, plot.type="m"); title(main = "Index", xlab = "Date") # Two Column Multiple Plots: par(mfrow=c(1, 1)) plot(tS6, plot.type="m"); title(main = "Index", xlab = "Date") # One Column Multiple Plots - User designed Title par(mfrow=c(1, 1)) plot(tS3, plot.type="m", at = "chic") mtext("Swiss Market", side=3, line=1, adj=-0.025) # Two Column Multiple Plots - User designed Title par(mfrow=c(1, 1)) plot(tS6, plot.type="m", at = "chic") mtext("Swiss Market", side=3, line=1, adj=-0.3) mtext("Foreign Market", side=3, line=1, adj=0.7) # ------------------------------------------------------------------------------ # 3.2 Remove all Annotations: # Two Column Multiple Plots - Each curve in its own Graph: par(mfrow=c(1, 1)) plot(tS6, plot.type="m", ann=FALSE) # Single Plot - All Curves in one Graph: par(mfrow=c(2, 1), mar = c(4, 4, 1, 2) + 0.1) plot(tS1, at="chic", ann=FALSE) title(ylab = colnames(tS1), cex.axis=0.8, cex.lab=0.8) plot(tS1, at="chic", ann=FALSE) title(ylab = colnames(tS1), cex.axis=1.2, cex.lab=1.2) ################################################################################ # 4 Decorations # ------------------------------------------------------------------------------ # 4.1 Modifying Types # "type" par(mfrow=c(1,1)) plot(tS3, type = c("l", "p", "h"), plot.type="m") # ------------------------------------------------------------------------------ # 4.2 Changing Colors # Selecting Colors: par(mfrow=c(2, 2)) plot(tS3, col = 1, plot.type="s") plot(tS3, col = 1:3, plot.type="s") plot(tS3, col = c("blue", "orange", "brown"), plot.type="s") # ------------------------------------------------------------------------------ # 4.3 Changing Line Styles # Single Plot: par(mfrow=c(1,1)) plot(tS3, lty = 3:1, plot.type="s") # One Column Multiple Plot: par(mfrow=c(1,1)) plot(tS3, lty = 3:1, plot.type="m") # ------------------------------------------------------------------------------ # 4.4 Changing Plot Symbols par(mfrow=c(1,1)) plot(tS3, pch = c(17, 18, 19), plot.type="m") # 4.5 Modifying Line Widths par(mfrow=c(1,1)) plot(tS3, lwd = c(17, 18, 19), plot.type="m") par(mfrow=c(2, 2)) plot(tS3, type=rep("p", 3), cex = rep(1.2, 3), plot.type="s") plot(tS3, type = rep("p", 3), pch = 1:3, col = c("blue", "orange", "brown"), plot.type="s") plot(tS3, type = "p", pch = 19, col = c("blue", "orange", "brown"), plot.type="s") # ----------------------------------------------------------------------------- chart.TimeSeries function (R, auto.grid = TRUE, xaxis = TRUE, yaxis = TRUE, yaxis.right = FALSE, type = "l", lty = 1, lwd = 2, main = NULL, ylab = NULL, xlab = "Date", date.format.in = "%Y-%m-%d", date.format = NULL, xlim = NULL, ylim = NULL, element.color = "darkgray", event.lines = NULL, event.labels = NULL, period.areas = NULL, event.color = "darkgray", period.color = "aliceblue", colorset = (1:12), pch = (1:12), legend.loc = NULL, ylog = FALSE, cex.axis = 0.8, cex.legend = 0.8, cex.lab = 1, cex.labels = 0.8, cex.main = 1, major.ticks = "auto", minor.ticks = TRUE, grid.color = "lightgray", grid.lty = "dotted", xaxis.labels = NULL, ...) { y = checkData(R) columns = ncol(y) rows = nrow(y) columnnames = colnames(y) if (is.null(date.format)) { freq = periodicity(y) yr_eq <- ifelse(format(index(first(y)), format = "%Y") == format(index(last(y)), format = "%Y"), TRUE, FALSE) switch(freq$scale, seconds = { date.format = "%H:%M" }, minute = { date.format = "%H:%M" }, hourly = { date.format = "%d %H" }, daily = { if (yr_eq) date.format = "%b %d" else date.format = "%Y-%m-%d" }, weekly = { if (yr_eq) date.format = "%b %d" else date.format = "%Y-%m-%d" }, monthly = { if (yr_eq) date.format = "%b" else date.format = "%b %y" }, quarterly = { if (yr_eq) date.format = "%b" else date.format = "%b %y" }, yearly = { date.format = "%Y" }) } rownames = as.Date(xts:::time.xts(y)) rownames = format(strptime(rownames, format = date.format.in), date.format) time.scale = periodicity(y)$scale ep = axTicksByTime(y, major.ticks, format.labels = date.format) logaxis = "" if (ylog) { logaxis = "y" } plot.new() if (is.null(xlim[1])) xlim = c(1, rows) if (is.null(ylim[1])) { ylim = as.numeric(range(y, na.rm = TRUE)) } plot.window(xlim, ylim, xaxs = "r", log = logaxis) if (is.null(ylab)) { if (ylog) ylab = "ln(Value)" else ylab = "Value" } if (ylog) dimensions = 10^par("usr") else dimensions = par("usr") if (!is.null(period.areas)) { period.dat = lapply(period.areas, function(x, y) c(first(index(y[x])), last(index(y[x]))), y = y) period.ind = NULL for (period in 1:length(period.dat)) { if (!is.na(period.dat[[period]][1])) { period.ind = list(grep(period.dat[[period]][1], index(y)), grep(period.dat[[period]][2], index(y))) rect(period.ind[1], dimensions[3], period.ind[2], dimensions[4], col = period.color, border = NA) } } } if (auto.grid) { abline(v = ep, col = grid.color, lty = grid.lty) grid(NA, NULL, col = grid.color) } abline(h = 0, col = element.color) if (!is.null(event.lines)) { event.ind = NULL for (event in 1:length(event.lines)) { event.ind = c(event.ind, grep(event.lines[event], rownames)) } number.event.labels = ((length(event.labels) - length(event.ind) + 1):length(event.labels)) abline(v = event.ind, col = event.color, lty = 2) if (!is.null(event.labels)) { text(x = event.ind, y = ylim[2], label = event.labels[number.event.labels], offset = 0.2, pos = 2, cex = cex.labels, srt = 90, col = event.color) } } if (length(lwd) < columns) lwd = rep(lwd, columns) if (length(lty) < columns) lty = rep(lty, columns) if (length(pch) < columns) pch = rep(pch, columns) for (column in columns:1) { lines(1:rows, y[, column], col = colorset[column], lwd = lwd[column], pch = pch[column], lty = lty[column], type = type, ...) } if (xaxis) { if (minor.ticks) axis(1, at = 1:NROW(y), labels = FALSE, col = "#BBBBBB") label.height = cex.axis * (0.5 + apply(t(names(ep)), 1, function(X) max(strheight(X, units = "in")/par("cin")[2]))) if (is.null(xaxis.labels)) xaxis.labels = names(ep) else ep = 1:length(xaxis.labels) axis(1, at = ep, labels = xaxis.labels, las = 1, lwd = 1, mgp = c(3, label.height, 0), cex.axis = cex.axis) title(xlab = xlab, cex = cex.lab) } if (yaxis) if (yaxis.right) axis(4, cex.axis = cex.axis, col = element.color, ylog = ylog) else axis(2, cex.axis = cex.axis, col = element.color, ylog = ylog) box(col = element.color) if (!is.null(legend.loc)) { legend(legend.loc, inset = 0.02, text.col = colorset, col = colorset, cex = cex.legend, border.col = element.color, lty = lty, lwd = 2, bg = "white", legend = columnnames, pch = pch) } if (is.null(main)) main = columnnames[1] title(ylab = ylab, cex = cex.lab) title(main = main, cex = cex.main) } timeSeries/inst/extensionsTests/aggregateWrappers.R0000644000176000001440000002151212407027076022415 0ustar ripleyusers require(timeSeries) X <- cumulated(LPP2005REC)[, 1:3] for (i in 1:3) X[, i] <- 100*X[, i]/as.vector(X[1,i]) Data <- alignDailySeries(X) # add: startDate Index <- time(Data) # Generate time Series: tS <- timeSeries(data=Data, charvec=format(Index)) tR <- returns(tS) ############################################################################### # aggregate: # from stats Package: The function aggregate splits the data into subsets, # computes summary statistics for each, and returns the result in a # convenient form. # AGGREGATION OVER NON-OVEWRLAPPING PERIODS # starting point: aligned daily Data # Aggregation Function: # function (x, by, FUN, ...) # Aggregation Levels: # weekly/biweekly: endOfWeek, onTuesdays, lastBusinessDay # monthly: endOMonth, lastFriday, lastBusinessDay # quarterly: 3-monthly # half-annually: 6-monthly # yearly: 12-monthly # Aggregation Statistics: # mean, sd, var, median, ... open <- function(x) as.vector(x)[1] close <- function(x) rev(as.vector(x))[1] high <- function(x) max(x) low <- function(x) min(x) spread <- function(x) max(x) - min(x) # ----------------------------------------------------------------------------- # Weekly # End-of-week: by <- timeLastDayInMonth(time(tS)) mean.tR <- aggregate(tR[, "SPI"], by, mean) sd.tR <- aggregate(tR[, "SPI"], by, sd) plot(cbind(mean.tR, sd.tR), type="h") # Weekly - Last Zurich Business Day In Week by <- timeLastBizdayInMonth(time(tS), holidays = holidayZURICH()) mean.tR <- aggregate(tR[, "SPI"], by, mean) sd.tR <- aggregate(tR[, "SPI"], by, sd) plot(cbind(mean.tR, sd.tR), type="h") # Weekly on Tuesdays by <- timeSequence(from=start(tD), to=end(tD), by = "week") mean.tR <- aggregate(tR[, "SPI"], by, mean) sd.tR <- aggregate(tR[, "SPI"], by, sd) plot(cbind(mean.tR, sd.tR), type="h") # ----------------------------------------------------------------------------- # Monthly # ----------------------------------------------------------------------------- # Quarterly ############################################################################### # ----------------------------------------------------------------------------- # End-of-Month Statistics # ----------------------------------------------------------------------------- # Monthly Open-High-Low-Close open <- function(x) as.vector(x)[1] close <- function(x) rev(as.vector(x))[1] high <- function(x) max(x) low <- function(x) min(x) SPI <- tS[, "SPI"] by <- timeLastDayInMonth(time(tS)) OHLC <- cbind( aggregate(SPI, by, open), aggregate(SPI, by, high), aggregate(SPI, by, low), aggregate(SPI, by, close)) OHLC # ----------------------------------------------------------------------------- # Monthly Spread / Percentual Spread spread <- function(x) max(x) - min(x) pspread <- function(x) (max(x) - min(x)) / (0.5 * (max(x) + min(x))) SPI <- tS[, "SPI"] by <- timeLastDayInMonth(time(tS)) SPREAD <- cbind( Points=aggregate(SPI, by, spread), Percent=100*aggregate(SPI, by, pspread)) SPREAD <- round(SPREAD, 2) SPREAD ################################################################################ # Rolling: Aggregation with Overlappinng Periods # ----------------------------------------------------------------------------- # rolling 52-weekly-highs and lows # xts: Mean on weekly Periods ep <- xts::endpoints(x.xts, on='weeks', k=1) by1 <- index(x.xts)[ep[-1]] period1 <- xts::period.apply(x.xts, INDEX=ep, FUN=mean) ############################################################################### # xts::apply.monthly FUN <- mean x <- x.xts apply.daily(x, FUN) apply.weekly(x, FUN) apply.monthly(x, FUN) apply.quarterly(x, FUN) apply.yearly(x, FUN) # timeDate::align FUN <- mean x <- unique(time(x.tS)) alignDaily(x, include.weekends=FALSE) by1 <- unique(alignMonthly(x, include.weekends=FALSE)) x1 <- timeSeries::aggregate(x.tS, by1, FUN) by2 <- unique(alignMonthly(x, include.weekends=TRUE)) x2 <- timeSeries::aggregate(x.tS, by2, FUN) by1 <- unique(alignQuarterly(x, include.weekends=FALSE)) x1 <- timeSeries::aggregate(x.tS, by1, FUN) by2 <- unique(alignQuarterly(x, include.weekends=TRUE)) x2 <- timeSeries::aggregate(x.tS, by2, FUN) cbind(x1,x2) ############################################################################### xts::first(x.xts) xts::last(x.xts) first2 <- function(x) x[start(x), ] last2 <- function(x) x[end(x), ] first2(x.tS) last2(x.tS) # ----------------------------------------------------------------------------- INDEX <- seq(1, nrow(xts), by=21) INDEX .period.apply(tS, INDEX, FUN=max) .period.max <- function(x, INDEX, FUN=max) .period.apply(x, INDEX, max) .period.max(tS[, 1], INDEX) .period.min <- function(x, INDEX) .period.apply(x, INDEX, min) .period.min(tS[, 1], INDEX) xts::period.apply(xts[, 1], INDEX, FUN=max) xts::period.max(xts[, 1], INDEX) xts::period.min(xts[, 1], INDEX) xts::period.prod(xts[, 1], INDEX) xts::period.sum(xts[, 1], INDEX) # ----------------------------------------------------------------------------- # timeBased is.timeBased <- function (x) { if (!any(sapply(c( "Date", "POSIXt", "chron", "dates", "times", "timeDate", "yearmon", "yearqtr", "xtime"), function(xx) inherits(x, xx)))) { ans <- FALSE } else { ans <- TRUE } ans } timeBased <- function(x) { is.timeBased(x) } # ----------------------------------------------------------------------------- alignDaily(x=time(tS), include.weekends=FALSE) alignMonthly(x=time(tS), include.weekends=FALSE) # error alignQuarterly(x=time(tS), include.weekends=FALSE) # error tD <- Sys.timeDate() + 1:1000 timeDate::align(tD, by="10s") timeDate::align(tD, by="60s") timeDate::align(tD, by="10m") # error td <- as.xts(Sys.time()) + 1:1000 xts::align.time(td, n=10) # every 10 seconds xts::align.time(td, n=60) # align to next whole minute xts::align.time(td, n=10*60) # align to next whole 10 min interval xts::shift.time(td, n=10) xts::shift.time(td, n=60) xts::shift.time(td) # ----------------------------------------------------------------------------- xts::to.minutes(x,k,name,...) xts::to.minutes3(x,name,...) xts::to.minutes5(x,name,...) xts::to.minutes10(x,name,...) xts::to.minutes15(x,name,...) xts::to.minutes30(x,name,...) xts::to.hourly(x,name,...) xts::to.daily(x,drop.time=TRUE,name,...) xts::to.weekly(x, drop.time=TRUE, name,...) xts::to.monthly(x, indexAt='yearmon', drop.time=TRUE,name,...) xts::to.quarterly(x, indexAt='yearqtr', drop.time=TRUE,name,...) xts::to.yearly(x,drop.time=TRUE,name,...) xts::to.period( x, period = 'months', k = 1, indexAt, name=NULL, OHLC = TRUE, ...) # ----------------------------------------------------------------------------- Convert an object to a specified periodicity lower than the given data object. For example, convert a daily series to a monthly series, or a monthly series to a yearly one, or a one minute series to an hourly series. data(sample_matrix) xts <- as.xts(sample_matrix) # is daily to.weekly(xts) to.monthly(xts) to.quarterly(xts) to.yearly(xts) tS <- as.timeSeries(sample_matrix) % ----------------------------------------------------------------------------- as.numeric(as.POSIXct(time(tS))) getFinCenter(tS) indexTZ(xts, ) tzone(xts, ) tzone(xts) <- "GMT" .index(xts, ) indexClass(xts) class(time(tS)) % ----------------------------------------------------------------------------- .index <- function(x) as.numeric(as.POSIXct(time(x))) .indexDate <- function(x) .index(x)%/%86400L .indexday <- function(x) .index(x)%/%86400L .indexmday <- function(x) as.POSIXlt(.POSIXct(.index(x)))$mday .indexwday <- function(x) as.POSIXlt(.POSIXct(.index(x)))$wday .indexweek <- function(x) .indexmon <- function(x) .indexyday <- function(x) .indexyear <- function(x) .indexhour <- function(x) .indexmin <- function(x) .indexsec <- function(x) atoms # Roll over fixed periods of length k point by point ... # Functions borrowed from zoo timeSeries::rollMin( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMax( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMean( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMedian( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollStats( x, k, FUN = mean, na.pad = FALSE, align = c("center", "left", "right"), ...) # Roll over Calendarical periods: rollDailySeries(x, period="7d", FUN, ...) rollMonthlySeries(x, period="12m", by="1m", FUN, ...) # e.g. rollQuarterlySeries(x, period="12m", by="3m", FUN) # e.g. rollYearlySeries rollMonthlyWindows(x, period="12m", by="1m") apply applySeries # period.apply # Apply a specified function to data over a given interval, where the # interval is taken to be the data from INDEX[k] to INDEX[k+1], for # k=1:(length(INDEX)-1). timeSeries/inst/COPYRIGHTS0000644000176000001440000000770511023731525015016 0ustar ripleyusers________________________________________________________________________________ Copyrights (C) for R: see R's copyright and license file Version R 2.0.0 claims: - The stub packages from 1.9.x have been removed. - All the datasets formerly in packages 'base' and 'stats' have been moved to a new package 'datasets'. - Package 'graphics' has been split into 'grDevices' (the graphics devices shared between base and grid graphics) and 'graphics' (base graphics). - Packages must have been re-installed for this version, and library() will enforce this. - Package names must now be given exactly in library() and require(), regardless of whether the underlying file system is case-sensitive or not. ________________________________________________________________________________ for Rmetrics: (C) 1999-2005, Diethelm Wuertz, GPL Diethelm Wuertz www.rmetrics.org info@rmetrics.org ________________________________________________________________________________ for non default loaded basic packages part of R's basic distribution MASS: Main Package of Venables and Ripley's MASS. We assume that MASS is available. Package 'lqs' has been returned to 'MASS'. S original by Venables & Ripley. R port by Brian Ripley . Earlier work by Kurt Hornik and Albrecht Gebhardt. methods: Formally defined methods and classes for R objects, plus other programming tools, as described in the reference "Programming with Data" (1998), John M. Chambers, Springer NY. R Development Core Team. mgcv: Routines for GAMs and other generalized ridge regression with multiple smoothing parameter selection by GCV or UBRE. Also GAMMs by REML or PQL. Includes a gam() function. Simon Wood nnet: Feed-forward Neural Networks and Multinomial Log-Linear Models Original by Venables & Ripley. R port by Brian Ripley . Earlier work by Kurt Hornik and Albrecht Gebhardt. ________________________________________________________________________________ for the code partly included as builtin functions from other R ports: fSeries:bdstest.c C Program to compute the BDS Test. Blake LeBaron fSeries:fracdiff R functions, help pages and the Fortran Code for the 'fracdiff' function are included. S original by Chris Fraley R-port by Fritz Leisch since 2003-12: Martin Maechler fSeries:lmtest R functions and help pages for the linear modelling tests are included . Compiled by Torsten Hothorn , Achim Zeileis , and David Mitchell fSeries:mda R functions, help pages and the Fortran Code for the 'mars' function are implemeted. S original by Trevor Hastie & Robert Tibshirani, R port by Friedrich Leisch, Kurt Hornik and Brian D. Ripley fSeries:modreg Brian Ripley and the R Core Team fSeries:polspline R functions, help pages and the C/Fortran Code for the 'polymars' function are implemented Charles Kooperberg fSeries:systemfit Simultaneous Equation Estimation Package. R port by Jeff D. Hamann and Arne Henningsen fSeries:tseries Functions for time series analysis and computational finance. Compiled by Adrian Trapletti fSeries:UnitrootDistribution: The program uses the Fortran routine and the tables from J.G. McKinnon. fSeries:urca Unit root and cointegration tests for time series data. R port by Bernhard Pfaff . timeSeries/inst/unitTests/0000755000176000001440000000000013612573075015403 5ustar ripleyuserstimeSeries/inst/unitTests/runit.durations.R0000644000176000001440000000233711245551275020701 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.durations <- function() { # RUnit Test: # Signal Series: tS = sort(sample(dummySeries())[1:6, ]) tS durations(tS) durations(tS, trim = TRUE) durations(tS, trim = TRUE)/(24*3600) # Time Series: tS = sort(sample(dummySeries(format = "counts"))[1:6, ]) tS # BUG !!! # durations(tS) # durations(tS, trim = TRUE) } ################################################################################ timeSeries/inst/unitTests/runit.rank.R0000644000176000001440000000162611245551275017624 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.rank <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.merge.R0000644000176000001440000000316011651223473017760 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.merge.timeSeries = function() { # RUnit Test: # Time Stamps: x = timeSeries()[,1] x y = timeSeries() y merge(x, y) # Signal Counts: x = timeSeries(format = "counts")[,1] x y = timeSeries(format = "counts") y merge(x, y) x <- dummySeries()[,1] x y <- dummySeries() y merge(x, y) # check that merge method can deal with timeSeries that have # colnames that are invalid data.frame colnames. For example # "S[-1]". data <- matrix(runif(18), ncol = 3) charvec <- rev(paste("2009-0", 1:6, "-01", sep = "")) S <- timeSeries(data, charvec) colnames(S) <- paste("S", 1:3, sep = ".") ts <- merge(S[,2], lag(S[,1], -1:1)) checkIdentical(dim(ts), c(6L,4L)) } ################################################################################ timeSeries/inst/unitTests/runit.subset.R0000644000176000001440000001243111321127320020153 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.subset <- function() { ts <- dummySeries() mat <- as.matrix(ts) # we want the same subset-ting rules as for a matrix # but we always print result in vertical style ! # -------------------------------------------------------------------------- # index checkIdentical( ts[], ts) checkTrue(suppressWarnings(is.na(ts[""]))) checkTrue(is.na(mat[""])) checkIdentical( as.matrix(ts[seq(4),2]), mat[seq(4),2,drop=FALSE]) checkIdentical( as.matrix(ts[rep(FALSE, 3), 1]), mat[rep(FALSE, 3), 1,drop=FALSE]) checkIdentical( as.matrix(ts[FALSE, 1]), mat[FALSE, 1, drop = FALSE]) checkIdentical( as.matrix(ts[rep(TRUE), 2]), mat[rep(TRUE), 2, drop=FALSE]) charvec <- as.character(timeCalendar()[1:3]) checkIdentical( as.matrix(ts[charvec, 1]), mat[charvec, 1, drop = FALSE]) checkIdentical( as.matrix(ts[seq(4),]), mat[seq(4),,drop=FALSE]) checkIdentical( as.matrix(ts[rep(FALSE, 3), ]), mat[rep(FALSE, 3), ,drop=FALSE]) checkIdentical( as.matrix(ts[FALSE, ]), mat[FALSE, ,drop=FALSE]) checkIdentical( as.matrix(ts[rep(TRUE), ]), mat[rep(TRUE), ,drop=FALSE ]) dd <- as.character(time(ts)[1]) checkIdentical( as.matrix(ts[dd, ]), mat[dd, ,drop=FALSE]) checkIdentical( as.matrix(ts[,2]), mat[,2,drop=FALSE]) checkIdentical( as.matrix(ts[2,FALSE]), mat[2,FALSE, drop=FALSE]) # prefer to have an empty timeSeries instead of empty data with row names checkIdentical( as.matrix(ts[,FALSE]), mat[,FALSE, drop = FALSE]) checkIdentical( as.matrix(ts[,TRUE ]), mat[,TRUE ,drop=FALSE]) checkIdentical( as.matrix(ts[, "TS.1"]), mat[, "TS.1", drop = FALSE]) # -------------------------------------------------------------------------- # timeDate checkIdentical( ts[timeCalendar()[1:5], 2], ts[1:5,2]) checkIdentical( ts[timeCalendar()[1:5], ], ts[1:5,]) # -------------------------------------------------------------------------- # logical matrix and timeSeries i <- ts < 0.4 checkException(ts[series(i), ], silent = TRUE) checkException(ts[i, ], silent = TRUE) checkException(mat[series(i), ], silent = TRUE) # it fails as expected checkIdentical( as.matrix(ts[series(i)[,1], ]), mat[series(i)[,1], , drop=FALSE]) checkIdentical( as.matrix(ts[i[,1], ]), mat[series(i)[,1], , drop=FALSE]) checkIdentical( as.matrix(ts[series(i)[,1],1]), mat[series(i)[,1],1,drop=FALSE]) checkIdentical( as.matrix(ts[i[,1],1]), mat[series(i)[,1],1,drop=FALSE]) # this should fail checkException(ts[series(i), 2], silent = TRUE) checkException(ts[i, 2], silent = TRUE) checkException(ts[series(i), 1], silent = TRUE) checkException(ts[series(i),1], silent = TRUE) checkException(ts[i,1], silent = TRUE) checkException(mat[series(i),1], silent = TRUE) checkException(ts[series(i),], silent = TRUE) checkException(mat[series(i),], silent = TRUE) checkIdentical( ts[series(i)], mat[series(i)]) checkIdentical( ts[i], mat[series(i)]) # -------------------------------------------------------------------------- # $,timeSeries method df <- as.data.frame(ts) checkIdentical( ts$TS., df$TS.) checkIdentical( ts$TS.1, df$TS.1) checkIdentical( ts$a, df$a) colnames(ts) <- c("aa", "bb") colnames(df) <- c("aa", "bb") checkIdentical( ts$a, df$a) checkIdentical( ts$b, df$b) } ################################################################################ timeSeries/inst/unitTests/runit.colStats.R0000644000176000001440000000264311245551275020465 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.colStats = function() { # RUnit Test: # Signal Series: tS = dummySeries(format = "counts") tS colStats(tS, mean) colSums(tS) colMeans(tS) colSds(tS) colVars(tS) colSkewness(tS) colKurtosis(tS) colMaxs(tS) colMins(tS) colProds(tS) colQuantiles(tS) # timDate Series: tS = dummySeries() tS colStats(tS, mean) colSums(tS) colMeans(tS) colSds(tS) colVars(tS) colSkewness(tS) colKurtosis(tS) colMaxs(tS) colMins(tS) colProds(tS) colQuantiles(tS) } ################################################################################ timeSeries/inst/unitTests/runit.timeSeries.R0000644000176000001440000000327611245551275021005 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.signalSeries.Internal <- function() { # RUnit Test: x = rnorm(12) y = rnorm(12) timeSeries:::.signalSeries(as.matrix(x), 1:12) timeSeries:::.signalSeries(as.matrix(cbind(x,y)), 1:12) } # ------------------------------------------------------------------------------ test.timeSeries.Internal <- function() { # this is to test the problem when a ts object is passed to # timeSeries. It seems that as.matrix does not convert the object # to a matrix !!! z <- ts(matrix(rnorm(300), 100, 3), start=c(1961, 1), frequency=12) # class(as.matrix(z)) #<< mts ts and not matrix in R 2.9.0 # Note that is is possible that a ts object is considered as a # matrix when timeSeries method as dispatched. Hence this check t <- timeSeries(z) checkTrue(identical(as(z, "matrix"), as(t, "matrix"))) } ################################################################################ timeSeries/inst/unitTests/runit.mathOps.R0000644000176000001440000000213511245551275020300 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.mathOps <- function() { # RUnit Test: tS = dummySeries(format = "counts") tS tS - 2 log(abs(tS)) diff(tS) scale(tS) tS = dummySeries() tS tS - 2 log(abs(tS)) diff(tS) scale(tS) } ################################################################################ timeSeries/inst/unitTests/runit.methods-plot.R0000644000176000001440000000162611245551275021310 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.plot <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.monthly.R0000644000176000001440000000163111245551275020357 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.monthly <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.Omit.R0000644000176000001440000000346711245551275017606 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.naOmitMatrix = function() { x = as.timeSeries(data(LPP2005REC))[1:20, 1:4] colnames(x) = abbreviate(colnames(x), 6) x[1, 1] = NA x[3:4, 2] = NA x[18:20, 4] = NA show(x) timeSeries:::.naOmitMatrix(as.matrix(x)) timeSeries:::.naOmitMatrix(as.matrix(x), "s") timeSeries:::.naOmitMatrix(as.matrix(x), "z") timeSeries:::.naOmitMatrix(as.matrix(x), "ir") timeSeries:::.naOmitMatrix(as.matrix(x), "iz") timeSeries:::.naOmitMatrix(as.matrix(x), "ie") # Return Value: return() } # ------------------------------------------------------------------------------ test.na.omit = function() { x = as.timeSeries(data(LPP2005REC))[1:20, 1:4] colnames(x) = abbreviate(colnames(x), 6) x[1, 1] = NA x[3:4, 2] = NA x[18:20, 4] = NA show(x) na.omit(x) na.omit(x, "s") na.omit(x, "z") na.omit(x, "ir") na.omit(x, "iz") na.omit(x, "ie") # Return Value: return() } ################################################################################ timeSeries/inst/unitTests/runit.cumulated.R0000644000176000001440000000211511245551275020646 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.cumulated = function() { # RUnit Test: # Signal Series: tS = dummySeries(format = "counts") # problem with Fincenter cumulated(tS) # timeDate Series: tS = dummySeries() cumulated(tS) } ################################################################################ timeSeries/inst/unitTests/runit.model.frame.R0000644000176000001440000000163511245551275021062 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.model.frame <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.TimeSeriesPositions.R0000644000176000001440000000513211245551275022646 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.time = function() { # Generate nivariate daily random sequence set.seed(4711) data = round(rnorm(12), 2) charvec = timeCalendar(2006) uTS = timeSeries(data, charvec, units = "uTS") uTS # Get Positions: POS = time(uTS) POS checkIdentical(charvec, POS) # Return Value: return() } # ------------------------------------------------------------------------------ "test.time<-" = function() { # Generate nivariate daily random sequence set.seed(4711) data = round(rnorm(12), 2) charvec = timeCalendar(2006) uTS = timeSeries(data, charvec, units = "uTS") uTS # Add one Day to Positions: POS = time(uTS) time(uTS) <- POS + 24*3600 uTS # Return Value: return() } # ------------------------------------------------------------------------------ test.timeSeriesOrdering = function() { # sample.timeSeries - Resamples a 'timeSeries' object in time # sort.timeSeries - Sorts reverts a 'timeSeries' object in time # rev.timeSeries - Reverts a 'timeSeries' object in time # start.timeSeries - Extracts start date of a 'timeSeries' object # end.timeSeries - Extracts end date of a 'timeSeries' object # Generate univariate monthly random sequence: set.seed(4711) data = cbind(1:12, round(rnorm(12), 2)) positions = timeCalendar(2006) uTS = timeSeries(data, positions) uTS # Sample/Sort: target = uTS target # current = sort(sample(uTS)) # current # checkIdentical(target, current) # Revert: target = uTS target current = rev(rev(uTS)) current checkTrue(!sum(target - current)) # Start/End date of Series: start(uTS) end(uTS) # Return Value: return() } ################################################################################ timeSeries/inst/unitTests/runit.dim.R0000644000176000001440000000344511245551275017443 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.dim.timeSeries = function() { # RUnit Test: # Univariate Case: tS = timeSeries(format = "counts")[, 1] dim(tS) NCOL(tS) NROW(tS) ncol(tS) nrow(tS) dimnames(tS) colnames(tS) rownames(tS) # colnames<- # rownames<- is.array(tS) # Multivariate Case: tS = timeSeries(format = "counts") dim(tS) NCOL(tS) NROW(tS) ncol(tS) nrow(tS) dimnames(tS) colnames(tS) rownames(tS) # colnames<- # rownames<- is.array(tS) # Univariate Case: tS = timeSeries()[, 1] dim(tS) NCOL(tS) NROW(tS) ncol(tS) nrow(tS) dimnames(tS) colnames(tS) rownames(tS) # colnames<- # rownames<- is.array(tS) # Multivariate Case: tS = timeSeries() dim(tS) NCOL(tS) NROW(tS) ncol(tS) nrow(tS) dimnames(tS) colnames(tS) rownames(tS) # colnames<- # rownames<- is.array(tS) } ################################################################################ timeSeries/inst/unitTests/runit.periodical.R0000644000176000001440000000163411245551275021003 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.periodical <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runTests.R0000644000176000001440000000453311101363332017342 0ustar ripleyuserspkg <- "timeSeries" if(require("RUnit", quietly = TRUE)) { library(package=pkg, character.only = TRUE) if(!(exists("path") && file.exists(path))) path <- system.file("unitTests", package = pkg) ## --- Testing --- ## Define tests testSuite <- defineTestSuite(name = paste(pkg, "unit testing"), dirs = path) if(interactive()) { cat("Now have RUnit Test Suite 'testSuite' for package '", pkg, "' :\n", sep='') str(testSuite) cat('', "Consider doing", "\t tests <- runTestSuite(testSuite)", "\nand later", "\t printTextProtocol(tests)", '', sep = "\n") } else { ## run from shell / Rscript / R CMD Batch / ... ## Run tests <- runTestSuite(testSuite) if(file.access(path, 02) != 0) { ## cannot write to path -> use writable one tdir <- tempfile(paste(pkg, "unitTests", sep="_")) dir.create(tdir) pathReport <- file.path(tdir, "report") cat("RUnit reports are written into ", tdir, "/report.(txt|html)", sep = "") } else { pathReport <- file.path(path, "report") } ## Print Results: printTextProtocol(tests, showDetails = FALSE) printTextProtocol(tests, showDetails = FALSE, fileName = paste(pathReport, "Summary.txt", sep = "")) printTextProtocol(tests, showDetails = TRUE, fileName = paste(pathReport, ".txt", sep = "")) ## Print HTML Version to a File: ## printHTMLProtocol has problems on Mac OS X if (Sys.info()["sysname"] != "Darwin") printHTMLProtocol(tests, fileName = paste(pathReport, ".html", sep = "")) ## stop() if there are any failures i.e. FALSE to unit test. ## This will cause R CMD check to return error and stop 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 { cat("R package 'RUnit' cannot be loaded -- no unit tests run\n", "for package", pkg,"\n") } ################################################################################ timeSeries/inst/unitTests/runit.drawdowns.R0000644000176000001440000000234611245551275020701 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.drawdowns <- function() { # RUnit Test: tS = timeSeries( data = matrix(rnorm(200, sd = 1e-3), 100), charvec = format(timeSequence(length.out = 100)) ) tS drawdowns(tS) tS = timeSeries( data = matrix(rnorm(200, sd = 1e-3), 100), charvec = 1:100, format = "counts" ) tS drawdowns(tS) } ################################################################################ timeSeries/inst/unitTests/runit.daily.R0000644000176000001440000000162711245551275017774 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.daily <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.colCum.R0000644000176000001440000000333211245551275020107 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.colCum <- function() { # RUnit Test: # Signal Series ts <- dummySeries(format = "counts") colCumsums(ts) colCummaxs(ts) colCummins(ts) colCumprods(ts) colCumreturns(ts) # Time Series: ts <- dummySeries() colCumsums(ts) colCummaxs(ts) colCummins(ts) colCumprods(ts) colCumreturns(ts) # check that timeSeries with one row still works ... t <- ts[1,] checkTrue(is(colCumsums(t), "timeSeries")) checkTrue(is(colCummaxs(t), "timeSeries")) checkTrue(is(colCummins(t), "timeSeries")) checkTrue(is(colCumprods(t), "timeSeries")) checkTrue(is(colCumreturns(t), "timeSeries")) checkEquals(nrow(colCumsums(t)), 1) checkEquals(nrow(colCummaxs(t)), 1) checkEquals(nrow(colCummins(t)), 1) checkEquals(nrow(colCumprods(t)), 1) checkEquals(nrow(colCumreturns(t)), 1) } ################################################################################ timeSeries/inst/unitTests/runit.methods-summary.R0000644000176000001440000000163111245551275022023 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.summary <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.TimeSeriesCoercion.R0000644000176000001440000001554111245551275022425 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.asTimeSeries = function() { # as.timeSeries.default - Returns the input # as.timeSeries.numeric - Transforms a numeric vector into a 'timeSeries' # as.timeSeries.data.frame - Transformas a 'data.frame' into a 'timeSeries' # as.timeSeries.matrix - Trasformas a 'matrix' into a 'timeSeries' # as.timeSeries.ts - Tranf orms a 'ts' object into a 'timeSeries' # as.timeSeries.character - Loads and transformas from a demo file # as.timeSeries.zoo - Transforms a 'zoo' object into a 'timeSeries' # Create timeSeries Object: RNGkind(kind = "Marsaglia-Multicarry", normal.kind = "Inversion") set.seed(4711, kind = "Marsaglia-Multicarry") data = round(rnorm(12), 3) charvec = timeCalendar(2006) uTS = timeSeries(data, charvec, units = "uTS") uTS checkTrue(inherits(uTS, "timeSeries")) checkTrue(is.timeSeries(uTS)) # Check Positions: positions = timeCalendar() class(positions) whichFormat(format(positions)) whichFormat(as.character(positions)) # Data Input is a Vector - Returns a timeSeries with dummy positions: RNGkind(kind = "Marsaglia-Multicarry", normal.kind = "Inversion") set.seed(4711, kind = "Marsaglia-Multicarry") x = rnorm(12) # as.numeric - add dummy dates: data = as.numeric(x) tS = as.timeSeries(data) head(tS) # as. numeric [as.vector] - add dummy dates: data = as.vector(x) tS = as.timeSeries(data) head(tS) # Data Inpiut is a data.frame: data(MSFT) x.df = as.data.frame(MSFT) head(x.df) # First Column holds Positions: tS = MSFT head(tS) # Missing Positions - return signal series # x.df = msft.dat[, -1] # head(x.df) # tS = as.timeSeries(x.df) # head(tS) # Data Input is a Matrix: data(MSFT) x.mat = as.matrix(MSFT) # tS = as.timeSeries(x.mat) # head(tS) # CHECK # Data Input is an Univariate/Muiltivariate timeSeries: x = MSFT class(x) tS = as.timeSeries(x) head(tS) # Note, data is a demo file ... tS = MSFT head(tS) # Return Value: return() } # ------------------------------------------------------------------------------ test.asTimeSeriesDJ1 = function() { # Load Data: # use instead dummy data set just for testing ... Data = matrix(exp(cumsum(rnorm(30*100, sd = 0.1))), ncol = 30) Positions = format(timeSequence("2006-01-01", length.out = 100)) DowJones30 = data.frame(Positions, Data) # Taking Dates from First Column: DJ = DowJones30[21:30, c(1, 11:15)] DJ class(DJ) as.timeSeries(DJ) # Adding Dates through Rownames Assignment: DJ = DowJones30[21:30, c(11:15)] rownames(DJ)<-DowJones30[21:30, 1] DJ as.timeSeries(DJ) # Missing Dates - Using Dummy Dates: DJ = DowJones30[21:30, c(11:15)] DJ class(DJ) as.timeSeries(DJ) # With recordIDs: if (FALSE) { DJ = DowJones30[21:30, c(1,11:15)] DJ = cbind(DJ, LETTERS[1:10]) class(DJ) tsDJ = as.timeSeries(DJ) tsDJ tsDJ@recordIDs } DJ = DowJones30[21:30, c(11:15)] rownames(DJ) = DowJones30[21:30, 1] DJ = cbind(DJ, LETTERS[1:10]) tsDJ = as.timeSeries(DJ) tsDJ tsDJ@recordIDs DJ = DowJones30[21:30, c(11:15)] DJ =cbind(DJ, LETTERS[1:10]) tsDJ = as.timeSeries(DJ) tsDJ tsDJ@recordIDs # Return Value: return() } # ------------------------------------------------------------------------------ test.fromTimeSeriesUV = function() { if (FALSE) { # DW has to be fixed ... # as.vector.timeSeries - Converts a univariate 'timeSeries' to a vector # as.matrix.timeSeries - Converts a 'timeSeries' to a 'matrix' # as.data.frame.timeSeries - Converts a 'timeSeries' to a 'data.frame' # as.ts.timeSeries - Converts a 'timeSeries' to a 'ts' # Univariate Case: RNGkind(kind = "Marsaglia-Multicarry", normal.kind = "Inversion") set.seed(4711, kind = "Marsaglia-Multicarry") data = round(rnorm(12), 3) charvec = timeCalendar(2006) uTS = timeSeries(data, charvec, units = "uTS") uTS # Vector: VEC = as.vector(uTS) head(VEC) class(VEC) checkIdentical(class(VEC), "numeric") # Numeric: # VEC = as.numeric(uTS) # Not implemented ! # head(VEC) # class(VEC) # checkIdentical(class(VEC), "numeric") # Matrix: MAT = as.matrix(uTS) head(MAT) class(MAT) checkIdentical(class(MAT), "matrix") # Data Frame: DF = as.data.frame(uTS) head(DF) checkIdentical(class(DF), "data.frame") # Time Series: TS = as.ts(uTS) head(TS) class(TS) checkIdentical(class(TS), "ts") } # Return Value: return() } # ------------------------------------------------------------------------------ test.fromTimeSeriesMV = function() { if (FALSE) { # DW has to be fixed ... # as.vector.timeSeries - Converts a univariate 'timeSeries' to a vector # as.matrix.timeSeries - Converts a 'timeSeries' to a 'matrix' # as.data.frame.timeSeries - Converts a 'timeSeries' to a 'data.frame' # as.ts.timeSeries - Converts a 'timeSeries' to a 'ts' # Multivariate Case: RNGkind(kind = "Marsaglia-Multicarry", normal.kind = "Inversion") set.seed(4711, kind = "Marsaglia-Multicarry") data = matrix(round(rnorm(24), 3), ncol = 2) charvec = timeCalendar(2006) mTS = timeSeries(data, charvec) mTS # Matrix: MAT = as.matrix(mTS) head(MAT) class(MAT) checkIdentical( target = class(MAT), current = "matrix") checkIdentical( target = as.vector(MAT[, 1]), current = as.numeric(MAT)[1:12]) # Data Frame: DF = as.data.frame(mTS) head(DF) class(DF) checkIdentical( target = class(DF), current = "data.frame") # Time Series: TS = as.ts(mTS) head(TS) class(TS) checkIdentical( target = class(TS), current = c("mts", "ts")) } # Return Value: return() } ################################################################################ timeSeries/inst/unitTests/runit.cor.R0000644000176000001440000000211711245551275017450 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.cor.timeSeries = function() { # RUnit Test: # Signal Series tS = dummySeries(format = "counts") tS cor(tS) cov(tS) # timeDate Series: tS = dummySeries() tS cor(tS) cov(tS) } ################################################################################ timeSeries/inst/unitTests/runit.na.contiguous.R0000644000176000001440000000245211246737701021464 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.na.contiguous = function() { ## Dummy timeSeries with NAs entries data1 <- matrix(c(NA, 1), ncol = 2) data2 <- matrix(rep(2, 4), ncol = 2) data3 <- matrix(c(NA, 3), ncol = 2) data4 <- matrix(rep(4, 4), ncol = 2) data <- rbind(data1, data2, data3, data4) ts <- timeSeries(data, timeCalendar()[1:6]) ## Find the longest consecutive non-missing values ans <- na.contiguous(ts) check <- getDataPart(ans) dimnames(check) <- NULL checkIdentical(data2, getDataPart(check)) } timeSeries/inst/unitTests/runit.align.R0000644000176000001440000000254711245551275017766 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.align.timeSeries <- function() { # RUnit Test: # .align.timeSeries(x, method = c("before", "after", "interp"), # startOn = "hours", by = "30 m") set.seed(1953) tD = timeCalendar( y = rep(2008, times = 6), m = rep(4, times = 6), d = rep(10:11, each = 3), h = sample(1:23)[1:6], min = sample(1:59)[1:6], s = sample(1:59)[1:6]) tS = timeSeries(rnorm(6), tD) align(tS) align(tS, method="interp") # Note, we should als add an argument to trim NAs } ################################################################################ timeSeries/inst/unitTests/Makefile0000644000176000001440000000042413612573123017035 0ustar ripleyusersPKG=timeSeries TOP=../.. SUITE=doRUnit.R R=R all: inst test inst: # Install package -- but where ?? -- will that be in R_LIBS ? cd ${TOP}/..;\ ${R} CMD INSTALL ${PKG} test: # Run unit tests export RCMDCHECK=FALSE;\ cd ${TOP}/tests;\ ${R} --vanilla --slave < ${SUITE} timeSeries/inst/unitTests/runit.as.R0000644000176000001440000000252211245551275017270 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.as <- function() { # RUnit Test: # Note, you can also use ... is(timeSeries(), "timeSeries") # Series ts = dummySeries() x = timeSeries:::.signalSeries(as.matrix(ts)) y = timeSeries:::.timeSeries(as.matrix(ts), as.numeric(time(ts), "sec")) # A vector to a timeSeries as.vector(x) as.vector(x[,1]) as.vector(y) as.vector(y[,1]) # as.numeric: as.numeric(x) as.numeric(x[,1]) as.numeric(y) as.numeric(y[,1]) } ################################################################################ timeSeries/inst/unitTests/runit.bind.R0000644000176000001440000000511412347663061017602 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.bind <- function() { Documentation <- as.character(date()) Title <- "Dummy Series" ts <- dummySeries() ts@documentation <- Documentation ts@title <- Title # -------------------------------------------------------------------------- # if NULL are in args, result identical except @documentation !!! cts <- cbind(ts, NULL) rts <- rbind(ts, NULL) ##> checkTrue(!identical(slot(cts, "documentation")[[1]], Documentation)) ##> checkTrue(!identical(slot(rts, "documentation")[[1]], Documentation)) # ... DW [[1]] removes attributes, check this # ... also take care of the title! # check that the rest is identical cts@documentation <- Documentation rts@documentation <- Documentation cts@title <- Title rts@title <- Title checkIdentical(cts, ts) checkIdentical(rts, ts) # -------------------------------------------------------------------------- ts1 <- ts[seq(1, nrow(ts), by = 2),] ts0 <- ts[seq(2, nrow(ts), by = 2),] # test rbind checkTrue(all(time(rbind(ts1, ts0)) == c(time(ts1),time(ts0)))) # test cbind checkIdentical(as.vector(is.na(cbind(ts1, ts0))), c(rep(c(FALSE, TRUE), 12), rep(c(TRUE, FALSE), 12))) checkTrue(all(time(cbind(ts1, ts0)) == time(ts))) # -------------------------------------------------------------------------- # issues with single number element a <- timeSeries(1, as.Date(0, origin="2010-01-01") ) b <- timeSeries( 2:3, as.Date(1:2, origin="2010-01-01") ) d <- timeSeries( 2:10, as.Date(1:9, origin="2010-01-01") ) cbind(a, b) cbind(b, a) cbind(b, d) cbind(d, b) cbind(a, 1) cbind(b, 1) cbind(a, matrix(1)) cbind(b, matrix(1)) } ################################################################################ timeSeries/inst/unitTests/runit.order.R0000644000176000001440000000266211245551275020005 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.order <- function() { # RUnit Test: tS = timeSeries(matrix(rnorm(500), 100), units = sample(LETTERS[1:5])) head(tS) colnames(tS) sortColnames(tS) sampleColnames(tS) orderColnames(tS) statsColnames(tS, FUN = colMeans) pcaColnames(tS) hclustColnames(tS) tS = timeSeries(matrix(rnorm(500), 100), units = sample(LETTERS[1:5]), format = "counts") head(tS) colnames(tS) sortColnames(tS) sampleColnames(tS) orderColnames(tS) statsColnames(tS, FUN = colMeans) pcaColnames(tS) hclustColnames(tS) } ################################################################################ timeSeries/inst/unitTests/runit.lag.R0000644000176000001440000000303411651223551017421 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.lag <- function() { # RUnit Test: tS = round(dummySeries(flormat = "counts"), 3)[, 1] tS lag(tS) lag(tS, k = -2:2) lag(tS, k = -2:2, trim = TRUE) tS = round(dummySeries(), 3)[, 1] tS lag(tS) lag(tS, k = -2:2) lag(tS, k = -2:2, trim = TRUE) # check colnames when using multiple lag indexes. data <- matrix(runif(12), ncol = 2) charvec <- rev(paste("2009-0", 1:6, "-01", sep = "")) S <- timeSeries(data, charvec) colnames(S) <- paste("S", 1:2, sep = ".") ts <- lag(S, -1:1) checkIdentical(colnames(ts), c("S.1[-1]", "S.1[0]", "S.1[1]", "S.2[-1]", "S.2[0]", "S.2[1]")) } ################################################################################ timeSeries/inst/unitTests/runit.apply.R0000644000176000001440000000243411245551275020014 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.apply <- function() { x = timeSeries(rnorm(90), timeSequence(length.out = 90)) fapply applySeries <- function(x, from = NULL, to = NULL, by = c("monthly", "quarterly"), FUN = colMeans, units = NULL, format = x@format, zone = x@FinCenter, FinCenter = x@FinCenter, recordIDs = data.frame(), title = x@title, documentation = x@documentation, ...) applySeries(x, from = start(x), to = end(x)) } ################################################################################ timeSeries/inst/unitTests/runit.spreads.R0000644000176000001440000000177611245551275020340 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.spreads <- function() { # RUnit Test: tS = dummySeries(units = c("Bid", "Ask")) head(tS) midquotes(tS) spreads(tS) } ################################################################################ timeSeries/inst/unitTests/runit.rowCum.R0000644000176000001440000000163011245551275020140 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.rowCum <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.TimeSeriesClass.R0000644000176000001440000002602012347663061021724 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.timeSeries = function() { # timeSeries - Creates a 'timeSeries' object from scratch # Settings: setRmetricsOptions(myFinCenter = "GMT") set.seed(4711) data = matrix(round(rnorm(12), 3)) data class(data) charvec = format(timeCalendar(2006)) charvec class(charvec) # Compose Univariate daily random sequence setRmetricsOptions(myFinCenter = "GMT") uTS = timeSeries(data, charvec, units = "uTS") series(uTS) print(uTS) # FinCenter Functionality: timeSeries(data, charvec, units = "uTS", zone = "GMT", FinCenter = "GMT") timeSeries(data, charvec, units = "uTS", zone = "Zurich", FinCenter = "Zurich") timeSeries(data, charvec, units = "uTS", zone = "GMT", FinCenter = "Zurich") timeSeries(data, charvec, units = "uTS", zone = "Zurich", FinCenter = "GMT") # Return Value: return() } # ------------------------------------------------------------------------------ test.readSeries = function() { # readSeries - Reads from a spreadsheet and creates a 'timeSeries' # Load Microsoft Data: data(MSFT) MSFT.df = as.data.frame(MSFT) # Read Data Frame: write.table(MSFT.df, file = "msft.dat.csv", sep = ";") read.table("msft.dat.csv", sep = ";") # Read Time Series: # X = readSeries("msft.dat.csv") # X = X[1:12, ] # class(X) # Show Part of Series: # head(X)[, 1:5] # head(X[, 1:5]) # head(X[, 1:5], 2) # Return Value: return() } # ------------------------------------------------------------------------------ test.returns = function() { # returns - Computes returns from a 'timeSeries' object # Load Time Series: X = MSFT head(X) # returns : OPEN = X[, 1] print(OPEN) MSFT.RET = returns(OPEN) print(MSFT.RET) # Return Value: return() } # ------------------------------------------------------------------------------ test.applySeries = function() { # applySeries - Applies a function to blocks of a 'timeSeries' NA # Return Value: return() } # ------------------------------------------------------------------------------ test.orderStatistics = function() { # orderStatistics - Compute order statistic of a 'timeSeries' # Load Data: X = MSFT head(X) # returns: OPEN = X[, 1] print(OPEN) # ORDER STATISTICS: orderStatistics(OPEN) orderStatistics(X[, -5]) orderStatistics(X[, -5])$Open # Return Value: return() } # ------------------------------------------------------------------------------ test.series = function() { # series - Extracts data slot from 'timeSeries' object # Load Microsoft Data: X = MSFT X = X[1:12, ] class(X) # Return Series: OPEN = X[, 1] OPEN returns(OPEN) # Volatility Series: abs(returns(OPEN)) # Data Matrix: series(OPEN) Y = series(X) Y class(Y) # Position Vector: PO = time(OPEN) PO PX = time(X) PX class(PX) checkEquals( target = sum(as.integer(PO - PX)), current = 0) # Return Value: return() } # ------------------------------------------------------------------------------ test.isUnivariate = function() { # isUnivariate Tests if an object of class 'timeSeries' is univariate # Load Microsoft Data: X = MSFT OPEN = X[, 1] # Is Univariate? checkTrue(!isUnivariate(X)) checkTrue(isUnivariate(OPEN)) checkTrue(isMultivariate(X)) checkTrue(!isMultivariate(OPEN)) # Return Value: return() } # ------------------------------------------------------------------------------ test.isMultivariate = function() { # isMultivariate - Tests if an object of class 'timeSeries' is multivariate # Load Microsoft Data: X = MSFT OPEN = X[, 1] # Is Multivariate? checkTrue(isMultivariate(X)) checkTrue(!isMultivariate(OPEN)) # Return Value: return() } # ------------------------------------------------------------------------------ test.displayMethods = function() { # print.timeSeries Print method for a 'timeSeries' object # plot.timeSeries Plot method for a 'timeSeries' object # lines.timeSeries Lines method for a 'timeSeries' object # points.timeSeries Points method for a 'timeSeries' object ## FIXME(MM) - if we store this -- make it a package data set! ## Microsoft Data: ## MSFT.df = data.frame(matrix(c( ## 20010326, 57.1250, 57.5000, 55.5625, 56.0625, 31559300, ## 20010327, 56.0625, 58.5625, 55.8750, 58.2500, 47567800, ## 20010328, 57.3750, 57.9375, 55.3750, 55.5625, 39340800, ## 20010329, 55.3750, 57.1875, 54.5625, 55.3750, 43492500, ## 20010330, 55.7500, 56.1875, 53.8750, 54.6875, 45600800, ## 20010402, 54.8125, 56.9375, 54.6250, 55.8125, 37962000, ## 20010403, 55.3125, 55.3125, 52.7500, 53.3750, 47093800, ## 20010404, 53.3750, 55.0000, 51.0625, 51.9375, 52023300, ## 20010405, 53.7500, 57.3750, 53.5000, 56.7500, 56682000, ## 20010406, 56.3750, 57.1875, 55.0625, 56.1875, 46311000, ## 20010409, 56.5700, 57.4200, 55.6600, 57.1500, 28147800, ## 20010410, 57.9500, 60.0900, 57.7800, 59.6800, 54599700, ## 20010411, 60.6500, 61.5000, 59.7000, 60.0400, 54939800, ## 20010412, 59.5600, 62.3100, 59.3500, 62.1800, 43760000, ## 20010416, 61.4000, 61.5800, 60.1200, 60.7900, 32928700, ## 20010417, 60.5200, 62.1100, 60.0400, 61.4800, 42574600, ## 20010418, 63.3900, 66.3100, 63.0000, 65.4300, 78348200, ## 20010419, 65.8100, 69.0000, 65.7500, 68.0400, 79687800, ## 20010420, 70.3000, 71.1000, 68.5000, 69.0000, 96459800, ## 20010423, 68.1100, 68.4700, 66.9000, 68.2500, 46085600, ## 20010424, 68.2000, 69.9300, 67.1400, 67.5500, 44588300, ## 20010425, 67.5700, 69.7900, 67.2500, 69.6900, 38372000, ## 20010426, 70.0700, 71.0000, 68.2500, 69.1300, 59368800, ## 20010427, 69.5300, 69.6800, 66.2100, 67.1200, 60786200, ## 20010430, 68.5300, 69.0600, 67.6800, 67.7500, 37184100, ## 20010501, 67.6600, 70.3000, 67.6000, 70.1700, 41851400, ## 20010502, 71.0000, 71.1500, 69.3500, 69.7600, 46432200, ## 20010503, 69.2500, 70.1800, 68.1400, 68.5300, 33136700, ## 20010504, 68.0000, 71.0500, 67.9600, 70.7500, 59769200, ## 20010507, 70.8300, 72.1500, 70.7000, 71.3800, 54678100), ## byrow = TRUE, ncol = 6)) ## colnames(MSFT.df) = c("YYMMDD", "Open", "High", "Low", "Close", "Volume") # Data: X = MSFT X = X[1:12, ] OPEN = X[, 1] # Print: print(X) print(OPEN) # Plot: par(mfrow = c(1, 1)) plot(OPEN, type = "l") # GMT - Plot: tC = timeCalendar(2006, 1, 1, 0:23, 0, 0, zone = "GMT", FinCenter = "GMT") tS = timeSeries(data = matrix(rnorm(24), ncol = 1), charvec = tC) plot(tS) # Zurich - Plot: tC = timeCalendar(2006, 1, 1, 0:23, 0, 0, zone = "GMT", FinCenter = "Zurich") tS = timeSeries(data = matrix(rnorm(24), ncol = 1), charvec = tC, zone = "GMT", FinCenter = "Zurich") plot(tS) # New York - Plot: tC = timeCalendar(2006, 1, 1, 0:23, 0, 0, zone = "GMT", FinCenter = "NewYork") tS = timeSeries(data = matrix(rnorm(24), ncol = 1), charvec = tC, zone = "GMT", FinCenter = "NewYork") plot(tS, type = "h") lines (tS, col = "red", lty = 3) points(tS, col = "blue", pch = 19) abline(h=0, col = "grey") # Return Value: return() } # ------------------------------------------------------------------------------ test.dummyDailySeries = function() { # dummyDailySeries - Creates a dummy daily 'timeSeries' object # Create Dummy Time Series: setRmetricsOptions(myFinCenter = "GMT") tS = dummyDailySeries(matrix(rnorm(12))) print(tS) # Return Value: return() } # ------------------------------------------------------------------------------ test.alignDailySeries = function() { # alignDailySeries - Aligns a 'timeSeries' object to new positions # Time Series: setRmetricsOptions(myFinCenter = "GMT") tS = MSFT[1:25, ] print(tS) dim(tS) # Align Daily Series: alignDailySeries(tS, method = "interp") # Align Daily Series: alignDailySeries(tS, method = "fillNA") # Align Daily Series: alignDailySeries(tS, method = "fillNA", include.weekends = TRUE) # Return Value: return() } # ------------------------------------------------------------------------------ ## DW > ## test.ohlcDailyPlot = ## function() ## { ## # ohlcDailyPlot - Plots openhighlowclose bar chart ## ## # Price or Incdex Series: ## setRmetricsOptions(myFinCenter = "GMT") ## tS = MSFT[1:25, ] ## print(tS) ## dim(tS) ## colnames(tS) ## ## # Graph Frame: ## par(mfrow = c(2, 1), cex = 0.7) ## ohlcDailyPlot(tS) ## ## # Return Value: ## return() ## } # ------------------------------------------------------------------------------ test.modelSeries = function() { if (FALSE) { # Move to fArma ... # Undocumented Material: Matrix = cbind(X = rnorm(10), Y = rnorm(10)) Matrix = cbind(Matrix, Z = Matrix[, "Y"] - Matrix[, "X"]) TS = dummyDailySeries(Matrix, units = c("X", "Y", "Z") ) head(TS) .modelSeries(Y ~ ar(2), data = TS, lhs = TRUE) .modelSeries(log(abs(Z)) ~ lm(X + sin(Y)), data = TS, fake = TRUE) .modelSeries(log(abs(Z)) ~ lm(X + sin(Y)), data = TS, lhs = TRUE) .modelSeries(Y ~ ar(2), data = as.data.frame(TS), lhs = TRUE) .modelSeries(log(abs(Z)) ~ lm(X + sin(Y)), data = TS, fake = TRUE) .modelSeries(log(abs(Z)) ~ lm(X + sin(Y)), data = TS, lhs = TRUE) require(timeSeries) .modelSeries(Y ~ ar(2), data = rnorm(10)) .modelSeries(Y ~ ar(2), data = as.ts(rnorm(10))) .modelSeries(x ~ arima(2, 0, 1), data = armaSim(n=10)) .modelSeries(~ ar(2), rnorm(10)) # attach(TS) # CHECK # .modelSeries(Y ~ ar(2), lhs = TRUE) .modelSeries(Y ~ ar(2) + garch(1,1), data = rnorm(10)) .modelSeries(Y ~ ar(2) + garch(1,1), data = rnorm(10), lhs = TRUE) .modelSeries(Y ~ ar(2) + garch(1,1), data = TS, lhs = TRUE) } else { NA } # Return Value: return() } ################################################################################ timeSeries/inst/unitTests/runit.NA.R0000644000176000001440000000653611245551275017174 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.removeNA = function() { # Create matrix object: set.seed(1985) M = 5 N = 20 x = matrix(round(rnorm(M*N), 3), ncol = M) colnames(x) = 1:M rownames(x) = 1:N nNA = 10 nCol = trunc(runif(nNA, 1, M+1)) nRow = trunc(runif(nNA, 1, N+1)) for (i in 1:nNA) x[nRow[i], nCol[i]] = NA print(x) ans = removeNA(x) print(ans) # Create data.frame object: x.df = as.data.frame(x) class(x.df) ans = removeNA(x.df) print(ans) class(ans) # Create timeSeries object: tD = timeCalendar(m = 1, d = 1:N) x.tS = timeSeries(x, tD) print(x.tS) ans = removeNA(x.tS) print(ans) class(ans) # Return Value: return() } # ------------------------------------------------------------------------------ test.substituteNA = function() { # Create matrix object: set.seed(1985) M = 5 N = 20 x = matrix(round(rnorm(M*N), 3), ncol = M) colnames(x) = 1:M rownames(x) = 1:N nNA = 10 nCol = trunc(runif(nNA, 1, M+1)) nRow = trunc(runif(nNA, 1, N+1)) for (i in 1:nNA) x[nRow[i], nCol[i]] = NA print(x) # Substitute: ans = substituteNA(x) print(ans) ans = substituteNA(x, "mean") print(ans) ans = substituteNA(x, "median") print(ans) # Create data.frame object: x.df = as.data.frame(x) print(x.df) class(x.df) # Substitute: ans = substituteNA(x.df) print(ans) ans = substituteNA(x.df, "mean") print(ans) ans = substituteNA(x.df, "median") print(ans) # Create timeSeries object: tD = timeCalendar(m = 1, d = 1:N) x.tS = timeSeries(x, tD) print(x.tS) class(x.tS) # Substitute: ans = substituteNA(x.tS) print(ans) ans = substituteNA(x.tS, "mean") print(ans) ans = substituteNA(x.tS, "median") print(ans) # Return Value: return() } # ------------------------------------------------------------------------------ test.interpNA = function() { # Interpolate Column-by-Column # Create matrix object: set.seed(1985) M = 5 N = 20 x = matrix(round(rnorm(M*N), 3), ncol = M) colnames(x) = 1:M rownames(x) = 1:N nNA = 10 nCol = trunc(runif(nNA, 1, M+1)) nRow = trunc(runif(nNA, 1, N+1)) for (i in 1:nNA) x[nRow[i], nCol[i]] = NA print(x) # Interpolate: ans = interpNA(x, "linear") print(ans) ans = interpNA(x, "before") print(ans) ans = interpNA(x, "after") print(ans) # Return Value: return() } ################################################################################ timeSeries/inst/unitTests/runit.time.R0000644000176000001440000000162611245551275017627 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.time <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.returns.R0000644000176000001440000000163111245551275020367 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.returns <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.TimeSeriesData.R0000644000176000001440000002416511653745660021545 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.diffTimeSeries = function() { # diff.timeSeries - Differences a 'timeSeries' object # Univariate Series: # Multivariate Data Set: set.seed(4711) data = cbind(RNORM = round(rnorm(6), 2)) charvec = timeCalendar()[1:6] recordIDs = data.frame(IDs = LETTERS[1:6]) uTS = timeSeries(data, charvec, recordIDs = recordIDs) uTS uTS@recordIDs # Differencing over 1 lag X = diff(x = uTS, lag = 1, diff = 1, trim = FALSE, pad = NA) X X@recordIDs # X = diff(x = uTS, lag = 1, diff = 1, trim = TRUE, pad = NA) # X # X@recordIDs X = diff(x = uTS, lag = 1, diff = 1, trim = FALSE, pad = 0) X X@recordIDs # Differencing over 2 lags X = diff(x = uTS, lag = 2, diff = 1, trim = FALSE, pad = NA) X X@recordIDs # X = diff(x = uTS, lag = 2, diff = 1, trim = TRUE, pad = NA) # X # X@recordIDs X = diff(x = uTS, lag = 2, diff = 1, trim = FALSE, pad = 0) X X@recordIDs # Differencing twice: # X = diff(x = uTS, lag = 1, diff = 2, trim = FALSE, pad = NA) #ERROR # X # X@recordIDs # X = diff(x = uTS, lag = 2, diff = 2, trim = FALSE, pad = NA) # ERROR # X # X@recordIDs # X = diff(x = uTS, lag = 1, diff = 2, trim = TRUE, pad = NA) # X # X@recordIDs # X = diff(x = uTS, lag = 2, diff = 2, trim = TRUE, pad = NA) # X # X@recordIDs # Return Value: return() } # ------------------------------------------------------------------------------ test.lagTimeSeries = function() { # lag.timeSeries - Lags a 'timeSeries' object # Univariate Series: set.seed(4711) data = cbind(RNORM = round(rnorm(6), 2)) charvec = timeCalendar()[1:6] recordIDs = data.frame(IDs = LETTERS[1:6]) uTS = timeSeries(data, charvec, recordIDs = recordIDs) # Multivariate Data Set: set.seed(4711) data = cbind(round(rnorm(12), 2), round(rt(12, df = 4), 2) ) charvec = format(timeCalendar(2006)) mTS = timeSeries(data, charvec, units = c("RNORM", "RT")) mTS # Time Series Lags: X = lag(x = uTS, k = 1, trim = FALSE, units = NULL) X X@recordIDs X = lag(x = uTS, k = c(2,4), trim = FALSE, units = NULL) X X@recordIDs X = lag(x = uTS, k = c(2,4), trim = TRUE, units = NULL) X X@recordIDs X = lag(x = uTS, k = -1:1, trim = FALSE, units = LETTERS[1:3]) X X@recordIDs # Multivariaye Series: diff(mTS, 1, 1) lag(mTS, 1) # Return Value: return() } # ------------------------------------------------------------------------------ test.mergeTimeSeries = function() { # merge.timeSeries - Merges two 'timeSeries' objects # scale.timeSeries - Centers and/or scales a 'timeSeries' object # summary.timeSeries - Summarizes a 'timeDate' object # var.timeSeries - Returns variance for a 'timeSeries' object # Univariate Series: set.seed(4711) data = cbind(RNORM = round(rnorm(6), 2)) charvec = timeCalendar()[1:6] recordIDs = data.frame(IDs = LETTERS[1:6]) uTS = timeSeries(data, charvec, recordIDs = recordIDs) # Merge: X = uTS Y = log(abs(uTS)) merge(x = X, y = Y, units = "One column") colnames(Y) <- "log" merge(x = X, y = Y, units = c("RN", "logAbsRN")) merge(x = X[-6,], y = Y[-3,], units = c("RN", "logAbsRN")) merge(x = X[2:5,], y = Y[4:6,], units = c("RN", "logAbsRN")) # Return Value: return() } # ------------------------------------------------------------------------------ test.scaleTimeSeries = function() { # scale.timeSeries - Centers and/or scales a 'timeSeries' object # Univariate Series: set.seed(4711) data = cbind(RNORM = round(rnorm(6), 2)) charvec = timeCalendar()[1:6] recordIDs = data.frame(IDs = LETTERS[1:6]) uTS = timeSeries(data, charvec, recordIDs = recordIDs) # Multivariate Data Set: set.seed(4711) data = cbind(round(rnorm(12), 2), round(rt(12, df = 4), 2) ) charvec = format(timeCalendar(2006)) mTS = timeSeries(data, charvec, units = c("RNORM", "RT")) # Scale: scale(uTS) scale(mTS) # Return Value: return() } # ------------------------------------------------------------------------------ test.summaryTimeSeries = function() { # summary.timeSeries - Summarizes a 'timeDate' object # Univariate Series: set.seed(4711) data = cbind(RNORM = round(rnorm(6), 2)) charvec = timeCalendar()[1:6] recordIDs = data.frame(IDs = LETTERS[1:6]) uTS = timeSeries(data, charvec, recordIDs = recordIDs) # Multivariate Data Set: set.seed(4711) data = cbind(round(rnorm(12), 2), round(rt(12, df = 4), 2) ) charvec = format(timeCalendar(2006)) mTS = timeSeries(data, charvec, units = c("RNORM", "RT")) # Summary: summary(uTS) summary(mTS) # Return Value: return() } # ------------------------------------------------------------------------------ test.varTimeSeries = function() { # var.timeSeries - Returns variance for a 'timeSeries' object # Univariate Series: set.seed(4711) data = cbind(RNORM = round(rnorm(6), 2)) charvec = timeCalendar()[1:6] recordIDs = data.frame(IDs = LETTERS[1:6]) uTS = timeSeries(data, charvec, recordIDs = recordIDs) # Multivariate Data Set: set.seed(4711) data = cbind(round(rnorm(12), 2), round(rt(12, df = 4), 2) ) charvec = format(timeCalendar(2006)) mTS = timeSeries(data, charvec, units = c("RNORM", "RT")) # Covariance Matrix: var(x = uTS, y = NULL, na.rm = FALSE) var(x = mTS, y = NULL, na.rm = FALSE) # Note, using function cov() fails, since cov() requires an atomic # object as input. # Return Value: return() } # ------------------------------------------------------------------------------ test.mathOpsTimeSeries = function() { # Ops.timeSeries - Arith method for a 'timeSeries' object # abs.timeSeries - Returns abolute values of a 'timeSeries' object # sqrt.timeSeries - Returns sqrt values of a 'timeSeries' object # exp.timeSeries - Returns exponentials of a 'timeSeries' object # log.timeSeries - Returns logarithms of a 'timeSeries' object # quantile.timeSeries - produces sample quantiles of a 'timeSeries' object # Univariate Series: setRmetricsOptions(myFinCenter = "GMT") data = matrix(round(rnorm(12), 2)) charvec = format(timeCalendar(2006)) uTS = timeSeries(data, charvec, units = "RNORM") uTS # Multivariate Series: data = cbind(round(rnorm(12), 2), round(rt(12, df = 4), 2) ) charvec = format(timeCalendar(2006)) mTS = timeSeries(data, charvec, units = c("RNORM", "RT")) mTS # Univariate Ops: uTS < 0 uTS == abs(uTS) # Math Operations: uTS + 5 uTS - 5 100 * uTS uTS / 100 uTS^2 # mathematical Functions: log(abs(uTS)) sqrt(exp(uTS)) # Quantiles: quantile(uTS) quantile(uTS, probs = c(0.9, 0.95)) quantile(uTS, probs = c(0.9, 0.95), type = 5) # Logical Operations: mTS < 0 # Return Value: return() } # ------------------------------------------------------------------------------ test.subsetTimeSeries = function() { # [.timeSeries - subsets of a 'timeSeries' object # cut.timeSeries - cuts a block from a 'timeSeries' object # head.timeSeries - returns the head of a 'timeSeries' object # tail.timeSeries - returns the tail of a 'timeSeries' object # outlier.timeSeries - Removes outliers from a 'timeSeries' object # Univariate Series: setRmetricsOptions(myFinCenter = "GMT") data = matrix(round(rnorm(12), 2)) charvec = format(timeCalendar(2006)) uTS = timeSeries(data, charvec, units = "RNORM") uTS # Multivariate Series: data = cbind(round(rnorm(12), 2), round(rt(12, df = 4), 2) ) charvec = format(timeCalendar(2006)) mTS = timeSeries(data, charvec, units = c("RNORM", "RT")) mTS # Subsets: X = uTS[4:6, ] X X@recordIDs # Head and Tail: head(uTS) tail(uTS) head(mTS) tail(mTS) # Data Subsetting: mTS[, 1] # First Series mTS[4:6, 1] # Second Quarter # Return Value: return() } # ------------------------------------------------------------------------------ test.dimOpsTimeSeries = function() { # dim - Returns the dimension of a 'timeSeries' object # dimnames - Returns the dimension names of a 'timeSeries' object # colnames<-.timeS* - Assigns column names to a 'timeSeries' object # rownames<-.timeS* - Assigns row names to a 'timeSeries' object # is.array.timeSeries - Allows that NCOL and NROW work properly # Univariate Series: setRmetricsOptions(myFinCenter = "GMT") data = matrix(round(rnorm(12), 2)) charvec = format(timeCalendar(2006)) uTS = timeSeries(data, charvec, units = "RNORM") uTS # Multivariate Series: data = cbind(round(rnorm(12), 2), round(rt(12, df = 4), 2) ) charvec = format(timeCalendar(2006)) mTS = timeSeries(data, charvec, units = c("RNORM", "RT")) mTS # Dimension: dim(uTS) == c(12, 1) dimnames(uTS) # Column and Rownames: # X = uTS # colnames(X) = "X" # rownames(X) = as.character(timeCalendar()+24*3600) # X # series(X) # Array: is.array(uTS) # Number of Columns/Rows: NCOL(uTS) NROW(uTS) ncol(uTS) nrow(uTS) # Return Value: return() } ################################################################################ timeSeries/inst/unitTests/runit.signalCounts.R0000644000176000001440000000255711245551275021346 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.signalCounts <- function() { # RUnit Test: int = c(1, 10, 100, 21, 135) print(timeSeries:::.signalCounts(sample(int))) nc = timeSeries:::.signalCounts(int) nc ns = sample(nc) ns sorted = sort(ns) sorted as.integer(sorted) ns ordered = order(ns) ordered ns[ordered] as.integer(ns[ordered]) timeSeries:::.signalCounts(1:12) timeSeries:::.signalCounts(sample(1:12)) timeSeries:::.signalCounts(timeSeries:::.signalCounts(1:12)) } ################################################################################ timeSeries/inst/unitTests/runit.aggregate.R0000644000176000001440000000447411321127320020604 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.aggregate.timeSeries <- function() { # RUnit Test: # aggregate.timeSeries(x, by = c("monthly", "quarterly"), FUN = colMeans, # units = NULL, ...) # A daily Series: charvec <- timeSequence(length.out = 365) x <- timeSeries(rnorm(365), charvec) # Aggregate Returns Monthly: by <- unique(timeFirstDayInMonth(charvec)) aggregate(x, by, sum, units = "MonthReturns") # Count Monthly Records: aggregate(sign(abs(x)), end(charvec), sum, units = "NoOfRecords") # Aggregate Returns Quarterly: by <- unique(timeLastDayInQuarter(charvec)) aggregate(x, by, sum, units = "QrtReturns") # Another example x <- as.timeSeries(data(LPP2005REC))[,1:4] by <- timeSequence(from = "2006-01-01", to = "2008-01-01", by = "quarter") aggregate(x, by, mean) x <- timeSeries(seq(12), timeCalendar()) # relative from and to to make test work for future years ... from <- timeCalendar(y=getRmetricsOptions("currentYear") - 1, m=1, d=1) to <- timeCalendar(y=getRmetricsOptions("currentYear") + 1, m=1, d=1) by <- timeSequence( from = from, to = to, by = "quarter") x a <- aggregate(x, by, sum) a ### DW here are mismatches - corrected above ... checkEquals(sum(x[1]), a[1]) checkEquals(sum(x[2:4]), a[2]) checkEquals(sum(x[5:7]), a[3]) checkEquals(sum(x[8:10]), a[4]) checkEquals(sum(x[11:12]), a[5]) } ################################################################################ timeSeries/inst/unitTests/runit.methods-print.R0000644000176000001440000000162711245551275021467 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.print <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.attach.R0000644000176000001440000000200211245551275020122 0ustar ripleyusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics 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 Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.attach.timeSeries = function() { # RUnit Test: # Attach Signal Series tS = timeSeries() attach(tS) SS.1 detach(tS) } ################################################################################ timeSeries/inst/COPYING0000644000176000001440000004310711023731525014427 0ustar ripleyusers GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.