fPortfolio/0000755000176200001440000000000013203404463012374 5ustar liggesusersfPortfolio/inst/0000755000176200001440000000000013201353172013347 5ustar liggesusersfPortfolio/inst/LICENSE_DONLP20000644000176200001440000001343512323217772015411 0ustar liggesusers ******************************************************************************** * * * cosmo - Constrained search for motifs in DNA sequences * * Authors: Oliver Bembom, Fabian Gallusser, and Sandrine Dudoit * * * * Conditions of use: * * * * 1. cosmo is under the exclusive copyright of Oliver Bembom, * * (bembom@berkeley.edu), the Regents of the University of California, * * and Peter Spellucci (spellucci@mathematik.tu-darmstadt.de). * * * * 2. Permission to use, copy, modify, and distribute any part of this * * software for research purposes, without fee and without a written * * agreement, is hereby granted, provided that this license appears in * * all copies. Commercial uses require permission and licensing from * * Oliver Bembom, the Regents of the University of California, and * * Peter Spellucci. * * * * 3. If you use this software in your research, please cite * * * * O. Bembom, S. Keles, M.J. van der Laan (2007). Supervised Detection * * of Conserved Motifs in DNA Sequences with cosmo. Statistical * * Applications in Genetics and Molecular Biology: Vol. 6 : Iss. 1, * * Article 8. http://www.bepress.com/sagmb/vol6/iss1/art8. * * * * cosmo makes use of the donlp2() function by Peter Spellucci. * * The use of donlp2() must be acknowledged in any publication which * * contains results obtained with cosmo or parts of it. Citation of the * * author's name and netlib-source is suitable. * * * * 4. In no event shall the authors be liable to any party for direct, in- * * direct, special, incidental, or consequential damages, including lost * * profits, arising out of the use of this software, even if the authors * * have been advised of the possibility of such damage. * * * * 5. cosmo is provided on an 'as is' basis, and the authors have no obli- * * gations to provide maintenance, support, updates, enhancements, or * * modifications. The authors make no representations and extends no * * warranties of any kind, either expressed or implied, including, but * * not limited to, the implied warranties of merchantability or fitness * * for a particular purpose, or that the use of the material will not * * infringe any patent, trademark or other rights. * * * * * ******************************************************************************** ******************************************************************************** * * * puma - Propagating Uncertainty in Microarray Analysis * * Authors: Richard D. Pearson, Xuejun Liu, Magnus Rattray, * * Marta Milo, Neil D. Lawrence, Guido Sanguinetti * * * * puma uses donlp which has the following conditions of use: * * * * 1. donlp2 is under the exclusive copyright of P. Spellucci * * (e-mail:spellucci@mathematik.tu-darmstadt.de) * * "donlp2" is a reserved name * * 2. donlp2 and its constituent parts come with no warranty, whether ex- * * pressed or implied, that it is free of errors or suitable for any * * specific purpose. * * It must not be used to solve any problem, whose incorrect solution * * could result in injury to a person , institution or property. * * It is at the users own risk to use donlp2 or parts of it and the * * author disclaims all liability for such use. * * 3. donlp2 is distributed "as is". In particular, no maintenance, support * * or trouble-shooting or subsequent upgrade is implied. * * 4. The use of donlp2 must be acknowledged, in any publication which * * contains * * results obtained with it or parts of it. Citation of the authors name * * and netlib-source is suitable. * * 5. The free use of donlp2 and parts of it is restricted for research * * purposes * * commercial uses require permission and licensing from P. Spellucci. * ********************************************************************************fPortfolio/inst/ReferenceCard.txt0000644000176200001440000014271312323217772016621 0ustar liggesusers PACKAGE: fPortfolio The functions listed in this reference card are available from the CRAN server, its development version can be downloaded from the r-forge Server. REFERENCE CARD: assets-arrange.R assetsArrange Rearranges the columns in a data set of assets statsArrange Returns statistically reordered column names pcaArrange Returns PCA correlation ordered column names hclustArrage Returns hierarchical clustered column names abcArrage Returns alphabetically sorted column names orderArrange Returns permuted column names sampleArrage Returns randomly sampled column names assets-dist.R assetsDist Computes the distances between assets corDist Returns correlation distance measure kendallDist Returns kendalls correlation distance measure spearmanDist Returns spearmans correlation distance measure mutinfoDist Returns mutual information distance measure euclideanDist Returns Euclidean distance measure maximumDist Returns maximum distance measure manhattanDist Returns Manhattan distance measure canberraDist Returns Canberra distance measure binaryDist Returns binary distance measure minkowskiDist Returns Minkowsky distance measure braycurtisDist Returns Bray Curtis distance measure mahalanobisDist Returns Mahalanobis distance measure jaccardDist Returns Jaccard distance mesaure differenceDist Returns difference distance measure sorensenDist Returns Sorensen distance measure assets-fit.R assetsFit Fits the parameters of a set of assets mvnormFit Fits a multivariate Normal distribution mvsnormFit Fits a multivariate skew-Normal distribution mvstFit Fits a multivariate skew-Student-t distribution assets-lpm.R assetsLPM Computes asymmetric lower partial moments assetsSLPM Computes symmetric lower partial moments assets-meancov.R assetsMeanCov Estimates mean and variance for a set of assets .covMeanCov uses sample covariance estimation .mveMeanCov uses "cov.mve" from [MASS] .mcdMeanCov uses "cov.mcd" from [MASS] .studentMeanCov uses "cov.trob" from [MASS] .MCDMeanCov uses "covMcd" from [robustbase] .OGKMeanCov uses "covOGK" from [robustbase] .nnveMeanCov uses builtin from [covRobust] .shrinkMeanCov uses builtin from [corpcor] .baggedMeanCov uses builtin from [corpcor] .arwMeanCov uses builtin from [mvoutlier] .donostahMeanCov uses builtin from [robust] .bayesSteinMeanCov uses code borrowed from Alexios Ghalanos .ledoitWolfMeanCov uses builtin from [tawny] .rmtMeanCov uses builtin from [tawny] getCenterRob Extracts the robust estimate for the center getCovRob Extracts the robust estimate for the covariance assets-outliers.R assetsOutliers Detects outliers in multivariate assets sets assets-portfolio.R pfolioVaR Computes VaR for a portfolio of assets pfolioCVaR Computes CVaR for a portfoluio of assets pfolioCVaRplus Computes CVaR-Plus for a portfolio of assets lambdaCVaR Computes CVaR's atomic split value lambda pfolioMaxLoss Computes maximum loss for a portfolio pfolioReturn Computes return series for a portfolio pfolioTargetReturn Computes target return for a portfolio pfolioTargetRisk Computes target risk for a portfolio pfolioHist Plots a histogram of portfolio returns assets-resolution.R [should go to 'timeSeries' package?] asMonthly Converts a timeSeries into an end-of-month series asAnnual Converts a timeSeries into an end-of-year series asDecades Converts a timeSeries into an end-of-decade series assets-select.R assetsSelect Selects similar or dissimilar assets hclustSelect Selects assets due to hierarchical clustering kmeansSelect Selects assets due to k-means clustering assets-simulate.R assetsSim Simulates a set of artificial assets assets-test.R assetsTest Tests for multivariate Normal Assets mvshapiroTest Multivariate Shapiro Test mvenergyTest Multivariate E-Statistic (Energy) Test ----------------------------------------------------------------------------------------- backtest-defaultFunctions.R equidistWindows Defines default equal distant rolling windows tangencyStrategy Defines default tangency strategy portfolio emaSmoother Defines default EMA weights smoother backtest-getBacktestSpec.R getWindows Extracts windows slot getWindowsFun Extracts name of windows function getWindowsParams Extracts a list of windows specific parameters getWindowsHorizon Extracts windows horizon getStrategy Extracts strategy slot getStrategyFun Extracts the name of portfolio strategy function getStrategyParams Extracts a list of strategy specific parameters getSmoother Extracts the smoother slot getSmootherFun Extracts the name of the moother function getSmootherParams Extracts a list of smoothing specific parameters getSmootherLambda Extracts the smoothing parameter Lambda getSmootherDoubleSmoothing Extracts setting for double smoothing getSmootherInitialWeights Extracts the initial weights in the smoothing getSmootherSkip Extracts the number of skipped months getMessages Extracts the message slot backtest-getMethods.R getWindows Extracts windows information getWindowsFun Extracts windows function getWindowsParams Extracts windows function parameters getWindowsHorizon Extracts windows Horizon getStrategy Extracts strategy information getStrategyFun Extracts strategy function getStrategyParams Extracts strategy function parameters getSmoother Extracts smoother information getSmootherFun Extracts smoother function getSmootherParams Extracts smoother function parameters getSmootherLambda Extracts decay parameter getSmootherDoubleSmoothing Extracts double smoothing flag getSmootherInitialWeights Extracts initial weights getSmootherSkip Extracs skip smoothing flag getMessages Extracts messages backtest-methodsShow.R show.fPFOLIOBACKTEST Print method for 'fPFOLIOBACKTEST' objects backtest-netPerformance.R netPerformance Returns performance from a portfolio backtest .netPerformanceYTD Returns year-to-date performance .netPerformanceCalendar Returns calendar performance .netPerformancePlot Creates a net performance plot backtest-pfolioBacktest.R portfolioBacktesting Performs a portfolio backtesting portfolioSmoothing Smoothes the weights of a portfolio backtesting backtest-pfolioBacktestSpec.R portfolioBacktest Returns an object of class 'fPFOLIOBACKTEST' backtest-plots.R backtestPlot Creates a summary of backtesting plots backtestAssetsPlot Plots assets used in a portfolio backtest backtestWeightsPlot Plots recommended weights from a backtest backtestRebalancePlot Plots rebalanced weights of a backtest backtestPortfolioPlot Plots benchmark and portfolio series backtestDrawdownPlot Plots the drawdown of the portfolio backtest backtestReportPlot Prints backtest report backtest-rollingStats.R backtestStats Wrapper function for calculating rolling statistics rollingSigma Rolling portfolio Sigma risk rollingVaR Rolling Value at Risk rollingCVaR Rolling Conditional Value at Risk rollingDar Rolling Drawdowns at Risk rollingCDaR Rolling Conditional Drawdowns at Risk backtest-setBacktestSpec.R setWindowsFun<- Sets name of rolling windows function setWindowsParams<- Sets additional parameters to windows function setWindowsHorizon<- Sets horizon of the rolling window setStrategyFun<- Sets name of portfolio strategy function setStrategyParams<- Sets additional parameters to strategy function setSmootherFun<- Sets name of weights smoothing function setSmootherParams<- Sets additional parameters to smoother function setSmootherLambda<- Sets lambda for EMA smoothing setSmootherDoubleSmoothing<- Sets double ema setting, logical setSmootherInitialWeights<- Sets initial weights of the portfolio setSmootherSkip<- Sets number of months to skip starting ----------------------------------------------------------------------------------------- builtin-*.R builtin-arwMvoutlier builtin-baggedCorpcor builtin-BayesStein builtin-corrgram builtin-distEcodist builtin-donostahRobust builtin-mstApe builtin-nnveCovRobust builtin-ogkRrcov builtin-rmtTawney builtin-shrinkCorpcor builtin-shrinkTawney builtin-solveRdeoptim builtin-testEnergy ----------------------------------------------------------------------------------------- frontier-getPoints.R frontierPoints Extracts frontier points frontier-portfolioPlots.R frontierPlot Plots efficient frontier minvariancePoints Adds minimum variance point cmlPoints Adds market portfolio cmlLines Adds capital market Line tangencyPoints Adds tangency portfolio point tangencyLines Adds tangency line equalWeightsPoints Adds point of equal weights portfolio singleAssetPoints Adds points of single asset portfolios twoAssetsLines Adds EF for all combinations of two assets sharpeRatioLines Adds Sharpe ratio line monteCarloPoints Adds randomly produced feasible portfolios frontierPlotControl Sets frontier plot control parameters tailoredFrontierPlot Tailored frontier plot wit addons frontier-weightPlots.R .weightsWheel Adds a pie of weights to frontier plot .attributesWheel Adds a pie of attributes to frontier plot .notStackedWeightsPlot Plots the not stacked weights of potfolio .addlegend Adds legend to sliders ----------------------------------------------------------------------------------------- mathprogLP.R rsolveLP General Interface for LP solvers .solveLP.MAD.demo Demonstation Example .solveLP.GLPK.demo Demonstation Example mathprogLP-ampl.R ramplLP Rmetrics Interface for AMPL LP solvers amplLP Convenience wrapper for AMPL LP solvers amplLPControl AMPL LP control parameter list mathprogLP-glpk.R rglpkLP Rmetrics Interface for Rglpk LP solver glpkLP Convenience wrapper for Rglpk LP solver glpkLPControl Rglpk LP control parameter list mathprogLP-neos.R rneoslLP Rmetrics Interface for AMPL/NEOS LP solvers neoslLP Convenience wrapper for AMPL/NEOS LP solvers neoslLPControl AMPL/NEOS LP control parameter list mathprogLP-symphony.R rsymphonyLP Rmetrics Interface for SYMPHONY LP solvers symphonyLP Convenience wrapper for SYMPHONY LP solvers symphonyLPControl SYMPHONY LP control parameter list ----------------------------------------------------------------------------------------- mathprogNLP.R .solveNLP.demo Mean-variance portfolio demo example mathprogNLP-ampl.R ramplNLP Rmetrics Interface for AMPL LP solvers amplNLP Convenience wrapper for AMPL LP solvers amplControl AMPL LP control parameter list mathprogNLP-donlp2.R rdonlp2NLP Rmetrics Interface for DONLP2 LP solvers donlp2NLP Convenience wrapper for DONLP2 LP solvers donlp2NLPControl DONLP2 LP control parameter list rdonlp2 Synonyme name for Rdonlp2::donlp2 function mathprogNLP-nlminb2.R rnlminb2NLP Rmetrics Interface for NLMINB2 LP solvers nlminb2NLP Convenience wrapper for NLMINB2 LP solvers nlminb2Control NLMINB2 LP control parameter list rnlminb2 Synonyme name for Rdonlp2::nlminb2 function mathprogNLP-solnp.R rsolnpNLP Rmetrics Interface for SOLNP LP solvers solnpNLP Convenience wrapper for SOLNP LP solvers solnpNLPControl SOLNP LP control parameter list rsolnp Synonyme name for Rsolnp::solnp function ----------------------------------------------------------------------------------------- mathprogQP.R rsolveQP General Interface for QP solvers .solveQP.MV.demo Mean-Variance portfolio demo example mathprogQP-ampl.R ramplQP Rmetrics Interface for AMPL QP solvers amplQP Convenience wrapper for AMPL QP solvers amplQPControl AMPL QP control parameter list mathprogQP-ipop.R ripopQP Rmetrics Interface for LOQO QP solver ipopQP Convenience wrapper for LOQO QP solver ipopQPControl LOQO QP control parameter list ripop Synonyme name for kernlab::ipop function mathprogQP-kestrel.R rkestrelQP Rmetrics Interface for AMPL/KESTREL QP solvers kestrelQP Convenience wrapper for AMPL/KESTREL QP solvers kestrelQPControl KESTREL QP control parameter list mathprogQP-neos.R rneosQP Rmetrics Interface for AMPL/NEOS QP solvers neosQP Convenience wrapper for AMPL/NEOS QP solvers neosQPControl NEOS QP control parameter list mathprogQP-quadprog.R rquadprogQP Rmetrics Interface for QUADPROG QP solvers quadprogQP Convenience wrapper for QUADPROG QP solvers quadprogQPControl QUADPROG QP control parameter list rquadprog Synonyme name for quadprog::solveLP function ---------------------------------------------------------------------------------------- methods-mathprog.R print.solver Solver method methods-plot.R plot.fPORTFOLIO S3 Plot method for 'fPORTFOLIO' objects .fPortfolio.plot1..8 Internal plot functions methods-show.R show.fPORTFOLIO S4 Print method for 'fPPORTFOLIO' objects show.fPFOLIODATA S4 Print method for 'fPFOLIODATA' objects show.fPFOLIOSPEC S4 Print method for 'fPFOLIOSPEC' objects show.fPFOLIOCON S4 Print method for 'fPFOLIOCON' objects methods-summary.R summary.fPORTFOLIO S3 Summary method for 'fPORTFOLIO' objects ----------------------------------------------------------------------------------------- object-getData.R getData Extracts data slot getSeries Extracts assets series data getNAssets Extracts number of assets from data getNames Extracts assets names from data getStatistics Extracts statistics slot getMean Extracs mean from statistics getCov Extracs covariance Sigma from statistics getMu Extracs mu from statistics getSigma Extracs Sigma from statistics getEstimator Extracts estimator from statistics getTailRisk Extracts tailRisk slot object-getPortfolio.R getData Extracts data slot getSeries Extracts assets series data getNAssets Extracts number of assets from data getNames Extracts assets names from data getStatistics Extracts statistics slot getMean Extracs 'mean' from statistics getCov Extracs covariance 'Sigma' from statistics getMu Extracs mu from statistics getSigma Extracs Sigma from statistics getEstimator Extracts estimator from getTailRisk Extracts 'tailRisk' slot getSpec Extracs specification slot getType Extracts type of portfolio getOptimize Extracts what to optimize of portfolio getEstimator Extracts mean-covariance estimator getParams Extracts optional parameter list getAlpha Extracts target VaR-alpha specification getA Extracts quadratic LPM exponent specification getPortfolio Extract portfolio slot getWeights Extracts weights from a portfolio object getTargetReturn Extracts target return from specification getTargetRisk Extracts target riks from specification getRiskFreeRate Extracts risk free rate from specification getNFrontierPoints Extracts number of frontier points getStatus Extracts portfolio status information getOptim Extract optim slot getSolver Extracts solver from specification getObjective Extracts objective getOptions Extracts optimization options getControl Extracts solver control options getTrace Extracts solver's trace flag getConstraints Extracts weight constraints getCovRiskBudgets Extracts covariance risk budgets getTailRiskBudgets Extracts tail risk budgets object-getPortfolioVal.R getPortfolio Extracts portfolio from value object getWeights Extracts weights from value object getCovRiskBudgets Extracts covarisnce risk budgets value getTargetReturn Extracts target return from value object getTargetRisk Extracts target risk from value object getAlpha Extracts CVaR alpha from value object getRiskFreeRate Extracts risk free rate from value object getNFrontierPoints Extracts number of frontier points value getStatus Extracts status from value object object-getSpec.R getModel Extract whole model slot getType Extract portfolio type from specification getOptimize Extract what to optimize from specification getEstimator Extract type of covariance estimator getTailRisk Extract list of tail dependency risk matrixes getParams Extract parameters from specification getAlpha Extracts target VaR-alpha specification getA Extracts quadratic LPM Exponent getPortfolio Extract whole portfolio slot getWeights Extracts weights from a portfolio object getTargetReturn Extracts target return from specification getTargetRisk Extracts target riks from specification getRiskFreeRate Extracts risk free rate from specification getNFrontierPoints Extracts number of frontier points getStatus Extracts portfolio status information getOptim Extract whole optim slot getSolver Extracts solver from specification getObjective Extracs name of objective function getOptions Extracs options getControl Extracs control list parameters getTrace Extracts solver's trace flag getMessages Extract whole messages slot object-getUseMethods.R getA Defines Use Method for A getAlpha Defines Use Method for Alpha getConstraints Defines Use Method for Constraints getControl Defines Use Method for Control getCov Defines Use Method for Cov getCovRiskBudgets Defines Use Method for CovRiskBudgets getData Defines Use Method for Data getEstimator Defines Use Method for Estimator getMean Defines Use Method for Mean getMu Defines Use Method for Mu getNAssets Defines Use Method for NAssets getNames Defines Use Method for Names getNFrontierPoints Defines Use Method for NFrontierPoints getMessages Defines Use Method for Messages getObjective Defines Use Method for Objective getOptim Defines Use Method for Optim getOptimize Defines Use Method for Optimize getOptions Defines Use Method for Options getPortfolio Defines Use Method for Portfolio getParams Defines Use Method for Params getRiskFreeRates Defines Use Method for RiskFreeRates getSeries Defines Use Method for Series getSigma Defines Use Method for Sigma getSolver Defines Use Method for Solver getSpec Defines Use Method for Spec getStatistics Defines Use Method for Statistics getStatus Defines Use Method for Status getTailRisk Defines Use Method for TailRisk getTailRiskBudgets Defines Use Method for TailRiskBudgets getTargetReturn Defines Use Method for TargetReturn getTargetRisk Defines Use Method for TargetRisk getTrace Defines Use Method for Trace getType Defines Use Method for Type getWeights Defines Use Method for Weights object-portfolioCons.R portfolioConstraints Returns an object of class fPFOLIOCON minWConstraints Returns vector with min box constraints maxWConstraints Returns vector with max box constraints eqsumWConstraints Returns list with group equal vec/matrix constraints minsumWConstraints Returns list with group min vec/matrix constraints maxsumWConstraints Returns list with group max vec/matrix constraints minBConstraints Returns vector with min cov risk budget constraints maxBConstraints Returns vector with max cov risk budget constraints minFConstraints Returns vector with min nonlin functions constraints maxFConstraints Returns vector with max nonlin functions constraints nCardConstraints Returns number of Cardinalities minCardConstraints Returns lower bound of Cardinalities maxCardConstraints Returns upper bound of Cardinalities object-portfolioData.R portfolioData Returns an object of class fPFOLIODATA object-portfolioSpec.R portfolioSpec Returns an object of class fPFOLIOSPEC .checkWeights Checks and forces tiny weights to zero .checkSpecVsConstraints Checks if spec and constraints do match .checkTargetReturn Checks if target Return is defined object-setSpec.R setType<- Sets type of portfolio optimization setOptimize<- Sets what to optimze, minRisk or maxRetururn setEstimator<- Sets name of mean-covariance estimator setTailRisk<- Sets tail dependency matrix setParams<- Sets optional model parameters setWeights<- Sets weights vector setTargetReturn<- Sets target return value setTargetRisk<- Sets target return value setRiskFreeRate<- Sets risk-free rate value setNFrontierPoints<- Sets number of frontier points setStatus<- Sets portfolio status information setSolver<- Sets name of desired solver setObjective<- Sets objective function name setTrace<- Sets solver's trace flag ----------------------------------------------------------------------------------------- plot-binning.R assetsHistPairsPlot Displays a bivariate histogram plot plot-boxplot.R assetsBoxPlot Displays a standard box plot assetsBoxPercentilePlot Displays a side-by-side box-percentile plot plot-dateLines.R [ Should go to 'timeSeries package' ? ] annualLines Displays vertical annual lines recessionLines Displays vertical US recession lines recessionPolygons Displays US recession polygons plot.ellipses.R covEllipsesPlot Displays a covariance ellipses plot plot-hist.R assetsHistPlot Displays histograms of a single asset assetsLogDensityPlot Displays pdf plot on logarithmic scale plot-mst.R assetsTreePlot Displays a minimum spanning tree of assets plot-pairs.R assetsPairsPlot Displays pairs of scatterplots of assets assetsCorgramPlot Displays pairwise correlations between assets assetsCorTestPlot Displays and tests pairwise correlations assetsCorImagePlot Displays an image plot of a correlations plot-panels.R .txtPanel Creates a diagonal text panel .minmaxPanel Creates a diagonal minmax text panel .histPanel Creates a diagonal histogram panel .ptsPanel Creates an off-diagonal points panel .piePanel Creates an off-diagonal pie panel .piePtsPanel Creates an off-diagonal pie/points panel .shadePanel Creates an off-diagonal shade panel .ellipsePanel Creates an off-diagonal ellipse panel .cortestPanel Creates an off-diagonal cortest panel .lowessPanel Creates an off-diagonal lowess panel .numberPanel Creates an off-diagonal lowess panel plot-qqplot.R assetsQQNormPlot Displays normal qq-plots of individual assets assetsHistPairsPlot Displays bivariate Histogram Plot plot-risk.R assetsRiskReturnPlot Displays risk-return diagram of assets assetsNIGShapeTrianglePlot Displays NIG Shape Triangle plot-series.R assetsReturnPlot Displays time series of individual assets assetsCumulatedPlot Displays time series of individual assets assetsSeriesPlot Displays time series of individual assets plot-similarity.R assetsDendrogramPlot Displays hierarchical clustering dendrogram assetsCorEigenPlot Displays ratio of the largest two eigenvalues plot-stars.R assetsStarsPlot Displays segment/star diagrams of a multivariate data assetsBasicStatsPlot Displays a segment plot of basic return statistics assetsMomentsPlot Displays a segment plot of distribution moments assetsBoxStatsPlot Displays a segment plot of box plot statistics assetsNIGFitPlot Displays a segment plot NIG parameter estimates plot-vaniniFig.R vaniniFig Creates Vinini's Figure in Portfolio eBook plot-weights.R weightsPlot Plots staggered weights along the frontier weightedReturnsPlot Plots staggered weighted returns covRiskBudgetsPlot Plots covariance risk budgets tailRiskBudgetsPlot Plots copulae tail risk budgets plot-weightsLines.R weightsLinePlot Plots staggered weights weightedReturnsLinePlot Plots staggered weighted returns covRiskBudgetsLinePlot Plots covariance risk budgets NYI tailRiskBudgetsLinePlot Plots copulae tail risk budgets plot-weightsPie.R weightsPie Plots a pie of portfolio weights weightedReturnsPie Plots a pie of weighted means covRiskBudgetsPie Plots a pie of covariance risk budgets tailRiskBudgetsPie Plots a pie of copulae tail risk budgets plot-weightsSlider.R weightsSlider Graphical Weights Slider .counterWeightsSlider ----------------------------------------------------------------------------------------- portfolio-efficientFrontier.R portfolioFrontier Returns the efficient frontier of a portfolio .portfolioFrontier Uses old/alternative Version portfolio-efficientPfolio.R efficientPortfolio Returns a frontier portfolio maxratioPortfolio Returns the max return/risk ratio portfolio tangencyPortfolio Returns the tangency portfolio minriskPortfolio Returns the minimum risk portfolio minvariancePortfolio Returns the minimum variance portfolio maxreturnPortfolio Returns the maximum return portfolio portfolio-feasiblePfolio.R feasiblePortfolio Returns a feasible portfolio portfolio-Rolling.R rollingWindows Returns a list of rolling window frames rollingCmlPortfolio Rolls a CML portfolio rollingTangencyPortfolio Rolls a tangency portfolio rollingMinvariancePortfolio Rolls a minimum risk portfolio rollingPortfolioFrontier Rolls a portfolio frontier ----------------------------------------------------------------------------------------- risk-convexHull.R Data Defines Global Portfolio Data Object portfolioObjective Defines lobal Portfolio Objective Function portfolioReturn Defines lobal Portfolio Return Function portfolioRisk Defines lobal Portfolio Risk Function .convexHull Returns the convex Hull of the feasible set .convexHullDemo Demonstration Function portfolio-covEstimator.R covEstimator Uses sample covariance estimation mveEstimator Uses robust estimation "cov.mve" from [MASS] mcdEstimator Uses robust estimation "cov.mcd" from [MASS] lpmEstimator Returns Lower Partial Moment Estimator slpmEstimator Returns Symmetric Lower Partial Moment Estimator kendallEstimator Returns Kendall's Covariance Estimator spearmanEstimator Returns Spearman's Covariance Estimator covMcdEstimator Requires "covMcd" from [robustbase] covOGKEstimator Requires "covOGK" from [robustbase] shrinkEstimator Requires "cov.shrink" from [corpcor] nnveEstimator Requires "cov.nnve" from [covRobust] .studentEstimator Uses "cov.trob" from [MASS] .baggedEstimator Uses builtin from [corpcor] .donostahEstimator Uses builtin from [robust] .bayesSteinEstimator Borrowed from Alexios Ghalanos .ledoitWolfEstimator Uses builtin from [tawny] .rmtEstimator Uses builtin from [tawny] .mveEstimator2 Uses robust estimation "cov.mve" from [MASS] .mcdEstimator2 Uses robust estimation "cov.mcd" from [MASS] .covMcdEstimator2 Requires "covMcd" from [robustbase] .covOGKEstimator2 Requires "covOGK" from [robustbase] .arwEstimator2 Uses robust estimation ".cov.arw"from [mvoutlier] risk-marginalRisk.R covarRisk Computes covariance portfolio risk mcr Computes marginal contribution to covariance risk mcrBeta Computes beta, the rescaled mcr to covariance risk riskContributions Computes covariance risk contributions riskBudgets Computes covariance risk budgets risk-pfolioMeasures.R covRisk Computes covariance risk as standard deviation varRisk Computes Value at Risk cvarRisk Computes Conditional Value at Risk .covRisk Computes Covariance Risk .varRisk Computes Value at Risk .cvarRisk Computes Conditional Value at Risk .cfgFit Fits bivariate tail dependency parameter lambda .lambdaTailRisk Fits tail lambda for multivariate data risk-stabilityAnalytics.R .parAnalytics Graph frame settings for a desired analytics .emaIndicator Exponential moving average indicator .macdIndicator MACD indicator .drawdownsIndicator Maximum drawdowns indicator .rebalancingStats Rebalancing statistics .turnsAnalytics Retroactive turning point analytics .drawdownsAnalytics Retroactive maximum drawdown analytics .garchAnalytics Retroactive Garch volatility analytics .riskmetricsAnalytics Retroactive Riskmetrics analytics .bcpAnalytics Retroactive Bayesian changepoints analytics .bcpprobAnalytics Retroactive Bayesian changepoints analytics .waveletAnalytics Retroactive Morlet wavelet analytics .pcoutAnalytics Retroactive Principal component outlier analytics risk-tailBudgets.R tailDependenceCoeffs Returns Lower and Upper Tail Dependence Coeff .rgsgnormCopula Generates G-SG-NORM copula random variates .dgsgnormCopula Computes G-SG-NORM copula density .gsgnormCopulaFit Estimates the parameters of the G-SG-NORM copula .cfgTDE Estimates non-parametrically tail dependence .empiricalDependencyFit Estimates tail dependence with empirical marginals .normDependencyFit Estimates tail dependence with normal marginals .nigDependencyFit Estimates tail dependence with NIG marginals .ghtDependencyFit Estimates tail dependence with GHT marginals risk-ternaryMap.R .ternaryMap Plots a ternary risk map .levelplot.ternary Underlying plot function .ternaryMap.demo Demonstration example ----------------------------------------------------------------------------------------- solve-Rampl.R solveRdemoAMPL Demo AMPL solver function for a MV Long Only Portfolio solve-Rdonlp2.R demoModelAMPL Creates AMPL model file for a MV Long Only Portfolio demoDataAMPL Creates AMPL data file for a MV Long Only Portfolio demoRunAMPL Creates AMPL run file for a MV Long Only Portfolio solve-RamplCVaR.R solveRamplCVAR1 Demo AMPL solver function for a CVAR Portfolio solve-Rdonlp2.R solveRdonlp2 Portfolio interface to solver Rdonlp2 .rdonlp2Arguments Returns arguments for solver .rdonlp2 Wrapper to solver function .rdonlp2Control Returns default controls for solver solve-Rglpk.R solveRglpk Portfolio interface to solver Rglpk .rglpkArguments Returns arguments for solver .cvarRglpkArguments Returns CVaR arguments for solver .madRglpkArguments Returns MAD arguments for solver .rglpk Wrapper to solver function .rglpkControl Returns default controls for solver solve-RglpkCVaR.R solveRglpkCVAR Demo GLPK solver function for a CVAR Portfolio solve-Ripop.R solveRipop Portfolio interface to solver Ripop .ripopArguments Returns arguments for solver .ripopControl Returns default controls for solver solve-Rquadprog.R solveRquadprog Portfolio interface to solver Rquadprog .rquadprog Wrapper to solver function .rquadprogArguments Returns arguments for solver .rquadprogControl Returns default controls for solver solve-Rquadprog2.R solveRquadprog2 Portfolio interface to solver Rquadpro .rquadprog2Arguments Returns arguments for solver .rquadprog2CLAControl Returns default controls for solver solve-RquadprogCLA.R solveRquadprogCLA Portfolio interface to solver Rquadprog .rquadprogCLA Wrapper to solver function .rquadprogCLAArguments Returns arguments for solver .rquadprogCLAControl Returns default controls for solver solve-RshortExact.R solveRshortExact Portfolio interface to solver RshortExact .rshortExact Wrapper to solver function .rshortExactArguments Returns arguments for solver .rshortExactControl Returns default controls for solver solve-Rsocp.R solveRsocp Portfolio interface to solver Rsocp .rsocp Wrapper to solver function .rsocpArguments Returns arguments for solver .rsocpControl Returns default controls for solver solve-Rsolnp.R solveRsolnp Portfolio interface to solver Rsolnp .rsolnp Wrapper to solver function .rsolnpArguments Returns arguments for solver .rsolnpControl Returns default controls for solver solve-TwoAssets.R .mvSolveTwoAssets Two Assets LongOnly MV Portfolio .cvarSolveTwoAssets Two Assets LongOnly CVaR Portfolio .madSolveTwoAssets Two Assets LongOnly MAD Portfolio ----------------------------------------------------------------------------------------- utils-amplExec.R .amplExec Executes AMPL run file for a given project .amplExample Optimizes mean variance portfolio example utils-amplExtractors.R .amplObjval Extracts objective function value .amplSolution Extracts solution vector .amplModel Extracts model file information .amplRun Extracts model file information .amplSolver Extracts solver name .amplVersion Extracts version number .amplPresolve Extracts presolve information utils-amplInterface.R amplModelOpen Opens a writes to an AMPL model file amplModelAdd Adds model specs to an existing AMPL model fil amplModelShow Shows the content of an AMPL .mod file amplDataOpen Opens and writes the header to an AMPL data fi amplDataAddValue Adds a numeric value to an AMPL data file amplDataAddVector Adds a numeric vector to an AMPL data file amplDataAddMatrix Adds a numeric matrix to an AMPL data file amplDataSemicolon Adds a semicolon on the end of a data input l amplDataShow Shows the content of an AMPL data file amplRunOpen Opens a run file amplRunAdd Adds run specs to an existing AMPL run file amplRunShow Shows the content of an AMPL run file amplOutShow Shows the content of an AMPL output txt file utils-amplLibrary.R .lpAssign Assigns linear programming model .qpAssign Assigns quadratic programming model utils-exampleData.R .exampleData Portfolio data, spec, and constraints examples utils-methods.R print.solver Prints results returned from solver functions .summary.solver summarizes results from solver functions utils-NLPgeneral.R .*TestNLP NLP test functions from package Rsolnp utils-specs.R ----------------------------------------------------------------------------------------- zzz.Deprecated.R zzz.R ----------------------------------------------------------------------------------------- fPortfolio/inst/LICENSE_SOCP0000644000176200001440000000127512323217772015216 0ustar liggesusers--- This is the beta version of SOCP --- COPYRIGHT (c) 1997 Miguel Sousa Lobo, Lieven Vandenberge, Stephen Boyd, Herve Lebret. Permission to use, copy, modify, and distribute this software for any purpose without fee is hereby granted, provided that this entire notice is included in all copies of any software which is or includes a copy or modification of this software and in all copies of the supporting documentation for such software. This software is being provided "as is", without any express or implied warranty. In particular, the authors do not make any representation or warranty of any kind concerning the merchantability of this software or its fitness for any particular purpose.fPortfolio/inst/LICENSE_AMPL0000644000176200001440000000000012323217772015164 0ustar liggesusersfPortfolio/inst/LICENSE_SOLNP0000644000176200001440000000237012323217772015342 0ustar liggesusersFrom: Yinyu Ye [yinyu-ye AT stanford.edu] Sent: Wednesday, May 20, 2009 3:10 PM To: Ghalanos, Alexios Cc: Veinott Jr. Veinott; Yinyu Ye Subject: Re: solnp This is fine to me. Regards, Yinyu At 01:51 AM 5/20/2009, Ghalanos, Alexios wrote: > Dear Professor Ye, > > We would like to obtain your permission, if possible, to release > under the GPL license our translation of your solnp solver into R > (www.r-project.org). > We have found it to be quite robust in financial optimization and > time series likelihood problems, and given that R does not benefit > from a general > non linear solver we would like to release a package based on solnp. > We have already translated the routines into R and we would also be looking to > possibly translate them into C as well for greater speed (interfaced via R). > > The R community is made up of diverse researchers across many > disciplines from around the world and depends on the contribution of others to > enable open source research in science and academia. > > We greatly appreciate you consideration of this request. > > With kind regards, > > Alexios Ghalanos > for the > Integer and Nonlinear Optimization in R (RINO) project > https://r-forge.r-project.org/projects/rino/fPortfolio/inst/LICENSE_GLPK0000644000176200001440000000300512323217772015200 0ustar liggesusers Olga K. gewidmet GLPK (GNU Linear Programming Kit) Version 4.42 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Andrew Makhorin, Department for Applied Informatics, Moscow Aviation Institute, Moscow, Russia. All rights reserved. E-mail: . GLPK is part of the GNU Project released under the aegis of GNU. GLPK 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 3 of the License, or (at your option) any later version. See the file COPYING for the GNU General Public License. See the file INSTALL for compilation and installation instructions. The GLPK package is a set of routines written in ANSI C and organized in the form of a callable library. This package is intended for solving large-scale linear programming (LP), mixed integer linear programming (MIP), and other related problems. The GLPK package includes the following main components: * implementation of the simplex method; * implementation of the exact simplex method based on bignum (rational) arithmetic; * implementation of the primal-dual interior-point method; * implementation of the branch-and-cut method; * application program interface (API); * GNU MathProg modeling language (a subset of AMPL); * GLPSOL, a stand-alone LP/MIP solver. See GLPK webpage . Please report bugs to . fPortfolio/inst/LICENSE_QUADPROG0000644000176200001440000000144712323217772015675 0ustar liggesusersc c Copyright (C) 1995 Berwin A. Turlach c c This program is free software; you can redistribute it and/or modify c it under the terms of the GNU General Public License as published by c the Free Software Foundation; either version 2 of the License, or c (at your option) any later version. c c This program is distributed in the hope that it will be useful, c but WITHOUT ANY WARRANTY; without even the implied warranty of c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the c GNU General Public License for more details. c c You should have received a copy of the GNU General Public License c along with this program; if not, write to the Free Software c Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, c USA. fPortfolio/inst/obsolete/0000755000176200001440000000000013201353172015163 5ustar liggesusersfPortfolio/inst/obsolete/zzz.Deprecated.R0000644000176200001440000006701612323217772020225 0ustar liggesusers # 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: # .mvnormFit Fits a multivariate Normal distribution # .mvsnormFit Fits a multivariate skew-Normal distribution # .mvstFit Fits a multivariate skew-Student-t distribution # FUNCTION: DESCRIPTION: # .assetsStats Computes statistics of monthly assets sets # FUNCTION: DESCRIPTION: # .dutchPortfolioData Example Data from Engel's Diploma Thesis # .usPortfolioData Annual US Economics Portfolio Data # .sm132PortfolioData Example from Scherer, Martin: Chapter 1.32 # .worldIndexData A data set of World Indexes # FUNCTION: DESCRIPTION: # fixBinHistogram Returns histogram with fixed bins ################################################################################ .mvnormFit <- function(x, title=NULL, description=NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Fits a multivariate Normal distribution # Arguments: # x - A multivariate time series, a data frame, or any other # rectangular object of assets which can be converted into # a matrix by the function as.matrix. Optional Dates are # rownames, instrument names are column names. # Value: # The function returns a list with the following entries: # mu - Mean values of each asset time series # Omega - Covariance matrix of assets # Notes: # Requires function "msn.mle" ans "mst.mle" from R's GPL licensed # contributed package "sn", (C) 1998-2004 A. Azzalini. # The list returned by this function can serve as input for the # function assetsSim(). # FUNCTION: # Settings: assets = as.matrix(x) method = method[1] colNames = colnames(x) # Fit mvNormal: fit = list() mu = apply(assets, 2, mean) Omega = cov(assets) alpha = rep(0, times = length(mu)) df = Inf # Add Names: names(mu) = colNames names(alpha) = colNames rownames(Omega) = colNames colnames(Omega) = colNames # Add Title: if (is.null(title)) title = paste("Fitted Asset Data Model: ", method) # Add Description: if (is.null(description)) description = description() # Return Value: new("fASSETS", call = as.call(match.call()), method = as.character(method), model = list(mu = mu, Omega = Omega, alpha = alpha, df = df), data = as.data.frame(x), fit = as.list(fit), title = as.character(title), description = as.character(description) ) } # ------------------------------------------------------------------------------ .mvsnormFit <- function(x, title=NULL, description=NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Fits a multivariate skew-Normal distribution # Arguments: # x - A multivariate time series, a data frame, or any other # rectangular object of assets which can be converted into # a matrix by the function as.matrix. Optional Dates are # rownames, instrument names are column names. # Value: # The function returns a list with the following entries: # mu - Mean values of each asset time series # Omega - Covariance matrix of assets # alpha - Skewness vector # Notes: # Requires function "msn.mle" ans "mst.mle" from R's GPL licensed # contributed package "sn", (C) 1998-2004 A. Azzalini. # The list returned by this function can serve as input for the # function assetsSim(). # FUNCTION: # Settings: assets = as.matrix(x) method = method[1] colNames = colnames(x) # Fit skew-Normal: fit = mvFit(assets, method = "snorm", ...) mu = as.vector(fit@fit$dp$beta) Omega = fit@fit$dp$Omega alpha = as.vector(fit@fit$dp$alpha) df = Inf fit = fit@fit # Add Names: names(mu) = colNames names(alpha) = colNames rownames(Omega) = colNames colnames(Omega) = colNames # Add Title: if (is.null(title)) title = paste("Fitted Asset Data Model: ", method) # Add Description: if (is.null(description)) description = description() # Return Value: new("fASSETS", call = as.call(match.call()), method = as.character(method), model = list(mu = mu, Omega = Omega, alpha = alpha, df = df), data = as.data.frame(x), fit = as.list(fit), title = as.character(title), description = as.character(description) ) } # ------------------------------------------------------------------------------ .mvstFit <- function(x, title = NULL, description=NULL, fixed.df=NA, ...) { # A function implemented by Diethelm Wuertz # Description: # Fits a multivariate skew-Student-t distribution # Arguments: # x - A multivariate time series, a data frame, or any other # rectangular object of assets which can be converted into # a matrix by the function as.matrix. Optional Dates are # rownames, instrument names are column names. # Value: # The function returns a list with the following entries: # mu - Mean values of each asset time series # Omega - Covariance matrix of assets # alpha - Skewness vector # df - Degrees of freedom, measures kurtosis # Notes: # Requires function "msn.mle" ans "mst.mle" from R's GPL licensed # contributed package "sn", (C) 1998-2004 A. Azzalini. # The list returned by this function can serve as input for the # function assetsSim(). # FUNCTION: # Settings: assets = as.matrix(x) method = method[1] colNames = colnames(x) # Fit skew-Student: fit = mvFit(assets, method = "st", fixed.df = fixed.df, ...) mu = as.vector(fit@fit$beta) Omega = fit@fit$dp$Omega alpha = as.vector(fit@fit$dp$alpha) df = fit@fit$dp$df fit = fit@fit # Add Names: names(mu) = colNames names(alpha) = colNames rownames(Omega) = colNames colnames(Omega) = colNames # Add Title: if (is.null(title)) title = paste("Fitted Asset Data Model: ", method) # Add Description: if (is.null(description)) description = description() # Return Value: new("fASSETS", call = as.call(match.call()), method = as.character(method), model = list(mu = mu, Omega = Omega, alpha = alpha, df = df), data = as.data.frame(x), fit = as.list(fit), title = as.character(title), description = as.character(description) ) } ################################################################################ .hclustSelect <- function(x, control = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Hierarchical Clustering # FUNCTION: # Method: if (is.null(control)) control = c(measure = "euclidean", method = "complete") measure = control[1] method = control[2] # hclust: ans = hclust(dist(t(x), method = measure), method = method, ...) class(ans) = c("list", "hclust") # Return Value: ans } # ----------------------------------------------------------------------------- .kmeansSelect <- function(x, control = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # kmeans Clustering # Note: # centers must be specified by the user! # FUNCTION: # Method: if (is.null(control)) control = c(centers = 5, algorithm = "Hartigan-Wong") centers = as.integer(control[1]) algorithm = control[2] # kmeans: ans = kmeans(x = t(x), centers = centers, algorithm = algorithm, ...) class(ans) = c("list", "kmeans") # Return Value: ans } ################################################################################ .assetsStats <- function(x) { # A function implemented by Diethelm Wuertz # Description: # Computes benchmark statistics for a data set of assets with # monthly data records. # Details: # The computed statistics values are: # records - number of records (length of time series) # paMean - annualized (pa, per annum) Mean of Returns # paAve - annualized Average of Returns # paVola - annualized Volatility (standard Deviation) # paSkew - Skewness of Returns # paKurt - Kurtosis of Returns # maxDD - maximum Drawdown # TUW - Time under Water # mMaxLoss - Monthly maximum Loss # mVaR - Monthly 99% Value-at-Risk # mModVaR - Monthly 99% Modified Value-at-Risk # mSharpe - Monthly Sharpe Ratio # mModSharpe - Monthly Modified Sharpe Ratio # skPrice - Skewness/Kurtosis Price # The statistics are implemented based on the formulas from # "Extreme Metrics". They reflect risk measures as used in # the hedge fund software from "www.AlternativeSoft.com". # Arguments: # x - asset data set, a matrix (or vector) where the rows # are numbered by "time", and the columns belong to the # individual assets. Monthly values are expected. # Value: # The function returns a data frame with the values of the # 12 statistics for each asset. # Reference: # "ExtremeMetrics Software", Help Document, Alternative Software, # March 2003, 4 pages. # Example: # FUNCTION: # If x is a vector, make it a matrix: statistics = 14 if (is.null(dim(x))) { n = 1 x = matrix(x, length(x)) result = matrix(rep(0, times = statistics), ncol = 1) } else { n = dim(x)[2] result = matrix(rep(0, times = statistics*n), ncol = n) } # Give Names to Result Matrix: stat.names = c( "Records", "paMean", "paAve", "paVola", "paSkew", "paKurt", "maxDD", "TUW", "mMaxLoss", "mVaR", "mModVaR", "mSharpe", "mModSharpe", "skPrice") dimnames(result) = list(stat.names, dimnames(x)[[2]]) # Loop over all Assets: for (i in 1:n) { r = x[, i] # Number of Records: result[1, i] = length(r) # Annualized mean from monthly returns: result[2, i] = annualizedMean = (1 + mean(r))^12 - 1 # Annualized mean from monthly returns: result[3, i] = annualizedAverage = mean(r)*sqrt(12) # Annualized volatility from monthly returns: result[4, i] = annualizedVolatility = sqrt(var(r)) # Annualized skewness from monthly returns: result[5, i] = annualizedSkewness = skewness(r) # Annualized Kurtosis from monthly returns: result[6, i] = annualizedKurtosis = kurtosis(r) # Maximum Drawdown of of monthly returns: result[7, i] = maxDrawdown = max(cummax(cumsum(r)) - cumsum(r)) # Time-Under-Water of monthly returns: result[8, i] = timeUnderWater = max(diff(which (diff(cummax(cumsum(r))) != 0))) # Maximum Loss of monthly returns: result[9, i] = maxMonthlyLoss = min(r) # Monthly Value at Risk: zc = 2.33 result[10, i] = monthlyVaR = annualizedMean - zc * annualizedVolatility # Monthly Modified Value at Risk: p = 0.99; s = annualizedSkewness; k = annualizedKurtosis zcf = zc + (zc*zc-1)*s/6 + zc*(zc*zc-3)*k/24 + zc*(2*zc*zc-5)*s*s/36 result[11, i] = monthlyModVaR = annualizedMean - zcf * annualizedVolatility # Monthly Sharpe Ratio: result[12, i] = monthlySharpeRatio = annualizedMean/annualizedVolatility # Monthly Modified Sharpe Ratio: result[13, i] = monthlyModSharpeRatio = annualizedMean/monthlyModVaR # Skewness Kurtosis Price: result[14, i] = skewnesskurtosisPrice = annualizedMean * ( monthlyModVaR/monthlyVaR - 1) } # Result: ans = as.data.frame(round(result, digits = 3)) # Return Value: ans } ################################################################################ .dutchPortfolioData = function() { # A function implemented by Rmetrics # Description: # Example Portfolio Data from Engels # Example: # engelsPortfolioData() # FUNCTION: # Mean Returns: mu = c(0.266, 0.274, 0.162, 0.519, 0.394, 0.231, 0.277) / 1000 names(mu) = c( "Elsevier", "Fortis", "Getronics", "Heineken", "Philips", "RoyalDutch", "Unilever") # Variance-Covariance Risk: Sigma = c( 0.345, 0.150, 0.183, 0.088, 0.186, 0.090, 0.095, 0.150, 0.399, 0.204, 0.107, 0.236, 0.130, 0.127, 0.183, 0.204, 1.754, 0.075, 0.325, 0.110, 0.091, 0.088, 0.107, 0.075, 0.243, 0.096, 0.064, 0.086, 0.186, 0.236, 0.325, 0.096, 0.734, 0.147, 0.114, 0.090, 0.130, 0.110, 0.064, 0.147, 0.221, 0.093, 0.095, 0.127, 0.091, 0.086, 0.114, 0.093, 0.219) Sigma = matrix(Sigma, ncol = 7) colnames(Sigma) = rownames(Sigma) = names(mu) # Return Value: list(mu = mu, Sigma = Sigma) } # ------------------------------------------------------------------------------ .usPortfolioData = function() { # A function implemented by Rmetrics # Description: # Annual US Economics Portfolio Data # Example: # usPortfolioData() # list(mu = round(mean(usPortfolioData()),5), # Sigma = round(var(usPortfolioData()), 5)) # FUNCTION: # Units: Units = c("TBills3m", "LongBonds", "SP500", "Wilshire5000", "NASDAQComp", "LehmanBonds", "EAFE", "Gold") # Time Series Object: tS = as.timeSeries(as.data.frame(matrix(c( 19731231,1.075,0.942,0.852,0.815,0.698,1.023,0.851,1.677, 19741231,1.084,1.020,0.735,0.716,0.662,1.002,0.768,1.722, 19751231,1.061,1.056,1.371,1.385,1.318,1.123,1.354,0.760, 19761231,1.052,1.175,1.236,1.266,1.280,1.156,1.025,0.960, 19771231,1.055,1.002,0.926,0.974,1.093,1.030,1.181,1.200, 19781231,1.077,0.982,1.064,1.093,1.146,1.012,1.326,1.295, 19791231,1.109,0.978,1.184,1.256,1.307,1.023,1.048,2.212, 19801231,1.127,0.947,1.323,1.337,1.367,1.031,1.226,1.296, 19811231,1.156,1.003,0.949,0.963,0.990,1.073,0.977,0.688, 19821231,1.117,1.465,1.215,1.187,1.213,1.311,0.981,1.084, 19831231,1.092,0.985,1.224,1.235,1.217,1.080,1.237,0.872, 19841231,1.103,1.159,1.061,1.030,0.903,1.150,1.074,0.825, 19851231,1.080,1.366,1.316,1.326,1.333,1.213,1.562,1.006, 19861231,1.063,1.309,1.186,1.161,1.086,1.156,1.694,1.216, 19871231,1.061,0.925,1.052,1.023,0.959,1.023,1.246,1.244, 19881231,1.071,1.086,1.165,1.179,1.165,1.076,1.283,0.861, 19891231,1.087,1.212,1.316,1.292,1.204,1.142,1.105,0.977, 19901231,1.080,1.054,0.968,0.938,0.830,1.083,0.766,0.922, 19911231,1.057,1.193,1.304,1.342,1.594,1.161,1.121,0.958, 19921231,1.036,1.079,1.076,1.090,1.174,1.076,0.878,0.926, 19931231,1.031,1.217,1.100,1.113,1.162,1.110,1.326,1.146, 19941231,1.045,0.889,1.012,0.999,0.968,0.965,1.078,0.990), byrow = TRUE, ncol = 9))) colnames(tS)<-Units # Return Value: tS } # ------------------------------------------------------------------------------ .sm132PortfolioData = function() { # A function implemented by Rmetrics # Description: # Example from Scherer, Martin: "Modern Portfolio Omtimization": # Cheapter 1.32 # FUNCTION: corr = matrix(data = c( 1, 0.4, 0.5, 0.5, 0.4, 0.1, 0.1, 0.1, 0.4, 1.0, 0.3, 0.3, 0.1, 0.4, 0.1, 0.1, 0.5, 0.3, 1.0, 0.7, 0.1, 0.1, 0.5, 0.1, 0.5, 0.3, 0.7, 1.0, 0.1, 0.1, 0.1, 0.5, 0.4, 0.1, 0.1, 0.1, 1.0, 0.0, 0.0, 0.0, 0.1, 0.4, 0.1, 0.1, 0.0, 1.0, 0.0, 0.0, 0.1, 0.1, 0.5, 0.1, 0.0, 0.0, 1.0, 0.2, 0.1, 0.1, 0.1, 0.5, 0.0, 0.0, 0.2, 1.0), nrow = 8, ncol = 8) vol = diag(c(17, 21, 22, 20, 8, 8, 8, 8)) Cov = vol %*% corr %*% vol # Average return mu = c(3, 4, 5, 6, 0.25, 0.5, 0.75, 1) # Return value: list(mu = mu, Sigma = Cov) } # ------------------------------------------------------------------------------ .worldIndexData = function() { # Description: # A data set of World Indexs contributed by Dominik Locher # Units: Units = c("Asia", "EasternEurope", "FarEast", "LatinAmerica") # Time Series Object: x = c( 20070327,370.04,302.41,326.56,3100.66, 20070326,370.37,304.79,327.06,3128.91, 20070325,369.54,302.25,326.03,3124.70, 20070324,369.54,302.25,326.03,3124.70, 20070323,369.54,302.25,326.03,3124.70, 20070322,369.75,298.95,326.26,3129.17, 20070321,365.46,292.45,322.84,3116.79, 20070320,362.57,289.46,320.86,3034.35, 20070319,360.93,292.24,319.81,2990.89, 20070318,357.70,287.29,317.28,2938.57, 20070317,357.70,287.29,317.28,2938.57, 20070316,357.70,287.29,317.28,2938.57, 20070315,357.74,285.52,317.04,2962.38, 20070314,353.26,281.37,312.66,2936.81, 20070313,362.26,285.91,320.23,2930.81, 20070312,362.09,286.35,320.47,3014.71, 20070311,357.45,288.41,315.81,3004.10, 20070310,357.45,288.41,315.81,3004.10, 20070309,357.45,288.41,315.81,3004.10, 20070308,357.38,281.80,315.42,2964.89, 20070307,350.68,278.35,310.37,2901.26, 20070306,349.63,278.58,308.97,2910.81, 20070305,342.19,273.38,302.54,2797.08, 20070304,357.72,282.62,316.19,2880.75, 20070303,357.72,282.62,316.19,2880.75, 20070302,357.72,282.62,316.19,2880.75, 20070301,359.75,280.80,317.25,2925.88, 20070228,363.46,290.20,321.72,2957.57, 20070227,372.72,297.04,329.05,2933.25, 20070226,377.55,308.41,333.45,3143.55, 20070225,378.21,304.53,334.12,3152.57, 20070224,378.21,304.53,334.12,3152.57, 20070223,378.21,304.53,334.12,3152.57, 20070222,379.11,303.81,334.01,3198.17, 20070221,378.44,300.74,332.64,3166.70, 20070220,377.83,300.17,331.72,3157.26, 20070219,377.94,303.03,331.21,3166.05, 20070218,378.26,301.19,331.53,3162.13, 20070217,378.26,301.19,331.53,3162.13, 20070216,378.26,301.19,331.53,3162.13, 20070215,377.28,299.89,330.64,3172.06, 20070214,372.47,301.38,327.11,3172.37, 20070213,368.75,295.28,323.16,3112.62, 20070212,372.40,289.73,326.33,3049.67, 20070211,376.56,297.99,329.20,3081.50, 20070210,376.56,297.99,329.20,3081.50, 20070209,376.56,297.99,329.20,3081.50, 20070208,376.37,298.04,328.56,3111.51, 20070207,376.14,305.12,328.39,3111.97, 20070206,374.87,306.71,327.71,3123.29, 20070205,372.22,304.55,324.90,3105.70, 20070204,370.91,302.47,324.03,3096.00, 20070203,370.91,302.47,324.03,3096.00, 20070202,370.91,302.47,324.03,3096.00, 20070201,366.10,302.61,319.70,3080.11, 20070131,362.92,296.93,317.05,3041.84, 20070130,365.45,293.86,319.34,2994.49, 20070129,363.99,293.20,317.87,2959.63, 20070128,365.73,295.87,319.48,3008.45, 20070127,365.73,295.87,319.48,3008.45, 20070126,365.73,295.87,319.48,3008.45, 20070125,371.24,299.37,325.03,3031.37, 20070124,372.54,298.33,326.91,3050.37, 20070123,367.71,297.63,322.26,3005.14, 20070122,368.07,297.03,322.01,2965.56, 20070121,366.07,292.74,320.23,2954.21, 20070120,366.07,292.74,320.23,2954.21, 20070119,366.07,292.74,320.23,2954.21, 20070118,368.51,289.85,322.62,2901.66, 20070117,366.67,288.32,320.87,2926.80, 20070116,367.78,292.91,322.15,2908.26, 20070115,366.66,296.45,320.98,2933.52, 20070114,361.66,288.98,316.46,2926.08, 20070113,361.66,288.98,316.46,2926.08, 20070112,361.66,288.98,316.46,2926.08, 20070111,354.97,290.37,311.21,2902.35, 20070110,354.90,285.22,311.93,2859.72, 20070109,361.15,288.23,317.46,2849.87, 20070108,362.10,304.41,318.23,2903.84, 20070107,367.47,304.32,322.78,2880.09, 20070106,367.47,304.32,322.78,2880.09, 20070105,367.47,304.32,322.78,2880.09, 20070104,370.65,307.56,325.92,2968.18, 20070103,376.06,310.53,331.11,3002.63, 20070102,377.21,311.52,332.33,3039.15, 20070101,371.46,309.43,327.07,2995.67, 20061231,371.46,309.43,327.07,2995.67, 20061230,371.46,309.43,327.07,2995.67, 20061229,371.46,309.43,327.07,2995.67, 20061228,370.18,307.74,325.65,2981.90, 20061227,368.11,304.17,323.63,2975.56, 20061226,363.36,300.91,319.54,2926.69, 20061225,362.36,301.54,319.41,2902.57, 20061224,362.60,302.53,319.65,2902.57, 20061223,362.60,302.53,319.65,2902.57, 20061222,362.60,302.53,319.65,2902.57, 20061221,361.54,304.50,318.98,2910.08, 20061220,361.98,304.64,319.70,2918.35, 20061219,356.34,300.35,313.84,2917.11, 20061218,363.09,306.87,319.50,2936.06, 20061217,360.37,306.83,317.06,2942.70, 20061216,360.37,306.83,317.06,2942.70, 20061215,360.37,306.83,317.06,2942.70, 20061214,358.11,305.14,315.26,2938.00, 20061213,352.99,302.33,311.23,2903.05, 20061212,352.75,304.36,311.64,2890.34, 20061211,356.43,305.03,314.04,2907.91, 20061210,358.28,308.42,314.60,2895.92, 20061209,358.28,308.42,314.60,2895.92, 20061208,358.28,308.42,314.60,2895.92, 20061207,363.08,308.81,318.78,2889.90, 20061206,363.95,308.24,319.82,2891.55, 20061205,362.05,308.20,317.71,2887.74, 20061204,359.44,303.24,315.40,2836.95, 20061203,360.01,300.45,316.12,2780.48, 20061202,360.01,300.45,316.12,2780.48, 20061201,360.01,300.45,316.12,2780.48, 20061130,358.40,299.50,315.12,2804.62, 20061129,354.34,296.95,311.25,2789.24, 20061128,350.48,288.78,307.40,2726.65, 20061127,356.66,287.56,312.97,2732.92, 20061126,354.96,287.21,311.34,2782.22, 20061125,354.96,287.21,311.34,2782.22, 20061124,354.96,287.21,311.34,2782.22, 20061123,354.65,285.92,311.04,2791.43, 20061122,353.85,284.78,310.34,2787.78, 20061121,349.05,284.25,305.82,2767.77, 20061120,347.46,278.95,304.95,2740.54, 20061119,348.12,281.08,305.55,2735.42, 20061118,348.12,281.08,305.55,2735.42, 20061117,348.12,281.08,305.55,2735.42, 20061116,348.96,285.75,306.06,2761.74, 20061115,347.24,283.87,304.79,2766.90, 20061114,346.29,284.29,303.74,2760.15, 20061113,343.74,283.69,301.17,2721.09, 20061112,343.78,284.11,301.32,2733.62, 20061111,343.78,284.11,301.32,2733.62, 20061110,343.78,284.11,301.32,2733.62, 20061109,343.01,283.30,300.81,2750.00, 20061108,339.56,280.29,297.78,2750.76, 20061107,340.64,282.54,298.59,2739.01, 20061106,337.81,277.43,295.87,2743.48, 20061105,338.56,275.49,296.72,2687.33, 20061104,338.56,275.49,296.72,2687.33, 20061103,338.56,275.49,296.72,2687.33, 20061102,336.80,272.81,295.09,2666.32, 20061101,333.81,277.98,292.27,2673.55, 20061031,331.68,270.93,290.50,2663.66, 20061030,330.43,266.78,288.86,2619.44, 20061029,331.79,274.60,290.85,2667.38, 20061028,331.79,274.60,290.85,2667.38, 20061027,331.79,274.60,290.85,2667.38, 20061026,331.41,276.15,291.20,2698.02, 20061025,329.05,275.38,289.16,2688.38, 20061024,328.31,272.69,288.43,2668.66, 20061023,326.76,271.96,286.86,2654.76, 20061022,328.10,274.18,287.91,2637.77, 20061021,328.10,274.18,287.91,2637.77, 20061020,328.10,274.18,287.91,2637.77, 20061019,326.66,277.17,286.40,2651.84, 20061018,327.51,274.63,286.91,2636.09, 20061017,328.14,270.77,287.48,2619.25, 20061016,329.36,271.73,288.66,2649.86, 20061015,326.89,273.78,286.76,2625.68, 20061014,326.89,273.78,286.76,2625.68, 20061013,326.89,273.78,286.76,2625.68, 20061012,322.28,267.06,282.92,2579.95, 20061011,320.70,267.86,282.06,2558.04, 20061010,320.94,266.72,282.39,2573.41, 20061009,319.22,268.07,280.62,2547.12, 20061008,323.44,262.86,284.71,2530.23, 20061007,323.44,262.86,284.71,2530.23, 20061006,323.44,262.86,284.71,2530.23, 20061005,323.43,265.18,284.83,2535.34, 20061004,320.04,259.29,282.16,2505.77, 20061003,323.99,256.38,285.66,2449.38, 20061002,323.89,261.75,285.40,2482.37, 20061001,322.90,260.28,284.41,2473.06, 20060930,322.90,260.28,284.41,2473.06, 20060929,322.90,260.28,284.41,2473.06) tS = as.timeSeries(data.frame(matrix(x, byrow = TRUE, ncol = 5))) tS = returns(rev(tS)) colnames(tS)<-Units # Return Value: tS } ################################################################################ .hist <- function (x, nbins) { # A function implemented by Diethelm Wuertz # Description: # Returns histogram with fixed bins # FUNCTION: # Classes: nclass = nbins + 1 n = length(x) xname = paste(deparse(substitute(x), 500), collapse = "\n") # Breaks: breaks = seq(min(x), max(x), length = nclass) nB = length(breaks) h = diff(breaks) # Compute Counts: counts = .C("bincount", as.double(x), as.integer(n), as.double(breaks), as.integer(nB), counts = integer(nB - 1), right = FALSE, include = TRUE, naok = FALSE, NAOK = FALSE, DUP = FALSE, PACKAGE = "base")$counts dens = counts/(n * h) mids = 0.5 * (breaks[-1] + breaks[-nB]) # Histogram: r = structure(list(breaks = breaks, counts = counts, intensities = dens, density = dens, mids = mids, xname = xname, equidist = TRUE), class = "histogram") } ################################################################################ fPortfolio/NAMESPACE0000644000176200001440000001210313202342267013612 0ustar liggesusers################################################################################ ## Exports ################################################################################ exportPattern("^[^\\.]") # Needed within the portfolio book export(.fportfolio.plot.1) export(.fportfolio.plot.2) export(.fportfolio.plot.3) export(.fportfolio.plot.4) export(.fportfolio.plot.5) export(.fportfolio.plot.6) export(.fportfolio.plot.7) export(.fportfolio.plot.8) ################################################################################ ## Imports ################################################################################ import(methods) import(timeDate) import(timeSeries) import(fBasics) import(fAssets) import(fCopulae) import(robustbase) import(MASS) import(Rglpk) import(slam) import(Rsolnp) import(quadprog) import(kernlab) import(rneos) importFrom("grDevices", heat.colors, rainbow, topo.colors) importFrom("graphics", axis, barplot, box, contour, grid, hist, image, layout, lcm, legend, mtext, par, pie, plot.new, plot.window, polygon, rect, text, title) importFrom("stats", approx, cov, density, dnorm, nlminb, optim, optimize, pnorm, qnorm, rcauchy, rnorm, runif, sd, ts.plot, var, weights) importFrom("utils", capture.output, data, packageDescription) ################################################################################ ## S3 Exports ################################################################################ S3method("print", "solver") S3method("getData", "fPFOLIODATA") S3method("getSeries", "fPFOLIODATA") S3method("getNAssets", "fPFOLIODATA") S3method("getUnits", "fPFOLIODATA") S3method("getStatistics", "fPFOLIODATA") S3method("getMean", "fPFOLIODATA") S3method("getCov", "fPFOLIODATA") S3method("getEstimator", "fPFOLIODATA") S3method("getMu", "fPFOLIODATA") S3method("getSigma", "fPFOLIODATA") S3method("getTailRisk", "fPFOLIODATA") S3method("plot", "fPORTFOLIO") S3method("summary", "fPORTFOLIO") S3method("getData", "fPORTFOLIO") S3method("getSeries", "fPORTFOLIO") S3method("getNAssets", "fPORTFOLIO") S3method("getUnits", "fPORTFOLIO") S3method("getStatistics", "fPORTFOLIO") S3method("getMean", "fPORTFOLIO") S3method("getCov", "fPORTFOLIO") S3method("getEstimator", "fPORTFOLIO") S3method("getMu", "fPORTFOLIO") S3method("getSigma", "fPORTFOLIO") S3method("getSpec", "fPORTFOLIO") S3method("getModel", "fPORTFOLIO") S3method("getType", "fPORTFOLIO") S3method("getOptimize", "fPORTFOLIO") S3method("getEstimator", "fPORTFOLIO") S3method("getTailRisk", "fPORTFOLIO") S3method("getParams", "fPORTFOLIO") S3method("getAlpha", "fPORTFOLIO") S3method("getA", "fPORTFOLIO") S3method("getPortfolio", "fPORTFOLIO") S3method("getWeights", "fPORTFOLIO") S3method("getTargetReturn", "fPORTFOLIO") S3method("getTargetRisk", "fPORTFOLIO") S3method("getRiskFreeRate", "fPORTFOLIO") S3method("getNFrontierPoints", "fPORTFOLIO") S3method("getStatus", "fPORTFOLIO") S3method("getOptim", "fPORTFOLIO") S3method("getSolver", "fPORTFOLIO") S3method("getObjective", "fPORTFOLIO") S3method("getOptions", "fPORTFOLIO") S3method("getControl", "fPORTFOLIO") S3method("getTrace", "fPORTFOLIO") S3method("getCovRiskBudgets", "fPORTFOLIO") S3method("getConstraints", "fPORTFOLIO") S3method("getTailRiskBudgets", "fPORTFOLIO") S3method("getPortfolio", "fPFOLIOVAL") S3method("getWeights", "fPFOLIOVAL") S3method("getCovRiskBudgets", "fPFOLIOVAL") S3method("getTargetReturn", "fPFOLIOVAL") S3method("getTargetRisk", "fPFOLIOVAL") S3method("getAlpha", "fPFOLIOVAL") S3method("getRiskFreeRate", "fPFOLIOVAL") S3method("getNFrontierPoints", "fPFOLIOVAL") S3method("getStatus", "fPFOLIOVAL") S3method("getModel", "fPFOLIOSPEC") S3method("getType", "fPFOLIOSPEC") S3method("getOptimize", "fPFOLIOSPEC") S3method("getEstimator", "fPFOLIOSPEC") S3method("getTailRisk", "fPFOLIOSPEC") S3method("getParams", "fPFOLIOSPEC") S3method("getAlpha", "fPFOLIOSPEC") S3method("getA", "fPFOLIOSPEC") S3method("getPortfolio", "fPFOLIOSPEC") S3method("getWeights", "fPFOLIOSPEC") S3method("getTargetReturn", "fPFOLIOSPEC") S3method("getTargetRisk", "fPFOLIOSPEC") S3method("getRiskFreeRate", "fPFOLIOSPEC") S3method("getNFrontierPoints", "fPFOLIOSPEC") S3method("getStatus", "fPFOLIOSPEC") S3method("getOptim", "fPFOLIOSPEC") S3method("getSolver", "fPFOLIOSPEC") S3method("getObjective", "fPFOLIOSPEC") S3method("getOptions", "fPFOLIOSPEC") S3method("getControl", "fPFOLIOSPEC") S3method("getTrace", "fPFOLIOSPEC") S3method("getMessages", "fPFOLIOSPEC") S3method("getWindows", "fPFOLIOBACKTEST") S3method("getWindowsFun", "fPFOLIOBACKTEST") S3method("getWindowsParams", "fPFOLIOBACKTEST") S3method("getWindowsHorizon", "fPFOLIOBACKTEST") S3method("getSmoother", "fPFOLIOBACKTEST") S3method("getSmootherFun", "fPFOLIOBACKTEST") S3method("getSmootherParams", "fPFOLIOBACKTEST") S3method("getSmootherLambda", "fPFOLIOBACKTEST") S3method("getSmootherDoubleSmoothing", "fPFOLIOBACKTEST") S3method("getSmootherInitialWeights", "fPFOLIOBACKTEST") S3method("getSmootherSkip", "fPFOLIOBACKTEST") S3method("getStrategy", "fPFOLIOBACKTEST") S3method("getStrategyFun", "fPFOLIOBACKTEST") S3method("getStrategyParams", "fPFOLIOBACKTEST") S3method("getMessages", "fPFOLIOBACKTEST") fPortfolio/data/0000755000176200001440000000000013201353172013303 5ustar liggesusersfPortfolio/data/LPP2005.rda0000644000176200001440000006241611645005054014751 0ustar liggesusers‹l¼y4–Ý÷l,‘1™B"s!d¨´H¦ˆ„2”‘¨H • !s!D*)2«%"’„R$×pß·ÒäÝ÷³Öûë]ëûþÓ~®sëœ}öÙû³?¬ÇÞÔY—ß™Ÿƒƒƒ‹ƒkþËÿÉÃ…ÿprpˆàÇ\k;;]•œÜB‚ëøùË£k'7û’"ùôxõçÝ IY š‹³^gkÑiëzÁˆžªÐj½i îqx5Xâ¡êÇÃGÜx¼,n¨ê#ÝÏî¯ØŽã=b“âg€øwĺVˆ‘7y“ï€xRöJù$ÄsɘÁ-y@ô­|rŠ™Äà«¿3kß1õ$çÑq ÆýÚðí6o7–J9¾ã¿~‰¢ˆ'úY¼üäËœÿüZÆOb¾¨ÿ|ZÄG?…RÅ̇››Ÿªžbrª·Kv#æÝÚßÒæ @´YÞˆE·üÇ€P®-Û>â „±ZŽœêÇUî-\„á‡#sƒØlffõ»ëÖ¼l¼ø­ßöÑÛ)ŠÿìÁЖëoÝ€¸ûñ¹;Þ‡o­Eîuq‰=@œ— ‹N7Æx(úuˆøªžKޱïa1Ml`Ç™˜o{ˆÃ&ûÚÙû ù<øÀöW´½©ëì”{#{ñ<ƒR­Í²!b ç™™í‡ùhr“LHÂlÁåÚÒýh«­3ú²1~})g…Í0›fxW±¶›\1׋=¯ÞÞzäŸÝæuÿ¨&V?Å=¤Rð~ÜnÔὺśù¾E\Ý+jÀ™‡¸êj!ç’yµG;´Ú°ê߸ïÂë—™²óBwdǃK HÂßèîëƒÝìü©»x÷9uãú:®v|,4ý³1¶mEbxO¥üÅû.wô)ÙDÜáîköØÎ]¨`XaÜ_¼Ò¹‚} eæ~ } ÅÅ0Åë<;¿Ÿ6;7³Ç;×´‹Q<ß:fãu3ÝDb¨ˆšŽ/š3Ø}¤|Ùk6þ+Ÿ mb×ã˜rßWÄi®ëÞ1êì~лëÿíDXÆöv_ñ˜Õa÷­®t̯Ï_­le÷Ô!ãÇlœÏ›‰~~7RáðÆó}šÏ)rh_{B˜‹€˜‘~'ô‡Ý/ܬ§ÏÁºU³q‘355ä¿GwÝ€¸ÏAþ±¸ÜùoÞï5^•!þò:Î <¿†ƒ.é;Þ#®ý}½b'ZiïøúÖa }|ÕŸÿ>“êˆßm_W‡Šá¼Âœ·‹ø~”Ï]süˆ£rŠ\'þþÛ‡ÿ§É£íû—3V¤ýÄþÃ˺”ñGñÓòìÜÔ`v_:ýýÄW ¹úîŽñ³ñÞærî ŒËN~ËVÄ÷_¹ºðû&kú¯ÆŽÉÿg¯7Ø3÷ó?ःûÈð-ëDÿ–ŠzT‰à¸R`gͳ•@*jž–_‡ýgí#×”L u¬¯îiÖR3Ë–•à¤öoWå å@ê5=·äÆïµ"„©G@êjyn–yòoÞ²¡2ûá¿÷–úÇvý³†z\ûÝ—©/"¯yû‹aƦëA¸îâus…ÿ›§:‰ç_¹uçß—ÿÍWªÿˆãiW5îûoÜôŸ+òÈ»Û+Ù÷%6¶Iœ§{æ2bçu¤¼”›×¸ÉùO±ó^나/ûþKwÕ¢ÕUIÂ~?ïŽ4QšÊîËwtZØý8Kù *î³Ú—Ob H¾Ç««Ì6³û­ÓÁìÿJëbþÏÂY3Ý¿1Ÿ”æ*Û`þÎóé â:Èæ6ËZÙyv·–ŸPÙ¯l^0\úü9æ«Ë­A[Ø<äï) öú‹Øù¶fÛrŒ»Àg•BâÛ?¯W›Ù|#fñäÂóþï;Öu1š½¯Ô9|ä_"¶º÷Õ-ÙüËLNâ;~uU¤œ¦`¼Ú(ûÞ.¬?‚“‹Ïj–§Š–uÖƒdŽåçÞJY@å–ØŸ~ÓT…²n.î{WiÀq-¨nÉCF»ªH{9(Tj¸ÿ©ŒP ®e¸­¶êÔîÕ+^Œ mLŒs*loŸö&; Žöw+)gàº[~GÙUiðlMÆv êË®îîŸ<’½µØ ÷{îPœÍª!òÉ7Õf ^¾ jüîå7ÓiÙd 7ˆ­í‹ª¿òÖâH  ¾ ™ÅñõÁIäØû X.õ’fG¢ÿVûK¨áºiIkæ¨/—ã=ôœb¡‚/4Ð26í*²@Ž{š|ÈÚ:÷Π­ Ð:›Þ).Z)òà éI ×D?’  yùÒÞ¾Õze“{š÷! í¸§GäÖ™‰Ý ô²œ?‡Ï=Ÿ÷ǧ } ~D‘?æ{úýÔí  M¯P·Bí·WÕ-¤ hŸ‰g÷½+µ8ná= ÷ÔpEÚ Ç„d莠#-ݾ|Øô©ßGL¯/:Ö|‘,ÉôáG/*}’aþîÐËÔR‹ÑŸÍòÇ–TâzÒÏ—ÐA@‡ïYM·ÝÆõþ4z»™}‘žÇ0] tb„|ÖdÐEòfî!@—F*(׬ú³æéK&Ðe|Ö’WøqߣÏ#|Ÿà~»Îîý|è(Ö'·ÑÿZç?E}y`h¥+ÚêOº¶=‡.¥7›jýðÏØ¡²Ã@—ϬåŒ]t[¤RœîÿäÅÖ2 òLÃ'þÙN²»À%è´SŽ6o ¯hØÈV=8ÿ÷bI ™_ ‚ƒS-3K= 蟾óm?-š%ñŒEÎK9\~ù»~}0k¹LÖá§ÀÄÞÖt îËYš'½ª-Jæe”.P[Z‹8b€ºzõÎöòR ‚ªn¿½jñÏ~¼-<Ú‰yGõ-áïÛTfª¸·†P-ÍÛœþÔãÆ»2w_5u»¶ógÖ?{æè‹¦®2Ì÷Þle'¬ %þä·Cí@¹L]û²ëM6÷ÜÃ툓Õ>?QGß;õÇ ëqy`×sÄÕ­MÌ€Ò[ðˆƒ?(S×½>XÇâ§»j°ƒ¸>2‹ü°®Žœ}'„u»5ø:Ÿ PÖ£ù4Ö“‹Â–±!Cô÷ë¾ ‡ðüC™K÷o¿ 4çG «)Ìþé‘¥}@½ n½‡8ò›£È;W¨·ž[S¼ñùUiúÜ. >¯zÝF .Ì>žúÍÔ!×iŒco¦¶ 6Öù0çMžU@yw¿ü»;q¢ðTÄf¬ß7º¿4ìÑ¿¶¿I@/^»És Ö¡¢ðÒí&S@K<´á«P-Ì·¦Óõîá˜÷ÜÙ†|õÿl@bµà`ЫŸE°nRl¾7;­=‘wq·3кDz\ÜÚ‹¡–è{ëxÜÓHëwÛ [=Áv gk6^ÜtËÞYÔçô‹ñ† ·ðõ¾¹ôóºÑ{'qß×Çvy¿úmùžÃI3@Ú×p8Rs?ÊXô‡c¡»ã¾/L`­¬b ¹°c#Å¡7"ŸëŒ^yíaCüe«P¥0Ðßåº,¾C¸P$”åôûê‚(õýøÝX±Ó¦KÀXÖû#¶R²e«n9Ãp‹ vØB`X|ç™9~&Ö2Âd60Bgñ_y ŒÄÞ”åaÀØ5GÑõ2?0ìS>H¬–FšÇo|.:ü7þœ0®s õqÝri{â;0.|ih³)ÆE!%Å-:À¸›Ú÷F×{=±¿\ø0&„¶i4jƒ‘9Òå•Ì%•ýâßoSUOÃ÷Îf`šÈé³} LÝ íÜœÀT›&Ö϶áüùÞ©`*rï 1ºˆó7¼µS÷¦~¿5ê:æÖm7BÍ„€ ’wsJöÓæõÓM¶AÀ´,yXvl˜Î‡"¬rð}â…ÕÞw€¹—zp£˜Z*÷¿wâø—^;0=Äã¾9ßffi­»˜7çe?°æ¹GK,þ3®¦V•ºÌ¥z–2¡ÀFîf˜~ÅŒ}0óë î¶æe­ž“ûÜÏ[ĘIj—™1[zÃg70s „ —,Åu¯}˜‹q°¹2œsE˜<{Bãc1®»YƒG˜Ê6ô«¹;ñãÿ¨H#0^ª¶ý6ÆL‡iõJ`|Öe KSøcýÅc`˜ö'ŽáyTWŠý©h¦ùnÞÙÙOÀ  ú10ÎÇöy>b2y+ªð˜¼0«w;†`Ü» Ãw¯èfiÛƒëQçØ;`†ç¨ÿ£Ä±½ ˜yÿ¼óÌÿ_;°qcwu!0Ÿø=?McüZ“5›Yð?–%Γʼ‚¶Æ%1ZXsºVU=Àø|óþë¼U XÜ£*n§€ùCþ¶T’?°Öýå9 ,÷Œ‡Wfû•°ÉùÁŸ£ÀŠð:hÉqXi&¯VDíE+–5ÿçm`ÝÒ•ø[* ¬ó'vË+µÌÏÆê°ªDj³GUr$±ºÊXA§Îœ{,¬KYëâ:Õ­­ß8s¤WØþÇ`~ ^˜TåÌÜÌŒ_¢Ï€ùÊáÚ@Á`I¹¨oÖŽÃÒ1eÀr…Ûi÷ËòKDлÀR¨~&Œ÷o&ðñŽ0_›l¿ Ì×Ƕ•5·kYàÍÍé²ÀÚÈ»ƒa6,¿<®YXõ ³xpü9w °²|-4·+|ªrG Æ×üu#·â`EÍ4.¼¹ X±µÓ…æòÀ:Y¿îñÛüþ}ºï=`5k^=kùX# .óôí쥆¨áùÀšiT8ÄûɧÌË{€hu®6Êm"[2Nç5)?ýªñ~ˆÈãŃ7=€H?zçþÔ} ¢‡n;áø9¿Qy‹“8OÅ^H u~Ü¢àVÛD œOhÍÂåmùæ\@ص¦6Ï9 „‘Ãyµò: L¬µß8æ¡mpôþ³ŸÞøæÔ~cûÃÝ!¸ˆouôkжk9ú@rŽ®2Ú†ñúhh`‹ú¯„`ê8¢.ÌQµn‹ÆõKoò$¨3ËånÈÿïœruò@JæŽo佊:ÏSÿíä’¥‚7ÃΩõsÛ¢‹x®ƒÝ¦Æ¨ƒ´zîŒÕa\4Ž®¨šãçÏ ½!úϚ؞üÿí·t»RW M“=äÉ騾gÃj wE?m/2 èºÒìqgûÞŠ$yʯÆo#ާê>轋çÈ2Éõ¸ d®çýýߨùÑKv£ÎŽ ŸŽ=-‰Ï¥YeÉûPwîÚ|ûêHÏ [m0ÞQ;uFgë€ ©/ÖŠo2Ll¹§Ã* 7ÏKÖùôÏî7zc!xÈC’×—nÒÿwÐAu7 ½SJ·Û¹‡KöNÞ“¿ÚŽ+Ëðþ|žö§0Žû¨ÌY΄ÿÖ6SÒ7dŽSêУÇ#.‹3ð}Cjv!®»kÑé> =µ¸%p¯7Nû`žùΟ‰àÀ¸x?ªÔ¯52xS{÷v “N(ìF=­m¥:ÏȈ¥ïWü¯=±vÁLà8ž73wuëZŒ—÷NþÛì¸u_{r—·Ž0í9¶ÝÈdæÕºÍ§1ŽË•}ë,[ÙÌUóÏÖŠÚñýÀ{½÷š·ãî [Ö•í¸Žçx0õn7Ï4ÍÎç¦aÞÔÉfrrYç}uû o‰¢¾¿tÙ>…=ïÒÀŽöVÌ£ìo³ôê ÜßÉî½qÛ/Ó3—ð=ç:JµÈŒ]‡À,È—ùô_š}îã<ËÿÙˆ¤ØU­‚@Æ«Òxìð¾#¸Ï¿2S?A¼f3ûÞ‹rµ\¬Ç}SÜkæ¼nÀç§G\ºðÞ¹'bL¯°ïWÍì"úm—69ôBHÁc%Ï€„Œ¾-ê@®°^à¶ïGó£okå¬×Êë&+•TçQ[…y¬ª<ÐÄS…u8,!§h ¤„ûcÍìNv=íiØ•óÿ±çv‡å…9Çà‘ï³}@ümyÒêÄéçÝ’ÃW¸1óŠÛÎ÷úMEöÏÁ¸Ÿ÷~^r[¹qøC2_È®‡@Ìj~þ”¾ëw~εî@ò¸$lù @|‘Ël°^ Ä%ÂÓmµìõD6Íâ½ ŽÕLq)~::Én'ÖõòUÏß±q)÷ãB¬sÙ]'O§ØõܨضúŸ]|btíó­ÿ¾Wâ´ ~ÜÎÆ›¹sŠ»±îç«6^À¸œtT¨÷RGp¼í*懶qÇÀoq Uî5}ÉÆxié”loÅx .ÍBß½ H¹ý9Ç‹q™zóÅr†l<î{t¥ ¿w‘¸®ñçm­\«†u½òUÖå7\#ºs‹¶!û¾ø’"ÞÚ´©Î¯eãUOÍè<ü~frk â«Þ÷PÀs(v™Š®F|_ØTzî$æ•XÀÆöÁ¹l­³*2C\åPŸ^äÛ”‹ÝÞ 1ì”v9«m¼#ãPJ<9g63Ñç­X›”ò©÷%¹Ú@iõÏ»ñÚ¨5åîÒú@é>ˆz_íԢ䲸_?ÒOJ> …ó­Þì‘·J:Üÿ¡¹=P‹«u¶É%¥úGïÞ|/_*L+%Ñ%½× ÷%®Úž*¤€âI}}ä[3P D‹Ò­e€Ñ´x0_(Ñþð: x{y“¹Îá<ÕgqÆI@q}¼‘~9(£íº²ˆÛ¿+?|™ŽJøœÁâ>ÿ÷LþäLOîwŠ»±Õ9×vÒÎ/¼Ôþÿc¥˜Ž×0¾‘’FŠ }@Lî þ¾ˆ¯6¯œŽò"¯×µ±BÞèûwê¯wòÝõÛåú´èè+ ƪŽ2w"þ|}Ÿ­5Ž?IâÊùƒÏ2{÷„­Â~S2‡tľÉWÙ¥·ã&p4Çò#Ö×sùõˆÇÌÆÅû‘§Ê詽¸Œ¸ñt½¬âÎÂçWÖ†"o‘*lÓ­Àþ*U0&üMäÄÏ:˜WB?c4»á³ÏÀº\WdùŽ­iø~ÞÉîʈ bÛfx³x0ªUKŒý{É IYìüé-) xo‹ž!ZõÕ¡ù–ä Ù¯ª_Ðê´úÜÁú‘©ömŸBüÍ4ˆqÀú_d.ºÖîâ•«›Eà)|¶ïÔÔCž­¸AñIáÉ÷—¾{°ŸzÐòûÃN{yNì+s*˰¯ªöˆÃK¬+Õ±kùiXOê·Våa©IŽl”@¼éY*\Ž}[/¥ú-ûïJô¯WÊ!oÑšœÖÆþö$¸ï=ú©ûgâj ®oØÔfxõ€¡±Æmê‹U­¿®©¡åVÞqÙqíW¸Ù;¬k;šÌëØ?V̸}ÄçÇôó<ò’ŸÂ÷d¹¾º(a—Ýz|Ó¦½hÍ¿½’Ä~™Â›–iƒq7~3j݈qÙm¢³Œ­_DM33°îeísÂÎÇ÷"-a¯/J\q½°߯9~Uy¾Ô·dsgO«˜ GÜ[˜g22ïw᫃#aˆ÷Ršô©"ÄË%Ÿ}7!ïWri?„ë(r G N«œ­Ž™‡}gñÉc \WÎzù®l<ŸteTÃfìÛ‹Kõ,Çþ!sªíšûþŸí0«Ä¸ÌßæÖòyü< š\xÿs=wdó!^³ë[JÙãkŠyù·þk•‘8êþþ<Çœ#á ~ˆ“œÙµ£b˜—ójoýÝŽþðí|ƒ|Ži+ÒŒ<‰;Xrú=òjîQýäD=¶=»8Ô†ÝÇ?½Øû íù•üå¸nïL8ê߯*ñS¸ßDÁótò.E±Úx¬Ÿ—§½i ^fsÆúzÎãŒú¶¨Í ÈçšGm^>âþéîìwY@´-{2îŽý½ÉÐ3Ý]ˆëS:^ ¸¶?rýi ÊÕŠù€¨ roÄ纶ëvÇ– . q!®o⮿Ÿéo\wEï-9 Ô¯O8³Ã¼¸Â0mVgàz¡-Aq 8ÿ ÿßžk¨kÓå'ŽQao0 uù ·áž›W€(Ú¼êËsô¯,æiÛË JQ“;äÑûÔÖwÐÊÍ¿ä™ D®ÃÔ7ã›Þ "»õý•·Ü®ßQÇø€º¿xÃBÇøÜôë˽2ôûáßÇgR£OÎíû³u4aà“úþµÃÖ¥Òxž—K‹5Ï™Ñ'T‘­cijF·e z¾“.Ñ¢ø½Éüãixε[M~à|­/ûZŸÑ?ÛPÞD‡™g±8úÓ1Э¼ˆ¡cë³P÷¿>ÿJïaâvK¢ žçû›¢+îó¾Pgï; ºþ,ÚbÄãÕí»çaüî'Ÿ|ã•‹¬5ÖIaRŠ—·ë‘_“Y»ˆó¢½.&x/Éb¡W8ÝñùØ ½9@$ÐñxÄ¥•Ï,~¿Ç¸.\œ DáÏ &ç0nqc±ßãHÓxs^ó!»÷Ⱦ­Ï¸å"Œ¸[qƒ¸‰ç¬±ïuq¢ªþÀØî¿ˆ«“¹–@ô÷>ÝžþF?u¢¥» Ûï¿·«òCB¯ ´ÓKï¿áŒ{õ ˆ‘2Ÿj™@ ¶-uâ›Æ÷CEÖÆ˜§o¯«ðiaœ¾‰µj‹ö"žsXrS ;›ö¦²€`íµáÜ»ïLjûèV쯜r%’£È‡¸^sDK ÿãnˆ‰ý…ýŽSq…`t0¿x.Û‰ùFS?~.˜Áü/uHǾP~ÚáÝo¬OÇU­¶Xïó|Åì^#¾Í'nÝ G"–ò;é³âÄ”v§âœóR´,â±T^ŠKòßO/KDý¿¸êö%Ô¡róª¿êa_Qez¶a¿V?rå¸v)âæ°«› òc «.¾c —zËZ~ÇïžÏ|”F~­¸ùbåR+ÄÃäɦ»ðýuG©´§1Bo j‚ç%£®Vþ®>uªñÛAl?òç%]ɈêIJåKQ7.W1[ÉŸ‡ø8ây¨Ö¡Ó²èŸÙ»›á®•hEWíB^¾a÷Öý»‘—‰`Â_Ôïkìç6,Ò¤Àsl'âÝšM=½ˆç%êŒ?/Ày‡ÓšŸ^\v£ñÒÀÝ}í(â¶––ãs<§Æôßñ;È/—/Õu5yŽþä×ûzaÜ4=ßíC=ºüä«»·§´,? ôùáüÀ³v ˆ§šqúáhU,V„¨a?RÕ ôVãße¼G?V:ÜX¼ ÷]c»eç¥ó臘Èó³ÈË5õ’ßbŸ´Ó Šºßò‡„‹ ò\`¥q0á9j8`ÿÝ”²Eÿ×Aäå¯7^1GÞlì÷'u°Ý¥{ŽŸ-QÕ‘×v/N<ÍÒÚ»¶Öû²EÝÒ©å8ÏöœlP?â·ÃTÜÌÄßm·¤–êõéxëy±â³=³hjêg_: û“SœlÑ©8 ]³ ;ÔQÇ8GÏ€y¸{sgR+æÁþãIIþïýs³ày|¬f-·ã9÷º0à<óU9ݘ¿;<¶ŠFa|]ûr÷F^¿KeíÆ/­8^³o¯=ÆÇ1¯G:ö«máe¹j¨Oí§ÎÅÎÃ{·“L\»jŸKôËæc>9¹ÒÄSˆãÕuݨ£I»w•¡_ñ}‡Of9æŸå„FìêÔM2M¡hÍ ûƒç6o–ÓÕB`ùdÊ+óÅzÃqâÇ&üþªÑ^mÔV–sŽcŸ± ß<þü(êæ{yž“XnOòœü-Šx/k*9[“\Û¸[òSëÔ4ï®A«|Q¥uúz«è¼S7q¾¶¯öŒ»yÿHÓyä¦ÇÃó±ž72JxÛ¹úÙãc È_Œ>SVNxï+‹šÄ+‘ßÅêôü(Çõ?}ÛÄ‹ù»ö9¿½³5æ·|Ó¢q½H9q÷q<ÇEãÖ äI66 â9le?mC½kžÞ#—‹|ÍôË Íê Uôâ¹­%kº„±ŸÚ?ãn69ŒqöÊ[;‚ójFy5Qÿ8¦(ò_‹r{™µÏcÏqj˜ ýr–Žøðïë@žF ò ¿õSÅxß­Íw<'î¿Vó±uës¡³2¨ÎÇ:83×ÊÏwèµÿ·ëÈÉv=܇üÇç•Nðê™-v¿°¾Žpžå{ŽõÜô¥îòÕÀ× þ¨ÿž•GbÞ ÚøÏãsÀÎ9ÅOJÞP" Žã÷©ê ˆgûD¬£^ßwkQ®Ñf ÷¬\Yüóp÷žäÇn<Ÿ—s:t}â…ùç^]·iÈsþpÞšÒ-©²Oã°S§Ó{/ê°ÊÅq~?1ýg ¢¾Þ^ÑMkã}n· }± ã0Ç9êÜÌï¹Í¥¼×®!.‰÷ æßžî¥Z%ñè§vRb"Æ-°XÛç…´EÜ)2D+h±yqÆRÞeï‘wghͶ¦a]H<úùèU^ù#o‹ÔìÃs??íÈÈF½;ÜXœräŸ:\„6c~Ó©ÚˆC, ›¯ÆPGñ•rÿnräÚ‰:.g '—L•"Oìä#Õ~u™,oLMê»Jé—#ê(f P|)ˆ4Σ^s2+ÃøM9½|0„uÌJï8é?Èß%~~y”@ ºónäÉ„µŒ%òÜ߇Ïq¨¿¤k·|x…ºÎ|§FŠêH‡úuÚ5<½mPΉ××»åöi}æn ¼joؼÊÆŒòá^Šdl$"Eó¾ç2=ö u–•ŠE"ìÇ÷þÂU‹²ŽæKA}¹õ´šã­ø~•–§ÐZ \>‰M†u|i’xÝW I–ÔTÌ"ò Ò‚ˆ¿‹¶{50ìêÕ(f¿¼Ã¨÷û:.ó¥''í7ëz5ß½—' Ôê¨õ2‰ˆkß­/°u(¿tn[ Ô«óz¢ñûMe>®œ*U0áò¾³@ÝúT3)TËÄžþ}@•‡<ô½ TÖvƒ]«ŠÑ¸Ü1ÒêöͤÏSš@egGœ÷*År]¯¼P¥kêŒgm*ãX²ëú}©FÇ0^¨¶Œ^þä·hŸž¼úu¨w–¹=jòcó:/Œ×KÉncÔùïϺr^‰šï¼ÏùÕËæ –ÕÆ<¤•N­Pþ$ô†œ½a^ò@óîñîº@˽šÝVl ôœJíÈ5@}ù4•îÖÔ« 6ßµ5\Ø‘ž ÔÃ!{§Ÿ’øÜuL*/çêÅtõ-núV?èesR™œ@+'WQoÄqÕ7”gî[Õ¾ ­vvÐËw”šKgmâ¿q@þÐÎA6_Ö̽ce†¯MЖ¾R 5ÎàüŸI;ïVíúÅbx=ÐÖ9ù•­è¿ƒÈNFþ ý;ßeò m;fxÒ‚èmF{ûº*ö»Øõ7Ô èÀ÷¢oÄÓ€j¼w²öÐæ¡åi‹^ýôxQ²Ðf^O¿%{m¸¨-[h®D)¾ ƒ@koÕ×¾$ ô¦öÓ'6Gí½å¸h$Ðñņ"+¶#Z¹%ê1ŽF ç'Ñï3sÎÀõÌý„’'€æž{™4 =!Ö”¢´È¥Ÿž+¶à}´;3Š€š]f:vç/ÞV2ıèU—¬5²ZÚ÷™ÇI eâd›aþ¼hȇõyB)ì­Õ8P{–÷µ]ÇåçL,PR‡.Û`ýžë(‡Q¬·Í7†*g€ŒÔÊly‰ý+ÿôÆÔiEçÉ@\ëk.ø^±(]e-ÌŸåowÚnÀ¼®¦=w»}òÅÕ˜ w°~8ìÝùš‘Wýîîʲqb°%ûi‰_€q>òœË2œBØŸýMØ@ÝTÇ0@ü;49†øÎåÓã©‹ýˆGuÍUaÄss­Ç@†Þ[¢¾ûÀIÁŽÆNäoÁ.CžÇ‡ÄÏÏ‘ C,æšóáâÖÍÝk¤Öæ²ýÒþêÇþûÂÕyŸªÎy͆ZÞzýí©æÈè?^¯×H%”ØÞÕó(9ÝÝã°W>œõëôH‡'®7U¨zÓå>'︄|÷O“T¹i ‡!«Ïul ÕýŽj^làä¹Pí­[‘%žR-x d¯ÅöïÈ—Û—HCÜÍ|¿ëuG ßZŠK‚y€<8a³÷ Pbû¤µâþ½í‡jOµ¶‚ìN ç‘ â7à} x3s8~}~JI'PêiÉwè׃IÔµ³ü!ñzˆKB[%zWx!®ž¸#:-…÷äu°G޽^Ö9~å9@­ã·udÿÝç³—«Õ¿!¾-iŠA¼k2.½Ô9¥?C©ø¾ ½<¡ ¨$;ùªÕøþ„Ø"åw@Eœ‹9>ŽøsVÑ 8Ϩ3³–ƒn˜WY WDå’J¤ÇwŸÙ TÎǰ¡:ÄÛj­Yß0P÷»%›võÌ6^Aq±äaR¢U>â–ÖÓ¯:@Ýx­T«¼ ¨“o‚ÊS´ßä=˪'„εª}k²“2âÿ×Ɔñ\Nç÷õüö†‘@¦d„¾AüóEÜ9¿fÂt"÷³K?ƒ÷;à>ÔŒÿºÇB-@ ófíjj@œñ¨"rKq|^í”ãP¬ÔùÈL UZ¦²ë5ˆk¡⃳ô‘ëyÁ@»eÍèó}Êà¶Õ„-Ða>ë$¿¼:Ï¡ûy~Ð[Äâ“¿ÝÁ×`üñªxÇÞmuX—M+ò}Ã1Qª¢è› ÿ,Ùª tÏóÞU¥@iº>*LúíÅ. GÇÎMxô¾»¿5×]ôã¡VL:Зºµ‰"Μ?šX±ç/Ði÷þ~é/º*Nu…—5Ð,_ü:ôð3AôoüçFž[Ã@w>]0ä t-wŒõ±Õ@?èú[³qc¬êa¡ è£g¥†…€þkÛ)±ð Ðï3VcÆý¼rL6ó7Ð#wÒ­Ž!Þ>Ýáž3nô}Ùϯ?c²³bÓ½åù>ã´GNÄ/È:1t´{[ âçËP¿I@;^‹ñ?Žq³°éøƒ8—P/ÅRŸ$Y\»éÝ t–Žß|ô?mŸø 7ž¿¶0Ol;®_ë%¹oûf O)í»Ã >‹·w½ÆÒȹ…¥ÀPYWüŽÚ žngœ^caƒN 0æéýuñ*пÖeÏvM=0QõGüw¤_}òÆF’+u Ã0fµØ¶eÀP7œ›oµ}Jí ¡÷1lná"`l¾­=Î¥ {4nå÷À€UÛìrÆZ±Tq9k`X»ÜMŸû nG̺ŒÃ缿H#U˜;fµ/0®÷(0³ÑïË›úÏ#û¨†zZ0rJÎìàEÿ«ïÚˆÎýŒk­¯ù¹f‘ø] Ï?ÈæJáþ%Jkì8]q›?êåÒ[8?0³à0ZK)ºc#0šæ,ñ|ö#‰¦¥kÛ€ÁÜ[”Y“ º¬¤#LŸû¥•òÀ MLþ¡‹ÀÍÊ„n`¼aœ?É«Ìy Ἣ€Éåë?»œŽŒ¤ñ‰1Çüé Þ^>Àï‡ü—×:áñ÷Å@.Û%û\u÷/NcpÔkgƒ¡°OÎ)…zƵRùÁÔ!q½Ý/PF'ñe±°ï…çÖ—yÊúÙÆ>ì™?ý½}@–ý¥¬`­ç~bæ&äÓúo¥ò¨[Fk¦°ŸýâFÍ ¯0 ßÇÌÄ ;Õ|öF]7–¡tË õo÷“àš­¨W~ñqÄ"ß61i9æ äLˆD\-ꆯUõbg‘Ÿ§mŸ]늼?f‡üoìgSsKu¢¾y½å°ê6ìg‡5; Þýñ蘛0ö×0¹—ÛQ¯2¾©[]†öÖÊß•ÈC¤3Tócý‚5’÷n„eR¸¹jg=P7ÍN·ÜÊÉÔ\ÿ(ö­ˆRä«Û~N†`ññ“î°Dë³ù°Ý,PþϤ+oºm–ù¨½†9wåÌ€òPùÔšçpo_6sûHl¾eÆ<ì;QÓZ·_¨•Ĺ“}é}ü~G nþú콨ëÏ^óÃ>sr´ðkÕ} ìfë¨0ì#ÇM¢bÈh•Æ:ä÷“¨[l}š/Dð83©PÊ}S¦fÅAì‡gS£MÑ){ Ô»œc"9"4½So¿¯Þ’ f’€¸Ìù¾µ™ûWþ}½KØß„ K7ฉ›wòæ_·¸ƒyT°E™ßðÁ¾ÄÑp9šy¨ï²¿¹å±¿Í^ ÐvvŠÑR誼`2—»²û”Œû\¬3ø0Úy/WUìùNä·%ßÇOGzoɦ/ /¾ù³Cû)Ð.]O½üyvqd2ö‡•gîó©`°ãPÎu¶Þ¸t‰a;ÐêÇO\.`ÿ½îâÌÙ2 {4«ëí:ä3·;…ý/`ŸÑ…5>ˆï|ûvÑÈóƒN˜<¶Å~”šì¶õá6'säu±¯eüéœßyû §D6òöÖ…›â·ÝÂ~7xªÃu@Å»±÷<¸¡Ï@2÷í·®;Ê<øÞh‘W¸þ°‘çþ–P ßdÙn7×Ç~¶qDNûàÓ3Î ÿ~³ì}cû鉨¶‡ÈëÛ—Âv^ìãù®ÑZ¡b@_lÍê® €N‘5YæôÓˆì)ì?޾“ž—ö}¢;<ÞgÎKžæ“ÙôÕôwÕûñ¹JM‚ñ;nâÓ²×ÎZ"x~.СÎÄ™ })rúò~{fÓ£@ë÷ZJò›¡üM2¨7ÊÓÃËÞ ÝÆè÷áÌÎ!)@çüØ\£Šç9®tùÀñ´—uA¨[w—ê½°êö/¹ÔW%[’E/¾à=L`¦*V¦îë¤1¯W]‹pÅ|)MZw6ù»Ôå”Á@E>*î~÷óZ_0’{ò-åŒó™;€êSk9ÑÐÔãQÍF? 2ßñ,@½ë&õu8UÔuùëq ›Œ3¢µ€jRÒv™9‡¼*äaÐJ¬§ø÷ïîu!¯ò|àucÑIÜ'ÔâY¨ðËšÓœ¨WWr×öó¥½q`úúð©æS@þ,šeûÄž¼u%/ùçöZ™£˜÷7ÕÕÏ»uÔØGaÆ Ë Ä:ËîßwÓð9î¬Ðlƒú{¦hñ<¨Víæ—¨_{äÂ1¬·÷’£Æ°Þþ4¿ Å{ä+ð(ÄúÉ1¯-Å:Ÿ¬©­ÉB6§¿Ò¾ã÷}´>îêðYž©„7èÿã+ŸëæãþõWˆcœK[µ½v(U©ÛìXøÓýêÀ«/TPwrU=ûaûhq¡Î}¨Ÿ—<1+É@~%Ý7WZ;õ[ë©µŠ¨S¯%žØ…uµ²>ª óPVØç{<ò:Yk_ÍZÔ‹ò96›ÒÞm$[°Mñ'êM7Ã9ž—Q¯:ؤ"ô-~š"ˆ:ú°þlM,®Vþ#LHó×Ê’8f´g„¯íäQ±i¬K÷°®Om38,§t°Ã´Æ•>)f&³ëáLb} ùa–#kÇ7äm©áæŸ .ýZÞÿ³è»>wíÚÑ¿¶C«Õ^@¿P!u±~ÚÔÍe¾a_~SÞ5޶Cņc­7ò6÷9Ì(ÜPùãGCÔÝË]¡P÷¾šöP\ .=™U¥Xdž\ù~] §ô;Ja=|¿aÚ;ÛïOøw-_ƒüX»i‰»ò¿ÊóÚnRÈW¨›O!^Ì.ê|ì ‰´÷ñ ÀP~u¾õm0°J¦`ßW¾Ôª³6ës ˜s€áo\Á Œ£\áù¨‡þ§ü›#¡À¬~¦‘‘w%u Okˆœg9ŒöžǶ£·%ík%0ŠÊ¯,úéŒþ•%÷NoF½žÅÁgÀxtAþYú%`f™¾È·'ËŒG»ñ%Á8¥­ù× î%ÅÈ7[ýF®nF>±~yÝËz`<Ô9#w÷y¸üòä—õ·/½gØà³ÕœfN`¼>}øÌšÏhÛoÆ¤× Ç‹w€Ñ×®Ÿ…|÷qžz`o<0zÞ nï@>øeV8M½˜œ‹Vìzˆ|Ä]c^Æç‹ŠlË/~䃡F®ŠvÀªøá‚|Nššâ¦‡ç?ä…ôg…j>c`t7ùöÍh£c êMòÍï0®ßLƒ1j|@yã;}ýîßÎÀI¼»ß ùž`õ±Q›sÈûœ?<Œ¬G^Ø®Vî$Žï÷Ÿ«æ¦¾‚Êñ˜ãÀÔÛʵFo50Í=¾n•Æ}½W%OÎ? Ì3ß¹ü1áÊÁ(þeÀt™¹õ~ì"0C ŠØiÓ_ïÄè¼n`ØpéJÓ~Qb¹˜ÇýF/·æõ`ÛÛ0˜M*tß–óh‡ºö*³ñù+xÙÌÇïUôôïóÍ·T«ôÛÀ|¶#e},{<éê~o%`Ö5uœZ‰ï‰Ð¥¢šÀœ¨³Ã¶XükG…—ý–ß“*‘<`­ý:LMhËt‡æŠS½ÀZ}6†™¦,‡Švåg‚À:áÖÎç ¬c[?…kÿádá§ÀºVëš[¬TO¡ `ïµáPV¹ÉùÁ7`5ôiö;¬VƒbŸdõTOf½É °X¥V—£¬Ñ^ê7´…éymâ/G§eûü×9´\©)u¡¦ıœ—íÖ¯üãÂÇNÂô¢ók®†Á´fÊ*•¼Ó0½ÂåOÿ¸L+;8_*>ÓŸ`ãÉ[0m{¾<ã©9L;|ä[jœÓ‡b^Ý|–Ó»ÃîÈÔn‡iû¾Š¸*`Ý:¶&4 XÔ¨ Ï›À:º«hͽÛÀ²‘ŸÐ¯ æ«Êã*󤥔ù-³ºXš„±S°$MþVfï•éo¥ÀŠkòqŠ^ ¬­ã¯1&íU/ ,þsŸ^–¢_ ÇN<·Cí¥”¬ º,Éø½äzÁ€ÕèuVºX/´lï­éÖ]oN›-`Uhž¯×¯VlEöî¦OÀªqoŒÇç³'Tì¢q¾Ó£âõ=“¿:5˜žÏ“+Ág壋WN‹Š–ÛþãF«,É“âÒôPí×ÈM@nP9#øý$ë„ÅW Y¯ñªÌè ÚQÙn#HóE–ö²hM¢ó«ÇqÞ‹Zjßÿ[oùþ±H‡2¿£ÇtïKx7ä…öCHNêœÝW¹7ÞýäŸIß”‹@îK±I¿?Èod—-òHsÝ­wø]ÀÙòUY@®¢6Ý|Ö–±¶d.ǤÖÞ-Cœ¤PgcdÈx/™‰ú禬+òòøÆ?WŸa/~Ó ã'90¨‹ú'jy‚÷Žf´³Nª î9él"( äÑ~í–D Ã;þœ|äaÕ×mÙè×Ö= WoOA2aH¯ARøI úy¡i^2/îóvÓãÂW¨·ŽlŸX„:é´×™¥¦$Ú/ýu¨ÓNŒŠŸEŒ´Ò™é2ö±¥£šûç€Îs¼JpÜ`•€ê¥x׉e´÷ì¶.Ü dÌt~ÚU´IVé\—PGãð0²¸dúh¡Åƒ=¨ë>ßÝ+ëeߨ¤W†º+ÿñßkY_,•Iy 䵜¶ á\ K@ÿþ$ÞË­N…EY¨ —öyõT ÿÁ@fõùæ\Äu«*ÕG6 µÝŽ:ŠLüºª›¼ºr’×Ì3ȳ¢­÷0“$—ÙU£~K«9íqÎ8lZáŃëÄñßTÁóæÈKžxŠ~1šT¯aþç†ð²Ï—ûBrÏsM ä[$¼ð¼áj÷ýñ> ßÞ¬¶;€þç«Ö0Øë¾[¸Çó'£·.Äë #×®+ë'ëzvNÕ>·mpØl djx–¿„Ûïþ¸d|áòu³©Ëø^/ØT>ŸßÄ3-ÑŸ”1ó÷Qï&¼8+}ãe£ÒžŽyåTȘ‹:74ìãÈEöýq¨X­Ç<Žõ‹iAý4¿uÙ¹…h«ãž,Ç}ãÕòBtðùtw G:Ö×éÂs¯¶¦a~é6)œÁ¸†ê˜Ø­dÐÅ'­XGÇë‚Å×>Ã<ê©Î~…ùpXîp€¨;?WJÅxÆ ®ÐÃçS”åˆêàðí åWÖé÷´°Óà û÷ž¹kâð~¬••Å ¾¶sÓ)7Äúæ+Ü¥»HÝ >ñ¸¾IŠáªMZ@ªÕN‡iúiðƒóCª$¾ÿ;žÞ…ùn4Ósxf-¶5>±©_;µf;žFœgÖ,[ªŽß]*_2$lÎŒ¸¤eȪßgº°þy+€ÔÛl¹èæ‡.Óo~B*»-—ìÇ<ÐÝ .ùëAcãbq1 wW‰Å,R|«èWs6N]÷#ñ{Å]ˆcJo¯?lfÿÝY»ùûÿ°x‰mY,Öù’Y»„>Œ\ø[_R­»OJâ.\g|xî@’7ÇõMí\ÎýCv ×]Qî|ü æ³ÑíýP„ç[½HÌjþ ÄÁ¬´œAÌýc»>{òã¼¹éÂÃn@K› ßG?Š¿ò›K³ÿ®ÎdçjŒŸšð «~Ä'å@™².èçÅ0NôçÉ5sö¹ï¤¯Àû5".žIeãfB ÆeÓä+|oÊ—¯Ãþ;»‰Ôˤ}úþ³³¾@ºö¾Ò—Ä:òØñCê~ï–%Þøãì>ªô$rN׊½uçwm¿Ü¦‚¸íD Œ…c»ª‹G½ÇüòMxˆø¼'‚O~ â‹g¤ÇåÌk¯—Âß#0¿.‰_9‹ùqU²¾`>gäøîlļu\ W‡ñ‹:' sÒë¢õ~N “SjO—cÔÚ…sâ9Ïïã³¹u²€ž*Æü¹X´òiÆ/WèõðŸ¬Ç[F¬þdÄ‘þñ›ˆ‹å¼íÏ`Ün¯sùú q¡H!…ÖÁºŽâñ»€ø²ðÿ)îÌ㩊¾þORRæ$C†È”2…LmRJ%ÉÜ@æyÈ,DiB)4G Q”’¨*’¢¢TB…î9— I¿u[¿çÛóô{þÿýáµï½ç}Îgï}ö^ë³.÷²ëÌ…u“q±p@ ®Ÿã1û³8(ÈIî÷5óÀ¸oû|¿×+žyœÙ}Ú÷¤ÜàþÝ‹ ÉøññAÙ’qˆwÅ>:@>¬äåí`FýÁŽAÐ{¹D,¢ïa¼ºÙ%qéuQâAЩÿ©}· Ö{}Ú&©ßoZg>õyÔLŸ2Cåúíº'á’y¥{@ãR"\÷K‡Ê°Ž{SؾÃý|¶\™ça|§.øÜxB ·Q-xþõÈ»v%¢»²òÇ׆GüáO càºØ9؇ß+Ô}.þ~õšõ÷Iô±ÒnkX#Qš|o"¡å7Ûqo$áâæEe„1SõR׆0~p1]NS­.a›# 5ͨäEe#¡xr*‰G0¡DNÕYù(j^†Ôm=B Ÿ˜k5!”Ðy !8.ZklYC(q!éåÐJŒD¦ò¾'ԯƃ½Â„=ª wêR‰²ÏGY„’ê ž9dH(ÉÓ=¥3à¸øK K/Bñ/÷Ø,¡H(¶L+-ÖçÞÙg,­Mâ€~Ü©y¥öDPúÝkr3Êpœ§Á ú«™¡0u/ô½Â?\s"”Úk©}MB-î°/¸ç-ç:¯¢ë í9_ž¤ B‘í©%0îÕr|¹¦OeÚ~¥o'¡ÖœÑRÐ>J¨ÍénN==„²¿Õ®“K¨MÅÜ]µÍs\OL Ž;þÐhƒù°àÉ x©K(˽ÎÌ%”{þéÝf„²h½©ÂI(—λ2F¡üóv» ó|`-•bD¨3'á1hÍ.L3 ThÈ‚KŽ9ð|)ïÁöPBùMÝšÔ'T€îš]®ça)¹1}¡¢µV íâ"TÔDq”Ü!B…ÓUóÞ´ÂsƲîÄm„Ú%&í°l¡bä}äãົn{Ÿx@¨ØW%á„Úrýð†,käòjÁ@Bmp›žý_¥è¬=T ó¨øLÒVŒPÆÊáa B™<›6O$æÁ]ØjM¡lZõ å3 eǽ©‡Ö뺕d—=ú{Þ*!¯ì䟬ùM–ÿ×;ïXrλô|öNX.W\ò ‚ùhí.‹!T`…¾ÌêIBywÕEí"”[÷þ¦&BmïµÍ ž·Lïìµ$”‡Á¡û°nݪç˜Yõ*È]îì‹ÐŸ^½a=†¶ÇÜ;­=×­0k#zÅæ±æÅ°Èîs¤sÂÅjÂ`kº-¢4F¾…Ÿ¼>`Vóñ¡Öª;ÿËâànϹ;!Opì?Ù}üyÀÀ§6ÂXØøÅ¤8òê.¾À2ÈCÓûÕ«û |ŸêË?£ç¸òh0Ä­U\=κ±?TSg¸Ú‚?>Ê6ñoKMœ]°3ä…ŽNÕ'àŸ\—óÖ‚¼í\Q9 ùÙañ‘`y,ÿ|Tïøv»ûGTjÀ—ïL:~àÚðÙÏÁŒL¬ó„|â78|åcÛŽÍ% ïU¡_fO†¿æ¼¦%–ÏH+‹€þ„æÇ­¹ùÂóAôÉ\È ~"ãVàzÁÑN Áø#LOLÔßIx©çWv òÇ~ßùôAh7}o+cý~áaÅù°],¿wÑ~ø• ûEž[ Îg-ÐÈrbùQNñ.3¸dÊç¾3Y4µæ%OGmÇå\È/·»OèuÍÜÚ'·àyW3w=Œëþk«‘âÂ(Ó—œô?[¥ŸÉ„øßpÚþ°ÍVÂx(û*òoŒ{w¿:<ðú%aÉ*|½»öܲuàó®ôôzÚ²úû5êKÆ™}gígr•ÊøæðŸ’R:GUAÏ¢¨Ï ÆóbS•¯ôï­ß·ûÉà[^™µ7'ÍR‘õ{›–(W'¸¿-jî‚/nŠ\´Tòr‡“bãõ„ñ¾ýn]3øÓG“)ðQ}ÅiÎàOú>„e¾Ïƒ³Öik‡£–<äÁÃÅ-ž°.(™ ¿>·ÆXòáç oN,PŒa‡üt8ãÚ¯EŸ. 6¬“‡üT7Y ßB(δé¥3“ ðµ¼åßy¢En~Ò%B 0n'|*„¼ð£-âÄ¥9Rkc¼ c²åð°U>¡¸Z:«}¡ÿ³÷È^Ö‚¼ÒùjXü#¡xoÙ­uQ!ÔôBëèIا\Õ½ýG¾Âë2IqŽ×!ŸXf½µ¿:âîW8!ÿŽÈ9¹ öǸg•X øýáí¿§`Ÿ ß·Õ“ä!ŒN_DSX¿ƒVÛ€oûÚ}â"ÄSŽ™&GWƒÎ’H‘LÈÛÙfY4øú垯õ°ž‡{ÖôOÁ:ùÎÝd2ñ æGÔR× üc«ÂÜÓÁw|N =õó‡äÓûbÁ´^w×Yóôm[ÏÍßP'Olô¨ñwû{½o#QýP×½í¿U& ¾øzvÛûBðïÙ÷ÞK<?– ¾b¬«=£†ù;XunQ¯«T¨Þo û<±þŒ/@W¬: êo‡ yŠàC•’d’¶Àúý¢ ¾åÌêA¨wÊœªØ÷/fÓ²l‘õpºáìwÏ¡n¹`ûs&Ô5{çh+ɃŸóó½7Ïmö}`ÑaØ/6ÛÈnÛ¯ò‹P÷Ø}èŠa|eÅ­w½sYŸ—«Køu‚µv»ÊM8îÈ£+"DözFÙ›`ý[ÚçþîƒueÝ×û=Ʊ½Ë,eÌë–±†½¡®ÚV«Âñ£êÇ-¬ïdz¹±ðšÄۆ±ý/« .ž´¤%—o­¸w7 æñH‘ò¯»P?Çß\Zcýêή[üá~ÅŒNl| ÷%)fG=Ô¹§‡6A<à ã^œ¯©ŒÈ^ðÉŜϠþr¹xmG5ÔWŽ¡2æìPÿE }¼4óWŸXy âLP÷Ë-0©?uØC ^œšË¨ßyHãƒõ=ˆ[–z¯×A\¼®7»¿5|êØ©kO`=õ( o/VßÖwâF öö£WnÆ÷™¥C|SŸ%ËúÜMÁŒ­<ç¡þ+’J5øP¦–å³|p)Um>´ÂRSüœßôðô,uˆÇm©oGÀ:é.»ù™âKOÍ3aàÛ¼¢¢Ô`Ÿöõ',‚¸4È2ðâÌ`A…ب¨¤díÚ„ÁäÝgñòËÄÛ—…Ç nÿLOQÛªëým¸ÝMØGÔùDÉæ‹„Z´ufï#à%ßÕë€O’xȹþ.ø-Åú7öà¿VpÝeJ(±°¦õ&ào¥-×Îv¶LÎõbäsCKMvµÏà6›œ«†}¹&%':K‚Psd[|ÁЯ úÛÁLl›°¹M(gO…%¶uО;Ü›>Íeäx¦èø}\h&¨M(ß±`_^èOÄ{Ë-íQ„Š— šÌ‡8³WfÅ Nˆ3!‡7M·p#Ôž;.O9åþrÑÊÓÔ*uÀÁ´‚|ÕAö9µà‡9?ØM#Ôát‰¹à÷¯½Df±¾ïÉÒÚü4øåAð«‡ÆÜÏç„ÁyZ{w*Ÿ!ÔÑ‹êba~.ꌖe@œ¾|ʳXîÃåégsù*Û‹Wø&øÂójœG¥K•¥þªþ:ø©Bö’ðÙ79dæ4Ž@;õ´4ßPßDºŒ .¸z`VùŽ¿¯ß8.}‹såPz†Þ|B~Ò“é»Ƨ&fz …Pq³•FÓ ur»a .Ü·c¼EFàœ^þœÎ;+ó­m&øÎ3…Bÿ2üe.ùB¾¹peOÆÍÍðú·¸VÍB]jù 0“ ý›ÆwóÌç8…͇á~Uw ðËÀ}x1$Ho%ÔóŪW'ßê¾MâÏ30oµÂò»ca¾kÙTg÷ƒ¯ú`Ùú|{•dº÷è,BÕä)è^&TË£+†£¿Þhx¬Ö„~½ÎaÔÔ‡ÿmßy]Ü‘ÑG¨ÞÒÑLð™_å~ Û Tû@{Ñð³ïÍÛbüŠP—3¸ê=]e@ êÛãÖq]uB1—Œw/€ûýû”’ÝzBs(øÉÕz:¯מtBϸ}ã7¡…?úlww ´}"•½ŒÐ|\ë>„_'´é?PÙòç8ß B .Ò*£>Zd ¤aß=BËÌOXzb9¡%ïØ´$ôR/—ôå!„6TXi$0‡ÐF ±O‡{m2åìÓÆú;PóÁªÙ¹ÐÖ?ÿ¬mgÙŒÚQB\ñqJ‹#´q‰RÇòu„6?¿_+֘Ж&ú„k mQº>Îñ´*C„¶:³Óî·Ï–&²m„¶O¸W[¯¯ H—¦Ì$´µvyqäaBÏU`ã:ÎKèiÓö¥A3±·A4ÔƒY†Ÿ= õ¬ŒKGŒ›P_:D°nj¸ž©#ôL2é&÷ æAá~©ítBóÚT UjäÚiéMàë_H8œßHõŸ«ª…ûÖy«;c—+¡Æ>F÷kvÂù¡>««ZüåÛ=Íw½Ä|%×z>Bk;wZ‰(8ó÷ñ×3Bh~sÛöïê„–¼úƒ¯’Ð ­yÕ2®0ÿ½×D÷EZ—·ð†º2̧ë-ÓB¯H®W’‡y®9ä¾ò1¡ÍÊŠS ½>YPò¡×ö]NT€üËaiÝwa°»%ü‚|4Ÿz=)N*CÌUPÇëúÏZø#0 Úß~xD†/9”º Ÿ®88Ñ”ù#qáþüFÈgǦ«²¯„ÖCbÏ|ðmŽé— ´·C~¾zt$Ð òÊÛù‰ úÇhÓÖçíÓÙròÁ·žÛvPF_Z¬´Š3¬÷]Û·Lì%ŒÃOrö;¥°¾çB© üWb²‰O ð7Ž«;‹€ÿ»o”}^òíº åà‹ïÖ¿Z|ôsƺńq9‹|~þæÆài¸îÆ÷sùyÿ%rC…õ÷¸³#K ¯æîþž y¯pGòbÆZ8¾îÍg6È3ª¿vs6Ë­Æõ¾Ò~ ýl¿¼Óî+˶G&úCË7‹ÜîSú´ ÒàO™²gfR“„Ñße]u€õ¾ÉÆ™¯›ŸzÆBþϰ—>ï ~êÃoÎYw'"“°êg‹©í,Ÿ×-íÜý±º¹¬ÏyË—®»õ¥ÔSÁÖmÐJ_2uƒxÀ£?Cå>ÌÇwkßeoŽƒ/Ôôñ6øZz £,?£Jâ}”vøý¼øëû¡þ>—7Cm üB¢N€­g䟲;3€w©q-„<—«uXiøõ"¥“1‘å„Êl3^£¯¿zÁc¯ßw5_󖕯ˆi*ø«%Ú“S„JLñŠ„|”¬«Ÿ©ù5É0]QÆôýÒ!Bù´G›žt T¬È%9¹`è犜î²å/£í†ÚW*‡VÔƒþ¤/Ž<ýMŽ\ôQòRªUFµ¤/ŒûîY‘<ïÎ9og¬$”»ÑPe;ÌW˜…m1H(ïA ‡}à¼9/²âÚ^¦áƒ:ëTä.>[È3)¾RçmŠ!_ÊýþÁþÃgžÑ‹¼RXG]“!6Ð_Qy×#ìׄ E]õa?ô¬l|˜ÆzRg¬ûŽW«½²ÀW6›Kí†öÎø+Çð¯Å/Í_ÂþxôÂ3ûÔ ¿âã—M̆u{9WLö[ÕÁäiê"Po®].\þ¼=Aò†>œ×o¤Î¶öó;«Ç‚«ëáz†Bµƒ°þ˾rfý~!í]z%ÄÅ„®ð·iײÝ]à¼-Æ›Þ@]aÿ®Bö3øèT)• "Ú¬÷}™¬÷iÏ;¸¥êÚã–üÒMá¬8Ux»°™U‡ë_N†z£ð©gÐ8ÄÏë9üé·Î_ùðØêvߚɣ„ñf[HÁK¨ç;Ò«Ž¿-% Æhkû9©c×_=àþìòدTØu> âC—Æ[ñ=0?#£ ú4¡>’³•›û·­WñÚ ñªøS1ÙÉŠ‡m¼»Ü¬÷‡Ã þ=ëý·™ëN}] qcW‘•¬?Iq¥[Éõ8ò^ü^~ÕüiÛ }ˆ;aêŠÇæ[ºLÀzÞÚÅã õ鉻u°O¼ÒO Âúyûn}o"¡ddmºîG(¹ÝŒÉ¤f¹ ÷ƒ_ÚxÝ´D«Šõ¾ÙÙcÝWåÊ}ó÷~By”ûŒ¬„¸fc9ÆŸ ë,ÐÚßÌõ¡<Ëtî‚uéY&ž5ìû]ÎiknOwªZòֽʥ<.ØïÑ“G£×ÞeùR½¶o°î¿÷íüâﲊµÏÚÊëôÀwÞЖ·zûþ¡ÑÂaˆ_izÖ«5æj×*ÅK °Nñå‘UBå·¾lªô}Ü—Ö¾¿™P·Ÿ>néƒ~ŸõSéóŸç+˜»|÷=‹ÃÌOu|‰Öˆ?çõ.+|¿•Óp'ÞÆÿ] bꡚö6Ÿ—€}ÝöÁ¥ÃâÛ§eE³<- õJzÁvˆsÍ'LD À_3ôåÝk&ô¬a­«OwzÎ+m§„æmæxË>`aFŽÒCŠÐÒAŸßJ€OH­\:ÌFè•êŠ Aà£LÙlÊJZåØ5×Ôcà§šOþxýŒÐ:<\Ê*üàŸŒî®µÞ~Htüs9ø7Ë«µ+B mËûà]æ$ø#qîýågÀh+¢¿Àu%Tß:?‡ó´ ŠÞÜ_qMuGš6ËW|㶸Åò_×O|) ´7祡%„ö›zræµ4´Y[ìƒÁ9/h½!~ÃÁæ¨j„&¡wW½_DhÿÔ±ŠG~™ý4øÆXy|/¡_dçB›vBì½yÚ¨‚Бé ·ï:Œó»ä‘ó„ö½¾t±K ø;;®=9àƒT îo}@hE]™²•ó ½ÁÝÌú©û´l¾¡Õ;æ×‚/Ü zÑÏô7ˆ]Zm¢BèͶ]wß"Q[˾r3USÿŽ{­Ø®¼üe@¶\vø­H»UÏÁº½í ÕMèügçW ]Àÿó¹]+¡•m021"ôyq9ÍD˜Ï³5ªÑàcÓRyžÏ#tª£À›ðÍgî*iº\éÓ6ðu·oU²¯ß\R+>°ü_Iã™ÆðËw—ß©b}/m£b•Ó­G„nØï.CèšÇ·nÃuïWÆñ%úx&kÇÛ±‹ÐwL€yÿ\$1.`Hhj}9+#Ìœûk¨¶¿-gØTé0ar?þª÷±0¥Â–ïS,'LÑÜ"Cœ„)ÉU°’õ=­µŠÉ‘/àøÒ¨êK˜b¶ñ+ s‘ºž|‹>aªpÇ÷U¦Êc‘úž¹„i2µïwïaÚó'ýJÎá—ÓÞ‰ Âtrß½•—‡0]­¥6¦‹Ðc»{„é¾xòdsaÚÒ[7Ÿ0=×w Bÿv~å›ü•0ÃÄèæ«Ï3ääxyy>a†Ëˆ<Š!Ì ŽÇš!Ÿ'¼´Üz“0#Ÿ ZO'Ìõ»¦å–„ɳeߪõ°ž¨fágñW ýIyi–e/¡_l­/&ô‰¬ljÜ·G-ýýp?_¸÷t=ƒzfâáOq)aœUº¶æ¤ar\r³®-#ì«h¡3¹S~¶Ÿ…ùvåŠóù÷É„l9þ“ÐÝK÷w$¤zô%»­Æzœ÷A{Ýû\˜§÷ÖÂ{b Ó0zmçš‹„¹$b˼tŠ0Zé¡Üá~x™¾{¼‡0åÃÍ$È.Â\»ûÊëo„©döü\¸a®[Òqr̯F‡0?aZæ½¢áþmÖš«4ßæñWI¤ƒ0}¤«ƒuaþÝo™K\øçßDq¸yûCÃóç?I±±GA;ë„ g÷x,„Ûüð#ûç‡Ãj¥ÙnúûÐì?7˜ÿç¡ù_Àxƒõÿ}ÈÉúUZÿíÉ2µÿöD[íŸNq†x‡†üÿîŬ ÀïPïÀVOxYógÜøþ*!ÿ¹õ¿h!ÿ%ù/íÈ÷h ß«Šú½ È÷¶ ß§‚|_<ò_w£þ×WÈ÷Ë#ß|ÿKäPPùÁ0äŸ"ÿMù!qÔ D~¨ùïó‘ÿî‡<Ãõ•ÈS‚ÈSžÈS÷§ï >sòLg䙥Ès#?2õG¶"?rùÓ‘ÿaü¨ ê ?:…üØfäÇò‘ÏEýñ1ä'Ì‘Ÿ¸ˆüÄò?™¨?¹ùÉsÈO2ÿµ ù)cÔŸ:‰üT?ò¿W ÿ;ýßÄvÌÛÏø&v]6lìÀ¶ëß4­ã~‡&ò‘çhC~ºòœKâ±Ýƒ<ç[äg(#?#ù™1¨?³y.9ä¹¢çzŽü¬g¨Ï-…ȯ­DÞLy3Oä×¹¡þº;ȯçA~½3òëK‘ßpõÍg"o¾yóÈoœŽ¼;ê[Ø oQ€¼Åò›¬·Ü„ú–¹È[Ž!¿ÙùÍ‘·:úVLä­× o}ykò6ßPßÖyÛ“ÈÛö#o·y{Ô·?†¼ýgät‘w8‚ü–$Ôßòù­šÈo=ˆüÖ6ä·½GýíKß¾ùío‘wTFÞIõbwjD~Ç"äwD!ïŽúÎÏw‘BÞ%y—:ä]£¾›(ònþÈ»=BÞ}òB¨ïá…¼Ç}ä=ù‘÷tGÞËõ½Ê÷ž¼·òÞ%Èû£¾/'ò¾Èû!ï7 y¿ß¨ïo¼ÿeäý'‘°D>p#êf#8Š|Ðzäƒ. ¿3õwRȯF>ø,òÁCȇ  ~(A>ô8ò¡}ȇ"®‡úá)ȇw#¡ƒ|D2ò‘‡P?²ù(uä£ö#ÕŠü®w¨½ùèx䣛‘QD>Võcw!ûùݲÈïŽ@>.õãž"¿ùøÈÇ×"¿§õ÷Š ¿×ù½O˜‹ü>Ôßçü¾rä÷ó!¿ßù;PÿÀ-äÎbñÿýÁþΡlXoÀ«j®EKù/YäöoY`ê`âêü÷¬¶Ö˜[ÿË»»»™­‚‚Cˆíÿ•æü¯Ú‹ÿ98+80bé<ÿÛÙ®~Î!!ÿtƒÛÍ9Ôy©G0œÇö§–ûŸ§„z‡ú¹ÿ3TAkowi+÷`o÷i w×ÐNãq t ó‡Q;³ ¢N_hæ.½Î9@ZCMZ]GoÙr=5mx¬¦+í%âÌZœ¬ËÍþ æÿèk(£î¿ÿá8ÈÙÕ×ÙÓýßÁý÷þª~þ‰dºƒ2yfPortfolio/data/SMALLCAP.RET.rda0000644000176200001440000002364511645005054015635 0ustar liggesusers‹íz‡[“OðghÅŠIQl6• б *M©*Š$)""5¡wé½Lzï"‚$ Ø°‹A9¾&p÷óîO¸X×ŸÎØî¾iŒg]­À§JxÄe\¶cJWIÏÇí ý߃+’?C”$ðÎe»œAk1´Þ(+)ŽÖƺ­ŸGáÊé±SÛ ¤ÑúNûçEåpü_îú| ­nàjÝ=ô¾2§ûW ü—õÇk™¯À‡mñÎß ŸÛÃÆ¦rx÷«@ÿ²Š•s­$gÞ‚{¢ëw*/¼ þ]žs¦"ø'޼²¼³ïd»é²óDsOKï…ë¢ÊÎt?ð×Í|¹«ò,ZÕ Î ¹8 ~?Uš9(€cË&Âêü4HÿåÅ‚=D¸Yâµ¼æ– ¸ºÌôû$bΊ‡‹·aÀå ™à“(àR \øÞÇ ÛŒ…§Ul€‘Õ*cÙuo_r)›¹~)%…¹Áô@ÿ÷vKŠÓ•нÕ2}N©0°æ[%.I"{Àžjö' ™Ìä…»F!ÁÈc™ºöŒ®–‡ÈŸÝ°ÕþFow$”ìQbýúÒ‡¹ä#öF5Œ“#*x «Q^ç#¾Zé%qçÎ4QlÁ…˜ÚЗp š·Ë’[ö=‡TÍv©©20±ÐÓ¸.ß\¿»gçç9@f÷J’UIXyñ"ùÐý|tñ`ßæõGXI>›rSxú …ÆR½jEŸÑÔ£ÌwwÐQ,êîî5ޤ`æ*uçåÊíØ0s7éUŸ;u‹†’1jׇ|ÈË©£Œê¢1䉿{20*%—:ÙŒ^DŒ¸i¡Û¼ä¬(÷ƒ²àªá“ÚvÈ/`po—3‘é/I(ÿp[­*hz:-Pp8Pzúc-ÈY©c8š‹ŒM&‘£Ÿ`@ÆVÒëã0õÄ4ÅÅçÁfÍ—K%¸I)ž›°%*Ž¥ÔhCìg2‘}û2Ô‚PK^O4ú$Š?|àÜÞ Ñ_²h3m~÷Ü9ò7™§Ýâ}ÿ1¦;*öZA\Ãægý!¯™¼ýÏs`e•2<W`yñf ÛØD¬.=JϺÁÅØm«n¤ü…²¹g>Cñ`¡[jðåoñ¨H±‰Ù|»ÍÌ\G¾íÀÍ’¥•.Öh’ÙM}æw¯n Æwï'.! bYavŸ˜O°fÏ&/þ õRR$©Uk‘QÛN9´Aò] 5Ô/Û+C›°ª²J(2n3ìW A¯æøOó‡hXòm‰æ—MÁ3%è½åBÌÜ»,’þóVt—ˤêCí™e„‡œRˆ;lZ"N˜ ¹;×ÉŠJ‡ sÿaT õcúŠDwa0-HdhWz¯ÐØÔ,…‰zÜâ3Éï€ÅÓC|°®æ¸§$;¦.Í§í€ØÛ§¥/½îlÖxÆ,‚ºd9Êö€PÌMç‹4öCØ‚ÚÁ”,³2ZcÎÆ Ïr²†ÀU¬›16} ä·“Jý²ž|‡cÃÃGù‡û?,,ÇX¾]«dY[ÃEáñí+ĦŒ<¼gŸ¾í¤g9º™Ý:-i‚Lµ:Jpœ1V] ¯+Å’M;þPo£ïT¶x´ãLhcŽŒ]÷ø„µ§NQ¿9c¡÷ò°I7m?5vTt/Äðõ<¶ù¦kóÂ}Xz’Y¾ŠñùNñ`ä.™^ÏÝ{Ð]$ßnñ"øŸ–>¸Å°,—I“„‘o? ª™¬!×ö ãxú€«õp^ÂIÈâÛï¼ó=½³?¢ÎÇgƒãò6Áhä±$T!¯QÌ%ÓhÜ>…8ÀÁöLšRQ t²ž§~u‡Æ'Ž4‹÷Z~e™è”Xl°xŒýòK cBnøûÀµ_¸³nèCnd°‡Ê&ü&ºµ•lôÆú˜Ì± QP”_5FjBFÞË>ÆÇxSó×,õQ!|(Y}ÿQ#0:ïû-0õ_ùJ¬*b2ãË g±Çýx©È{ÃÝÍŽƒ^ ‚¾‡”Ø3KwAÈ@àù?âîpmÓ©+Û´¾A¬Éæ¾íá‹!–c6Va6 yw|ÆŒj äü‚9ã±Ò&šYüü›§6¿†ï*Ô=£°¤0²·«_2”¾I ê-EŸK­:‘ŸX;ƒìNïǶ™·Éá7¦GEʰ/Qš¹]^Ÿ>=T9ŠìYbáÍ+ÿïß}|𽉹X>g'@çÆy— ´!{›@8Õ‘Äž²ÂùqÇ„£Å¹æÌÿ…Q«>Ë~xE?L¥7Â'àÛKÌ©²£œÍ¨ÀDÅUz™ ócÍ’W%s±ùúqâ-æV™ËÓê"Ðè¯Ìèë7„’¢8úÖQ( ms91ß âÃe|«²Áÿû*AR÷Äì'Ä(«Dª>íÉ2 hZYCpÖzŒ¹5añ­ Ðúg>¦=©ƒì¯½ô©š¥“¸Œo×07ºS Î<Rë¦=÷}H„"©T¢Á8.)_|„:ª<ã#¯I¿T:e«ãÈ' Ê0éû×­?ô¦BˆüôR/—ç­XB|±2S›-)_S1që9jïJqˆWýºSÕ~]—qÍ<ÌZX©9@ÿ•Ï~Ql:P¨QÎR § Ó׃¼HèÄ)ËoNÖÃ@nî 7™^ŒÑyç¤xá.°›)´¥6É«ùhÌ÷û&HZôçík=¬ªžA24”† ENixLÕ¡f… ;RŒ^çÝ1þ~‚ªwžBUÛZrEÍmœÈc0åÂÇN¾jƒÔxQ®TL F¥Åí`•|AòT–û†E ˜#ï 9é?&ðG`ÌÝ]kJR 0ä%#ËìV¿2Ð8W¼Ø*iàNñ‚‰¼DžêAÂú…•XÔõ‚ùêc%fǸÒwÑ!wæÚ(©nØeœ7U ©×ÎŽ”mMßo«){æx4aQ0r$n¡ÏGöbͽõ«¯2f` é‘¿¥ ¿ÜùMaÌc« Vf¼çÜØÒ¬øÊìù§€>•5ê`µKòf‘NžkÂõîZãï˜"©Ì­€üŽŸ†&íÂxýÙj7š¦ä¼ýæR_³ÜŒòÎí¼P¬à`†hïl¬zãÌx¥º 2ö/‰ü"XŒ9úâ´—à­äá<¼+–ãÕö>ñ 2ë¢ô;L¥xhž{g<~~½.,¨•Õ"¯tÆÜùï¨Ù'ÿ`ž›ºBµ²¿LW/´=É¡aìg1×0úÖU>¤ó ‰œ•©h½¨òËÀ­8¬¿¡MÕ ñ&3û§¿ CIÛô î…ŠæFÆîòzhVN™×i‰ñQq5h´AÖ G²ag4 < »?òÒÚ6€ò¬bNVÄÈ\¶‡¾Za*úúz-<Žõ~ÂjéÙÂÇ—É;Wû鯇¬¥§pD,ÓW¤*å¹i´œ$¿ÅâÚ?ô··{£—øÁù†'lÑCYŽžpןΰ!)³ÂªlyK®cwšœ"¾H²šôÓ)tˆÈVCl Ôðv§añ—U¯Ž4¾?h9v”¤\â2™wËqS#9Il†œ^š³ù}i08¨f%ý&òi‘zrš„CPɱӰ ÑçK Zjßa’wð6•¦>(~ÖÜ›ÙýšfeÑ|÷†r¬¥ž´Ð†û­‹§Ïö„®§cÑ€Åþ@Ús6ʧüИó6kCBÔâ&(ØpžDL'b{ uÌòQžæ|¨ š‡ÿh(EaÇ®‹ã1lÕq¢ÈvXAí3YÔǰ"ü‰èt"Ï‚q÷ܤöO3PµZÙŠZ)įË—XÔB©…N7qA†ø*±ƒÀΜk]”1_,O¦ËÓ’Ï…UO‘àæ«ÓYK_?‡‚Zyâüâýår›¹Wr :of~_Xô˃ÔQ‡2Œþ¸ÙtÇ*VŠ®üÀL  Qï“ñqvûFè»S˜@)ù…ü¸CpÆ­þC=`/é»ä<˜!âaá¶üã NWÜ£`iýl8sh{ƒbÇã)x‚ïîŒbµÓÚœ’k¥D÷™x/˜qÍÂEÐnƒìök5b!ß?Dކ³!êúïPPû32!úOnF·AÜïËÒòä&ñ O`I»¡ÁHòJde“v A¸XÎÕØ¾4,k’!› ¯Â¦ß]\‘‚hr̦ºDaAúCòEÑ`ùû3Ò,–`$oýðtZÁÉ~6æ íè]IŸ‹UÑ[™"Í›0ú¢P˜Î±`Èí¶*U=˜õq3µcZzÚø*Ã#…ţ늞búËã3Î]ĬŠ)Ìo¾:^ccظ¢2~=“¾µ^ºúv3ˆ³7Aá^yÚ÷Y`ª/mv–ÀÌ”]K¹ún¯¾µ4·Q–¾¡¿Û9Šëëñ­Ò¢‡hºK!ÝÀe1-'αð‹‹òq¤+‘e†zPêó›µ¶= Ê{¨çB—âÝW—ŸìÀà=飿‡ûð#êcœø,Y­¡ô¤øyÈ0Ž 5p1NN¡¤Mî!DFmgAÔta××ß.A®˜6Óák9Çd ø˜ìÃò -ô ‡ŽÀí¤:ÃßGµÁ; Ö u]kFMaà [hû¨ Å ßJµºÖa¶"Ió‹ÍQd\-ý5ä&…àVÌê_ÃòSeâ;ˆ.aŸ°üS"g^²?$Õ»Ó»*ÿ`æÙ0¤èÌÂރʕa4É” ˜b-òŒÁ,Æ<ήÀ­·[ã)]õn;$æÊÎp®Å`×]¿[îæãÝǽC–1Ð\F ]>ö•œñXŒ-•¯É®¿~?# é ú¤'ÇìŠaÒFãXþøÅ&~dTI¹ˆ9ÀD{Í;FA`7äóâ.Œ[aL+à|†ª}¤ßýÉX¾B…Vp/ Óø8(kg‹Æ_¾PR~…Xê– !IIôÍQEÀº3Ÿ‰‡dÞºðÝ®v‡ò•_@?oÞR%E€¢¶kF) 1È—,•––æ._Ê$Áö*Ìú5‹ÚÎCúÓ=곞'OÞg5ªú’G7›[‰VyK Â}ÛXûµnèÿ‹ ¥VXrÍŸ|'îK·¬t€p»ÛZj;q".Ì]WC!ÞßìYÙ ½{¬‰|+²ÒzJ¡•ãoWX+z2>!ÛÆŒè{50öR/¡†„‹IÇU/cøõ2Ž+ñ#æog< ¨àïn|ÂÊ@›7-ÃÖ7»¡RA™›|2²>uЖ%¸»í0A¶0+ö΢-«ˆ>oªE¶uÔ`‹àbz•x°—o¢å±« m%-S¸\M×\þÙªŒ)|œÁÜñ‹Úª2JM¤èáo½![Ö25ŸiÑRÍ‹ÉXöFrFsrä¾9ÆBµNmÊŽ)˜ìÑÇV½i†AÚ-Žb>ýèÊÏCå_Ò¦zZUÀ¸˜ø_Ââ¹Ë5|½ƒøÂhƒÅæ pU‰:ãv¤9öªaÑ™û†ËZP(2]½lúQ̽{¡·(/cæÍ“}y5šùï‘ÑíO)"T¡Ë˶m&íƒc!puÜ^Üœ?_fSà7 {]÷âªd4çö½Ý“!÷·kèöFˆñðq j†´´ýþë¶#CXVîÁ2Èýð> „%kNpâô!9Vlwb6DõÓÝ䪂 Î♆âË@8á-3´d³XÂ>¿±‘‡¿'×iÒÉMHÅ2ƒ/Œ5šâȶ3ãRêBcSu³ÅO(µžKž6 ™©§Ç,,*0\—Q•«rŠoS¤‘_aUò^Î d¼ãšÖ\¹q´¦ž"öº© ”ÒÄùÂPÂ׿ü%wÕEΊÀ#sû˜ë ðð šÞ‘ гq6…Ò4rxçŒÌÛ7T` O«J‰‚$T*ß †"ÿ™uw* î霱‘’yk¾hûÆ |`i´Båðõñý%·Ÿ¼õBR8¶á7¸[5êô‡óqµTÁœPdòóUzÖœ¤ÙXÅ]EÛÒΜõÞðë÷8ÙTþ~5u7<½þ€´±N Ó·~úÓ[%|û7q_‘½ïKßÕ úz¸}È-¨ ¿È©³þ ѱ]ÏBa’ro Ï“€=ûWQäŸÞœÌ/Æí¨6fŽOÚ¸œÔ3É*Ïá‘zœ‘Gî.Ì8–ár:Fø~k÷™u¼ õ§KÏÙ‡)ÈZ"«)Tìå¼{ZŒ•ScG0±xÍBjÏæÇÐã+ÇÜX»Ù/oì€Þ¥Vô8î,¨Ð²Co,ÀòÔ?­ÃÚšNþÀÏocÄñm¡ѥ}ÝnÞ¸)¢¿–v†NøäÇa0îßà|·$JþÂÏ÷¯ý÷^5òŽjNÚ©‰üå„ßÅ©ló ø¸poMÜ/Mú9¾ÿÆ ùŒSZ“’{ÝÆño¥2uß™p‡Ÿ»sÀ¥®yõ:¨º¿‰;ïT/f½Qd.uÁü”¦oS'òöØõó>¹?Õ>ñçOàûk¦Ù:á ây÷“ëxÀ{?ÈÃA“÷a,wQæù¡ø7~ÂÏCþs uEèØÀ¡¹E`´‹ªÜ³Žld•.¢8ns…TKNDê÷X¹£šª&ü{h Óàn;ûïþyè%®B ˧½¢½9•eu*”·‡`ÔÞeáú†8eRoݸþ¶òŠð$¿TWp¤ôÐn*#xÚE}î­ŸçÒ”¹ŸàQŽŽçt#Tî…èëç1OcŸæÜ Ó¡pá-FuÞ[Èzq‹â|þ4<ø r¡«0:ÈU@ÂT²®ìqþm– —ÞÙ­U€Ì;˜2‘Zg2‹.|>"¾í¡{Å©a~×M;Gœˆ¿øçŒÕK#7?™i'šGo ÄŒ­sY šÞBµ™?iqÍoLâù[ŒÊŽÜÕuÌ|D¼äöc´øÂ?&ÝžØê=ª!ꛆ¬®4Îê½ë0P«×Økã»Æ"mü°åèQr®Ó­É¼ ×LžOü»ž¥Ó¦×A£´´ŒÈ«Dèà÷/S•&ï¡ü…®7?T½:¢ܸÙy°ìÎ#ä*±Çz7}š|?í-ÅÄÇ䥘®ã(0ÈyŠ Oó¸•;²1{€¡ÿH «ùr0!ç¥ù‡{£k'äëÓï³ÝIýx5~>ðî%&¤äÿv·‡‚w>í†ð"Xp¬ÍQzb²×ÝîB¦÷¨æRk+ˆ²;ĬþŠUä|æ‰?ñX&qœ¨f“Žm²ÍXwëúÍö¬’œöQÈ«HØVH¢Îí\ƵKÁ8ŽßhcYÁбZZØc?Àƒ)àKNx&t=wR_+u(ÓÆíÒã—« ÷ØrhÐl'QN†ÚZ âcR½ž0¯ŒNþ§ˆkâ®S¸¥o‡{o4m¬žtZaz§LS^þÆÜ+ôl–"ö!ug ÜóUõ0w„‰øbÂîzóñlìºdõ3ã±yuH‡j¡EàÒŸ ›Ó&óã5|¼¼bh¡]ÕcHÿiÎÝ“t ™ÇÄ™Ì66áù~UxÒü‹9ã¤7äfg³:ßþ††c•DÎESH_+ȽïQO÷y/~ [Ö¥sM .C½_-ÙåÞ(ûaCNu¶‚r±c”ŠáÉèRŸ={Ô÷ûæ,ÓêÊ„œËœwÖ˜ù~§áw2e-Cs¤ ý@9w•g äöíUâbæ{b›ûO¨»r…z|Û{LÞróY¬˜:^ÒíÍ/Z­‹º1pÎT¬ dLU?…ßE¦‰¨¥CŽ”5¡Þ[£wH÷žw~ ÍS4Æž,ö‡,•ˆüaK(r|ÏÝ7®åG>j˜+\€.Çdú•G©¬ÎŒxúðÌÊôr„䢚ësmqÿØç«>Vc\Ñ…H}¹…[Ú¿C+wdªoÿ³Ý@â"ÝéÞWª!Ë+*â‘×F%ä:o…Ôœ¸þ¦B.F^=§µêÇÐ{\ˆÍ+‡ážã¡èž ‘`+]aö2c:ѳ[’öù—„~^¦3î?žúCf9VTÛ£”dD?¾ƒâŽ^{÷î,–ÏM#‰ß,ª¸¦ 4 k†ÐXÀ¤ÅÄ Æ|ôM³ %_„h^~£ÏÇ,yQÑö—\ RÂ!‘ GÑ‘ŒÃÀ£/òGs÷B’¸‡Û§2Ò ?l­—­F÷Äê‡T…1èÜ×—+®ü‚´žA¢9£¢.¤D}þ°r¶ °œË<1&QÀøç „_”î>¬Z)ÜçÆe?—à£ÙKþÜŒ~‰Ñöô?­»B’ð5VH5 ýŸ§²çÙB–M£«Ø¶'˜´«Wݲ£*ª;*öŸÅ‚Êhwè.|Ëþy©¤ ¢SUzf‘?bÁô㌵~³0#ÿ”€œckƲ¾Ç¾Y›Ë®GÿG»OªzÍÆ{š*»RFÏ㣭 ;åJؘ§šÓ<_B(gÝHåFWÈžªG;—ðü_wò:¶4ó!s†'\ú±`¿-ýØÜ&Е®€]§îɃËÓÀ®éûþŸ’`sØhIt­Øúˆ…‡o< 6e)÷B";Ánp ÝàOØÌu3w[ ÖGè…Ú¢õ`ÿIO|®ø/°SPbd5ÁEêÝkf:ݯ¡î‰{ÀöK®…Ñ•·`£ýä°©®1Ø|n*ºÿ@l^“›uÖ5­ãÜ×ó}ûŽÌaÚpi£¸nåk°Úx¢” ÖŠïœÚÁJkÊ@Ã6¸0èuè²Ú"°)1úVjVrþÔá°Ì¶Hù±Ólõ)I&ìŸ`ýcCBôχ`3Ï·ë÷æŸ`›‰ÝûÙ‡ÀZîlæ±1ØD ëÎå‚mÌl6CNl**l|òÁÆaê›.Ý™`Ù&÷§¿ì· =¸ë@G°\\U6M›ÎtI‚­îôˆ™vpvØ,.¸"oÅÄøÃ’ƒ¯"¸«À¡¤óœû!\`n-o] NZkb¯]µkȲ߼ž v+·K¬®RÛƒ²7oKƒµðÈl·\!¸x7Ô00,æ.0Øò`Ì_‰ÍÝP`6ºë ŠÂ~I—ÆÕsÛÀH#d™Ð¼[pj¾þÈÓN½þc)dbf5NÄ ÿý “@Ø6þ]ðO—iã].Y™Ú—çòûývHðúþë#¬{pç^~YHw÷®É¢¶öD]ZÚû'Ø÷Nv>¢½c¢¨§;ÑAXSûà‘ ö=­‰¢–þdQÿÀäl{wLr÷ß91…þÁC‡&ÊzšzëÚ£©79ó¾ ®àîÝ}wŸÔX‘ð>½ƒøå)ºšzû´õ'¿EéŸcq¸hfo÷ÿÏåßs™n}ÉÎÌÞìÒÅÿÎfæ2¦Ys5ô?¨YsG‚GéT¿4K›ù—V‰ñêÝ×iéÇ·ùµBÓþÖk’xt/Â<ª_Áã_ðþ;oíuõ[Ä£Ñ^{îï¿ó×ÖÏçQ®;?ôõï¾ ]t(“êb†Áäç¡Ð »dÒËõÏz ÷ôæ\2Á™ øÆ¡T;ÞÐýšàŠsӦ߳ãwš~*_µ#ˆûKQè„_÷è}qT.£½Ø”LŽÖ‚–°|żùÜ &ëQ£<’˜Àâ8Øß¶.Zƽø¢úîËo€6+‹žv3j”8@±03úxêí5`ËÙUŽÄ[§ÁÜžQ‰ÁÔ¸˜+•¾ ³‚ÆyN9Ð(â5¢Req›5– ÈÀ'ÊBð?iö‹€oüzUë ÿõ—2¡U ~1”°äÿg*Ç°ìØ©¥ ýæ]2n¯@äÜò:jNf€Ò[˽BEÀäÑq5y‡¨º\Õ6Š‚›î"¢¼làÂìc–2ƒ¦+»ß~ äôÊ-Ç ?@k‰Dêm¢"Ø]óó«ÜÔ@—;:Ä$¯wPu5÷d'ÿAÔh!%é‘B­¿õ/¬ü†Ñä9Sf¿T<gü°VŒŽCܵ(å!fP¤Oâ×þq¹¨¤nmÝ5DãÜ ý®uPœnŠî’¿'˜¼n¸5Tü´©;'¯öw€Ð©kž¡ÿâW¤T5g°N#U†oý„¨¸ïÊ1í_ò ´?)|ò±(Žò¸)£6Ñéæ=V0R>iaëYærFg©VRÑH®»ŽÏçßeo/Ñ"‰)‹ëH+§Ÿ‘?Á>Ö´J_jž³qŽ×оÕ,Ú˜ùÛ„îÛ â.¦òÖxàb7¦üþQQä†ÔZ 4÷Úç;SM‹ q϶¢Ñž±ÌêWÙudPMýf°h ŽålõØ^ÿ‹Ãe!ç¾xtÞÊÓè9 6©ü[ÇÊÑÈKsfíÈ.׉ÛM±f óíëo4ŠõP\ö¬«#-üÏ=}-Y+æ_¡Å‡Êx0¡ˆ·ì7@(œ(eôìYôâÞO¹ý üúû3 ®ÔÝi(Ýwú"*æÙÏ\Ýà="Ríw3<Àe»l§@’ ¶ëO²ÉTíÕñ¤ŠÑ§ú \ÄK?ÇêŠÇ!ˆ(8 mÜÖ)_öY¢Ð]ý*þ `Q^?XMv̪ [3ƒø!¡›y.ptΜ˜‹y†ÚÌ=þÕ öÿê :­°]šŸýeŸìƒÝ§†VP£P8æûœTæ+&XuÁ¥•=–Os T—ÕW YÝÑä^T¶^Û¯¾`º¡yÈ{LÄþ\VÖfOG­?½ª‚ÁI–bó‡~$ þÔžO,ØAåHGš–\+ø_8Ê´ÜW…ÝÓ<¡•[hFxíEWÅÌ^=/ÔWmB.Šª_ß&ž‚¹–ð²Ì¹JTN'8u^­ô53úPuþÆ¥ÀËhÍt¯™‹¸¯‡¤•U Æ…Ù¸Ó,{ùJ<6{L\^sÆx·>G-Çb¹éqðds}öa\ç¾Ð=NvFÎi2³´{QlFü9] âóìÍÿ×}¶¹/ŒÐ¤ì»9Kó)0vˆ‘¾ÈúH©ÛÆ+Œ&¥Ë…ç[¤@ëåKùK´¡\=ñèb%ˆ •óö €²ƒQ&Û‡{`—äX¾¿CãŸþ›:œ!B­Ž£Ú“ÁAÿAÞ“‚lu49§fýp ´^ä¦ÿ-‡‚F¨ºŽþ…æíæ“f[ÈÙÆIÁ`Å^ß{˜}/ ­Úׯj× Âó$[4)·¹ÇÒ‚6,“*ô û ïˆHàüõ†Åé÷þè+dðaéy'ZJšÔ”Z#+Aèƒk¡‘¯ˆØïüzw&¸ú?¾ºB%Õÿ¶ïÿÖiÈ,V‰g´|’ý^«á˜<í-x¡KþÿV«Ã#£nÁÀ¹R¡´øñ>zYß^†4#ÎMÜ}Šæz/"§¥þ ¹éW#ÑÃY Ψró×3tà~µœˆ6~ø]x{<ªˆ…{v—Ánx_Ÿ—þ/ä¢qä8a´y‘cŠ`¶O\Ü.<wå>)Ré£nrHM³[êf:tŸBmÊO¬h‘ÿa«â2ãÿú ½Ï·Q#0ÎãS2ë¾ Ö ¬BÀ²½p´ùM: î~ ¿)Q‹)É„í§@9E—±×uÓnÝóz ¤G C:»ÐŒL÷!ç·e¢Õ̤vùæš¶jéqò¨œf-µN~5N‘q/á@ñÿÑõÿŒG“®ó6‰&Á MiU˜BGv퉲’WÀFZÀë«|Hÿ’lfZÝã©»ûVj3ùPöYñMå0au9º€ºÞ¶Lû>¢]ã;Ò슃h¤P¿µw÷ø(œ˜æ¾)8ÉvÇú‚rLÀdé+50i& Y^“þPúgÿÙ; è$Ó:{õ(Á?nQN^-n¯ý}Ìe¨MÈpÀͤïߺ í3`°? Ɖ‹ÞÕÂèÂQ[J£Å€âd:ÕªÜÀEÖø(»Ä MzOSÎn—€ m"û¹¹jÔÈ{Tòhšù¿õt®)aÛ™ÄéR´?­eA²\ÝÛ[âoÁ­*8pޏ²I4‡ãì(Q“”W ‰¢}nÔáõ QDû3ï/ºÆ†xrß$)’6~Ö8chÖc⡇¡2dÖ“`ÖV¾Xtu リô/Œž‚D6‡½q8]=\*¶ î=­†•ûVÁ9÷x“3øK¿V•ŽˆnëÏZZwïõäË{¨Œil}žµ›ÀaÖø­v¼æ»Ç›-ùv¾g3!nšp›Ø EÊ—t‰À3²ú`K¸+ºÛ¡H¹†~YªC}‹# g¼9~éŠÊ-­2 •‡í Ù©ÿÁ…2îZ&0 þÔª‡àbŠf²?ó¸´zU²mÚiž×ÓBp£i¼˜ìô|Z´ãxºèS¶¿^rÿ·>1?ÚEуíËòÆY H<&nÜRAÚW-Îú7.v?qlwÒd}—[ûÒ!.­ ù}÷ê¾Í®’….ò J±”FcL^H“»« d¤Ñ…önÏAÔ‘îÙÇ¥á V~ãB¦|ÃHö £Þ%uR3u`<+¿å¦^„Ñ›.¶©¦`ògjßÞµ:`dSâz߇†2âïW¾¡™ÇÅ×c­×!™•Jêûáa¬<û‚•,d¸Åú‡á·³àkì^þ=Ãýk‰× :íDqµ7©â”{Ë„!Jí²ÿ<â^ƒÚ¹îD“”DÞïÄ,c°‰FCëƒn$™àMðªå[‘?*½<¾`]õÓ¬bB™Ì› ;ÌœÉQÌ)=lZB°·"|/ÄЮ­È­›@?)a‘4F}©kÞﱆ rK‡„³ ‚ðÄ쇡zÌŠ›‘ù~ ÒS{„-S1øðßÎ$ °{ž–~)¤ù)¦¥‰Þ`\Ïhúp¿>›Ñ ¶Ÿ¿ß&cîí@:>w’fê5~q© ²ËšÜ; ´[÷4çìõ/·žKƒàÚ¨{ —ÁùÁú-×(JÉÄú…@ Ì‘K¥6, ƒn“简Gsöºx&Øÿê,«1ø|Þ­tÄr¦{ïHS¿™ê‡>M6/Á, ¼XÁ'Aßçü©ŠE8R0£ýëç+/ÿÍçb„íÅö°'³ U"½†EÆ/¯f}…T–CWÞƒõÉ3/ˆ»ölKõÜÔ¿¼” ¿  P®†HÉñCÊDx‰ÜÄ{ÑN‡E¬š}ÔÀœð@ÿ>J;<_x3ƒ½ \ÊuJÎôC “ÖöÐï è¹Ñmû)ì5$u1êHÆ9A`ùyϿѽàÛL(dj˜ úl7Ÿª>åo5 éxÑÍ_âwQ?Æ´cÔ£^ë½î×3Ã!§máeÅ_rȽ {|’·_ñ~7'ºÇËTå‡1…üÍ:ƒDôJ[ÏKc$^jÉ\6†¨äü†ûâÝè=¤š‹BŒ8’RµŽbžIåøŸ|LWÔ¥lõ¦A—üæ`ƽ¾?b­gÍê13½#P…¤ßó‰^J>zè®R œ»w¡&¿iT'Xù)j™!øÙ×/&Û!¢S¿3BÂÒ™¡X{XDR£Çí ù_·ö™œ8)‹žOõªR³,Þ¡ÏÁ¬."9 ÂyÊ|ó.dЫ òİ­fÚgÔl`Û™º.Þq’|T]8>dÃY?Õ-Š¢³›rë<xöìtôòf£OKÙƒÓWÑ«áµqHE x7ö˜SMgâI¾õY£/BàtöØ“±ð>PÅœQ\Jöi!Ti Qg¸ÚêÀãY¤Å"ùK}6ÆrOÉÈB„lFÆ…uÜ7Wd“3ŽîC契QpšÞVkÅÖ‚ÔÒœ:î©cʛݙdkôPžb:ÊÙpÁZ‘mü“©z%dA“K>~Vé5X2ïS=xÃR éîïgßë³>¸½Î…Xu]“øâCoÃm÷NŠŒ*’zcW?‚ת¼e§¤xú–„ú~ã˜_!Ø~è9ÇÌKt7c±e¼ŽlV)dÞ¥˜žB BG)hE¶hqŒn=ÔËØÓ—»}zØ[æóQô¾å}ˆúuzÇ£Ï0xš<Úq_@5™ìÌëš/ÀýÞ×êÒ¯1ôòŸ1jîG˜ôÕ3íH£„n4+hL­C§ÓUBMˆ*Ø9Éãôš®Gó ð^ç·>šS¥~fK×ÝUé÷;û…î³t³|`µD´+¬ú-Uüµ>ÓBìµã/ZRYæ³×„òM Yô®´ýæÔ‹:?úï€ ß·OYËd ×wø„‹ó6zê°sÆtKaVýÎü³yÌ¥™*&OêØŠÒìð‡Êíû‹ØF÷&7ùÌ_8ycŒÓCNÿÙ1ŸTm FГôùPéÄ»\µÚV¬†„è/–Ê<£è9îѽB~¢#\y×]†Äñv÷2Ü`¶Ðt˜3Òª‹öls©”ºž-¹5iNÍ £m‹·ƒ'Á:DéÝï(0x3óôÙÅ< ;{À¦ôÉñy:ÿÔ§ìg“èT±GÆ•hBMÜâ“( ¹¨ŸëkÜ>cn”kÍ_ÑŠAkB“4Î\â‹à=¹§Ó––ó-ZtS8âÆ™[èÊ']¯itü¯•ñ!Á^3ÓñÂ>úÁ=ƒ!ZÖÁ×=Q©ü´øÓ¥oÕP¤ÊߘvΧÔfh:0õ“Y$x?&± ‚`y‰ŸŸØðà>û”B&H Úç“O}BLg.Ì‘*n˜Þ–Ýý©ˆÎo)Á‹&Ô=ÞÞ£Þ߸­Ó1WD‚Yß(aЫރ•æ2èš}Ò0&ò-Äí“=,œ+VN糜ßïg”R@ß(±­ªL }z×ËÂ0͘¦nÔ:‚K~=¤dAæôÜ˺Ñï®#ï¡Çgñª¾Ù÷Ñ«C˜ékHEa…NTaÑËfÁÕQ~¥»1s/ç)öu@æ[afSÈâ~x.Ö²ü¢ûÏˀĥíA´3Cï…ÒÔyLrs®|£ˆ—ƧÃodDÁYéæÚ¾àQ0I¶²9[—yWg Áÿô`Õ¹ä¬Éø3ɰŒÆ’‡›í'Áv4¬hÛôßüœùɇ~ê¨gÉŸà‡Áj`ÃòΛçI }}Â}…"ÜéÊl2̃üÐãö4zˆfÏ”¯±IGçêd“¢Çü$/†&ylÿÏë2Î `¸D¦Úÿc.ì:|=n†ÆÕ­|rÕ`Fs+Èiúú6S;D=Kã›Gªî&©úv¾Ì‘zôJýÜtè1My¾¨÷A—#,X”¸ûo}\ζ7è1ICíU½ÙQ-Ôµ½4Ú…Öd,~æühÜS)is¹\_6ÓJ–?B£ßÏJ—iPé•=ÏÝÏdô‹½û&:n’ƒ§Kžtë¶8T/NøØÝAë Ó:õ tªÉëC¨“¾á=´ÄfbSê[—‰PùÅÝ#m¦Þà#-Ù¶þÒ¢ôº•FxÐ…lV§Ó£ m öŸ1'û/Ž×HuI¤£ñ>›ú€&V8êþ ɋßÉÅ~:øŸ¼¡r‘´ò:a>ZŠLÕ)Qˆ€ç¹¡ñzpzÊSa][ño½‚´ß[¼°U˜|fÅ1+öÕå c$vT6¾Uþ^ Ux¨‹ÎïyˆEx¸ÝÚG™€îî]Ø?žÓFÇÿDy–§ŠPT+jX:yÝd@ó‚ë.DvBÀ)´#_Ó+¶<E÷­¯¡un÷èi%70=¡+jå÷½º#ŸkñýóA ˜· ‘¨eïJ¯·h_ŸŸ®a$j…·Ê0`ÿÝÞf^d½¹*8Yô/ókû†šÑúv}<ÿ-b¬«žAÀè³ònb6 8x˜}üQ3Fò5¨õ‹V¢eptH¾Ö<†P”–êVéϺ¡OÔÊZ„ ú‰’íåXDs½óŽ$kEhuIc :ÉtTª?¦ùu£Â隦6•$ô³ëìþ©ª/TçÞÓö‡¢Gé~þ›…ñÑæÝa ñPCA´5)L—‰HD´õ»2_AáýåŠ&±5Ðæ|á%Û‚:I‰LNEŨžº_Ëd]™eWÆn´€ç ÙÿCšà3qÇE°ë,:Û5„þˆÔ@¿‹IqK,`uЩ뛑7{Q–}1½>ãºA¼Œµ`ã1vëWøò-åmsÍ ‚S䆬(Ø£ÏqBÔ,c‹Ïÿoþí#2ôžš`pŠ¥€@»:„¤&þæ G·|q¡Õ˜VáÿdÄz$W#ŽÅŸ:&$5²]<ê( !áû«ÔúJþ8å€}º@Ü«š½:ÑiO5€N¾–?ìõÙniÃ=¬2TèDÀöé×Å'èDv´½ò¡-xÇŸ¿GŠ.SëÆ¾ß/ ºû!ãÔÅð>h>Æ×–‹–ï×»øwÀ´YkÐï/´s•«ÔŽeJõTtWþki—ÿ,[]ßñþNÚó-’¼  hŸJ®ž-N žÏk”'¥Ä0˜hãs‡ñ{ôžsdRE—ÃÓoÚ¦Ànÿn¢K×ê.¤=§˜G=²ƒ1ûÒ^¡µD ÚÎ4t Z\¶FàN¥ù4}pšÿrsÝR½ËJrZ²€¯ò»2!s74«|ѰŅbou´%òÀÿöå…}íü×xGô_æŠÜÒ‰@;žfy‚Xð‰¾ñä*ãatî2Þ«€Å wœç¼~7š§õèX5Ï‚¶$Ç/<àó2f–¯ü Øu—È,k ùLgÝ{*p¢^‰ÊtÖK’®ŽÅÏw4—ÐnÄÖÝ"h Ín°P´YÞ)ÎÃ+ÔÁŽvž[#ÆMûýW«@8Õ5ñëã.TJýÑŸ´ 6^sÅ7Ïö ÕsŠ3ú—à”¤Ç3¤©b]º+RIš>BáÿÎçrM];ÀÿùÎó§'Ž‚o¥Ùå'/z0ôÁèÎN”2Šå_¾ñVmÜ·¶V‹ÐÌÒ2òäÍk(–=}ÐVbí2-H¬Øöç¹í¥š’4t$)l¹¢ÈŽ– §ˆ['Q][8A a|ÏoH8²»^°3wÔ5uP½~Mq’ÉuD‡ÙéÀðP߃ŒrИ‘Û®ü9Y%ò ‡zW@mwHøS<+î™ ß®_rz<<ªí' q¢=Ôç+Àõúsèùz<÷MŽŽþ<:oÌ÷¥4Ë § Ñc! È|SÚø›CkÕçß|NãTu5ËnÄÐÓœ«GöúÀ3› ábF ’•ëþ›»þÆKA£Ëã¡dšètmp¢1sñ¿Æ™¾ÍJæ ö‹µ.Mž!JTÙ#ã:ŽænÊÖz£ V&õÞ²¡[I¸hHrÀ8,ùîaM4¥ØXé}zo.=üÁ¿É¾œÀGͰ€t49æö×9Z(+A-w‹µŽö&8~mÖ¾îwDlýÁX›pÎÂ; ¼c-™–.C@´qל$õí‹QÓ2¤¿q}¹”÷ÙÚ \ g§­ÒÁ³àM¶lYCÎMY¡OªŽaxU͇iŸ.ð»ü6øÔ±a4®+d(>€´ùd¯ÁRá†.·L;8,>¯j¼IΞnlSòÒh°Ò:܆)^· žºËCèû±ù­xð•Z‰åxƒêOW÷“7é!nŽ [”è‘lê~îJÏ7Ö¶_~€¢÷‹ö=ç@55g>yuÔI¿þÞ @ðfþï/ð?W5Ý—aºËäàbæAÖ›î=êV¯¯ýD3)ñ°/¶ÑÒÖB~#u ½6¸Ä6h! ž=yçe:Ö7˜Å ÛÁÕJ83‚ͼ»×ò®S@´µ§ ½'+DÖ=~YPs$ŒªÂͬ[@Tµ©¼ÔCSj’N·CÅèÙkªmWÀ×µü8?uÚß`.c¢Ð¥Pãð“~™Pv‘(þ1Z7ÿ*4º&¼C:4fÿåû,¢Üó›…;h¾lV}OkMþnIHy¢©šâ·}§£‘ÊÍ´}%ahzuûÚ?*_:¥l¸®´|LÚçcЩɂ׿óX–²ûgudƒºÃPpàáÔèëÞÌá9 ö|íìÖj!àÑ¢s‹…¥4h &¬ç.£³‚»Û9ep…Cû9sìAoõìİU#Š× ˆr¨ÛÍè…Î cаºÏr^»áé­’Š£+ôè$½¢&Œ(µ[ëwc$û ]OŸàÁúRmRþhsUùêHOp.{sÀ˜ é2„.å]‹±Pv¢åm{õ <(hŸ¡²jMÚ KA{<]w1ŠvébOv‘yÖƒîråªä zPØX–uî¦Gñ‘iAƒJs4͉ßϨ|L1J>3ùf<Ø.<špZ}ó#Þ`Òpäç.( ´›ßSE ¦Íêw{Wvf|´f¯¸ìEjda}$~mæ}"h§ûÛdùD5 Tº;2[éˆÔï Êï7ꃈfŽò» 9´xÐøÌÔ*¯O{öŠì¢Ýf…ÂÁ¤{änRÿ²_m ˼º¾Æ5ßDÞoµ‹Ò ö¸ª)îSE)Òºè¿]¾ùÄ:N÷£hßuÎDÃ!ô¤%©møŠ.¬Ê‡Ä €>iZÍŸÙöéĪgýÐK·+ç»ÏBƒæâËÙ)g.¡À¼Ûûp%Ð7!Ò¿“Òb¿¦ ?Ñ£ÑÜý,=¡C(ù~ªÔ×5L ¿søI:¢ŠqüO·ŽTi§m¶½$†BnYƒ¡þ†p`ñM,¨—ˆsJ‚‹&ýûœMOC–Þ´7E(!=KHm Æ?;D¥TÐvúI†€V8*Çz¨…F¢Þ%¶£Ã{~,HëB†féM¦jwÑU­=!0x ¾ÝèêP<Ž:âí¿59¡lúvC`!*Î2ªkòi[z½ÇÐ*(—::ô j$ø =ú¹²Ç㌧×íòÑÔAöÁõÀITœ÷P  ÑŸ•âx5:ÐŽzõ§zÍ[Ýúaml„bÄÓ=ýŠE£K‘¤BwÀÎË>uœ…YÃÔõd}%Ñ·@ßSÌÅ­ôã¼@ãô¼Ìz¶y§,§ÎÏZF{Á4œC¾~ÜÏà ªc_NùMïõɾ$¬é=Šhµ|ã}¨ü<Š©֌ӃÁLrêæQ7Ô£´ÕÑù-iU„r‚ÊÈ'/‹ç@Ï+øGž\=˜ˆ‘ù’å”ÀþvâªÛ‹…À¤¥4\‘§®^ ø>욪Gœ©¿]F·Ò@£¨`r4ü&ú%{ tÜÞß¹·Ç?NÑÜ~$a¨ÍÌ0=©™\¢›TŸ¦ö¸åÐÍÝóÆl¨uñî¾ú_V`Ö$’*íüU%zîŽÚæîq ¿Û[¯žn¸šø‹¯ÍßÎÉ®¡±—’ôHo-Ø]‹q¡¸>.ýŽé"ßÛÑ¡s¸Xæ øl1­hvþ¥ÿ»]üÀ¯¹&ÍLÀÞç”õÒŠ5:-…,J|6C­O²ÊWç„Q+êRÏë纸ÿÿ}ƒ'“lEg^ õ«W,,åhÂqf›‚.8;ê”$¸Pém—ÖT–2š—ðæeÀµEi‘Jp ¹l˜ªâª3¡ÊJò Í׫à#z\Å G÷9 º(ío%Kÿ…^¤âûCÈP•[™ˆïõI4 àå&CköfÉüï†()DàKŽ:d{Þ«EËÂGÜq£QMUó9·Jh¸+NN1ˆÚ ‡ôB†bÁ~­†|^ܬ~†7ÛÍI FÔ©‹ŒÃ ÿòl`Ït¿J¿=üŒÓæÀNq\Z^{±¤¡àEyNEØ« ÿ]î÷€JÍÖÁ ÁòÙý™Wäà[K®"õ •C&øì´Äöâmr½VÌ"O>îÆ‚É<›XßµMPUëRJ¡ Bá/É4"¨vëY¦^H·N&Ÿå]‹¡‰}Â`5KœÖYÆ RQÊ œ—Ûžþùý¨ø_›˜i`F-|¢o›Á®¤W»ÞôE‚<áOMr8ñr?³˜Z7ª½Nf1+ëEMµÈcOSëДôy؃g‰hÁÝn÷y\Þ'\O¢°× òÇpPºLAÍ¢H z¬r²^Á"»AÃy¬e3YMO"P4'{údcŠ-ó‚µ”Ëpæž¾y­$õ~²¢:oÓDs­(˜n^0ÿ­ÓöÊ5Cï?UJºfÕQº9®²qôZF³©â6š®Äw]Õ°—!=nÛ C@–þiöŠßâ½`v{ Oä=WãÈx &±ÝQf†gQ){WÍýÖÈNê[$9æíÖ2â#gÀá‚¶þÄ -è…þV=­|¬¿°*®L‚ÇÏ¥ín;°qY0n³B¾˜ N¶rTh«ÀÀIÔz2Cð¡p5¶ šÖ¥Ž€xã8£G Ϫ¡¾-`óþmí]õÔk\"Vl~‡‹%å÷xPÌGh¼¾’õãÔ‡ vhN¹¬o(Ë ž ! DÝφƒ†Ÿ@n<¢íù¡,Pzüæ¤àþ2àg#r¬{À‡ émk64 b]pÀÈoÍz+½¦AðÊ‘¦-0©u¡_õFu«›£Ï.yF£sýS<±ÄϽ|¿ LûË¯ð¯æ á,gl‰c8sn(üYÉÇ¿NÚñ¤¯VÌô‡Ë×”ŒûÑœv5¾ DÐ04¡á÷nׇÌhK¨£F  z²xöÉ}A÷GÑ\“]Rþ¬šþÐø½úºEžs5’%C铱‹E¨Áòö¨£¨ñ<Ý?2¦êc1vê‚ShRFÅÞr@rÆGJ‚ÂÛ¡¯o¡Ã_?㪮h2àW?0 ßíqý o&5.М²ó0)*»gÃnÁX66—ÛTÍ)¿ø¼arÐ`ÚI3T~ùL«5nÍžó BÍϵš´›ÐjWñå¥Ãã𞜴ì,;Z\ûBäw%{ ªå¹S*2 ítLgòuÀD%²çѱXÔ±Œž Iÿ‚ìç¦Ðè-+:í{PĸÇsCÿ·0 ö˜€\òuvÐxÁ÷=Uî+X ÿt ¸ótíâÓ^8ù§“1ÌE ø ¹AK{WúÙúwP÷?þ^—Kq;’\÷Ëa´¤šIe¾‡jüI¬T®¨Llw)̨ \,m¼+l\ÄB•]΃tKìÃ"–;ÈíÙDþÆô+(P4¸·¥F€ð¹æ¤ú;hÂf“îßß–“¿»6ƃ“–M±yà[pçÚ¿ÃÛ3ˆRRÓ"Y«ªOÿ¶}#¼£oó  Lj‡ï Ò™:Úᧉ býû)QZ1òæ²5£ó¥+‚Ö çÉo=—ÚÖ6GúÌöâ°œQãF“ʹÔÛ6Èö¦ê®}0 êªâ{§·Aå³öç!PæWn,úÛ†&Hö¹!¬m¨œub-óX%ѱPÔe°Š;ÿéÊû>?yèøI”«Ë~ä²zEˆéÏ·5­ñz+ùïÔëü”óè.#¨¾Lü8NN€*i¦õ•bO§^‡i5ðE£ŽŒÇ²˜‘ uè¹ã'd~/zhhçXÛSüpæ¿’QÉâ׊ =圮Y`dÎ…>9®A¢±L²ç»@òeª2Ø>ê¿7;î‰>­F¦ËfÛÒ!43†ÿ>÷ ö¶Kè ×cËGt QJgÿsæ~0ã°>56€–’ÝEûŸ€/g·Û£žMˆ/ MÿHÓŠNÅDÚk¤G TÖY0œ²<2ˆÇœÙ¯¡ë}ÊèŠÒ?¨EÞc0†‘ܯé—5ðtápâø_ÈX-<÷l¦Slp„'wcÞtn´Ó?·½‘sR÷Pr)Jë-ÈøÀi6-ø èSè~(D@ŒÈãé˜ît[:ôîI4€gGnÉýâ8 û³:rñóŒâÚÐdiÇm5ßòÿ½Å †aD-;Çh£Ð¥ãû]zßJˆŠ>û£«PÔöIh*ˆ-£ö†2ëÀH‰µeäJôrš²„ÞëŸ.ݰ0…¼'~ *g« OVS´q=xÑÎk^-<‰’÷f/Õ µnOv]y#$p~ ä<ë ±V#¯~XãÑ•”bfq0²Væäu KiË'c±¼xè„Ùy jº±œr ÄúhZÒÚÔ1Üñ@ÕæÌ)OM ûÛ_ ©¬ïh†ç?BÐÝe*®A24;{ªùNf%–~Õf¤¼ˆî3Ï¿·_—2+ïãõÈSúñ=&»Ö2Ž‘CÚxÖæÇ heÖ¯|´ù3Xä}l·ø‘á  Cc´!•Ì6qJ!Ìö[Ý™Ó9`âÂy©ß«t˜wËÃÔ†s©#èzζŸEœú²û`? ôôܘ·TÇ\õ]ƒiSHí%rKªM°R÷OC!ÎéìÓêþ `wie¿è'Œ¹>ÑðÜþ1zcã°pé„Ë®pÞ’Æ\Ù·>˜óþ+ÃÆX¨Ðm¨zBŒ÷k©.“>´}Éšÿœgi椹½6!.¾°B÷SDqwEìd¡ßo%·¬mô xAÆr3Ý[ÞÖ±ÚàyÎ÷…ãr´Áöµï†`z6U޾埀9ÒD”Bªx•ÿ®‡Bò[ášzN+¼J¡‘ìc®ÌYx)7Ј@¨ ’èm·->›Aê½ÍŠ.é稓ðîñ†ûkÌýÔYn.j¡åB)¼ ½èüýO:Ó‡;˜òc9Ägãxõü cÌy†),?]ÃԱT)]®¤/~TǺ q*µ­J~ho¸øu÷$Ë$Ðkö¢iÉbaÉ,ú}éê|—Žï•HñîñKÚƒ7Œæ|4Ö¡×Û:Érý!ÃäµMgåˆé^\ñ†PÁÒƒ»Ã/ÀÅäipÈL&ÆÝ)äwyýµYVò@øSgzÅBò§>—W¢`s·/úHÒ+0=ÑV÷â$PþÝÏ`ÍŽ:V‘ºWy˜ ^i§.ìÙÄdÍù/Ò+¡€ýÝžw˜´ûʾg"âÕš"?µbˆÔ•Κly&Öq{W i´Aîç›Áñ Y•Eø%°3(ð*ÑA­šM2ö˘ÐÐòQ„â%NKʦA«+?vƒ|ëÐé °Èͪ!”zûªÒma¯ÎðýæQTt‡ âT¹(†t åkðÐÛ[jñª÷^`XF0ÕÏQ )ê|¿; î¿ó¶7u@´q÷Û#ó¢…`b×êíë†_Úl<ƒ~7øù˜ÁV9¬(.Z½|9º¥6Þ o½°ªÕé#˜ù~Àz»v³d-­Êä‘÷Npˆ'œ±íïØO•ẅ*šc,ock^7¤¤åö¹Å4‚ë3Þ™"¯C ÜÊqêÌ Bp¦Nz?¨D‚¦Kw‡È¹/@"[XFåû{HÉ’3eµx‚ÎéAvûèèbˆl›g<Ýç R¦wë;Ƹ³wâù˜”Á?Ò½Êú°ºSR˜t}¼‚ž±fO®³‰£tÜ­•Ç¢ÀŸõU¥.Ÿ3dNµ<ÉŽB·küåÜxÑsxÈåqK=HúËnÓé2ƒc¢êI®+¬¡^(CÜ ŽþûG’»e0Ð_vßÚå`z|ƒ8ýp2x6ÝýyÈ™ÍGõ!µÛ#&RÈ¢I\.ÞœœƒP'ºÊ¸î)´í›söÌF“M­MšópÊÆ¦ù­)„yî“kciDw:¶„É9ôú┓o¨YIG>ã©L~tjˆoO?akë?Ï^É>*Î?àcl\Uð'šè†[«€È!éJ›ø-8Àھ憒×WßW€\Ì܆Шï{îƒ×þD°ko 8Õ ¦ ‹ 2’]èw¬ß8Sdß:UÅ„Ó èÏ ÕäT—ðj]Ýë[5»Þ?è廇؉»®Êìåái…K†=ªÙÏ \ÒÜ!îO$¢.`Ô›·Q†™ÁH1µ¸ýü9¼¢¥Iì1¶‰©Ud?Ô‹:1BÁ`åL#!¦n¾ù䦉…ê#TçŠ 3П]q l4:ØFZè!?9[H¹ñ D\ ÿÍLIˆN1ç»–f0¿¢û‘þ›M,˜ V»JX½áBu2üµáDþ˜·òµ­<¦dƒDïPgö[ZpZ}”iDߨ=Î.R$@´Ç_épyô£,¿_y ý…V‹Âz%0ÕÁãà§ö>Èbà¿n3µÇ!ÇþxÝGïàÅç·´î@6)Ø~šŒ òÌ¢g¨}ÓU€âŽ(Ê埡ÖÛ«£ÏäD{»LÑÒãNw‰JÉ¿YoTFwúïÚ¹§Ðä¾Üƒè-K©ÿCR᩾Õv˜ë ¡Ö~ù“‡AwãÖgWBðOŽpMÚ×Ïv‘[ÔfþsVàŠ¢ùŽ ŠWGËä¹’â€ÿÈ+r½ÐGñ­†©“Ç"8_eìX}gÍwÇ:r‡ üVr%;Ý øUH~T»Ÿˆ¶ÄT~ÒoÁ!;M8Í #*®½§[| á»O¢‹i0x(M…vvÒýVíVÉŸ‚³yæ93ÞRtÓ¾y¤ÿzH´VêH€¼ÞÉBÕ=^*ÖXZ/€ÐÐû™³hU3*Ì‘>±Çí„g Ÿðc Èjò½ýê}þ]B¥>(L‰ ò*ï‘ð†dK#㴦ݬÆT}¥še ìÅáaðHÑмÕ_¢’yU¯Îk\¿Ñp_ëÌ_Â<ƒgÛª?íhÑ–ÿ¤¦óä õöù$Oíh˜öÒŸŽ ¡…Yx¯32QîG¬BJk펗æ}T øø˜ïf~;PÈNýb/“lgG»ŠÅtµûìhpÎòõd(;¦\ª=X¯S…é§ß ý ø )ë”/ë‘ ËèÎsK¦OxfŶ¬ò÷¥=n )1|öfû¿çŸ*¨×•3%ÕWáÌ· é,ÿQ*ª&¶xÑ–tn/uÒ£Á[1/Qx/¾´fLW"ºëUàÏmgbÿDÌ›~wPÝïÀÈ¿‡HGHAðÆæÊk–hÚK5Nþãšó™†ly!©Ì<~¯‹BçcwVª¸ÁAEëvDÔ8ºv>I¥ö=#GívWBò9R!ÍjHûXÃ<~™BŸË—;—Ã^vþB „Þwù{R1 3mž?º¬u<~¸SsÔõ¡÷ $µ±Ö ùpôªÁ¼DŠoªˆLN£÷0ó*_ ™àIý0‰ô&•hk I&ÑÊ+…`*Ã÷÷þmA´Ï¡?å?³‘ßß±'g9`h²ZÜš[>D§`ÊѦÎ_ûr¼€+å³c”Õ ÄáõÈ,Ó"„)?f¬"£DçØðÕzvf´•t£*0×A¯7P%Ä<i¡;c¦ÙƸë˜ýó%ļþÉ}YØ ôë_u$ÞÆ¨¥fJÛ“à6ò\|ê®*øé×Ò«©Ð梟d:‚.d3RS5˜¼¿š‡)'Må¶ÊO§P£Ó•+‚Å*Ü`üBÿ”œc:ž¹å#nýÉ’êC-*I!ºžs+€„<ì rJ¨у}týC Œåy9–K®U?ùîGä ÛÏÏ,تÐ[8`÷ †{< n-Äè)¯_f r{ûrìˆsÞP˜Ù5¬Ò³M­ÊIOlTD. É#­ÅZ-ò’•Y¨=2Šnùl+¦Û0i¸%¬<õžÑì$oŒ#Áy‹Ôºä1 Sqc'Mè¤"Ò‚ UŒŠZ½Q¡¶*)LŸT±àNKÑpP$½;üÃkÜuXÞZ¨ïJ@À«¢ÑÈýr…žˆ´ýÖ EÆbúÆÖ:¿ÌI0ÒÞYL‡ÊÆ,uבWëug{ ÄiÊT̶70Õ4ðsÀ:ñ”{†j`Š+ù±Õè-ˆg´˜Š¨EãG¢Ù67„ðìZ‹âpàwtënP}d<¢F›ÃÞò`ÿ­¶;Ì\¹6/v™`˜ÆW_º|¨Ëûºe­bG‹ím)¹Qý€Mü/¥K0.0–wýû£Òî*Ђ#•å‘gqµacŸ¿~‚\\¶ *!Ì/XD

˜ q{5Åá ¤Yp¸üå‚Àëe6Pðä€W™âÌÁ¢¸?Š_½¹–¾ d(˜× ‰Þaœ„àÿ‘µºl|WüK?ø^ƒPßËUöɉ`Õä‹¥;àÂ/Ù3è?‰bº´¹Û\1<ããe»¾1H¢ 8»¦=‡Ö”t]Áw§Ð•êöï¤[GÁéë 1É '0$8hµK<Ás“>Çí«Ð²8&$ÍÀ"ZTýêè>ƒW×uI½pËZè’½· >,èY4ÑWb«k1”üc{ÐíB/¾wHKƒHÕ/J @ì"¹K­šø^ :ù­åºósL˜,}‡¤¢î²ÇèÑÿÆŒãùÚ…T{ºä=Ÿc¦M³R>à"[{0â¦ß»F<—…,Tö5½$Æw÷ˆR -D/„$U'…Ð+¯ZwÁû\ }ÍMô_­‰Ûbæÿ|âsÙÿ_qwUÿ÷œ$KH”¤È®ìûÎÛ¾ïÆ¾e0ƾ&;Q¢•¨JT%K}Ú‰hU”%¥…”5Êz»ú\÷õ½ïëwÿÿûcŸ3/¡ÔÁ†ß3Ö¯Z:÷µE÷¾ãñ{‘ ¤¥×owÅCÊ“óÆù'ƒáÛìNÒD$òøÿ\wËHòxãÊh…„S;ºã’v@ØþiÚWÏæ¦Ã¯(1¶{½7çŒeÿô—P:E]Ôî†ļÞ_çÀyÑô›|»¤ êÖ ´ÈVèn¢ øW} ,¨ÍÔ/ Cð\Æ©ÚÙ1ÐJ4ê#Ç#Õo‚šÒeÁ›•÷gƒÅY¿FܾVÏ» n0Ó"7öûi6͈üíàBLt$c[tË, wÄkgCRå%ëãàýui㆘IHý1uèé]°!Ðx˜¬¿€\åLŽ B„xÙWJ€ ì½ÐÚ65uéxTñ©ñ"ÿ²—g*;“ [˜uç· £ˆšÃR7Ý®Å÷­>¦Ad^ÝSj° ø­|PyÛô^š×èƒʯ³Þ-¯ éÝo‚ KÂíå;OÞ!JÅNëSàÓ_\z~ú9ÿ/*8™ÑW<œ<â¾´Dáž­§¨F+G™ö`÷…žŠÝ“Ñ®`So§Z¤ „¼Ýz¦õ7™˜Ðûr½*„7 ]õÿ±L^Y´¿K,„h‰-Û/iY#ÿÏÍ'ßè¥#ÒŸÓõ¼Ñé /Ó;EePøb¨û&·JóÁT;hÙ%yOËôˆ¡c"Â;!ï‘GøÜæcà¢Ñ¶¹žkrŒÌA ×›ê‡(ä7tÉó"ù Êx›w|S,:Ìi½jM…ý—*«Ö»#ʇ_>W í˜KLiÄU·»|ÒŠøƒÇkVb8 õµ~vï·+@*o¸•þlEì¿©lµöwTQk2 ¹Œ’¯KÍÖŽ!Hݪ“PÞ±F© nïÁ¥¬ßWzy az[­f os»w‘ß'g†°ïBî¬vï~Ë@òóýºûx›ÁóV—ÅÔ½SÈ«^i¸( 0;«’†Ë1NFÇòApÑ•ü]Ð[š=Q±îd>p}Øí¥¶ÏREwq¸ G¿§Ë;› À6™ï†á' ¡?jZMÛÎK4Ú³ÇM.é‚çÉ“ÑÎ0ƒ}õ]¡MZñ ^‘'õ5p­Ï.ØgýâØ(tÛÅ^ÛÝŠ2êòCkûÚ{ Ñ Ì’ƒÒ&b‡‘ŸÀ¶«öq4`ò-sýŒÎ&dÑ-nyˆá,„ÖLÄx>êl@äYº1šûÖ”Ó‹>ê]¿‚´6V¶ä]CRw'¡t·Ú>¸p ´švIŠz=ú{/UÑÍ®ÏU:k}„¹CÚeù{È>þωrÈCÊ7æ w öˆqt.õ"±….Ò¾ïã^5*W¸·Èœa(Ó—KR }ÛAØÀµâãCd{Ì…{—ì)D”®5ÉÛÜÖÿ}³:FJ†¢5²ØØD»ðÙÅ©M @:8»A汇ȳùk°¬1¹,ß±Ðÿ ‚§è‰±[;¿‰]öäøÎ§&·ü42Ÿoµ¿:ŒÂ7Þ pOZDñªQü? šÈqI¯êHò$Ø‘?WýÅþ8¨ñU59¤Ý-¦fg©*¶´>ÔEˆäÈÛøB¤^g¼¾Š¬½™õÉÂàTº!ÿûü)ˆqçù|äÙ{ØiRÙmðþ1Šcàá]¿<>®+ïŽ_å—u÷z±iå WÿaäUØÃý‰2(ÃyŸ‚îÉ -׋«‰…ê(ðýSUå•írNbæw#òº»)”°E]ò9£‹dg7†ÛU}|õÆÌ PñË(»štûƒÏë?FÎ*/®µG؃RlÙœ«Úݽa>”¹Ù~ÐU ¿½ ÄÀ]•̈ø¶bòzF{üL»æZ zOuÆþ³Ú`Óÿ+Ï÷¸UÙK2J¾}v‹"ÁO]È¿ICövÇW°×[~ÉàÌeå>K?¯¹u2gÐNê×fÉÅgH2‚¥}ÞŸ„ÂètÞ>PBü¾gèʯí‡ácî½ÈþÙÎÙ#å¡~×V@5 û·¶NÄ#Ï‘Û+Ö‘b?’^ÿÉ >F¾b+Í©[mó"ì`sƒÍb9ÀüX–$Îç~¿h‘Dð9¤‘W¥æâ ïϱ^0@îJÛèc3qÉ’ 9ˆ!Çt ãÀ&]AÚÞ‚ÑížëåtGÀÖä^anj<’n\7Z:qô4ÆNR/Ah“ÞïRÙíà»÷­\YÄÚñĆpiâg–¬QKdx¤\_ÏM(y™KKç‘M˜•빦 gžó/Á"nz½öËEPïS·`zæ{eZïY½½²å ­Q ð ¸ÛèЂ—ñ½¾óF`’Ið*ÛÁ òoUÄå¢ãIéóu™È¡(Z¨ùËQð³;)$të; ˜Éÿ¥´ ~ÃS],>ÍàË#MH’FÖ­å÷•Á—3ëumnrzûàb.ßOØÃ¯³}•Õ|(cÂÙµ3@p½qwÝ¢>"f9ˆ‹†ã¡Ù}úNÜ@ntœ÷—Û æ)¯6ˆÙ3>¾“›¹¨s yØd°Š³EÜ‹ñ9i<œR2*|¤ÅøŽ_ëFšÏïšÕ΂üºò°¥[â`äÜ5P-2ŒOö™±^«³ƒÛ7:+Òƒq/-ûêu%Ø¡µ¥ú•ùrl¿y“îÉïV¸ù\‘[A»žÓAÐL—×ê+Þ VåiŸÊ~îÓöC3 KÖ †?™Þ<""î¿ÏÞ¡8Ò$v1,›‡ð› ³zË5Þ*$ËÌfÞ.ž¦E¢[{yí€DòÚžñ |. wT’Št0ÓdCÒµzgµ®i!Í·Q/ã‚ã~ß»Ô8UpÏŽÞÓu¥4å¸j¦ŽìžŸñHáÓÚñýýë®\0..žØ×#ÆËò “‘BÑУܧùˆÃ·Îµ!Ï8R|# QlË«/å¼îê©«u#œÐðÓýæ(Ò»g²ºY. Ùö} H{´öwðxˆÏ» zRMk#(0¹Íéy‚ð{ï©id»ñ£k‚®;x¯~pš| v:I‹nCë@G»þ‹áÖðsU=þ.×ÜûÍo©‹oE¶ðè{Âä›<'ßcüœÛ•dÞ®oýÊÞzd_0Ä™ü-qÑ‹¬ûÑöL9s2¤ÖÞï"<‚ŽšÄ"ÛÞƒU/E7ÞžÁçµþs^¼Þ©]•OÛ(àŸÇj¶LJ >ø(ŠùêzÜ'T- {â sÛòAwµ90þA ²‹Ñf;¥“ þg+yn ¹€K§ Ïj ¸pÏtP¥þó9IµäŸr‚Ǽ@¤w©ŠÀ9~–uï–Y{`Wü!׈¡#HŸC"ñJ#Ƨ}ÍOFÑ¤Ž‚2É:ëc¶¶^ffAO¸Àí²!ïÖCûÿøL“Bø‚`ŽÉÝàÛu*·=ž l?^›»JŒ3v• !uAno{"Ⱦ(+7»5ŠäËøÌÏî’GŽõRmãSM ÏrãFü­9 ^V/ 3á‹Ô­œ>9D$·jÍXëR…Œ”6Q… v‚áW]ίâNÖ3¤tØ´–§ø{ßx#ŹeÙNg0<ÞµnvÖ¥lzd5Š|Ó¼®®«¡"ó«2ó}2Ès/½[ÍD5 +ˆ8rØ‚èœz.~}êûÃ/!dèÞÎÉÄ‹kuØm×;ºA.—æŒl, 8-½ZÚ{E‡1 j(€0òIËÈó:È6NÚ|·Ôe(¾2tÚ™¼Ï2ðÙ›AàîŽÈ³9àðÈç™KhÔ¨ñWû"‡t§qç}ÈŽh¡pãòaÈ?Àõè xÏYF€b²e+A)]›™Z’×á Þ•°yùàêÖÝkû¿š{V/©qªl!ëăÃ}”;…AH!?öETRîzò‚F+Ä•UøÎÉU!;7›ŠÈò ,@¯|(|{šÎ¨8ñO@÷µþ1°Îk»Êyô2HR<¶]+lýÂõ›·°BdÄ—èÂÙ7H?ðpAA¿ûíÙ*©:Nùàâ]˜X) ¾Ìœ{ìö·‘^P/¨d­>vÞ÷ øÁ]sËiÅÃà4pxåÝï.ÐÓj-‰¼ú1 ãw©LˆÒ÷°Q%¤CŸ1¹³!÷³==^Ü/Sžn<“ îŒ7æKM/³=Kþó`KìÛìnKA ÷ŶõîDÞ6;îWXqÕ…RI›i¤tåuðÜMðVc¾y¬^‘ùg÷&qôƒÍ÷3µŸòÀù³ûp`9Ø•5Òï‚@»ˆ§­I@Ý}öν,Äd×èþkÕ ÌR/ï쓊ÅfJø–µã:%D9• 6'ž.q„ƒŸXÇr»Ùgäè².áJé0(dÅÉ›ºM£¿¯—>Ú‘Â×ü‘Y€ÅÆÑC§Áü"cirÛóÎdŽ#䢩|‹&q ¼wgO4¬õäƒÊ?bXý%Ê!gñ{ ¢ýëݱ¡väo¦lK£ p†kAÍ÷ dÇÎ.ÑèˆR\}Δ<‰¢Úˆ‘ÕG™°9Aäý'жq¥ ¿!Š%ŸžƒØ&8¾áu7x;Åw\Ž\„HYž6+0{%íC$?DÄ6]©Þ/‘àZ7l÷6[ <ß1*qNÈ!똑¨íGòƒÇî#Ã7³ÀŸšpr]Uííe|žr×nÉã‡ÀtMæ¾ùÈ–‡ºg¢û.«]ãüZ 9¾QR •Dö´rü€K7w¤c’€"UT¿íèÿ½ßõ‰vðbã³'÷‚/ëþýŒï¬@N·LPµªyÏ2¿“è‹<Ò—×½¸Wñz­ßeÞq¥9&O±nâAž¢>"e ÝàÛb;ìêy ysEí8‰Bl7„×yˆm¯‡ÀÐêÀ·Sk¯Gã¶SÁGzƒ¢ 5Ç7Í;:Ry ¥¡Ý:ƒªË(°me.ƒJ "”ÞUŽ®»(EÌ…ÙÃv .Vt ’‚ÎÝKg÷  ôneq‡u%g`¥«(‹ìVµïrØW# Í¢Eã¿ IØÔ²¿Ï¥S5>†ÈÝ^ëû~š9œy .<ƒ{+ O‚ÿ(ÝÄæë(Ðq`µ4AEÓ}Èä0ŒBÒç-ù–Ptá°vd„2U•ןFdáÇ·zJ==6oÙ“G"î.BJ Cù­œ-`rãF)ëŸÎ‘BTä:Ÿ=LtªóÉñÂ&‘DðίÙÃÆ¥Œî$œzÐbšŠÌR$Q@ªL­Âïp°7øþuçëvØçp:ºšî%83¼yaþeæ?Ç…lEÑLD*œïßœš]þïmÈ[#œ*sk‚dÖ 5Ú óã>mjö]Hà`­äÞ(Áb?ÅayK“í²~…õûFJlëG6ö—J»~Büsèý^påìæôŸC!ó”·ˆM@ sJûÙô|ðöјL3x ú…O‹DNÃHÙ©¬=rÎÐvÞB Y6µÜxªr+Ý"&÷~%9äòcxeËÜgðü©Êí<„È­VG€ÝáÆ«Mñþ`A¾–Ü ž?¼4v8!6î?*¸+Sò2Æv@ä^ÎüŸ‘àw@¼á·’58Y¶Ð3ð‚US‚á‹tGäMcû[é™D2^k8¯·‚…"èò[Aðx¾ø:ÒQ° þÞôÆö( úïUÉw¦Ó÷^€¨ú[>Ë-à’?›°é3øö{¯ß„#VÉÝ`yO·]C.QnÎ}U­C>•ücùú$•?vN™ Q¹WnL†pá‚á·!P’fäëIäpFmk§>(ƒ²_¶DÎöïŽßÈ®G m™í-p ü“¦î‹º‚3_Ûj!Š ¶%÷€Ã)~Óò\ˆH¸Ls¨¼Yü]ŽmÌ—E ƒÚæy0^Èœ“4ÓF$§[oØ×êiñIáPo ö±o¾¤ ¡æ³Mcy·‘nž>3¾4ï’sY«“Õ¤–J„5‘x ¿ÚH?¯ò\õåOSõN£WÇ@ËÕb}(m( ª{ºùûû O‹þ&³2#ví®KŽÓ`bI¬r^«üÂKmæ4!õ‚g>0Ì®ž‰ã}~ÕŒšÎNäZê:X€4[ZM˜vþÖžù»~"8 T CZ㌼`œ2x2îkÝ?€*nüöÖ•p½­‘l&pñ—]I—â¤AW_šœ‰,duV€èó´v«äªf©€ï—{7T,GÀùž¬'Û®2¤ÞjÛ¤†<%Û%¨GÙçÏX‚Sð¦kÚaãH7Ñ.ëz¡1rI“¸\z¦…æ¹4÷{¡è4±ÇRß™üáCsZ“!*®ò:X Ç_žjï? !o½õÙVZ‰þçãÿ*Hzq“Å£øb0 nõ?+( Æi%Wžéˆ!ÂëïS€T)ÇË»ìÎS¶!ËbŸ8ü¦ÿŒÜ £æZºH}X£a,/ ÈãÛ‚zn¼†ˆ M/ÙB ´OÅhªá8>M_]×À€¼OXø¸hd!Wš²•Ô£(lso­ª;P§nLœö/\Û¾g/‚JÁ‰ s× ¼eŸÍ®w%àÒÜM^Ö•@jïn²?çD"oòÌ[êÁo6\¤ êS.2N!ב¾b¹sÁܘåÐ{;U!íö{Kcæ#›@Û0Íß‘ÏÛ™ôËŽBàeùr'0äïòWZ©ú«Á©x°ichÞ&‰ßRÍck4õÖÝ»v¢"ô÷qlœn>\âYëc=ÄñÎõ²V a=xQª8¦?UÉÛÀª£²ˆ¼_Úâ—Jþù?¨gÑ‘7™Òs(º Ô@°u÷ ,‹LGþácl>Ö¹øqp]ø»²oš¬"ÒÏœ<÷™} ù)p᛾ Z¿eÿ‘]ˆ:Ûfsî)¸»5é ‡ «±)Îïd(0ü­¿QÃ'[Ú~:€íS–CIoòÁ•úeY>î Øõë–l…ðK{nìž‚˜º#¥5]sºtÔ×5ðÏMG•#vÜÒº¹Ïñ3È‘Ý+˜kªysxšô®Kƒ0UÊÁÑ­Hünè=IäóĤsÕ†"´ßÞ ¢+@÷éØtEvC„ÏʅϪ°µ pœ¤ÿ{îŽÓF <¨¹[1ŗܼР!í[³¦ÆR ýìz²4ã”VÚ›¿ÆQŠú O…“Ç x¹–r×ê( {yêþ=DŠvÜs$' X&Ÿç¿ Y@ž“\~ ˆâV)ú$ý&„¨/¥¿@qþO”\R1CCA?’#^|ÑrdOíÙ!éh†ì#·º?ܵÖgé­¼U5®‡áߕހI‚M³Ö'að-ª`b§×¯K9«W ÒŸléªÂ‘oý€åP¢¶ÇP JñšÛÅ»¶Èˆ~ îG[0¸2œ:wH|_Íý¦ C”CÌïCÀÅhYÚÙ¨¼ª›WÜäõË¿Š*g}‘•v™×÷¥(VÀ+õÇr߬y™Ï,IÖ)0·ÜaûõTÖ ´×MN¯ÿ£"P¯_ýPZµ $ƒ3Mk}øu×;0Wz-W¾k½KG!XÄõjäÎþæv‘ãYpp•õ´{óyyÜüÞö@E_š>9´‘jƉÜ\@Ilý¹èƒü>}·Éµ‰ï#·½6 ±÷$~=âl†ˆ†ùMg1ñdEBž4ò”Í{ÑélŒâ¯]9’Øn‰rÇv<¼1œ¢U#þ ÈŒcñª:Ï:”eýåñKM÷ki¿ìioÿZœµ S‡ àëd¡A:$MKEä² ·¨û¿­>ªžQLÖÄ,ä½t̶JFmZM[ÓtÐÌ 2ÇR¸ lZÍ<•YXÐgr  ’asp0 Ÿ$ 7=‰D{+OÜÖXBŠx¬Pª³>ŸÉRDÌš8œÞ€"›"dÎ}-@y”æJa¤Ô­qŒH{òÜ:/ßúÚö‚ÇwÙh#·Æ£`y ‰Ó3‚¨fŸrÙ‹äÀ£ý‚3;²BåŒe—Á;E:êþµtøõ<ɲ|I)Ç&w#Êøˆ§Ø=Gpã åñC¡–ë.@äY18|²yà[åÚVøÏu 2 öå=wY@ÔnÛ²9S¤ÈÃÜ\zY˜¼MçÒ‡´›z*¡š™@œS Pê!¢X÷[ “ Ûxs{A¾65‰RÀ*ùãpz)Ƚýs~¥ÿ¼eö£.ÞR”ã8'†lKæ|ŽÞÛ ÆÇž—;†\/²Ð/šé‚'ƒ\WÚ> ™dx‘Èùìîþè²gî¸Jã4øWç‹O©Ã®§²OhwCðvùn‡wæöÖ_W°ÿÝ/ôçcÃ%z.0ç¯Z@ÕˆÊT2e2ª±“NËÉ-ÈýDýý‰t@g®ì¥rj œÊ·u×ç‚+åòã|ü[ô{ºÉùÞá2]?aÎ ³kDzæÍ‹êÙàe²câûúvp]¬k=φ"áÈÓ/Wekïå µ@}Ç)BÊX‡¢ßÏ{vã!$]|â–tB“3j·–@î¯|[½|¯Cô–,wo äè¦êäØID޾Lw§X!¤Er¢çþOðÈ=„Ò£”wŒÓl@PŸOg¡@B@rºäþ \ë }Ù¾V¯¸tÝIMnǹú’ÍÎ(´tF¥u™tÏÕÅÚë°C\«°EâQˆæ.|úÊ ¯JÍ®ƒft~è§;ß;´íî› ¤}þuA€¯PûÂå$zå€\C»-¾à˜ÕY‹E1[£æØi!*Ô“Yœn3ò>2!Ååv¤ë…ὡSpd8²øE»ù™Àªdxƺ( 4k1WDÁeXãöº âÂÝ Õá*ŸÉÌwG°¶›k›ž±CZà }”Ö@"éýx¤ ±ˆ¡ì›vƒyi]mÑav´åï¾Ò®§+)z'rÛÂF?íòK‹zg!H%‰û—A ÙÆÂ¾¬ |5ÄAxý Tª-Ûkz 'ù·ï øðnÍš6ˆCæz\,½šˆ¨Ä¾hì0âêÎ~3ü‹’;ÄCÌ'‘…éÆl¯Á>äÎ ´ƒ‘,ýøõËPˆ‚×ÚÏ@ÜáDwú‹ku6®#ÁI.–ã¥o#¸´8¶%Þ\Ö«(³Ï@D¾Q1½o?8*?¸ºÉˆ=K{Ø¢î@âÚÁ.º?‚¹/±îŽqÝúÊmŸ“(ºãg¶„ä*°vóõûñ #]ÙzJrÿëÓÕþÎH–HKî{ÛîN:×3CâSªË,-#Òé²Xp©BfŸk¨²¨@{xæTø–cª`·÷¹&¯æˆ<8úü-×yØSñ¾1ûæä·â>iu¨ ¹ù¯Ó _¤‚ÿ›†©SµÜ¦Ÿ³ß!!âä[4 $Ç™…õׄÇ1Á`ê?×'¾½rø™mkØøNU)ž•ƒp§ÉëƒcÈ>AKÜÚÑ¹Ž‹3Ãé%H* ù0ô…3 ž‰  A6ƒùÛ‹¿Ïžb&éÌ4ðãñµ^þ\„,;ÄßÍÝp€H¥‰ö VDä?òJµ¸äït•`;´syˆyLEÊc@bOòN柲=Þö7ùy‘Îl“Õ Ú4rQgã!XéA±ü‹r0Ü í×t„¦¬8°ÆƒNÃbˆöÈ'°¿°o´ëú{ÿ˜—C^@>\ž±A¯;­ƒÈ5 [ìèùiˆb¥]¹ê7°¢ÀîpË~-N^¿ãÐ Ûõ(GOPôBÒ½j(9-ïåÜíË^!­ý|Îù#¾@–`»ðsüô«iã]QÊ^çG€Qž°ºRGͤDG€Ë*ò«{/ÝÙúR[+×z ˆ0)êä8 ;$Ú æÐˆ·T$øzÞ[§Ÿ$‰‚®l6{ͱù”¦ØÑ£8›•úª²x}Ò`õÄ:p햬؎l=Ž]sqa…D¯Ðá yðÑcØx`­S±/–ÑHF²ÆÉ±îÃD ºÔýbÖ2sSós§,d)Uñ,&ö_·Š¢ó#SÖVš¿î&EC¿62ý‹0®‘Po é¯[qbG³²ö`ÇöσÎ^ÏôŸE›ÿ,šþ³haùϢ倮áïEú¿îY¥ô?ž(Êþ'ʲÿZ)úèPrTäÿïµ`¢†E’£Èa¡­ Û_¿?Ýg}—þz9é>{KCÄ#á/òÿß×ÁãBÙŸ±ßûþ³Ø÷Ïc?0ûþÏ8hŠýà)ì§±2Âþ½~ O`ÿ~ûaì‡aÿá0ÎÿðûêØ<„ýÇØ¼ÇùŸ”°ÿ´ûOØ–Çþ‹ Îÿ’Žý—^ì¿Jbÿ5ûÑdœ?úû1QìDZ{Šý·'8\ûñhìÇcÿû;pþ0ì<À~‚û‰ì'É8ò6öSØO`?Õ‚ýôMœ?ÂýŒ7ö3×±ŸeÆþ'Îÿé†ýÏZìçÖc?çŒý¼Ο¯Æ~~û_vØÿº€ýïJœÿûö –Ø/”c¿ðûÅœ¿dŒýR öK“Ø/`¿¢‹óWŽc¿2†ýª6ö«Gþøç4:xùãŸÓªÑàñ ÃüóuƒòŸÓ)`O—=]?öëe±§—JÁc*öô¯±ß Žý†}Ø3$á|†gØ3 cÏ=cöL8ŸyöÌ‘Ø3·a¿q'ö,Ûq> {–{سraÏ„=[ ÎgkÅ~;ö›HØojžýÎß¼ûÍ^Øo®Çžƒ{NzœÏé‚=çì·¬Ã~‹#ö[íqþÖ*ì·.aÏe‹=×9ì·UàümsØs›cÏ}{îYì·Oá|Cìyбçùý=ìwÎßyû_±çÕÄž·{¾|œÏ÷û]*ØïÊÃ~×öü8_@{LìÞb/(½ÎJÁ^èö»±Þ‹½HÎéÆ^T{ÑXìE;±kÇù»y±ßŽýîGØïáÁ^|ÎÆ^üö[°— c/éó%›±—bÃ^Ê{©Fì¥p¾ ö2ØËÔa/»{9:œ/焽Ü%ìåi°—'`¯`‡óÎc¯°€½¢5öŠg±W*ÃùJ?±W6Å^ùöÊÓØ«Là|U}ìU‹°WÇ^M{u-œ¯~{õÏØkh`¯q{Í8_ó=öZJØkíÇ^k{íw8d°‡tì¡{Iìu÷à|Ýdìu_`¯'н^"öúq8_ÿ öØDcoð{Ã6œo´{£0ì`o̽ÉVœo„½ÉmìM9°7 ÀÞÌç›ÝÄÞœ{soìͯcoq ç[2`o醽åUì­ÖcoM‹ó­°·®ÆÞz{{ìmmp¾m%ö¶¿°·³ÄÞ®{ûÓ8ß~{‚1ö„ì “Ø;|ÇùŽºØ;ÇÞq {'mì5q¾söÎ#Ø»¨aïr{×\œï:„½›önÙØ»õcïÞ‡ó=¤°÷HÃÞã5öžâØ{‰á|¯$콞aOÁž½w Î÷îÀÞgö>‘Øû´cïûçûmÇÞ‚½ß=ìI\Øûsâ|ÿ@ìý[±`Ç>€„} Î¼=y#öd/ìÉõØÕáü`zìƒ]°¾‚}È:ìCVq>…€=¥ {Êö¡¶Ø‡Yáü° ìÃæ±§šcO=ƒ}x)ΟÂ>Âûˆ“ØGüÀ>òÎ죎bõûh-ìcÔq~L>ö1°UÁ>6û¸œ7€}¼öñ™ØÇ¿Å>á ÎO”À>1ûÄWØ'íÆ~¯(Îß›€ýÞnì“…°OŽÅ~_Îß÷û^ìS±Oy„}ê}œŸ¶ û´ìÓî`Ÿ¾ûŒÍ8?ÃûŒfì37aŸé‹}çg5`ŸÍô—ÿW¡¿Á?,‚âý×Í3ÙñWÿôŒ".R")¿·FäP}Rh)â?p·elIø· ù†Eø™¬µtœ4ÿo4ý÷^ìÿÇ7™"Âb¥ÿ°þ_³}C¼##ÿµÌ~ÞQÞÒþkóhþôrÿ{J9*„ô¯Må )$~{R™ÉoíDòú×4V¿0ßhÊÚV{ÿÕýkº !šÄoæÊ//Ë/§¢®¨¦.«¼¶,«ÆïÏIŠøkçüëÇm\]k0ÿ׺F­ãÜ2P½}ƒ½HÿÞ¸ÿ9áO£úçñ_ ¹ûç6yfPortfolio/data/ECON85.csv0000644000176200001440000006625412323217770014745 0ustar liggesusers%Y-%m-%d;SPI85;SBI85;SXI85;IBOR85;LPP25P;LPP40P;LPP60P;MSCIW.USD;CHF.USD;WTI.USD;CFNAI.CUM 1984-12-31;648.68;34.82;47.55;100;247.87;211.17;174.27;291.61;2.5602;25.43;100 1985-01-31;688.86;34.95;47.77;100.427;254.72;219.45;184.01;307.64;2.659;25.64;99.8202 1985-02-28;687.74;34.78;47.82;100.902;256.38;222.45;188.32;308.16;2.8045;27.27;99.8401 1985-03-29;687.74;34.86;48.2;101.3862;255.2;220.34;185.28;318.78;2.8033;28.24;100.3406 1985-04-30;710.31;35.19;48.37;101.8413;257.4;222.13;186.38;317.82;2.5948;28.81;100.01 1985-05-31;735.61;35.4;48.56;102.2748;263.23;228.79;193.82;334.08;2.615;27.62;100.441 1985-06-28;774.99;35.52;49.08;102.7147;265.44;231.14;196.28;339.95;2.5721;27.14;99.8701 1985-07-31;786.84;35.68;49.91;103.1478;261.65;225.7;188.91;346.88;2.406;27.33;99.5212 1985-08-30;833.42;35.97;50.2;103.5456;265.83;229.92;192.89;349.64;2.2962;27.76;100.1601 1985-09-30;796.44;36.13;50.94;103.9393;264.25;227.08;188.83;352.16;2.3359;28.29;100.4711 1985-10-31;881.13;36.38;52.01;104.3305;269.14;233.17;195.77;371.02;2.1692;29.54;100.1601 1985-11-29;940.52;36.5;53.33;104.6825;273.23;237.87;200.93;391.67;2.1306;30.81;100.6119 1985-12-31;1018.32;36.87;55.38;105.0468;279.93;245.42;209.06;409.91;2.1042;27.23;101.0353 1986-01-31;971.1;37.2;55.08;105.4056;279.85;244.37;207.11;415.87;2.066;22.95;101.7858 1986-02-28;954.77;37.61;56.16;105.7471;281.58;245.58;207.87;453.23;1.9547;15.44;101.0454 1986-03-31;1025.53;37.86;55.5;106.0903;291.58;258.16;223.28;497.42;1.915;12.62;100.8435 1986-04-30;1052.74;37.9;55.37;106.452;291.98;258.25;222.69;510.97;1.9016;12.85;101.3896 1986-05-30;1083.96;37.9;55.11;106.842;293.4;260.52;225.99;509.37;1.8538;15.44;101.2072 1986-06-30;1017.04;37.81;54.71;107.2902;291.11;257.6;222.43;529.67;1.8406;13.47;101.005 1986-07-31;942.28;37.98;54.24;107.7243;286.7;251.1;213.97;533.80;1.7445;11.58;101.5215 1986-08-29;1038.65;38.39;55.28;108.109;295.29;261.25;225.39;580.30;1.6616;15.09;101.5824 1986-09-30;997.99;38.39;55.59;108.4826;291.58;256.14;218.79;557.09;1.6537;14.91;102.2346 1986-10-31;1046.82;38.68;56.39;108.8382;296.55;261.65;224.72;547.38;1.6433;14.85;102.0916 1986-11-28;1083.8;38.92;57.24;109.188;298.36;263.52;226.58;570.39;1.6858;15.21;102.2448 1986-12-31;1084.76;39.04;57.71;109.5726;299.7;264.74;227.76;581.61;1.6647;16.08;103.3137 1987-01-30;1049.7;39.41;58.37;109.9047;303.01;268.15;231.49;649.78;1.5616;18.66;102.4803 1987-02-27;1007.2;39.54;58.84;110.2341;304.66;270.18;234.11;671.05;1.5403;17.73;104.2477 1987-03-31;1024.1;39.66;59.27;110.5943;307.89;274.15;239.11;712.44;1.5391;18.31;104.54 1987-04-30;1006.1;39.82;59.98;110.9306;308.91;275.45;240.8;754.05;1.4959;18.64;105.0115 1987-05-29;1001.4;40.03;60.21;111.2757;312.22;279.1;244.95;754.93;1.4705;19.42;105.7281 1987-06-30;1045.5;40.11;60.6;111.639;313.8;281.21;247.4;754.32;1.5085;20.03;106.0881 1987-07-31;1121.7;40.35;61.24;111.9871;318.44;287.14;254.43;769.22;1.5365;21.36;106.9937 1987-08-31;1127;40.35;60.86;112.3328;319.62;289.09;257.47;814.51;1.5364;20.27;107.4763 1987-09-30;1173.2;40.11;60.91;112.6796;319.94;290.3;259.5;800.15;1.5029;19.53;108.1555 1987-10-30;884.3;40.11;59.17;113.0804;301.43;263.76;224.29;664.11;1.494;19.85;109.4393 1987-11-30;786;40.68;61.35;113.4425;296.23;254.84;211.68;647.76;1.3825;18.92;109.9879 1987-12-31;769.4;40.97;62.18;113.7876;295.92;253.54;209.65;675.62;1.3304;17.24;110.7384 1988-01-29;764.99;41.34;65.11;113.997;303.71;262.55;219.89;691.91;1.3466;17.16;110.495 1988-02-29;828.73;41.79;66.08;114.1523;313.01;273.18;231.74;731.87;1.3916;16.77;111.3046 1988-03-31;812.26;41.99;68.61;114.3202;314.03;273.83;232.25;753.77;1.3863;16.22;111.8737 1988-04-29;822.21;42.32;70.57;114.5134;317.81;278.05;236.91;763.08;1.3823;17.88;112.4232 1988-05-31;822.19;42.16;70.74;114.7439;318.29;279.02;238.34;747.63;1.4111;17.44;112.4007 1988-06-30;869.43;42.2;70.29;115.0356;322.78;284.78;245.28;746.39;1.4629;16.53;113.1903 1988-07-29;884.69;42.03;70.66;115.406;325.85;289.57;251.97;760.22;1.5343;15.5;113.3035 1988-08-31;885.5;42.16;71.05;115.7573;325.61;287.95;248.84;718.25;1.5837;15.52;113.3375 1988-09-30;910.85;42.24;71.58;116.0922;330.42;293.71;255.53;748.52;1.5764;14.47;113.5076 1988-10-31;936.43;42.61;73.64;116.4526;333.8;297.2;259.08;798.13;1.5372;13.8;114.2593 1988-11-30;921.74;42.69;76.03;116.8664;332.7;295.74;257.22;825.71;1.4675;13.98;114.6714 1988-12-30;942.5;42.73;76.97;117.3468;336.72;300.93;263.74;832.96;1.4799;16.27;115.5462 1989-01-31;964.4;42.32;73.86;117.9227;341.44;309.05;275.92;862.88;1.5619;17.98;116.0209 1989-02-28;955.6;42.08;69.79;118.5261;337.11;304.34;270.59;857.24;1.574;17.83;115.5231 1989-03-31;998.1;41.91;69.84;119.1078;343.41;312.62;281.17;851.52;1.611;19.45;115.373 1989-04-28;1035.1;41.26;67.75;119.7672;344.04;315.62;286.76;870.94;1.6469;21.04;115.4076 1989-05-31;1005.3;40.31;67.06;120.5935;338.69;310.92;282.7;849.37;1.729;20.03;114.4422 1989-06-30;1094.5;41.34;70.4;121.3495;346.17;316.84;286.42;839.56;1.7089;20.01;114.1565 1989-07-31;1164.5;41.5;70.09;122.0595;353.1;326.18;298.52;934.19;1.6281;19.64;112.9754 1989-08-31;1209.4;41.42;70.4;122.8247;355.94;330.64;304.7;911.36;1.6605;18.52;113.5871 1989-09-29;1176.7;41.26;68.67;123.6399;351.52;326.01;299.96;936.86;1.6866;19.59;112.8625 1989-10-31;1107.8;41.05;68.88;124.4669;346.72;319.68;292.01;905.38;1.6302;20.09;112.2996 1989-11-30;1140.9;41.22;68.95;125.293;349.56;323.58;296.91;941.28;1.6189;19.82;112.5244 1989-12-29;1137.9;41.05;68.67;126.256;348.61;323.01;296.83;971.30;1.5686;21.09;112.4682 1990-01-31;1102.3;40.03;69.46;127.2795;340.55;314.29;287.23;925.70;1.5175;22.64;112.1537 1990-02-28;1096.2;39.99;69.87;128.2711;337.07;309.46;280.97;885.75;1.4879;22.11;112.9189 1990-03-30;1079.6;40.03;70.49;129.2368;335.19;306.26;276.17;832.01;1.5133;20.42;113.1224 1990-04-30;1044;39.95;69.68;130.2504;331.47;301.24;269.68;819.75;1.4866;18.58;112.1313 1990-05-31;1173.6;40.44;70.59;131.2105;343.32;314.33;284.72;905.82;1.4198;18.24;111.8737 1990-06-29;1192.7;41.22;70.82;132.1982;347.67;318.01;287.52;899.10;1.425;16.87;111.639 1990-07-31;1178.31;41.54;70.8;133.1882;347.28;315.96;283.63;907.02;1.3924;18.64;110.6719 1990-08-31;1018.8;40.93;70.95;134.149;333.58;298.5;261.84;821.84;1.3076;27.17;109.9989 1990-09-28;894.5;41.05;71.24;135.0744;323.6;284.24;243.14;734.91;1.3069;33.69;108.8935 1990-10-31;925.6;41.3;72.01;136.0134;331.37;293.71;254.16;803.23;1.2818;35.92;107.2937 1990-11-30;901.3;41.38;72.1;137.0303;331.8;292.92;252.11;789.75;1.2569;32.3;105.2112 1990-12-31;908.3;41.54;72.12;138.0331;334.09;294.71;253.56;806.00;1.2814;27.34;103.7589 1991-01-31;924.8;42.32;73.5;138.9709;340.24;300.7;259.2;835.20;1.2714;24.96;102.112 1991-02-28;1017.9;43.1;74.86;139.9296;356.08;319.66;281.21;912.22;1.2685;20.52;100.5817 1991-03-29;1059.1;43.35;76.03;140.939;365.21;332.13;296.6;885.06;1.3918;19.86;99.1437 1991-04-30;1073.7;43.84;76.46;141.9556;369.06;335.54;299.55;891.70;1.4399;20.82;98.8665 1991-05-31;1123.4;44.21;77.59;142.9051;375.92;343.38;308.55;911.64;1.4574;21.24;98.4718 1991-06-28;1091.4;44.33;77.26;143.861;374.76;341.78;306.28;855.08;1.5297;20.2;98.5211 1991-07-31;1123.3;44.53;77.61;144.8158;377.96;344.83;309.51;895.19;1.5481;21.42;98.2849 1991-08-30;1122.5;44.66;77.68;145.7921;379.98;346.27;310.4;892.07;1.5201;21.69;97.7947 1991-09-30;1078.8;44.74;77.85;146.7979;380.28;345.36;308.01;915.19;1.4803;21.86;98.0885 1991-10-31;1078.8;44.37;77.94;147.826;381.53;347.27;310.74;929.75;1.4781;23.23;97.4238 1991-11-29;1040.2;44.53;78.27;148.8303;378.54;341.29;301.59;888.95;1.4348;22.47;96.7635 1991-12-31;1052.8;44.94;78.85;149.8493;383.92;345.94;305.59;953.38;1.3855;19.52;95.7433 1992-01-31;1111.5;45.76;79.52;150.7888;392.54;355.85;316.65;935.45;1.4039;18.82;95.3229 1992-02-28;1149.6;46.17;79.94;151.758;396.58;360.37;321.77;919.02;1.4561;19;95.3134 1992-03-31;1138.9;45.97;80.72;152.8925;393.09;355.66;315.91;875.45;1.5094;18.92;95.7337 1992-04-30;1169.6;46.09;80.74;154.0275;397.28;360.54;321.55;887.37;1.5194;20.24;95.9733 1992-05-29;1203.6;45.93;81.22;155.2437;399.71;363.26;324.74;922.38;1.4907;20.94;95.8295 1992-06-30;1174.95;45.72;81.38;156.445;393.72;353.1;310.54;891.20;1.425;22.38;95.705 1992-07-31;1135.45;46.17;81.9;157.5735;393.96;350.56;305.16;893.18;1.3347;21.76;96.0213 1992-08-31;1096.02;46.38;83.34;158.611;393.85;348.83;301.7;914.61;1.2966;21.35;95.3515 1992-09-30;1145.77;47.73;84;159.5368;400.2;352.39;302.67;905.93;1.278;21.9;95.2753 1992-10-30;1152.76;49.12;83.61;160.3866;410.72;364.45;315.74;881.10;1.3176;21.69;95.552 1992-11-30;1151.28;49.41;84.35;161.285;417.3;372.61;325.15;896.59;1.4291;20.34;95.6571 1992-12-31;1238.57;50.35;84.78;162.0934;427.42;383.14;336.18;903.55;1.4219;19.41;96.0597 1993-01-29;1264.17;51.13;87.95;162.8296;435.98;391.6;344.41;906.30;1.4774;19.08;96.3869 1993-02-26;1286.76;52.32;91.24;163.5776;448.16;403.75;356.35;927.50;1.5178;20.05;96.5412 1993-03-31;1343.76;53.26;100.04;164.2864;460.37;417.57;371.49;981.00;1.5206;20.35;95.9637 1993-04-30;1323.71;53.55;96.92;164.9895;460.36;417.11;370.46;1026.20;1.4599;20.27;96.3098 1993-05-31;1414.12;53.79;98.84;165.6999;465.49;422.19;376.02;1049.57;1.4504;19.94;96.1847 1993-06-30;1493.6;54.37;99.23;166.3961;478.27;437.26;393.41;1040.50;1.4769;19.07;96.1174 1993-07-30;1517.95;54.9;98.58;167.0474;484.7;445.06;402.4;1061.66;1.5147;17.87;96.1462 1993-08-31;1573.66;55.27;99.52;167.7188;492.13;452.57;410.23;1110.07;1.4966;18.01;96.1655 1993-09-30;1562.52;55.55;102.2;168.384;491.96;450.01;405.01;1089.29;1.4182;17.51;96.5605 1993-10-29;1703.99;56.29;109.65;169.0255;507.5;466.75;423.7;1119.05;1.4432;18.15;97.0154 1993-11-30;1738.63;56.58;115.81;169.6605;506.57;462.48;416.41;1055.48;1.4969;16.7;97.4335 1993-12-31;1867.84;56.91;124.05;170.2447;519.35;475.99;431.3;1106.87;1.4634;14.51;98.0199 1994-01-31;2007.47;57.15;126.17;170.8242;529.43;489.19;448.14;1179.62;1.4716;15;98.1278 1994-02-28;1850.25;56.91;117.68;171.4192;518;477.32;434.87;1164.09;1.4565;14.78;98.334 1994-03-31;1805.41;56.7;114.49;172.0185;508.52;465.85;421.13;1113.64;1.4292;14.66;99.5809 1994-04-29;1781.13;56.29;108.84;172.5928;505.71;465.42;422.95;1147.81;1.4383;16.38;100.01 1994-05-31;1789.92;56.21;108.04;173.2052;504.35;464.74;423;1150.50;1.4125;17.88;100.7931 1994-06-30;1729.02;55.51;103.19;173.831;493.86;453.08;409.9;1147.04;1.3727;19.07;101.3896 1994-07-29;1709.83;55.92;103.53;174.4659;498.95;457.99;414.56;1168.59;1.3239;19.65;101.6027 1994-08-31;1744.35;55.64;102.35;175.0941;499.79;460.5;419.01;1203.51;1.3184;18.38;102.5623 1994-09-30;1683.39;55.47;99.7;175.7062;492.13;450.82;406.87;1171.63;1.2892;17.46;102.8601 1994-10-31;1660.83;55.68;99.51;176.3022;491.61;449.28;404.32;1204.68;1.2648;17.71;103.6967 1994-11-30;1708.79;56.25;102.77;176.8932;498.01;455.01;409.53;1152.17;1.2956;18.1;104.5191 1994-12-30;1725.53;56.58;100.26;177.5277;498.61;455.91;410.53;1163.06;1.3289;17.16;105.3797 1995-01-31;1661.29;57.07;99.16;178.1205;495.86;449.96;401.07;1145.32;1.2863;17.99;105.6541 1995-02-28;1700.4;57.48;99.47;178.6966;497.53;450.37;400.38;1161.74;1.2715;18.53;105.4957 1995-03-31;1640.85;58.14;100.23;179.2186;495.99;444.37;389.83;1217.45;1.1709;18.55;105.3692 1995-04-28;1697.36;58.95;104.55;179.742;506.8;455.46;401.36;1259.60;1.1384;19.87;104.7912 1995-05-31;1818.18;59.53;103.87;180.2319;518.06;467.32;414.22;1270.09;1.1693;19.74;104.4251 1995-06-30;1866.53;59.9;106.01;180.7019;520.98;469.94;416.53;1269.41;1.1588;18.42;104.6342 1995-07-31;1871.33;60.39;105.73;181.114;527.59;477.74;425.37;1332.64;1.1556;17.3;103.9251 1995-08-31;1909.9;60.84;105.32;181.5485;533.93;486.01;435.34;1302.66;1.1962;18.03;104.8646 1995-09-29;1966.95;61.66;106;181.9247;538.62;488.9;436.51;1340.32;1.1868;18.23;105.0641 1995-10-31;2009.29;62.4;109.24;182.24;540.92;488.41;433.44;1318.93;1.1453;17.44;104.676 1995-11-30;2085.66;63.46;118.19;182.563;557.41;505.2;450.79;1364.44;1.1437;17.99;104.561 1995-12-29;2123.43;63.5;116.55;182.839;560.1;509.06;455.83;1404.05;1.1631;19.04;104.6237 1996-01-31;2122.27;63.13;116.29;183.1083;567.18;520.21;470.96;1429.15;1.1818;18.88;103.4067 1996-02-29;2177.74;63.64;113.52;183.3564;564.89;519.17;471.18;1437.56;1.1967;19.07;104.5191 1996-03-29;2325.46;63.92;116.96;183.6312;571.32;526.08;479.1;1461.19;1.1959;21.36;104.2477 1996-04-30;2352.06;64.51;117.63;183.9183;581.36;540.1;497.04;1495.25;1.218;23.57;104.7074 1996-05-31;2299.26;63.17;114.63;184.3211;579.3;540.31;499.25;1496.24;1.2539;21.25;105.2112 1996-06-28;2407.04;63.5;114.7;184.7152;583.84;545.43;505.42;1503.51;1.2579;20.45;105.8656 1996-07-31;2251.89;64.01;113.38;185.1101;575.17;531.11;484.35;1450.07;1.232;21.32;105.855 1996-08-30;2342.99;64.66;113.45;185.4455;582.42;539.2;493.37;1466.44;1.2029;21.96;106.2793 1996-09-30;2393.95;65.77;114.89;185.6774;597.69;557.83;515.51;1523.55;1.2343;23.99;106.5986 1996-10-31;2394.05;66.41;118.61;185.9582;604.76;564.32;521.29;1533.88;1.2586;24.9;106.6626 1996-11-29;2492.21;66.41;120.32;186.2782;617.7;582.1;544.63;1619.54;1.2752;23.71;107.2508 1996-12-31;2511.88;67.05;119.71;186.5694;622.86;589.98;554.93;1593.29;1.329;25.39;107.3474 1997-01-31;2728.33;67.72;120.59;186.8392;639.22;611.4;582.66;1612.20;1.3913;25.17;107.6484 1997-02-28;2851.56;69.39;126.18;187.1119;653.18;626.79;600.16;1630.44;1.4541;22.21;108.7194 1997-03-31;2946.25;68.51;128.38;187.4045;647.4;619.44;591.45;1597.88;1.4634;20.99;109.3081 1997-04-30;3094.65;69.12;127.17;187.6878;656.56;631.44;607.35;1649.81;1.4618;19.72;109.3627 1997-05-30;3195.56;69.93;130.84;187.8639;664.48;639.35;615.69;1751.34;1.4331;20.83;109.845 1997-06-30;3548.37;70.24;136.81;188.0891;684.97;665.94;650.73;1838.39;1.4424;19.17;110.3625 1997-07-31;3752.66;70.19;143.25;188.3343;701.36;686.93;678.46;1922.76;1.4824;19.63;111.06 1997-08-29;3378.83;69.9;137.83;188.5502;683.75;663.33;645.82;1793.83;1.5128;19.93;111.6836 1997-09-30;3626.07;69.95;139.09;188.8008;693.39;676.17;663.36;1890.98;1.4702;19.79;112.6595 1997-10-31;3474.77;69.84;139.67;189.1096;681.91;657.58;635.68;1791.15;1.4516;21.26;113.2695 1997-11-28;3634.65;70.27;144.05;189.414;691.27;668.97;650.14;1822.54;1.4069;20.17;114.2821 1997-12-31;3898.15;71.36;146.47;189.6509;705.19;685.82;671.2;1844.45;1.4393;18.32;114.4079 1998-01-30;4078.41;72.84;151.87;189.8388;720.36;702.56;690.31;1895.55;1.4748;16.71;114.9354 1998-02-27;4426.14;73.53;153.49;189.997;735.48;722.62;717.45;2023.46;1.4631;16.06;115.3499 1998-03-31;4716.64;73.05;149.57;190.2322;747.37;743.1;749.36;2108.60;1.4901;15.02;115.3153 1998-04-30;4657.6;72.41;144.63;190.475;742.11;737.87;743.95;2128.88;1.5051;15.44;115.8238 1998-05-29;4823.96;73.12;145.92;190.7431;744.59;738.03;741.6;2101.89;1.479;14.86;116.2299 1998-06-30;4932.36;72.62;143.98;191.0861;748.46;745.97;755.1;2151.45;1.4949;13.66;115.6271 1998-07-31;5146.74;73.07;138.94;191.3955;745.68;740.4;746.94;2147.68;1.5136;14.08;114.8205 1998-08-31;4216.71;74.29;134.87;191.6529;717.71;693.24;672.96;1860.96;1.4933;13.36;116.5325 1998-09-30;3692.44;74.89;133.13;191.9045;713.6;684.34;656.9;1893.55;1.4;14.95;116.4044 1998-10-30;4143.33;75.57;138.04;192.1054;730.13;704.16;682.54;2064.40;1.3373;14.39;116.7541 1998-11-30;4462.95;76.16;145.07;192.3858;750.78;731.56;719.03;2186.85;1.3852;12.85;116.906 1998-12-31;4497.12;76.48;145.09;192.6117;752.81;734.96;724.42;2293.35;1.3604;11.28;117.2221 1999-01-29;4532.24;76.97;153.52;192.8159;768.19;753.46;746.9;2343.24;1.3856;12.47;117.4568 1999-02-26;4470.42;77.13;156.62;193.0188;766.32;751.25;743.87;2280.57;1.4272;12.01;118.1518 1999-03-31;4539.26;77.07;156.48;193.2197;777.99;769.4;769.97;2375.19;1.466;14.66;118.0337 1999-04-30;4714.57;77.68;159.23;193.3796;797.27;797.27;808.52;2468.49;1.4971;17.34;118.0101 1999-05-31;4494.29;77.16;159.45;193.5445;788.71;786.48;793.81;2377.96;1.5078;17.75;118.8866 1999-06-30;4530.85;75.66;158.62;193.7417;790.93;796.95;814.87;2488.54;1.5374;17.89;118.7322 1999-07-30;4531.51;75.61;158.06;193.9231;782.83;785.41;798.89;2480.74;1.5474;20.07;119.077 1999-08-31;4607.21;75.24;156.81;194.1005;783.58;788.94;806.07;2475.99;1.5093;21.26;119.6499 1999-09-30;4570.61;74.35;154.05;194.4105;778.1;781.73;796.62;2451.64;1.5262;23.88;119.3989 1999-10-29;4705.24;73.53;144.63;194.7421;780.16;791.25;816.25;2578.74;1.4896;22.64;120.7075 1999-11-30;4877.5;73.95;145.29;195.0445;797.95;819.65;858.24;2650.96;1.5543;24.97;121.4339 1999-12-31;5022.86;74.44;146.26;195.3449;818.67;854.68;911.57;2865.20;1.5841;26.08;122.3848 2000-01-31;4717.22;73.78;147.05;195.6923;810.24;844.19;896.84;2700.79;1.5903;27.18;122.9245 2000-02-29;4750.92;73.6;141.84;196.0909;813.34;852.32;911.57;2707.75;1.6348;29.35;122.7525 2000-03-31;5075.78;72.47;142.31;196.558;822.34;868;938.4;2894.57;1.6636;29.89;123.4419 2000-04-28;5062.73;72.75;138.8;197.0899;817.16;860.41;927.53;2771.85;1.6657;25.74;124.2593 2000-05-31;5269.66;72.65;138.74;197.6096;811.96;850.32;911.75;2701.34;1.719;28.78;123.5283 2000-06-30;5293.34;73.51;137.61;198.1698;816.61;854.36;914.75;2791.97;1.642;31.83;123.7014 2000-07-31;5504.14;73.88;135.71;198.7387;821.86;861.35;924.38;2713.04;1.6519;29.77;123.2199 2000-08-31;5681.82;74.57;142.13;199.3171;842.47;890.74;966.46;2800.95;1.7149;31.22;122.6298 2000-09-29;5423.6;74.68;139.52;199.9134;832.87;873.69;937.68;2651.69;1.7586;33.88;123.0352 2000-10-31;5572.9;75.04;138.73;200.496;836.3;876.51;940.74;2606.94;1.7745;33.08;122.2258 2000-11-30;5533.21;75.84;138.7;201.078;828.12;856.67;904.55;2448.33;1.7779;34.4;121.7135 2000-12-29;5621.13;77.33;140.3;201.6434;831.25;854.14;894.32;2487.61;1.6855;28.46;121.1307 2001-01-31;5564.09;77.72;146.68;202.2189;845.77;872.31;917.11;2535.52;1.6305;29.58;119.8295 2001-02-28;5320.82;77.95;144.81;202.7974;836.99;856.82;891.45;2320.95;1.6686;29.61;118.744 2001-03-30;4952.28;78.96;142.75;203.3601;829.84;842.42;866.22;2168.12;1.6908;27.24;117.539 2001-04-30;5064.11;78;144.25;203.8989;838.46;859.38;894.61;2327.94;1.7131;27.41;116.0325 2001-05-31;5183.45;78.28;145.72;204.4442;846.79;870.95;910.74;2297.60;1.7528;28.64;115.0389 2001-06-29;5006.54;79.17;144.4;204.9965;844.03;864.28;897.98;2225.29;1.7856;27.6;113.3488 2001-07-31;4732.71;79.68;145.56;205.5421;836.09;846.39;866.54;2195.55;1.757;26.45;112.4682 2001-08-31;4540.71;80.26;146.87;206.0836;829.23;831.39;840.12;2089.84;1.6808;27.47;111.3268 2001-09-28;4085.51;80.98;144.89;206.476;806.53;792.12;778.82;1905.41;1.6338;25.88;109.7901 2001-10-31;4137.99;82.94;144.92;206.836;822.1;808.9;796.92;1941.80;1.6357;22.21;108.5999 2001-11-30;4260.27;81.68;146.99;207.1815;830.26;825.82;824.76;2056.38;1.6509;19.67;107.3045 2001-12-31;4382.94;80.34;145.39;207.4991;829.2;828.47;832.5;2069.10;1.6566;19.33;106.7479 2002-01-31;4265.15;80.37;146.88;207.7927;830.14;829.18;832.49;2006.20;1.6709;19.67;106.4175 2002-02-28;4332.86;80.68;147.32;208.0939;832.32;829.94;831.72;1988.56;1.697;20.74;106.12 2002-03-29;4561.61;80.63;149.59;208.3776;840.44;843.56;852.66;2076.16;1.6743;24.42;106.0033 2002-04-30;4519.16;81.6;149.75;208.6504;839;835.48;835.7;2005.59;1.6542;26.27;105.7598 2002-05-31;4546.05;82.16;152.14;208.8647;839.66;832.75;828.78;2008.93;1.5889;27.02;105.8656 2002-06-28;4146.93;83.4;153.96;209.0812;824.96;805.13;783.85;1886.69;1.5399;25.52;106.2049 2002-07-31;3623.48;84.68;154.98;209.2245;810.6;778.16;740.27;1727.50;1.4718;26.94;105.5696 2002-08-30;3652.39;85.09;155.39;209.3556;818.19;785.37;747.19;1730.45;1.4972;28.38;105.3376 2002-09-30;3336.21;87.56;154.61;209.4862;804.26;756.54;700.35;1539.93;1.4931;29.67;104.9695 2002-10-31;3442.53;87.49;159.75;209.6159;815.03;770.67;718.94;1653.39;1.4932;28.85;104.3729 2002-11-29;3561.69;88.09;155.65;209.7461;827.2;789.36;744.59;1742.29;1.4658;26.27;104.2582 2002-12-31;3245.5;90.36;156.63;209.854;817.09;766.44;706;1657.64;1.4388;29.42;103.4171 2003-01-31;3089.68;90.53;161.92;209.9594;813.62;758.33;692.41;1607.12;1.3765;32.94;103.842 2003-02-28;2907.11;91.1;167.55;210.0595;811.94;751.55;679.8;1578.99;1.3602;35.87;103.2518 2003-03-31;2882.43;90.43;165.43;210.1143;806.94;745.9;673.68;1573.78;1.3614;33.55;102.8396 2003-04-30;3235.31;89.79;163.86;210.1683;826.55;774.39;712.52;1713.25;1.3783;28.25;101.7858 2003-05-30;3310.52;91.69;168.79;210.2177;843.63;792;730.3;1810.79;1.3111;28.14;101.5722 2003-06-30;3437.73;90.9;166.02;210.2681;852.44;808.58;755.26;1841.90;1.3196;30.72;101.5519 2003-07-31;3620.38;90.46;165.67;210.3184;855.22;818.03;772.36;1879.09;1.3611;30.76;101.6129 2003-08-29;3674.7;89.44;167.94;210.3652;862.49;830.7;791.13;1919.46;1.3811;31.59;101.2882 2003-09-30;3626.43;90.64;167.37;210.4098;862.55;825.96;780.45;1931.01;1.3743;28.29;101.7552 2003-10-31;3769.49;90.05;171.59;210.4534;874.58;845.78;809.33;2045.41;1.3222;30.33;101.9386 2003-11-28;3842.74;89.55;174.48;210.5003;874.18;844.31;807.06;2076.32;1.3318;31.09;102.6444 2003-12-31;3961.58;91.19;176.55;210.5459;885.41;855.98;819.51;2206.42;1.2643;32.15;102.706 2004-01-02;4152.32;91.27;179.92;210.5892;900.41;876.26;846.02;2241.83;1.2391;34.27;102.8396 2004-02-27;4221.28;92.47;178.54;210.6345;911.76;890.48;863.3;2279.37;1.2448;34.74;103.2724 2004-03-31;4098.04;92.94;178.14;210.6784;912.61;891.05;862.69;2264.24;1.2778;36.76;103.8939 2004-04-30;4252.39;92.1;174.33;210.7261;903.34;881.54;854.21;2217.87;1.2969;36.69;104.2061 2004-05-28;4161.31;91.42;175.32;210.7718;896.55;872.66;842.61;2238.07;1.2839;40.28;104.9486 2004-06-30;4166.47;90.92;175.01;210.8593;898.09;876.95;850.13;2284.02;1.2503;38.02;104.5923 2004-07-30;4098.61;91.82;175.61;210.9524;900.48;877.32;847.65;2209.45;1.2452;40.69;105.1902 2004-08-31;4016.27;92.87;175.97;211.0615;907.48;882.81;850.69;2219.16;1.2623;44.94;105.6329 2004-09-30;4057.34;93.3;178.22;211.1846;911.75;886.73;854.45;2261.14;1.2629;45.95;105.6646 2004-10-29;3987.28;94.75;183.67;211.3126;916.25;887.79;851.16;2316.47;1.233;53.13;106.4282 2004-11-30;4052.75;96.12;184.1;211.4429;922.25;894.25;857.96;2438.16;1.1711;48.46;106.5773 2004-12-30;4234.56;96.37;188.29;211.5693;935.38;912.38;882.32;2531.23;1.1465;43.33;107.4548 2005-01-31;4305.72;97.92;193.49;211.7016;947.56;925.21;896.07;2474.24;1.1792;46.84;107.8639 2005-02-28;4435.52;97.16;186.46;211.8354;945.44;926.01;900.68;2552.62;1.1918;47.97;108.3612 2005-03-31;4456.72;97.71;190.05;211.9722;949.96;930.41;904.95;2503.07;1.1756;54.31;108.2204 2005-04-29;4444.06;99.59;192.86;212.1065;955.21;931.55;900.97;2448.53;1.1954;53.04;108.6651 2005-05-31;4645.39;100.56;196.4;212.2391;975.37;958.51;936.33;2492.03;1.2172;49.83;108.8608 2005-06-30;4752.39;100.53;195.86;212.3714;987.18;976.31;961.22;2513.60;1.2665;56.26;109.3518 2005-07-29;5025.01;100.56;199.77;212.5051;999.36;995.21;988.89;2601.40;1.2945;58.7;109.4941 2005-08-31;4977.17;101.25;197.98;212.6397;998.92;992.42;983.05;2621.00;1.2629;64.97;109.7133 2005-09-30;5271.01;101.43;198.36;212.7798;1011.09;1012.92;1014.5;2689.08;1.2671;65.57;108.8826 2005-10-31;5338.4;100.21;197.75;212.9305;1000;1000;1000;2623.84;1.288;62.37;109.8999 2005-11-30;5601.68;99.82;193.02;213.1098;1011.92;1021.27;1033.36;2711.26;1.311;58.3;110.9601 2005-12-30;5742.41;101.06;200.02;213.2893;1027.15;1040.2;1057.11;2771.33;1.3053;59.43;111.4828 2006-01-31;5928.95;100.12;198.98;213.4714;1031.51;1049.8;1073.76;2895.08;1.2773;65.51;112.1873 2006-02-28;6012.26;100.33;205.1;213.6807;1039.76;1061.24;1089.55;2890.77;1.3052;61.63;112.3445 2006-03-31;6163.39;98.5;202.71;213.9032;1037.19;1065.25;1102.36;2954.33;1.305;62.9;112.7046 2006-04-28;6251.53;97.28;205.71;214.1422;1029.51;1055.05;1089.87;3044.03;1.283;69.69;112.6933 2006-05-31;5924.57;97.53;205.05;214.3963;1015.02;1030.21;1050.63;2940.05;1.219;70.94;112.5694 2006-06-30;5955.64;96.85;199.07;214.668;1012.06;1030.12;1054.12;2939.19;1.2321;70.96;112.6257 2006-07-31;6175.15;97.76;200.01;214.9455;1023.21;1043.3;1070.33;2957.53;1.2376;74.41;112.4569 2006-08-31;6357.87;99.47;200.35;215.2466;1039.88;1063.53;1095.23;3034.30;1.2318;73.04;112.3445 2006-09-29;6567.56;100.24;199.1;215.5717;1051.61;1079.81;1117.73;3070.48;1.2455;63.8;111.9744 2006-10-31;6700.4;100.44;198.68;215.9061;1060.84;1094.42;1139.46;3183.17;1.2602;58.89;111.5497 2006-11-30;6663.75;101.37;200.23;216.2572;1065.16;1097.52;1140.44;3261.12;1.2356;59.08;111.1933 2006-12-29;6929.18;100.31;206.51;216.6365;1073.47;1114.01;1168.64;3327.43;1.2099;61.96;112.0528 2007-01-31;7241.78;99.53;211.81;217.0323;1084.01;1132.33;1198.18;3366.71;1.2431;54.51;111.06 2007-02-28;6974.44;100.14;210.25;217.4341;1081.98;1125.54;1183.79;3349.19;1.2393;59.28;111.0933 2007-03-30;7183.53;99.8;215.32;217.8504;1087.38;1134.56;1198.59;3410.50;1.2178;60.44;111.2044 2007-04-30;7620.11;99.72;215.72;218.2774;1097.69;1150.8;1224.38;3560.91;1.2124;63.98;110.7051 2007-05-31;7682.32;98.35;214.63;218.7272;1097.2;1158.83;1244.59;3660.68;1.2211;63.45;110.8159 2007-06-29;7514.07;97.33;210.78;219.2199;1084.32;1143.72;1226.65;3632.44;1.233;67.49;110.4508 2007-07-31;7271.66;97.84;209.6;219.7151;1077.82;1128.45;1198.82;3552.00;1.2069;74.12;110.3183 2007-08-31;7231.45;98.71;208.23;220.2462;1082.78;1131.54;1199.16;3549.30;1.2027;72.36;109.4393 2007-09-28;7262.53;98.9;207.85;220.758;1087.4;1138.46;1209.29;3718.09;1.1852;79.91;109.1551 2007-10-31;7372.14;99.47;202.99;221.265;1096.57;1152.46;1229.89;3832.13;1.1741;85.8;108.3395 2007-11-30;7154.69;100.23;197.93;221.7717;1082.97;1124.44;1181.73;3675.49;1.1233;94.77;108.1772 2007-12-28;6925.44;99.51;199.45;222.2818;1073.19;1110.24;1161.83;3628.07;1.1402;91.69;107.5085 2008-01-31;6234.18;100.52;199.56;222.7738;1050.35;1065.21;1085.32;3350.82;1.1006;92.97;107.0258 2008-02-29;6188.55;100.42;205.29;223.2936;1046.57;1056.6;1070.64;3331.42;1.089;95.39;105.7809 2008-03-31;5961.47;99.87;205.39;223.8311;1028.47;1028.69;1030.11;3299.49;1.0126;105.45;104.7808 2008-04-30;6294.68;99.61;207.43;224.3555;1051.17;1067.24;1089.04;3472.91;1.0138;112.58;103.7486 2008-05-30;6333.56;99.48;210.33;224.8755;1052.65;1070.83;1095.7;3525.86;1.0448;125.4;102.429 2008-06-30;5855.52;98.9;209.72;225.3989;1020.95;1020.79;1021.64;3244.65;1.0371;133.88;101.4504 2008-07-31;5964.48;100.55;208.09;225.9172;1031.52;1031.08;1031.38;3165.37;1.0283;133.37;99.99 2008-08-29;6061.78;101.51;206.47;226.4346;1042.79;1044.22;1047.03;3120.91;1.0841;116.67;97.8827 2008-09-30;5563.93;101;208.75;226.9929;1011.39;996.43;978;2749.71;1.1102;104.11;94.4216 2008-10-31;5044.85;99.43;196.28;227.5076;953.5;913.67;865.87;2228.36;1.1429;76.61;92.895 2008-11-28;4780.29;103.51;197;227.7456;959.78;903.45;837.24;2084.12;1.191;57.31;90.0415 2008-12-30;4567.57;104.02;200.51;227.8713;949.66;880.77;801.03;2150.99;1.1404;41.12;86.6927 2009-01-30;4375.72;104.62;206.29;227.9714;945.35;871.82;787.3;1962.55;1.1267;41.71;83.1769 2009-02-27;3929.92;103.63;206.08;228.0655;914.5;827.96;730.29;1761.67;1.1639;39.09;81.1558 2009-03-31;4137.35;103.66;211.18;228.1421;931.55;849.94;757.47;1894.51;1.1555;47.94;78.4664 2009-04-30;4487.52;104.64;214.69;228.2187;971.4;906.76;829.98;2107.04;1.1481;49.65;76.8204 2009-05-29;4615.16;104.92;220.33;228.2944;984.31;923.76;851.19;2297.95;1.1076;59.03;74.9987 2009-06-30;4662.64;105.93;220.3;228.3696;994.44;934.46;862.3;2287.58;1.0809;69.64;73.6239 2009-07-31;5109.4;108.34;221.72;228.4381;1029.45;977.03;913.27;2481.33;1.078;64.15;73.4621 2009-08-31;5346.17;109.36;224.44;228.4984;1047.36;998.93;939.41;2583.70;1.0683;71.05;72.957 2009-09-30;5461.31;109.96;229.61;228.5533;1062.8;1017.95;962.27;2686.68;1.0391;69.41;72.2816 2009-10-30;5402.58;110.13;231.64;228.6032;1057.22;1006.96;945.48;2638.88;1.0213;75.72;71.634 2009-11-30;5388.37;110.71;231.08;228.6508;1064.97;1015.53;954.79;2746.71;1.0131;77.99;71.7416 2009-12-30;5626.4;110.68;239.83;228.6988;1079.6;1037.35;985.07;2796.04;1.0301;74.47;71.4195 2010-01-29;5570.19;111.66;244.84;228.7465;1084.16;1037.8;980.52;2680.47;1.0345;78.33;71.3838 2010-02-26;5763.27;112.52;235.99;228.7941;1095.19;1053.79;1002.03;2718.26;1.0722;76.39;71.0704 2010-03-31;6007.84;112.68;243.65;228.8412;1112.97;1078.27;1034.47;2886.60;1.0666;81.2;71.0206 fPortfolio/data/GCCINDEX.RET.rda0000644000176200001440000015722511645005054015627 0ustar liggesusers‹ì}ù?Vkûö"•æ¹d(d E(²„LIÆÈPÈ<Ïóp›çYH)M*Ñ ÁR!µ5K%•¤y •$Õ{¬÷»ß½Öçñ|ß¿`û¡µï{÷5œÃqçu]kmcM‹Õ“-&ÁMpO¿ãðŸ<Üø‡‹ fâ bª¶††®æF iã¦׸é±Ô…ÚÉãÖ,lKPÎi‰•fÃÄÿû£b.ß4eMP]ÏWǤ?éÕh‚ W×~°¢‰‘KZÅmüõ2AÙs¾*g¾wÑpI?ÈË|¶‰’Þïp‚ LõÃ̳ ’ܾû¹A®ÝÛµC2rÎeÃk:oií|¶D ellv¯ãdì&‰Óÿ‘#à ýVÞÌ'(Ow£ëz*?Íãð'?‚Œ;Ða¿t€i/jò7'æwnÝ œy1Ÿª³åÏXýÆhû~è,AźÏKZTDPñ– ‡wdÒè‡[Ú¹”¡ÝrAÍå÷x’wAåz=‘ê ¨l©…'C~2rùw+×Îe>Gfÿ¹Æù@P9*AoÕT˜ïw¿Óù0æ1yýñ˜¯Ñ¯{‡ënÿùGz¸ü̲¿8”‡Ë³m-Ò×pï#KŒOè䌡X–Üæ¹ºcÂÌgã²jÅÂcÚ#3“2†ž#ÈìY‹„,Çd¹k]_ßyéxsòï¶ŒœE’ÛŸ™ek?Ox>ûÛ¬¿þø(A&„|î󔑳<ýé¢Fc‚Ò—©•Ä÷^]³ze jÝlñÆ´ç¸r‰­‡AÙ=Ÿ/¬TN:3¤ùËОœ¸êÆl¦_«Ä§qËCŠ[c˜ ·[ŠOªj‚?d¹4ÉmgäÒ«oh ó”ŽÕ³˜NÄûòÈÒ‚ |C‰/Y~ïtRúåÒ6‚òwwÕ ™ ý™¯ ™1“¹/ìæüì6üûï+•>5¸‰¸KP¦ÏCk¤ÐïÒ=¥‹ò rÚ]íGláÜéy‹2¦ÿJ-w7üsÝ¢ã'À¯å¿©-dÙ=Ž?qøÃj‚JМ'¦¡D97¥Â¿}gôÝŒœmH‡ù \sµ3V,ãBÜù‹Ä8vÕüÞkF«œîÊó`þ‘¥¦š³ù2cܬ)úšˆçwµn͘·cÞz›Vl>{ýxÜ4¾ÝkÜ+÷«´ÊÌ÷ó¸e÷‚J{:IwKA‰Ù¼ºûxFüŽo7$¨%Ú\áWÑ1€Û^SÖfÙ¼!Ȩ3Bß}õ *ä^ §£ˆOÖ>>»nÄãGƒ§¿B ÏñƒÑ‡`Wžù’§d™~“*.Õ dÀ¤ùç;¯UÕ–×ý­ ¾ME¾X"{¯¢†öã–Uå *¯(dY,A•VÔÅŽ*c^oU:BP«¬Ç?>‰ñ¥í½g® ÿrNäü*„Ÿn¥š·!©¼†-¾L¿™§&:C_s·,¾$9»7(ˆ CºÇ/ÿÁÃÌ#3ÔŠ:U†y7óÜ Ð'ÈÈýöOm?À¿¦½6Y€q‰ØlP†œyLmâ\G÷ͳb|o»¨¸ðâ×ÑZsõD–ÝÖ˜•_Ðÿ\…ÖT#\}ž · ¿XùÞ„=Ìø u—ßî ¨JÉåë»8¤åЮÏáá–oR5<§âùô•U!žë¿Ë•#¿†Nº¡äz×[ÜÀgóï³ïà¬ûù ¥áWŸ9…«ÿ#J ¢¬ñåÌæTÖÀ/¸B®ßBÿ>áÝ<ŸJ€W»öèÝxÃȅɾñ>{j.;ð- í*½wZ4? àm·fäüfmÞŒþ¬^mä\€ßk—¶O…ë›K~0푉"{† —­akó.ÒqÞ¯¨i÷ Sû„Ï^b¯qÊLE‚´ÕRüþ† vo¹ë_L.wß8ÁÈ…ÔÚŒ ¯<-{³ñèzÎ*[~í1zŽâgp’4¹iÁrÈ[_–¬ñÄg… ™7ñÙlVíQaF.ØÖ-ïæ³{}Œœ â8¾JË€ZÍô» R&^÷3Z7OQA^Ÿr³Ó‹CÛáÛ#ÏùGn¿ÿÊx©¹*àΜ·+æBÎÊBß­‰Cšž8î9‘•—|,ˆŸÅñˆËIïZ>ÀO’kto¹=V§lY7ÊŒ'¥T„ëñØ3U=ØùÉKuTÔ<ÀZ [×¹‡‘ÛsoÂA™p̧V¦|I ò¯HJÅ4ø¡)7ߣr¦ßÀàxÎ,è×üÎôаoè¤@çà^wuÕ?38DFg*ÞžfŠq^}¡¡I¨þNŠ}µQ¾ÂCg/cätSò¬V!O9=ìØUƒü²eZ™àwøŸ_It&+où®™˜r~•«#!± µ¦>t‘€œ¿‘I k|!…î·&oB_v í¾Î ÿ‚qFݽ©™Íš¯Wî â?ÿHíʾæ3eØbuæ-òTp]Ûô÷h7®SýÂV‚”nÚx–%¾ï=×+ÌÃöÜs;eøu°Í›)Ä›Yp„%ËnÊ—ßø‚?GÛì¿=p 3•r†žøMÛ²pÜ·pºÜƒ&æ³ÉÃIWE€‡~—öx0ãuÛ¤T`‰vtŽG_±‚>|מ=`º övqY_ËÇüž3nbFøFlõûÖ©È»qf¡Ãðß•Už§™öœ_ ÜÞ›òÚtÞ®¸´^¸{ûWñ†+fæK:¬m¶H„Ÿî,þÊ•;˜êñ=ÊÃx}»¤¾aù©·GPâ;ŒGȲm­8Ç|’œ/÷÷;¥5ÜÃÈ|2^$åN> ×ó(!”ñgrÝ_ 4‰ü2‘ x¶yÕ?:l—Õ2Øù»›âÈt¾ÊÉ…¬|”d™™t ù-þ|[;Ú³•íÒWÏ+YbÏüîEBÎueý§ Ä£ÿ¨hÿ[º~•p¯¼žj}ÍûbŒ03ß¼c» ÝSÀçC9ÏìÁïŒ7W4_†ƒÌ&r˲êÄX5“{œæwÞöZw {^ͰùÄÈy%Æ€¬tž³ rQ¿^ô€¿iÖn¿Áa~À_ÚûZ0Ammå.žKÔd%fKßì|l;Âȹ:={)žá¿sëkð¨Úþ£þÀ·">3Þ"Œ\îöC3 VÂN½Æ]ÉY«^~*ãM"ïñ‹ÜO¾ 9¿ íð÷DN=(x²ä¶½™3Z©’àÁÒsÉüšŸÀqËÞPù_¨ìF <õÐoPÿ"¹ÐãÂ_³Vf¨ˆ ŸÁ¯¶Ô/°…þ–ÿ%ˆ¼à´EsGo93¾÷džÎ„i*´ë„]ÝxÒïu»Ðë3:ÿ£vTùrÝ¡ë)^ÞI.”®oöbÀ¹D-çž>Á´gi¾c¿ê{Ïþ»"¨MøtÔÊÁׂËRnU1u#™P¼çT¨òïµØ¨—KÀK¥ëv¾‚>‚{ºN†2 R~^[mšá§G/éÇæoØ:ç*xåE÷¶s O$wîXÕGž û2-¶ y^[@F"pØß®ÖåËïwü ²åÇ|½¯ž)†v;žO°D¿æaÓ#YqzÞ’“MÛžù Ÿ§ÇÛ¶úØö¯à¯Cúg1 ‰ÌË|åµàA¦>¾!ßHPQbŸ²Ãàß!Y<¹³YyÆK[8’¸ºö•—Êä¥òÍãMÄþQž[%ä¦ßFü”„žI¨~¹¬2ç,³3ý7:W1ýê¶5¼nN¸ Né_Ûs[&…úzÓuƒÇ>L»TBÁPW²%ä{\‡`?}Ûcá2¸úÍ›7£H‰‘³©y}ë ð,(@BN½yu«ÃqØ'æ ï^…uþžc^·Ó£u ¼/s÷kÿ.àÖöøê3þÂÌø|¦ëÿþa ž9ÑÜ3<"}GŽî÷éðó¾ù¾<FޝKˆóWl¯›à'EEÇ íBaw7×ÚÛ,þ ™ühÜ\‚ÊxÚ¾ÍvÛj9k„<ØÓ·¦Ÿyyÿ±jàs ÿZÕWC˜×ù&q’[¨Ò0ý)A‰ Û=å£ù¸KvÙ¢Buô¯ö¸Ûtqñã¥7À͸_7&º¡>XmñöÄÄ“›ô-ô=ž÷èaè'4w[3â$ü“ì&o6Þ‡‹6Š!ß§|š%Ê|‘] û¸…oæDˆO6Ø»zÊüfÈ›½,ò<Áü£B üçî׳ëeÚ‹#«Šgæ#ÏÉ:§È€‡‡¤ÝírŸ4ö¸1c?K/±ZÁâ×.;Ãúàö¿”n@¼Ë_¶ÐÞçY{ÞNbùWŸS9—¯”vñÜiøý¼=á¾(Ï©¿¯dZæú¹;4w•RÂSº1N£•3áÛ›¬&,gÙ-ñ ÷¸£ìõ„Á«‘«¡ça)‰ F.GÒ¼öCâðКç¿ÑŽëL§„ÏðS½Ýa.¦=*Ð%SóðN§7Ðz´ÑI:Œøã„;)ï>JüçérìÅ÷ùПø•„Ã4Г=¾¹ñŸûª½âêjt~µ(Wm˜ Þcü¢Ì~‘.xãÀ«>ˆHâs—Ž—™µq%(‚ç˜KΣqÆxæÁl V1óòS |,ßv#dG%PÿQ2w ôšéüÖ uiü-Bb˯}àuR7çZgÓø,’¨ÉŒ/Þ*'p"ìeábŠqžÖ§FlÒu»¢ÄqV½•®X:ÂC¯¿'`/·#ŽZ…Çè—J©<„|üÍé'òG¢ÕÁq¡¨_ƒ,¤3u™û¹ù‘“ô3¾àWE/ô[Wø;å‰ëÇ^V{1›w~³çC^ÉLwýG\‹çï è²rfñ¿¨(ïÄrÖz[ð Öý³¨¯?Eÿ*Rc¾·ÜÝwä,â2vÙ±Éà#ü §é:^y‘¡"k]>‹_Q‡3üIÍ˶ñ¬pdÁOFmŒ\vÓmð+‡ÅI;éz?ÖŒ¿7ú+âîAc¥ÛQ‚œS©µy+æ[Sxuû7ä;íã—¾²ô%]·þó9™ûFõTèßÏ3ˆTD\fÉ^K€Ÿ¹¯³j­à0ý&˜==i¼q±3à€ûÊœÛ[ÝÀ÷m¥¿ù ƒÌuéL\ŒöBêݼ¾èÀŸn¥y^†¾ã? Y4#Ÿøu†²ê…L½Í¶6‹À#Fÿœ˜]š{/~g¯ã® ÍšoȱJ~ĹUÓ÷weÐc\ÅÛéÛí1ŽÕ[ºLY뻉ÓJ§ÿþúîÁnرe_Àõ"´·y á%+ÿjþñÈÌ‚~w4-z‡¸]ïôh³æa²¬^ÈÛ–iÏÎÌ~è$pVM+&u,•òÝrš$êG« ¯Wé³Ö}æ5sïN¥×â·RÈ7:/“7N¡ùãþ›{&ƒB~ñ§¡~ hØ{ÿ(ÆçãW;Ê™~³Æ?i‹Eû™/’'W´¢ÎÉmm £_*=à‚Yoô¶ÄÖg.ð7%­K'y)Äq'_÷¦ß‚ ûvï†âVÿÐ9?̬ ¿v¯ 8öÔ÷&£?*ª5}jìe{~»hêÀÝPÇÌ#Ôî×ÑI¶Œ\tó-[MVòe[i ò¢_žÝáP†ï’üæû†p?Qòä©×àk>ù>ë—£_¯á¦E  ¨üà»ÅçΠ”;mµª ü¨GßUñ“ä –iW4Ôæ>A… Ämêžš®…àí‘Z rÏ0N>ÙÈœ»è·T>Êù¹ ðXò¯Ž :Ìx 'äp>À|N+˜ì²æ0pòÒ¥¢)¨kó,gŽù˜LR±RcùÁ#…ÂÓÐ[€Ù55äµaÁ••°û²ì}šàïß1+ÊíEJÅOï»O[éú#övº}õëMðI™ÁÖ:Yøl=~äù£M=`¿n·qÏ`ç[Õ7³Yë¬ J•à[Ϭ’î…\»m?1óò·:45‹¥wŸå]P‡zòúrïC}á7{ß, àÈÎÁKßö71íÅ:]ù!݇ø÷Jgð‰ 2TAÜl(=¨©œûäûUñ¶jUkóØúŠÊ Üð…ܺêËû–dð³À×'YûD¢>—ö·£½ì´»¢ûÀgÎßxãËl~U÷N÷wž¹^û_©B©ø†¾jä5ùÀ$øÅ9c…²1Ý‚onkw NdWOzû"ù¬é{hæ_cÇW¤u²äìæUÝÿSs[u¹Åv¬\zrï§ÐÓðÛÑws×Cÿß%/é¢Q/)Ý\–\¦ˆLÚÝA‚Ü9\ŸÈ!}}6)žîÓþ\ªOx÷³ŠÏe+AéåÛâ!J:,¹­zI¥tþ¹)xù>ù÷ò“–ÌÂ1)šä¿w7ôãû4)¿W81ÒÆÏ¥2cO¿O ~UdFËý}Íñ²ú4û ½õ³w#ìµû‡?DýΉe¡=ÿé« _wÖ‡I_|ƒxPíJúØÄê×¼ÿ\5]ñ•þ5ùß®Xïør:ý~7}‰:îûƉ¬â0òy_/®ø†þ&ß-ù>êœúÁGj,®å”yTrü¤s’÷2àÉè}“U¬~·þ급~³ÔzJ„yÑž¨Ýþóðs›µÓkÓéñ;[yѼüÿ]÷$»?ryLP?õûìGU>tÌ<(ѨÔI h×QªÇßz³j©¹üm¼éÄ'ðYQÏ'ç¤Yóˆ6l™Ÿú0væk¯jä ÓÛ/Ý5X“,Ñ_r)W\lHŸÈº×):v|\ô:ON玺ç|[Á cäÈX!±K$â&xøÅP2â1bx­zòжI£Ç¬¡«skUiÞ0,‘£‚úÚºQœ/•®“TÉ|)ô/æ³l1=ß¿¯ù<+'^97¦Ÿ1ýn­ÒÜõyÎúÍäûmMÿ«µëü<Õ‘ ðÕÕçÿúìIŸ’•æb­/‰:ï›þþœã×ñ~°³~ò¯²È‡K®®“Ûž71E u´³§îòÃí–ãæˆgQÛ?gÆs˜ñ9K½àÝú _嫚¯ÏåM=Ê 9ÇÏ£ÏXíU¥>¿¬÷”CÆÅ=¸‚4º|à¾â$ô ×Þ¬}oQÎÞM˜G•°ªšÓm•ð6£0ë!ø„ìŸkȱíÅœþîIAíÿú[èÑ*|.X¶äÇ’±z>¹`‡JÛÌ&j÷¹ÇoFžÀ¾Y©ÛùƶW—öçÔeÄÏ*¾)ª|à)†Wì¶Xm¯bÃ9»cž2'uC•ÊKä‡é6ÖjYL;ZfýåÀ»=Û¨¿NHEGW»ƒß46yw´Ží7IÞðâårºnÜà½T~wô¦óØuYªBÏäëïF™®7^‘Bžñü9©óµÏ92pÎÙBã஺¥sxMDp¿+ì«å2®søÿ÷•:tóΚï_;1X·ãh°ÿ þ›°<»Ë ¼M¡z儳ø½ƒðaYz?<>R[ å,òCåŠÏóÞ¤B…ÿ{Ó¯ÿ©àבàõ1—Âü6Œ?gl cÙ·DAueøüÔ_À?ûŸ£Ý‰ðÿàˆ£«ÔmÇÎc—¸Ò  Ú³|–Qœ‰zÐÄQvÑ:!=|ç¹ 9$ïfàE|ÛÞ)¯+ *»ã¶Â2àèžÏ™ñQ¡?Î/´m§ÏMXn|øN±(ÉÎۯϾ•ã=ÀÛlÛ{ãQHY¹,#Gù˜=Ž"È5)ëƒãw1ã†× žÛ^ôñW;ûQn¾l½úôÑ›é>}îØö o>­èz~U?é…%”KìÁg*cׇ©xÉ¥×V¡.á¤ÌZо–<íèfrd¬œ‡aô\ä«ÄVšwS”õvrÆÈ‘ÅŽ¤ê ̃“òñÜck‚ÌRÏ?R0VÎQqt9ìïø¦<®qšØš¾PüTtϱO4µè†ÿͺ•qÌš ~æ-}O¯‡[ÌÿÈó_ü41y`ÚbÔ&âÄõðËP!ýù;«ÆÊåïµyr„ ý¾‘*W½^ï^šêÖÇ&¡žR¨:Q?øõ÷•,M:£vû“ésiŽ×½V"ŽjåÝ›XýÞOñу‹OOPv®—xÀ£DϦž¥í{&¹œ‹5N{»•›h>mÐÀ{%†içŸûÙF1#ÎZ¹Í1=“¼•ãSPµs2òBMä·a5F®ô×Ê0ÌWÿNãíd×ß8ŠN@¼a¼Ûå>Öøªºù]R9dLÞǼçÀI÷·Ö]?KÏ÷Žd)Óe%à1yÓöÉ®,Ø#}?³¾þ\”Û9¿äýà}FÊO€§¡_‡ÎÏD^T8”#¨Ç_¢‹¸š“&øÝ¶‚ÎÈ_‘y;|Ó™UI ÔÆ˜5;ðM¯ýKßÿ|‰Ò›Éc ;Å;ñN× ×9óN œ88Vn›“íÊ º^®LØú-” j¦q›þ^œü¦áÔlà_ÇîM°«GTÁשÇÊùëû[Žt€?8?½“ Þ^¹ðÛÔ±r9ß÷Ý@^ÝüÄó5äæno_4NQf‰“¾yI_ÀO#‡ŸLšú'Þ¹{Êê­ÁC!¬4LåWY­ÞœŠ¸Õ;º~êæ¯÷+‚uÎayiç¥%t{)±/ýFq"Fn§ùÍRÇ@ øÂãèåYý-[3iÅ#àßãêUT}ÎÜrSò„h{pŠ-‡i×7±Û³ùwKÔ9Ó…ð…÷ûKùh?þ öŇ‘#sÅæ¶ oÝ·‰57ÀOŸŒw»û_ô·çšœø†ƒóõQ°o’ÎÙ³ôº·÷¶àìóc’Ê}ûOßo|q±Î3áŒiâÔÍÿëûAz}ðŒ«=ðª„ÿmsCêVqUÉ–\˜ûçûލ»ƒt<<@üF†ìYÀ=Öÿ¨¨€û¼À+N½ê· ´½ë×Fš¢=å[É/Õ¹^ÎöOh/yß.ñÎËÏ=!#Íì3“æK¿Q°ã¸_yÁ[ô†K4Ch>ä?³]u¡¢¢ßªK,ý%¨©wc¾¶õå{QDÈLã±[Ï~¿Þ\¼^g&÷JTî6ü;ÝÏ@ü;ÙMCÂGvIu$J‘? Ä•ÿF!Ç¿¹dÀŸmÃÆj¼!H×Y7ß:b<Úæ#ot{àwÿJ™ñøŽ{sÎøÌy5îâðO‡TÍ$´¯ØXWû$Ì:¸ 6€ 7EþužÞG¶ðšQü ö³Ÿ-‚öÓO=¹­«ôó8ødz¼,œ‰ÈœyÏ#DTÁ§ÞÌü~z4?úÈì,òÉî‘[.M¢à‡³êýxÜçZL-ÝÁÇRn}}u•©ÏȬy¡?Á¯Ó\µjð{gÿo—z¯6–Á~¦Lkö ½=ï´WΟ [˜¿œ€Ÿf¨¨ÿÑ+&¨ÜÕ½?ã0Ëž¥GtQŸ§J{¼ÎG½JïN %Sh7rÆ»¥éL¿/ºæƒ¼›×,jJŸ/ïöÿKú×N9óö7üѦ¡½6ð3¶÷È# 'èéý©ó1ž Ÿš Êqßôã£q_ûC¿}.!Åz«Nê­H©óÏDPgEFžŠÿH¶á½ÑAŸãûî ÿÒÿ÷=å·É7VÜ.Eß¹á%HJ›“ï'b¥soeßÏ5yPS }„kM’ªD>2žr"ŽB¾SŸØ³Iš^WYùDÇupúNñz· èy뽸[¨9>&¢Ð—Q¿‰Püiϰ'k}娻RuNî=T V)ÒûÉêsTLhžt6§q"øçðÆc:~ O ­„ÊŠ^wÁÅr=RGéu¸gîÍ‘ÏÐ+ÿA(ð0`Päû*ð ƒ'»çL†\ÐwnKšïE>NîÞAP;¶ìZCóÿÜÁÔ3“¶2ý&ÊOªö†¿åN;¶j½7ä¥OæümÏ»ºŽ”ή­;£1îØë÷ß_ãGŽ¿$;àgqb×{7Þ„‡?<~ý+Åï>¦C¯ë}2¹W‹º">S w®þûFoÚ˜¼õtZÛRžyØ×ÍOÍ%ˆsÇðBß0n«º B7ÑNUæÖži?0nëÅs/B;nU› > ¾(\•A\mÿ¨pà ýÍ]ѯÀÃÜteT_bÜ–Räð;ô“Рö õ©Ò结h|ö‘Ïž?J2ÓèÊã¡Ï?×(}ì¦çê ž`Õúsnü:&3'ó>ðÏ5#;ùˆJ¨üý\cAIΟ[ %-šÓloÂRÓ¦ß,‘¾ã3 ¨°ÙŸßH9`>±Ã^»ñÙø€²ïì–Ú¦à# »Å¶ñºi¡N)xk[½þWzÜéò’ñnûW䩨@âÃ!è#°Næä ðìœYË¿«#o§ÎüÇ´#´ÑñRapýzÓlÈwÜ­?;ÆÌ_¹õTNói=þ;°Ëáçj>è7pr²}¾¥ C3X xšs~ÂNoÖ:úî"É)"ãrajâ >>U(q”3pÏØ‘KÁVõbúûþ_àu黾S²R[¤UØÿŸ„Oþú;&ù¤ð ÈÔ œë"“‹ßÙ÷–5Áß…GÇ™ÿ‚¶r×jOrò¸´*%i¾”fµ‹>Ç_È­ÙÏ<ïAå_kUX:¸vpOÅDÄERb–`<ì­$RÆâ->Ÿ.ÞƒÞmŸÇþ„ñi[|| ¼3Ÿ>΂µnA嬹Š<ãWK^¸9v à7¸=ûßàKì¯W ÈN¼±dê22zÑx¥"†wSû¦”*|Ü‹<Üħ]ÀâM5•k£ß=ïª þÀFIÍ0øŸþ™Ký¬}Û”crZÀW VÊç g÷i^Ë£Y®…•ÿ‰xò•<†þv5mæ:^úÛœy"ª~UWMAÉ lB"‹¿/¢×éL³ÎXÿ y—WCß›Bä„› —%F-;˜nË«Þ)þDÞù´Õ|8 e¦Ø¿ò^xb`)³ÏMfÜËíÂÕ©Fôá 䨉§G€Cþn&?Ú9ŒœqOÛÞ|\B_÷¹‚g„ßëåu¢Ï6ÌR˜ÃÚ÷K;é9·ü+Q¡ý® ½ïq“ëñNz¿¼ì½Q ³nü¹ì®0òJŽŒï¬ú¼iIõ\^àsBzWM“)#(¹bGrz&ôz÷š©üVÑþQÞq¬V˜å÷?fþ™±‚~Îbal,â28ËVuù @GmŸðGxÁ)…óÀòñÛ®~JੱÏÌýo–ÕŘ·çf}–_•:+:Þìaäöй†7€z þ9wj€Žgë?uà-Þ òžòðKááþ šGØoªõžû©\Í.Á8S%äœ ŸÚ½dÙSÖóKëzo?®~ |{¿ã<*¹é³<,Èø #—½0ëòÎ\ƒ¿!çñRpIð9>Sýê/F.©ªkÒð´‚“‡¸W# yQ·“zKžpf2ó +|eÜ9d @í`+ðÚ°ÄEÚ•^W ,Õ»ÀøPø˜7}ìºð?ýù®Ø~Ã~”¼-uœðÚ{ø–rÍ¢‡õJ¼Žå“xÖó7; ÆøRDnvIÝnJ¥ÖrÎ=ã3æõÍcéeÛõõ“~±öC|gÞ¢ñ|­ï´æ 5•³jÇêð^è7‡«Ãy?gÉa*ù,BÍX=ž}ÞàþKÇ úiG‚UòÇrÑ /‚ÜÑFݲc Üóîùå÷7‘OdG^-@^ñÖVå=D¯+=?åú„íWZS¢.ƒGnPÞxš^‡-”~¤1ˆv9œÐëÌ:$ö‰£xâ¾÷ø ÔŸÍS(kÔù±Çd×Û°žëŠUÙ’ ?Ù5Ò9ºå2®³•ˆ0 Ôq\.°ž—‰ÿÜ­D?œ®í,¿ 4Õ2Aþ$}§Míj¾Šð´U<¤qˆx!¼|5õéøHÍLàÞf™¶¦ ú|ÂSî$>s}À̪‘ˆ‹ívÆáº9qïÙ›ð7‘ÉsmgÓóX8¿S’5Þûk2%Ɉ—Ì Ñ{]Ì÷áB$a§Ô#™nðwªsýDŒ/fÁl®Næœ囯:^8V­Xf¤çÌ!KŽ·t+B?.B?•…™ùz°,&õÚ)”2¥ŸëñÙÕÝòãSih5aŸ¨ªZödÁ.àéF%åà%}}¥{ÁoˆÚ,‹géù$Oâ/ÜOÙv6vê³(SjêÛ¸e`¦A2XQà–$½®Uña=øV®ß±­óPW¿<­ß¤Å´%pŸ_ãù™Ý®ˆßm-5ªG^ 3ÑcÖï©Õ’{öêÒö»–xÁy5äîó*ÔGC }ʬyøìLL ?öV07Æ<ýš{Šý€ç&n«Åš¹ì')~‡^£to‰ÁŸ g(þåü ø¥;œy€ ž™`õ çJ…ìƒ> ?‰ÞÊaŸl/¹MÐõ\¼x‡Î¥sê·½ësŒ¡‹4øäNÓuï3õÝ?÷E&Xl~ >U—VVŽ:,Á²º´ø;72^@š n»”Ñç{Ex~¢#(w~•š™ÈgÛ–]ˆ»GãÒ0¹Õæy†^³mYçMrGb¸”W˹ŽjAÞ;M‰4ÃÕÁwKµ}Óò¯#«À—}[JäÀ—DùtJà{£rüîcyÖ?íÛ¤,Z¿JQ»Òü’yžŒZú~è– ÍGšêóÖ#_„¶Ÿ¤×¿üL—ŠÏf¿×áì8à¤sÄ¥,åaðʼnøè[£9ÇŠõü ç•ÄÇ*ø{NûÏS»žBïíÛ}Pçùlˆ4õdôIíéýØ¥ }ôEÕÖažfÊ[¦èA¯r¾?.r¹ôÙ룷H =KAÙkª¥Þ¦­ 9Ëù7gùKô°}Uðwo;Úú'PÿFXèÒ«†ü]ÎZ¿þÖªaÙAŸ3Ö$ŽÓõ¾ÓZ)S{ðˆ¹M'‘GÖ¦ÜL¡.‘~$›EŸÿÛiЪÞ<÷¾˜S8qh™ôþ‹7Å|ûnþã)AꪼK×µIïo½‡xMpO“dùkúÏÇœ ‚t]µžG…~®ï}SÚ)äýíŽ= ,Þ”ñªwþðâðxñ´ÐϬ0ï‡}ÀÅ—™®?a?‘©§Gc\µÇ£êóQ7ä~½ ž³jQÏGŒ;U'›ºÈ´ç>QV>yeMàU·bŒÃ~í£o]hÇÈuÖ³­ÂÌøvÕ~wjFžÔ¬ÿñSA:Ú+®k£×_Uv[7–³æ°p>7j;ñѸLøL´ÍvÄKjÁšåÙÌùnr×+Ý#á°ç3s-Ø%totXÍ'§Ê~õÅ|„¿’º—0ÜLrâÈxípj;x@©ì¥-à_)­f›˜ó*Tfý¡Ä¹ÈÂÏ[á÷¶Gïr7R¿6?~ÏÊ3ÙN“gjG#ÿý"”Çž¯ø§½ý“‹Ú¦sÀ—2+·)¿Æó|^¸ï)½>¿øø{VýÌñ;–†ñEÎSl‘@½êë’Z ¼3»UyŸUšÏ[t~®Ò6±×øÒík‘÷¶kû_`ù‹oê:Ëåà×£OP¿Û&œ‡žmV½Ãâ…¶YóÒús¯Á}æób‡¯KJ·H1ö #ƒt®NCüžå›¼ þ÷@IPï4~·¸.dì'Â-ãBçéz.ÿÅÀw‰jàMv×f3Ç85O—(½aù\xcÿøÑÚß>á¾}]’ßvÔ¹!_ú¿^kbú r6œmÀƒyn˯UDܦ§vÌp€ý2lVoF?"“›¹BÎØ/DÊ|&ýž—ö`Ô;uìý1¥º€‰¬º1çM}ÝcàG×Õm¼ç CºþIè’:ÄznÙó«ÆzÔÙ>{EC`~úfþçÊ€—^ÇÅúkXóÐôØãÙ ÿòoÞraxŒVƒÝ½yÈûÖ[®[øØ2rá‚‘O^IO¥3¾nB>·mXŸýí-â›ÁÍÚ¢ìeÚ>ÁßüÍš„áIUN+5æãzCv8L™6…î/áUסÏñd$UOÀx8Õbòw?ÁªM̾`‹ó9ŠŒ;C:jNÛ¡×…-Zjtžè¶~²{ü°KÓ&„õœXjŸ½­÷Màh”ñÆVæÜ¹qÛë{¬÷6µöËûÔèzï·¤?êÒ%ãRo]!Ȳ5ušÃ¹ì™Àç„÷}ÎÝÀ“½ŠFÏÎGŠ^'ô0r1ùÓ²< Ç×Ï%á׺¡ïü2}0~ze‘ìIäÜ ÊäaÅÂw©¨××?ò)’%—*~ëd x\âøY=§Pgù¨ùV;¦ƒ?¸xùñ£—:3îÐú{Õy¢uhÊÝŽÛ[/&bÓ»0 $‹5¾›ˆüÑ&»¹þ’½!±hê3·g—”9¬yÏ›˜g€:þô›óÁŠrjdIöÒj§é•¤Èu¸ò4#··=í\À9´³Ž÷‹P òËòwnÇí'ùYÏì:¸ÿ‡c ò”BÔÍ'À{Ï6ûíˆ#?g'íBÞÙ~àê:|o˜üvêCàDàH@pq;ô½Æ'™ óµHÞdÅzÏBŒ{žÓä•°†®ÒôóF7·4aþI¤EåV¿y=:ESÀKªÚz£0w™eÊ{ûÔ9䋳ü%î&L×±‘F“» ²àµÿ†Á…°oêcí Ô Òl|òŽ~>P%£5òaê:½y°›éøî1à5&K“Ÿ¿2o¿¸W H´Vwb¼×§Ïä¦yÇê g,>¿\ÛsêèÍÇ*Í;«qÊd'ü« pÐ&ˆUoP“¥0Nm¯¡@zß0¹ÚKA øÐæ­ËŸKߦšÍ¸¾·Åï8òaL´­ä$Ô=QÁ_âÿ0ü™Ìèkõø9^”&¿ïš,òô%ãe-Àq×(až&:Šr)‚÷ŽäÄËí<·B>rÉ#CÖûµ²Oˆ ½$Q8(Þ >û ¶,;Ü (ª2Ù`|~®Qf¡BÈàiÚ+”ËP'q2&mÐÔ/¿Yhþ›iÏn…jÌ|ä7ám=†à‹ú_N§ÏWȉ7²ÞÇ¥0㜷ì¹j–ø€ôôºûØ[ä")B¬õçž„@ó‡¥1×è\4p8ÁàQ–‹1òyæ¼zÓ$ºˆ_£ª"}þÏû×ÍPäÍÜ{IÂ׃IkOܵb=gœþ§On¼üèÀ½az#rî“y›ÂÞ<経"êiÙÑðçÂC¡gîü (µ'µÖ=°wž{ÉÜ ð#ÇõõÅÌø2 OæÁ^ñuÄè*Ì×_õ‚®o}ipæq5¦ß˜¤‡ É©àIµ$—)üÍïÙÒ Õˆƒð´Æ$Ös£¹Óx&Ì!(­jz™›JPöhV”@Ls™hËZï‹¶õé—­G=´×ž{ð* ¹øŠý^¦ ÇobÉà¡ÒÒcÉ©ˆŽ*þÔ,ìÛ…ùýª°‘G ‹?¹y® òÞÌ£_ÞÀÖºŽëèç?s3^¥\û8³· ˜N×·wZ”>0®P»O8»zÒuìñé6ýÖtœÕ·¹/¿¿uSæ+puQ¡ô>£Ýùg¹¨OäÆå¨ÐÏûX¿WïúÆŠï]¶±$æÁÙ Ç \´á_Ë^x»¶tñV¿Eº‰»=áŸ~ÙýÀ—GurÀ!—Y·'obü &çq‰2ëÄÔþá·Ü-UF–¿žÉâ×µ‡®Ä/9Ê!+Žù<%7p¨œÔËm“‡>ëå's³ø¦]Ή3둇œ¿=8ý ùÂãõÔØ𿼺Åþ7¿!nm®N ¥q´m§Áð›“å;¦BoÁ5n ï/Ì®Ók¡ëèU3ú— =Õ/;3”ó½Ð­?j‡M”nüt‰uè‡é7w²±KÀð]Ž¿)üeSÎ>ÞiÈGr±ÖìÚEœô; /^dVþ~úÍ:Sî³*«n³óS£Ÿ+Öï¬3qv¦ý׆xøëV‹3™óOTÎ䲨ȘNIWEäóüy&NÐ÷¥Wâ5Œ“Q=ª×+ôqÿx•äJà»aÀÚ4 àt¼hˆ9Sw!\BçxMû©é”8ò4¹ÞéÅ[Ôy¾CO÷³â±0cÊõ3àƒÑEÚéàAÏf¿gŠ8óÖJüõú[04™~oa¹mðÎnqäý÷6Ý È·v³³,m1ï á‘W‡˜}#ªLÃré¶cÀ±s'æé€oz^V×Úñ_žˆæ ¥)!~wÔ§Ù—K¬>=u¬ýÊzKX~Pµ{ûâÚX¹K)ðjÞ1èÓ9.¹V˜~~Âßø4k]7åAònEà{üŠ‹yú¸Ž .nDÞŒ+ºÃÚÜ{è­Öê’ ÷šd`þ9‡Ç;Ñû÷œ¾z¹o&—™ÁoœÆE®Ø½…XÖ(ž„ÞÒO<ë©"(«º´ïm¶L{{ø|à_ Yÿ÷¹ìØ}¥sva^A+f°ü*ã˜áoÔÙ×òr§LzÍì¸Á'"¯8zžeÅ[^÷`ì¾[6ºSñË);,9™ Æý<œÌlç‚ß4¬¾[:~¹>xa†>]÷®xèL×iÝöȲޫjöÀyOÐÿ¾®Fùµ:®YLï¿‘û£œu®ÏßUž ûÝݬ·ù™sÞH/‚õ\¸Ú¦€š§8ZäûûR¦ÒÐ_ôŒº+Ì|IÓÒ„³¬}½ÞƒçáÿU^LgÕÇù†½‹¯ç ÞD¿LÛ¶x)¾sú›û©xúä8ç&F.f³ÞÆ:ÔÑ?ÂÄéçÊ’·éN.nù½:3<_é·"íÊŽ²VðŒ•—Õ¢µ Ÿ·¿Óïu ÷?b­UªÚV_Ä!íÞ6­t£ë¢U[sö€ßœ¢•`ÀÈùü™Î{^ö´¼èi\ øð~­SðÆ]t6?ë=œ¯ë†P¯å܋抹|}v©ò‡k,wh0í‘‘Ö«åø†ï¦1éô¹ §)gŽl…ž=N§UŸ¢ñŠ˜$@ŸÛÞ)1‘¿ø”Æo÷¹H zš#Ú+}¼èã®y§Xö ‘b`Ž|âªsjúEú|ÞÆýÑæh¼‘×vEæ×®£Ÿ¯7rY+ºÅ–ù]Ü/wÝ.à—÷Œ?KcXëƒþ×͇·"ƒÞ ­~ ½™~«—SGÝæq¨`í×S)ñ#–ŠÀí›î,^´†Cîå·Tæò ÷]^’YG$>§W~ãPÛ=½ð›~ÿ‡5,‰qªë¿—.þÓ^ÕŒ73ä/¤Õ{d<â­øÚ©ÎÐóIåa¾„¯Ž_ÇÃKŸß:0¿õtÞ[Ý›½Àÿ`•9¬õ(³Žƒ½{‘¿ýJ¸΂?ý¾rF8œ·àÑP:kýÒGk½£îG×o~& =nÍ=}Ëñi§8XÇÚ_ßöìãÍFð³(Âì÷ä}ŸÊýÒ.°·f¯ÈÚaF.(”g¥¥½>ÖÖX‹yú oXˆÆáƒ' cYù7áAÖÊÜú¹†uÇøPOn»qI€¸³–ØÏ«¾Éc5 jU…X8òéV*}äâòÞ¬ºÝ¬<“æ<˜ÿíìä:óÛõ øcTdö ä¯m[t¾nbÅa„ý2»Q‚r4ªó/…þܹ'¦¡Î±jä•gánþÓRñjúœFh¯hèÛû[F›)ðPÃÛåÐêF.·ÌÿõRðöŒ—+t…­uýöÀÏõÖ¯™ºˆâìT¾1ö¯ ïŒzè÷T¿r\äRÛIJo‰q]?æá\æ¶yZçñáŠÞr‚"BÆ¥2¯uEü/|µ]¸.Øò<Ñwm?0x©_µü¹-¬çôS‹N_g>—×óÄ:p(÷% R±üY<–k[=ø˜Å{mEÄapšÛWÔmSZ—îá0¿Oþîwã†(âöð>¾VúýÙuwÔ$"ÎO?Ê÷fíûÈ÷ïí_±Euµx}Wý¦–¦{C¬ý9—ü™_Ò|ÙiÿH2æaQVTºþð5èÙqfÂdâ ñ—‰ô{;ô«f4‚.m«G¢#&`ô3>*äÛ¢-eð?ûðÇ%à›A>/O/ƒŸYñr÷(0í™.»«œ¶è™ár¸l¬ú`aô˜¦ñûËO×–×qƒç“éžÝÜgàW¡«ÃVcqµY›‹YëÝ~=9ö¼ôþ‘ß=bRÑÏ×¶™Z°ofì‹ýRòðË™=gw³Þ«”±?°qÕjÄYWyñ‘>íhx§]]v5/k¿%´î OòWzø¼—¨k£7?Wžºm]×~Ö:]˜ž±ØúøýŽºÏr¨‹üVv=ª—B»ë®jµ³Þß#»ÇéŽt5H<2<ö|?%JuãwËÕwÏ*!Hù4©ë.4ŽO–“‡ßPÞ©æ’È/Æt–ì¦Ï…FûoÞˆ8‰ïú¡Ë 2zBз…ø{Âõ©êà!ÓÞÝVt’³ìÛÀð{*Í‚÷Ò…wÈ»¢"{“ RÅv%½KÎ7^Lüÿ£wó'‹Wàšb“Y4•…ªíËm5iûìŽÛªDŸÃšÙß¼rë}èèÎZ‡ˆo»7<¼ÎwôüÒöƒ—=S[íAö†sGÙç1b’4O¥¤ßæüÜžøPÃDYz _ÂËÄ%•ºÚÙ~ò÷¬'öÑþf‰§IW1ÿíK=ù9¬ö޼ÖnAܤ>ðWä†~m«#‹|Þ¦âŸoÉ’ [òZð;½n{)yõxØÅÛ¦ôt/ôè-|þ>kÝ%Fò—¨ódÄ—¹Vêlø½¯ÚŽ“è÷1UˆÞcò þfÓ×kð›ËÞks½>xIíé/]×ûÎêìO@¿n¡_Ò§·ô¦ÉØ'wz}%¿Þ=KN³ê…¨Ü£—·€_‡‰=¯Ä5áÑŽñÚà×a—ûŽ5#Î2ͦÒë'®±_¦Óë©ßDÇ#ÝŽ¨;§Ku~|gI~0Ïõ¿á;xX™ýŸ9[æäêÏÃÅì÷X¬êø„<¯_!-ü þhõrèÓkÈ›ñµÈ‹³êíì »¬þÜûy|sæëèÿüÕàˆßÅD‰ß°ŸpÿÓÈaŒ¯xµ^Û‚Üã\d2'ž~¿æÑ× 1ÿ´;ÝE1íø¸=£÷iµOÍOAÿîfÓŸµ¢ÅÙ*gûXã‹Ý¾ íÆõ†ðî?‘‹ \rjÚøåë|B²ÞÙ%¶¤òÔdI´ÚÛ\¸àµ`cS ‡rŽý5{?AnêWìþœ?² <;6³mTõµÈÌ ¿£¿ôA‡—Ÿßš ‹vü:w:”‚yu˜m½cËô›eK 1@½Ó§õP ÷Þ)DpÀÒ^Ô~È:“}ö¶·'ÚÛ}ahþÿç=ÀæiôŸYÍ!K̪קσÌ÷C="õT¥“õü •0Ozb5}~}Íö7íŸ`õ8ñ\à–oz±ôÖz™Ëúü UÀg•Ão~6ÑûŽyž¨SôVªg9ö0íù+‡«‚ÿ$^Œ wæ'ÈæêýÁOÿ:}Ø–©U¯ àSC»î?}¾½FÝí\ã¿6J;¥yO˜é7zZÜ>ú½õnb’‹å1O¶{ÑçˆuûåžÑ¼“ëT× zœduàïœÊšMÏpß®¾J#WÕBÇCÌk?Qg{ŽËŒßñ¦ñÆ¡}ˬ@£Èoþ2[TzÊ™~ÃEÉdÓÏÁœÚ6ž*òqˆR×àU†tiÅ×%°/·Å0ýþ5Ó¥«å…QÇ–ÿØG?O±!7Ûó âÞÆ7‹u)£nqWqÆ7óà¡´>䡊“ 5àI»T9ÒÌûŒIïj®¿dé|Ýq¡ø3Ï`ï/øÞã믴µ,ž£›íõ‘þÿ¸îçužÿxpî¹û7Ä“Eý ±RÖ¹/¸÷"ÈYÌHž†¼`ý;'æÁm¢ñƒë1gÊ~Áu±Ð‹ÿW ·”äÃwªƒ×lñ·Ýe:v|³c1ìÊYÁ[» ÷&œÂç”°ÙÏg ¿iV^ÞÊò«Äë&÷QqDï €ï¦Ûe¬CÞ'wk'vf°þÉí ·oFA_Ý.žFü…y¬{d™ðŽ[=ÏrØH繿¯æþk½0Î åOmûaÕ'×Nb½GÙÃle2½¾räë:“fäçâs¡½ØCÆN¬÷Ò'.ÝuîøiøÀœÃrðgω«fL² ßÿ”}É×å »úc? Ÿ©-r#àÛÃOÆ"ÏjWéÐïµþ«×˜~?oæÚ¾B¥.àþ‡‡ª ¨ó}{l Ö!È ^–¬s»dläþŒWòÆÌå/é÷Ê*¥ýH§×gG·$±ê™4w£7/¿”—™gç&ï‘W)óÚ2óuž¸bÙ!Œ;A†óÐ|iÏœïk^ƒjÅÛõ1x’©‡â'Œè¡ßÏ&ûa™w|’O ʲb3ÿ0Ó_ôçF§(pHýØ÷‹†ð³‚_£¬÷ þ#çÞaüÒ ~žý¼„'ï÷ïÓëñý|¿ïî·º»¯ë:×9Ïó<×8'ò“LgÛºxñð×ù|7YLòÜeg—Çð,zË ±j·'6Ñé6B1ꂟɲoû£î îy =tMüˆ0 z*QVú~À¬{ã’ßÖ­'«] ö-VÓ[ ¾mk\uÙ-Ï_@œÐ.r.ËS@çùç1àÕ«KžªÐ§Ø¹’Ùòe)}>Õ‘ }½'÷…¯ú¹" ðJùêE¶óê¾3ÿèo'ùðvÑðCYþ¿ýà×»tSåÙü[ºØÎŽ [ôëCÆw¯ôc†¸®ª"øù‘¼L’§H_ê çeØaÒúß1ÞXó;2öA] ÔgÀOVÈ mc¯?’xå}4øËΞëŠkáÇÃ:•6pPL¶hÆßUEï…45¹<¼2Åè9xgTÜ ÿ ðÇ6l|¨h£ûîÏ 7M«MôÈ=u£ ²|ÔPQÀÚ8àÁÃÃn¾h/ÌZÝþ@Æ}=$Âe¢NmÇ“sé€$p÷ÕzÍ‹‹oÎ^¿nè·ÓîÇ2»Øâiñ]B×üðþúÕ'דõÔEçOü$ù?6:Íb;·amr| o øÔdç¯ùÀÁ°4ÓBôýsžÝ7Ä]b¢¸¢ ®MëÝàBöc KÉyR £¾{;!‡Öå¿vNžh7ÁüÁ±dà•û¼G~›Á_ýß§g^ÉÇ|HœsƒÞˆ‹•Î#õ²^šdÍM1Òo¾ë'ë9×¢eßÕAx$ “K'ú—"°ÑÍÔ ñŠc¿ä胻ΕßÁðŸºV¯ ï÷L´múÓż6ôt¯l ÉZÌ] ÿî¿Ûðú^¶{J©ý#&áïï–}¨žGý}Ë)èv*Ò´cb=Œö§D}ÊÁ« Þ~³$qÒ)Å=uWÈ~¡ºÆ |am82ȺÛTq{ðÏs›Môë¿ïUYXå·QtÁP˜Ê†éso¹‚¥4öüs h,ÿ÷ÓS–ìT§Ì.Øv˜~"fËsr¯ë„O›}§TYdè£ÿÞ~7v<%õrø]ž†#žz³m?£”¿Ýé/âO/ªÃ<¶ÀõaêxyNàþS)ÀKÎlªÈzŃë9–˜×±àñ•· ÿs³ýÏPÌ’ŸíîÕ<òàÐÛYÄ > 2ˆ#ç]S.¯Á<·™ó…>û F”ý—àÒê8‚÷JèùÊ},&e,wüž&E—ÉÇ ÎºÀb‚+Ä®=Ì šÇú¿Ý çëǸ“Ì–)Óåi›+/mż<}¶qÂÎZÁ,öóì™sRÞlƒþIu$^ ëü‰ûÝw8ëÜ™riB¾ôCc[+norv‹/p«cö.R¿Ä&M)Y ˜R¸öè.‘sªL[~5ÚqÔ)œ; ã“ü®Cê®±~u?Šñ£”†*m[.W?xtwþÇKòwzE/2l!ïÝœÝ~’íÞOn­òE[=è‘Ç{è‘ß­Èk¢"s‹ 0NN¡|}d=ÔÄæøtø17þÅ[ýÁ›UUn/1êñ¼øx†æThõè!ë.÷Òï‚ÿ¦»omãN¤\YD€uÍ™lÇæ¯JËrmbÑFçRùÇ0Nƒ»¦®ð,¯lN9|‡×Õø7ÁïϺ_ è 3gó·À¾6»íW¾h©Îl:À‚\î”Ø‘ýǤbáú_ÀéC&IcQZ³[z·iÞTÜÕr~‚W1±ùÊ×å`ϪºÏ$H¸’ì´¥es!W#¹ê¥')¥Á†æÏäŽG¹:l&8¡ºCDü8ÆÅñ{Ÿá}çþlƒ}Gü±q¼Ô?œ¥‡xßÏWf[ººbƒH§ æÿã?¥Ñ‡j\ùÐëŸtZb³â6àX×$ŸÕ%ø^Ñ>àÃô¶Q íêµ?QýJÖ£²¯O…<ÜoD~ê#yŽÆÎp³Õˆ;>ÝCžÜ異¦Î€ù¯Ø|Üþ# Ûß°ínßðK™àŠžýçhr>­Ô,sôÁÎ\^!câþ½ã}ÃðK²{8}IžýØé›«ÀãBÅ÷å‘ûi!ã1»ÎÞõo3kÕ?šÖ£_Þ)çMA?CÖÎVÜwòe^ˆê$÷Û*J¾¾ÂeÃâæ3îÀŸÄYŸê ÏšiLôKì•V¾ç¿Ñ%x&x¦ãå‘\²Ž|ôô!rßöú†ñ?ÀóÍ*RE¯Ð~ºxHç'ø?qG>+ô7yÏÒ@Ä1FT\À¸]{Oc\‘Ñ¡5ÜÖÀ¹‹œ ÷^Í#‹ˆ¾ÍêɬÙyh¶ÝÑÄ¿m¹br¶ Ÿßï¢ÿ/î qÁϾ?/ƒ¿3¸ïIôªªE¸bë&ð]…'œ+fþwº><Ò2¡Ow/˜vÚ3C‹Wãµùõ4'81ïWÑbØ…²öÎG› #£ô‰_̸àEÖqÞI¹Ø€o™\ÐxãÑÈ‘ènŒ(ÏxIîuFmw‹‰Â¼ ܈œÿvYÞ®ã >’éô«½N‹jþRÔ&NÞËè¹É£#‹ßo¾õB|×o©/ÞÊ«L§õþpœøÜåiä¼Aɽ*þ5z}ºö¯Ã9ORñ4*‰ðЉmrÀî·–´ᇥiwtàÿz„ÎGÍKuýøMö=í}]ë)†G³UoÞkzz!vX‡bê¦eýºq©…©Ñ¶QÊ6’Ðj&çšexÊÉ>ú•«›Ž|]×ÜmjX>lºâÉTÄ Å{dE'92§‡®ØíJeÑÑ+-{¦A®¦[d=^ûeX_»ûâôj9¬Gâ"å:îVð­Ã±^!ö¤Þ˜àuï©,úÈ5cɺ³,š3õáã ¼Wésþ^/7üÿþÀðµz×i6c^\ _¢Îì&þéñ óDð×Ъ[ÅÐNˆÉ"ãþ ¬4Æ„jãŸôÑ-¦½s OÆ›W† _a›*^ 7Wy»²¥Ù¢3»T5šoiá!çç#R²ü|`oÅ®¼ž•ËúŠ ûËÅãEÖõLDF¾oþ˜­+º½ó=ÚSê/ZkEò°W9¿+€žG^þ@ê—‘Xôdd?ƹ¼ö3Ûþ0S™¥}m#â&Õô-¢s"õšê2_VsÿÖü©³Øú—% këJ1ùŠÕöÿ!ûZ?koä@ß2v«œÿçIÙÈÕÆ ½ÏP~ÝpqÀÓ|UvðWíæ =yj”‘uèò–‡G1ÏA# îœð3v¾Y‚ÀŸÀç«ZðÞ¿OºÐ{šþMôïœôKz¢}ãS†9ÕÜ?²@ðï?O&Ϩ³_WxeñÉx%âµ ï?žbá{N}99Ä9=~<øÁ³…}eƤ.ʊ߀·v#ÊK=vc¾¦ ‡³Çù™éŽ‹–ðc~ÉìþŽ÷b-J½%ÿ/ùyÂ;ŸQo 5­³|aEßœ+jÝÑÿÇØî/чÊoÆ8³¥ôÏ«ZÂßDœ›º~Œbøã'ë!ööï3µ¡K½– úîVñf=ü±q£%Y·òI6}¢ßý”•zÂx‘›©×‡qºYpbÂí'9\„ßðœ=¢Žq8óêØx˜úŽˆÕY“Ì¡þn3x]XçÏUøU›¥æ÷k1 #G‰Ÿ¨Êù¬¡΢=Ug~$uü·D0šÛ!ß½Ï[ãßû¾wíE¼.îãÜ0ŽqêªyïDÛ:ðÅ=ý0êBÒ11Gïrì9zóð[5Rõp™õt-g«yÐ^ý.ÞÃó7Çšúš»WI?¼T½Ö{´o{ÀRqa[ǦScªõeŠŽPŒ‚ß=4{å¹óü¡yÔTÊߎ辡“ YG9õÇܼ:eÍün*íÇQ·ŒKíÝ"ø÷• –³˜„E+ù›O|ï£Ìq+ÂÛ¾‹ü{ú|p®Ü2Øy¼xnÀ|è7÷ ¥u¤ÝŸ•ÉzEŒÏÑåÇYLiî²mósYŒ'S{j}>ø1%uó;ñ—ÿÒ<0Eã(ñ—Q6òy øûœè¹Î÷¸0¿eá=Yý°£êujbÄUÓ›X$.³‹y•bI1*÷—œ5Φ½æ5Ô¨'ïΛOÞ;Ú·]m%ñ«ž†üÄ¿m1ª¦”Æ¥k\’.5'¸‘Ÿù–/Üú|³mjÕEŠÙÃ9Åþ® ì|÷ðI#².Ð{ûÆ;»™äéÙÊÒjî'ûŽû·N܃b8N/_ÃgüôÏ{ßU\œ4üAþp’PÆ*ÈWu!—"yïŸ'ñÍÅP~Üÿ‘ †A=쎷Mõ9â`î¼,Ь‡ÿÿÏ õËEÁßœoÜwûñ™äwúxÛô;p£4 áÑDûá—Dâ!ÞNpú%%…ᅵ3tý¾·åO-ÛýR&¡ÿ˜;™?ÓónºkŠ)FyE×+=”ÒgagþŒw¼O]’ô/M(R{™:x\í¬áÔÆ(<ƒ¿tX8 ïõÿÚ%Kì7sØç· ðGË?6ÿ‚òöSˆy:qî\iÄæ‰?R­:0 ¶"¨ýŒø<÷|¨§G.PŒ|xØ&rßJ7’ÇQ?/=ijN³ƒä™/è„ÜÒÊo+ßÔî 6 ü>ÿó¤Œx¹‡_eÑ)\ Iö§쳎‡Ð+é/Æã—`ÿ>é('wiõŠŽž6¬SŽö¿H,âĸ,K¹W“ý³¦ã[—RŒeÛŸÉãðϤ´É½¾ðxy൭þõÚKèŸÕ¹ÊÛ~è_hmâJIðس¿¾8ƒï&úðŒõКs’6à ÿ>é,qŸy"ÑM‡:;‘õ„¡K3æý&xÔÙÄñø‘_ßMêTÍ»ðfW‹>þóöpÿ âC÷p%Á ¿:Ïõòœlû\óG“*Ü-9«è)¾þŽþå«È+ZIê£MåÛH1ZÝ\]x¯ÚöûÍaï®&žžÏº:}_&E›)F_VJÁ÷NêcƒsúôŽTÏ“eÊLàïlóˆ.èÕÙ ¤¾“Ì‘ÏJЗ-3IÙCÚaIò!’_jý†gõï—³ÍNR)Fî\Ý‹ÈOÒ›ÛzÀ\èm»›©ÝÂ4îѵ\ Ììwü–áȶ¾Ê_Û×Oòe˜¯—Qç"÷ê¢û¼^‚'M¹›OÑ+¹ºv=dM¼µå¨~¡Eïœ$ö8Pø)ÄL£óäÇÔMWxµÞž¢‹ ŒÖÇŸ„_úsþ¤‹Áÿ¼GŸ¢•Jß]m¡#T>Qþ\7ˆÈ̓¾_åÖ&úþÏ“Î]d](7ƒb]R¤€/Öš¡™³ÎÁ^] x/° ÇáéÆïIµàÆbµÙˆÏ×<Ú{ÜY&›%ŠxftÙûŸÀ5f-ëŠrèk^‰MóûgWöšK7)Ú ½8”ìÇïWò’»ƒï™ûÌA\ÈT´,?Wï?®.õá° píle3[]‡ÿŽ7Aý––ˆ EGf–ß½Gö[â ù’òО»³ô{e´/³È’èMþ¥[/QŒíÓ²Ûëäáošã~T]Åïìuc;¾D µKÅÉy‡«ÓI]£Cö¢6“§â½Ñe†ÊÄ_ŽîœAükø—®œùà‡Ôå7>D¼YùdäÂ]òƒ=Ï‘mçët)´çýaRê/’7óçôÚ¸‰}¯æÑ€Úw&Ÿ^ºïÿ“®PØôãÕUJ‰›œ®S÷Åw¤–/(|Î"u;ÇZž¿D,þÒpE’ä“N±{5ñ½׎§„¥†ˆl†¤rÏÌ^/’Ü-‚(FiæÍãá-èWï³r¶¸†‰RamX =ر[¡ßUÝ{J× |rÐä¬D áÅ&—Ï’u$/Þ€Šnð.›Ð×aºÀóÔ^îTC|¯sFÉÈÝñÕäÕM¥øwš“{üZZ$¯@À®ñØk^è¨9Ư4*ÿ¼Šðâ¥|µ¡ðÓ6/ïèËÃ[Ý£‹ñ{U÷vdá—·5Ô›¶ø$±‹Ô8¸ œgHå­Ì˜Æ…vïFŠH’ïýódòCR_J^¦h¯¡ùsIÝ×É?OÙÎuŒ©\è'<ÁãÞ£O-ÄIû*¶|ï-18ì“õ…E»í·Þ³óþMH8»ã- ¶á;¸‡E§ôŸ9A1»ó?’SžÐ«Â^ú·I£êɺž¢Lò:N]Ì ýüÐÆË–þ€9½qZìyí-ü+m] Æó`åòÍhGÔð[59ïQ2'ýkU%ÑK‹¨0èŸ]Ú† ðÓÙî‰WMÙö•JCn¹b1Yéó«ÿÞÆû"³Ìùà7N'¿\Èv¾1ÖbÑâ °s}eÝUÂàÅ]ù9àÑ>Û•_ÊC§Ú¦³ö÷Œ&®£×;¶Raø}N¨fÈÕ\Ì£ê$^Š­®j¸JÿóÛýÀƒÜ î…,&÷çì Rwï¼Þ½?-ã<×ã–}P¥….=ÿLPzŸi=¿:júq7ü[=/æø3~#ÇYtñB¾a9,†%ò±Aƒbr»õ£oÀ—VºÃœÊ0§-—³ñ¸ž›V! þJÛAÛ-øIøˆp¡süêñ‚ÛY6ÐG‹º;êæà¹ã‡%ÉzÏÆ‡÷×Ýc1>9sHþМХ¥À û€ÞGâl÷ðâÖË+Ë¡˜èc wOöLDÚ©e){1Žéâþ„÷EŽÌçZÁšî#ÏšŒù”~k\µlÖëT&õœM á'¢¿¾(iÅüuµÖïðD\^;%˜ß¼}øG¬8ü˜ìgÛåÄoç nñL…]ûN¯Ø}vfmlžEênj0| ?Þ·÷{HÁùv-- à WcœYÏ«6ê æðb…žøJ¢ÏþC¥ö,&XóÁõÍ$,›û‹ä‰ÊägøÍ@®Â’MàiÚÆ6ùÜ{özE;5<|zj{.î©f¸tö¶kðû}uoÏ ï>d¢g ymás]±¯ó,~¬¹oƒ = 8ðï“ÿW‡~JªÀmýòâÈ”·>¼ÞáµôïÅ«„¦í»‚ì+Mn?³&ñ€‹ÓÎk°_¹ùn©eøÞþKä=sÛ)ÕÏ€OQʧ,›EïÈI,C\æF‰p¼B)}ÿì¥@â±tÅï;æ6¾ã§Ì ×†³ÞOßÇbR§FæðMèEð»åvà ¡ë;žÀø9†°2Ñßx ¥ å~ЗÔEd½,ÖðÔ´òß$Ϭܚ/j³e¿öŒgw(c}˜Mÿ̯ÔÊ¿’$yŠ$EîBrd¹´þ~.mÚ9–/¸ìÄ~isŸ ‰Šc¶¬˜ÔbrÏÝiÑÈý£®®] Úåì'zZ%dž¼r9©+;Þ¼:½©ÙÎt"ÏcóXî>VÙ/Ðé‰l¢ñï¯¹Š‡ÿyÒIÛnX)âç‘+HÙ&.vyc‚-¾óôK¡ ©ùg§s?xç¡•flçHƒ—< ~˜¢õX^­ó›"ú q\²ÃÝM¾â{^:…$^<€[u;‹ŽÓò9ö”´‰¬³TGçíìžà§LÙõu¥6s€'÷‚eÊ€—Yz/-büü™ÇÄYlø},ìùµÇ¡ÿSn–]ÈeÑ.·Îû_~œTÓ”[ëËjÔ¾ú‚èUÙÒ¸KˆGb¸ŸÚz`¹?žUR/á·ü‡–fê£M¢šµ$ž˜‘Tõy~î¼ôש6È1|Kú¥{à¡j-›—±Ï+_°ØÌ÷‰Ïoñ•ʯ©Œ<æýK¤¼ýæB1<=úuz„W)š4J«PL­ºãy­(£2­Wˆìk=ÝøÍçÇ„”qþJ`чv]úU¦FÎížtžmÓæRïoü‘SFøRÒ÷ÔTĉ™U·¥jÂ-vSt²pÓv5kè‹‹ÿ¢ ;nñ ÄRô.£ÛÞaÀˆ¥Àg/™³Ö Yˆ.!z>*ô¼›ÉzÍó°Åx-P©µŽÅè;¶Of“sUëGcÇ)°;^£ÌC «JÃC!G·ð˜ë>Èo÷ö^/òž{‰êp ‹Î}¿·w‘*øÍ|u]r~ ÿū͙#´ÒøùRbQM’{„¡7r݇ÀS—Üû; èâumŸåy:h@ö[åù¡L³ºßõh#®«L¨zÉb*äN¸$¤ oMôþ˜Ç9AcŠ1àx§¡ú|#(qÿaàUXvNÅ}¶úœ¹­:íCô²ªoͤÞl†Íë5À-“qΞOÀ—Á¡¯«HÜ‘}xò»y˜Ï€¿=Šoag¹þr¼Å°C£È…yo©æ5¾jïÉ÷ÆÞÜ4>âS-Ì‘‚^9YÚÍЃ¿Ô›.c) ô×'¼*S³ZàÅì'qWº7ÚË}0ùŽ–:úÇ'”3Èvo=û;•tüü̼=šÉÀU·Ý2§òÔ(Úó|æ-%¶{…åÆIKæ­eÑáO.Ö4ÃOúò,üñG™Ü×\ÿTgb¼ne?7m¬Î•(-¤h­Aû=ð;‘&6K·~„üö¯Øyßsy`uVø~EĦ’ø¹-S‡Èy!ýý¯j& ŽÉ\péßtèSâËðC¦)Ú7Àk4 Øî±yÀ‘;ÿ¬»õ‚ígdoªŸK1IÛl_̇œÇŽ— *£Ñ ]«É9mžÖ¾´à©/ÿïï°û/²K³á¤mu½íü¦QÅ¡VAðûÆ–ÛÁŸÜ»-%|cò#Rv‘>T+~g« E XlÝ »»;ͱqE†[Ì Êý3vù¸}+ì"rx]çKà÷œ÷‘?ì0î¢øYlç'£âø|-I^jÝþ§¸È;\ºNîm¥šói³å«ÉŸþ- ö þ>ØYÿ(p\“¯Û€ í²RWE–'Ê_#ùR‹7/TZ‡¸-J¨ýf ɃвÅ-ö“T·™-ï2“Å2¿|(íŠÏ†Ið[›çFü!õîÃÜ6ô³ÝçIÒ ×ôÆ8âî^“'õ¢=·híþ¸~/_nÀvž…å÷0ì#Ú“0k"vºO8Ì"úrÈyê¶þ‰ï‰nÒu%ûÝ‘ÝǪ ?¯o~Àktö›»ÔõL¼—ºz‹óþoðóaqjè—û˜µ‚ æÇa®IÚßâÿ¾§4®#ôèYgûçùÿúñïh™ùÕ„ä[:¿–äë¿[üv¤ vbPöQf ägÕ[YKô~Õ¤êÃXLvö´+V˜‡÷¶þBðŸþ'ŠÍ¸#ž‘¤w³Èxg¶òÌœJê5;'Þ®£h•´¡obÀÞé"ÙÖ+²Åu®ÌŽ£˜ƒ'ëfò„Tx³ ñQü¸ÀE9ð—1ËWn]øžÓ‚r!a?ðt{K+²¾–¿-ZK‹œ÷ö~Î1ú\mŸb’7OúÉ ¾r{µÊßíà_õZ'Š0¿isR/‘sÆB ÊSÈ:óQU5?à®Queô.šWk5â'Ûc¿0^»ÇÉWÈ~AΟ:‘ØW¦à’&ØEVüy뽈‡BÏ•üYuýÓV#Çm™T“ðÙë¾SÍŸ=YßÈøcŸµ™âhß?OžSÖÿ+o­e”hx„·©Î{#ô¯÷ÑK°OÎz¦‡äéԾі}7U»”|¸qrÌä¿p±_òšíø«¨œ›Û(:¸bé¾…’x÷˜6Mœ¿d•_þ†¸-ØÿÁª[W ßòO•?݃šô«&d:h×~=ÄNõÇ]½¡ª_E) OÏûgû“ø³¯è%Éw+æš`DÖû—¬ò˜yȦ~"uÓÍó»;C¿ù¯åo'÷­šÔ]Ä!‡ð»v‘8У~CX ðÃfûS£<¶ûxªÑ+_0°·à\»u9àÿní7P6‚Þü~¸uð•ó¸˜ɳü»¶ôô„µ©n«ü[ðÀŸ²‚£Ài·NçŸaGsyÉþp!‡Šm| Eû ºõoƒß‹w>iRãFÑsf†1„Gr&ðŒ½ß·ÜàÝ&èKòcéyµø½½çÊ=h7âOyjOëDÿ2y+]Áÿüçg.@¼í[e™* ÿêÑò¡ì Ûýª„d†÷óRÄý+Œ7ÜCEI:ç¨Ë¢»ìçÀ77üy»ƒ¢½ÔšœJá‡Â«t:zɹaK#ªyäÞÖ½D_ÖÍ?ÒëCòt->—2Hê"\ÞÞl„g»Ørnhѳ\ArNeŸá{föeŸòÀ_ŒÔ‘4Îï‚]ÙÆð}m}Oö¿^>&þÈO³Sõ pÖ;J`¹/(›˜÷žÔS°¬U{Ô½ïê%v™g˜à9®‹q¶™¥JÂ%e¾ða0Ž=7ë~O\“ èâs¹þÊ,:â¶E"ÉEYå®ßý­~µ‘}2^Yqøú†Ç!7/ËFë-øNšƒþ§gÙ°ã«^{æ€çs®^,·šø}NkñGøŠ ×àwfek_†›CÎC›Ì+ˆÞŸ¸óެÏXˆn½zóÓÀ#-Fð£}²Y—f ­?Ûû„è}\rwÃ+r_ÆZãØ|´··Z0d9ôÁZ㻫í4Š‘Ð¶ùÍEâÚg¢>Ró):Á‹»þº6xÌôë—Š¡F÷”£'Y(‰>mT·xÉjÏk¼¡úâ’þhÍ.ÈÉ~àÈ9WàgxãìŠìs/ñ“2"yïNç’ºxÁÆ;.¤Ã>’oYOï¸C)õ_ºKì.á缺à·,#¥Öõð¿™ôg’óGÎŽdÝ>ÊjT|Žx†N?ZáUg'ÀótÎøô1Ó<øÅ~žqC¶sΧxå^o]ßæ~y=ðø1þÊxî#©–{­‹¢WëM_Cxr܈õézØ·ûIŽË«ÐãÆ-­—a/ŽýÌÅ|Äó+Ïf/ŸZj”0úA[=çen¾'ù¶Cƒ§5@ï_˸^œˆËhëˆW)'À‡=/uË®YJÑô×8³0?ë<×D“úI¢ÙÁnÄ.¦}ÑžF^©þÊ‚ÿ²-V˜.ˆñ†„ðÌׂþpÜßCöµb®NöÏC£×u¾Ž Î'dGyæ•w!ÌlþT¸õ,™¤“b?f-„|ÂîVz#^L3|¸» |¡ø(¾“¥4Äçë^õŸu³‡3áÿBs®œ.'¿©Ö/DoqðW-Éç <ëÞätØEÔ¹uËû€ßóHþ‹´çz¯Ÿ¯›þûÄDÁ$:õÅ©üCðC^G?RGáJ÷Í;ÿÈ~“kQjsEóŸ˜ÂJÆÑldyóÀrè;g ½3 Ø5x?¹»føðjÛÆì¿>h×=9£møÜºU3 }ÝwoIÅôcëq±c°ßÃug?ß-‡Ý©Ù1˜‡;b½3kî.rŠÝðKþ¼¥‚x/:q¿ÐÖ:ROt¯=©»Ó^²Eøâg…?‡8€3{·ë~ÙIÖKÖdø­Äù¥¾û1^³á—ÛmóµÀ?Õdg?“Àßy_8{ü@øcä£m§Hžjކ$ÿ°œNäóWd=ÐrҲϾŸ—OÔ ýÎØ%äšý½¹.äEx'úëüJ²ÏäÓ¦Ep±Td‘ñÂc=×"^vvlÎ&û’cΧw@_”†_$†‘uòo_F&C~é÷ö‰~âwG:jŒÜüd»8Ls¨Œž%8Îã,%òv£xÆFó˜ùÝþ—©Ï(¼àìOËãpK;ä´¼ýð4ððÀÝ´£Ém°+ï‹VÛPàô)ÃLÅTe:í÷Ë6Ä‘JüjO¥€¿këd\ÙîK¯}"x—Å”­mŽ\“Í¢3ý³øãïSôó™–?òXÿ}ïp¦õÖö|àžàÖÞKŒZ¨Ž>ä«°¹f;ìm¬FIŸÄw•/ã­NÀï¸Ûn0u†Ÿ)9âu˜EgU_¥:Ñn‚¤ŠTßlŠ©¸Áñ¸~£ÄÞ4P÷$ðå\ÚÜ1± »½8Òö)`3EW”e„Ü‚ý䯪}ÍGòÁ8xdËÓtÊ¢ÍA+P™®ž™ÕBô5ÑÃ.óCü LÇY-ð–S?Ä{È:ì“YCü6,ºrOˆE¥9‹öê6 }0›&õzÆq)‹¿†¬ÛM?˜œµ‚b2xsz…àW‹mõO\÷Šzøx(sB.Õ-$¯½¥W?k†þºG„½¾ ùä·j?o¤”o˜¯“'ïu«îeÑá—ìïE?x¬6YŽœõm­¹YL5Þ’à#û<&aŽŸý}aŒƒ´W&ë—•n}n$¼dóÒ°×âžmó XtnsO®Ä0x¤”Ü9ê3kKU1~¤6ÅÞá‹.ýa\Tþ8h »‘Ökq„þ•+Ÿ3›Eǵßã†>´ÙXbŸÓ†­ëBZ¨æoÛ“ÇÈúeõ6SóAgf¢.BîÝþ\¾d%ødhÍÕÑy9½¸$Àß‚¬kð¿®Áb²÷y¾ ­¤è5å®H=«œl·Þ¿œTó_Nÿìã–ÌûylãÝ|£Ñ ø˜¿t¿˜Çè¡»ý¾ãlyRí’ožßó¸»Ãö½qÃÔ‹D~3O} _¿¶±õ;Úu›ñ¶â Éôi©/É+Ü£Q« d’wÛ"k7¥Ô7Õî6ÙOóhšä~qQFý顸û]RÆÏÉ}˜Æaè“Ò¿OÚ+ágñ*Š^Z¡dÃIx¯ÿÀ<ÄÁ®Ç“‚Ö #¾“ôR%ç2U—JyÁ]¾ÉKžú 8føôX©v1¾÷;>†œ›µ:q2Ù8‘µâÂE<Ù|çžžuO¤ú—^¥vUB rùð7w²9,jÃGîëÿX½4-?gä÷¯ÿ™ÕU~qbÄìOÜFûi-†ÌK|ïн1¼×x6·{w8âè½|~Õä¾×ÛÝIdß©F˜¯ñ›Óñ€©9¾›s‹Ekœìœ³vS`¼£L‹ècb²ïÛýª“¿7¿ëþ-ÚR';s»ë pò<ý%èçŸÊÍCª…ù$Ž>îýdõÞý~Š$ô¹´e£^äSXt£Gu.úwÞ’”í¥3ª¸·¨'¯ZÍÕ AÞú¯ ß~/ý"¬&îq3U+ÄÊ®Ð,&Ýfù3èKì^®Ä—©Çl/Èâ÷<Í›¾‘}вEB}KÚYÌ©7<æ›E”éõ[B¸;üA¯çÿ0aoü»/G/cÑ9óÍ+¦•C/"ËøÞæÀ/‹…ׂùÝtÞÈ)Oe²UèFØÅ£›6±àAE¿V*rAŞJÃ>”"¯;ª¸ë>ÞHâF³bEIØíá­V¹à½.“g€ç ùI'ç¬ãy_e ”‘|?Ýw ¿œï~9Ú°˜ƒnÇØòóœZvW<Ö·…Iy·°UûôêY w:xµ_@ %:ùꩃ ñ{õ¢w÷þ€o0Žß —dÌà—‹ãN½¯Ú¦ÌyŸ¬sv¸wN‚~x¯?ÿT*~«ÑXº ízMŸ%ÎC1ÜÕ$?~½v«•Ðje:êÓQÄ×Ìñ;Ç–ýt[ðZ‹Õ<®ù0žìK;«þuñ€õz; ÈÅX&èÏ\Ì[£¬Jr.¼s-¤ ú’ü}¥ïùVбm¥ç, q?UàWK5÷z“óþt®ýƯß}OÿèY\†ñ¤¾­˜Êþ—û àóMªy(¥IÊœ¼—j#ޏààÒ& Rç;[÷=ïeôóð;ݯ>PJýžáîd=ÊìàýùäZP»î)ðóü7¥oï®Oe";±ÝÿJ÷²9g»þ"qùx¸ÃíŒO˜/w»C45ñ^M Ç<~9’ÅÏ‘œËv¡%fF€Ïd,õŒ¡'îÁÓéÇrZžì!ë‚éÞ%à»>= 'õcRëxëÄß`Þ¶™‘õA¿mÒ«Ä¿›´ç Ø€F™Øìó@RßÙÞŶ~™Ÿ®t—ã+9¿µPžþlvŠ·1ÄÏÌô+¬ÙòíÒ\¸âxÞ÷«#dÿõ«Ä›Íë` \îÝ«Éy%·ÅŸÑ¿4奓UÁ#ï^ŸDAO<Ç·¾.!ßòO˜À-z¡×YÕ6w/Þ2CýЍ˜Ñªø<7~þänyøÙ¯«ÉyðàO5À#Š3ÿSÏó`¬¡ž€<â§Ë#¢÷ÑiÿžÝ÷SbH¾ÙÂ;Æ·`?ûš†o^Þšý•íž~FÙ‚Só OS}¶ß¿±÷2: }¥ã…ofÜšØÏ¥Ku/^°<†ùt{ÔÛ_AÑVÕ 2í0Í•º&ÊÀמg ÅÄO_{µzã$oô°Àþð€P…­æ#!Õ(§-ÏA®ÔÕúä}ЇîÓëN`^ ֖ꉈ‘:“뇗×M¼—:üHϧ~þ€ŠA99Ïüvz‡ÉC}wßdŤ‰þ%\HA{©mÊ_ÁÌw©ŠAÅ?ô)2ŸøžZ}»„7xHD‹÷½QÄ1.A÷u•f‘úÍ+Wi°åuȲ ªÈYNÑ»o›)î%çÁÞÄGž? 8颽vbÞ”FÇãŸ(’ssÿ<ÿ_ÿ1á2÷ Ãÿ¦K‘º;™“vŒy\n,pôŸ~†àßæ$r¯¢ìšdç—(ŠÉJ*×Åü•…½ø¿èS¾KAè;ìò»¯Y? ½– øv–¦vëøM–WÊœJÄï±É_‹R?ƒ—”ÝxCü~JˆL÷Ú?$«ÂÄ™ªí×èÉ;ÿõˆŸ“¤×·‡t¼}`÷’Úÿ‘7m=Ç6fÞ‹ÑŒ} þ8¶Òã ü§„…)¹WhýÝ Èñžu‘¨Ùß*r.·ÈÇT”~“}¨Ÿ·ûÔ¬ç‰M¦÷ ‡êɯIy5š–¨9Y×x>Q(Œ‰œVù7zÕQûpøÃÇWôñ÷ß}››Øê;Û)>à†}0ë×û ^5sËMUèû®„ƒ“ÁOG(Té&ñ|^5ä&Y2>Fê^&:ïÿ1¶xRýŠ]ñ¿Íÿ:™ðN“%Ê;ÑóÞäXÁî¼<.Ü}žà^ebö—-?™¯­=ì_ÍT~1Eê0˨qHB«Õ×J#Þä õM"ç`âmoô#.‹ùpUCÖ ~)8uÐÒñhŦʡZôïS×õßøûR7eo™$àÆï¤ˆ‡.Ðû÷#^c°»µ³9Iþ3N¯É9úøÄ]Y; çYÕ›ý€C¼^B¿ /‹3Z£lù;ô‘¢U *oÜaQJ<}ûIœœ=¢·µþÀ+/_Wø–¦˜{ñÜÚÞ¬jsÖÄ8ÊV¿VRÝÈ¢ƒ”\ëÀ³³~Ø÷z·iƒw>÷‚ß E®ÑŸMp²¸Ä°F~@©Ñ5àwú´E)™ˆ32ãÄS,1¿WÓ¿æÁ/vã7~ù.ïR ü[à©SNÛÈ~˜Ý/ú%ôoLâÒyqnJOB|õ§_Æc*ÅDO6SW¡è¬U2 ö—LÌGXû‚^«+ÐkÕÖFýà‚Ž/®À/)ÿïÚüü3Ï5›ÄQÖg3Rv!ÞŸ2hqë=ü¥Aq ôÏQ$-«å1EóPï¸Èyâ¸5½êàuÉ&ŸHÞ?ƒ Á/àUÞÆæMÈþRÛ²9dÿ&îÏ´ßú7!ǹ·œm€OÞç5“s”={ÇÙò£D,º½éÉ#Ñ­¼÷ ô4ðšíReàPHÁ÷ßÀÉ'´»C&}L z›1»ûÙî¯ÉâŒ\|Ï©[{%ßgJih¡™ß”ÚÝmÈú‡ÈÙÎбÌÙ"~úl û´žð‰à8 ÄeÙïê¬à—S/¹?ù;c}2_}e%Ýས ¹la™’øÍݺêC]ôëmȲ@Ä[~GÍZŽ‚<Ï4LwàtkxEæ7ìÕ€­7ìK;Ui?ôïP©y—Ž%xíñZR|ÍbŸ2éßùç{î_B/{ògø!þpÍRçƒî,ÝUÊjû|jw á—ž=v&uä䫺cë0σó×ïÁüª_ö î™ß:ñ—¶—ÊßÌ~Œk½©öê-$ïϳ…!½ZõîT¢)áÝáM—(Úw<ìk¢"E[ÈÚ|ð@?l:ïÌ À<®´äÞGød¼¢u!ä`A[êøaBä-¿½·ùÇÞ.¶ü û¶„ øÍí3:¯±.Þ×m-ð˺CѢǂ Hœ³ñ‡k=¾óêc=Ùïóš#dóZóîv­.éôþî»:r~,é•òÓZàgÊ­Ñ®Xà~„’¶å§FÄ;ƒCsÈyö¡®Ùä\zîÞ%ҥ˺»×ó~"y.1og—·í¼9gò¿ ~5•y?P8!8N`0¨x%o×(½*m%ùΔgl»t²ú™²GNö¨{¥Â– z˜óiå'µ»]Åk5qþ„.ž3Wyë+d#cz´™œŽç¯Ÿjr¹·R•¢gÏõ¯!çISÓÝbåwD Äñf!nÜ3e¦R9â€8fçùÖ:ŠÞF·o3A»áïœ —²m¶<æ/ûÇ·«Û€ÙÞ3 &·¤‹VuëJ7KŠ9ÒÝ+.ÎËbÜúnè-€?9\0uHö=Ù¿áá«%õé=Ey€³]ó³É>KúÚ€µm#í!|­múµöžt¸~bc´zæ'Ùûqêȃµ}û-}ð•Ù×?HRJ¿ŠN­%¸e¸ÃIq^@ì´9Ó(F.Uš!ûÜ"“Ú×¼eó÷y—ãã³ýI>9áeà3“l Û¡ÿ‘®‹Sž)Á_o\ÀëD1þšÅE;ØÎý¤•_u0óüE$Úßß=~µŠœƒIJKüûÞz.ïƒ~2Á7»§KQJÃ6ÕëÉ=ÁÝÃóekeH³ö}׎B®cŸ’0çz]÷K°˜`·i!¡7(F`S'ès¦pËaÃåszÞ•ö.}Ž—ÿ¯X¯2“2Ö™«ËÐoë‡puàÃQÍÓS Y4+½íoËOð‰ã^¾Ž¢”~K{(³×%ͺ¬·¼ vê³ß °»¹Á>W> VëŸ ‚ÿ¶ôQ!<÷QüÊ7à‡Q=¹ªyˆ/£ÏòïlÀSð Ž0ìEÿÊøð1à´eßиìÈתMº…Ô3Y/p$Ï­áFkÀ»ôîüŒÑ.&u¨ì9/ãç¬ÅÑ£‹‰__!´‰œ7s~¼<ñ¤ãWÑèWA\Žëó¿à…‡Ò5u” ÷œ3¸NÀ^ÜDfÓ†}êJ[ïæC¼ùîªù#R?ë ‰Wýn›’¼a×)ëÃ~usµ~’ûÛÑÍ/ø®!ÞñÎ^Y2?tèQþ2ÌÏÁoqÇ¿@ÿu-Ïòè‘uÙvÑçFx´¬[Rtþåði·luFkϬO»ØBÇ…®,ëè/¯<ž¦ŸÆ¢SxŸ^ù"B1›T8„€ËGW6–f±hWí76/0™Snœ:Þµ×Ûu)EøºG9¹ßô‡j°!uý>f®‚f¼ÒWƒ¸&]¯÷ÅlÄ‹&õÉúêI΋"›Yti¡ÄKnmâ¸Óz1ô2Öq™Ë+¶z&Ž&‹nŽ@næ²'–ï’¿=ýÑàýYóÒF$üká¥R²ÎéýfÞÌÌÿÞ%,Èq«ÕŸ7™À ‡÷°íóUœœWˆøuÏ+£OÀ»(áÜy$o¦ŠÉÙQ±‰vÃ…Ìõf/NÿÝzãµÙ®r<ã±Úö6«Ÿí½r½›!C©ˆSšüÖ0À{Ž;ö`1ËΆ„f‘|M´x ¹—ª¸­Ñg⽟·¨å.`17O,G3_§“ÇY«óÁוÒ.ΩÁß›{Ö|xà['y®ü/rîñÂ#[WjDcœB³*glÁ÷>×­~}æ [o ùê¯àž \w–ªéÒ`‹ŸÜl+»$ ïî{â™À^Ó*P“¡où¼Ïô(ZêV»¯>Ú=rêÓ=µ8ðù†Qæ§ðúé+•:௫Ñ ú®ªhþRqHYù½¡S,:kÚØ´YˆÃüB5Æ´—’ý€ “ (}ùºÕ–¬¦çIJ €£+xZ€Wyè}<þ•š÷ììæ/3çž½[7ñã íczˆó–p¦µ¯„|7 ™½h€=ï—øÿ”Rz-û<“œ?òœé=¼¸ž5i©ˆ)ú_~›KzE=½þu#ú¹àùI5u'Ü”¹Ø‡ùuù›ò:¸œ’^,}ˆ8¸ ¶j2ÕüZ‰{˜ä§ˆ¬‘VÞæ½¯y°öëÞ4ÚO+!çéìÝÙ¹ê)H_é>ùÌohé!u]v•÷ç*èÞR_¹ï}ìk]üõcûNã5MÝ©ñS’©l:[ÞáRiÅQ/YLÄ“vÍ#À‹ô­#pht¸XØì^Ä¿¯Ÿ"øX–uÖhJ‹.“Rk Ãwd\—>3ƒ¿tZ+4Pˆ8ôÅÍÄ> ›Zˆ=|>yXÿŽè-¾õr~âyð:ìhžrÿÁ‡²ÌŽDœ˜{”Ï"­ ß©ì[*O1óÞ|•œXVƒ‹µ¼œ,Üiš ÿXé`Þ?žþy–߯‰vYvܨÓ`1%öƒÚ%Ó0/©û8:ÑOŸîèØ¬ÿ¾—,yØ9_´lÅßGYÿ“ØŠO°¿°Ø=‡RÈ:lÛ5²NW )÷Q ükßÛM7ÄÈý©ŒÏˆÏwÍÏ«óCœðËd9”™Í]ã>´¡áÝì>´¿ëwà èiyA÷“[¹í–/K/H» 9‹½é⟂þWX Œ„@%ï tMŒãèûÚµúëYô†äË—] ‡R§ÎmgÕYsOàKæÖ‚Åw\1¾‹ú™¡ð‹Ñ»OþFâù/wZ·ƒçJ”2‡xé=ÛFjÈýI»kOSLU½¿ÝðIø#óô>°¯uO}^g¶îXßàm¸ê×ÊÅ1ó #§©ˆ‹RO~8è¹Lõä[‰þás?#?–Þy)Eã¶ûkÕMòg½ÐΘà‘tjåÇÖü à‘[Öíš¿“t騅µ¢à5¬•hOLioÙ_ŠðTo®yaWúuÄ v1<#}À _ëøî¶:ä%óc=j Ÿ…2Ò5UüŽ¢Wâ'çŠá3{¡×h<Ù¿Ù›b=ô–E§òæXD`ö—Œú“<$~>tE‘(Æq8/‰¬s&¦þH\ÿ¡*:}[pÎ{ï`‚ÉKÓÉ;êŒöVèÏBÖ!j‚™Y þ,Æqµœ›1æ£P`o4ôJ*ÚkGü˜Ô»öq’¯&%Lêçº)ðoü ÓŽ`|IM§£$)ÆvÏŸÍ{bGÒm<ø^¥ó‘{ç?±˜#[9tKÎAoš¥¾:É¢+GöÈîe5q™œn!û}Ûn»³˜¼Êg ÃWxÇLGquœ‹²¥‘™M‰Õ¹¨^…ø+`夔¹°»ýa³‚o¡ý0¾¯N õ$ÏLß²/šHŸÓP‡_Øulyæ̇w¿U"øEðÔ™ö-Ë3ÿǤɦ]‹GóÈúô¦ËçÁCÝ’'r"oùlÄö‚ž¿yùRL_uk]ÍIêñéÜ” ÑÆû{~ÜWªƒ½™oúè¾€ÜòÜMîq›F,©~ýp˜u¥a°Šä˵qýåG1¤{ÊÇjñë Ù¥£ƒ½<¾ÿ§žëŠËð–…ïn7!Þ²Üë<Ÿƒ­åÞ‡%ɆèÏ¢²ÿ9ïž©¹÷ärïPk#Á¿ÁH£!’Ç6½eƒqÉ$ð“—oOHPç@Cê@:?;w? qǰ"µ\±‰þ¥èæî”þ„ E)2ðòÎ Èz–[—zô¶ºO Òþä¼£×ÌOT0oÊRñ:ø¹uú*•!àÏÛ–³ÅÄŽ¸^qW¯ÒF,~€ÿ>r¨‡~;yÍT eK¤÷ïJo÷~xLÖwþyþŸÿÑa¡5%¤>]ªÛ‰¢ÁçÖ_O΃ UfcÜ<áÊIœ|,¥i 9׺s:úOé«ýI3~9y¢)S²Ù¸L:–EÓ–Û÷X*“scÅ^úÚàgyÕ°ÕH5ë|Lò]祤H+xÄnU^» ÞïþÿU÷æÿX}ïâÿ.Id&C™+IQBŠrK id*óy3Ýæ)³HˆHIˆÒ\nÍ)•4 Š(JR™Bâs­®sNÎû{þï¯Ç~ÑÓ¾Ö^ë×^{­¹,ƒoA«?šDŸv´ßÚéþ.~óäû‰¹ðwù:œÒ бÞÍ9 —<åVdlÁ ®Pç_U¾YDÑJž¾8ëQy'×¹——-}.¢A'ßE‡¼:±¨JðHïU:-æªÔk¨_éK”‘ù_ûU¤HÈN=Ý}ê×åBWÁ~]#¶|Õ;ŸS´£¸þþâ_NZ>z, q>ÙÒû[ô§·ß™çÌ×)õ>òÿíðÿîw_%#V²>ÆJæ•ÀÐGÞåÊdßÏ|þ"¥;PÙ‰ì®ÏûIñcsØ.ý¾VÑ3|çù„{;у#ÇØ¹OÀ8ô)ëiAé0oÝ2ï¶ŽÍdá,9Q]åía ÏÇ׿zV) Ÿü üS®ò®•³êŠ’¡—kOœ 3Ò„lˆö¢«V$…çˆa˜Ú&½ùw¿£þ:½!¯a< OYÙÿÒ"°EÆÇñ+KÔù"gWŽ_ ñˆó¥‡ß^ȃ¸…—ÆA~zDžÁÜ ùj6·2Œwݔ댙ÇN-ó=1”²ƒ8©Hß”B?-«6Ñ3kò(_ÑCgàtÂ`|ůä*AÝì¾|ÓÖc$ÿ“ùIê^§ßûÅÀÈ©Û)rïÛóGîµìKÔ¬ïçŠÓŸG‚|ç îÏU ŒxâšÆ# Ï»Ë5²îúù,ŸÀ??c@nRôÓ g².ÿ)˲®¦pCzÆ~+j^†‡2,¥Àÿè&úiAÞ90^ø‘¬wˆ.-¯Jƒ¼Ý5êìªD¨»2õÏ(¯„|àµoŽ‚^=ê%^•–”·ªö†9ïö KøKÃ;ß{Á}égCƒJÈ<ñsˆýÆ»µHÄCaô.Íkˆè1waɃW=ro˜õÞ-ùÏ£A¨ã•w8Ô’ó´l´?5xC|·¹dF»cþžfÜᡘÉ#‚” ¾0.qLWO->qìYAͽYçv伎:öÅâC8·fgô÷Ã7ýªPL“ç§ÿãN}¹¼l­-è›Tç r~̳Z[qðׇÞÝ粞}N¢‹ÿþQˆo1Ê»ªÆ Ž=´½îC äm1ÌÉð¼y-ä{i·E],: ¿úì#ÚKÉüÒˆìð|·›M“Yd¾áM#äû # öm@/‹¹nß½k¾¸ ôÙR-4ö¨ù^kK„é§ß }™]Ú÷€êO¥s]¼7àïl¿k¹Õ.µ$<œØ‡ÑZ2ÿD3Sõ×<í2=Ú»­Æu@tó ˆ3¿¶ås‚Ü]×K¿úÃ8…ŠîNɦ“ïÌ× ƒ_•î‰Ì|ñì›ëÏqòýzøÎ)ÀynZ$¯ù‹RÔv²Ÿèö]—úš$þõß‘|§KAŸ#kXODƒ¿ˆiÓ’ý žã2~u€¢­ˆéœûù%νïgùÏ5Ñ£ä|‘°yQïNÁ}Öl2ü¡AÕ}O¸ GêK‘½ëÈ¼Žƒœñ ˆ 1¯Ë­@¾'|ªœôlWýW.ø;ãߣ+Ïq“s?®‘yé0«?•¡­d?0ý×^Puý<¯H][–7¿Ñê™LAòèŒÌÂÏn¤ûÖ=‹‘+ú÷áI“Ç×€£¡e¶þ`ç~<¦Ùí@/Ç”'ÁøH~нIöÅ•XöUŠìñŠ/,Ÿœc–~<{“‚E+H£ý¸¼âŸ¾Ø™*ñ‰ÞzÜWI¾·ó]3ïvÇg¨ .F×BGÓv»QNö—/Ñ•}_¢åÊÊD.€zÖdžÜ 5ß,}WÙ¬·ÿÚ—{ýøÜp¨çýy©ûsÁ®¾^’: qÇÛ¡³,ò7)±Ñ¢(küª‘q…Ä•®üí+4!Žðgo¿ºê®ýßL ?ǹ£ñ`ÿ{“¬¶ƒÞd2 íûø  þ˜¦6:ü ô(`õω³0ŽÖ®3ý÷@å/н¶âÍþ÷™69_ºè³$èá.¥çw_Ÿ’ßæP|òîç¶½¯f¨ºo] Át’Y,XòòoWeÇ«J`ÇÚI|º¾õdߦØðvÉpý!³æßr-èï%Χ“ý÷ã5HV{?Ñ—ŒÃƦlà¯4œ¶MeA4kÖ: éÑ1²§—ÐÔš[³ôùl{/§ ÔÙ§¼ šÊè4 Ûº[àb3üµ¬þq)mqËvq‚ž{n›CÖ ´¿±ø˜uÓmðsÂå¬ gY)Æå»ò¿­§•.çq,¡3‚-8®<;Øóý¹r艽”j.üÝÑZ§5r_ }9O:¯B\ˆx0S÷ø-ä—NïÈw«´‹tW¶ÅöõŒÃ÷´¸Èù’ûÂMŒÉ~—ûå¬SïÂÏ"o®Ý!ûÇÐ'MÏ2‘y!»7OŸ C¼v¼•yPXŒÙ@߬ý½Úæ WÖ4ÓÍP¯ªý\úê{°ü‡íEÐÏ®g¬à±iÆC–µéæ·†:Ž‘sjCÜxÀs.Ì_•ÙCÑôxÎ8ÛÂ8ÆÅ?ìÔ…ü®û‡9òfÿ_—A<ö½¼<Œ}ÖúÔ YËÆ“ºM?kº@ô5ÚÍó²C1ä7{ìN’ùœ3öõÀ¥¹}QÐÿi‘¹í3䋃âx!¯+1Q” Ôý…a|~~päÉq7V=#ó“éñË\(†ÇãŠ]ÿäFgú¹\s…¼­5ÅvØ¥óš‘É7`ÿÓñ‰‹Áomåùéã‘û ç«$ø«H+áÉ·àçÒŠKv@ý’ëªðêô }‰gh·_œf¢h§-OiÂß}óæ­w¢hÅ]©ëº(§hì0yŸU[ùög Å8ñV ú1J9¥yS‰ƒ®~—›¨ºû=ud>,‚+óN“èå gë»FJ}úrsYŸ®mò´}úim¡Ýu;Èû½wÊˤ@>—5öòã/ã¿í¾ÜÖ¨'K4kda\$¤ïy¼!óÞ#«ƒÈ{ë;mÚÓ÷à¾\u®-¾ÐÏÁïc«a¼9<³ÈwÕ)bñ䜰£ÁÝÇøÉ>íû.Ÿ:ú”% »Úµ2a>Ù/ÚfMàî6r>“HF&È‹þ Äõ¼ýEK÷ˆ{+“ýD¡þ¿Y’y#={A¨,Û»šB»ÝYoÛO Q4©'%³€Ë+äßy=9½¹™¼—üø¼ês‘¢”úPI±;Y¯äò¦ÈlY§~âÉÜOa k4UÛáçô=ÅÍɳæ‡2z&¹TœÀïMžP“€¸àϯxêæÌ?·.æQêÃ…aùdý˜¦ÝJQ/ŸPq¥ã èsä覼ƒ½ ÷Ãö›gmÎHùfnû ê¥ÀåÕ ?d¸¥Zôøƒ¿jž˜‚þgêŽR%ñÊ®øøÐóP3³9›?C^tóͯ÷ÿ$@<ÿ(·ññW)ó×çyÀ8x{%¨6CòsÝ‹-ð|Ç.Õö¤êzÞSd~ÈŸ9#õôW\µ"Ý¢-[uòÖoO¥ëå“ïþ«$Îô5ß¡ÓÒÃlƒœÞøkïš›q%"èätЬsœò}ý^ýÁ—vòÿ?²Þ¯8å}¶<—d¿ä#Š|OÉ.òîcÛï3Y]MÖi½~jzïÏõ”ú‡G™Qxžäs%%?ïv€?}÷†ãÕGÈs[û¶ù“üzõ±»;©ºViorœ'óقÓò¨¡ûCAÏéµA×À~=ÄL~ŸµnöÜp·›}(9Ÿì€ö<2?¸ÔOMü¢÷‰=Lm÷(õWÒ!=àEöòÙ¥gíß\áù>7jT>B|NªáT«`‡þÍüp›Ìk”×|¯(ä‡|\÷ÐÞ!:-àÓdŠèÓnjßÌ.JýcûŽåd?ëÃm-âeSÃd\A†¬7ˆ©L5yyPüÆwù³úoâÚé2è?ëS¢MÓ\ThW†<+v$€?Ðú¥ãîY²Þª0*3jTˆRÿÙß=BöAŒÑ1b₺Ìõ‘1ófð»¬ýú‚dÈÉé=ÓP'DR‡ý¿?€øí69ãù+=ÌHH ôzÙ\^•ÐKÇwcOSÁŸ† ¦¹Ê‚Çø€&2OCÌ…ñ` MþMö³ó?—«ûì;`bSp-Ù—»L4á>ùÞ~¦í„3U÷Ùî° YåµMúÈ#È—2}üæumºüÚ ºw!®;Q¬‡I˜gw…|'w’Ëø¾¾ð«õL‚0©êa8mtòu~<ÿò––ý ‡ÅöZ#—`ÜŠ;ó(ˆ—îfÚ“Là—-Ö8í_õ™øzÎ`–Œ¸œÑ¥w®ƒ_¶)Ú·«fÛêÈ+“þ²¿¿ƒb9)ï&ót&eLE`7‚[x÷]GUšN¦%‚]4¬™ÞH©×ô†òžëF{œÿ#È¿WL—g‚¾›Å¤mYãçS{ž'ÚË+¾É¨“ÌïûÄ{Ï'óûÏÞÈ!ó°ÛËC|¢íÜÒ6{þ(pû¯6“mÐÿüí&²ð³Ñ˜×Ð' Ïä»dÎäâ#úÒÏÉ€ýXY©¸!ø$ð)د§ŒbÒ>ðo[F:SÈ÷¢ñÇV”>)bã­™Læîoéât‡¼¤NÁÄãß~錸 µ¥ÎìðœÊ‡UjC^õÕ’œW(½êJ(Y¿´Hä>§ÉÃwurÏýñw0)gÔljºÚ8`<¢äßY]¡|!D®ÛµnWx>«±33×y}ô¹ ñ,|&kPw¥þýÂêa’×§¯`³¹ÀI¾3ôKiû=(.:ÆÓDر5t–ß‹hy¾á<ÔëÁ‹3¯ÂýÒ·ºZ×ÊîƒQ`Gš’'‰^™öúd»A^¸ëWX)Ùç(jävðÈ7]JqC¿¨—ŇU‚;vp/û YðV±x“÷CÕ]öà÷5WûS7àyò›;õ‘{{ZßQuŸ.O‘ý?ÕÿëJ‹x-~Èü¸°ž¿¶ÉoŒ†Ô ßŽlp½p·ú/*Ç›œ7áû›yÝ¿sûÙR„W>…üò¬ýØI„»í²Î»ÛÑ“üô¢å.šäýÈÑá½ÒwÀnM¯dß#ûkðlüüâTf_NeÏMJ½y±fj™?j°š#œ yKBž+Ù×&åqüR¸ÍŠ7Z‡zs§U•gÆÈc/¬ãƒ|nܺ26 Æ‹½gð%ŒG±X†O³:U×õv~$™ÿ8¸É^ÀìÆúI¬!Ø{ìe‹wiį½(&ß5ýX$Dæ]înzEö=Q¯ ®‚:9Ä)½ˆ‚vÚ„æ¿‘»æ£ï&~rŽÀ_ 7òÉ&u·šÊ\ýù½÷ð‹3Z¯Ù~¯$ûédîYkzèÅ( /d™†8¬òæ3ø™ §Öß÷ƒÞ/ $ûœ }þÚM1ôÆ•Ÿ€ÝºQt/rþœ‹¼‚²ÆgˆÏ·»ØÉw´yÓ‘ÝüÌà7N†xØC»Ò´$RÛv]9T­¬¢ÔßÞ‘@âøI«wÄöÂ8øo“3ôYÏèþçÃÃp¸vÑK°S……Û” €sâ”NØ ÷ñY™S°3ú1Ÿÿ«å)Š¡§iߢño|¹ _)Ö;Ûl:¶…b¤.âÕ=¨ñ!¨l{?U÷K©ý7yTzI¤Éø)äK"?!Æ`¿ßÛBžƒŸ‰×Yÿ8þ2U7aV4LžÃ»fܬüˆy›ÁK’_Xô &Àó¦Õ¹ˆ–£ÔLö‰pq †¸F«¬ÍrÔ Ô_ÖÉ>'ñ(>ÑR€òßp–¬‹¦`¼úÛ ó!ÎL$”ëAýô%mLŒœßá]°‘à ò#þÐt²Þxði Ô‘Cb%‰ëÁøÎGÞ9ªøß·„üÌ“—KöøÇàᥧà÷ŸO²ÚUSêW?­l‡ç E.ë{8 zì`=xôÒDH|ïFèGo¶SoÌZ§xtjo³5èׂ?ŒrÎ-ÑÅПæÝŒ2JýÛ‘;òä½VÚÖï’½àÿ"®Ó; ]ÎûNR|­p?—ôGGnÎßoÏ 0ž fÖBÿÙxoe=ex+NùÇù3ú.“ïðóÏ» õ–Ó…Ê’o&`G¹RC³ô íäo§óQàw}æ|u5?@ 7:ÂøÚ¿³Ðÿ7NKåö‚þ¸äR ÏiçéÆYùF¿¶Fk=¥þaÏ"('Èw-ͽr¤NÝi.ý˜œËÊÚé ýè(–n=ë½–o÷“½ ãT]GS"ŒcÝö×Ð,õѼÉÎÆYúL_ö@Ë2üãCjè59¯‰?ð+©¯cm‚>2¢'œHQa{J üF¯yß§FòýÚ£œ‘ËÃUZsSž#U÷ȯr€´/¾obwý4ÔëE7I9RŒ Ǥ¸oÁóìߢÃs¦þŸÜ“.OÄBàßUÇ÷ î;ý¨aí ôËŽÌtˆ[Ëu®oUƒ~OI/úýv”ëÈòÃé¹?+;±?ÒEö©æµ¾×Ö ÷+;¤®tÑNK,Ý”é¹òè…›g6¾ƒþl>¸È´›¢ ¨,HÞp¸µ4–|×$957ê÷ä3 ¤ AöÆcüv”z¿B *YŸœ{0“ûö¨Ò#uÉ>#1;ZsÁ_Òä|œÏ~ìÍþ½®žô³Ž«ÁˆgÎüãò$¾GÙ'>+‡vî Z{ò8A¯ÎæýMÓ~ÚÉ¿ò¯Ç¼JP_…vÎyp|Ö~?‡Åkš)¿¸j³Ï¾–Ì[÷ž}´¸Ü¶ã»¥~mŽB&±ó¼uí \¯€žwª›Eƒºn|ï–ÐÓâö€]vŽmK#vd<çä=bgþlcp×ùRl‚àw}ÏŸž5ÿëÙ–®Þq%0Û¬OüEhfJËCÐk¯ßŸÌŸµ¿qpÓû7 Oè„à™h2»RçúG¨CMM£&怟]vø¶0™—¤÷y”Nê>Gf}ˆsÕ§&BÝî)³}íûmTÝoæ¯'É|c¼]sP6ô[§­ y/~¨åÅša¨ÔjÛóàߟ,ÙHâÖ¡‡«Ïv‚ÝzöÝ €dF§êÞýq$úl_V÷‹¯MKÚ©IÑí‘–?¹÷©@ªÄ…w~ŸxÈû Ü•Å÷E!Ž{ÈÌ =¦ß´ÉŸžEÞ™õ*£Nöd_ôÇdÖKgऎšC?Øçd[»ZQuƒ/ÞƒÛ¢¥Oµ¸ž¤ŒÓT$y€¡Õ2±°‡Þî¶;)õîüßd=Z¢Öûs› ¬œ|bù“õhû—~ÐkÃEÍvV”ú½ÎÄxF'-÷<ŒG ÿ3/û~ÿkÐUò’àÔ÷B½¼X…§rÜÏ&ñèeÀ Žs I|û; ù=Ûíj½i²Ïô‡?Â$߈5b¶ ß/¯?ö ­úÑÑIòäZˆ¿jºqhtJ}$K4YŸT³N˜~ïÛ¨y ⡃õû{ä=­~àLÙKà:×?[Iâ~†â—¨?‚*Ä…Ü!^ê®§–©öÛ—ÏÚ!ñƒP?ÙoÇvüörÎVäéùmí«)šŽÅ[Ž(ˆ ï%˜‰^ÅŽ7oó€üFævï©\ÐSÿç*±ó·Q¯õ¼ÝE©?»¬u ‹øñ_‚¡Þ¢kËï)Mÿ7ú-.ò…]Qe.Po2æßšËLÎí‰?Wsè.ä9t¡\gU»úvóÁ1° N‡pnè/U²¾#@ââÈ·÷â?¶Pÿzi,å cèÅ~IGŸªûâñ|÷ž^y.ú7Xæîû+0nvKê;Zàyù»Äá÷zöù¿d Ïtÿ”¥Æ²€b˜Íÿ¼$ütěɅBdŸËïGÂÆª¨ºWq*F¤N6Ôsj†<"ä7·8Ä­ ÎõÛ{ÁÞUV^2 žåo½.är©Ci|W³!礚·v~h?îo+ú|E[1DÞ2Ò§&#o¼#ùØŒ$÷<ðóØM®Cý­²%?ú6´ë¿®4ÛkM²¿A<ÔKÈwznoW“÷¯ž²©“—¡_WK¬<@â‚®ÈÖíe Ÿ[SYzA¿–ë=ã ~wÿúka<åiÁú$ßÔð¢)Z’˜ØîÏÐ/<Ô øwµ=ªµÀ¯z•¬U ×€—ößëÉ{È]ã?ÚÁ>= ZWþ9~uà’¯"Tݤ¢t+©g¼_j¾ë#ëíúbíˆô <vwx Fµâ‘êV*úAߦïëòhy¯îvè é½à·|mÂŒ‚ŸU»{qšÌÓŸT½ˆµ|zŠ|—žèöÃÄ âiÆ¡¤`oðÏá-uä=xpǽ(KðwÆlö!`‰Õ®amP÷¤íYɺù%èk¯Y¯ö|sÃ)Èïƒ.=ší Ȳ;þ ô0æ±/g)ôëj6y2¿åwíãØÙE‡•C 'þ·¾}| ~:´áÕëÕЯ†ÜÚ·›Á¥éÔ®`òygÜ+E‰~9.Êy„¹å³¯dýtì¤ó.â×&6Ìi€ñŒæÚùæè_è3»±[GDšùøTÃïÍú‚Ô×îc™Ñ·ö}œž±…çð’ÑÞ ñŽm·  cg]Ã8µ­* a\¬7¦ï„ñüßhv·•oÙQòÝ’ŠÎ¥Ú›ðïé—Þ}T» õsFsÐ=ðÏ‚Š¥@_¬‡Vú<‡xc×Pf!<—ƒ\à ²¾çó5ûa|âîDQd}`V Qà\бâH Í_™!ŸY]]hôîëÁcÅÿ’Ì'1²y$¡ÿVäþœ&û”ïh8¸¢®öw§uÒáþ>}Ç>¹žöæš#ðüF{ɹí™ÜZº0žÇk¬§üÿt}WCøÃùé¢&œõv¸‚ŸÕ7jg¹þ*òZïy‰ÏM…Ä‘fÕÚ'þFò‹¥~7¥)†Fcp´ÜÏÚOUç9èá^fÑ|x·Ž@K×½Û{p>üþ€óùvÐWoOñç/H¼rŽ—Ÿ€ûºJçøMSÕ0N;–™Í‡çf„°u;”÷v~gÖ‘s¾×ºëpöK {CÝ·Õ ×ï3ôÓ‘·W—Ë‚ß[¸Y=ÿ8Ä퀎Cß`\Í¿T#~h÷öËxÐ[ÿc¢j­Ð_šÚüj0‰ui"?!>øRçøÿ¾;ìz–èQŽÉñuÁä{à•Þ<ù! ÏBR]Ï@ož”CžºWÄÕˆìÛ& n™|‘¶øÙªJ:ÍMH0†êí«6×Ü´“'š®¥äü“l™PÈs¼L³wì®ýsßî¢Yõqa¹Ìô«¦D­ô.hG`è—F›*=­²bpñº™‘øRr’ùñö:Ãl0_ú2˜B¾ÆpÝAæ®p¥ ‚_tR*…þÊÚ{oGIøõì#¯/GC^o¸Õ”|w‘âvõ,Ô;ñeê±7a|?Žæµ¯?ü bmÕ¨?Fwó¾ þÑ_}ç&ò½ç¼ä)ГkX "ç×l4H;ùÍ[³²ž½Râà£írÐN5ƒã{µ >_°1Žœ"ûqÜ~Ë®DÕ=ËBêceY­rˆÏ9çöÞ:üìÆ_Œyò K¹äVJýUÞz’_§­©½4 yÁæšõЩ|~×@OCK?D^t¥Ô?èØ^%ùε%,¯k î˜[^­ öâúNäËu¸â¦Ë ¡1•\–t®(ôeò [:Ã+=¥ð©ë&ÝýeÈ:• ú÷_À¸Þäø;sÒåÆÔžëtFb:?Å u±]Î:&ðwG6‡O½\æãDüœOïQ~1!¨›—N>º Ü_WÀ:–ÓnÒ!޳ÔgJ’}|ޤ-Ÿ˜ ú“ÈÖ#ñ,]ëÜS¨+œƒŽˆ°®¥êÞ˜U5’:õx[Ë„"äÝ‘Uße¾’ù‚˜7I0n´Ó¯ !o äMøûÝpvË\ˆ“–[«†E€Û­žÛ²ÚG[÷`¡ø}þ'¬9¼dž˜_C*ò»#îÁßÍ!ÿÛj½S=؃úÅ /H|\è§"LæM“Æü)°Ç±©P|`– ùÈÈj¿×c®ßádŸÛ<ñ÷¼ºà¾ª›ÙÈÔ6\ý’æ¨9HÖÇúnI%ß¿&¿r«©6€q¥­¯ì?ey®í´Ð8³X¶꬗Û$޵弸üyÌ­ok:Oƒ]ÆQ^½â̵soßC¾^#™Nô…–×uÚœS¢¹9/^¡t•ì[×|EêΗüúäRÔ2Ÿç¹Ä¬Áü»—nÉÒͧ€³×ñ&û(ê¯Ï"çÓ®Vøâ»•NκÂ#y‡sAø»R°£°';x¿ý²[k:Êfíû”fò"hí4ø÷wN_8?ƒ¿}¶d×9²_p@Áå]"`obQ¹$ðXÚýf<'[ÝÆõP¾ÒdØòõÁï÷F|á ývôê×}Ñç¹p÷ˆgl¼Á?Ñ4¯>"ù¸cô°n=ýŸÜÔuÉòA\V¸Ó?ðõæ•Aà"¦¦üà>fÞû{®“ç˜x*£Qñ´|ÐÅ žs³¾äKˆ‹^ß¶n½6Xþç"YÏïpnpWÔW6ƼŸ^Aœ:ìP²üôE…ù~NÐÇí+|›AoÒÆâÛÅ‚ ®×~<ÏIÖ/hzËè½Ú-æÉ%õ×d·ÑôSê…Û¯h`/=šYͪ3Üü²–ÉC=Öó<,šè÷s»‡Ä÷åÌì%ó2ko%õBœpzíÓ|øß{2šc¶©áä£QŽQ:ä½nœ Çð=Èo½[ø§…P &;-I ¢§ÎŠ¿“ý½MdkÅ!Ç–ùs{’÷˜Ï¸Š(õaÅ*A’¯Gí9ßuI€×¡º ä=öN'ýy úŠ_[{ô³¤Ë“ïÄâ}ï%ºoûUôyxê; Qx>ÏÌÞXp@uÃyÕedÿ¹¤éòäx~ßMIçwÂ8Dõ¾PÞúíº7ó8äßuÝÓWÙ Þ3j*o?È©£Ó²Ÿ{½-}~—ÿ¦ùþ'ÏU)Åê9E›×"FöÕw>gÇ7~¢¨i³¥¨Qd}r]'ôO6wwý»vŠÁ=Gé"ùå*ßûŒ³úU§šè´œ9¼GŠÕvŒ+PŒªÉÇÉû¹’K}zèŒì)Ÿ/(F¶É’Wï9}cQ-…¼zÞͯÒCp¿~}×÷à— …Bè:Ã}$KŸúÒiN ¯-äuÀÝ9Ýõ1íDîò2ðCkMJ”@/ì¿K¬]y¢F¶ 'Ù7cã"\ÏV±nuZí?^“÷a%äK©´` ï¥k‡üféóå&®óbÜŒ2nÿ/ ®Aþ”·ƒ/ô&ø9¿Ëê®Rê“«/¼#ß±Uí-™·#N«\#óÚf7ø­\}ņë§.œÕßz5lª-Dæee¸ß@^’å¡W¬ úþêd¢õZ’Oo;“3AÑĚŒ÷n—n±&µi0Jý”x»éŒS æPWCÁïT½Ò¯ß˜âñŒq橱mT=£²GêK.¶ö0=@Æ9óŒgiV5¥~-ñê߸u®®;ÿ0N£3ÏmæÊ‚¼ÊóeàYðV‚ÔÁøqìr'uQN§Þ¹².U] êZÖ´ºßm ðcÚm2‹/RêŸsÆ_“ùÁSG>û}zþ\F\äø—sî»gͧÓòþ îZD©ÿ°¿ãHÖwû —¦ÛC܉ Êá |u™ÅÖ--àÇ-ŽfÓ)õŸŸ­TÉ|JÚŸÌ@¦_PŸù¬(I#ã–°»´©‰ªÿì­72ËNÓódãÆˆ}=1h…|1ImÔ[Œ®6âžTÝL¥X‰ þ•çiËAn|sVio9øŸŸ?ïA]b¢_XvÔ¢|’¬K-ß/Oêºà³àWWed^ ý ý[è_=ë<F‰@è«:Ãꓺ™ø­3WvÝ·púÇñCN´óú8)âï]ºŸHû8úÔ€q 8»e™^‚^ÙäèöfiPu¿¾Iä’¸_!ÁFg¤ê÷ C=3Ù?~Cþ[´!ôËG®ëü$^æë ÒßKò·ñ5BÏ ²×-Þ㫚Èò£Ÿ|/3$fFâþ±Åë¹×8.>ôN£pÎÌ3:9ßax¸‡ýRº‰¬ßJù¹×7ì+TÏ#‡òS/N÷2/éJy B¿|¿XëLâ}©˜Äh ÔÍ~¿¶¾†ñØÌàH¾£¶N÷Î1êú7bkÓŽWP “õ±5ÿBmû]Á3ùÔt,¿.RqBýßýÀ>¢$ÁR$Øø·Cþãþq3Ãò9ëéî2O3W:çd©O¤Ê-D)šÒzâˆ!²ìã¹ð<Öœ„Ê<)õ6ÙäWdž˜>6§ xìFö@ÙÌNIcà0Ô}ž,ÍiÏ7A^b§û7/ ºÛ¦@ˆÈ±<ôž#èô%?Y¨7|ßË )õOmM¿H¿‹I÷œ†ûJû^8íôÜjJ¯ƒxj*Ô®~{Gæòj~ˆöK5ɾê7ÊŸ†qïb•%¯…Õ{}6^ÿWVRŒüVVUÖ:¸rÆÁø(¨}  õ@`ˆ¦*ÉS˜XâºIý#·Qì,ˆÙvgM#<ðæ¬ýà‡,#;&KëÁo»ÎDÖo—ö; q;ïÙâ1È÷39öXB¾¨ývµÜrr3W œ)6‡xõ±§ø"Ü×)7®²žß¨‘£Â úg1‡ÌÛg —zVA>Á1,uê2+q¶SðœÆNôµÁo0Y¼7%ëËÍ>ùkƒ?9æe#¼iîëÛw†œCè¶¡‘âÓ¼Œm±ä½þ¾s‹Àö®¿O‹Ÿ{Æi⓵Üà8Uײd ùêƒvò›¸Cg2ÅÈ=Ôùõ;Œ¯™áõ¤ƒM”±Dï:ôãO-[å›p?Z2ûwM2_º4Ê· êàÝNUÙ/˜©|=ãÈQn%ûïu#ØÍ95r^»mîU7CòóÞhkä—,wD2ÉzãtÁo50~AåURPÏdwlôo†ö†©ØUü ÔëZÕ“þË‹=æ@Þ§D–!ûùúyç^è†ø¿K]PþŒGgí—įEžø¸êôkÙ¯±à÷£-÷WGõR´CSóîr€žöÝ=¼ŒÄs·bƒ.}G°;csÎŽ`?¥ßÎiCܶk¥i»€þ´|ß½œ´ÿ໎ÛÈ>i†›¡]ëTš“UwkZµ¶žø5ÿ³'Å·ÓiW¶HW@ÿÆ/O`ׇv.볕¬~˜oHæ5Âø¹È{h¿Î’=±çïµå.à½Úã¹Á“ÌˆŽ— ‡?!› õ‘jèÁаz²ÔàÇÂ{ã`¯@AÈí(ø9MîWth$<ê!õQ×é}5Ô—Ù¦à—ô;0˜›(õ÷ëK‘q;Êgºtà-ÅÐjZ«×õoÜ“ŒÁBÈ›¼ˆŒžø§'ÇšW/V‡¼8äCâ²ȃ˜²‡(ò¼îw}õwä<æ±ÌŸd>4Æ‚Úb{â›4;?Ø-zl‘rk9ÅX^œ)ýôtä‚ô(±$•ý ŠÈ:°Ê·QP†ûw \zE1VáHÈïX=j!ÖÛÁ–½s–¾gÖl_¿™ôÚ˜»g=èƒ×Ú]п¦ÑÇûÖƒ°køHÖïæŠeNõ .RÌÁd?ΨÞnò~Ü“kŽxñ¬÷æûX>¥¾…xéÜSté7Ø›O½mê.øy¿pEÆhß+ï[Š$N:®–¶ÆüÕü U½PG;ŤÉeýd6ˆ¬ÿÂyz„œë©W¤GöûÙ=×à*9§)òZm Ù·Ê,k;ÔGŸ=èe佌­Msû+èßÀbϪZ¡¬§m qUA³ëå>ȯž<9Öa„amMw†¼Ñ^ê|L<ÙçE¥ÊDêW-Qÿu¨ß>1©¸“s!ãìwK>ƒq˜ë^J¾sŠ—5}:O žïùü£ Wƒ¹iñh/š»ô8п¾‘ü›·ÔUz´ƒöGf-ŒWÝ·¾,kòÅãÑѤ/àG÷üâö^ ã¼6;ëëjhŸÑy+IèçÇ·ž’ÕåŒèœ>ŸÇ0¾1õÁ)dŸ¾³å`[îzò,;Ÿ6¾GÎUJ~Ã=Ý)~¨7ß÷ 豿ï“Ò}О½“S?%¨º·4|É~ОOS -À®]·NO]:jeý;n²¯ÎñšÅÓð¼ýéK‰¿¢¹\®¾>únýÃ@ü¢©ý‚€27¥`rnýµ‹ü§hÁ‘îw*ÁO™\ÞpÆÉÿR ÏyÈ3u¦“7sSêד҈ž†q(”¿„:Ð{aw¬ˆù.ØãO ø?¹’À•³Ï³¾Ën™GæËŒdx Éû–‘)Ð×ò(‘Åp_±H¡¹âdñzå}=C¨×&yÃ;@Oì›§:à*Óåõ4þ]ÎSü"y.«WÂûÆAÏýê­ë~ÙA»k¾íPv;¿[ïÈñ†M}¥ÉcÝVOÞ!ó f†SµdÞÜfŸ›é ÇÝO—e}ùK×-V®‚ûÙ~zÐß×è¯"zîlÃêô­ÏƇI¤ UqÂï—®-L>וšÜ…P|?ên‚_¯œz]¼ ÚÉüMþØo/'Óß}žçgv{“zkÅ¥ Gˆ{άÁ‰äœ-WC™ÐÛUÆLkæÃý’íºßJA]¿I;èEä5®ý¢iëɺµ±Â÷hÅ-0ñÊ|8ï "Ô' q1,? ïH4ê÷p¿Ç⹚9–¢q½üª  rc[SëW-{Ì£E¾ïð:Ý¢x î5!Z;u‡¢m¨;¼p€Ì«s4œèN£ü’¹8 ^šzAÆ“Ÿ§ZÚkì°äꌞ?m ýžêUúµYĶ“ìƒç²„-ý7ÄÇD]Á®ðõÙ\ÈòÏ7­‡zÔ½¶¨£üå¶[  GÊ{]¯‚œ¤çC#Yä<·,éä¬h'¹ç U)šCÉÄšBJ}¨ÚgÙ®hiG{‚1VÌ÷‹ý >vÄãžê[3Š!ó~‘09e½ÍŒ Ù'-íN§öTä[_äêï@{Å&¶Ý%z²*YqG1\eoýLÚJü¸dSÅH ú½räãfe >¦È;KUÁsè›G$^†v&äé˜ÿꇼHí.3êïl•rà<&†Ÿ0ÿàs·ä$ë* ÖÜ¡3L„/;9i÷}´WVãM¡Ì©ã;Äýñž¼ d?÷xv…¸{Ðßž'Œh«)FºÀóëç ŸvZÿ¾ÆE"EW«Úyéùµ—¢ç(F­i¥w âñÚK É{!O}¾~žÕ1¨STÈr†íDó€-Øi¸{£9Äè©$Án_ˆ—›]ÎØÁsðý¾Âu2íhưbr0øG÷…î0ÎÙWÕÊ·KR4˯s÷ÁsÊ^R"ylYʛàçi;w;õWB>b¶½îï¼Ë^ìèŸ*ëåGÐþ§©ÀŸ…º ¾É‰'çiŠŸ]Õv³3×d†|殮cÖAæ}íw;A^ï|WÙž|_aÕ}mXÛž_‚G î#!æ*0ä.»ÏìÜúpß½Ài>Åp­ñò»µ*Ÿžc~[i›J29·=ãSÿ£TNˆo÷®æ§Ý6ïÔ9[}ϸàªS#º`Øu1ë^ÇyÒÐþûaN Ïrr•'Øû0󪋳ÎÕLûØo' õ¬­U”î%è—Ð/÷’¤í(†¦ËË•Ðoë—iew¬¸x¦ ôToC ñÿÇŒÛ Aoí´K‚\ÙŒKÈi)Eß-ÉûòO’í3$nå¦îj¿äõ³WYyU7 AÿJ¾‡òÙo½î>´Óe¡¿øè;ƒÌŸƒŸèMø­v —eÃKâ‡Jè])kà=¸ÝЇûØŠšo‘ƒxâšþèæ<+q¶êècèWß[¿µCÝtä~ã9¨W­tolS†ñ±½I3ñ…~+±ë&ßKh§oæ=qÞeð‡ßèø‚+ç•ÖAœ‘_H¾ƒá’Ê~ÿ†Ì#Í­K„|4øNsèIˆÿ&Y†Þ“ÐÞîqäûeê~’!ØyRO•H[øûôCAþðó¾Ôâ&¸Ð‘Ö©¤ý9‚åjp õ±<íÚý‚“ä½½’#/ÀؼÖ.%ûÌÑÞ5„†çIéú^¬hñÌ@¼›N¾Nî¤áœdt¶4””¢àšIáJr-ûHÿ{= )õßk²^? _¾ùsŠxCþ\;òk‘¯ˆF¾’¬©"×7ÈWÉ"_†|ÕKäÏ7¡üêeÈW!_ýùIä/ˆ£ü >È_xˆüEä/z"_ë†òkï IùKÎÈ_b ù&Ê¿Âü{ä¯\Cþ*òרPþ5Kä¯]Dþúä¯Dþ†)Ê¿Q‰ü͹Èß4Bþæ9äo•¡ü[SÈ×é#_WŠ|ÝòŒ1”_¯‡|}!òõÃÈßÖAþŽÊ¿“‹üAäïj"7ù{Y(ÿÞgäïoBþ~:ò÷?!ÿ å?TAþaò;‘¤„|ƒÊoˆA¾á-ò呉ü“p”ÿäò2È7†"ßøù§ÏPþ3)äŸ ÿì òÏ%oEùM^È7ÝGþÅbä_¸#ßì‚ò›ë‘ÉüKGä_ÞBþÕu”ÿšù×¶È¿¾‚ü›…È·°¢üsä[jo|«òmÆ(¿­ù·òo ‘{ùöÓ(¿}ùŽ=Èw” ßñ ùw#(ÿ½.òï ?„|çvä»¶¢ü®ä»ÿ ü‡£Èwg üî^ä{T‘ïIE¾§ù](ÿ“2òŸÿôùÞuÈ÷­Aù}QÈ÷µ"ÿy5òŸéÈ Cù_š‘ï—F¾?ùþçÈmDù’Èø!?Ѐü71ä— üAäï!ÿ]ùï®ÈÿpBù?êÿÉ‹üÏCÈÿ¼üÐU”?ÌŽü°5ò×aC~”å@~ô<òcó3Aþ×~”ÿ«ù_ÓÈ ?~ù‰S(bùÉ]ÈOžD~rùßÃ(Jù©<ä§~ ÿgòÓ[Pþt6òÓýÈϨ#?“ù—A¥iàõã_þÅœ^“­ðúá/ÿbîû¿ò_0)"χKò –!¿ ùO‘g}ŒòÙÄ‘góAží!ò EgFùìnȳßAžCygä9Q>çM乸‘ç²GžëòÜ—Q>ÏBäy,‘繈<ïäù˜Q>Ÿ)ò|UÈóÏEžßùEûPþ¢2äM!/°yRä‹Q¾àòBzÈ "/4‚¼ðO”¿X ùŹÈ/D~‰&ò"4”/’…¼ÈgäE7!/šŽ¼X ÊëF^\yñ$äÅ;‘—x‡ò%—ŒA^ò-òRòÈ/]…ò—Ò‘_ú ùe2È/ E~ùa”¿üòÒK‘—@^ú ò+¡|Qäe¼—y€üÊÅÈË ¢|Yäeë‘_Åü*'äW; üÕב—ãD^Îy¹+ÈË×¢|<®æÈ¯©A~í|ä˜P¾‚1ò ȯ£_gˆŽ¼÷ ò>_Q¾/ yß,ä}?#ï·yU”¼7ò*È$!òß!¤€|P òAo‘?Ü‚òƒW!LG>øò!2ȇJ£üÐÃȇ>C>l)òaȇû¢üðäé¢ÈÓ½§?@>â.ÊD>ÒùÈz䣸‘æAùÑÈG_G>† ù[äc­P~l-òq¬ÈÇ™#wùøó(? ùcä*O¤Oüƒò“ O:|Ò$òGö Ÿ¼å'!Ÿ<Š|Š.ò)ȧæ¡üÔïȧmE>íòiȧAùêÈgd ŸÑ‹|¦òYP~Öä³> Tù£ ÈgÇ¢üìväsÖ Ÿ|N+òÇ^£üÜ•Èç†!ŸÛŒüñÈç-CùyÈç5"Ÿ/‰|¾òÞ(¿à!ò'– Âù÷/¼ò‹!_äŒ|Qò'y‘/æFùÅvÈ_E¾„ùkäOY üS‘/eA¾ôò¥ÕÈŸ®Dùgæ Æù3åÈŸ™F¾ì7Ê?«üÙSÈŸ@¾|òçv üs'?7Œ|…6òùÈWæ¢üÊoÈWmA¾*ùª~äÏ÷¡üêMÈW§!_ýùšÈ_Xò/$"¡ù‹ŠÈ_ŒC¾6å×¶!IùK‘È_zƒüå—(ÿŠ òWB¿Ò„üÕåÈ_“Bù×ü‘¿öùëâÈ_÷Aþ†'Ê¿qù›ÂÈßtGþæäo1P~òuŽÈ×ÝDžÁƒ|='ʯ·A¾þ2ò·"Ûù;Qþäï2#×ù»UÈß;‡òïÍ ßùûeÈߟBþÁ$ʸù‡ÅÈ?ü…ü#=ätP~Cò ?‘¬…üããÈ?ÉAùO¾"O–Dÿ½f!ßøù§ŸPþ3U䟥 ÿ¬ùç*È7)¡ü¦xä›Þ!ÿBù±È7G¡üæä_®Bþ%ù—¯õå¿–Fþõaä_?CþÍRä[$P~‹/ò- È·Š"ßê…|›Êo»‹ü[Aäߺ"ÿ¶ùö[(¿ƒùä;®#ÿŽ ù÷ì(ÿ½òï/!ßÉŠ|§9ò]f(¿ë<ò˜ÿ`‚ü‡ ä»Ï¢üî?È÷ ßsùžßÈGùŸv"ÿ©ùO£È÷ê"ß·å÷å!ß÷ùÏ[‘ÿ| ù/GQþ—/È÷«#ߟ|/ò_?¢ü ÈA~àòß”‘\‡òãlGþûä¿G#ÿ#åÿxüOYä†!ÿ³ù¡ç(xòÃÈ?E~DùQ1”?êüèCäÇ– ?æ‰ü/7”ÿë6òã‹wF~¼ù‰(’ùI;ä'¯"ÿ›ù)6”?eüÔEäÿ° ÿçòÓ¦(ºù™9ÈÏ!?Sþ—o¦ÎáõïNÛ[šçè[áõT=^'þòÍsÇþÊofÚ{o'{‰=6Îö¶¾ÿñgv¶~nðÔÖäEØü¹”¡Ÿ½Äkw‰uk%TT•6¨**Áÿ¯Ý(a$áçcïMŠ%r»…35÷µÕ£ÜÿÈâimëb}Èþ?nöü}ýù÷¿ÿk~ËÙÅ8fPortfolio/data/SMALLCAP.rda0000644000176200001440000002502011645005054015171 0ustar liggesusers‹ízù?•ß×÷1ÏóŠ’L¡”¬m e*¥$2 D’($TEÒ cR”ʦ33Ïùæþt?÷ç¹ÿ„ç‡ë¼×^{­µ×µÏÞkx½®#öjìöì †CÏFûe ‘Œô´: †—ÆÀ°5×=tH_×CÇÀÁ0ÉAp†ca¢ ð)n²ŸÙa¶j ú¬ÐcÀþ´Šw| DÖs~ì‰~@´[­cêú$Ó®—¯g¬€Ä|‡º«?(ý™ßâ¼ç€r¼ÚYì\P\4¢åmöåúíJæåU ¬âÚ{ª*“ÂÖ23 ²&3ç¬3Âü¿ù7—ï¥}äM$ž¨{ÃÍž‡Å»¥ÆR-ˆºMáÂ5@âzIâf¹”7[òà!X¸tiÚw?,˜¿ÝÙárH_Ærö+iéì×iÕ'äÓ?I•fJ­‹È½–Ç@½Ã*W3#ÔÁ==±¶@½’̦`”MšÁǿίky1ˆŠ…¾Ë±V@¡7ýè•° ˆåíÅÇéo1F² òK Ìß½)ó’¬…{ÑýrÀ“>©d½8·Ój>{UÌÄÞu°à/ΣÞnüó¦µÝòx ôY§÷.àÚOí½#BÂ׈q^6P[Å(ëi0ßùµZc‡8ÌKÐoÿ°‹›”ôx^Y¼fï“_¶ÂâǧއÀÒ„Çý¢’ã°t#ê•|=P×~âÅVéu°ÍÏ×ï€ü¼ò½é9G †”î%½žœ­ç=ö6]ÀÝ[oÅÐüU ŽEš†nùgq»àFše®…=üîó›”ð?_“Þ9ûŠð‰½Zö÷þ»ÇùÜÖ-€¯};fÆmøßR[/q­~™óæƒf@p3¯pÕØ„c¸ûœGT€`z5®ÂSðŸwŽÝöÓ.;.‹ F”wæÉ!1=éA)z*¤ÞÐöWbìû>7 jž9Þ(¿m÷ž±Ê{ÂB¹s¯Lî’xÞ!Í¥š^g7nºyû¦LበgÃÃ=@¸óÛ䦵^Üve^¤É¹á„‰-iv@È•3ÏØMócßDJSûWÀ¯h„„w¾Rèýו œ§ž›£·Â‡}¦™Z@äà|3c D‡ó»C¥iþ™”&þºÄÎ6–×ð ˆd¥Í¢I[d4èÊÒHêäïqÏ5€-ùùöå‡@Ê)c¾+ÈÍõ}¬G €Â”a|_A(š>¶£@qt ß•ßä…zº¨L œ®iÌÛ…ÙçkÊ@ùaÖ3ªÔ¤o ß=hÿ£IÉð [Ú9yà[T·ê^Ÿ-@UªèÏRž¢I÷iÍ­Àŵ’Tçð0ýzÆ9('fY"Æ$,/ÁôìÏc ö0kâüZÿU&à=\[âY?ÀœW·(ÆfGÄÒta|P:ì‰ü;UÙ£rì<ÆDì…b¿4Á˜Áëçµr{`ÚýÀ + e˜eš°<_Óªý¤;aº?¬¤ÞÌfWÒEw[ªVáÁÂ=¶v˜xÛ#³wËL~v<âp &|‚}lü»T­òz+`±–Â÷ œaâ€]îÓvËîÄü$ü„ßÈu÷.c½ñ©ñ#Y0yK òŽÏ˜šJ#'ÒEÀTV½ì2L_O~Þ²ö¦&žÈüÄÂTîjùœÌÈ·ÞLÖáC½cêµ!˜†_º2k`ÔûZõaÞ0¯ë Ì&¯ö‹›ß ®/­…ã`ÂäÅ€å‘m0¶’«…5‚qAó»=ÁÎ0n‘Ay•’ S—õ ŸÑÖÀá{¹ïæöý¬¿aߤÿe'¢¸N“¸…˜Œ™2)¶ˆ‘gï¶Å®8ÄXû줿 Ñýj¯­¯ ëNœõõ½d®æIMX‘Uümê+—¯Íé¿Ø‚èO~ýôÄùbúxy—…ˆ6Lŧ5j\“ƒ)9#çÉ0îç3þ"ûŒ+ðâXKSþâh¬rUÍ_óÔ¶ª*˜Àê¿ðl¢¾ÊvÌÏü ¤ÅLôYÅpû{ò÷˜| mnóë ŒÒȉýõ1 ˜f0zf‹#ºìso•w!Ì™Áà‹é§aåÑžï¯a©ýöVÜC°¸3.{sËT³…€dMWV×pHã:Û è]ÿ"…[ÿ,_“Çõ RŒä‚'ùg‚p=»`‘ý˜ïå!®¿¸Òò\±ØEÑÕV­‡p/#M}1öZˆóö·£ïG•:Alr –ߣÞéŠFBï~“Ózy‘twZÒí´W˜%o\§iHW)¾n”õZÒT²sÊËg­Ø€y¤³í7ÖZW!™Ì͉u%ȼöšZ••+rH³µêÜ„l¯â˜ x$Õ.†1§T„lb×é«2!ÛРw­yÅ„ÐOåÈ$d¥«}KÈÙ×*ì-FÇ_Tôðˆ£#–W}ç~"3ærl}ØidâÐ9®fÑŒò̆e?iD¦¡JýD®sÈô™] ‰cYx2Ü#ÚÁ">7)† ð"õf=À凴¼èo†ÙîýïI´¸v=EL]!žöÿíš«¾ò ¨ï1Zþ†°öz€>ó,2g>I9Kb.ÅÃêv@åè0“)—ŠôÙe³ï=´x)j {è&…Ö›D&eæ.ÿIy!Xüšº{]ßÔæ>æª/ù¨«Ïܱc€ 4i©†‰ØDnÉ;@¦s}d¥Û\Ñ{@xÊ>µþf'P^±ÛèNíƒ9Ó3ýÖr†»øaZ'–.Ÿ7`σ•ÆK×}Ê`i­ý³¶ÀŠVŒ³½U¬-â-)ìGt Ú…+Ò°†$:‰OÃŽÑ&G„ù颪2ñ2Xþ:ìפ!ëBË:6µ#º9fD|žˆèŠ˜Ïš;è!ŒMåÅ»õÛ}ÆqjòL¢ßö±A©¿VëV³EÕ#:eJ1§ìv„qÍNL¸8+[®é­mA>¹ž÷8ÄÈ`ûì'›)bpdÂ|ïEL–ê·Cp·³þ¹íi9b­ó"d¹X/.L;¬é!¦ê=sªú]ˆ™åKˆ¥Ëıp®Clљ河*AL:ÓÉ•† ˆYU'ã:é9bÕ¸ž`»ÝfýËêØ§U#·I³ænjY; ËÂܾ€ˆ±_ ˆæ<‘Øxà S¥ & æ0ßûdzˆP¤‘g $]¾Ó©L@â¼Éc†j%ç ûçÚ~¾vt!‹ßë/°_…¥¸BÙBŸ˜/Îx' ÃTi\ÐÍ;œ@¨c½$| HÉ·’l{YóiªV­~ë3 ;û ˆˆŸëYK PZøjõ°Nw2Øä„¬$ÛGXSà çÙ¼¥¤‹F7EivïÝ|ç3>æ³GfÉÿecç¬.,c{U„x€rûöý£žœ@òfU‘•¨ÂEò³ç[§¨ &AÎ Óògøê˵퀧oèp-þ sIÞûÉc`6¾AÂáºÌî4ù}Òfkt%µ¬†`Î7ëI?3ñþweÈ´<­öôÀ®d=Ú9ÍÚ·Oµ¦GnÝTL‚¹-äW~½20¶õ¡Ú&M˜f XËäƒY¥„®ã³0Öôe ¼p†yçÞ.þæ7%Ç:€Ç L¨XÐê\Ó”×Q®¾0otuœ¯^š¿”NRšo£ó9 “ÝÌ®&Ã’ Ä8«Ë1X ü–MwV×'‡š¨Û9GìÇ©{@Ê–¶T&­Î=²ÿl{ Â38e>Þ<þEÉ€^>à¿ÿûAü©E÷8)ÀÏìØ¶:¿øù{,ÚK´:¦fÛ™Ga0·>Pz÷ÚÌŒ`Ì^ªÏžÕ]¤ÒÎpE_ëmÏ¡‡LXß^õ¢ 35ˆl–QSµ´¸ž²,•áCóƒó܉𛣀ç×ÈË6ó€9‘éñíì0{®³úR`–ÇߥÚÀäCÍ®V-˜¼=Éjúº°ÇŸÉE½…Lûq­ÇY0;¡_ A¬ñµ¶sû`òWøÍûê—aœ¯óY4×EÆ;˜¾;£Gâl‚ñŸY§×da*Qè×­ÿp{DלÄØãŠŠ²¡0/_^®D_‹)-¬ª´ú~*µR§ÀaY‚¼~":ÃK-i9ˆ•l-4–̆xÛ%f¥GN!¾dÏÚ'bIH0 ›˜ÇŠ„Üf\çÝë°D†19 ‰“òCØäl‰ó™«or¢â~«ŽHy³?†•üÕŸ? 95-‚”~ßs^¶éGJ·­õŸ96!5±Žé¢OÑÉxN61CZÓÞñìUBÕ‘[³¤úÅ7'fý é¦: äÝ! ½+,ø*d Ý¿³!gÝß*©Šô=\™D ýþ‡¡ÌýCÈW“¹©íî‹pRW@Æs⌠‘±óÀѰm†Hß$£Ä×› i?Éa~fŠŒ­ÂMçï¢}ýò–ÆÌÖòÙG‡’—‘æ¹Ò¥Ñü"´§7ñ¬ˆ‰ ²4$…ó8"«½w T¯( #M?즑ýúbË»‘hd·Æ­û†ˆœNêðÜ[C§ÂJ[ŠM2Ññ üŽG/ §¯¾Tl¾!§˜Óº­O"Ð鮌Ÿ¿C=SÒÁI«Ï“è8×I¥Öx:dýyÑïËÏ`ä¨çHHó+B;äLß©¡“rŠ…òƒÒ0'h®õ‘Y_â\¿Ö>/îv°«+à?½ÖAµ@’4K¹ ¤°‰ü×¼€L»|‰ùƈ°>íÜP¶øÀ4KP*½»TŽmò¤Ö•ƒ¤5 Lš€l×*ùòEP ¨Åµ 0Ï–ƒ êòŠüó¨Æ[@–)-Ã>U’Mûò#Ù½0;Ê8™Dócr´c9Ëa àÒëR¶ˆ¾B•âKª—,-[– ‰™Ä4œ·ùP¬f<:ÒØ-•¡W·øÜ_*»—®÷RŽ*SÄÕý>ü‚å’½ºeö°Æ'~â…‰;,ñä½9 Ë?ýzì›ýa1üóç×2a°Ì‚ãåËÌ‚5.û·Ý·`1lkÍ¢lƒÛL8`åJ© o±5,3'½,‰T€åòС0> X]/ Ó“‡sC©ÑÎϰ„ 0ô‚•‘À€Wm°Ê¯zˆ‹Æ_ÖéÎ^YAi¹áËM{ÝÀÚ¾ûq°îZèŸí`Œ0.ؼñÁ „áRÄ]ºík}kw­‹Ý`Ïï÷ÃåˆN¦ù‰VÔ)D^E¯ä`íp%ç$2DõŽï=v#ŒStVâuDO¼ÆóÖG€¶ã‚r@æÕŒι¤òrl™{zêeíŠæK•f´þ½ÿ•xEPÛÚ|Bw˱ŽjÔ7‘¿c’iùî…n/[$-oÙr@ß('HqUê%@Hf’‹H¦Ù(ÝÌS”–<Œ‡lµ¬€˜½é ïgørþÓvË0××…u÷yøö¯º:ëW`rL].¡-p8zŸ±q@Œ—Q|à ¤Œó;Y/Œ!ݴׯá<ìʾ•´âÌqî>a «Æi`yæaž«_>Ë»H‡‰Åa­Ì@ݱºþn P{¤rîdÐÎ]Fm]!-¯‡±=5§ÅIž—U„øf HüŽÌZXüºÒæ/ƒ½@Œ”ââ{¾ˆ…jQ?ú(@ñU”Ý* „FbÎdaØŽ½þ"™G«#½½&Ðòòuõ­œž­@¸ÇÕ(®F‚õ«ë~m'aîe¿Žî/ ÌP™Î|Øt¦^(ž)›˜üñ]Ÿe¼ac³5{¤€ÖGZLòÃì§T¦×p.‘ 1wXaÖ§c!âô˜*_–aÝú ¦2·=|TícZÂ2*0~xŸ éYÀò4?zw fËVÔõʦüÐYÀ+ú,ôG}áDàÏhwœ=ö ù,§·Ø.5*…‡?ÃjLde£å`uó•”Å6X×Å”Y}ÌØ´˜ «/:™2Íú`-È„0¬ü¢òànXÀúf±΋rˆ®ƒ¼ãp° bMm©\DŒÌ s‰»C]¯TpÈÄh0ÂkK\R¦Z§…’ý6ªå%íÞ_Nfxâ‡0{%Eõ$Ɉž÷l ‡bØ”®Ã­«k§.Š£Òƒ°ò³T'ØIVŸ‘föDôÕc×uÎÓÖ©h›§GŒÕZ;.•u æGÖ-Ÿ_s#æçEӹሹÃx¸ê¾bI?,âí¤€8µJ÷çÒßE\–"üZGWò‰òøhÄ#¿YN_0 ôÏ:”¢‚DŽÍR‡lF‘È÷wYsJHº·öqB™’ ï>#݃ä¿íëKDÛ.S†.Ø1¡í¡U©§3èбꅥî$-5ÕÆÑñÉZcñs'$ÅÝþ¾{(‰Jÿ¬Þ€$«£Ýgz0HLÆ!Ñ¥r/Ú´“¥áùÊ!$Æ.>¨óè${ûãÒÍú $\²Ì{’‰Ý`·?Ÿz‰~põ¸ž‡$27©ÞÀbaV:P©@4æ>ÝuŸ£Ý^n–BÊ. ìòßeÑj„¶C"'D|€Tå.¹:SdG•±'¢´:Hð%©‹æmdåhÊGãòYf ˜O—ÿöŠ‹é^ÜÍûYaAà¸ö»Æn˜çmX½®œÔKñgK¶^*g±©ø•  FGo‹êô÷ëñ¯hq÷ÈFÇ:I šùíWV"Uâ(þ©iõ:f§,hùBíÚ *Ÿ-žW$òÕ"€Ñ.ú( 丱ër¹nTðÊ“Ë\€¿¾&léÊ øÖßE·%ÐòΣÞÐÝ™@ðºÑ_Ky „qÏ;$hýßN÷‚FŸaîÎìÔs»K0Õ[üp˳T˜~t¡ìáK.˜xþ¶ÏqD †½LB#‡^ÀD‚mÜÝ“ 0féØæç“’¦üÃ90ñˆª–W„JÍéã×€7æHOªÍiÞÆœD#Q˜â®»µçØW˜ ­O? Š…)‡Ó¼6‘`V{_ÖëÀÑÄï47†YÒ¶ 058ú³fÂf …—ìa®.¢à‚*+Ìó¨–c—‡ÅÛ·î‰ôzÁÒÙ_)•ƒë°p+1@üö6X|mî¥Ü‹»ËÓšÜ]0ñîp¾äq qL[´lßd+ö§¼Ï£tôÌÁ) \ŠïTœ}Ô¡Ó Üv°XóÙË&‡Öl²°ÂÝâ°:Æ=¼÷ã<¬*¸ÙX;§Ã 9õ&õé XÌÍ-«þ‹K¦wÙÎÂrË­OU›a)ëøÌz,ß¡?«@»ç±$6|/¬Kê<Û„Ë€åu½M>0ÿÎ)(n×[X`™¿°ÞÖ Žn£Íݰ°ÝwïÉÇR@ßÓ±tw=aéc®‚yCöB)º_@>NyýU1,luÀFÕ:GÒgŧ$êô–xŠÁñŽƒyåÌŸTNåžzM_X*~fªqæEDÏ ^è#Hq.·ÓÔ¨Ø.øm÷n x,º[ðûÑò1®ä$Œ¾+}ÒBÚzú¯w´~o€ç¾oæXÐí]ĹÖñT‹Ü¶ÀJ È²·¤”5‰}ç¾à5˜¿ƒUàW‚…:¦ 4Z\\:è|âÅ1XbÎUÃÝù 騝LAX´®”Põ à ‹Œ&ß^XþJIœ°°¸}bL¨–,ÆHnƒ†@ýüÎÝø¶éMeÃrB¬ÓÐÀXÓ¢|ö:OëN»PõÙ¿ˆç–3tÈœ´:¿’ôy˜{\4•lXøq ÷>ј]ó°øí¸ ¦ã¯ ~·Mìæl‘$Ù—€}º_ìÜŽ[0æÁ¯e|{3 —0Õcy`BúþX̘x…•|©Ìã’¾÷xÍ`ê7|ò¬5†9§ Óòß¾0zYDù[`r“]TZ`*¦Jú¡Š8™¿‡ ÂÇ÷®CKÖˆ¥[§\ØNñjq¾¡o;€˜fºù/ò#>OÁ½Îä Ä¥go%$j‡Øz„º8ô Îý¦Ó%³ˆÛ¡<·ìÜ=Äïæ¹Ûö„4tr¹yc¤ñ™úåW&#ÎA¢RcókÄÇõ&œoÞ ñVóm?Uû–&ÆK‰Íñí¼q.ñ}=ébdøµ[7¿n¡ ~ÒЩóyÄï7@4ñ‰BüO8}¿þx€„U“7Œ§"¡¾Ú³¶Ï ¡®©˜àã—D&ÖÿCh½>É®Œ„gŸÏìº%„DÞM­Û\iƒ)·xý@áEÀƇ Ñ]}ãE±Ê¹`ôüq Wñi˜•$×Ö}…‰pM'5î"ÀŠ^ú±G‚‰©ì½Ñ[axV¡UÑ· †}ñ.¶Ï"aìxÑö§>.0¼Ý«^ÿÛf 3y—¥ #Ô(ïE%˜ôëb¼ùp¦†^^Öz¿°v\®Ž×`®»}QF¦ìߎ´Þâ…Éf¡ä£õŸa|½-å#[`»ºÔý=ÁT¤u¼»g̹‡ä%í<ûü@ˆ?Ìi÷H|ß³ó1G¶Ùø':Kü­o˜tXc[>òªõ+,Eœ¹+w•æwdZ:ÀØ—ÖsXàr”NXà†Å‚cÄLXRpÈß7  ä¼¢…b]6˜oó …è6ÕÜ9ļ#{ZÁ‰V7TÝsó;‡ÏV—Pãê&–Ë‘¾ˆñH̳¾M.voî…ÄvÃv.¬ú3âIˆn£ÅeGӠÇÊþâä/É;\Q0ö欹 ¤ôGÛ:Íu†=WԅʵaüÄÁNãóW`üÅÎ]÷Š a|óæÊ k˜~xÎõ!¿1`ã\’¦{[`b·ç§8KvZþ®{›zË~Æ=£“ïéœ~ËZB8/w8W“€‚ij¾”¥®‰Cüj‘záê‘·^J”¯>–ß ÔÒƒÙ‚*%@ji÷}.fE«sñr5M@¸ÒɸÿY ç®Ì.ÂRýÏÕ³Mg`±þ)$K¨þš*Gm`¾VšÑàç[ -=xÐ÷MÈ:v‰_8©°8Yà'©~í/.ß Z÷ª9 ëÖÊL?†Ýa©qÇ‹‚Ð\X7ó~µ%Ö!dü,_“ãóêÇþ7j½<=Of†å/|¯Úgùa5ïªëšÖ0¬ÙQVï«BŒ.$Û÷ëlˆéùûV÷ Sˆ­NSã]£b‰AU?º;/éŠùrâT”—ø/ˆ8Ûžì¿r q¼¯`ÚîÇŒ¸¦™1æz€öK¿»ÍúDÕJQ Nu²ýR¤«—î1JBáG5ua `¤0'n¾“å S/'5c\Î1hH ÃXz(·‡/ÈÃY1î¿€Ô¹t(H’£o=)ävùàÖ8¹Kœ’„QÏr —0é«v¥H„߹½0FØnk-ÉÀ{LKℊ=’¶xèNÙæ¯;‡ÿ‹]w$ƒIlÐo¼Ÿ” FX ’FwürÝÅ™áùFô§ÎlͦÅù½q{älç`”½“QÛAzwòɵV[üÅ_ﻪ:4®ÀK‚NçwI˜,½Ï®˜ý ὞ìÖÐ]xg¬’À=¡gjJS#à{— _…Ãt&rY2ÄCËÕ&é×j¡í¦›™9ëEøe¯}B1ö ÉV˜÷–Ý„ßÚæ‹jçñ€wµL›­…żzÁb)XN‰zí¢+i¥)Z^^0ÿýÚUÓÎ@¾i×ÄÆ#sõì§ðW`vɵïÒAa Žgø[ù†éZ&Ž['¤í?¼ €7;ï .fD˵ !‡f_½ì]1?„ žöu™á|Ói>¹Y˜®o©‘L‘³5µ6;ÍaòÔG!ͤ˜ã¼@å s\—9xMfbù= >„®& GâVÌÙÉŒöŽ)a³Ø0só! ^ÍZ¼¹* ÄÞ;Ä€èu¶[NÖ È·òS8B6Û¬3i߯kO ˜ö›FÿJJÖ,;Ëæ•/óUém}ÅÛv ŠgíwQPJäÛ£‘ô°dU²>îÝ K‹ÆG+mhy§#åa1,R½v¸eøõëKÉ¢ôp„©eîÔÜ”„è­òG%™ .Nü×±Äz›”ð.«±].OWÜA«.÷&^«E¬ö¾Ö»y#ÎÀdzó/êˆ÷é/©Oÿ"ßÓ/¦2M3ˆ±0ãÈíÄɸ^_1b '"zË7Ç¿Ç!6«¬=üÊQˆ£¢+Zùü%Ä\H[è=âÜ`ÇPü±±õé¥^A¬[õU0列~lìï[ÄîÙk}C„ ±M!üár3Ä)³ëÖÞ_ˆcÓýmßG²Ÿ›Ã¯LqyÄß°ƒ•Q N±¿ 3?‚øzºÛ#è£M‰ÛG?PRÑfYsÞÌ<’föaTüºÒ— ø~}YWÀoùùÈÚë à;Èý'ÍŸ‘O0!E¬ˆÃb'D´€ìt¹·zH9ŸÃã´=ÜiÁm6 d© ­®íüÕ\]ž ^O‹å@ÑæÙÏÞÔî÷þ©wvvc¼Îô[ø›ÿèµlŸú3ß²ÿÅÿð– tߘ¿`óÇ^KLõÿáðƸhiëÜ7ø?7—ù‡ßÊpîÝV‘®ÿØù×`>çãïåˆÙ¸ÿùGþD•íÇvm÷Úµýì¿‹‘»·¾‹w ‹ÿ+lD*csëËú»8ûøŸ=h@;Z ˜ÿwi¦âïÿ2ÉæïsQé®ÿMÛÙÓ) à_n°Ÿu tR:çOÓÃü‰ƒÿS%Ð=ÐÓå_¯Êoíîå"uÔÅßÝ%@Ê⌇‹sà¿Ô¸Îú8yÑÞÚé?å_ê[­ƒ\¤L¼¥ÔT¤T÷ìSß»OUƒF«hI¹,àâ¿OjÃÇ:íÂþ_i o¬û¯Y|œÏ;¹ºüûåþo…?AþÏóüQ,Œ§/fPortfolio/data/SWX.RET.rda0000644000176200001440000024250511645005052015116 0ustar liggesusers‹||u\UM×ö±¥•P =tIwwƒtƒHwI(X`ƒ(‚Š­ ƒ0 ,0Q±õ»Öóp ¿÷~ß?÷Þ3kV^kÍìÙÇLÓf9— ƒÁ`g°O¿ãðßñìø‡ÁàÅ ÆDsk›efZ ¶q< †ä+–«î\ƒ%à¥zZ­•ŽÚ¤¶DS9°¾~7ãïËtI!Ûô RÞÏÀó°{å‹Lë?EųU,‹Nêê• –Íĵ»¹0Xº<Ó‚»ÑNß\TÞˆqiƒ î £¹Ïõk\%ƒ9Ò²$2&n×$ú+%AǾt^™G0ƒ©Ælš¶L˜Á´™ÿDó8Í—ý{*è™}¨yÚŒk͵eD¯öTCôFZœµß‰žÊY¾©¼ –šêª9ž. ¦ÄÖiÜ~oûb`î3ËGñÛ&!Qs퉈Ïúè?Ò2å¯16 :'î<ƒûºê·Š 1NÍz¾È[È¥Üô}ë \;¦'óŸ]5Wö¬âïÚ„ ÑDçz†oÍ×vm¦Ý¿ža =iÞÝ€þ,‰+Ì¡yЯü¥•_¨KÓPžËßûaÝks!uFàÛjG´©zæwKý²’øé-õ™Nviåû‹óµ ¯µ}:7%„!o¸|‰ ZøõS‚,—½7m'vNçp’2î»ÛÄ_À}©Ú™A°‡]È9CQÜ×’ØÜú.M¶2«ë̈ÙÜ8qŸ+ÍèøÔÍy¿ rø:÷hnž‹ë°›îW!‡Ë–ðÖ˜BèeË+ `G•qº¾»¡…ñ1‘½ ï0Eý„>úYNçØ¶ýf;* ¨2þçËåx“øIÌç–b!¤àƒ~Ò.‘zïVP~ù”Ïß~LåC*ÑàGЈñuÆ©KÅ&Bo’ÆŸïâ¾Áä„fáQº*úñ … Óúo/Þ3XÆO-ª¯ƒŽ¤Ý’ª&ð©b÷®ú=úyøü^š_Å`™0V}«Å¼Ñ/Âî Ÿ–½æ4»^Ó„MpË3^Ìt£Hýµ,-]¿a^µ+ö‡ÂUwxW“Ÿ?¹õq#ôh··Ç|€w”oçÁ­ýe7MÛ߃ž–î@×kø‡óÓæyɸoz¬ÿÌDÒ›†éÞ™‰£ü Ú[ˆ Së $«3ª/¦yüN?½ðc?¥˜üóš€Í'²ÿ©NÙo #èrÛSýÔÎd‰KCÿ#-SKgñGmðkü|nÉ#Ä•Šy¯k=ä0­ûc¼ƒÆé÷ŠÖ™ÇAküçýˆCçó¬ƒÒ½cæwÚºà,îÛ¹¶¸Œòk¼géÊÇðI÷)OHÿKTC@¤eˆªh%ùç]~š{i è[ꃅ¹µîSGéhñåþ샥qq¸Ï²9ÀÖu©׫ò‚£*GùPÛ3c2éMüØÁM°³ ÒŹd_%Ê:ÐWÛµýÔaÈ©V)ÃsòÛù²TÂŽ %¹{iÜH«²4ÎS­–pêœDÌ+¸lšqé}Ù½*$‡LK¨äЭ>pҜ쾥ûŽéfÅæxèÃü«÷V\ëÛL™y$§ïqû zÿ´ SÚ•À—ÕÒ†µðµta È£ÀÑ|„|kMrZÅCñÃk™9 ¾%§ñ¯ëC«ÀíVÓOòLQמGò¦oÕÌ€<ì©-1ŸÀOö¢™„¿ë$Mhvɳûp-9¾ãN-ÅÉ„å_¼iüøÉ›·¦†žã®®8ûæ›á6‡ì3ÒjqLkÿ‚“÷¯¢xãLü(JñŸ^8óì&8>ðèðÿÐMZî&D¸þg:§-®-~.~¡}ȹˆø×ü¬9€yL£Ç«=23.âO ø5 -|„çßNøÂü,µõI;b_Ù+oδ#ø2êã&ŇüG¾/Z›)NÙ#-ßaœüŸÞ9Æ(?ÛßFü'H#ô•¿1l1~íÇ_ZU¸6ö_^H×/¹‚'ÃÏ/l=Mã^,zèKó‹UÏ㟺ënÚ±An‰·ûZd Ç?rŽÈýWNÍá_ýЫUýÞvØË±bÝÉNØO ;5d=ÒØLòÞYyQ™ô÷@)CÉú1þ=o#ñyéWá›ÀE‚âç‚Ý‹R´ög¾Xâ¾£ßÆÔpг8³qšÔ{ÓöÉD]Ê#‡GêÐÚÞNü œÐÜ#¶ÏšpPÞ£§ñ=ãÿúcIäD…¿2ML܃ÿõœUrJu&ƒitieVüجEimì­65&’þìúæ mòª|Ê«xn[Ùü¹ùæŸV3ÝùòO²·‹Gºæ³=ü#|ËüÚ€òn¾Õ×_ЫéÂg™°/K hê¹KègôdfóaºŽôW]@þ3áðiÕóg¥šiMz̾¤¢\}9½y¸×F͵­Î¤Gëk)[^k¿ˆy¬V¹ 5Âߣ¾‘ðqß)<ªÍÔÓ»T©®É:ð}ä“Ï»ºhÑñ ûhD|uup‡wå‹»†DÑϬ׫¦ýb/D“<[¢; КŠzÝi?ÿÔUFígYÕ £ìTÈüŽq#ó³ä3–ûœ%~[Ìïî€þLgUDÕP½`Öû¼uŒ_ ˜¯YY„V§O/ôèHN>ºVâ’K.5Ê“ßÕåœg#{NN[[=»ü]8 ú›¢m HÉvš/ßÞ8Î²š¾µ öS–¹¢ó‡â`ù‡7—ñܺ¥u³!üHB´+hñéôr½$ôgB}êyŸ½ï×ßý·e)¯(›ˆñžúw¸§‚žÓé+Ý:¼ÿ²Ë"õôÅßïé·lžêWøSÏý퉰óÚuŠ¥ðÿ‘–eÔ£_nKüg ë¯Á}ªß©žc5üÜ;ªå8…ƒÛÅ@¸È‘ü!/åÅÄ•„›âô‡Twe®õÖ&æ÷«tÀ<š)³.0ˆo›–– ë*øvp/Ñ÷Í;:‘â4Ÿ·´ò({Û™ž#|ñ•¾ÌOþ{r>ÿ<Ü×åTïŸLùrsωQ>Xj2QÚ]ˆ{ù‚Ÿ”1¯rBßò)äÛUW1þÖÇLîvŨÑÄË´(Uš&¿”XúnŒÝ%ü'$t£]ëmçy‡üÇíS‰9ÆK¸\X5óÿãWVÌä [Áý™%`Û~ÕžüpöLeYš½Õ=È/a<¼ƒêg|ϨžÐk¾7Ÿäi5cÖp îd¹Îª¸\Ú2F¿SgÔ6ûåîÑxaÊçpy‹þ/qiÖ©qàì¨ìà´í7õKË[´z´ˬóRˆüO3×o…ø’Ï[mÑOvÊÙ<Çør73á&»º®ßûÎÕ’¿‰Žû‡H_i:B,È­3ÐXÍ ¿1>ÁU9J_ÀÐoÁ‰1ü¬Õ¤DyX@§,£›žÿ·eº,ÛY-ŒúÀh{«i4è¨þ{x|´LååŠ ÇØC†'Lœø’z®AyRBâ´k ô¢såîZÈ#ïÑ}©ú[« 4)‚îßZuý(á¿Êqy.¯\9%ŸäQÊú~ƒäðq9¼’ò¦{âÚrà¤N뙇X'°œ*nîí!}î$\Oœ Öôàê•&¿•¶¬ÿ yœ ЧËb^åÅkžÐ:ÈŠ{×dMÔó:'bt¿bÞµ³Â¬žB#áŸSý0guG;äWžkÊGuŽTw5ÉÃ׸xÉZ+ ½ý.è¨~¨þdOþËǹohŒ?šmOeRžwò‹ß…<à–[Ö0ql÷f£&Å—eW½—Ö‹:iÜ_À—j»§˜(ùΡN”Oãb7¶êSþãïO³¾ Ï6Éßï×à¾ó‘{þo0^©:_ÿôæÉp1â›$™ë0^î½Ó›´â%üZ/КFؘ¡7S×T£õ¡]ÙšÁïЗûRášË«Ð.ß!g…çÞåÛ±Þc½ÚÐôë—.Žé_îî_Ò‡Å$ßo«Å©òüjªtÆ>}ý“ÙÝÁ—¼¢]õÈïÿÑ1àSõ¥Sÿ$Ê‹\޶A„7ÚAžõð7#÷]í½cüØŸ;dù$Œ‹œÖºœqm›wHÔüiFMuÜEzˆh»‚ñ®4%WÁO⹦$ÞðßåF?/AK)yÔF5{N–.h?JR'Ž>êG÷Ïí[4f¾ÿùDzwpfc£|å¶©­ôÿì†y÷W®9½¯µœ& †k§î?ÞàÏë;[;ë+âÂó=ßkªâžd"Þäoö}€}Ìö÷*þ_NY/õÁŸ”ÅõlÀ_,\{{¦Pýʶ\z­7ÇoRïG?·óßçl=Óiß•OÃ.I¿Âª w{7Åxä/‹¡cüUwRûL¡¨t{ÂI#ÿ׈o¡jí?>¨§¸.·†a¨lR¿ø1æó~ë‰wÕ#³ÊÀ‡rкûã0N³xÂÚ ÂÿÓ½ß2Éže¡•”¯—N8äHñ[Ø)< ùÍî\Ûþãä³>Q=£ó-úXéçPr;É!ÐzÁ•p/û¿3Õg ¾VOB\ ô„ÿ¢º>hÝ›e¸oeÒQÜŠ~¶­&´_ryÆ4ÂçªÉéVTÇx…TMF~ؤœ¢Aôïi{GѾÇʇqN”¯kª·»Žâ-SóÀmîNÊ﹟|çS\箨§u”ÐÛâט;mèêŠoOZyÿiÝø̲„]ìÓõ·þÛ?$’„ÕÉÿ$s>Fè¢]dk¢œ‰ù²tIÁ^#øÍ2»{£våÝüíAòTG{Û¶×òƒ­_ÿâëœ.íëFÝhv»µÚvú›þ«O¦½ýîGûP—ÈoH?ýžèXXiŽûÅ ?&ü jз¡ºQmjéS>ä©ë¹1z8E›q–{6ò2ÒÂö:“_z/tQ…˜¼5ôš!3*Ÿ¦e”&Ϩ?±,ìL†l¡/¥{¬þ?ñ`”µA¥Špé†f üTb¶øÞò‡ã+ß~ßîI丨Îô(Ý®Nq_6W=‘ò¤Ûâ÷Ü„û.é¥wâ{‹g2þò;Ê—ã¸X3uš2Ÿ}k‘ôªÛ„/ÃK³WR<ÎkN';º¼þÜ1@q0•Ýú`ê”}‚v-gIQÙE½®Ïú`kÛ@õ´Yþµ­fàS^%Ovè¹ÖµþGÜ´Ìî‹«§‹ÖÈ"H6–â9•ç¨æQz½Ä—â×änýºû.£zÿøáÅKÂý¨JÚ¿q¹¶·”>”î~ÿBùîýÓʯf>‘ ä‡áý¦½£ã=ÒM?¢us8:Nå$Æ´Œ”ƵxBðÚZ«ó8Å«Üç¼Ø,ðï\yŒ­Œöý–K8fPþp×y/]9J/¨†íÈ0üÁMgM?p”e¹9Áš…8• QÜ…kÃ÷VAGi§Šj'ñe(=Ûqg¦óéF0ø5)ÿ¾×võÖð>ròo?–þ^#Xß3Mö½ç2Æx»}-¼"ljspy3®Í\ϸì…}ÄY÷ž\#½œ•9HòqNRÈíb0ݤÿ\Lù°ò— ôd¦i¹\ývï| ÿ·¹ó¢nó{/|˜ã~¯÷å"¯²4Ú—¿~4nj*-Fü©¦÷5)¾îŠÒìÀ]?ëw¿cAßm꫚màG|ÍÐÏ54oÜâ9ÀC•îìÈKr•ëgã¾Få|Á£˜_É’Æ:ø£ó´š-m§ýz…Èoò3ç?ÛàWLO5‰ïŸ€?J b5!Ÿ%³ý[ ø”«xôüøi™#÷Y[·Õ<õ[U[#5N´~òOD˜˜ß1ßS.‘ò×ÊŠú]cúÅÝI/ëismv75:‰;s.Ï–Bn%S1³èga È/—ã9qƾœYUFÀQ÷øKîÑÏ<æúãëÀ§§æó@NŸÉì*пgñt²_ɶ_ ´†ÙŽÃôócÝ:ªKÍvÙÇÃî.Æ)?ùáüÓºN|¥:ƒçAáôóºT‚ºÈD)€MŒüo…qå~Ê{59¡ÓÀ·štÌ<àªb×›9¨ÇY|÷†ŠE1^ïΈKxî´{mFü[ï’6ê–â…N‹Ì'gf¯à3Š£ÿÂ;·„ õsL±#û¯Á_ÿ¯?–SvÍÞ×àGÃPíÌÏ´Ú°¸ÞüªN麘AzÑJ–Ú ýÙž™"˜†kÛ˾9?À¯¹%ç’»cð&Õs.³ç5f£;!©6׊ÇÓ‡‡Hž#û{ç`¼b½ãa\Ûë2Bª;vFb¼vÈKårºæÜ¡Ú qx2Þ«~"§iPþXª<û~5Bn‹‡M¢ý£~Ê”[óó—î+îŸf:É·7R¸ôÄö¶ØZ­«;Ô?3-¿ÉY1ºŸÂRÜ\»æ*é»\çp(è´t% ¿ÞFý(Ü×\¯ÁµAS•ŽüIN´ïøp-1ÿpšâE^Œ[kT¯LÅ­izSÑß\æÆgØÍåâU›vø©GC’¥ê@ŸŠå- ¦qCüŒyx.f·ŠçüÉ4èËvÐ]çÉ[Ù€úÕÏÈë|7òžŸÇܳ}hã´Ú‡ê2XwªRDS¡·œúeº¸ïu$ؘ tåb³ýþ³¿þ íåiऋFÂ}ø13 øhÖ‹LCŸTÚÇþñî¥$ò„^§€æ$ø­‡t½• òúº¥ƒÙýhU•'}k5™^ «Ýù¾ü&ä2íÿeýq⨕+½ýœú˜{úК„N~ ¿TÕ?§÷rZŠ -¡zÂEU–ïû(>üÕß7W+ÂoåÔFÊs6v¾9E «ø±åòªÛn¯(L_®/‡i?Xì[CFÔØxí|ú%›ìRýÉšìÔ¯3î#ì”TÒ]‡¼cnõ½Êñ+Ö…p¯ÎÈóO|ëZàüàZ{Sù èøü°tZCu¬2¯;ÙñÑõh¯8œþ •&qÊPýrß·ôei\Fya•c¾üÚQa•CÕè> Ëôñ½CUC¯âtåèýà†EýïS‘v¸Ž£~ßÙˆÿ+1Bΰoà°[ÄõLä}ξ[ÿ³¼û‘7Yn¬• OÊ OËw+å0¯v¿N¯!åM»ï3ÉïLÿLù™Exñß–e·¬K¢òiTU{HR=5~ÞaèÇêm÷ !à¤öûW #©žžh[Mu´øê-;c©ÞPýò~Í ã»ò“Á פRAùüI5Û Ê9lvà×ÙEùÀÐ÷’ÝšLøqu®ùð¯Ã{}É3Ìçé:d·qf˜?ŽU=F~qõŸ½À+–¾¶ýz{Ðû§u]y)âøÒØ·Ïð9æ×——Ÿ3t,õ¦tB.Ãàη„§v"ó_a~¿‰ÆšÀ]üÊf ëá!ÙªùÜ+*Lö!ÿÊíó„Mœ2ýæÃï•–Ý»õ|òKw½þOž“¼ó¬v7ßµ3öÓ(bÞÇ—N‚?ñUJ›iŸÎêóËœÉÈÏâj{Nc¼aZí  æµz¼~îkìÞÊÕ;:Þ1æÛ èšqÍW½ ¼ÇÑÓ¾¯3Ýqê,ýQç=×÷.¦÷Ðf³%9:#ö¿®rúB~·ÅW;…^Á¾)¼ÖîЃ¿‰$½7÷X:ãø°sštþ%®=òwÌ}‚xµS7¹›\àW) ‹¤z¤¦öíûó¯|^Eþ®ý6¿OúsëMEým§Ó0þ=üÄp‹x¸4æsܦŸƒVÜeúp.ÕÛ eÉ×à¿rm§Âa·aí §a_¦¡AÔUL÷ÓV•ehkå7µ“=W)?† OœfR»b¥èð#üÁšÜ©Ó˜vBq{ÞÁ/”fßúCë=¹—˜ Toοõýä /{‚ñü³n_³_û?ÿXV÷¢ÊëagËÕ|UYÿÞþÛÏÅQG…yÁj€Åwu«a ¡/½ÇTµº±4ó¹.TÛß|ÑŸ.uqê ©²öÏȦ¥ô”S~|Êü ù-?ýIu¼\ò§™ÐOU}²õ^â“íÓ>Âkq¶J¤i¦¥Aýzø›ëÔ¼5ë‘ õݘ ̧?© üìªÚ| ýTMo¨Råb°u‹Ṧن„.ÐOüZ{â>9B¶–ô3Òj³¾;[ú‹GÞiÊú¢¨7ìS,Í1¯ªdíþ÷”wøá¾É¢þÍ“Á·o·Ji žÛ¬e‹¢ülz7úzä6Y™3_zà{Û}Wj ¾›ÈMT ƒg†¢º'á·æö_E©îû"a~üNÌ?ð*¿9½8©aû’k/ü_Ãá¶ÿ!<·½Ñ}#òËY^xe©:ZZ¼¯@\+¶ìïô!ü:“’éjBã¬#×!_Nò“Ò ?\Ð{[‰òfGøþcàSñzÞvÚoÔ.¾ëš ~t.]‚81–\ùzS|:½r!Õϋ涂n×’ùg5AGkñ?Äë?-ÿør“ª#_gëÉü/~ctxysô¨>´»¬yVÀ mžÑ{4}Þû?^ÿ<\‹o³¡®²z<™½•1Zï†ò«‚?;ù^nà’ý³Ï‚Ǫ~Î<ƒüjß±ÜN©póB?†¡lÒ /·ãÑòô__1tFâ‡å4x½™ÖC®5þ¸V²*Þ6Ïùm´ÔÉ_íÍ’½\åÅCÞîJ»£Ÿ\Cz#ü‡eSµåô¥Ñ÷wÌ¿xó¹×æÕ«•+AßüB„Äà°’½Yp­“bôÚªÇèÅa’E‚üÇðT\ ôls}@a7ô`s7[Æ ×J©Ÿw'¡5[óiuävPù;ˆyLvI™P\‰ïTQ‘§|1lÑå‹yìJø÷‰".Í_v‰SžSËoW…>œ³ÎЬ!yV7kCÃ{)Ó*grÓz£ kÅ%}–´ÏRzÈ\ ó»iÝÌD=d¹KLÀχ´ïšî—Wj/„¼¼ûEaÿâÏþµ$ïo>Ú·O\ÚDõ²áµwB©¤÷è•zäÿ™7·?:̳¾Rƒ8‘{ÐKõ9ܸ¯IËWåÜßJ¡Q¡¯Çà³è+øµ™ÜÎГ»·§)|ÿÓšätœ."}Ýo’âCÉ=O˜ azÔK]Ï„¼‹4fÓ~Òˆ~™ž¼ò´Ÿi?\fr|{_»60~¢¯·‚òÆ„¤é›¡_óÚ†5¡„oËía3Žg±±ÀGí÷¦Wè¿â+z_§q@â;Qu{û6§’ê€ÿ>wLÖ9{9Ë7Vžƒ¾ùæ%¬#y®%º`œaé–K´>×þÕ“; üÙ?͘ÏB?ƒÒ­´/¯qx…6ÕMÿŒ—;3wü€©qÚŠËüНéq„ðÑæ¹ p›©êýÍ>¹òo½ÁÔ¨WÚ5ªG&?So½·4.;±r‹+äx*S\ý7¿0•‹|W«Žêa$¿1ÅW<}]BñúÆ-Rþl' ë„û#yÉ/Û㹜ð×ñey)ä1¯ØÑ] {)‰t<ìO­Ç}ý£*À§ýéÓ¦Ðzÿ•§×'ª§Ò¤ý´(þ9T7‡ŽÁK¤UBâT1ŒØmpm¿uZ”6æöËá#}+‡Ùÿ†FÚ¿þ"öåÌnÂó‘|Á´j °¦<ª¸V)Ï]Ý/ï£<3að¾6èºæüZGñ7òÜQÃtá^èÇ<åÈ–qàóŸù=_ÉÞ+¢}üWag†‚ óCHO»ÛËÂà/VÕ·¦ÞN;J¼W~ÉÅrR%»ÔÞFþ¿|‡fÅ¥_–KZÓ+¢Sä¡oÅ»_%‹Áö¶OÆ)„Ë÷*¤ž‘gäš©ºÔùO Õ‹ï7){¡~4hݱ’ò™©›ójª¿ÏëÞ[¹Ug›Ér¢ŸœQtèCʯ#­ÍÒ¼îNø=_‹ÅÑ(Â㼯·a> §µ!*˜ß>|ªO3ä0˜CïË{/ž c½÷ž,Ãs¾îüÓK)ñå Q]3’'þö <*ZÙKóÚÏ_ÜùGò S¯eÿÓÅ¿æ{i^•/ÿw›0ícHÛ¨Ò¾ÁU”LÛóo¯«gôÎZT@‹—'L/UŽácda0pÃÂ} ªÓb*bG ^>%»$ìC½ÁR‘À£ý™L;·|hÇÅ®<Ù8ºþSÜU”Fû¹rŠu:Þ„lª§¯ÁÎz…ûyRAW,/ÒW÷=3Šb„P¿iÌ“ØKyJ/™mÝŒ3_¢mÔ\0—d¿ûϼZÔö€Ÿ©\¿QŽì¿°´sž®x:r†’´hU(’ÐOu"”,ѵ¯l» ~7¢–¹Ï,çWx®]•"Џr+oµ‹‚ß¹,êï:þõZ?Ù¾=íܰèYÀ‡ ðÞÙ_7.¿Ø6T#›¶ÙÞ¢sE#-ÓFûجSXŠOüEs0^ç¨Ãžô´çSî<èÉDFt˜~©øªb?ÕË»u”U¡_”Å‹ŽQûþÕ÷È:éz½¹UëJoï"m蓯uçBz¿&Ö²ÿ†"ùQsƒ½g‘3·©€ÝímïÛ…ø°è×ïÊ%; v—CÓb*áŸVáA^ÝàƒoOgÊ%¦»Â–XAÐuÖò‡ÆO“ºöƒoƒú¾Eƒ„iÒN\S«•²Ö àß[¦•öb>íeó”U`E‡3Óè–¶¼8g/æÑàV0°†½ýoÝ®}¢ ¾s¥|À5|ÿ³Oa¥•{÷-üX1Ðñå±€Þž1|2/ÝÞCþ¡è½ÎNã¯lþ^ü ÔÞ‘?ÒXÒ ;ë¥æZ.ž™‹8 Îý;ÞàDß&ØE/=üÞaôÓXlz%r;?Ê–Åú°…õòô®è>þÌrØÕa³ìÕ©4oka¤%èñ´>ȧ:uUýÊËcìܸféxòÃb¥sþˆm[-…WГ“íüï*¸/VÜe=›ÆyM8²šê7âéý¯é޳ //ŸYiI„?ßÜÚŽþN–V_įÌç âÀ÷ü„iüðüfòÛ¸*£«‰£óóÅoí¹Oq"øc½ß—ÈëŸFóFÇ%\i™¦‰½Ñ;—}†y Ž¿ì~‹ñb™ŽtÊ !&†Î©è‡eÁ*êÞþrb®rT_óå<ò§ó)#ûm,+ÇðP©ÿØAþÆEòg7ynµ1~aüµ­´äݨïFë±¢[ 'ZîCžcùÜikœö77±9Õÿ¸$¤@û6R»‡›nEÚ/ eÝxJ?Þ ³E2°Þ´UÈÿârð§é`‡q$ì­ªPæJz`,Ûà1t0¸¼`jŸã¤çúæÂtŽ„Ÿ'cK ZïI¶:гbÕíð»g‰ö­¤õ¢~¦VæSây°ô¬‘½oŽáêŒðÙN°¯vc¾zäRU|¯šâìÉõÂiõMÜ}dïõãæ¦úå•âBõ‡nºÐðé+'õçòWØýÇá6 ØÙ¾L3Ñójo\”Eü)Þø¸ŒüâË ÑÕ„{פËé"Oø¥J™'˜BëB¾ßû‹è=žö¹9NÅT/Ä®U(Çs±Ï¸%þÝ·ýkí#‹oÕÀßýŽ,½? õøÈ{ –†»ô¼qcâMïÑ·òë'þ"&d¯§§>áZñyÝ­e c8?èT%õ{zZV8&pþ+½Wq½:c€Îã[Ž;^CxùdŽßnšw× „ÏŽÓúŽÂ޲«v•AÞ}eE¡ÓŽ¥Ëji?óݲßðOË9CÒÈCæ çãh]£?þ-Ç8È#ÎÑêšZÓ—ÇE¹iÝÃ+3ƒê8Óþ̪nð¡ªe×Åê¥þªIo£õ¤Òø7ŸÚñÜPõøgž^²Ë÷þÙÏPü³—ƒ¾30T‹Xý3ÿiMØ=Ç:“5Ò2ù~ýÞOøjã¾ü î›gV¯n…Ž62Ë_Q~ïjGïã]L.šµ@¯=;ÆžÇã—{$éMu²ëÁvÚ¶útÚ.ã½Ù¶GCŸÎkWË àZ®ÕÂkøs¬ÒœEïÏù­Œèœ[ÿ|™ÃÐÏ?ûaÖ“ÜölN›Ÿ÷¸Mï-MÂý>l†ÜÃÃŽ’Kc<ù»ëångÌësi0eø¶¹eÁIyN|C´<»Oà“ °ü2½-™ =nå¡0f¾;Ž:‡¥1´ì×ÑìtÍ{L»‚/œ±~Tݼ­èƯ{³=ÞîßçgY:<7Hïšìú_m©®ýr}3ø3š¢ø9lLu9i-´ú³˜ÛÖj9-¯é|ü9¿žqåh?ý[Qœ‡ŸÎ}^SJé½ìsg÷ÍÃVöz“#ùI¼­÷¬SÏ-¾Azx¹üY(Ú`vÁ+Ü7y]ðyáŸÖCEo«rÖ!Ǧ,Qƒj„:ïa^—Û¯×ð·'’ª$màoü·:^nX|™R;z¾ƒ)~«–ö™ù¯Ö á6K“¯çÖ}Lþ¶># ÂïN :·îvf.ç¨ÖáBòÇ|a¸&R8aÙ¤u$ãõY‹(?YpÍÿðã8>7oY®é7|'â¹ø™ýkÖS0=éD8ðs„/–þÝ\ôÝŠÝã !Äç¤ÞÆsˆ;-‚ëuÐßÈé¶ 7p_‚-ÌñÄT}lëS ºšÌø@Úï–`;ôŸs9êŸõ4ÑÚsZº|­RâGû³:û—O)€>%8‚³ˆï¢U=q­Ì8ÇMëRÕÞÕró¡G[½úiª˜GSÁáÖó,³Œhêr¦þ§ýTÏðˆŒ¶£þwJŸUݼ£=_Њ¿|y‡ÖÁú'ĵåƒã|ÁÈF*y^Oq_üÑ„S]£yš©z•?ø3ø¶]ÉMëË»_¿À~â=¯’èÜ¡ü¢mÆô^ž¿ëœ>ñ'¿`C“Rãßsr,»‡¦5yÈßÖÉZš/Á¯‡`‚}&äÕ¿,ׄþ&'¢”èܾkº×®.àèÎwÓµàÏ–;Û©þ×Ñkœ¬>ù·Tïd'ÿÛÊ.HïU4†-NY!Îô·ÏRõ…½ —"/0Í¿U4b¹WüœU”G6/‹<ëBûHêC¨˜J›ó.йxËMÎIш¯‘–)÷®ÛŸÎ­;>Þ½EóëgGx›B®Æ»Ï=a© ýZ–KvŽCë [%Q-âxêŽ~Ρ³lB/®Ö®Õ”á~B[Ï èÍü†(·Ý˜}PËØäe·G㘥¹Ñâ÷±Ò¡ó7ÙO2©n½m¢gOz [b|™â7÷à´gXŸ(%.m¦úÀ2{×):‡eþª×n2æQÚh#z tÌ>Ìi®iô{¸Ø“ŸŽìñ—ë´‡¡¿ãG‘cà›/wwᇙJÌ-\+U‰¿n§82 päõƒÒµûŸi¿Hö}»+Z÷Û&Oh'î3ÐF~®ä7Ö™:^k!Æ;ŒËŸÁCyÂíj½÷WW_ÕŽk›c»'#®ø-ž.¤ó?â91Æ„—;¯œZ þô­Õæc]IJôÑŠ|ÛAô¶É‘¿)Ù~‘8CöýoË·Õ+">GöYæ­3 ²è}Zb²;í£YFwEûí¢Tõ×}¸xĦ‹B/…Æñ2„ësÝ©>¨½ z:«k´lÑú U.¢÷kÕùŽþ”¿ßâ?ü•Ë­é}„޾ýxæ¿`ñiXõâÕ_¿~tÐ÷3fí×›ü«Óü[¨ÉáÑq>¿ª×{Àž¶“-Ü•w}<èß–—Õ®ÑùnñvÕ%¸ïüP~aüÖiMÖ£пçì6èÃa½97åÓe:Í›wÐþn4#±¥‹ô{Rܵ’pûX×Ø×ˆïªòoÈ£%ë¹2ü~ä‹ÿÎë.Ô)¬‘øfš\ævøˆø´}v6ƒòÈô$Ź/Ï»˜á {ëø+J—Î~E]Í2šoP ¿bñ·þJ¥ýë÷õÄÿ­Èô=âÈ9Z໥üÖHâõŒçh•îj?§ïÌB*ÎK@ÿó…Mèý¦pƒÌOŒ·kË}HçUmçD”Ò~ƒ<ÏäTÚ§3âuäÖÜ&G¿æèŸVŸy˜ø˜ööÎ,ÐuÌÙFu·Ùº “ÐÏB¸Áä.ärZVwå:ú«²ò¿ñ>Õ–lGüˆ_Ø}Lžüý´‘Ü2èÅm—òÿíÔ{ô}Ó?íf´’¡NçiÄžÚKuÀHûÏ}·Ø¹€ŽR¿é³-cüÄBNå}/">”~^óé”^\v¡÷ñ§\Û‹|àSü×s‰fô[Ë฿ úñ\°Òù+ô£<ÃPÎy›•—ü™{»LL;Á ½ïÔZ&Içmýz2bêi,ª¿töy­ºÊã >ÓúÉäEû\]ä͵j­¶ÀW—>µí2cüÒ=èËÔå,ë…ÎQþX:gó.A[q.pf¾îÜZôÌ2†ÁJ3y€õ3³³¿ý-ê«Í ™5Žˆ7WÍyY©ž;yùgæqÊָ߹l²–Þ¢óhks-¤ý¿ží¾à+ÓšäfA+ìèQÉ,ÔgÉ7Äê|b°­ÎMoÆüYÍÂÎ6¨7Šœ&6M±ÀúXâÒ±(øÉF¯›"’¬Ô$/ß·ñüþö2ý} fá /™š f‚÷ m—L3K˜«÷üp]Ö…ÕßÁ¿ëœN×#ðo ÅJØ-kÿÒ2äûˆgV’åd÷Y]  âq¸mÃ`å=^ðþ*æË>û2S!€ÁL_Þ­+ïÀ`FäEÌï¿é"LŽ­“ÌÄâ.Îóœ˜wðè÷Ùô^þà†.Úlj>Û½ÿFƒ•"wù˜ÍIÔåe­¹Ðgª·Æ ô“ Å–þ]Õ5bvà:ýÈÃqšÏ¬Ð S]fÀŸ ä{Dž2XËÌŠE|š5·{û¥±ž­†¼)®•]áÿžUKt–Ã+fžù¥xuxä{…nð±Ù»ÀúOÈ7Tƒ>òÍ^¿Y \_Ä~„ëKfj–Á—ÐËzA‰]°ŸåoiiZ ôµ.…]˹Ǝ:7bWõ'äóDƒÞma> fXà@4øë˜©·ð:âvk³ßø«t‘ý Ô),ï-òÇèývø4¡™’X—%f;‹z0˜+&¾ZKx‘~»`É Œ/J<4í;ƒÈÚ"µøï½wÎ'W´®îŒ­Mÿ žnÚ=·ô"mWÂîsôy@nû›Å¼Àã¿ý6.š;(»úV®ä }s Ó èIhÇ/èßo¶ÂÁlô‹oš0 ÓïGß+ç­ô`0C>uŽÀúӞɔ=FìÉùŽø /p—ö÷âw¼|2½%›ÛjÄb¼¯LëS_ÜÏ04R g°xjÓ%i:Å¿vÐg&ü,„ã3ðés¢î,~“ôÑóþ1ÄkÀÖ@áÊQ¾ó¢ªl¥à/aÒ³Ó:?¬¹oü/нZæMçZ_7í„ÜFInO3GåeI¿Û¤ôããª}8‡ÀOüFGÉ(à„ËxÕbÌ­[‘öqjáx|p‘¦5›¾?Ï(¿_ÝDçµê7`ÄT¿ÐôŠÎ%‰°Í* ÷3!!³>>.¡]ÉTŸ%ÍÑ7E=ÖøÇÕã¢ÿ˜Ïåƒ_D–Ry…º/JíËr7ø™cΊº)èï¶á’õBÜw‘>Öpqè5ó¹ÔrÈ“°<…Ëšìò‚O\„ðB™{ÆvàOån:?4γL~à°ebº)øõNÑQ‚§¹ŸIòàdœÿ½0Ų¿p¨|?åÏ^ÑO©NPï­¾ ¾=·þ,(³îÈû3^7 yÞaîéác ¯wZù*ð—3—ÍNëvΧGÑiܦU:þY!'»ÑÏkxÒ¸v´Ñ—¦NWZEõGtÂ%ègC8¯_<òøú[áä÷*7Î×Ñú8L:kaü+ôZ3ŠˆÒÚÔCù|pñ¥Räá`›×Gé=¯‹)ô‘”!ð®x¾t"½ÿ3Þ‘s+ãl£7Ÿ¤õ˜Ï/ò €ËNoêmÙá¿Aûò–ÀÔb 9zA×ÿÚPÕ÷Œ5çnq½#?ˆ×- Yꃼ³ŠóNáŠüûuàÇv™AÏôO–æøÐÏ`%¸„´Fü…ò]97‡pe»Q ôÌLì½cúÇ_LÿV?ŒJ[¾å#øÖmäüŠû&mU#A·ˆûyådàDñÊ®áK f’¼ÉŽ…Çü&¤R]âª.ΕŽ~ÓÒ*Ô0O‰t:ïµe Ë~ç}ßVœRvqØŽÁôN˜¯:.Árøˆ?í­á ¿ ¹0یޓH}Q£ýÀÂSý6o!ï±VeU¥snzï,‚_dä†-ÊCžIÜâÙ4Œûዲ™÷ ÿôÞ͇žz«'!}³RíÓÞ{»¾ž|„êü°wRóCPx¿zl¼czf f?giJÛ$¡_’“½ÊWÐÍX0{ª ð$ÅJÀ;r§Ê°¤ï¯×Ü®¹€¼mpnט÷bã(ûÚnÑM0Êô7][kXù¯~¬ §™ÏÁÏ Å¤mɸΟɼ¸MþqÓ5}ç úOSŠÏ…>­Ïv®‡¿Øv4\Þ=Úp•/*]VwöˆÅ¼™5[nW5.!z‰2ý·PÝ=Nª`ø}šãüÍŒ]t9‡ö}Ã}æÈüÄÜ<ËNûh:»éü¿zúƳ´¿e+|¾wK•åwC=àŸ2Mé0p)¼sŠàbŒw³ ¹=v ~í¼î1ð%9J¶&óûÈŠ¬ù†Ö+hOî©:Ï"o?ƒòÙZ×9¹È‹Ñ•ï&^„ýr¼7ËØÇ£ÿåŒÆÇ®{}§ô’øÏ–AïêûMÑz6>ñÔ:Ô맬XHë.‡UOþÐ~¸þ¹æôþ øÐkã%F¨_Xû§Ów·K›öÑ9³ðÁ?{Ê]kÚß.þAú-ò`ÅR¾Þ|êËÙxzÒ‚}ðæ—ûO¡×Rõ_܈¿ˆîo×à›dû²”—Áî»øæn^¹õ·Ò¾^Ašô‹6ä¯Õ©6¬c æ&«…J§ÛÌUÓTì¿!.m—C'ñ>¬Ž%-)­{‰ú`£ÒÝÈÈ—þÜ-kúqí¾O.ÀŸŒÎ4:£_iÛ ùzÔyîÊ·¥!rO¬™äÜÈþ}sòmšËÍ£2¸6È©Öú—;1˜|ûÙåéü^6ï í‚mˆ‡%{×îë'pó³D ×¼æ%Òon¬·ó@<½é“àAý¶ÊRêVôùöÊÃ݈ãôùù•UF鯅¶‰þB\$-Ù™Nñ¨®dÑýf'›ž=!I¿sÂ)¥Fqq†‹Î•æštº–¡~ êñtÿ ;GçŸ* y’’vL¿tyÏæ…Uè&ï~Ö ;»9½¹re«ÿü85xá ü]æ™Îí còwPùÂØû´¬­ ûEOü\þ|Ŷj¢sÜ -1.Ôë5Ç/Ý1õÐ…’÷6_ú4ÿïaZßÔ05aïÐÝ‚)§‘%oë2X™%÷‰ü_òeâ'Ž~5Õ+à~Ô‰¯MÎðOûóÞ£Nˆy³À‹‡p¢%ºûV.Ö˾z+ÄrÕžš×°Ï¡IŸ×á:ëçÝßKQϦ¬=·HOžÁ,1©m ¨®ˆ+ÏòŸIK­?hÁNÉ+6÷Á_¥þ·ærð‹.Ð) ’Ü2qx9Pñì`cð#`)ð0uÙ¬!Ø)^Á>j󗯱Yƒ6YSÄ©õi '¯JøKÙ8ë ê%××kwA?†¯3U…á?ŽL¾„¼PR)êæ%Î`eÛÕ0>#¿¤çxpä‰DÏêA¾Ž”©|KöÔOk„&$Ê]½ 9"›Z&PÞší´¶~šÒ$ß¼ý?÷ŸŸ…Þ²õ³JC w¬½J7ýÎAî²Í"g  ¥¥ÖŸ/N×’#è9v«íƒ È—EW´îäÁ.9ï{n~ê ;ÍÓ¨(A¾Ùòyð?øÜtFØù¾Är\½%ø®?˜Ã—;#‘¹ÉWy|U,ä¾è{ðò˾#a9R æUöwóA73ÂëÄ%øAÖÂß³žö«>ïwžÅ`Hý-¾ŸÁ<´Øùáá­ æ¶¹¢æq}ÈK2v纑W•ë_³¡^Ú^Í%½ y9û§Eg.üӣβ xÉJÎÅñM…Á,ß#:nE:®p,]ý¬\2e'£ö¸¬ßË ŽÛ“ZÀ¼+Íü"’8œâOËP€Æ³o¡÷b³ddKŸÃߣ:s¦¬Ãº%…ëþàÈ4û¦^â·°ýú™X/N’ã*3Â:}’TýIÄQ¶Æ¾£_€){ØÆ{£^)ê\/vRþ²]ýÇ0ì˜iò|Å"à¡·Û‡Œã¨Çüíê¬è}p~çf6NõªIrÅ:%íÀÑ[²%ˆ«}®+lÞãA¬¿3ϵ×=θ”K~Ä:7õž¯ß³ÿ®Ç_\Jœx¡Û ¸î4‹³}{ï¿ëƒõ™%x¿݉X?1}êM¦ßý±{Jï?ÓZ8lc ï„ö kÆC_’Ïk+Þ5ô'eBEºÖk™1XVž~Ó~MRlÐGª§2§z”½Fà¯sTþ”Ân>üö »:{ÆGøI\Ûª'4ŽN.„>|<Ë‚ùá/ÑY·C§CÎÖI{øÙÆ_“Ó%·«˜=͘O—å€ÞGÕ3äè{¼Ô_·*æŽGÝÙ’sƒÎí‹tŽ|ÍŒŒý˜[ Ü š:k ÕA™o¬Mô!O¶€t'?ü]óËD+ú¦Èêçøá›¾9údƒ¾ˆç1nè%ÜkÒUÂÿ·§§!Öï¨w2D\®[6µrè~½x8~#­˜ñ;áÊk•È•»QŸC¸,Õ‘YDë‰'=Ho!oO|‰uZ®ºO1ä iýLç+c …ý€Ã1£#1o¼¯FØEè;pfï£Lʇ)O6¯Å8s)ÏÒ>ן輕-ï).:wéß)L¿_¦ÿjwS ­ž)¬¦ß»±¯‘Ôä£õ-+óÖøÄÙŸéQi{ˆÞ߇·ÎÚ }¾‰ BÞÓ?Ù%M¿‘~×®¦úLœ²[÷ ü1Âqþ¬yðÛŒþyYÂ"¨#]Þù}:üLR ïdVëNYÔQú·:è½¼ú™ ì´Î]Ó*”ƒüÂÔJýòr®ÍL¥ÔaG¦v¹¸ÙrÚ_ÚÆ®Z€øIb/< ¼»®Ñ% ýY-ü,=uÔoYz/wÄAï±r¯·w®þ[‹mOažÜÌ÷æÀ>…Mމ¡~QMëoÿ … fŽÊ›½"óêµ=Ðﵡ©]™ÿÒÇßy"ì?p…#…å}ßNq8ô[Oµ—¾ÃåÕßá³Ø¥~#¿,Ž3ާóT¥†ý3Ç^]>ûϧÌ[e¼]—gvþ ä-þpòƒò®åQÿÊŸÝ÷jáùÆ®÷%‡Òá¯Çä«Qפܷù=í ƒµ=gæ­‰ð§ÜºÍ5{€Y%K¼” ×m«ª"Ö~•¶ÕC¾‚wÌV¢­Ð“`üž:NV^2ô+K ×vç*‹%N¯¶|²2?Ü”˜K¿‹´W¸fHû7ƒÅ•û¾YýKîÍÖk…=Ë­ƒOÚ<}£ûØÖ ó}¹ÆŒ†<ã…îi ße«åö*¸vî‘Ý=+s½ð<ýÙ×`5øó¾©æC[¬2£/ûûOCß›k:p?tÆ%MÈQc¢€¼^Sê+4šZc8v×séx€|Vñ$$|n²?4õ9ƒ¹ïçýŒykñ¼f@ò ú{ä.cER÷ª¶#Ÿ¦ Ûwyq× Sƒ- fuÙGÒ{vxbŠ?ꌅ—¦lD½•Ñ]¸Úx‘·¢x§6ü9Wî¡’8ÆÇTzýq·­©úpðBËïI²£ì¹¹"!A6zë;RõWQâWã¾#Ï¥ÙœŽ»ŸžæMçÒkKÂé\oºãájYÔY»¯>V¼ =öobÈl¸ңžwP‡—ûD„¿ÙÁ`íœè¨*Y¦1Gt¬ÛÎñÒ÷[Éè(÷\ö<|õÊF‰´ø2Ôý›—,Z}'—š4g°6÷ñÜR`œÿ¼B¹“~o&Ù7Ëé2êÈâ÷ákk÷6ö˜ktßÌ;þø\Ý¥ªÿ3Zx~* ñWuóÚ[ä«dîïïW!kÂ[d[²`÷v§nƒÞs³{9çý-ùèÜIJæÏò+ˆ£õn/=KaßMá2áéWþñH‰$ügÃCÁãôÝPœY’U=øÙ±l¥Ö·Ð׊mïmiß»žµ$ q•Êá^¸ÞÂû”ß zw[ÙÉíú¡ÉÒÞíU¨+f\}ƒuXš!ÿíiÐKº€ííßðƒ,)ñÐ\Äùw>Õ¹ÈK›¶_·Þ zâß÷e€ëÆ^ÆYè'æÇßøyäA6vä±b»[âWCs-yO~#N­œŠv´Ýý<ƒ¡à¿ð÷íÒ-°{ÄF^±+-hç˜\‹3WX 9·Æ^.KÄ:p1G£@ÕÝbf}„‹Aß™[PŸåÔEjxb¾¤+!“#ß«)ÏÚBç.Âå?—‚ÇJ w× „)ðÃîñ+Öß:œ*º¹ë…$ô:$´×&«-ó‡IýÛ¿þßxW·t³â.C€C¥óõÿ]OX׳ø,Ö¡ç[‹[aH¶\)yäGgFÙ¸µðç°©¾Ó´ oig¯ð£L‚Ò ä¿<§ÂÀà»$«½~ßr¬‡6È ¤Coù:©‹àwù&ë¿6!>#Zµ²MàW[E6Vo”a0y³î·Ñù•´ÚÓq—r½f!ÖA»éýpXÈ/ûfZ˜…M¢ïZ'm÷DA¾tC?Æ}ÈYÐt«Þõ Û‡¸·ð›Ææ©ö©°—®©üý#È“úÑCy~Àéü+?Ï7Ðþ‚çK5¬/l·Ä}F~aåYDÅšGBÞËGãœîBÞ×Jg.@Ïɾ3Pwn?À=|•ñµˆ£Õzq"sK§Ø§e#y…Z¢?øý¼±¢F rÝ þŒºaW¶ÿ#òeU>[×YûDfü·žî/3i_b™ÙvØ!³öèï3 Ìu¡gªVÁ_·qœy*ðz<ÛyNy¥"¯m¿Dâíqóý;#r„ýVÔ›O,ÜÉݨ ‘Þ«ÿñßos\¢}ÓM/EÕ!oÐcï*àzòÑPÅd]ô}»ðÍàÃÓí¾[·îWVÞÓiü·Ÿ9fœO†^³y¥@î<Å"-ɳÇu4»Žì½­Mö#êÎ䣋3Þ>À¼¹ã·´î3³Â¼õ?Nýr÷ïÕõdfŸïäU·wŽgiÿgóäæq;71XYâèýcÌî™öƈ³Ì'Þâ¨7Ý®Û=ƒ?î]xVy9ÚNQƒ~ï¥Tܾ×ù jo›Õ©v<»Oẜ›/'¶õ–t]ÕÅ ²õéû°È†É%·h=°ï—à £Qþ¢ s¡¯r}Kw]è+±ôÏAZg¯ŸrF\ö7…k;çÞ†þE&¨œÕ‹ZåÝô]yºÜ1íß´*óíEÄÅFŽ»Ijà³ÄÀœãRÂlþ`}·a×ÂÂ:Ø3÷ÞäÐiXŸú\nvCÿÒüÜM[š,þ=ÎáOAW3옜Z_ó‡©X0×~òÉÓŸ1ÓØÙ7›z¸v-ÿ œhv+Á:.Nþ‚ûc[ÐOmŠ ×oàjÒÇs‡”›î³¯ÈðA¾D;ñ8oZ×x?^\ŠÌ¿vv ƾÎFö…jÒ÷©¿n‚ž,ãˆÆú"7ßl/­}^rìš½†e\àhCºYÖ˸}“C”¾_ÛØ®¤ŠõR$gѶ ÈU²hŠìmзxÞ`) »:ë¯ÍSFÚ˜[ ýÆœüqÖú WÓyAcû!c:_jÜk5L¿?RÂ.hWFûh.×cÑç6I³…ö­Ü†>#^öó™#_mâ™}õþyä‡Ç=Qˆ£uCãD|ä”ÇìË>D: –œ¤}Æ‹¦§ÁoÆønõy¨¼*îß!¾ÓVˆÃ7o{´ÂUy<­ÅusL½ôW>ªã×–ÖÑï&gïÚ›\È`9&$ñQ^ȺвÊt}ÖÌ5ê sJýMU(Ç™²Bìoé»!W³—ŠÔÏk_1ùѽ¦Üað›§Yèû¥në÷Y»©pœDçàc׉ïÀuÔðB‹*ø»îŦôþ)©x1÷üîáA]âKãPêÑÔWÇÇ#Ÿ<ßÅiqÖÆ©lÅä_y±w?A¯^SêÅÀOÑòiYÓà<çïE^ZHÔIcØ_ÓRéó[I¿J¿·¸±T¼èpźÚýc)äs˜3žv‰ 1…þ×tëÍ@¿ÔÚeQ/0Uì3oÒï\¦Tp/F½eñææ[{ä×ôðˆ•µÈ—'X÷Ñþº ûƒÇôþSðb‹ êØÔÈSZî% –ö3ÇJzÁþB¾¬’Þë$Fj—Ïæ7Eê¨sÒŽ¼`÷Pa°†Ú§÷;AÊë-¦ÂßÂ.¶×Þþ¿ëf¸ÍËÂjÔ]Šno;þÿé·Q׫Më·Õl¶³‘_Ü9u½ýÐ%“Þ¶PžgÝÜ>‹äY˜Ë™ý&Ýn’—î¢s U\[LhŸ°ù0ì™aݦ+üað|ª‚­Ë>•ý˜>.W½c\ìøgìðóõ¬Ú)‹£éw ÷†ÿÇuÔíh¥ó‹SæëÏêèªE©¿ ïb#xåR±>ej4t ß wè¯zDç÷]fOÿvx7%Câ3â|}sÔøÌã}+!Úô‚kçqZ¡þËú­;¾G1`Ó/R†\λk·_u÷îÄ5AîhéÓÎô}nZ˯ЧˆCÿÃU[ÓÉ?·ÎG}¥~Ö~ðÉêaöQª»r• !.ÝZW×Ä€Þv…WÜñ¯€Yû/‹ãyî¶ /ÎX`~O¦U+è$h=j/Lû,¾rð7ç]þ‡è÷Ü·®ÌÎÐF>•1]Eõ#×ÏLú]ÒÂéÁW6y1X«ô^] ßÝMþ0þënÔ;~¯­ºÏãzœÌíËôýtaD ÑjàlúàÕŸˆëˆ ÍÛŸ“ÿunÓž ½Åùÿô¤÷O++ÿ—¼?Ý¥!r%ðˆLl‡~ƒ·]“ÓB^vŒ¼ûŽÎ¯xm½ýƒÞÇu¬~µquéÍTäAåèUôûÞ‘ x®Ø nNíîOr‚ÜNÇ¢ú7´DÓùÉÓÿÒk{ÚßO—[CïâR¼ Ëèýö„Æ ›ª'ÝAûÅ?²wE¢3ÿ‹Ö•“Ÿ¿­ÎŽí¶ˆÝ ?Ëœ®ÆHA¾Jo™IueH±Pâ0G¾Ý3~ÑwÞuJöÔ˜}5£õ +UC¬w6äŠùRòæÕχ}¥´)ÜZq˜ä‹²³R¦ýÞÀ×׬ƜgŒý¨˜g _œã±ú¯œ§šEú-ôˆ0Τó'>û6 ®µþ–`Eß y&›?²Cù¬rïä-‡©õ†\ÐCò÷é±gÃá_û~GFƒÙ"wŸZŸV.à„œöî çÀOƒ˜Ñòˆ—äÛ\Fгæœ8:¿ï®ëŠø3‰}¹y åÃUQ ·WÓ‡I´Ža»¯q–Á´í¨½òÝwò èÜ)Ë‚=â¹såÃÿ­ú8-Ó€_Ñ1û“:èÜ϶ÿÇ×›‡ÕøuñÃE‰*‰2¥I)iÒ¤:Í¥yž‡Óiž;Í“æHšÌD ™3WŠ8eŒD†ŒI"Bˆd¦÷³žßó{|¯ëû¾ï_÷uŸsßû^óZ{ïµ×ºz zÔã>²ô4Ïœ?–¸ý‡[x‰ÅÒ'&‚,!ÞÔ(Œ“ÚkÝ¿ô(¨èzÉ…ï­ YýI§Ž‹S1ÿOŸ7Õoá·h+Â÷3Æ'ìß y(øâôšƒ85«ßQð'cOâ ªOáš½âç至ߦJòû¼ƒˆ¿Kž»‹QþWó•&Œ³!õ×x\>ìÅvùáebàW¢rãVÐ'üÞ³Ð5Dì×Ç?¸ÏÑÚð›ò8rLï–‡=NpaºR~Áó’3!ˆK’K\‚=p?å|݆üI)ó”'â¿ó6yƒNf¬†O‰ s"Ãd-øœ’Íç_ˆï3‹>d…ãšt$ü&Õ}Í•^¶ñl”au ­«å}œ0ñxFl¯Gð8±¥f9èfZ»Šâ«Ô+wfÁG °”·œ!òæÌÐ=eÅiKØ=µÙ¿©^‰Ï%±©tî9úÂVî*È£MUûcª÷ž÷j{÷q|/ùº^ò°’çì@1âñÐʺK×@¿·\¿Œñ ¦—¹AÿÓ¦Ö~£¸³(2ñ®à)Êò¾Qjÿú]þÐýRªkâëTÀ¥V¢Jv½ g8˜Ö¹’øAŸäÙ«^.€œ$×ëð%Á®EΊl}ç‹& ‹/¤ýÚ«á€o’W?å[æßâVóVíL2Ý㣫¯ ^±}¯bay)[£È¡s]#IêeзÜ4»¸Üg„õû:äõ?T„¿/ÜY¦â†8h¥ù>½b’?1&qt;ÿ]•ÕŸždKëÚWëû¥(_$>R¿§Ÿæ•£¼¿,¡šï¸_¡u´Zö—Õ|ª›‘KûÆsE§2)R´T€Ý´ߟ¸ÖWí¹=4÷eÛíç¦õµï¶â1nLBLNu7äèPUÌYØ7ýw %4¯ùȨ7‚ÿ\}Fag?è½2¹ùë²w¦²Y¾à7ëkÏ Ø•´Uκ7ð½Ìu碤@¯ÒTïÒãÐ4ªK” lÖKçÿV4ªM›:$tÉ+‡Q¿†¹ž |×_ÛuµìÇ ‹_bæð¹Å ¯Ž`>íæ¤?í+ìd®ë~ ¾ëÞª*`ô×NyîbÎèdr~q9äAùÇ^Óôüð¼úéúÝÜ¿v¾DHúì–kµñzês‘{8á<ô9´²k:ÕcvžkFç µäž]Ã}ø3GÒƒìÜŠ#ˆ—bdÓJÀÿìà‘ªÛ”*Ù,Œ¸3r×”÷T_+P{cå‰EÏšbüÜ=Ær¯B®}2ñ|è§Ây´ßaÙ(&g†ûåÖgé¼wô …íT?<ž¹Œ·€ôW!f=Õášma÷ÀpÇ»ÞÚ°ã'qJä)^:ø¨ó1ô”©)¼“ ö+ðU”Xž÷¾’û׬}³ ¿ÙÍâTÞ"`ÇBª™=õ’´,¾htjžƉþyÊf)ï¶MF tÐsYLëÉËÂø¨¾uhì©Å~ýÏöóB®´Wj¹Sœ3Ò‰÷RoŸ°´Ãój¢™”·‘4$l_§@çM Y;@·dŒâ£Ðs&OÝØsÜG6Ô16ovÁ×÷G÷džeï@ÏœÔ}Ñл¢PÍÙÓ!OA'îqí¼‰úó¦ >s=ÿªŒê€XñŒü–Âw­lºä È¿(>áöÿëçþÇçˆ&¡¬w/6$¾Ú~B.õh³ŠSµ‘‰Ïnãu óP™_ žå}Ê©„~ÆÄøjœ…\šÜEõEµzê)(.MÀ”Î+³uT—óL¦sJo¾ã¹Èå t.¢²ÉBm ô%w(µPqsò^o» +.Ž÷ÇŸÉßä¿á‡}g½|[¹`òó±WÉ$Ãüós(/¯äí$<[¹RŠê)æ×>ùx{–&õRüõÅtü~Yµ’µàû³ö’Xã;ýéeØ9åç7dÌ(þ~䔹 ÿ/¯É:>ú8`rèbª—ÂÈ]ÖS}ó‚ÈoÃj©DÏŒ¥íT§)ÔY5®œö_¾ ¦:AϬSÓ¬)_=L)¯ªâLF ×¹7_ܤÈ.Lqa„¼®~Óþê ü@x„Ý×PüÜüÑryÎ@õÆÍÉ­º‚¸EÕG¢Ëtt:1ÕñGIFµžÎ '< šKucLsòÐ?¿‡WݦyÖu­®Óxßb‹9ÐàÄ×.)ç@ó\Ôag8ާ‚ø* /^~Nöç(Þ³xRˇߓ7ò«_#ËVµ;®äÎi¿> ó«m‹Ô©î`¼¤Ýü©TÈÞÚP ðÈdÈkgÜŠ¾a—ó®óÊ¥}ÎüËF1Î q¶*ü‹+>¹Û˜âc©H‰uR”׺(ÝãxÌY¶€ù´Ø'¿W ð†¼ôn ý¯ÍÎýà+`ÒêÐ7§µ_Pž¦«ú-WEŠ+ûæy(‚®iœ òÇa/³rÛWæ þu8¬Lu=¤g|L7¢øà΋\Ì'}ËóÕsÈ^³3dKÁ_·ø9ÝWðœq¼ž<éùÀ°ùB’×°&ø!·÷¶³¾@ïØGÒÂ0rÜN ¾³‚}¶˜¥·Œò«å"ã©>URÖÂMu€'=9foøæymƒ‘+è˜û4Yzö-AÿíXì~Ø…=!EЇ¤Ò¢?ð!Š/;‡ /l9Y cFãÞÓä—R R³C ßaR¼b ²ƒîÛòhÞ\È%Ð|–ü£®û;ì¾®ýÃ_TŸ/*³Q6|b»h s¬ οŸÝIú$P¾t Ûm ¯Aù|"r/7Áoi*ÿ´yCüºzhp7ìRaçÙÔ O¼­„§ä,SgÓ·J|/dÿY!à§õå+Õ3ÎÖ°˜×BqÉì3órÁŒ€ ©NyéøÌ%Þ¥°«MK„ `‚ïo¦8yuæ‘y'á‡Ô?Þ¤zê3YœzЛå7~~/­ß=[£Cû…¹ÙMnLèŸèdGšOù¿_aðßωÛëxdÝãöŽüzÀ|)ßÒòbp%øä«7<¦õ"ÞFБ½¿/ú#ìVî|§Üjð/m$oú Ì7í=Gû yË=´„ÿ ÞÍÖ'{T2Éò%ÕE°äS¤óZé‘{/¸K7ˆˆ´‚¿A™ ›ï Ó9¾tªç¿ÆÁõêÈM¢îäsö˜O»¶W7‘¿ßmZ;›ã/i¿±z_ïÎY˜Ÿ†\m1tÆwˤ‡g2btnªïÞÁ_Û^ŸŸ£öäUü¦üAÉëÌjøeÿ!§*Œ¿ZáLô¹Ò7êö¢|ÈãKîüà·Ú¶•/,uŸ Gñžó¡r]lÚ9ºZe9o€~pÔ—Í›Aõ|ÝMN—ì 8¯'pt/æ'ÙbELð]öFþT_?)´zj3ü­÷…i}xŸ}Ü%± úÓºÚ`1éÀxæßù#ãÍ…—žCTÒc7Ù»œ5IË¢Aøå»‚²ÿÖ}bdòðP}üâ׈#`7X-ï\—³Œ¦uÉà{ò´YT×;£"aÛ|Z÷/]±x¥Íí¸ñ•êTWï¹Í"!r3d!àH»“ÛIu*WH(ZUÎIÓ]žÇBÎòL͸ ºÍ`ü §u´Ë:,ÒW×Ъ\š§äIš—Âþ$>ªÝ¸ì SçW+ðœÀõŸüv€(ô59æàÌ`|7½P©Fm —áà‚¼,²—ÚãÒ¿¨Ïò²*Z/M¾Á”‰¾Ž¿Í¸ ü"¸º®"nâu.¸Oçp =3òì1?+Ir“Ú{ä&`XXKôŽ0¼ û!üåÍ/ŠOù&þ„=H{x¨ò5B³õeÇ¡O)ÜJÝ^Ûâ¬WúÅð“9gV`žÁžs4û4èä{¾ðöTØICEÁÌ&¼—uµ/"üg»ŠÊQ]™èÏN?ç`œ¾§Çé\Å«#ư[Ƭ15øQŽï×Ðç* ‹ùÃÃ1«(Ž8˜.Ô¼O !¹˜aJõÜ8²JÛàØÇü·Ý‡½ mZ3ƒö}³²™a_-^^Fq½SÞ»§¤7Qß«KÀ'ûÄù£Šd?Ùg&Ðy¥DæÅ=øNbê¶š~ÐÛËK~N&èht¹ùj—áÈA-:ÿ]°mX{p†‡ný±v,^\ÛbYÿ¿âNÒ¶}&T?f¥CØ*ŠwÙKïm=oÍʵÃû>§QÆ–,dpCßGDáïl¿š­þásÓwü£¿G¤TîéÏŽ”¯õ{dæyá'äšù0îª •ïD¦ÛTÇøÁ;ÖÕPÝ÷ÓLO Œïôµ`® Æ[õ2ujâvÌžYÀ3òuòÞø½Zü佩7€×ó  ·¿¥¤_¬ªQÐsåb¬¬z‹yÄ…K’þžÓeT¥øì’ÈâbøMv»zôßà´¶ãÍgfÍÞNõƽ”3¢©ÞbV]Û÷‡ 鲩÷’¨ÑmøYZ·+aÿ·OqÍÅýꤔñýзÒä8¿+ÐÃ-k㎰´ ‡ÕÖÛa_7‰[ b^ö­Ã·rš{e†17ô;®z‹œ0åõ6q§þl;ɵ»‡ñóýaÀ#8féËhÀ—%â«LùÜ¡{®íxù+mwë 䥬.!gæ÷y¿»æq(Îmí¤<êü)·^~Áx)Wש­£u~Îö›ât"¯²9ãÅE<žFýÔ„߬p®è‡}.2´á¹ ;RÙ¤¥}Lùrõµ"ø»®w£¸Å'±Q{Wâ÷ä¾ÙUz´Ï{rë¾½Ð7ÓY”7Án{úf6ü@Êe»£ýÀ¯h&£* ú¥VVöõò÷s¢ÞsØ••kÃZÄOA±ûÈÇ• ʧõ¹&2[«…0ÞJÑõ§ŸÀ&ýl’)¾>— >3‰~‘¦>løÝòèÖ¯1~‚õxú$ÀvõO?øÙ|£J™òÔÝŒvÃ8ǯ œ‚^)+üâß ¾2Ë矜…qÌ»Ä /CÎý Ù•ÔW+m ÜÔ°ƒêŠkÒ|mRÁq:¯Q-¦œGëPG­?òCþ—ÝÍGçIÓTFd"0oHç>f ?’´ëbüh^ý¹£]gUÝ‹>ŒþõÅØVÐ-ò[K1ø¢·rýFU:?ò¶s"­Gñ?Θ9Y=ÝÇUxÅ›ºÊ¿5þæ;Æ 5äJK[=— ~É=.© |-eõu©O›ÇÌ Uª¬ý^NûUwsKiþcn°ü[á-çyð8Öä>HÆwÂÇô—P¨ü°¨u¼Ï)ãžÕ£`û=n— þÏ\ú«0ž¿¤çaªãP”Ïe8)ò—<ù€Û±¾åM Å~EÎáøNʆ»'h="úr„Ÿ ä,ÌùL3ñ×L·¤n-þ9ù4tø’¸ãGOÅ!OÃÒ‡5a7¾5Í-Ÿ‰»ì· p¦­ý“þ†Ö §[Æt ®;yù;ÕcH3_óòM§óÆV€Ž!CÓE¿çÈ„¯„·‡IŒãͬ“¾ºô›©­Ï üIø)ùr›ú¡åðöVxn7 xl¯Ï)cbœ0k)‹òc´¿ûç§Á .NÙ´ÁÂÄ:øËšÍkŽ€Ž%QŸÛ‚ÁÏÆÈš øÝ©(œ—üË}Ó}Äsa|ø)¯ck—õè’þЋñž…>é)¬ƒtþ$çÙ…ä3ï¤w¨lá¾ |Ùà‡›vþÎSø?¡a׿uˆÒ}6LéÂ8^ Æò.d÷o½zEõ“Ê…tù™ÿž?)^]ýfJñw„^;Oå}¹þßöœQxaÏ$ø)©KžTO-D¶¦ŸÎ5%TÙm•Ý"ûƒ-xÀO1«ï  ÏšíŠq|IN›ï-¡õ ªÁ´_¤ ôv &§®²üæštzÕJ93|ö#ÁÊ+Í~˨zµîšOÛàHó?ßÀ%a=ð[{ÅÝÎÃþgG´ò° 'lý¥Ob\‘‰vlšäÇOôœnK낯ö+ã2ü¶\8l¿Û ¦|#=š–¸z:¾›öîn1ÕQÉØ©fÏ…ùN|×Õ?Õ˜•(/AÁÈš¨'Oç|=™[t\Á¯¡òÜ2ðÃÎ1§ÒŠæ÷×¾fñƒ^…NÓšeOÇsoêJ¥:&M…—©¾qô ÿgðÿ.;×!|¯85ÊÿþuÐY0iå]È}P€Á$:—^¶Ãi‡&ôbÕíHƒQàU,wzç(åÝD§‹¹â~éöß•~³ˆ?ïìoÁå<vܹÙþìeêCÈc¹NÓ· ƒsžûîO€·¬ÞÏ;vŽÍ'ç¥ùËŽ;~?t,Ý.nE~ÂçNÿGÊGÊŽfÞ\‰i×£¿Ñþ­Öû(Êß]yàû3‡½4S“{Aum‚rã*ÎBÞ4Œ_ýi¦uÔ´ÊeÔ!¥oOÝ/ª÷­¸2ò-Æwmyîó”â´[íÙÔç->ØþÆz1ؽáo¾Ñº}zÌžAðg¡§=ÛŠæ­‚Î:ƒŽù²M¢óË!G=–©Áà§•Ä´Tª3ïÓð® à1gÄn}‚^8à}pëx:v!À*±T ràü9lÛsÐ'bFùë“ùû½è>ø§}¬ã”oâð[¸ÔˆâUïEcø?™?¢ÕEÐm¼ò±¼-ô4Xtû0äJ=Qã ­oÔ GÈ#žq¸t0þ$ÊÄØ÷%ô"»¸Ä2÷>O‡,™Ý´¿`,¤…÷¢$¢—CÞ™íø]:÷–íO1‡¿Ÿžúh—fÙŽ‚.!W_DqocOæƒYsDvQÿc çŠ3¬ÿL?£µ-Û?B>'ßn CœblxÜÎ9.ÑX,Oó‡ÅÏlâbHÌ3üŒ÷“õ=÷Ž÷‚Îþ{G‚ŸŒ‰ò˜#í= x[âB )>©jßBû¦6Îý_A‡BÉÙ]ƒ§á7vßf$ßYñqâ_­¦A-ô}ÿ ÕЇàlÙJ‚ÓX,q ՋԷΤõ³Ó›Aó­ ×Ï<Z}¡ß·¶žûCëÛ3.RLëL‘¬qÐ)0°ôÏðÙ¡|fúšÏåÈÕàûýkòÛ ¹8²Ò¦ý$ý¼¨µjÿ;*îH":Æû=oè„=¸f¢KõUb#›×{ßps³m(ŸÄгqù2…¸ÓesPí·ÝÛÉÚÞ zŸܵöËFØü8é››ûå·TçÐ?ýZ:ÑÙmª,­+D'ŽNÅ{÷F5¨Îv×~™…à÷Ý3U¥uå&'ÈŠµxk¾¾ä%ÄŒµ›îéx/¦5Éíž‹?ô-€öñͧÉ/…IÜϲ}=â“:d„÷ ÷7L⼎{/ޝ¤ºGÑzutoðµ­€«@ÛJ„ò¸SowáƒÝÍ)ž³rÆ^ï—ª ¸>ÎøórŸ°éƒSð ^½Mñ”ÌÖÈ]rÎÀFgø×¸Ýkå¨ÎH¬Jýün¾Äö—øç*äÝdú›ëZR?If楕O@‡ Osß² î+£+#—]@ý$ê§íšª¸2ÿÇŸÑW£þbXŸêiÞ¶µzî$.†Ö®uNTO%ì`×äDà—`T§½‘âÇ»ú'1¯Iýe>ýä=ära-§UHc~¸VqYgÚÁo·»üK©npoÄ-z_xÎgêËn1!óO>ø–P¨Àþ¸êüfÏz€ï; öÎA\ìè|é†ñü¹Ô¾ŸvOµ .¦q–Ú¶£sºìØU©ˆïÙ/ 2á÷bÔg¯L¢õƒüŸFÒ•TOtíÎM¤ß~I†¿Ž4œú$ö>áÆÛè‰]íöiTfáñlÿË€7Ò¤H­ö5I{êý·Û©îƒ§ϳÚy"¨ß³¶~¾ø7Øðë'âˆH³]T¯,¹½¨•{GõàóIÔ÷˜¥?àLûmÞi«\`çl”?<Ãøþ&n2À;ÌàÃlÄçúÊ ldøö ÆÝy¾½=¯~É°!àZ¦ø¬ƒòƒv½YÄ þxoî2 Çÿ©¡r‘Ñ—㨟{” ·“öóë‡b^íw¨Ù™ú÷T2M—IQT¶I?W¶ñ nÐ'ðæ§h‚Ã~ñ»‡doY×>§"ÎþaÑñ q½Ó–º±@Ø…¬ÜâSÈ•’+¯!oz§—¥ºDq絟ÿ§~±ÆµCÜÝÿ¶¿‘÷¾Þ"} *ŸÁ²‚ßôœòêÊ@î¿ã™Ð¼Þì—tžÒ}xR ù’›ââsð]§«¿S=ûˆk‡éÅjkª£½Èfd=àMŸx^[þÇFÔˆú€1Š´á­¯Ý%ýöv»ûæ=øîQCûïNâMÓº!OîsŠ^Á^'½¹ ?ä(oÚ xƒŒh.„U˜Ÿ.BûÑnO#õàß8^/Ž/üDqT®…Ånkß+ŸÆ5&Szú6øÓ´G&¢Y;vSıAÐÙs”Wú'{_u­ßOþÔ*` }4OªIv‘7ßQýH?AÊ+ 7·TÑ¡}ȧ}+iýµ,gRøh~iìDô-4K~ŒÖ!…µŒ–Öà»aJNÓ+h?$%ä17ðqv–ЄŸ÷Ù ú˜°¶^Ð ðúG,)2ûGþEnÛmeÐÍÿSú鯎Է÷ ­O9Eçðó^ß±~F¾›pvhï,ø!/ãF³Ý »_RÑê2šÿVólR|ùgÝîþÇ™uÏ ï‘µ1.BCÚ]ç…Óy¡¼›m £ê†™O¡Œ« ùh],œßjPpY­}{ ôpéã¹³ ã:–+8÷áw¦Æ£QqØ{ƒsi½3tì­ ÷š»Ë"¨ÞRÈ‹v]è¥#¯¾ÃàëÀJïyÆü·<ùd|•!¿(ŸÛ­#‹q£*ë4@çå<&“¨n¾§”LâoΤé“_S]Í ó·¶[§oqoØÖe“$ÿ<ƒ=÷“Ôûyéï¹4FÞªêºS–Û½oª§EâèS‚û»xãUØŸ¤ëŒ?t®-r3Û^q‡w²èEŠ—ØŽ§­¶ŒP?X¡ÍÅäŸV­}Bëüñ£Æ|{aTêêçHa|—n»•TŸƒeªªú±aÉvŠ¿µ£ÔO7ÿÕFPÈÒ`^È¥‡ün§¹€×ÖUHð øç·r%7/åŸìýÐprgÔWø|µÑß÷˜ç¥‹iÝáéÉ_~+Í·ä?ë/û(àu æ¹½ÏEôì/¬†¼¥ì^'Mû\â¤âÀ/÷þY‚±xÞmÉ~Óןåú%ñîø=q±ÁTI}ÌgþÛϳHΠwý ¼Ç{i.åãø{§¤jR¼$Âj$ùKMŠ­êj€}f+}äÄþP±bÁ/û~öйºÅñ_*¢ù‰U_ØNüžÔÒXó›ðòxøžÖ ˜w^ìÀ81C²Â…÷W}«äÀ‹ûJÝ [áQÐÃüý!×ïŸs¸^¿™¨±ëì.àeTGó  «òËOi?x8$¯þÈ-E¨ì®Þ‹:öà;~A~©Eð¾«g„rKÖðÅ÷¾®Ð؈ÑÙú†ˆ[âxUÞ«ê@ ·ËÒ¾ŽFŒßB|×@UBˆú›EÕŸŠÀ5|’ÁYß(s:øêbõ±˜æ/ŽÍF©à§•ó<9È-czÙ–À7k\¤®–æ[ÎgôpÕXXüó†Ù”å‡?’¼H}‘Û }tNáÏn†? éH2Kþ…¥ìPÙ y7S¤zòÑŠÓù} Ÿ‰&œÉa¿­žFôn|ÕërˆŸ'ŽMÍ#y2½“¿\˜úŠäÞ¥ÓÎmíÿÃøã?žÆÿ;>øŸ] áÚym¾°+š×áßÿsBš×gƒ/n\9å’´<Ã3gó‡Qyþ»´_'X0pÄî¾õÏ…eô+@]ùÜ^QÜjºØwô© ö;»Â\Tžéç‚&Ÿî= ½ðxfÞrx…kyÅ@NÜ·oZCóÖ×WZqL.ÍÒ¤ýÀ™†UƒÐCŽ\²h^^.íÛFOÜþS¦õPœç™ýãè› ž ¬ º%N(¦:yFRÝ4£´¾3ÔÏÖ<ðx/åa8mNP¡õ5sé¤ Š æ\)÷c?7þ§}Âzu½¬_TU„Oÿ»G^7yü¬¥Í¨î—Îô=”±<Ô{°â}%i† ÞS^ó ŠêÒX­,Ø(ÌÅuî×*óáf²ÿ›V,8|}}oM=¤†¦sïÞ¾C˜TïæÛË=Ð;Žà‘\Ú>u]trlˆÍÁs}»gRæ€}ÑÓ`§gX.q£¼·[kéü`¤jê„l|?&ÿ@àârí4 ®m4Oàá]oKusf\¿ƒxËöj»àa|Ïi(Ò;ø/¿üWÒ Þ ÒS]úÿ-æ‡ou½ßr竪HŸÃý»\´ïxãÁ"ÐÁéÔÖïqàÓòXýO(þê¿ðq)îã— îÞ»ïèþ3‡ê…-Ý=KØQ”ê‹ÄÜx*zx};ÇÀ{÷楺™®´Ñú~ωm ¡÷æš+gÑ9ýc Ž¢Ðƒ8¥Éʘ?yÝ÷| n¸¸WàûOawËç rš½Ï‘ò6t{ŸdFNgvä5Þrljó®Ô‡K`ÙCÀç3œÓóoF˜Ö<':ëpqŽëÃÓãÏñ*.ƒŒsÁ7Àáïø]Ü®úØ­¾Û=vyv{KH|š·1óK_§wMŠ sˆÌ‡‡Z€OmÙήx>·¼3¡ûð]ÿTê9ôFÝλˆêßXH=ŸAu¥j¬ø•5é;º ´OÛ`µd-ü¦¯çNóËxßnaJ=ÕQv]Üý’òI}¯”]³ìÅŸ!>8÷Sú´ä“¶»A²úå]¼à¨åE}ÝÓ¢ÆÞPÿ%ŸË‚û©ß¸~ðòëµà»(f÷¯,èoú›Òà—nú&EÚÏq“Äí ¹´›«—J~’­”VÀÁüØõvñ:Sâÿ¶¦]€+¶·0mÉŧÙ1OA™´‡E»)®4¬f(#Žôíy ùà„‡e˜Þ)¦>2róè¼AÐñ«YT×P&Y«ƒúIÙäI–Ñ9l7ÑI´îþ\ \ÿkü8¶NÏ3u#h½ÞþˋהýzUVøaog¨|c^?$ûï“Ðmüpé¤ЧþÏš‡*’êq™5ù7õ·ˆÒÚQºZ\þ0Ó÷.Bz+¡§Qe鳿­Æù'èGâäÇc§³‹Jë0¾çhù9;?v£?ðóº~ ôu¾ }êÅóg-9 ™ä{ñô7ªË…£ûÌòyÓŃy­Óâp¶S-ÕÝU—º øgnåýDyÅÿ½2´•ýê#IŸzÆâoÔ6ëùÐwNhç AAõíRï>FûíiÂKW|¦÷ȯQþµ¸ûµÔßêë2'¼ïÙ'²« |sŸ§URŽ¸Çª½voøÿM@ã ôÍ=ü`Ä>З©{¶ö$tŠöŠS.umÅ{ï"žS{1Ž——õqv #{/:väB•ohŒê5Û ì¹¶¡ŸæÃ¥Vް¯rÜ«¨ë6¿Õcèã×¢½x.íwQR›;²ÐŠÀw<>ò}¡¾´M_ µ`¿Ò’l È.9©Ië&‚%ƒ´¿¸‰w!äùçOùjس™ªÃlA²ƒÜRIG!g!15J ðýàÒ¯ÊÈ›~œ­@~yQÉ ZXÚÑöü0Éž’¸‹øìÚ¶™Ÿøšn¤7 q»wî™;I¯‚.M¦~J•ŒeÜ/jÊß<—ÖIÎ]¼i{—úPW,Ô¿B%5ú#NÊ6¼›¿\nðã¦X7Ü~zeO=ñpšL‘ÙÀGvò8¯$ð÷ér±âƽïÞ{;.îü•įٗv•ëtÞ)¾/S§v;ìTä2ª ë~8Ñ|ø–˜ÿûÕöÝ"#}úåüë±,|NN·Š½3Bõ俟r"=å±êúBóF3‰W}S‡¼?)Ÿ;\4òÁȹ¥tÂ)àyrUÙWš—,¨<ôáÿÓÜQ|¿í€&øîv©Ù¦òßõÎÿ÷\lÖÕa zÿŠÿäC×·±3ìþ£±CÔg„Çç8ùï}V&ÐÓ…£ ¨oy}´ÏQèGè@^¡>žŸºú;åók‹Ÿ=9øÆGˆ)p¶#Žj4PÚþ†/òžl ¾Fné6ƒ?ð~öðö[ÐÛxëFy¼ã\µ›öñƒö}úJy‰FŒC5ˆÿS¹¿,:ȃûóÖÐþ°‡ÀG‰ <'<39”úK‡½ý(L}/ÝŸ0p\•batî/`lšZüYfökÈI>»ÛmŠ<èî‘z”òî]ÍfœÞ‰óÏY{Á99Dy­‰­mglõ¹ ¿ t7 aüPÖõ?FàGض‡çº¡¿ÊʯÖѺ”ór³g­Ðkãkw([Á¨³’òÝן³*–/u‹¶ yôdíQYðÁëåu½jÈE(K~ÆZ—r*ÿ…÷´v}‰ç¾æfñ;©ÞYøãÍ% #ÛeSãHôïöÝ6êãݺWrcåÒªHë‰~Ÿï\\~3c‹¥ë(^×Ujê z>Œ§üqï2ð-Ã×”I—/û¸"žÕˆß#‡ï8鯟ûßIÛ—øÚf'ùÏ— ʯ½œ`©KynëŽó]‚„¬È?Hñà·cƒk©?¬ëô›ÀO¶%n5哦~›ríà/|‡ïËà à³f­:«¹íßq©}Ù¢·T þÀ9¯GfÇèéÛ _Úþª¼÷‡€ù†ÔŸ'ec^Ÿ+èãœu¹'öhåÚZßqØg·¢.ÊSdϨýÍ>ò¢Ç‡jqo2ÿë êËä<¸>ó)ä‰iêuirn¾Y(„úÑ̽›óŒæ ïã%hŸÒ8òÓV§\®sãöÓè}›¯;Y‡gÈJž±ä­±Û=£º5ƇŸN‚º4|EõY^>? »f5p˶òáuíñlÀã»Êr<ôµ^ô¶ñ¾'£rfxR.­¯ûX úÙ¿Y¿å$äbJáÁK4¯´nÉW¡}_/#ëè·©«Å0þ÷ú=¼–ú–¼žËOùÇì’jg1Èoœýó%½´.,þç®Rðvd ;?ÿƒ›ÞP<å{³L |_r’µ¥—ú°mSOÃ8¶Ò™ÔÎõY\h/à}½â†äcI%W-õ‘Œ˜®DçA%D~½ žÚ§òt³v5]°ð„±5”Á}¨.K;ÿ/›Óº|ô$èÔ¼%é»?ÕÏ,¡u“lï(<ñzÀ°pzm«­úË?ã ò qÀÁLè]=øêÉNp óÌ1•]3Aw†ÜÎHòWfüú‘JxÎÄRw8üfk<¡úŠzfÅSþaªæïóѰ»E·\Ä ?qæ¡÷!·{’ÒºfªTç[ø—Ä‚¨«Ç¢?î’¦ü÷ýv6{éá¯wg_ž=Þ ¿À0vµ9æ_[RDqS­§_ÆeÎlÝu»’òôOw_CO3ꯧXYÞæâˆHi¤|"?•O÷á¿·KæR¾züü¹ÔgÝôQ*7õK?åqd@ t£¾1ñ¡eÛu?ªKãÔª"Û ~Ä…–n{…q5žŠ™.öíGz¹ g„TÍ{ȧÓp§[5ð²ìárO}CÝx£4)ÞqËßvüõÁ ‘ÕÅw,Ê$y€‡Åº3Í,Ø Ï^‰)t®3åè×}Øóþñ#ú°ËýÊRd¯#:z¾„S]%§À•Y\“õˆÞüÑT¿×MÃG'öeSXÌ+ªÇ}ð®êY|IÔO,üÔÌÀVøåÉ"¦,èÿéqèvŠc¸LÙJ“¡OËv{­†^Y'E£>•aƒ%÷hß4 ­]¼~"ð~ /ŸžK™×r?—ê]¾ößU3Ïë\8‚Z'Þƒ§«Ÿïâ½U7~Î+ÀïÌOËk§šüqs§þ·Z*2¥wñ¾©âçZÿN.’8¬&Eç¼ÒÞAO¢öŸ8Ú‹¸H³SSø<Å‹qý¨NN´ò—|5ªÓq²îÆÅÿoÿݵ¦”ê.:ù¾õ·üÿ‰’ï·,ëÅwSKÔ£ø ᯓ~(_‚f.·Ä•Ù}ÿÞ\ðÇ1ëÛVê›kÞ}šü™Q‡Ç¶c¸w6nÍŽ¦uEÆÕŽÙ­àÇy›íáÜŒôù)/?éÊ9 ÷+÷žîx2[Zj¢îm|v—Óz@nWíõ߸2kïŽÑy…:¡ÍàëËz|+ü Ù>ó»™ÖŸÖêPžk‚¾ê©'Ǩž@$g€è&¢|]xâÄš]šÿ§/Qç':Wè°éíVªkê¾YÖ}öΪê‚2õm[|¸üÏ-|/ÜÊT©q\²é¯ ŒaØ}s=_<—øÊ‡7óá0O׊ƒ¢<¶l§ú[ìæ) §Ëææ'Ð/Õ‚ÑõÙøŽjOXèàešPä$rº&Ÿä†/uß:÷®ÇWyßßuü¸eÌð,wr2Á÷ YÅÆÔçMjÎÅÛ‡çòYþ+£@çlK×rQØûŠx³§Wè<ó%·ÞÈi`{,è¸âäS:oá:Q` vÂãõa-äÊjzö‚™+—©m2Gàg¶MÛÙ…û˜+ã{'ïÇwÙW¾Èà=åÏöµ®¨#Ovƒ¼‡\/|½ò¦7Ûcl2žÛÕ}*âhˤUaÔ7ÃèhòÝFÿöûæsN—ç×}E¼$÷ßVþ°¥M1ˆ§ó~ ZSžÊš \_UÖ¯´Š ‡…tîmëÜLȋՖKÇ(ß'©¡€“±úÅðZ-NçA~%Jƒ~e³ÏAÞ“F:›Æ'îյޏ% D½Büwoû-:x;ïÈun€ÝP¿^Cùâf¶œeä§Ìu_l¦úi ¸ïÝC|ÆëBu9u› +þ#Ç#egÁϳ0ç„¶u^Ñù‹''èòtš¿Äùý†ßŠ*ç—¤>>Kݹ'OߺŒÁw¢çû»Íúû3ÿÞùúoD‡’ùÚϸEª#ùT'cq¯¨ÕiY+iÉ_=Õ~¥Qÿ›=ù£Ôƒå ðº óPç «ƒß‚>¢3Ç-A‡˜‡ÕÓÈo:jŽƒ=×ËþCõŸ½ï‰ ÚÃÞ+\[z•ò&ð‰ѹr߆Q¥5¸×È9sók†'<žò-¤M ð¾}EŒ(s°Ó©iÔ‹´§IÒº“ÉÐn‘[xßkǯ ßÀLj»szï@nlKIþ§¿ïÂ/lÐɲµøÅgüo~Bä>Ü%Ãu­ž_è䢯òü~—Š~¢tŒæý3./1¬ä]û1ŽÜáûêTŸÄN¦®›ò®RC£i]ͨQãäÕ”_?ùÑ}ꊜ'øŽ‰ü^ZïöÌÙt‡ö!ç#àPϹíHu%ܳ¯¦P}OÙ¶õŸÁ?†oÕ‰y]Ïl0PY’âÍÍéý$ÿaÇ&.m„^ÄÇN}8ƒçJÉ&Z¿ [¥ñÐp©Z‰'ºà¹yÏKÁx?®(&ã1®OÞ\‘¢ø}1{~Œá&|b0äuqĘ4éMRI½€+âÅéÜI,šÿD‹Ë‚} 6”ÒÂ÷¢¤š›WÆmí< ÿaýå{4Þ7Üt>{=ž÷¼«rtpZ±± x8±öÿ¤z{![ï¹ÀŸ®à2†~³\ÊÂã}¯áõ;Îbï­5å™XÊ}øIz£Æ]4}`ýnæ8Q^§§©õ••àÓÉZ—c…îcå!>ñ:ÎëŒ8‚~ý°×äþ¿~öKƒŸÔ‡Õk1¿&“⣣2jÈDí;°¸ãïs‰óG)Ž8רOûoÞÆ²„Çügn™ ?SdÞK øíø‹w¾—ÂÔoØCçBsåêÄ6_§>v?Ç©N®É5Ù#Ã4O8Õ(½WYË%º³A¿öè¯-4⿃äösK‰(ü¹Û{sØk¦ŠO#í³²™;!Ïi›ov³'óŸÕÅÉoÙÑ6ïÇî·ÿ‚5€+øpsôÐÒe²õ+4 Þ$¶‰â­8ÉDª÷§x$óõ‹4«¾j ºú ¦ñÀÞøžå·W…¿ ã<·oÝ ¶·šªýfËæ\£¸RqÎ!ÈGP¬«¥ ô´ðMùÁkáˆßw–BOâx•#>]a‡ùGEÝ}+Õ#µËu„%Y¾”g¶µpÛNàμ*¦Gy9Bƒ|k Wñþ†« ±Øë´ÎÁ]ßóÇv꼌ú­Æç%·rã÷HÍzuài49ÝŸðõzäÐÁ„|YÌh w%ÿ  l#å!üa®Ñ·"=Zqú».ž+Aó‘,‹—7~þwèÓwòùyÀÁžõÈHG™úÏMì¡z3FZ ½p ¬¶á¦ý!¦`ç9gðËn—Ä€äVsöÁ¥ ä_šâ¤¼Ú¨þÎôå7!K§—,}‰÷õ6}Ás^K¥þ>Ÿ/µÚ;û{ag0®³XÊJ[ø;“-gÒ¼ž©70íÙ“€îGÔoyÎÔo$¸â¢ÌsZïÕš|ì:ðŒ˜áÖÙ @ý.ñQ?½‡ÛZh_Ý›sðèaÔ¹+àRÛ?ð«‰ì÷Â8VÁÔ'6ÈheÛؙȷNÅ A•ìi@¯p›=“·Ký}‘;wÔ†c[~€â8;Óyvu ®Rà+~íä[Z¯ðtRJ{¶¹»t<Æ ÒÿÍ »ãzç‹ìDèÀ7Á™ ƒM㢨ÈódIÌTàÉÌ–O^zÊOÚðò=‚™üý†€Gõ‡ðªsžØª¾ó!n-qÐ/\ŸgÍ}ÌË‚Ôf´¹âêî*QòŸu}õ­;~^­Üâ#™€G÷æ½²:\ïE/äˆðï¹à 9J|r^?‹æ‘Y·ì)¾Ÿ¡}Æ|JßGyfgt÷mBÜ3OxxûsuRÜ/5ð¸ë^V ày"rlÏëzȽ;LqØÙC¥Ôζ¦qOðôÎoÒÝ9Âe8h<¦Mõ5MFæ•%ù\-=ö’Ì60¦¼Ç«v‚ÿa¾÷ϧà>ÐÊ·f;è¸|]G7ðõÏä®í¿$M/,¦¾ë‰<‘ç’“@Þ/O©ÿ€Æš‹ÅóÁÚ“ºaÏŸì3¬€\˜ž¿ Er·EÉÇp9ߪ¡õ§u/§@þÒMzo ƒ~>wø£i_5pós_#Ã9¬#?gþ}Ñ2§>.NÒˆãà~²?쾇†Ïdª«ß4œûx«ö”­VÅóž{_,ø‰ïx›¬Ó£º¶i/,ßc<ÿó_þ ùÍ®!¿.ÐÙɳ¹¿ ü÷Íûü5p›y EÓ:cäO‰Cˆ“–ôÓºPàÉw=ÙÐãÅÝ%e”ïäèl§{|f'~PzJûr¼m¼šT×Çü0 ãDWÞË ¢ùlK&oé/êóešjŒï%o5qýõ 0 pûí)°,!)Þ¿n€&]Õ5xßyŸˆ°4ì ¹\[üè¹vWÉ÷;€Ãš-ñÄt¶n[˜A}M­ß°OÒ9fµï0^k“Ê9Ê#ÐåêÞzD/|7þ3d´Áù8ìóôž[ð~€µa(àì/ìžHù¼RðÝÛƒç¸ègËîÛ~ ðz1ŒÑz3³iÝ~úý멊 c´gÁÏïàShŠóëd쥔1>Ãýîæ€C/_ô #Õ—ÑM«|ÚÒ~»©nÖ–ô‚”77åÖó ó—¬×Wþ'„~š+-=‹úé¸z½Z¤LuãÝV%ÈNþ»NÊÑ8PªDôty ú‡å¹‚ý¸2ÈGõ”¢'ïáá_pS:#åŽx0ÝíÕ ÄÅÖç.+QoNÑÉû éœþ·S T‡‹×…Ï—æE¡>€g^ñ³„5ð‡™½oŽ”Ø%É øS¶õëEG0^d”׫U`x¿Ÿý-8OÊ¿Ý~Ú (¾¦u˜0£îµAÆö‚ëŸð={;þ Ó)5óÃ<”£Þ—Eëò>þ[è÷˜“?vìEœ!ÈYwø9ü±Žô Vuƒý>÷!":­Ÿâ½°Ë¢¿`¯¤­6ZÛІL^äê:Ĭèè8>¤ |<àFù×­smè9ãxçÀfê·•@uÈíÔÇl’ªxßiÈÒ9 ŽÂŒëªsÞÜ\qj»œ¬6­§½¹1H}¹]â4onüáÞBã{ŽO¦G?©xÔrû¼óeý0Å‘>Kf£ú7‹âAÈ«UáhÎYÒ7ï~#ØmŽ“ì´7Ó(dó¯MþÐǦ¶³![ƒVËí¢À3>ø³¹ñÚý…{ aºvó–€¾±Ù‡Ø´ÏâÕüöæzÈ;£åPÍ>ÐÉ\MµŸú$¹<“ ì¦8¬+ÿ&¿Œ”I±6€Þ¦g•ñVˆqÕ!OÌg´dœø+Oÿ“+‹žûÇPŸn:gÆöÝúè×¹?-¥%4OñîðÛÆ <Œ_NÛAçÇÝ?g¾3€¼„儬œOz]³©àpø_yŽ/Ûú…ú ¸[”Îè?\=Oz º-ÓÒälÄ8fF‡R}¢À† ¢Õ€Ï0ED|ᄸ¾ã§~ºa½Œ,Ø»)«N°©/›yí¡_xÏíëëׇçÂýÏÛ§\›ï„_æxþ9ÈtÅø.Jê›Ð~8oϱ‰[þâ;à06Jr{v£2ì{BÍJÈwâ—wÊMÐ÷˜[YÉÛ@ŸY¬—åÿˆ×ÜÄBy…Àg/#Õ5LÂÛIŸòÉcûv}A\Á‰ b|+ƒNUèÙ$úÿùn¥}£~n³˜zø§êYÛ)_!RøØS=òjoÓº] »m àô|¬Áò‡¿Zþ~‡yä@ÿÙì'zm·Æ7³%êÙ¸Iݨå2¯:š„y,®l¾,À“¼ü¶±8ž÷q>lÖ{§¨¶¾.pëß[hLûl–E|…Ô÷׺'ü$õ¿2 Šæ¡:AÕ èCX÷•9WÇG6‡Œj?ÞôY zDŸöi´„ñ õm¥y„“óµœNŠãî»0÷Þ +zópå·3òÍý˜Ã|ØUr"7A÷BÀlÏÐß¹wí7³óÍoÌÿLëMû?Ì>‡N ¢ú5ìYâ܈—´—¯ê"}wê½n˜zÈ¿ßY“Kö¹îUo:ù¿Os‡pïØÕ[È„½cndšåÀOo}Y?ú2ç×5ο˜“UŠøÐxyN¨ÐݘÉuzxN=ùØ0ÕÏHŒï+í‡?‰—bž>1!üï`'£õU@ׇy¸b郷þx>T/k$ ð¸ÜÆ=ˆïª¸*Q<°J5‘êH9Öúý&mßO~ÒãzÙ=ÊS6Ÿï¨Ez³`Šè):/¢¬¬kà3ûüY…úÛ¨¸Ýnĸ޵<”¯në\Eùŵg~2oãÞ¹";|p>'QvãÊýÜEuˆ²t$¹â é|ß¼W §qÌŽ) ¤OgªxÉ…ÙeòÖA/V]û>ó.ðYÓú˜?áØoè5‰Öà ǪÌlñÿ–†µ²ëgçñjü¿ô‘Lÿ¤Ï¤|t§™Ÿ¼'ÔRCÅ´,«?çò²Ó^Tö÷†æ¶­à£É‘yG®ÿK;Q_W³…ëVá>€±t^øèøÒýÒMÐÇyíüIª°Gq:løöwÑ÷4Š]{G>øø¯„|¸I ­yú™°ë£|{f®‚#Õ%Zäºa°ú®'½Â5bwá4Ê£ˆ qÜ­ðŸ:ËúA§ÉmsiÒxb¤F ÅáÅ“:ŽˆÉ¯ý™ø^ ‡™MýX“wœtÀ¼,zÇUv'ôݵ,ÝÁv#TÒ{EäÄcÆËޝ€×¿cþ<þ,’Z6Nö}UH/ßË÷5\È¡óRASžƒþQ á{açÍ7Kôì|Úv¡#â4oŒ[Ë»vO÷ñ'¥šwN_½šöcM¯o¼Açlª5çøÑ¼³]â‚+ôîÿ^Ídž‹#îd°´VFÝ®¸Ku¢˜Ã¥Í1°—¶gÒÁ~Ä ¤çCÞØº³uîa>]\™qz3òI™âócwD¸ñ|ÎÖvYªãÞÍn ¼Ë‘ælÚgÉIÓ¡óUa?/ŠÍ]Ó¬y²&5@/޵üÜ^I} íÖù¿À8q<1Ÿãx^ÒúŒïYÊM•Tƒ~ûÊÄŽ†S|ÑZy‰üïÿéoΈþj/Ƈï„ßöÏTŸ½W_ªÒdÒþâk¥Ð…õõœð1ðOã¢þÉI\û„{L•ÚQˆ÷ýv ?¤úaÓ^Ϲ¹rK.º¥Kz\|û{솥âý\Ð;.ˬ™êÌx˜\÷¥ºÌíÒÑ´>g~»|üsÏîú¹ÐWK÷¨ßx˜ãÜöbZÏÙb¸‹òµ= ×ý øzeZ“i•¹áÖ6SÈGH^¢¿= Hœ"ÙRŒ÷¦íýì*­ ß‘øÌˆ§y3)J[ü3JÝ|vŽa”œ~’ìlœó«òÔæ¿òã–uZà þ!‹—µúÆ PñºCöÄç!ãòð Tšp'qhˆfƒúÎß-à ýsÓ/ï§þð~‰jí; ‹Ô{Ûxr)OjMZ#ðc« w’ýwžÜêÕ >8ß^³pX/ÛÄ^Eq¶ ¦õѳð‰ª#>_:ò úíþj™“ èäYâÅ·zb—Ùëušâ£gÝK(_8Çþå9~ÄiÞY§›‰qQK,üðžéõ=Õ€×1+mO±ð_üŒ2ÃR>@R¹ï6y¼§gd“ÝŠïIÛ½£xð×wmª3d“p›êÁY›¹õµC~"mãª~0i}ä«Õ¥ö«é[=ÐsÌRk¦ù¬äí‹7!G•'žæP¾PÍú.àcí]÷¸ã빯ßNõÝÂ÷» Q^]SçBª¯¨çpS‚ê–³›r¿š¿¸8ÃçûAßPÏϲ݈wüNï ¦ó'‹BÕ¶QžSxGûéVÈ•ßyLjI s ‹µ\ì”QFÅÚ.:wúÊHˆò ~9=> -­yAëMoê/$ƒnþ.óhŸÑ½YuØãêŽv\:aô—ÏNþü:EóøÓÇ9¯|J‹`o?µÂ‘Œ»üKd-ÕUôôZl{ ï{Oøtœò#Ý;MäA>½Åïº}Áø¦ë«ã)ÏÇéý¬’ò{3\2»qõt5Xú:jðéFÃ…îú|ŸöÝ7}›øÏ»WpצøÉ­ðl'ío—¯kïCÜéc=zz¾üp®ü,Àå(8eŽ5ôÆÔè° ã.?ønÚz’[>­U´ÏÉ ›¹®øK¬{.@}Š<~¿|BùŊۊ̨ϢJÇæ_¼%*Ý,)ÏÇGæCð ài{ÒuÑfš7œ~öôcܹ÷zŒæ¯éíg1ßex °÷¥À?šJD®¤¾ ±ö‹d>Q^Lg[bÞ7: é"<ƒ4ŽBÜjÁÒ0¦yÝŽÖá °Û^‡sÃõ ·Ëõ ð»nËœÀ²‡^ñV? v+)¯À'â¨éúÿNã7:Çì7EðéÚ~ÊoV¥ýñC»i=¾ÂZ‰ÖE—_HuÚA~D,·üð/ýö9 t –Í¿§>Jt_黄ï¤ö•(N6ƒüιPLë:á¼BÐÏåŠ+怯>+»_A^™:W„ã1~곊éä8«WR?×Q[KÐ%ÌéfU!Ù³£¦Ÿi_íŒÐª{æ9ãÇYGÈm_æævòë¹sÓþC‡ KiÝÂß÷õSðÏE©Ø•ÎÁ{•KüYñ4ä§L3ÅxËWï> ¼ƒTîøƒn»V Ÿƒ?õúmLýŽS ÷ÒyŽÿ¾Ç±ðºóŽêFë–·ŽISœû3o>åSèV=ó+¾ñSjOùo}NÚþª¾ý6â øŽÑdíØJا৛.fÃ^šÚ.ߎ8Ã}®ý"èéÕþd-ó/½3/ñø‹nG!Ã¥[È?¾¿n©>{5§Úѹõèi×û rÑÉÊ ÿíÈsÃÅ|ˆ2­ÜX ¾³í2sÍ`çd¹y¨ß´ïÈ:0ÂIlyíÈSý(”\€ß%zÜGyq5’»Ótpa2Þ€q솜[çý—¯ÿå3#ÌÞVà üIš»Óþ=õÜ©w G.Fjý.€ŸùH´h1âX ‹SÛiþíb5è=³ýü#vn-É‹DòxÛ?âfÓõKx ‡n˜'0"j÷Éݧ}çêñ:tŽNïEn ð5Õªø5 ïKl»¯™ìèOãË­i³5}QtÎÓ©ì[Rì§Dá“=p¯Xð:ƒÎù6~)Lú;ÛIü+îu3‚Ž…ÜhHJ½¡}Û€®yOÖÒ|÷„MëjÊGxxe'{ û`$ ‘Kû­ª”·èðâÅ„ÅÀ/HÞ¢µ˜äñýÔõAÐ+öØ«µÔܶ›¿eDŠÎA¿¹ÔçâŸ^›Gù8.Ý{較ëgo šGó&;Ð|u?í÷+¶´w-ÃsÑîÈÀ5„ÛñÞ ð?ðòû÷$Ϭ5&3•!ßþëçÉP½°ÿû^ð¼Øc"û1o™³°/z8I`ÞDÈC\Ý™¹.øNXI7嵇žÎ¹úq“iÁ‰,ª—ègŸÙIëÔîwËkƒ/ 7͘¸"Î^ó™½ÊÜÅJøœQ¤Nuƒ‚¢ÿ$8CŸu?ÜŸIyê~ {G{h¾¯Ÿ²úñ ðº³-ü¯Â]Å ÏÌsu×ßÓùXÒŒ:ð#P<[Cþ6qjç£^}Œ3è™,Eqõ-¡ñiÿGõf‰ÀÃ%r5“êûåtÏ»5q¨í‹ñ!Zga7(îæàêâw£(q„äõ½Õƒ1’£~†®cá)˜o1¢åöùsÃûglQ+ 8ìfqþqÈÏ¢&“ë Ç¯Œè³\,:'ð@=âÉUâì\ªÇä”çð¼Žæ ý•n+À>D§Ë¾!yèÿbêxÁö(ÁG’‹T_”o^=w;+°]eª÷þ¦®;®æïÿGÙ!IÚŠv(í¥ÛÞ{ïyo{ÜöNKËŠJF‘B•U}l¢"e$;+2BD~Ï×÷ÇÇç¯ó¸ïû~Ÿó:¯óZçœ×pü5xƒä’[ÓÈñÚßögŽa>Z¶ö;õi¿œ9õÅGhyT†P} 9OÍY×€ˆ‹S6È*s9ÅUˆ¾ûÊ&ŠBNÊùx=¢:”jÉj☷– O6ì†ò¨lø]ÈÃÑþ [ЛuÚúÊ7rñ}¼2Å÷Çßÿ²Ïãên/&{øU…U.ÖM°à¢*ùQ0ÕPÞ2­ÜÝ3èÞK+[på Ò¯Žb”·ÃHF»‰îü/}ŸŸ$@ç/ì¾ØŠ9Ù²õV°¹cŠ/øË{gé1ôï÷H¼ˆâiŒ¤MU ?Ò&­±+†|œãŸ“PdfKhä{øŒ5kˆ/Jóg`ÖM>pøk‹¼š\OõìŠD½¨ž’œÇš# O3 )‘ÐK¦Š/'Õû I3žü¿™K‚»È/*¶iþ¼XÐ{NHù´êgTG¸IäÌ?ŒUêÂßn÷¢Ÿ}2¯(&ûý/³? Ç&$¼3¥xGNi<úív_n?¢{©¯!ÏÍ‚?ªUâwÚ^³‘ï4·ß·ê×è$q‚mjŸÓ>)îÈ`®)è#qw ¿¼gøHö7ç8û)žû:5—ú[0O‚ü)µ#vWŸ Q—f%Ý;'?`¼X ¹mS$kþ4}\w˜ ¼¸>m®:9üp§:ÕWI¬{—ù“ðÕmgGvÜ5½…uŒvå-¡zžú>sܵoÊlµÅù—áó°û•Ô5ù7è}÷Ù7ÐOðÁÕ²¢à‡xÏÿ¬9}Xב­“oQ÷MÆšª‡ÒÖ ýÙÐ'}Òð±øR×ÏÄÆéÈS×Û÷”'I%7qÕßòø9¡ä¦»ÓöV!ÒÏü3õÏ&ÿ iÏçt~rõà€ô­¼hºÅvÚ§ˆtÝT#:Èñ(Û þ™ÖTGyÎÍ9O~!• Ú¥à“ð·“„°®¦Ï6OX€þ…z^A®´†1UÖXàý½^càÇg}ô$Ò/BßÍé\áÏ~ÊqnàIgÈÍ`ù¼ÍÑ'!v\gGù_>ÐÌxÕ8ômg»¸ã{y>…­òXŸà©Ó$®a¾]ÉçÓ±nú~¿ª^ãÿhí/ù !wÝã6§-Ä<ŒŠ÷­ýIpM_sÉì€üúBAЩiëw?WÒÏ™9sÈÞ›Ó4Üu•Ÿ:È̓ßáO/•aŸÍðñZ2tÎ…·ž‹Ò Žaþ®/ºUi]vîH!ý>½Èbq6ŵ¼#=cóŠâÓz&M½z4>•@ñöÁ¯Ê®¤>›’ê¹xر}}a(ø#ý +å sœÕzò,Ê›Må£þÆVÔ’=üٕ=¬²ï¥ì ô3Ǭ§r&h]M_4ðì²äËòˆ¿ñÑ­Iiº¦€û@›WwÉ.©•-o‚œÖÖ̤øò¨ø‘9eàw}×@ØŒÈÕŒšK´_[ÅšBõ—X_D«ði#}!6â^"ê³}Z”(ÏBGŒ>/Gn|”ü«“Øg0ž§JQ³ðï´}Û½2è›S>uRè\çÀÍ©—Ñòܹ>ËrŸþ~ä°×õþÓ¥è?ahcäsèƒÔ މ‹G Ÿâò»°nl•“J€+Òà¼9åH‘ÈÍ95;oŒóN(ÕqúbÏúÏÏy´xNp›|06𯘑ñô‘¦öJvZö¹-¥—ÒðÜeîÉýX÷`×Ý™îè/Ác‘>o#Ú©3^b¾Þ‘ªçc^+bç] ¥ûñ¨<ªÇÞë :õ Œ‰Ã8y§³7â÷ŠÃG‚ê0 Y”OÄßmdg5è(1Ê]8ŠòÕº®¹1nÎÁ(LuâF…'º±¿dغíРø¬ô”“G^PœH{ÑÓo´½ð}W$Þ_Ó±ßRä¯\ñ¡Mn%èÔWL¬.xeýs,­ ã9F™%[Ò9ÿ©^ÙéÀR¾çš˜:÷µPP½¤IóÍîìǺy.ýzrÞ/¿'w6ø/êâpq í3z­Ql:¹¶ÿÛ—fs“«ùEñ!~o{?Û„[bÕnŒ{¨iè@)åå¾ùmGåÇœ§xú\¿Çà ÕÙNæ;f_ÕCu’Ú)¾$VâJ^…ù]?SH…þNâ ¢}³›è.ºìäçÃ|Œ'ÿ”Š'y9oQ‘ôxü?e…€Ûlëw²/%­^Þ¿x$l]Ä üF¸3©OyŠ{o¶ñÃ|+è,…÷2¿ôHËô`<ž¬ÙÞ°l}´(^ Fÿ¨sí—>¯7§ûÊDÍÛ^xÏa6Ãé+æ›ü¾Og2Ïÿâ08J@_9wòRÌsA'S §hÃÎ+q[©kÕ û'ùÐófìwSåJc‹t±˜ew<üàÒÀï#:ŽXÿÄZóa ]}|Éü¸lô±Ó ²{õwÌ%?øDo§â >ÐÉïV•;-6 ø“oYN~Õ 7ï>¾Ú˜¿…î õ«Õ§RÞ´D¢u+±¾nLåÊoàc&ãð[˜Px(åo:ÍQF÷ĉû/¾à¦sÁèÆÊ*ЗvI¢ËlŒo¿yuÕ=‹|°Àôžü\w8ø4:a1õèRÈt’pÙ»õæä’<é®ü|¬»%c»õн¶Ñ~g²ëõÃç~rÇ{‰A[^Q]•Ž Ggt˲#ö‰|Òz½å´<ó6§%.ÈÞ¢8ÇäkÙX•+ÎÁ“þž2„ãüòWÉÿÎéúv: ™wO_òã¼Ò#?6û•·ÛJ`Äi®9Mõ Wüêźxî²ßùmDñ·ÝT×ÐŒÕâû¨5Êb Iœü JìÛ !7„Æ‚_’Ÿ½üØŒ×ä·äË£Ìu1+ÙzæþÞ7µ-…œI (éߺU÷’¿-{Êf©ÇäW0Ÿîu§î¥{ψ¢Wb½Có~7Ÿ;Ù«RÝФ pÃõT÷®ø.ÅÛzö<ÔŒž£ü¥N5`~¾Ö³sˆ¯ÌÊKNï=|“{!ï×n: }!êîKö€×"þ‹¨¿ù‹ Zý×3…@)ò‹ç^]ÅÏTÒù~ËöíÂZó½ŒI®=ãíõÝ:öZï¤<`¾9kb³©.Ph0ä{êk…ìÈ:ØÅsb D`÷½¶£¸ ǜ퇕À—BƒwXT§)»xÀà¿Ð¤¬CÓü§}¤-맪i9ƒÎqu-ÏnU}‹òWN½üvUæýÑ­£óÏ\Ô|w{Pý½àMs6LØDy²nÝüÌÞ—_#@¯Bǧ”^xš)þŸu|—‘íË~YL0ÁïÄ%ªŸAZíâ1_ÿMõVŽÀ‡PÁ!SòÃö_w0Ë™öéJn‹ŽBDÎxÀ¢8;6ÿ`ÿ…Ê÷*""K÷ «¹!X{€Î®‰º]Üþ9e¢”Ç6ðû!Ï.ºG(1ÕE,…™Þ·*‡?$~ŽùyÀœüZCÛ¿‹S%y»×ÐW÷„eó¡g…” F(ßrðÓ÷ÙàK‘®§›H߯¦¤oßù”Iæ‚~ƒ. ›Aþ=óò¬€§J‘pªã#/œþ>pøÛ°—DƒŽ£Œ(BŸëëÄ{c<MŸ®—Ÿ©=d–Añÿ<ßHyš¢.?Ó¯Ö§óÉdG'uà:{=ô*—èð]ÄXb3Õö{ö,ûÞ È)ž ¹mxOÔœü,äê{ÁÇNsƒ2À¯\xy4ŵŊ8ÊŽ e¼L¾vŸôkÇØ ZÌmùi¿ÆÐn§ó£ÀÝZÈ·ùÙ4èñ¶>:àRãá<ñã¹'ðw«E‰i³~É*:{ãû÷×Cþk¹&äѽzÈåÆþÓTƒscí‡Ö…,{þ#ŽèN„}âvLð«Þ‹²v)v^âÓÖsÿ=爗¯(JƾQEÍ;,x´Øô¹? ãùz±z7Ñ9bñg! ¢—3B)ÎÛï©M½'ÙÕÍ›KÚA÷Ù±s’¾’ˆi¬¢ü×ZûiŸ«(‚ô𗽿] ÀãÏ“\…õ`‡7ͤ8.ïV©úô2h÷Ž—òkù<8€÷¬k·±Iî;¬XÄ9ˆß Õ¬ý?­Ïä£Ûƈî69<ÈÄ<£4|ÍÎa\g-yQDûä†ÁÒ«Àƒƒ¯ó–aºwþÓzlמy(­üå2埲Q¤ú(¦sŽmÃ8Ö~êí‚dÿªs-ÀüÜ^•,§ó:—ÒðÜð¹Áš&À!¨¢•íx™§<É®y<7‘îŸÜÖˆo£üáÂÕ½ïïöwøYtÏÖ¶ýF0à‹»®v¶xVî+_} ó0ù±q üë`klAqÓüÎ Ö±Q.Ùd·Š/óX 8"ïnœŒ-©ÌhŒ÷ê Ç[àÙÁ¶Èdøu¹sØ | §µ@”ò)„ÿ#ý üÝ*(9ÎMõmØsotS^k¥c X×ßm+ÃëÃUü/7«høZÁ™ÕkÑZL¿åúe'~+Í,}m:ßròËðåwåip”‘¦||ìôšm/ ·y§Åâ¹òµJ{’‡—%_SÀ”Åûk.c]ÍŸvP¼°áa¡3!„¿…kÒ¯_ƒÛPJg=WÓ›èß3·œs*ægØ2µ~.Ñ—þZö[è庼VÒoqÎsî´ÀÞòÜløóçë‰>¸§ËŸ_ï?z1u¦³’.ðcÒ"GõM˜Îw«À§ÊWÚR‡ñÛƒç§Kà ¯Z¶~ Ó™ÿ˜Kñó,Ã@Ÿž…Bv¡X7Öý­‹9É/ƒëL8Ý«Ypæ—Q¼ÑŸ÷cËêSW`£ùiöw:ò“k_GõA $_¡{L!>kªãúä˜ µš}7vâå»ÈßÑoÊ„ŸæxÏåDÁÚúÿä#°òyÍÄÿ^Oõ)O¶r¹ØÐÀm¸QòµÍßû3Æïߌ éLÊcí¹¼àÌNÌËq…}Hú#Š}~‡ò1¦(ëýÀº ì8;ÇßÉÖÜ+¿†–Ù–‘âˆy0x¦C_¤t.‘`?Ãø#´Ÿo º–â9 òR€¹H„îM”-uÌ×ëS<^RçÈ;eƒQÿPÌGÖí`{àp/§<.!Ûþùâ—òÎЀBSÊkû.«øði;Iyõ\ï7lë†üp(¢ó¼°yØ›AxMñÜ£ýE²ð  ù Û ýø26ÈŠÿ²KNDSš@ÑòK¿À/š­jäWý»mµ’)m½…ùËJÉ)Ó¾8t˜Ý6*Þ—ŒÚ^„Öu—ðeÌ7¨üË ²W§ž>îCy ´ËÜš°ÞNIŸî/Àüœ¿Lü¸7ûï—|ªÍ#»$yçãIä7ãº.Òt?ÆÜjò,û?ßÅÍ*ökƾb#¯¥/èYS®™Û…ôB¬Š¤.ÖKYý„k{wŠê¦cb'ŒdvÐ: LæCv ï›·UàY~æÍ²ó*önñ§|ÂŰ·áVÝŘ«%…û,àrû,¥ü”ì:.m#Š·TžÁsM ­,üƒwÀ§ ÷Ë/? _3öÔþCçwŒ6cÿd»èêî€ÃV¤! z•a8ófúaØûT¯L`Ó·%É­Ê1 Y²ó3NÞp'½8¿Øø Ö™Ù: órã”Q§|ì.iÒÃTƒ•´fk#ä¾fv¬k/~ÿ¾§`„Ÿ`®Àûz)Ý3‡ñÛõö’ÌÒƒ6)WÉþ”õøQDùÂØÌ„çjàÙ¸7$1®¡‹Ož5àUvbü"ùý=ÃösÌ: .º¯òŸ§?Î$?‹² I”?×Ñ!Zè%á7\Ïü®ý/Ä…PÝïW3Œgî2\ä<:ßËí9ãåüãåõ nyâ»ëj¢¤ÿžêÅËjµ¬¡{5e>iª+ü§Õ³<À+ x]”'.¥ÿ=lô^‘¼Whâñ#ùª=ê‰ê©\½Ku ¼dâCÿɯ«·(¦AÿÛŠ‰Ôûÿå'ó) •–a~Zû¢Ê™£âTEBD:›ü)~¡Uå¦d?òÕLÀw†³&”ßÒ{Ë;'èQF¸Ó½cïÑÂæ® ŠÓ6x{uå¼oÓ?׫p²ü*ŠýÝoùư9ÕIòÔ;¼ã ôªGdÌÓ3ÀoXz ˜—Ef̱ŽO¥õ˜~o0áqö´” ô{FÃ6ª_àÈý-–òñ±7vÝ]½â«Ìɤ¸»§Ñ¥ÏÑŸ ŸëÁ‹øý§eZ­`„^¶åü³pü,sðÇsŸO çæa=ìãF†Éß-`dEï/¬ïòOéÆËA2#“Æ`Ü…Ä4ì‡lÎ×i!˜Ÿ“»ÿ èÝO£~;ÅwÚ\¸{<x±é¸,Ovktõ‘ÒZºWeW<¤úÖ¯óÓ±ž2CJaS0¾Í³ØªóiöìÝ)âG‡¡bƒ9à/¿ði™&˜O\ݖ˳†·ÀÙûSö>rí$/-/Uw~w™¦Q\_ÈÙÆý$—]™qêšápiÙª»ã-<ú:+›âáxú1n¦öVʧÏ<¦ýí"è=0uˆ÷-ôß²vç"Ç~›“õ$õ{Ä ™µ;(¿‘ÆÑ”ÒøPý¡hüÿ»mu>â½z"ä¤Ì>±‰Ga¶;hNÆ‹»ªÚGuî\§Û-–^ìe?e]œ¾½fË©^ ýOöòg»Œ)„Y<«Þ"¸Îïù¾|/„~ šVÕ! |»Í,Ü@tcöÎÚôa_?U€ð­Ñyz:ð 0vWý,+®—Nź¬ÌäÝø-N¯ÛKøöªp£ü(–ÆÃªwAÿ'i‚¢®Š¥<Í*O×FßÄePÝ8vÕ¡¥”©­Lå9Ößôçñ«š˜·ú÷j³ùÀ³Å}¦÷9¼g·¹öû;ÖÕ Ÿ½9\ÔÀÿaƒ¯3Á?¡Š?²W!/ÇÀ³,Dt!ï³=JÇë`'¹Üßµ³ó]–5¸üOR d÷ºYV8cÀøÓzÊ]Õ,ßÞøEuÚ‚Šo–¼ÞCº—nYV½tœÝ&L÷O Y‹² £fMS0þ ×ôÓ¹½¥Â@ì{FЦ§O(ÏllLuòöµÉ÷ç¡›ùÃêØ?2æ±ý©.ìïö_ùáì>!–öóu¹70ˆþÄ+ÃìñݲУüä¸|‚R9åà Ù~xõœtf Å[98YôÈþíNI˜•ÞÌÔ§¼§^N-qbJ”ï}4ÔýÌŸÔÜAñ€^Òþ̺éûiw¬“éÈÇ£€'ØhšÒvà%L'œü Om>b‚y»ñµ…œ5V™wcˆÖ/àQ} ÉuWcàÛú›ÃK!WO¸ðmC;FIJëìê$¹è<:Â*îF&ôƒêö1¢sãÙ7.Sþ!ïr²_'J~¹ø¥ï^{DyÒ˜\U6”שÕÇl Þ7íw5†u[¶Hæóy’{1ÛŽâù²M)Ž4Ü3cÒDÀëâpiòÿØéœ4ËÁ¼,Ь )Ù§õÊø]̃Oæ]Êîo8Σ ‹~71>oÆûöïâ·=&ú[ku–ò\GÄhG]BJ÷T>Î^ÔSò(îNW0âÖ*’Ïع|ëIÑÉlê£xUóÖ‰QOñÜ+}Ÿ7ù%i~Þ¼®ª‹È#ûÛè§æ.У‘¹[…èD[²öËnqª‹ß}™ÎY+ñÿ‚ù(À­T9,Cu–ܲ<ÿùŒÿ­vl7¦¼¨Z'Ç«T7ÅùPP,ä•~±p Õ0² ÿ¶™ôÓSGÉAü¯”9$Iþ…úY òT73@Ul¡"Æ÷kúhà ¿×‰1/ÈwU9Ö!\8•s èÒ&ã³?Õgðˆ)mz_Jùü… vA(q)üC~,ŽGEª§zÑO´ïb=mâRÃÈ®tý§êÇôÏJzøpôâ,çwZ‚ÎCºÓîQ]•`åÅ_A¯­ú ¢ûƒ¾ÃJÇ]æ‘~|È?} ð{¬(ý´ŒüGÄž¿<ƒ÷â ¯=|ü’êÆmRÌ <þ#>‘èÌßöf-Õ-J[ç:K°vãEþ™T¿!ì“Já*à3Nx¿äµЋëWJaÝuì¾ì’"ûƼ~fð‘Òñådæ/uè¾>Ås¥åzkN~ý=* “ Þc‡èÖÐM|Áâ1èîEÙVgÀ~1éKe@O·†è…“Þ¸_•‰yûΕ^bÓ^½=tëð}§#ÙÍÑwôÌ4î@Þñ7¥D’üxøpÙ Ú/†{=œº0’¹˜> ú6yt£y»<9”Žõ—|z•Ϋ$œ«½°î¶ò ™tÿ‘¨ãNq(óÂW}ê]¹y“!èСGöô± žuãâá„+Ç ÓéœÚžÙVóxHˆOu] ‹çJîÉ–à?ïu ‰!—’ÛNm–á­SÔþçm+à |gævnm$yPù~ÅyÍ+ɳ ýœÔªe1$7eµÒ%ô)ïÅ;Ê?ãmí!”ëOñxù(nØ¡ðõˆ'ú³Ù[" úp}d¾öÁÚƒ—¥/›Š(þ&¦Àd ?ôu“ïè]Ì×õ(wÃdÀå¸ÿi3Åc0~p”P=‘8‹æŒÀ+Cå(Ù‰–¥û®¬Â÷–«¤ Ö|Ú ïP|¡‰æ¦3T÷^;oq Õ uÍå“ {ã®Ô¬ËäÏÝ¡ÛO|*Qü„ ÔÛpÁ޳íÙ”€÷‚z$üjé­í°1ÞÿÓ†Íê¿Eõí¶å âû©×.ÅaßáW–Ø„ùKÍ9Mñ×!w÷Ò9›ûÛ–­T—;ôãF¿Wȹ:<Ž6R¡zaZës±šxßÎ#áÍ ô'ùÔá1ùkûys]í£sûzoñœýÿT"tm*ÁyJv^­3Æw õ}:϶Sjâ-Âz.ÕÓ¤:#±ºd*JhkýM› ;Ê[†êƒúÜã:v‹è±@/øèYõÊ£HyÒK¨Nä?'±ïa¨¶Çsu‘^ðÕ€â]UÏæ”Ä>¾3–<ÂoëÜe÷0Žÿâ~ o$Wœm':SØèBçú/®§Òù[à.›±iæ Ã†iáß±žKï:ó  ½~±ùŸÐJ– Ðù•Û"íKÇl¼ê¤5í'T‹ |÷âk½ã+éÞN¯»2r‹¡uðÖ6ì“ZKølRIþÍYOqlAŽ9b·a×ÄLlw¥{uEžûÈÏ6tM¯Lž{Üú6!‘ö[?µDx(6[;Î?# ¾3>\q…îa'F_¦{û;±® n©Ï´ß³¿1IõðçäË,ˆyGþ˜™ÀÂs‹ã>ëÖœfW–w  ú¼ä,ùù šž¹8ó|ò¡„ä­áä3¡$¿ù¶îYGq=Æ[”…(/dÈ"¢à£Õ'ú¢‡Þ½G Fmõ“VÃÚotNy¿ ˆòÿhm¾/Kò,äøË¢ÿ³Û˹@·K{u\(þÃÉ\ã&Ýç…¿š¾ vœd¾ƒ‡#ƱýG®£ÏÓTÞ€þå¾—”ø@úƒ>ò±óåcêÝ þ-VT–$’½PµðÖeÈÏZIW_Øö•¬ ª_¬Åzú¿s–þ|ÇdàU¯J¶žüÑú–ŽÓþ'ມÉËò‡•´UÓªC¿’vœaäiÚg;ñ+ѽsN(ðb› t•êFIÚkvS>6ÏÝ&{ÈÝÂíø.ªû¼4Drx6¾783rÏ—Fx½¢x§ß-CÕÌO•ì«gsyk(~GÆã ~¯H[zŒü°X§¶öÅQþ× ááq¢›ý}bn)às÷ŠéÍÃa<|Ík¿ûõCÑó•ÝÛ?gOP}½ÚŸIJtža³ºÓvbÂjéí¼»>ëaýœWŒ¦ºp!¥ÚTgÛŸCÎ*ìî™ ÿGñbÐõÍÚótÙf³|n¿þR%å· xèëByˆtúJƒ>UƒŸôSü’mÕùo”߆5% à3¾wÙÞÊÅ9º4w¨3ú?çRëLfAé%Ú Áo>;õQ^ú>MêˆáßÙ@ùð*«6‚uùO†C‹b5äŠxÉ}ò_ˆLѯ\ûÐqxsá×3_-~;àò™.q¿ó3Ø÷ü½ZÙ+c›é¾Æ¯Xtâ6´.¡÷.«+Q¾ÝK€_[½ÓÆÇê°›Q9pk)òæ0𽅂ת7·!n¢#ÕÓJ~5sšª*ÆùX¸p5ôEácÓWt×`m\F÷¸­RV)/Æh¨áY|ÏV~ÒWÀÁÈ™ú6ù4äËì8îõÀ_zéR¡£$ƒ›&iã» Gbñ­;fZñÿÌ#9NÖ%ÿÇÔ_ÞGùÎüvØO|)›—$Pžôªõ/›)¿Ò禶X¿Ì|ÿÎHàCì„ìä››—˜9øÓéb¡â]ôç=©YåÃ|rï¡ûŸ¸uRÚK§K®¹þ*ü~hùMn>—@þ>‰bÄ@of>Kè>U·ñâ)À‘ÿ©‚ìøhñL=kÀíy·ƒcãÄFŸáÃ:ø_¨¯=--À:Èï½t„ŸäšhÄîQ%J‰ò,앚 ùbÏ ™Y ¹m Yä y–tU,Qö«Ü(S—ü\ãøu!¯|?¡¼d¯/QÜÃð;Õg ^6wS-j@q~AÕj×AFëpý/~Wòñœu€×E—K|&èãw<@«å‚ôÉTß2¢Ëó ðn´_^[v ¶º†ì‹6ŠÃ4ß8ƒÅû‡·¡Ouì>àßoÒÒG1w5cžá{˱^C,å5$@§Ÿ Òý`¼˜õxúµ×ÚìM÷A1ª©MHäÓ2Íã [åÚ´> âùï¶5°pÖ]Ð·ÀOYwŽÖȱ%ñÄÏFá:/Цv\ |ËÔ¸÷UëèÛ¹ð =ŸÙýä2ß·Š\¤óÏ‚ïîÎÄH}Esò,Xpâœ\s‹¯CN3ؽÅW>n³(æí(ë†ý*ãOëù¡à±É{ÊóŸûvCÐ`¥àYâWñÈ&н cÀ å1 e¾ß x•?¥‰MF«eÚ]¯LúÂæøºÉ›À‡³âu-@n[ý–£?Ã=†TÿÀ¥”8£ï?µ0–ü`ø´HŽ$¾¯<±O ]}Ð!œòÐìÔó¤ü«¬°£b7ñ¿Û%Îè­˜+£óVC^ú=nšê„qíÞîv¤¸B‡rá(ªŸ‘0mrÅÑú®ø(AùFCçg±@ÎiÙ%Jqî!Ö%ûGñ;ÆCÓT•üøß®¼ž’BõíLYÐG §å— (N…yÃgb)Ýk‡ëMƒžãÛðfNú¹xÜ{%ÆË_~i~4ú÷ýØÓÇ :‰}®1g-ä6kn¨¼.Þ[XÎûë>ùI¤#¯¿Ž=†Ö_¬æÝèï/¼n”‡5vÏÜôc°ï#gó7a|ÿ;7f·ÛSüÞÈ’<¬›—BÐ0ÕGŽú"²‚öŇ׳­¡{×D]±Zº¿KeQž¤ ÙI(/ˆÊ´y¹Ø‡´zþÐÖ>Øö?WfÁLœ•x£Ž'Þñ¸9š7ŸsÄw¯ûÄ›ÈOÒjO|<àe<¶¿Hõ¿C¤ÿ)Ÿ ¸ä*ÎIΧ}îœó'_®ùºz  ËðÔw;ŠñÜHû“âîã=|ùâ¾8"ç äS†£ì…ÖHŠÇP9BuËô§M„^YÙ{ÝÐr3ÈejåI¼‘¬ÈÝúeM|©sz%©Ø}ãðìýæYjð bµ.ö^kêõG3®0aWé=sÇzE¦Ý*¦{®€éÞZJ ËÜaÞ†ÉWAOM?A?6)}Ÿ6NËÅ·Ÿ–>Oż2Ê·™”¸'P‘ü?&mÚY:Š~5A-ô²yýÚE€'ûä¬ýʆŒtÏ–Ñ=Ð N+ ©Î}lÞµû‘­B ºô¨î§é€Â!ª'jï!ðàíãe>30žQyÕOŽl:W¼$B~7ò3V‹C2’Å?ªk%`¼N9yÍÏíÕ›/ÐùÖÐÚ-dÇÆ)Î,ÝÉÝÈ~/‚ïœÜÙ×<±ÞZg›šƒ?å΋.[ƒçg-(w«÷—Ž6§ú¿zFð¿"Å5ç_ï´€Ý)›Áqücѱæðü÷+èr7øãïî ð¥ gCÂAÐKø±žvXßÄ›ØBNdr)ëS<+‡­w2ðâo¶ãm ø5MvIŠ*ð&´ü}Ù½Oœ5è^$þ°z<åm¶÷- _€ý–ÓÅóoC§LµÖÂú‹®î_‰yD óy¶ƒN#oO˜ý•ÎwOXlÛ8µ v‹SÜGìásM­ «ÂðÏõ‡¡'C% ).%íÈí`è=FlQhœ+öã‰M¯y¾Xc?&Ì–¦8bæ÷hÐqhðw ¼Ÿ³ðMtÿUFÚáè5TOk¥šâгø×þª/ïEde_œþ1žÆ'Cò,tià‡Í?úõ%nÐÿÊ;‰®¤ÿã¹ï¦¼®…·/Iµ!+½Æça¾¡Þü{§ÁÎÊ^±ýÝøÈ²zž>Å{komá>…ª£ŽÑ=úÿn¿Bó…X·U‹—üè,‡~º}ä–é_›ëo§aþA]§gÑü›ŸÓL,#ä<ô¡÷ô™IŘwò­8£".FÄ -Êšp9„â¿ÿØ5ÑCÒ"œ ã¸ãñÃŽÀoHv²¿ÖñO¼¿ªaZ3ÆÿWÓjñH$èè7j±Çnò#v™ÿÑZ±‹ô\|ý0äw¼O×é7Sgv±ÉŒUgÕs‰ö«Ñ¯ûĆ+ÄOFÑk· ƒêš¦½êz—_Aýœ»p†ô®¾@käVðŠ&¬C®î>ƒâÌ´ ýâ¡ý¤¡ø2Ý6ÊõÂrÖ3¾Ýwzãnª—™¿Ÿâ=Ò?NéÎÇzGį¦úL–7¨ÞŒQ™hã´*¥—>¿Xòö5<íâþ È ÷\•_€7,Pèâ_úÍ|ÖÒV&þoüƒ½oý¼!ŠÇSX¬ýÍ’ŠøˆurQegP¾Åü×g¯ÌÀºhû·½¢<_ñ·:OvBþ%.Þ™ ¼dÞïØ%ßþ½iì^Šñƒ&¦Cn©ÜS³ ¿¹<‡AéGÀo{YÓmaï„~z#FþuF¿êgj×ÓÆJ]è¹!Ãs”w2Êÿõ¸ íCZ4>] ýÆÉþ@ñÝì·;©Þ–åšAß× 7µ’Ww0/öæ5‹`wéïØAvå{‘›l:‡ü£vóO}5pÍ |d«r{¾äßÕ…7ÐF )[ºS|m­úIðW¹ ðŸ°kæFØ—úO’ùƒ±N.om=…qü§ÜXNõ¦ÈHSàÄôî§5óJiæ$ã=–Ïàƒ|Q½žƒõŒÏ9Ûó„â[M›z’îÏÝí$íïÔ©‡ö«B/³ ï•SžùÌ0Í“¼€/'XàÄÚÕ°‹Lsο<*_¶vøÍ+ÈÅ ?4ËRÞD×.oØE-§÷Ô”þoÓÓÀxì_6›1~ÚØ®—îX÷Uï7ëŸàh]?þÒ¬IŠƒQÁ'$YDü²¯P†î¥SžiWÒ9j‚þÏ{’€?oÿ$ [Ø‹z}n’|t:M÷µº¡vÓ6ŸyÑŸl÷mý¤×ߤø]Í5—ì¡G¿ŠÇÒ¹yV÷¯Ái€/çÅ©”‡>¯,Ó‘òÜËo•: ºaõ[¼¡¼} ‡ãöÑ9ëÇŸÆÇпÂǤRà1gq=Çg¬_ÒKoZs!ïhÿâñeë;Z6" úÈë·Ÿ&†ïsWÖ¿Ù úJ(ð(?šAõÒ4Ú?b>ÎaÒ™è7çP’pÓ ÌcBަèQ'xÛæ9˜Wª&Õ? ž“×¼§ýä´M\Ež1":€Sž­ÐùU\vb¾‡Ö_¡z…q:7ï‰C¯§oâ õÅûª±n¶½.O)ÎJuòݔÏ-™¯yÖÄÈU‰âëÖb¾S·ëÒy‰Kî8åOHH9ÎsßyÔEµPýF«ˆI›8IÏd×.Jƒ~ {ÅÃ’€]óá\×(Ö׸n…Õ±tÐqÛ|æø­/Lü÷!òåïË8T²ŽìNaë#×Hÿ§Hï¢}«Œæi?àÙ9r‰|=ƉMI›ƒï;s6pb=WùƇ÷ÞohÃ~+°åçÚ… ÕÐ=ïÉîúwâֳ؞ê*«+o ½¬ &òžêÇÇ9ì<ú°=é›ùóITìà¡x©¾‹_xú ì—ÖÀÛú(¾Î}Ó‘‡öýÏŽG§b]£¾Þ{çOñãÉ”':ðlšC-äb6×»¯Ë•Ÿ¶à¬«˜_\Ô®Û¾C˜WþÉÿåaHבۋýs‚î“ÚIðo„¿ù)¹«ò½¥¸?ž/cëé>äæ?7Öb¾Ë‚)!%úÝy9’'ê‡mÁO,ÞãR€Ï€/}ãÌ77îÞò_ªÀK÷ý'¬‡ñ“Ô‡ÉñsÛyÀÅHòRe~U7Î<Ç‹þ’§]‘ßêØ\r¥sõxY­Óý? 7UV©~…æ Où.¬f·d`ÿÕê›Ø”5òŽýBÆ^r@ÿ¡G(å 8Ãú°vªGÐŰ]xÏ_ø|Ø à5ä¤MÏCðƒÿì{óv`|ïúдÈ?ös_Ÿ=Øw™ÐxGyØló&ß ú!,­'–·ÐXÒ7©f迨­~°A?Ý¥ò·¤jÝN~ÍqRšGdó9:³[Â"€_³Ç)Þ\aú„Ï·1_fß‚ ôëݸ̢£‹ž7·SД_»—Í¥R~/ûE…œ@§¬«æX¿Äá„ûä÷*?$ͤºo~¿Ê€Œµø )°cÉ“Ò ¬¯³þšáEàWßÈa:·Œìü1FvϾÎJÊ ê{8gŽ,èC5%’½ý¸=wtÅoÞèëlàÇgjÜžÊ+wèºðïûtLBãävN›vÂò~ÓÝŸ{±îIužR½1öÑHcÓF¬‹¯q­=èFAJ¯Ÿîá]gpйK-àŽ3ÆþZ¨ºU0|4›ò¥{Y„/%|–ξc 8­t=ÊJ±îf·duà»8—²Í½§Á|׸Èc§)Ñ!‡Æ¢·?Ò~ë^l°[“B×ï+‡ü {rñð#¬_¢œÕöögx^vvv­3Ö·;Í„öËåSGß•’ŸuãòØé1‰¼·±onýQ¿Vø.Tè”o§øÉ]ü5£ ŸÞ,©×ÀC¾£ÚÅðAØU7‰GXçtƒOœ·±þ â2¥±ßÈkYuÖ3ƒ±âþ1Åk€/#g÷ãè%–‹ë‚-´_“·ü.xÏ?gž ûYD&hðµJj“ÓlðI”ö§·C ƒø~Ÿ'÷ƒO*–;/ÆøòR‡ §4¾}ö^(‰ô˜Y>½ÿÓü–3è –ûù¼ÀwÈǽB'×Òí®_ùnr´®ž·x'_úÍY2z3¸¥ÆÍv{¾ñËDÀw8ô¬ø¨¬¹óØå5˜ï|½ý›À^5;Ä©ÞÎÊÑ\ý<±þµ1 »ÖÓ¨€ÌkCâlóËË8Ëwd%Àþf”hÈo±]w;uÊ`=ãý´ú5©Þ«%/ùS¹|øÕµò'Op£Í6KØkoOüÿæçÇ•V‚“Y/JV@ŽGöXL …žY3çÉBèözÛ;}ÐçŸ9<±Î‹Í<¤AßyO#ú ï“꓎b½Ãø9fÁþH˜î§Ï ü­—.Ò ¢{±'…æ°»[ýVÔ $ºåx¾dÅ÷Ú‘ŸUÆC¦–öm©ÓÓTk%©îGö¬gÐãq·¹—´Á~ŽÌŠûz ëæÞ}ü3wÍaͬãÌ£ª€Û±‘«“t”³íÐÅ] ‡°•¥ÏoAާ~êÛ>€ýlÉÀÚà£X¯ðÑPNŠß/¶=vc¡äcÜéY wOí–5§ ¯“ /áû4¶´XÕkX®üŽôʳc’ß0ŸÜ: 3KÐe¶E‡!ô#c×Ñ×Á!EtÁ¯G†ŸÏ=^Ö±©2^¯+xÞÇü]g×l#ûÂíÁÑÊ—'‰Òm–ï¸É®8ÅfãyLXÏJòÓx_>È=å6$T…y殨ú´Ëã-¿i_ÅÁP[ûœòc/ÏÊÞzãg·çÿá`¨}˜uânmt»%,è;÷ÁlM~гÝMþaq¿6ž$?»Øª´ÑÍ Ïå[vÏ¡àß@‡ü»7A/i_8[–&€^Œ•nœÅúºÅñ;QÞ:{u£šéå'›aïäf™,ý ùlÝ6}ð3æg±Äµ…â ~8T˜“ý`¬øLôöyûé_øk>wü¸Ÿü\LùÞ§IÌ)¾¢,U³mA>êR>‹€oµ{>ž }Ä‘ž·CLðóª$c3üNQs7%?À”®Å™+ú)¯ÙWQª«tÃzÈÏý o æÁtº·þüèß}¶ºê‡ À_γ•G`]ƒýFW@ÿ»k…ÿ/*Û¼û öÍŒÄóŠVlÀ“-¤w¡ûöDíœFЙñ×:Ê{åh©Ä ÿñ妛çþ%&‹3dпɦÁÖ“{¶ËûÅÄô;!üïvçE»øv…Ó™=_!_ÂÞÛ×èaþaón½ŒþRU¯XŒýªÍ§Û|ä7‘êzKÓrNÈSéô™zçˆåK7íx©¹ㆯvþLq:¾F9âb¤_§Nòp_Mv¥ëú=ä×°¨/Ñô%èx÷Íí-ÀëGMýÊs”,@þæ %é{¾aܤ„×w€Ýß½(; ¸sTÚŸËcÝù“ÚÏÖAÿ­>jMþ*i÷èÝ_%x>ûßèC<ü —ð=›îSúı}Âs1¯xuóhÊþšÍ™Dç— jõÿâ?ïĦԈ4È7¡${è) FOdž{I:²•IΩݘë{àp„å“fíò‰®„¼,ž,Šõ/¬Ÿ}_Jšƒ±²íÚaWò÷¸¶vG7ÉÝiÙºXOÓýúR”Ï Ä0»®ü»þ{éÂzÈë™E“_ÿwje]»¶À òÈõªJÙ5ȳÂÅyûVB®'§%(ò‚_W¿­6ý¹àõb¿6æwaÊùh3†Öœ×‡\|˜î·úÈ48Ë£ýE½Ûè˜~‰éØÀ£ ü‡ xÆ}Ü+¾syí^b–Ÿ†=”Èg³ ø[RåéNçD!‚‹tŒ ¯-¸x©nIâfî ÅØO¥©©4`=ã#2%Ø¿åØ,vÅþÈYgk(ù ÙÄèÍh~~Ë Fø±²ùRÀwè%£ê@²÷–¾:xy”ò$†–$â½Ì«åêлéY“€w¦rÕ+:GmöwñùO^þˆUÇí°ŸÕÌ馸ØÜö‘¤¯ãš‡!?£•̺ g3»~Ç|M2•wƒ^-Ê‚¶<¤õn±œ¼ü“v5xëmʇö}ûvò‡ s–xj=3W”îáîm¼By‡“]ÒŠ@7ja÷®.#y$l¾Ôôÿ¹­µôkóôxåTôû°OXpEªÖÉC.$­Øë |'nÛÊ <²˜_cÜ_ËÅÇ®aÞ‰ŸÆsÿ§.FV&Ó8úÆüÎýÍô¾HÈkÉl’‡&­rÉàŸÅæ’“ŽÿÇÿ!Á_O„pfKŽ˜h@ΘŽ\Dù–MdùÆÆñ}a-g­ÎZìïîÏßüÆ9.¸ð”îesÊæ~Ä<„–ãûvåɃЇ>¹B'IîEÔþP_¦ötUþê§ú)Wh¿{/}ôå¢x0Žü$Läç·úÿ_ÉPŠØHyô#çܺe½лx¢ë«žS½À?çhÉ»¢ßˆÁNI\Ÿ]çžñï¾¶•éùx\ ùWΞy’`.¨Ry°á±&å“ëá²=Xù¬sxy<è‘Õûú}ÍeÊG¼ï å[ÍœÓïIydãc ê 7Bì»x@ÇI÷L~R]¤Àç-óɯ—í²*íúäÉ"‰Ï0~©k™ kC-—¥ƒa·KBÈ2VýÄI!ПUʯ¼AډˮSû${SþVhÒ„Wà#æšü(i|ç#Ì_$ˆy˜ýz¶;ó61‹Åwf?ëÁ>f8ö˜·äδû[ÏÃŽTPÖâ ÿÙø¡ÚGÊ)?Ë•+컳£^N3Æ8‘ Ø”ß͹¼®ÿSÞ—<ç ¹%<¹áš/õ™ü@“U¦yôÙ7i‚–wøÁ׎[ÊŽc^^6—NN…kœ¼åGøCÁj“/Ũ&»,ºIööÿIt›±ÛýÄÿâj3~Þã ¥ü|ݧ×ÈÈo£Áé‘ù2ßЪf}?Òq¬ì¾4Q|‡GÙWðGnìÎ/à» ¹›;è¾}–U/Ù!v¼©%=þDOÊ–ö«aU˜7KÁìÆ±Zô#v±€îC  /Àø^'ŨžbÖ¸S /ôeh{’é8ÅÔ«O÷=¸Oy¿­¨æ¯É{h¥Tñë yò$ù%üÞO0l'8SÜ£¿†Q˜àM*;¦ºaoÂ]†û¨Ý^Ù y#:8:;,¾8O‹ä—ɬIä×`eö¹öù[Ýl= 8Óúv/[ z·­47Ÿ(þ÷|Êí¢‘ÇØ=fÏ20߸Âã”7Ôj®w$¾7¶y¿úž³¾Y<Àoÿ™¶§Õþ#ÍËCÅC)ªš@?ù³Y~Òe‘CÓŸ÷ìûÊm/býbw “¿‚ËEÖÊÈÇ®ø°G¼ƒM`ßµd9C>¨Îí¤ülÚØ;GwÃÎ1¿stuñ‘³°w]‚ì“@—lS7~ì[µCuS6ã¡à¢æ´î§&¦¸:OײÏVxOåÌŽëOé²õõî+tn*!£ýd&œ£Ý ¸"'ùÈ?A8ÏÔþ•sþ¹÷dË¡ïåæ4 “?À@`Ô9º?9¶¼“òû‹&}0£óS³¯ó©>’Ob‚Dú’»å“ 8X:ª;ºAŸ*x)~0@<7‹ã­?Cç1úÖ]¡¤÷je'ýr=OˆüæÄyÛï‘þûÿüoŒÈ€õZD— Š#«9¡/-®Ø ¾cxwï£:Xþ"ËÅa¾L‰oãmÍÿæ¡m5ò?=zô—÷Dý›1ìòá5ÐO­)/…žQã];È.Ho9zK;ü/ªTà«ÊѪøîݪÚGä\³¤8Ù1fÿ#ª·éò+²{ÍN®ýß9—âk0 #â4Õ1Z-É'"þo7FhÜkžrÀŸ©Ô)ûñ2Oå¤sC/•ª{°ïâCDÊ*ª3w¯¾ÿÜ9ÅÄë‘]á2%Â8ŸôÍþ[–̺ód1L›œÖIèÿ›G‹ü†ü-ü•6Ì,ÄwaOƒ¸ 7Qžã³BØÝ‚×ʧR=Ÿ%‡ítÙ”_¯5ô$ð”ཨæ9ô‡ü‚´‚Ù”§àTÄñkd€öèS¯CN5'i¿-zèö+ÐK˜×¹°§€»°þ~×0졸e+;7bßî—æJ÷Õ«ëæ<…þ±/)²¶æ sZKóÕ ƒšöνäwòê•t9ôÝ2?ºtzȰxbÙðhv¢÷‚9·é~?DÊ«ì-ðè’:¢OrÐÈGñÄB+:G›Ñop¾ÅïUGÙ­Þíwœ­ FÿŽVæó)®?žwúòW¹¯;ê·¸Z®MÀ¼˜gòþBÿÌ«©"};yÿ€!ìŒxÑÄðUüm÷o«!oâ*-ÏQ7U7ùÐc VÁŒ€ç7Ü ÿµ]baEÿæbØ–œ*Ã8*=³Z†°¬„£¯É_óOk_t³aäMìÍ,ÃaèC£wë¬?ƒ™—­¦L^-÷0QÞ!3“>òë²< /ä™ý×?dzf•»,æ–•}ö¥çÑ T˾A¨Ü†äÅŒ‘TªKSW;ƒ¿ƒ>Hû‘ßA\“âÕ‹Øÿy;ÚÕtýÍWײPNô(_ºïØ~ôôürômä;§•3€?íàe5tßéÆÇÓK笋Þ|£|Ζ`¬>´ÙV•{ðû7œnNR׍ނeͪYá˜o¨ìü"ÊÏ»Öû6“ò>nîÌŽ¾‚󒯦`>Ûï‰ä¡_•‘¼OTœyŽmìNùׯf&<œòñ·µ©N¸_àþ*àŸ¹Å¨Õáò¿þ)­®ß'×RÞwÓ±™ KáE”¯V¥i†å_ÔTœ€ß>Ý”hß7‘Û]ïë{±æ“½fúêÁÀQô«­tO’â–ƒ^§óY•ÞaÑø­ï¨q ó`¸(w¯ùBrëÅûŽýàãßyóZõõ;¯°~/¦ìï†ÔV)ªü§^3Þr×$Ì'Ì£»‰âƒ\ïìè ¼aöçxÈ0±ú£Å4¬K+½e©ìôÊX›Yè$ÒlæG òW{Ÿ}d ð§¯Ón-æã”Ô{" ø÷íÑ™My'’˜ÙJâ°_B‹dgHaýäUU'Ð>Ð&©bÅ[ö2¸6R¼XÐXÅtÀ婳±yž§µY+/Áz„ÌŸ~§ŒÎ§+óDì!þ­O Wõ˜âîÃUŠ»#@/,í–”¡+ãÅ{<÷±0>JyS¸G\^ÖÛvíãò“*UßÝr76Ò÷—W ÜLP›ùVû'×ïµÀCpùѶ³ O­;oç/'½Ä’L#¿ƒ¤cñr71_Ó¶µ†7Ho  ¶q\!ù‡z8 œ‚us—~OqΫì_Ö`¾Ž?ªçîûÿš…Û¼ù.xÚ˜îÇ­Ù-¨~§ ¥þNjÿä« Ù¿³…ò—ÇÝï]3<µ¨®BÐzÕ‰Û_‚iÆÖ› ?=o./ÇþÑaZo=å•·zô˜—ü¹ì8Æ¥‘_ÇÀèqàÉYâíäµxn~}“‘Þ‹¶ºÉ.£üÙ_ïѽ™½Ä’ÿÙo¥>–<ÈûÓm›Ù•\ð“sJÕåó‰ Ÿ0VCër­‰âÊCJlÖëR8ñ—(¯uàiƒ"´O`là?†çQ9œýÐ_ ä/Ã~ÕÛy$ú*¶ÊbW8ð/'ðm+åÓõ˜û¼žäøsÍ”aÀ—¦w!‘êcÞϳþ_}ÑÁ”ŸÅ°Ûc2å;5ÉCç­ ãÓ÷€·L7žƒ ¹i“r(ŸËÓê)‡†íFkƒÚþÒ·è%ëäg"mG÷äÎ:D Èßp É* ó ˜3'eøÎëá€å±vOúÙ ¾·ý•ù¹Yüßü2 ½O3)y«Z’:àMðvvκ ìÃÃÎ3Ç?¯lN'åÙ#Ç•ŸMy·ÏH5SýÕàŠO.2%ªSðüÕ[üÓ²ÆÞz® ùôlüÁá—éܸüg8ågðbîy“öIasvßÈdt<¢{B÷÷vMŸ ³¸먾·½Øç–eØ_XtVUa]ƒ±¾wB.køÙ·XBO8óg¸ã½po¾g/O¨îþ§°«ƒoWV“ß^`D¢Í¢fÊg×^ºøv.¹ã y¸l“ô§AZÇIÿGÛwÇsݽÿÓ’&EKE;•UÈ~[Ù{ï½÷&{“‘•†J‹†ŠÒQ’ð¢!¤í")Måw]÷uÏãûÿïû~õtžï×ëŒë\ç:×9ç:l#ÇÔ­¾ìÚ½m{ ÜÍÅA»-Ô_p¥í¢²÷å/ìŸsþJîú‡Aþ[.ƒóR0þç7û0>Éý–ïPŸúå—t±~½ ¦ øj²Ù}¡¼ßÚîîíohOVž¨†z–üµBgM=Þö+ñ´³\ù]<ï¼vHî1ÆÓö«ÓÜýQòÑ·ZPoi9ìWq+Lk²yÔ«çYàé7ךâ:›ÎS±¤(¨ïP›ù)¸ßRÝo¶)ôC·w’PŸvl%¸ÿÞ´ºpåw|~êÆ?ÁñÁTÎ$ú¿Ã•ú¡!ô—Î×ï…÷¸ËÎ_úR~áÞ(i´'Çd—iƒ,t6,ÃùvÂ’»¿GÎ@ÿ|xº{Þc3®òýW]3ƒúµé“Ÿp‚ñ؉-ù;ŽËÿÄ0Ÿì2Qò-w»õT7¼'ØÁ»o¤ÊùnýCô¿iÞÜ¿w\oœœ…ïÉHz© õfo«P íèxsä½|Ç(xid2ð­†BÊ^ä¢~öÀû4ƒÇ¡~Ê¢ª7Õã90Mõ8\/HŸl¥…ë>-~{aÞe#zhUˆ(Æ Û‘ƒqpÌ nZM†òIæÞö@¿u• ì>ÉýµÂ¸/ví~y}”‡O%Ð?ë ¾m/‚ü)þÉé*Åó]¸>`ÜÈ9„ãƒk—Â-E¼gíÎÝÝ 'kýïŸ@û´óÕ¬Ëð\ë-;Ä ï“ôlä@;Ä©Éhô‹c(—¦´³Ã\Ñïá}¢·Š_sC¾ÖÚdMÃø7œ9ƒÜë]Háo†zQɰµ¶†ß»i'ÄsûveÑ¿îB=¹—ç¼^òçyÚÀ¿ äZ/^c.äKöšJ>”Ïþ}º4ú×}¥sß9€ÞrZR¼cûwŒûi´{|/”ÍýÞ¾>Èý§ÿ÷“åëS_Süٙǯ@½» —éõ="Û5<ˆöó }Ã7Àw®è¹s8=Ù÷ÁüÀ¤UÇï¯Ôn(l„úóP9k  O‡4“bÈ¿Æ;›]ð÷„›,@ß[)Y¿î€òøü>½G¥㻺ÀsHk'ïÛOƒxénQȇ׋»JAî] ¦Ž•â8zaïº&ø®C€©6îG ‘3˜·ß3Î]‹ý$®å܉¼—òú ¼7À w÷÷^\¿³aþÝÓ›öCþ&o›º×Á8Î'LÆñZv}øMÈlú¡9 g=£ ªq}âï8uöGbý á=οí_`œ›±' 5p>±e«¯.´OàáÍ£0Y_·{‘‡v‡]n:ȧw}ó¦(вíæËðÍÕCA> ù.åC=ÄÄ|¿O#·0GŒÏã%©ßv2+áä…8»hßm+*rQ/øyéöã½oâJ8 X´&ï²8[ÝKû·xÏžâMýGŸVôfŸ{1¼Ç¡¹º¯ú¯­ƒøAwŸ ~©Åð^3ŸjqÐsf.}±¨ïíjߺ[Šâ=õªx/šc@–ÈmèM =ø®Ë­&ËB ë#ž­ß œ†#¥vxÞÆ¾þ‘ î¯ º1ã½[­ÎWÂs&ÚiÛàû,Ã~ÿî¨ÿñC›[ÎÏ„öYóåç>´CÎèÛ†|¸¾ÈVKƒ¿[~Rö:ýÛn™%ÔsÀì®Öc@¿®‘ŒQ„ïxšz¼“=´ž[Ýê?8•£÷úMn+z‚ûú .„òûëÎb¸@ÿX„·4)â|áÖýè$´_w˜µÖÃøb¦³²ä.œ÷ãÆµû@?i]¬Åu€ÐÉYGÿ } ÉÙ¶òo6¤“# ßÑ`½‰C†‡s× %y1Î\hî1Ëlh÷GÐ×øŸÙ×åÚæêÏårnãQÈŸâTó•.hï²™ž G;NêW¼W—W+Üí ¯ã/ºÁ~ò8ñ,¿ ÏÃÎŽçÏØMÃñ܉K™ÿLEèWkÔ‹£¿Y}¨íõ8¼oò•Ñ ø½®BtÙ¨ýáª-™P^‘Ïg}qœ.¹ñÂ%TçÌÆsOîÒÓ»«¡}S”Ó“ÁN·e»nj|ýÒ°% Pú'42½·W*Ï…rÿs_Š-Ç{'7(‡ÍϦ öðw‰Ù]ÖÇÏúØŸw xhUâ}Yê—Ø@Îô2«!Ýy•ަ+ÆÛϼ3mîçÐüžr=÷ßx¬Ýäž÷€]Õª®a<¯“ñ{ñ>jÏ_î†Ð´ö¿mTžQéׯ¨ßõ_]¿o ù³Trøå²íñÙý=9e–pá¼çøò\·½“¹ÃKãÎ<Ÿ~ò'²³8ï³ô>™Ó× ræxWHCÇ‚­N½z“<ž?þç\ /_Â`(‡î¤‡n ž‚]¶$¸€üm ÌÀrräYÚý7Ofm›6'£ ä2ÈRñx$`eÝÖl$_ÚkC2/˜à„þ¢Ówëc%Ô¯ñ™¯oý¸þq´ÏO˜'®ÆûiFï™m»_Y&èY6¤kM}ÌÞïoOy7ÊíQ~ùZÔŸjÅÍ—£‘xQ`¬Êo_(‡ïše?a^mÒÏ\ÄùÙóÖ•ð^›´3AxÏ´êµû.“@þ=v7ºnÃõDO¿/a{mîŠàûϾþ·\ o›Ù1ÞúÆ®Š­P/æB¿@ÿf‰ïOJÚó.].ÆäSuç~ã:žì—'A=JŸŸtU‡í¿óÌz=SÞà:ƒáÙšhxÕ+×äY³æ—-Þ'“ÑË·t¥ôóï“^öAýº²y*Î{´&æ\ò†Û7Ì‚~zõ(¯*Æ-6Üp)ê%¢çÀck˜·ê«ÞÅûÅ»+]ð@HE!ŒGñ7µ†k|y¿Pˆ÷ß©N`\ŽÐñ‹KFq­D¨/‡.«¨ïPÏÖ¬.yŒ—á/#çÈ òð6U¦újã^8Ÿ›'÷ÑÊQ;ä‰z¶FUëÚëQu<'–+£9õy·'á¾wGCñFÐ ¬ðY9Qì05ñúâÛòå^º¿{]Ús=̳‘…ñ PoŽÝcOÏBæõlô÷Ûj¤.+‡öNÍ…~Z§jUã„ñ¨¬¿÷db¼g핯kPÞô$d/A=îm¬–Žƒñ?$òO°cK+»pk^DßÞ 6Vthê·d9è×+Ï1‚ïém\цçÂÖ›Ôó•±±2ÿ&YýV¸}F'ü>qÇ©Ê%ÐÜÅ?Ý9 õëûqãñ(‹ýïu!sŒ6^À}D¶R1ά§Â\1I¨—Ä’}!R`‡ñónβñ+QøÈM°¯“z7px»Aûš8çX5ã}gÎ`賜ÖsÿÀýÅßk\Þ@¹=sKZàûQCǾ×à=Ï&ó/âþ+¶½Ð^Šå Õ¡}£Ùeš£ Kº9ùqŸ”Ïv™ !È_è]¥î©¯ð=< ?Û€û- bàެ>¬mÆxþÏÛ=BýšÞxdÆÏ kÕÎi0ï?‘¹¸qÖŸrØ?á7[Ÿ*cÜ’}ƒ ‚&;µä(P%6ØÆã†ÐWqÞú¹æd=ä;ùHIåt°k¶¼]¹ ã‘ÛgO⑆ïæ-+ŒÙ‡ö×ÕÝÆKÿÌ WõŸÉÃÆŠy|úOèÕŠúŠ…P/j±O¤FPoþ}ÿ£É«rNÈgäýÍœxßC⣊Åg¡^}ëÞn-C¹×ßa2 rªÈËwù6|7m¶GòO¨Ïß“š¦ÀûÂ{.ñX-e«S±rîÇx‘A»×\ŽKº\¬¾ÂyêëïûpXŽ×ŸÎÃ8S&KL>@þ"å΋dƒœhI^8õ°kæl5Ð#‡‚6ƒ~)e†Àï,TS0o¼·Ž Øý>^¢¿AOn :6 ãCįþYÓó™!yœ*.s…úH–«Züž¡nmâÓM“ p?V–d ”C×­%¶ä:aë ýì'>Ô`<âÈ?Ÿw\È9™'Ì ã!+|eUg?ä/.胭1ÈáÚìÿ¸P]‘…¸¯G¨êzÂtšµÈ[˜ßû…Gàxîù'v5Œÿ*qW[Š@ßø8ô¬XvîÚv³8K?hÈ•c¹®9ð d&‚ùEàçæ¾Ð!Æ}jÇa<çÙx×=ÿYöˆ]íî‹õg‘€ñh½–E_•½á*]xòô«§Ûoò®^9­ºï¯ ]ÔuÊg8(˜Üú"ºN$5ʣɴϿ…ó™Ì½¨‚f­9õŒ¨:ïLÎRìúTY‘0Ó ò`ç3ïqÜ%^{ ú“—îõ‰g0ÞG\/¶²ûŸ¸šÞª¬x<_¿kÖ¤ã`'¸ü.æÇõŒr·7@^ú‹ôB~EN™ƒ>ÍìýÒùñø†÷·Û¿<ûÝÚ!œ³N%(ë_¿;Ëög?îß®o½ÍÀx»]ÕBéüô‡îIÀuH{‡gaзnµ ÛgÀ<Ȫl¼à¨Æµ §ë2­+xþ70}¼5óÃù ¸Á‹÷­Iý™:„÷ôyk'_E¿k­¹ÉYHßÖ)¥ßó¹ñË»âšÛFÌS>€zøyvÆÝt‹Zõi3´§ã7™2˜×9(I^ëù{1c£4ä'¨y_ú/´—æ=˜õç¹<Å㸊gá¾’°Þ…Ís§@ºØ}˜oÔ™ì-˃§“ò²Åëá=ñ7†£ë ~¼7§6a¼§ÉIR£À_|&Ü ã®tö.Ñ9 Wèº ƒû¾X\R§} Ý÷Ü›ŽûѬ7L?( ýÐ{ÑPÖ"‹U% ŸÑ1J\²Û{jÀ÷rÎ,?Û÷JêëcÜרÎV]¼·"ðUaZoîC¾æëâOæ•a\¶ýïÔÃøêuàHO8È—ë%ÑûiØ>Ò’ìça\ •س÷ºá¾9òïæÀ,5âB;ûP' ê+òg^?Ô¿“Ä»Ì À~\5?c=‰l¸?êÙëÉëà&à³²B8Ú!Q‹s¿Ýy§Ùè¿ÂñÒª‘€ºže¹°±vh¬ªœUz1tpíO—ʧõl0/W3Œœ ¿.‹`ƒü ÎOÀû&“ù¯¥5ýwÿjè5çQ#Ѓ:ïÚLœ!=nN`3Œ³unUØÜá™6X´I×S fþ„y{¤úì·A®sƒ´åmÆ _?kÔÁ¸µ¡‡­ë&C? ¸þyõ3Ð÷ Á­ÏGqP¯ùénèjtdCÿMÙûå” è»Öüa©`¿Î(³Æ8÷ßW^—+;Ôõá|ũ÷za»˜ðð(à9Áî_Œç6—ׂú ~Ý›•(€q¾~;eYü»/¦.­í‹ úíã?‰|ÃûM-îÂó12ÒÕ%0n©o7ûëþŠ%?t ß(4vÝq\7ÓTòù òjî/QsÚÏ«fãP4~Ûú¦A<ç$Þ1¶\ò¹!~è!¼/ÍZ&1ìK×£÷¬v­JÐÄ{¿’ÒVá9[>öEAê|jO¯¼ ú.zÛ¦¸oÄEÂvîv»kòj¼7ñå9 nxF8ߟ~×~\{ r–§õݾç¥ñùÄ ¼÷èpà‰¿h.­6{(>ÏÊ£½Ð/o »[Âû’ûÔ›#¡äˆ.n¹N\È·üâ0[ÄÔY—q¿„ÿî ðcðžà‡² `dœ‰˜Ûz ì)‡Où¸n“š—> õ»Ö³±ïëú}%Éôоcsüèïß«–˞خò¢RÆ×ÜäS¯1.c”PHU3ØéùŸžM´„zÚþ~²6Œ“þgg¸Iœdˆ,Ð{ÜùÃJ»`?Èž®Ù/ ùßxêÇ‚(hgöæË¨Çz¦\Ç{Uv9û³­†ú¹-ÀñäXöÒíÅàâDw¬·Z… g@~ƒ¦ø½|Yú⢸¶,ž³ÛÏÃ;z~ûR·\îoèd}x•þリ‡G2¿Ðž7ÐÜ´EôØ»¥ëÎÖã=I`ÇÙØ è4¢_òËä\çèoÞ¬…~ù÷>.V°æ§ ´ŸÿœWÞð=Ço‘¦;áïæÝŠûq=Ðnù®Y`7xì•Â~Áv ×®§pàþ(Ggß‹ûqpSWÄsÈŸ:Ï—QK(—ï¾.ÙÛîT©RY÷³ãvM¾rã-œ.„ûÖcÿîÃÀ7W¿üÞ›\öÀïÑ ô³5°Í©Òò@°¯ôìIã:ªl}œÚ­/ßýÂõ‰òëù‚ _ž [‚Þ R:$Þýß3É­$¨ïÔêêGþ@ý¤K(<A{S|ýn;¿Ÿö“1Þ«×À· \ê±:2ä,çÙ”OYPYw+CŒç›8s­¼?~ðÞ‚Ò›l¬´\âÕ0O°¶n ôSÿÎ5sѾž¶¤ê+«³óÀ›0®°E_ÿ¶š­ÎÂ¥›ÃÊ›rÎË2ø<ô'­ÃZ¨¯°°Bù«0ï»=Sï‹wØ5õÂê±¼¡£Y›@Ï1-½Qèï70’é‚rEÔŒÜóu]Âx‘¶Yð>îðùѾ_Àûú‚?ƒ=h£úýÐ'Eþ”ö´Kxôû¨Ë9öxŸ¾ˆvÈsüÙ…m«@olóO·[‚öBcþ}¼ÇÜù°{Z´ÓÒݺ"ùð„áž gÀûª|NÍ}¿åÚŠ V0f‹>ê„q(îCÕè0´“ÓÇG:KAo‡üñ•û%yÆÝ­m’ОËS#ÎGƒþá›% âÇV—ùëH†[´Ó®3kßíç•o¡½ü]Ê~uˆå4=W0©[»sÈÛHÒ‘(èß‘ŽW/U‚žHõWmƒ÷ìrÜè ó?Ùjž16ÖÁ¦›—ß}’}i]2ÌOŽ õxB>böØìZããÎXY^Üïá¦Wüä€ä©*³x Æ#å·9Í´Ùqzä×wÿïËwÙ§q¯SØC6f¨² ~ÒÞqçe™ï‰zÕWø~àÁÍèÇÜ>³Çü:ô#_³vz ÷Mn¾Á{]šU¯ß†ùð6­ƒ¸ï*}ëéÄÝ0¯Š×~WÇqã–i@=Šdütýö늗¶‰ ÿ¹SíøAd/ŸÖ|úktâ…»0¾lŸºùü#h§¶ž¥Ñðôï“waÜŸÀ¢~ù—>¸N÷fCÈKÒ͘à&Ü7݇qy#·UWC9ó¯íŸ(ÊÃøOjrGa@yNøÅ¿‡vÖ|°Ýxí‘è—Žwþµiú¬ÿüp ny/ ?À¼áEŸ ÆUˆ}3rCƳÔoê‚^ðwçÞ ýÄjôõW —ЍçE ÷"C³ny°Õ) œUw‡÷ûægÈîÃu×.y\Ÿö0{>ªŒ~È)›Âs¡ý]Žž Â8.»]sÒ¡Þ#ÃoMhíƒö`(Åû55eoÀýæÕóÇq>°þÔN Ü_û¼N…¾²ßðô3Í©*û÷?â+nèE¹æáCºÿùëÌ=z91~ªãâÑüPo.Uw3ñ¼É‘ _qÿOP`ÂÏ} ×Òwó„ñÐÓÕæb"ðߊ¼€ü&ÜÑJÆ~+wvx×Ç=䔬9Ô©ïÉs@»:zz©Îs>ê]p‚~ãáÑЈ÷¾Fp±î¨ƒÝª7+Æ'ÏS§Ó/€¾2H¹sÀÊeë”ÿá6|_Þý0êU{ïÔ Çab¾…ß@^=çÝ”h‡úÏ^ðâý~xŸAÕÅ*£ø'»þà9™í¯vÅ)Àü=mí³Ã7Ùê„„:Çð~0ÛõìeÇ!?~‹²fâý–AÛÇ Ýt¯œãÆqµáÞ…90žý¾/rl²ÙðU&×ß÷£@ŒèÚÍ®ãž|zu/úW#v¸Dÿ…c©î›ˆéx?£Þžp¨çøáIs¡¿Zö&J†ñãÓèEiWL¿n,‚yÒ4±}`Ÿ™tç „q6f„·-úÓvk¹yâÀé{Ýíšû*ìÒç_PþÀœƒ×!?oøfÂ8·ó|o^Î$¨¿ Ö—B¡}’ò8wƒÞŒ|¨$ãäN‘C2@ʾaéïec¥°]œ›‰ûo¯}ôÛ õ—±àý¢&<—ÓýBúMlöó6ÐÏ…OËÎd&Áx»c÷œ_P¯q»íV=–¬ðrº ünNùDè ó«“°> ]ܸóŒÙêRÝy(Á<(ªâè–£PßAЉ*U!0nqß5¯ˆc«+²NÖUqnûç«rà÷%E‘Ý §©'§Lƒ—b–³gŒoÒG~Œßþ½ÖkÙ///¾äÍ»@óx;èéAý†Œ§8ü3êa^­N6VIAø¥;çÁ^Zîsïó+×0½’ªjnYú*¹ÿÐþÿÙoæ°gÒ0®×d žÖ½lä6GïÙ¹åF˜2´k‚ø¦ª3 §B[ Ó8A?%Û©=ßyúß’OÙÇT¿j"ï±u“ìÖXíµ³“§Ör%è§—Ÿ]„~e™Q„÷Äś๶½·w ß„ùB0_YÈ=ÐÇAÏO&ƒ¾È8uçÊ»qèŸ[øùWœ§Ölv9¹ïÍÔ½¡ß˘c³ê7.ŠH»#@ûûêK6`Ï©97ý¹ÍÔ<üIì+´G·Û­+s`üHãú$“uÅ÷!Ì—ÃØ~¼ùaù/Ì) íêqiþ÷­ðwö«Ã0Þ*<«ÄsEIü–BC0pÐ1itû.~^géýwPž±‚¤Ð_ÓýÇe×À¸æp}Ÿ:ž÷μs…÷…ÌÃÕ&2å@~w«Í_VºúͲqq¼ÿ§Ôóþ…gâë’¥S. üЬ›¼ú¢#ÿOèGm½³•q½˜;Îî:ôû°–> °CÖÎ~‡ñi^p¼æõ»NUãwg…(˸%Bý¼Úý#í?=\§[ñ>ý ä?=>±7Ÿ¥kXºãõZ‹îŸŒñ®²NYíí…q?â§hG襸|óòaèKº¹`œ3\<³eÈK¦åt—ßWÀ~\d!íe­7×ã ùߘôôX¢cóÞk @^æÅèÏ™r_Üß²C ÆÙdηðüiÑIu¨ßÌæŠ«ë@ꊛƒ÷™D¼3>€ûɲaT—‘¶½çW.?åÑÿ¹;5ã¯Ús}Ò…ü&¼|=j r2ã^èǧi‡×ráý¼NgûAÆ]‘߉~—´è¦ø¥Ï„÷mNìÐï“>Ï»¹U ýSÚÑŸÒ oÜv¥[Ä ÷xú¯4pQúŸó½ÛR8yD!ß™6SR< ŸxKï=_zÉÁèWÂoÐcþiO~¿€ò¥ èT9€Ü¦ Þè–ý°ÝÓ¬K äÕyjV·.Æõyý|ú5¿Æ ‚܉~iw5ƒò Œã¾ùÛb¥a z(þ”þ©¢30)óèºt>÷Æ0oâµ}p ã]q¹zƒÞMªÜ]‰þ Óo¯ÜñþÁd¼ÅwÁ~Þy©þØü]?n‹ï´¯YÄ¥…ÿÆcyV¼åÀv¼gû^ø^Þß\bA¿†æª9¢]#.Ÿº ô^QRÛ|oµz‰T¼w Úr¿³/î#ÓK}>†qX”„*q?øŽîÇ›Î'¢}™ä“òºÙ¹¢5ósJ¾£÷?ôïǸ ÞÜýž¦Ð?BòuS¡^ãÅÇø #M‚Uñüj˜iŠÂOx.úq? æåÚú‘®ž wÙ©¥|ÍпGz9‹@h÷®*xå÷_‚ûŽr—…Ûùù{?²O^Úêíß]‹²Z»ýÀ¾M g;ÚÀÆÊ+þÈ öQÄÕÈÄe0?‹v¤ô½ Ûk¼·ª õ§8ê_I9³Ë_ÿ«'¥û¶wöáüùgÜòfœ'xü⎄zÉÿ6Ñ?ë¼GZvÁVÐ{»jWM²Ýò´§¯Îê%zù’QøNšÔͺ7±PîóåGß¡ÔõSîw¨ŸðÝû@ÿ°ÂgÙ Ü{>TÓ,¶ô|êµ¾ya<»4|} ÌO<ÞøÏ¨…v[¡S¯ì€ë"Q…¸/Ìò¾úJŒǵäå\ô×ä©VÛ€}ÛÙ’¿ìÿôÌÁAÿ™ïë­?‚ö‡QÀ5\7R×;ýôë È]CŒkò°f²ô£;ç":`^ï{øÒ”7}]Êx5Øy^Ÿ_|¹ç1>VÊ€é?+ÀÏ9­Xlr›…ùIW ûPlzV+ÆûÈYz)Áù ˵8[×ä<”G z.ä7%g _/È«ÿì‰ø½åeã¼7+ ¸®yúKŠRæÒõ_µ›Ó@^Cvk>‰gm€ù°ë'ÿ (‹ ŸÚLdÅw€žO¿¢'Õý%ΚsÏðÃÊ«Á÷üoL®®/ÅøµR• âŽm>š öØ?Ï •á‚2Ð÷a’½cJPîèÖ_ާ >4L\:ÐÎI9úd&×4¼ï¤ãÑSEÏÉ&ߨ³sÈ Ú£4Ê«“ºn¶ xoqíVgÐç1.YqèǸS»ýÊŸó·á8[hU¢ÆÆ²‘6yS†ó·K{â€ò×}$Ðo¤ŒÂã>/]Uÿ:ŸUÅvä·õó|G¿™ˆÚ}\ß\ƹŸê;ˆ}Åw´¯4¼>«Ã8­:sR ê5i­ãÖx.úik”×+PrÃ!È×v=ýèYïñ0îŠ*ð »K‚mó1BBî½NûËõi²Às—äÚaëÎåо§ø3y!ÿ?Y 2Bå OòoŠÏÀwÃn¬°†ötÜ+wóô§BÇË0ž‰¿ìºègj¼oé_ûâ¾Îô}fêg¦l ãJ’»3ô ©RåB\GvQWwMƒþ¤¾îè~mèw[ן«TPÄûŒƒ"¡]TÔ-NYC=¤j¼>+fòõøý•j ¼ÇîV$Þ/š».Í æI).ŸÔõ÷ßüä2Üïb.Êé‡ó'£;o@^2§ß9‹ñÌŒ§éú†AþL>?sÆ}$®ƒ·MaÞËrâyrQ翚ï= ¨IÕ}c(úê÷܇P$>rêËûPo+Î/Ò£>ò±cÜQÓjŽÄkxîX'ïsÌfÐÈ¿íÞGœýðÆ}a©( ðâ¸h»µ»êÏæG—äÃUyÒÃÛ · ÷¶Å?{̯~Šæ ÔŠ—nàz 7Ç~¼7žçõÖÃÐ.\Ãvÿî© 1ÏnÂó÷Iù3O™þx\¢ýÄ®màÐ8Œ+.R‡âÐO±îhÛ(odØ×[á¸oôý»ögP^­ªx?œOÕ¯ùÿbâíÛYÿ݃Á²©vO¾õ<ÿ}7'®3ñOI^ ù1*{h _ƒqz­Jéÿ@=ò±^È»ÁÏÓ¿¥á½Fݶ/xp}¡>߫ʬû¸JäKA’ïž'[¾5Hï[Ž–ÙÎÓ‡çö½¯N†~¿CÒK´+mo,ÌEÿ{ŒÕÍ'ÐÕä~©ã¹5I¹)“ð­™4ÿ ŒcæYUŒqi•C¬Ò ,{–­¶€òE¿éÆ8ˆ\·çÈ¡ÿA(ýþHâxi3 ìBI…âp<å.¡þuÌó=VîZ#Ï0‘ÉoÐ/Í?ŸaÃ{wßÚÌ<vªwF—ÖSÐön-Ïñ<ô2‡°—ï8ö¹x/£»ÖeÜ'¤£¹«¾#ñ6³²¾kà[ÿØä'~Ô`¥1ꕲ~§*˜gyÅÅ5‚üù®z²’þªçÊyê/V¸’Ïò·éŠ«kS<žÚ·MækAÕÉ—A¿;ò®Ä{ÂC¥ÆÄ`>¢©Ù¸Ï'î¬yÖíïþÁmÔw’¦ú’U0Ÿ0[ákòÀJ>ÄuUæô§ª¥S ¿Ê!Ë8_¢>Ønÿæ5,ûƒYx¿¼«ÿò­ ’¤.x™ÀûöÏù„\2&ëù0L°ÛŒë*³|†€ýTû6ºÆÕ%q¹NíGVC~í}ÏéœÅèVG…€]¾\Gq/è¡mgy*ñ¾Åöç¸NX£¹÷ÇÆ´ærIÂ8®ó›·¼ êMî»à«"(¿Ä¥ïß®«ªèƒr9®â‹B9þ'ާ7“pöØË›Ž¿~À‚z·¸Õ?GãÃgo:õû"ÛÂì“ù-£¸?0è´ÝíèÛ¢ûj3Ô—£Ö® ×,$aæ|°W=†mø›¹O¼œcê ÜÃe\³AŸ†<·`¿Xí6É©æMuÕ_ÕÂø’¶§‹÷Œç÷*§M€¨~pj´¯cå¥M¨G–Ëv¢_g墠]„·b|„ÀÃû$Råð~Êz‰R\—8!÷^-kLòA¦¯AžÔ³A[Éä' Ç&9ÉKñ:çýîKÕ¡ŸDw–¯PÿŸøº'l–¯†r¸K–ÞP‡ryþÙ7Œço¢íÎùuøU•‰¨·(ýSâaþ&üdCñ¶:Ï?®9tµüé˜õeÝ¥ûà ô+¯A½óJ ?äKÿB?šuƒ°c è]I‘GM°=æ>ðäÁ8daš“ñ\ÁkýË`—ÄO?à´øK¾7q¹6ä+ÀêEöض:³˜©WÈfÝèGÔM§nà= Âë.â¹/9•þkÀ÷½:x=Æ­]¨ôëå•õˆ,Ô×r¡c;qý6œóÏä!ÐúU—eÐÿ˜²|BÏçßùõ×¾%/Ãy³‚a¼‰Éš¹ö'ä× #+Ïx5=í h`‚û=„ŽÇócÿú[ÔH)(s¹(ÉjÇø®Yö+{j`ܱ±NJÊÄuíS{<.AýÙ¨‡‹â¾Ÿò•–0židO’*ÚûG.ïƒ~à¿u(³ ú…k妷C0~*¬6jG=â»nŸñ(GøÓŠh_×Õ\Ò¯…¿{®™¤ŠqÑ}š¬•á;!wÏ‘}ã*+¼w.¶çªû÷ñþ ž/¿$¡FñË®4Â{¬/ WŒà8º³çþêó¯(ŒŸaw2­ Ï]Õï™zˆë?}d·:äUô¿‰s$Øð>âà÷·¡"Ïð®ÄñpÒÖùÜP>ey¯‡i ßòÂÇú4ÑΚçV òTÔ!rï#ôWÉy‘xLÀ®+Ÿx`ü LXÜój—-¢Ã·?X÷̹(O¼–À©9 Rî)š<Í‚ï^ôÿœ åµù(¨í…û%rš²â þÂÅ¿t5~X&>÷ìwÌ—ÂÏ-Nð]Wö)|8M8]¸ï±\,~O ähÙ‘#Fx.ÓÄ6û£$æ‹ÇÝk¯­{ÍþvsŽ‘²„þŸ|×¾r¼7H­v—è±°îŸ'Êq\¹ª§Œqúå/ T顽/¥ï;ô×`Ç {ð>)‡‹í;;ð¼ßžËx‡ã’ çP.ï0+OèïBá!xoÖ2‹ÁÅ–ðô_ÞÍ5 êoûc§  LoÝ/{(€÷±ŽÌj€ï ñ_ÔÄu¶eü:*x_z|Ð…]Â`O YýÎxë….bxÿ‰ù[«c; Õx.„á}vºÞ“Oâ:µ­ŸkžO iìZÔùLºûêfÊ °ËK?šÏ‚|ÙõµuVby/]¨×mß_ŸÆûJ¯Ï;4ä éª~7ô—ÑŠµ }½ä=ðÞ{—ûJ\¶ð;¿¶æÄåÐÿC¯¬¬­qÇmo—ô;M{ÜoåÛ]÷«~ÿ·ºÎ¸#s|'Èᶃx?ƒkÙyŽÃ0îÙ2ßÞå0âTy r©©$|~o)}=~ä&tb:cô#«k3ñžqï+É)oÕçàÅhŸ”âL}<ñAâÚcó¯~7q=ø\Kñ °s\×lûãoį'QЯ­Êuà=,Çëò·£»¡ÝSØ[×Ã÷MMMÓ^üÈE,©áƒ§Õ¥ã?*ñÞýAIŒ¿ævµÆ·þ¿x·KÝÌšñÞͧ:`GFÈ©êŠÆûßµ-‡ïø iô?¢¯ë(ÆïSì¸ón çëvð~ç—+×`¼Vc®à}¸ÏÝ'wÓØJУfQSo\‚rÊž «—‚ô ­­Wƒ<ûEwÊ'B9•B]·~>ßÈÎÏ2©vMñã øÝÇ´}·Èu}ù§í!îys³Pþ•î´Šãz6ÿ‹ŒC²K±ïõrÚækùw=ß|÷i‡<*qEѦë^Ž5x¿lrÈ*Û0õ¯{#7ÁwÓ¬Æþ>ðt†¼ß#0¦]øIªnm«a~WÚ{ïKtý|¦ãÁz¼wÌ¸â§Æ ÛÐ íä:-¦AìëfÓÑŽË©‚¿;ä7®T»ÄúM®î[Ó^—çJM>çä7Bý¹»³mÈmöå!ŒûíhY Ow[“8ŒãxhÚë"ȇɥc]†P?Î/æ<^ ócG‚;Í ⵩y0¾±4ÄV â~¤¯¹Î£_Æ¡«µEôP¡é6\ÿ ó5Œ{Ññ@LžÇ÷Œâ0ŒAѧ'^7Áî±ßn;ýȉoûÛÜGc±/TœùöŒÝ¢àãj»—)ÌS6>*Eûî^ÁðdÜ÷„ÝçsªÂ¡- OdsÞßá‡üF'Ëÿ–ýcòaÒK¨ËѤCŸ¡œ|Çíæ{Ãï-„²¾à¾WÙn®l”£„*¾À÷?¹^,xîÓžôæ¤ÿO×aµÑܘg˜7¯ûµ8×Ï]‚{¡½M¿ž9„q¢«ƒ"þ›ÊŠ-OlÄyƒÁU7ÁPÓÛÎÇ‚ü™ðlïÀø '';ü7øØhvA»x|2–s€ï¬û¥"ýK÷Æú^]øsÏ™h_÷uõ ï@Ûàc¼Æm–q[ù$È¿âÎ¥POæS\„v0uÈ_uê3ø.ÿý!°ïýŽ:<æ„÷FtÖ'ãüjôñð6°{´Ì‡÷x¢?Cˆ·â"ŒŽÂ_ÕDv£=íÕv k_Ôˆ¼/bå‹´ÙP®x‹ ùÑ&ÿÙ7n÷]ó®‚ݳý°çÌbo\¹jW²€g»äx+ÞK©vÙ„û,B¾JΨ;YEÛÐI×£ÖøY㺷à«ô¨GׯL¸@ngÉeã9MÏCÚÖ¿Ã2oXÐý­”^ü§ÍS~›¸OaIÔg迎Ø3Í/w{ÐÙbh°à›+¸Éîè¾ì·´ÃEZ0~«hY*IÄcœ/ݤ»ðw‡©Ûð¼ÀâK±ï0~†…@¿úZø¾Á‚¡1ÐýâòFu >§ìýôÂ÷¹óËLÇzÕ6>ëó–ÝI2 ¯»“ü7ã<üÇM¨O_þùöx~Mü ?Æ£þ{ßg_MQÂG(¯/ŸëÎôfܯÿèÇÞ¥ÐÞÓ¼t/ƒ}%X|Fæ<äÛåö4Œ8XR' ýμSÙýÔç–y\0Ž[à£#»¦Àü,h}ùë+0~ØGN8:C{éh³—ây“ŽV Iè§VÝ*m’PNË_=± W‚KRBî¸)8Ca4äγ¹5Èòkñ©gÞ£.5¼åG¼?‚÷Öþ›Aa:¼/FX;ï̇wìøöãžÈYUà²3Ð^†6û£ü[JÅ»aÜô)Åy­ çÅÉ\¡Ü–Ž+:g 6nlw äÄj0s‰)´Ïßó¹:{&æa6è%‹O?C}EÍ9ä)ØKî’*ŽÀ{uJ絯†ôhƒox = w4a¼‘Œ’Š·ümà~¯·Õ|PÿÑš:ª3 ?´÷4â|½]ïÞg®¿È¼d´¯Æ³ « P¾Í'²¢¡ü‘W½VC>¶êL„v×f³B¹¬dK»na?ݘqŸÁõ>ÙŒ+äR&³ø±žµüóú·CÝã®<(—‚—iË”×û‡Ï¸B=„ÿÜÍ&ýÉ:l«Î°‡Ü^¶ãyÔ$‰À- _Ýή~ûÏéÉ$õcÜ2•Í×D@O,’Ó‡|rŸ™÷é¹¼—^ ý_Ã`½ùv(Ÿ·á/A¯‹ü†ïnV]-÷޹q~Q>å6«ß/+ràkRø%ÐÁ…ßú=AÎÍhíÕG;nÚÐV(çæ)—äû ]×OcOH`Ãû¥>Ö@¾¼$ʵ£#ð^Îûéx¾Tþ׿¶2xÿºŸbžxO¯»˜×ˆ´ŸÉpyÆ9h‡ž¾|ïŸ9uáßqÏ­ ä<É»ÂG4aæSï ›}›vÃû·Ö,«ÂùÀåi‹£à;¿:6‰Áü-èÄYÕ78O\kšˆò¦¿7B êÅháÞwxoä"¾æÉ7áûœ¢2PÎxÏ-1ÇÀÞòso\÷ö©^ÍÆ{ÐÍÄîÆý>ë§ÜnbÃóKa1#¸ÿb¨ó'Îû¶­•¹ˆûÅ•åj†¡¶½îr‚ï(]tb›ö‚X«2ÆÉ¬<)zÁÉ#¦ ÷…yý´ì)ÓŸå7L,ÿ=ž—¶UM8ŽñR‚OösUa|ÁϺ‚(ïE§#î€üø%(üÄûvâÅÎO}Åò¬Âù¯ßÃß¾¸YêîHäßÊÍâÜm¨?Ã…‹á»¾Ÿ4åq¼·úåmˆöÕæ}£± ‡^êœQ' ÞÖe,Ã{ 8–$¬¾XdŠe¼ß\k—I9Ôƒºª¬g ¶Ùœ·;ºp:Áxfz)sÚ/ÈŸ*ëél#¨o÷ ßFbá}á‡v鈀]”qÍôÊVéÓñ8ÿ3z,¦„å °ÞÚù󭼿-úШgÔ,ÀÏÛV¯S‡ïè3ïk×Áw·.~U õj{÷Øùuö¿Ê6ÚÃwj\ÉÄø<ë4š«GÙŸ,19uýd?:ã*®ïß ó– 5ÜQë ÞÌ×[dàþû¿ãÔ¹¶p”p@=¸ËÛs?„v´iXÞõe6ì³âèý&Ñp¯ÔÒ_0Ž;,z‡ãJZq›mî^hç+çGà}có46þ›ûƒ3çyÜLJq]ÔÄáPŒ¯Å{¦¯Àuué›pýÀr÷¢T<¯¿™W…ý¼?eÊ£Z2À›òõLU)®oŒ?ønÌ ŽÈOò»R¡Ë§ø]G9’šÉ½ækßåò5`?z×|»åzÔðÓjŸ)ï…ovŽc²0«åý¾0ß{Øs÷ïë^—O…ù2K¬çÏ;!x¿#Î Q<‡\³³»×Û+Dz 0Ž×…h¼ïÊöaÇæÓ '\w-tÎA}Ò©Àñ­ýüS\C=Dϵ<94úÁí1íæ7¸Oð»üÎ$¶´ Æ‹º€˜iƒÐ®/·´Œ€¼ÚU*ùg@}iî(Vƒ|˜Û±¸! ­}&p^°jfö1ȧXÄðz¼_ÇúèR>œÏy°âUï´ÐpÁ hC3f&ÆÁµvÛó@ÏÀ›ŠPOþ?"lv£þ¼:(ùŠ®)Œ» r4Ÿã‰Ð °c2÷j´‰b<¯ç÷[@ÿ˜æìn9¶Z­}åó5·ï;(—£„kîûNâî¹w4U8‡ëCê¬çâý?,(§ã}±k¶³¦¨?¸Ÿ,°“±“†~$Ù÷8å.ªIñîL°WBÒ9>ËÂ|Håfnh&Œ3:R¼¿ð^æ ?Or6À8$Ê­¶þîsé>Þgï´¾süNöÕ®B¼ß.lZͽø}ÐàL+qÜo`Ëùù ȉJQýðNø]P̸z1Ôÿu')œO›©¨FlÌýÏu-<{k3صN«[²A>-7z-üõe$œ×Wí­xk¦V¼/Göü³Èó‡á}z®ì½Ðï4žüfZà=ŽÚ›Z¶‚žq4Éðr€z5šn¡ÙíâìÔ%²«ýbY¦†Ð^ŠBÓ1®¹ÛÍýAŸOÏóMžË6üî v¾oÿ ÇY÷ì§;qýK¬!?ìªØ^ùÕ|ðMË%)«€'Ý>*ûžC{;ý5`üº_| 㩆LÛröÐ8Ì›g­ÀøO¶>>§`¿¶{?‚÷Znü:° òà©!4V†þ–:îbô?­›eÈ r×–¿ÕäÒÝñÁ<©q1™ý‰ÁÊæÖE`:k¬šü äÝ yÿe¿ãGÔ­å¹à9ë—Ûnð7|7V’kõ_÷û« |=§qöЩþÿæ/z-¾áýºaÙï· ó€Þü18”úÑóÝ룿ñœÖ³gnU¸ò÷½ã¦OæMùåˆRªõ©„vù;ž8Ë—kaÈ7ÐÛ¢bÅèW•(Á{¬E§b ŸO©)%þ]m5¢ìz ¾•QóXïYéÁ‹õkš)–|çµûS:“ПÝù!å-ðµ¹/ö¨+9?íç5Ý3êŒ?2Çç\ÛòÅk¸Lã\Š|7B?¤ÈW åòx\wHmê†zqün\‡ö·ÑQ™{´Çäïäêƒý !Í©ƒ÷6ónýØUí*ò w¿`Öý'Aø®]JDaίßú|°†vvËé¯_õ/¡|åˤ^ºß¡¹™­n{\ó¼ßÊyùoW oÂsB‰Ûd?'±±äwÎ v{±È¢ê/ñëkô˜XÒvx‰™”½'<ã7…´ÿzØÁwrF-Øë1F×fC;»_Ý„÷;%²=)t†ñ0Ða™îè×ÛoÔÅz|yÛ™œðº ï›üÈ9òõOœ—~§¿öEX4Šâ¾ƒÙ æþÁùký¡6.÷‡òÆäÆV°Àîv™®  ã‚è´n•é^»É©¸o<È(2˜Gü¿þ*¡VuM Òõ?Ú Çc|Ègã>xžî¾†ªŒëº³KúpßÊšU+^îÅ~ݰu´_Âö7œaíx?×Ôì7AW_s³¡ýàþùåhWçãëö?Ä}¯º¶Ýý¥%ÿ¬ äÈeL]îÈ‘Í ÛèGÿʯÓÛ±³ Y×vÌB?!OGïL™2 þÇÎÆÆÅ ÏÉ.ž¾ð˜ ÿÁŸ9`Á6íÿP¦ÅÏÑ×5þ=Ÿxlà?.â²ýõceÍÿiðß?5ÿùçƒÍÿý[\ô¿KŠþŸN õó þÿùÎÿ`ÏO?üÊ,·R«Ô>¬¥ViÕzzÅÿõ”)Rüë)—KX^š°üñ2ˆÏÚBéJB„•º+Ç_e=ñU:(}Û]ÂjÁ„Õ—_ýñ5ü(]˃°67aíËÄ×q"¾îLJןJXÿ asâLßð¥&l¢MØä ñM÷ßl¥[(¶xCØ2øV2Ä·¤t›'„mS Û ßîñíã)Ý1’°Ó*ÂN­Äw!¾Ë2Jw[HØ­ž°»'ñ=æßã ¥{Uö¶%ì3ø>g‰ïkAéþF„ý8Bü@âŽQzðGÂ!» ‡*?ô-ñÃò)="‹ðv ÂÛŸ?2øQ"”³pÌ=±QÄ[Mü¸6JO¸M81€pÒ"â'Ý ~²¥§ºN›M8í"ñÓ툿ƒƒÒ3Ù g–Î2&~Ö8ñ³Ë(=ç á\u¹#ÄÏÛCü|eJ/”#\ø’ð®lâI¿è¥ïî!¼'‘ðÞÄß{Ÿø%Ñ”¾?Œð~š‰0ø¥‹)ý0áÃ×q%~Ùâ—]¢ôcç·"|bñOTÿ¤ ¥Wè®øFøT)ñOkÿô'J?ûžpe!ásòÄ?÷ŠøçwRzÕÂÕb„«{‰1‰ø—6Qú嵄ñ|^ 'þUâ_½C鵄¯û®ã%~]-ñëÝ(½Áp#'áÆóÄ¿iMü[“)½éáÛÇ7ë¿ù;ñï¢ô»%„[U ·~ ~Û.â·+Pz‡áŽç„;3ˆo3ñï=¦ô ?Œ%ܵ޸]ÄAé=Á„{ù÷Þ$þc_â÷- ô§\„Ÿ^&üÌ‘øý3ˆßÒN4#<8AüljÿÒ€Ò_k~ý™ð›}Ä»øo‡(ýýÂr Ih€øÃ™”>’Bø“0áO]Ä#þçõ”>¶’ðØ]Â_Cˆÿm)ñ¿Ý¢ôu„zþÅMü_Wˆ?îDél OL%^½›øk”ˆ¿æ¥¯{Ax}6aA â >%þ†4Jß”@Xha¡ûÄŽ"¾ÈjJ[NXì6áÍÄß²˜ø[nPºÄ5Â’.„·Î&þÖ‹Ä—²§tK²“Ë–_Θørã”®ð•0ë aE â+Ž_i¥«V•#¬ú’øÛv_M’Ò5ÄkôÖL$¾ÖFâk= tvºá„õø‰¯×L|ý@J7ô&lÄCب–øÆ®Ä7™CéfÓ ›#lnE|‹ÉÄ·¨ t«c„­õ[#¾M)ñm5)Ý^…°ýÂ…Äw”'¾ã+Jwî'첃°ëfâ»öß-‰Ò=b{®%ìÉß+‚øÞ”îËGØ·‘°Ÿñýy‰ïÒk9æ$~ðyâ‡XSz˜)á°?„Ã?BŸøß)=r”pT áhUâG?f¥Ç厗"ÿœø ÄOÜBéÉB„“»§Ä?uñS;(=½…ðŽ`ÂK‰Ÿq“ø™¾”žíNx'á—‰ŸãDüÜ”ž?•pþiÂfÄ/˜ ~á J/:L¸X›pñgâïÞGü=Û(½„E¸ä á}yÄß/Müý”~°pi áCÂÄ?ôˆø‡ã(½,’ðÑ•„Þ%þ±â_Fé'þKmÁ³ÜƒøÜį¸Bé§«Ÿ±%|vñÏž!~¥9¥Ÿ7$|þ'á Gˆ_¥Cüª/”~ñ#áKÅ„k‰_ó–ø—ó)ýják„¯=!~m*ñ¯‹Pz½ áú{„oD¿añZ)ýfá[þ„›¿éño{RúÂ-³·Tÿ®ñ[9(½p{9aƈøÌ/âw”Qú½„﫾?Bü»‰ÿP‰ÒÉ~ô‚pw6ñ{$‰ßó”Ò÷îK üdñŸÜ'þÓhJï#üœŸðóÛÄ þàbJ9ŸðËk„_¹ÿõl⿾Héo+ ¿³$ü~ñßWÿƒ1¥ëþJøãAâh䥾'ü¹ð9âyIü±”þ-ðw1¼Ÿ?‰ÿs#¥¯!<ÞNøw8ñÿÿOó_éílávvo“xâéYû¿}²¥Ou <“ð´sÄç°"þôÉ”Îù›ðŒc„gêæ7âÏ*¥ô9{ ÏU!<÷ñ¹vŸ[žÒçKžßO˜gñy7Ÿ÷1¥/|HxQ,áÅk‰¿˜!þ’J_Dxáe7‰¿Ü‡øü¼”¾b.á5„W:Õ â¯:OékN^kJxíâ¯;Nüõ”¾A‹ð†Ï„7–“*ñ7 QºðkÂ"¹„E¥‰/úœøb”¾%™°¸añ.âKÄ_r¥K­$,ÕBX:˜ø2K‰/s‹ÒåêË{Và"¾ÂeⳜ(]Ɇ°òTÂÊgˆ¯bF|• Jßöƒ°ÚaÂêÚÄWÿB|}”®ULX›EXû ñuòˆ¯+Céúâ„õŸ6H!¾¡0ñ Qºq'a“H¦«ˆoz—øf!”náGØr!aËzâ[yßš›Òmg¶­"lgK|ûiÄ·?KéŽ' ;vúI|ç#ÄwÑ¡t75Ân »ï&¾‡"ñ=ÞRº× aï,Â>Ä÷yJ|ßTJ÷O  H8àñ£ˆ´šÒC–¹M8ÔŸøa‹ˆvƒÒ#®ÞîB8r6ñ#«‰eGé1„cÙ Ç–?Θøq¿(=á+áÄ„“Ô‰Ÿ4Büä=”žZ@8MŽpÚ â§g‡$¥gŠÎì!œ•Hüì ÄϾOé9m„sÃçñ?¯™øù”^èMx×|»®¿È•øÅs(}ÏtÂ{ÎÞkIü’IÄ/© ôýG Ð#|àñ$~©¥V&|ø=á#…Ä/“'>^"Ïcý„§>!Fü½Ä?™Dé1„O­%|ªø§Ã‰F€Ò+—®l$|·øçyˆ¾–Ò«.®v |‘“øÏÿ’¥_6%|ù7á+LjUŸøW¿Szí(áë%„ëTˆ_÷øõ»(½!‡p£áÆçÄ¿¹ƒø·6SúíM„o?$ÜKü;눇¡ô»-„[ƒ·ñ¿í&ñÛ})½Ãp'áÎâßs$þý”þp ᇧ w™¿ëñ§ôžC„{µ÷~&þcòo·÷‘»ý)‹ðÓׄŸ‘»½ŸüÛíýäßnè#<˜Bøù·Û_»ý%ù·Û_o'üf%á7äßnKþíöwäßnÿ°€ð‡:ÂCäßn&ÿvû0ù·ÛGª²!áõW ºù·™ äßf6U²$,LþmF˜üÛŒù·1]Âb_ o&ÿ6³…üÛÌòo3ïKÞJþmf+ù·)òo32é„eE Ë’›‘K$¾<ù·Ö¬vŠäßf”È¿Í(‘›Qi ¬êMxù·™mäßfÔÈ¿ÍhØÖœNX“üÛŒù·mòo3:¿ ë%¬GþmFüÛŒ~)¥î%l¤B؈üÛŒ1ù·òo3f[ ›õ6'ÿ6cAþmÆ‚üÛŒÕÂÖ1„mÈ¿ÍØ›±%ÿ6cDØa aòo3ŽäßfœÈ¿Í¸Ì%ìRCØ•üÛŒù·7òo3§{šö$ÿ6ãuŒøÞäßf|5 ûŽö#ÿ6ãOþmÆŸüÛLàkÂA9„ƒÉ¿Í“› !ÿ6–L8\ˆp8ù·™òo3ÛÉ¿ÍD­ ÕB8šüÛL ù·™˜›”wp¼;áòo3 äßfÉ¿Í$ÛN™B8…üÛL*ù·™Tòo3é?ï8L8ƒüÛLù·™Lòo3ÙE„w²ï$ÿ6“Cþm&—üÛLþÂù}„ ȿ͒›)$ÿ6SÔI¸x;áÝäßfv“›ÙCþm¦Äð¾…„÷‘›ÙOþmæù·™Ò™„K«"ÿ6s˜üÛÌaòo3e'5$|”üÛÌ1òo3Çɿ͜T#|r˜p9ù·™ òo3äßfN>“Eø,ù·™³äßf*ɿ͜'|Aðòo3UäßfªÉ¿Í\ZFøRáòo3—É¿Í\&ÿ6sõ*ák΄kÉ¿ÍÔ’›¹Nþm¦Þ‚ð vÂ7È¿Í4›i ÿ6ssŒð­„›È¿Í4‘›¹MþmæN>áYÂ-äßfî’›i%ÿ6Ó.J¸½›0Cþm¦ƒüÛLù·™{m„ï‡~@þmæù·™‡äßfyîžO¸›üÛLù·™^òo3}„û* ?!ÿ6ó”üÛÌSòo3x™>Ÿë~Nþmf€üÛÌ ù·™—Ê„_¾'üŠüÛÌkòo3¯É¿Í¼}Fø]:á÷äßfÞ“›ù@þmf8šðÇ5„?’›!ÿ6ó‰üÛÌç%„?7þBþmfŒüÛÌù·™o—w üƒüÛÌòo3?ɿ͌›ÿMø7ù·™?äßfþ»ƒ-¢ŸžÔ.ì+JéIíÓÁÞâð×sµOÇd>âO¦vê˜|“øSh=¢cêzRûuL½NüiÔŽÓ܉ÏAíØÁq™øÓ©=;¦;:­[tp^ ïÏ vî˜aCüÔÞ3§µwÇ,3âÏ¢vï˜5AüÙ´¾Ñ1Ç€¾?‡ä¡cÎâÏ%¹è˜{˜ø\$\Ÿ‰ÏMòÑÁ½øÜ´Ò1oˆ¾?_™øó‹ˆ?Ÿä§ƒ‡E|^’ŸÞ\âó’u,&þZ/éX˜Iß_HòÕ±h ñ‘œu,ê#þb’³Ž%ÂÄÿmÛyPÕõÆqrWÜ÷ˆdEY$ Q$8ÀA9@BE$ÄÌ45ÜÒÔ$5—Ì%3 \ú|sÍ=Í%2ŒŒ\"½Êû6÷Æô‡syý|83ß3Ãð<_#ΛÅ¿D¯"ÆÖäsÅXáM8b’‡Ày”Çð¦œK1ÕãMé_Ĭ†|sΫ˜§ãÍ9·2°~çV%áq~Å¢Þ‚žF,ãÈ·ä\‹•!Þ*oµÿ2ç[¬Ûâ­9çb½ ÿ }ŽØoÃù›Íx>28oËç@lßÇÛþ÷ó`„·£÷‘!•äiÀÛûáíWâíëñôAâ8 ïH/$Ž?á‡Ò‰“ùNx§xg7¼ó›xz#q¹Œw¥?×ùxWz$q;G¾»-Þ½ï~?ì¼ý’x¼÷ g’áƒðÃé›dD6ù#jñž&xOÞó~$=”xõÇ{ÑG‰×aü(z)ñîI¾w"ÞûÞ§Þ'?š¾JFïÁûÒ[‰ïëx_ú+³|¿6x¿H¼_~ì ø±ôZâ†÷§ßÿ?ñô\8ŽüÀuøÀF|P >h5~ý—Œ»‡¦“àwñÁôaòjù!#ñ!Kð!·ñã‡ãCéÉ$´J_&a.ø0z3™PBþ„‹øp|x1>ü<þ5ú4‰°ÁGЫIÄ)üDú5‰´ ?2y?É?)?™ÞM&ÅGÑ¿IÔt|=œLù‚üè¾øè|ôçø×{ácèç$&CO'±]ð±ôu¢‰!_³ ×7·O' ­ð ôy’ð!>^O´Mä'ŽÇ'nÄ'>ÂO Æ'Ñ÷IÒ|½Ÿ$ûã“éÿ$eù)õøT|ê2|êÏøiô‚’6ŸF?(i7ñéô„’áJ~F>ã*~º3~ú|&ý¡d~×Ñ#Š®¯£O”¬Óäë­ñú™x½Âg[âsè%'ŸCß(¹¦ø\zG™‘IþŒ|ž>/ŸWoþ±öÙk~o|>½¤ä†ŸI?)]É/ˆÇìÅÏ2ÄÏŠÅϦ·”Ùã é/¥p2¾Sæl%¿È_Ž/Ú‚/ú ?—~SŠ_ÅÓsJñü<úN™@þüJüü|‰¾d%~=¨,¸‹/¥•Ò¥øRzQYx‹ü2|Y¾ìþM7|9}©”—âËéMeÑPü"úS©˜K~Åyüb[üâBüâ3ø·èUe‰~ ýª,ùÿ6=«,5#i6~i-þøwtøeô¯²ìKürzXY> ¿œ>VÞ=DþŠžø‰øð+»áWÑÓÊ* ~}­¼×ÿ½­TF‘_¹¿º ~u$~u~ }®¬y‚_K¯+k7á×Òïʺ‡ä¯Ư_‡_߈?¿ÞW6¬Âo ÿ•¾øôÀòÁ;äP‡ß4¿émü¦ÛøÍ?’¿Å¿…žX¶ü€ÿ¾X¶:‘¿µ¿õ"¾Ê_UŒÿˆY>:‹ßFŸ,Ûfá·Ñ+Ëv!‡~G~Ç üÇæøôͲ3 ¿“ÞYvãwÑ?Ëî4òwWã÷ôÅïIÁïùÿ ½´ìíŽßK?-{÷á?¥§–}È߃߷ ¿¿~ÿüúk9ðþ`+üÁüAúlùl3ùŸ5áÇÚˆ?ôÿ9=·Â¦ï–Ã÷ñ_Ð{Kõò«Wà«ëñ_úà¿\†ÿŠ>\¾ºƒ¯¡—š·ð5ôãrä:ùGÝðGËðG¯â¿vÆ×Ò›Kí<|-ý¹|3ÿ =º›Mþ±ÓøãÖøãøã ‚~]NÄŸ¤g—“ÇðßšáÅ„|ÉÄK ^áU:þ;zxùî0þ}¼œJŸ¢——ÓûÉ?Ó&f/þ¬!þ}½œ‹ÆŸ£·—óíðçéïåû‰ä_…¿`€¿Ž¿°‘^_.>Æ_¢ß—Kïã/ÑóËåßÉ¿€¿R‰¿òþªþý¿\[Ž¿Æ@~…ÿ=€\_Bþõ[øøø7ð?²›.ø›ìäæeü-vrÛžüÛsñ·ÏãïØâïâbO ?}‡¯³Â×åãëØÈÏÇÉ¿kŽ¿›¿[‹ÿe¾žÝÔgàëÙȽþø{ìä×dò=„oè‰o˜Šo8€ÿ}‚ÜÏNAîïÁÿÎ^AÛ“ß…oÜŽÿ£ þHüv òàCüö ò0 ÿ]ƒ<Ú@þ£‡øÇÁøÇëðñ²w¦±ø&vÒô+þ/_üoòŸ,Ã?©Ã?‰úv³Wì"”ÁÍ^½À>B½PË+; ÕêJs¾jí„o]‚o} ߯ß–ý„j;ß–…jgƒoÇžBµŸI~{Áw°ÀwÈÃw8ïÈÎBu2Åwbo¡:Ų»P_$¿s¾s5¾K_|—|WöªëA|7vª›ß}†êþ ù= ñ=bð=vá{vÀ÷b·¡zMÂ÷b¿¡z·Â÷fÇ¡úL ¿Ïf|Ÿ&|ßP|ßø~ì;T¿?ðýÙy¨þkðýÙ{¨È7ƒ7Z7ªÇ¿äƒ7f¢Œ—âÙƒ(“xv!jÀ"ò\Ç›ºáMËð¦WñfìE”¹#ޜ݈2¿€È~D L~󯟿žÆ[Xã- ð–ìJ”åI¼ûe•‹·bg¢^þš|k¼u&Þúþ#¼ ûe“Š·a‡¢÷Æf¢lɷݷ늷‹ÇÛíÅa§¢ì;âíÙ«(ûñìV”ckò'â«ðC ðCÃñNìY”Óx'v-Ê9ï̾E¹¬%ߥï€w­Ä»þ†wc÷¢ÜGãÝÙ¿(÷»øaì`”‡'ùKð·ðÇã‡WàG°Q#®á=ÙÉ(ÏR¼'{5ò"ù^öx¯¹x¯óøQ¶xov4Ê{Þ›=ò±Âû°«Q£g?ú8Þ×ï›÷­Åao£ü^Âû±»Q~_áDz¿Qþ}È÷OÁûÂôÄLŲËQŸâƒØç¨ >ˆŽ·“üàöøà(|ðü«mð!ìwTÈkøv<*ä ~<{:žüÐ øÐ‡ø°`|Ø:üv>jÂ}|8{¾ ÎîG½ö ùÞøˆeøˆ:üÄ‘øHö@*r1>’]š4 ?‰}š¼üÉWñQNø¨|Ô%üvC*ÚÍ~HEŸÅ¿ÎŽHżL~ÌL|Œàc-ñ±yx û"¥ùÇÎHÅeáãØ©øò^Ä'¤áªñÚ¾øDvH*1 ŸÈIM펟Ê.I%Å‘Ÿô >ÙŸƒOÞ…Oa¯¤RÛâSÙ-©Ômøiì—Ô´§ä§…ãÓ6ãÓšð顸 vM*c=>ƒ}“š„ŸÎÎIe¾G~f^7¯[‰×Õã³Ø?)½^ÏJéïà³ÙC©òsás®ãsÝð¹eøì¤ÔŒËø<öR*o>Ý”zãùùƒñù…øüÓø™ÖøöTªà |»*5k~û*5[OþìZ|¡ ¾0_x?‡Ý•*ê‡/b¥Šãç²ÃRÅ=È/NÄïÇÏ놟ŸÏ>KÍß/a§¥J¢ñ%ìµÔ‚íä—¶Æ—NÄ—Váà²ãReaø2ö\ªì1þMv]ª|ùåkñåøEøE•ø ö^ªâÞsßâp»Ä ]šæyCÝm¾*ÜÁr’ešeBËëÂ~É飵éz­îp{zlpxK«ÓÆgè|³ž}¹yâÒòvóßw©»ÿË;ê2r‡ü ºüÛÓñÓ4YY-¾N ½fH¢îÙsÍw³ÿùˆ>Y?MÛâ­ö ONÓšMÐê’µYf!q)Úx}‹Çº$dÄg§={ךç¥[<>0<[k¨I7ê`æèæáìîáâòìïÃÌâò̲³´ºçšçÿáSƒVÿø^õÏ‚ÉmØ~º&>U3UÛòÍýÿÍÏ›ÿübƒ&:¦fPortfolio/data/GCCINDEX.rda0000644000176200001440000007222111645005054015166 0ustar liggesusers‹ì½i¸ŽÕûÿoÌÊT™£È”ºQdΘ¨!¢°‡{žÇ=Ùö&BD©L%e(C*$S”T2–!cé·÷ñ~­ËñÙþß'ÿ‡yлëÞ×µÆsë\ç´ú<<ðÞÒK*T¨H¡"¥òþ[4ï‹ÉûOáB…ÊæýPè†Î;véùð# .zs¡Bµ'Ù2ξøÚþÒílGïËÿgËØ×û”¯æêkøÖ;“~|Ô–©¹:ï[Ƽ¤;¿SÑ–1?ï«\Ãqü}ØÆÄ“õ._Ã~üÝ`÷‘ùÿlróþÍ´e<Êïç7cÂ5ìJyó«K¶et)”ÿÏ–1©¦Ó~'å֢ݽ*æ7ô6¢\ƒmó_ëcËèód½_7&®aƒ¼ÿ>Yß–QXå¤ïáûh'˜¾Cã’þ¡Ú™þ\þçOÚÒkó˜¶Mí´ð-•—6BåLü¦ö$¨þÄž `¼ÏÍŠÝši‹·¼§ê«ë§Øâ_\õȼm¶øÀ½W.®êt {«\ »”¸ë»{ª]ë^þìÝÖm‰Ö?OÝ{å’-ívõ#­AlªñI«GûÛªÿi£Dާß#Ô´|?7~Ýt “梓´›…‰·óšûÚþk×{‰»ózýÒZ[¢VþpßnK«˜WKïÓ×pÉö¼_ØÒö1®{iÇQþ~˜¿ï×ü§íÈ/¾´-m—è&íúepålæ»í´sÏGRÞpêéÏsG¾7ØŠöÜŸµ¢~ƒ-éωT^bôÐúLDDÔs3ãÛNã•Ö•y2X[ï%΋~ÒŠRþQõÛ½Œ3íMØôÏ=qÙŸØâ3SΤžd‹»±Ë‡O·°Åwi>â_]ŸGA¶øÛ¢ ýydøÈ|[|¬æ;~GûPËnŸÚâ•É+áÖ¡žZßåt]ç“÷d[¼áÙÙ+ßlaìT>™–µÅN¨¾Øþ¿N<yØû]ãfá;*'öÀîóoüuÂ:kᑾ¿ÛbÏñÁ^½~h;bÐÿÙùÅŒ»†+wÚ>”׎n[s /ä5§cvˆ¯¥e‹/¤e1î?ãï÷±ÖC?—òýLÍû¿b_赪ÊK¼½d0Ÿi⟉/;çž-q†ï*‰>¿ó>˜öí¬,:MüÝý):³ðèhüé-êñCo>è·"ü)97á]m±Wô+¡÷bÅÞº¡YÝŸóæ%–?à¶X_µ#öôˆAÕߺÁÝ¡÷-¦y‰¶ÎŸ†–¶hÆÔ|†g‹~¤þŒ5Öz‹ÒßcsêææU[lùù„c‹-[”OX¶ØšÍyÒÏ[uGþÿØb‹ç1ØÛl±Lѽ…Óó«­‘‡ùäÿ-örû¬:×»Oí4¨ÞH4=ïÃ;m‘ñéȧ }ZÇ‘ÐCù Ë8ÆþÇ·µm‘q|g°rùñ3bÙ"Å5N‘²yðuƒ-RIí´°…æ+2@ë7ÒùHßßv|c‹4ªœ?ð×°ZÙa=v_Èû®m~ƒm‘BÓ]y;-RDëÛ`øJþðv·…ÿÝ„ÏÓ¢‘Žy_\ÃúZ¯‘¶š—HKñ¡Èò¼ÖNýênÓ>92#¢m‘è÷š/ Ïov[¤¿'¿ã¶Hk¤šèÃ`ø¬Æ9|Që'|™öÝöM~G- ÿ¥zÂgó†·Ö.[¤–è.R‘þlIû‹ÏG߉,ß²°á²¬qÿ¶6‚óæO¿[Xz¹Yô)«}4R2»Žq\Ã{zä1´¿¯a'­·H,¿™®aT|1r)L>öØ¢—Eçñ5â[cÓòÙïÓ¶Xõ7>Bü5>^åXØKóo­ý.>Cë'¾[ãi0ÑBOÜ™Wkùl‰‡T¢™æÇ`Z öÑš<ß ¬Î³Á’È…Ùת²Ï•fÿ4Ø@ë(í6øæmì‹7ð»Á2ü^~ö;|j/í3¸y õ•€¿‡Ÿ|Oü91¾·ŒòÎð>˜V‚ý½ –‚,N«3Ž'Å×§©Ïà{ÈE D'‰—Ù¿ðqƒ“y¯¥ö¿DMæ¥2ßñKZçž„¶ŒÏŸøkøtòM>y7´ÅWC óÅ€1×p4ûùâgñª?ÞM|ÇÂgòÙhjž¼šWÛ°ž¶ø ¢óxWÑ÷uøäóù ǒϧÙâÏCÏ‹Ç;"Ÿt@Þ¸¢ñù7LTÐzM”Q;7Rþ>Úÿ£ødükÑ[|g>»¼ç®ã½%Äw污—?·Åçä³Ç:×0€¼ó\þ6ÑÌû@ãÛ(:²ð)öG0ò­Æ/ê³p¸ä›hû-ù Ü­«r£ µÏFh¾£w´ÌkØ9[Ô&ºŠ6Öz‹¶×x[Ó¾MÓ¾ýDrT4[ãháãÚÿ¢-4Ñ[ÕÿhÚFþOþE?ÞÐxGŠn,|_ë,òºÖAd6ûâZöƒóàs%·DâðÓeðmƒàÇMàóWiÏzöƒYùÃu·-2‘ý/…z}ì·[°uf?êÏþô„æ;2H|4ò0ûA-öÅ›ÏädÞ~*º´0¨õéÀ>ÝVô©$yÂ`x>û, /PO[ö{ƒwÒ¿;4ï‘þ⻑޴Œ†óÈè·/mQý\-þ¹*º1­½µ}Gh|b}E¿~«shìoÖAkísñÑð‡Ñ¬#ë¢ÚoÁ:o'ú°°|¢„ö¯xÉ[ñŽ’Ëâ4ïñ›òÈpËâ¼÷à7U%wÇ‹K>·°¢äŸ8ûAü^ÑO¼šÖ»…7QNoêéÆúíÎùÚà@øÝçø}¢‡øPø—ÁêO¢ŽÖg¢?|¸®Ö‰…E´¿&jÃ×7"O‰Ülskâ0çÃâì;Gø»Á=Èÿ%¯¥•æ<^ŒýL|ÅùΔWƒ}§3çSƒ3Ø_÷°®ä¼;“ýË`˜ýzå½Ây¤ FµO¦M§]Óùní3˜Â¾ù"íÅþ=œï ¶Û²O?ˆ\Ñ›gƒ](w(òAkÎUOÑ.ƒíi7ÞÓo7ßÌäûÅœ—Æ3ÞÉ”c!ý´Ó£È»ŒÞ¼Äßߣ½kxÎæ}ƒiÔÿ.å¿ÅùþOÆñõ?½œÚŸ^Žþœ`ÞÖ1>ëi÷rÚŽ|µÄœKyßàÞ=YíHªéYꇅŸ¢×38‹ï΢÷3Ú¡½=e ô‡È¹Þ¦ñË@®Ë@_•ÑýcA|½æ£<—Fi°Œþž~\å¦DZò >€>÷3Ú±v|Ëû`f1Í&ú·Ì;ô~f½ŸÙSë/³›è.s–úŸù ¿ïÖ<[˜N9«(gx‰ú.jœ27k^3¡ÏÌŸÔ߬Âj·…Íõ~Öª?«§æ%k€Úgá-ôcåî ž‚Ð|eŽá[™T®Á¬;ô÷¬n`–ú›•%:´p”Æ#k hÚÛSã`a=úc°4åÞ ñ±°è>½sæÕ“ùv|†÷Ɖž2Ç2ޱý¼:=‚þ{ úò-ÌW_æ»9ãa0®ýÀÂÏÇCô£‰~ÏzHí°°”êϺMó‘U]ó“UŽçrZ?YMé7|$+ñ_È{/©ÝY«ÏyÔû6ãh0ÆïÙŸ¬áZ7Y/Q¿Á¶üþ$óvímËü|öÜ ý5׸e5áïkCw@?¨üÌŸ/ƒï2æ }Qf2ôgpó¶Œõó ߇5×ÿì8ÿÙqþ³ãügÇùÏŽóŸç?;Îvœÿì8ÿÙqþ³ãügÇùÏŽóŸç?;Îvœÿì8ÿÙqþ³ãügÇùÿËŽ¥ýQ~C°ól;BÚÇèÛÚ©ütôˆéýôž…·cר¦ñJGol=wQ½éSx?KãŸþ6¿<Çï—¢çû½˜Ñ»Hì$ ÑŸÖEOhðfô—7©¼ŒÒ`ô£q0åö¥Üv_ B/Z}eiÊÄï¡ÓÌû±otB_ß³ŽÔzËœ„]ƃÞxzã¹¢ÇÌe”s½{3£×6öôÊ w¯‚þûVÞüôà·ò=ö¹¬ ®å½Ï4žYõéwiúf~iì´ÿv§“ÐÙÏØQn†îžÅe| ¾Ã¸†ùû$è ]ÍïÏ0žg߬Äü6ƒž*bÏiˆýÇàƒ¼ßšçV”ߊöD¯UÛÌß•6ヽæ'ð3½ŸÉ>ù¿ü‚ñþüœq_ýLS}>äßaÉçþ(y5–~*°Dú€À?®ÃgTnàyÉK¨Î_F$_ÎèüØ*ù+¹:ØCç‚à(W®Ã éƒ;iß6ɳÁ­’{-Ü­z‚—E¡‡%ZØIrsh˜Î)¡ú:/·1~[E7æ9ÔJòuðªäÊPé-l¬óZ¨›ÚzTç¸P7—…Ýuž Óy6T^ý=¥sAèiÞ3ø=zµ[t® ×’¼[#…þø¶ÖÎc¶HwÂU¾…—4®áˆäôðz»ÂËe'/Ëovkë9ÝEúrÎ{ =—Á^è9ŸÑ¹7Ò_åF†£÷z= ÁYœ›¾ÑøDs.5ø£ô’Ñ›µ¾¢u.ˆ•$ZDúF »rŽzNßGÏ«žC/PBj|-L—üêžù䳂ÂNz@ûB¨»úwÞ«ù5g\Ǩ}×á+ÚOBÙ´+åÿƒÇµ>C%Å‚—ÔŽëp•ä³ ‡ñm#}ÑuØDë:pZó8ŽœTƒ~éÅ‚«¿ª¢Ãë°óq›Ö[p·è1¸ :ÙÉü^ ?$?¯HVCKþ = ~ÜP¿bÞ.bǺI瀂ú]|(|¯Úî;^C§´.´?‡Ëj¸kj^õÄÂU(§ ÎÖ¡Ñm¸‚ô”áò¢/ólªv_‡o¤Bí’«Cƒe M–;´•u]Ãû™¿_à¿o`-ˆ¿Âg>ýGJ¢§6XŠþü|ß‘×KûŸyòòêë’§#‹°€áYZáEÚ÷ÃÙì‡Ó¡Oƒ“õ}x>ëÃϾQ7#?¯ ¯’\~Wò…wj=†¦¾ZÈËwiÜ­çãØïk#o—×üE*b×6ØOë1òšöÏH–ú™Ž}8»ƒÁ×µÞ"oc7)€QüÁ¢ tŽŒŽœ}¿ 0Ö¹­ öå'ð«x ÿ0ž­uÿFô_\¶{³Áw¥7ˆ/ÀþØ?£»ªþÅ ÇÖþšr ¾«õ/‡ÉñÑ‚€¯·ìñæØ÷ â8ìk°—þC{ `¢ŒÎ5‰8öÜUØg `ZcôžMÑ“>ˆÞ· ½h-ô¦ÐÇÄ9”÷;úà&ø)Þ+º²°7~îðcŸƒ¾szVƒÑ/WÇþfô¥oB?Û¿û®ü>U|)}þð¢¯Å¿-ý2ßýFý¢Çý=î÷<O»ÀŒ¦ø©Þ‰ž´þq,þ¢SÐ×Ñ—ïÁô³üý6¾»‘r `úqüIËá?ŸŸ~í28½.ú¬Œ1ø¯ÄÎø›ŽÃŸÕC»ÜüÝà}”û<úä ôÅs©ïüusøÝÇs€~\?îú±‘~įñÅo?ãú«Šè›+ò÷7¿-ôçKÆù{Æç[~¿Šþµ<ý=I»ñçËøSíÍl„þ¶)zÏúèÃîDßV ½c}ô¡Sî‹øSD6?éa”‹>:³~ïIôÇàd~_HyÙøiçPÞ+´#™úsxïM¾÷P¿¿—ƒþÂŒ÷Zž/1î¿2ßï1OËy/Êeþƒü†.¢ÐÍbèaôôúíBè£ñ?Ïz–òá£Yý©úö©è½¡'¿›ß«SžÑkW¦ýwQމSx‚ò;ñ}wž»RN7¾›N¼ÌzÊÛÄï`ù”ßßf\ˆÈúšï–£'ߊ]g¸•zöPoŒvGéçÊß^Ç _¿‰ñ\ƒ>ükøÐnÖuwþÞ{Æ|þ޼láøÂü};v‘°K†^¾ãý˜Ïoøî#æûmæž“°ã¼Ès%è Ì8½Ü½U€bo»zìG{ÆC¯6ê'~,³%týô¿õmpûØ—¬Ÿ]¬÷ãðáxÞE»öðÝ;ð‹ñ”ßýg(Mÿ°eÚh§±c=L¿z2®5éÿÍô»2å¡?Â.1(§û ü “u’Ù€uV•¿Ÿ`½ÏÀ–²þ7Áß0aø©þ#çdÔ€ï­Â^|>v¹e=|ïup0|‹x¯ôåÕW=éÿð\‡vN/'1ð¿ÿ„_@¹°=òžÁ7á¯ÕÁ‡iãjáømãДqþ†ñ3»²ÏþÃ¸Þ ]u…®»1¯½i÷ö©-´;—y3Øšñ%.,#ĸ›ñ58rFó‘Ë&òlø…ŒV´»;ßÝ=‚é_ ¾Í>¸Ÿù8Âþf”@þÓŸÂâ0þ‡ÍwÐ÷3Ô{ý¹‰ß cŸºD='xžÇ¾<—öf]U@î>Ýœ£瘯“ÈÁf=Ì>w9Ý`ró8èk ß%³¯œÂxŒáýǧ¶”cð~ÞkÞĸÁÃàœC¾¦ýÄ¥w`78”ß—PßlÆc<ý5è£íuÓžyßàaÖkaú{‚yÚÉwÄñ¤?Ì8Øù;r~úHÚ¦!g¦¡½¥ø{A,]lä\µŠuøëÓ`MÎcÏó<œçŽœç V%îâ´Æ3ñ v™ÄU€ñõøÁÒ²ß ÁŸŒñML h:å6¡Ü;¤¯7Ÿ,ûQ|¢ñSã\ü*öƒ6üiÛsÎ}’óí¾7Ø[zöø?Ä‘}†ÿðüäÀÄ!ü™Š3î¥ðsC¾3˜Vºú7,B?ðÝTüw¿g~ªgeðNè· ~bðj†›ÁÌ“Aâ…ÓêÂÁÄ&üìi|ã_ñ|£ô=ãG¤?‹¯ÃÎæÀ9.»´ÁÄHÚ¿‚yÜ…_ßÄÝ€ñWГä`':¤÷ãse‡´p~Ɖ£J0¿ûñŸ6˜Ž=éö³^j_ì]ìM`¼ö¸/¤÷‰ý ]V¢Ÿ•±ç%´c±s:ˆãy»›Á;ð{n þǪ‹^b•ˆÇ©¬ñŠž?…QÙW¢ÈãÖÞ>ò1~¿+e?‹üBü‡ÁØ+Ø#ý±#AF¿ÂŸú3ü^ß”?ºˆ¿ƒ~Ë¥_ /Õ8†÷hX8]ý ÀÎ~èeôçgÉN ¨ÞÐUìíø-X˜Š~üuô£ËäWÞ‹ÆànÆãVìçðKn)=›…Õ±“FïxXÏá“Øí NC/¼½è žC²cX8Lvª0qLá1šŸðtôžŸ‘þ>Lü}x úë§ÕN ï݇k‰ÂeÕŸp‘|².faˆ8ªPºô˜!»ô|!‡Þ·°œæ/dì˜'ÅÇÂeO6ÚÃ|­‘}#´VzÕz —j}…2±;½&½~è Ñ™…c°_¥k}‡ÞÅÿb¿ÖÁp=}o0r/óTWtiaEüå+jGz¡÷¿·Á/D'‘Ðã¶ÆÎ1Cóh0rHúñèã¢ëèøõ·Ðz¶°„è$ZNzüè âÃÑÖÒóZè?‰¾¦õ]GÒGø—L£Þiø[¼#{XôOéã ÆJ£O®HhYé}£‡‰;0x;Œ }sS,SónáûzÿÿÄóð·M&Qú÷X#ôÝ`tþõ×KZÇ1â¹ F÷a—š Ÿ¹;}ìF+НD‹áR{QüM VÂ¥.|³ ÖÑúˆœ%p!zþQÐË â;‘‰×#Ed8ô•5rÿƒW¤ÏŽVÒ:ˆ6¥ß±G‘_ˆKøRö¢Èì[ˆ_û7܃CCø®ÁÌsGèl‚üe¢ØÙÀXaæ¯2ôó(ôƒ}ØÂFì/K/ô¢Qü FV`oü–ýäv—ìƒ.Ùa#e°¿”ÀOê/ìE?ÁŸâè!ü¹ìáSâc#M‰w‰ý¦3ñ“Oâ¯ap1v²Yð{‡ì ‘¾’"è "m‰W¹ ¿©ÂòC‹TeÃà¿»dÿ¿,þ^‰Ær­ïðRÚûv®…؇3éÁعBÛôÚ*C _€ÿzô]h,þCØ ®W¿B§¨¯¸ÖyèöëóØû€W°{þ¥úï!ü€}é}ú½˜¸Òyì‡Ë«žðPµ7<ñHæ}ƒ5ØÿÑG†Õz ÏÕþo0rq@]Dï‘Äyö ~§;t·~¿™õôü÷FÉÝ#óˆÊ”™'þÁÄ`t’úÍ%îë_02þÓyÈÉú˜_78Âð­³èS|…OÌ–].:“ø¢£ð±Ý7 Wh}ÄŠk|c‰K;Ãz5ø3üàøÃ1øÁ÷” Æ*"ç ²/ÌÑþ{¿¯Z7±:ÄŶ}ÄZg°¥äÂXsì› ÷NÒx[8[ûcì'Ña¼òófòlâ\¶¿=ô=qü‚â“5c¿è[©ñŽ9¨g'qìOK.‰}!>Û‹ßà9Í—…§9¿•#î© õ\eŸ4¸þýȾw¿·óä_0xˆójq⼞ƿðñÿø{ø-þE~ŒßC<7gáfÕ7ýggvqÕ“ÝIõ[øžæ/û"ýý[ã4¾h὚·}4N3¾Q¹3>Õ8ZøŒÊ›ÝÏØÌ{ÛTþ ìÂ3¦ð~3yž1¨Þ®ñŸQUóœ}Dåf _;‹ž³»ñ÷4ÉÙ[5/gL¡<Ó.Þ›±ŽúÀœÊšœBjwq÷9T…èsžÓüä<©ñÏ i-<ÇûS)ÿIÊKáûd~o£yɉñûÇ _tda&õ¼¡ùÈ!þ0g&í0˜£ñÍ™©qÉYGÈçeáeÚsQõç¶Ð|çöÖû¹}Ô¾Ü Í_îû*wf3}7Ó®ò-¬©qžÙFã<ÿ…™ÕxÆ1×¥rrù.—~•ÎÓ–‡õ“ Þ7ñ¢Æ#1lÊßké\l0>•ü)/!_¯!BšôÞž¾þ•÷êüƒ½Œí—>$>¸ŸœGú“?Lt¥=èŸ_|#1û…ÁñÈïÿ†]ÕÿøGøc.ÄÿÖù"ÑNz Ñ[&ziþuþHt¢~ƒ½E/>– ¿!Ço$^=áòX°¯X8”8¥ÞèCM~¹j:oŒ“W'nçÜó:qTÓÈoÆFë\›J~ºœ·\:[8Œyi­scl(õyÔ !nm3ú¯zœÓ'KŸlá:Fíøñ¦sN_BœÖ[yd´ù[t–ôCÑ¿Ñ÷>Oþ˜>ä}1x7zävœÿ‹¡?+^® qbÅD#ëÉofü’ º¤ "ÿ‰É[òœô@–'Žåú¦÷ñ¿Þ„=Œ¶Á^Ôˆ<8·j=EÑ—Œ"°¨Æ7üq ØS-|Xü ´Tõ…šéü ï,|šx!qnüæ¯h|,²ÊÄ=ÞŽ?|ôJk“‡­ö™ñŸ'?¯…Ð'¶ÁnTMçípmžÁÐAÙñÂÕ‰Ã,OÍÕcáÛj_h ñ«7ú¿œ#¾J—º{Ì<é--|Iz”Ðp∓=D»ÀàZ⤶÷ô®ôŒÁ÷‰2øˆôKÁ¹â¡æ¢—Ð0ì4›`*+}g¨<ý©MœüMë!xDzÜà¢Ãà÷Ò«Z˜%}Qpµæ1¸‡8às´ uÔú4®*¾.F^ƒEˆ{ú]ü!|»øs؆^Ó`zã…²›„O¢×m®þ Ï!ŽãzÿBZ§á£è% ~‰ý }RøwòÖU=X8†¼H ôŠ«ÈK·†üƒÓxÏI\î"ôÐ'ùÝàEÙC­|L—ÑsîÔ:±ð ì@Ͱ<…}hvƒ›Ñ+þkF>ÇRħÎÒ¼EŸƒß,ÿªIœÃcð“¡Ø« ÞKœò—Ú7#¹Ø^#þØàËŒÏô÷Æá]ôð§·G/_cð«Î䫪­ý(ü3tqJv»ðiøânôÕßïHÜdä1òOô/9=ñ;Ø16’—Ð y°#ÄïGº_ÔUqžÿŠýÈ+µ;…ÁÅŒÛg<_E_\;¥Á!èqÄGÍ•ž2º ¾npôr7úí²GG¾ÃîdÐ ¿÷°nBÐc˜õd°'ëî"y2 ³¾.¿jp«oìÝ«Egáƒðïƒ&Ï&ã׊õSý¼,>Ëød^:0ø!Fj˜x(âjÂöâð‹ø˜…kx/ݾ3¿OÂŽþ"ñE>âðk;±‡OÃÎc°6vûÄ'ŽÔú †ï|š}ï ølOâƒa4¸„÷ðWm`Oüè|æ¡;q]EàeÙ§W`¯2øq¸;ñƒø€ñY¥q³pªæ#¼†ò_í2þâo±˜øÅ=ÌûiâÅÀÈhä—ñÈ7ƒ°ÎÄŽšKÞÖ+Úï£wAÇ`Ç ¿#à·‡‘³JbïƒÅàOâ;±[°Sü F—è"ùD/ ŸÇdüѱêw4 9 ·bçýB|óÞÿ» ùò,\Œ]ãgìKÉ¿ô:q$—¬]Øe¶c*ˆßc ¯1ûÈì5M¹ßSÞïêÿtâÍ f£Ì~Xý™þÊŸþïƒÙ™ª'{ÊÏ¥uÝMãaáHìM)ïâKöÑ.pzXã?½%ýþMý›^Wíµ0¦z¦»ø;~×ÓØu”CöéìP䛘þ ß¼¢ï³oÅÎqýÀ_ÛŸ±Û4À¾rŸÚ9£Ï_Àþ‘PûrÈs•ƒÿ¹Á ÷Œ}Øg®ˆ^rJ ç¾™úVbïyý6öØY|o¸¤ÄKͨN?r˜ƒãÔîìTìnèݲÕøœñ&öÚ5c3¿_ÀîæôÁÞÑŠ~ö¢ŸÃ±£|»Â|ì%^ôöojÜ æÖDß¿Xã™g<–aoYJ9ÏQï'”ÿ—ÖQÎfÊ5¸ïðëÏÙ‚½ç öƒßŠ®s¾Sy¹E4>¹i—ÁvØKšówôò¹Aì9!ì;±‹`ç9Víù¡Þ·ðIÕ;s* ì©yŸÙCýÍ]A½Ë4¹èÿÐ ˜‹ü—[{OQÚ]ŠrÀœ ŒÃì5Øÿr;h-„þr‰«ÊE/“K­…ØGr×RÞ,êO¢~ƒ5ïïh÷ßÐQœ±[õú/IîÌW»û%÷ökÿúÉϱ=ÂyÉ?Ác_ƒ¡žÈÃ/JNu$_×äh0<šsù£ø3…¤/ ×#?B=üYÿÂo¶ï-D?¶À yz:Hâ¯LAò„úH>µqÚ÷¥u® gئóg`›ô¾Ó:·ûÉ[xX¿Tÿ,<$=L°¶ä”`ô7ðƒ!þ`kÑ›‘§!tQòJèçÙäýïÉù =RØG^ ?çèRø[!ÿÿQäïä50øú 'ç÷7‘Ûÿàüú;~â'8oǯq'ç·Ï8ß’Ç/Ò¿ì78/í൙óY£þF¶p®!~6z~ž7àOy/úˆš÷èCäé„i'ôð˽ÿªªø—vý_Œœ}FNC_g—áœ_†sž.¤vG›£ÿ耿Öý:WG[à'J©È>Î1wI>ÞA?¸Ï*²Kë5Z½KôË9_€±qœþÑ—›çßð£"ÏLÜÁ½3î+xYó碸—÷—'a°yìjoüÑ]¢ô3‰6Z‰ç‘wWÿ-;ΣÆœKÜ{â„ø’•׿0~IEŒÝˆ8¢ÒȽE‰7Á_"íaìN·‰Ÿ%–oòyv±×¥Õ@N6÷”§â!Óêb¯ªÇß_'S÷í¥­Ç>ö%õã7™vûáäï¿yÏü~ÞĉñÝ꿈¼Ï½}éÈ?鉻Š\{ ÁÊØƒ¹.£rvKäâ–Ø¡³ñƒ"+ƒûÑ2>à½xï õüˆœý7Ÿ\NžëŒ?ð›Â¿>s ~Q™Ä¯‚é'ùžqËð`ßü˜¿L»ªsIfž—Óoâ‘Ó»“'¤'çî#ä-ï*{Tâ#ìlœ«Òº`ۈ᧜7ßå¼¶RúžØ9ò‹?}wôe!ç§YÄóq¯DÚ/̧…¢«øvü,¿Áðmò¿¿… oÕz ~Œ] %ö Ñï÷$N„<¬aäòÐ>øþ>ì µ¯b¿ú–ýµ/ù2ûJ?éÛ%ôöñ´Ó:÷<¬qó´øçˆ?zgk¾¼S¤GõÝ)»–AOTç~Ï'šÏZ͇ç€ôžâ‹Þ›¤Wñ¢ÿõuÒ¹Ú_RëÞ_’¼_·hœ¥ßòÑ/ÿléƒü³µù¿Ð{þ¹âóþmÚO,Ü.þ¸ }GàgöïŒ{ òÁœ/¾ÜD\Q!ò–¾,TXzßà&Ùÿ‚“°gÌfžæuŽöŸÀTé!­µžý“éù1 ú&©ÿ¾{UŸç7ͧç7ýÝ w”èÌóô]ž3¢/ϵÏ<{_Ñ>ãm¡}Ï›ÌïÉÌgŠèׇÇçg^'«ù˜Í³¿š¾÷í—ÝÍ÷tôæÝzî¥ñö9¥Oô¹¤7ó¹4Ï>—æÉ‡ÿˆ÷ ßÝ$½‰=‡…Ní¯>ò•úfª?×áv­ßçÔ_ƒzkPŸÁ~’‡¼äà+*þë+*~c=?£uåÃ>èýGö _ ê«¡ùõ=y“5ïÞîúÝ;Bú@ïñ3ï:Ñ•wåÍÔ¸zKžõ.–<èY¦gÏgúÞsBr™ç„ä Ï9µÃsVtè9©õâ9)þ_Ý—¤t÷üçZ,¾éZ¬~¸KNtOáÜ'úpÖQ;œÈÉÎ:g]¡}§úí¬.¾ä¬®þX8Bõ:gŠÎœ›D?×PëØ9\ãål®ß'Ä bêjµÇþ¥öûç5T=©—Å÷ìÄïí™â»öLÉ+öLÙ/Yâ[ö²_ØR{íiZÏóÝ=¢ûWâGö¯D÷ö¯x¯ îÕ~gÇÜ|—ú…øLê1ñŸÔ𲳤ÖÔ¾a09¨ý#¹Öyò6ÉU×På$ÿ ½bò4ñÛ$âd’>Ñz²ž'k=%½!ÿäjâG×PíI~YrtJÉé)m´ŽRÚjžÌsê âC©kT¿}ªÖ©}ªäbûT£ƒÅïèÅ¥Ä/¥Ô?g)Ù%œÈßÎ’ê¯cºèÎ1Cõ:²Å³µ?;}j§ó]è· >¢õäìÆópé­ÃÅ·Ø»ÜOçÌÕü8T»¯!ôö½øŠ}–Þ·£O°·Ó<˜çÔ¦Ìg%wêêOj[Ñ¡A{i­ïÔý⳩™Ú×S3E?©™Zß) ÅWR¸ Å-¹¬ &?)þìÐzLþPó”Œÿ™Á”†šï”·™Ï ÖqJPrTJHõ'¯Õ8%Ÿá}ô_סGûF ùR^Öy"åe­×”)jê#Zï© uH­.úJ­!ºM­N¶‰Ï§Ô Üq—”qÒ¤ŒÓ94¥‚è;åñý”ªÚORªi>Rªi>’‰÷J.­óeÒ¯ZÏI¿j?H"oTRKð øFñ¬I{TÒÖÇÝÚÿ’ïý'ý,;Æ5”œ”×¹8éÑq2z»d»øõ¼Që"ù¬ÖiJªÆ?%•þ™çnZ')Í´žR^RR^R;,l¦ñMAŸò½ø~Ê÷šO _Ö¹3ÅËß’ÓRœ’Rœ’CR‹€÷À¯À§êë¼—Z_ô–ú§Î©DO©Ä\CÉöŽZ—öÖÒ÷Ø{ˆ.ì=à¯=D÷ö‘ðûWTžýïŸÐ¸YØŠõ¶OòQêJí#©ïН´“7(Õ¯ý-5®qOkÿ°0G㑺õË~˜z‚þ]¦~E{oиÙïRÿíu©L=#¹"õ8ã0]ü;5CûOj†¾O °NÖh~íõØ×jjí5Õ^ëù6ѯ½ªø‹½ªÖ»ý6øñö¡ÓGeõÃQAô먮zõôì,­òœ´ÎœD§Öó)¿«©Ö««›èÄÕ]ãj=§ˆÏ¸ÞQ¹®…¢S×R/\yoµÖ™»¼ô$î^w÷`ÍŸ{”ÆÁQ»Ü´>Ýðm÷(•c=®zÝÛ$gzŠi~Ü‹>Ýk>='´øªÊÏÓ·Hëª úR¹ÚÄWü6Í›¿ÊñÔúðâüÑ_û†ÿ)ÉI}ç)¿£ø¬{L|=e4èÿCûŒ—èÁ\û¥ÿ„øƒÿzÅ2:Ïø¹§Ó?QëÄÿ"ç‹ ’c½7Š?º+K.rß"ù抻KH^wwA^Œ‹ÿ¹‰Û²p“øŒûSäËVjwAtþ)þç"°+GôWÝ»5?žœ§3OÓ%˜goyѱ笾óáÜú³üœ<'5?žR¢7ϳ꧗֭§çÓZGî?O¾¯Éyª®ö O]ñ+wo­k7ùܽu¾½Ëj~ÜíÁJ:_¸+ª\wEÖM¦èÄÐ8º.I^v]’\aÐ=‰ñ‰1kÅßÜki×ZÖÍϬ“t^uŸÖ>ä>->já´ãíûžŠzï2NÃ5ž ’—8?5T=ž¦ðrúÞCÞgO9•ïé%~æyJò›§ ýl ݶUû=rn«Oÿ¿Ö8¹¿ÿ´žûINvs¯¶;¦sð5¿tOѺvß(ùÈ5Fíu¥h=XÏó‘§ÏÜãj¥}Ä´N\k5>®Õ×jø³ÁÛµã'Z”{ZHn~‹}æcü…Š¿Xü)_Âÿ Œ$i½…Ä­÷C÷?µðMôÕ³ð[ùÿïeüŽ>0>ÿñ6ÚbÉñbäY2ؽÿ)ìwjü£ò€¡#äm9Aû¦âOV ßMè;ü½–‹~Â)ä1!ï_ˆ< Ÿøc0;ÎiÉÅÁÃjg¼\Á ª7ð9÷ß<È=gäïd0ôþ`Äu„–âÇXÿæ:ª/’ɽñ$ŸAt$öˆ‘äÙ˜‰ŸÎ⻇hýÇ^&þÛà~ì NíK¶Â§•äþXˆøæÍ¿øDâ&Ž“‡i>÷™ß/z%ˆ×L<…þúWòð¤Ýƒ·ñaÕÑ WÿŒo@ßû ù¤<ä»êJ¹ÝTnün{cÓÅ?b+ÈçeÃ~Aþ“Ä ìw⯔LÜDuñ ½Äeß›xŸ8‹3ØÎðœKÞ1âzè o§ýí½„=¢%vòR¦µÄî`žŸb<†¡N®0™ñšŒºv…Çù½™Wì·R_YôãŸâ‡„½;Ñß»g²šø˜Гclj¯ÅÏÉ ›{uÖcOJïûwæáwü¿²±; %ÚS’SâÏjž-œŒ½éYÉͱ¥ØÉÞEÿ?p¬ Ï?‡RKãkK^­¶Ä- N‡ûšb[µŸ]Cìiä K#î…çDqÕŸ(NÞ¶Wñ»Aë+¶^rO¼ªê5;B¾¯±´ëòûpXt+÷B”ÇOò9ox4öÇä£ÃéMìÙ•ÉR»)üý÷÷âS_É£4Eë04…÷Sˆ§h¬ñ qßF¨ŠøQ¨ q;É;2¾Yûs}o0ø(öþ¿DOÁúâc½:§ö"7ïÒúò=':ó¿÷W@Źï̦¿j©Þ@î-«£ù|Šþ½0vô‘ú=ȽÁ-ô+€?Fþ©íðñ%øÑ¾E¿_`¿ûA¿«iþ‚ˆ·ýçÀ0r|EôÐWDŸ¾+úÝ{Yr€Ï)þãKÕyØ{Tß{мóÑ#§ˆ~<¿#wíCÏ¿y‚û»ÜaíW®÷ÄÇÑß¿w­ßs­’žÎµM|ÉuýtT½îfÈówk_rß®ýÏ};rþYîçy&>ÇÓFëÄÓFò‡çÍ“ç$vŒqê§{ò,~ž¦šO­wwˆó y.,ì »‘{¤ÆÁ= y; 9 tíà\ú;òryí‹®-Ú?,üZëÆµXýt½%yÂuPòŸë[äó­Z‡®KÚ¿Ý·1^¤‡4èÚ!úsý!úrÿpíV;-\/yÇõ‘èÛõ¬ô®Új¯«¶æÝ5@ôã¤ùwÙ´Ž\­8/|Dóæ*zuMý»¢œ;¢’ÿ]èèúzA_ín&~da£ÜO"Îdœ7pî0xYãᩎœ²gòµÁŸe·ð–×>ì½Yß{É«çm¥õâÉÖ¼y¶s.܃½¤,ßž×8ÏuæòôÅýÔÝ{E÷îÉötö´’~ÍBâT<ÏpzBã穇]ÔàݢϓØ5×¾åéƒ}Æ`!Î%‘ó/0.…Å7¯!vŸë~ÿ_t᜴sù­×y“‹{Î]Üïì܃~ûôàGy> =–P»ß‰8@Ÿ~Qôb!ùÁœ>Í““{ÞœõEOÎúÚœ-±5Ð>ïx_ò½³ä)g!»Ã§ö86j>œèËIÔ3Móèôc7JžôšèÞ¹Vû‰s­øŸ? ç ­ggÕïl®ñq¶P?ß«>yOµ± ´Õx^‡-чõ`œf¡›%yÞ™­}Ð9[üÎIþZçSŒ¿ÁZ¼_—ö4¡}íè_;ñGgoÆsºèÚ¹’ùØ£ýÎÂżbðÃq>%:³0‰~†_?ã5QëÐ9Qtàœ¨uâœ$þêŒc—›Á8Ì€V`9À÷[ħœk ƒ«i÷רS¶hÿuÎÅî7OëÜù±øš“|RNòd9ÓiOvÁ*ìgM´ÿ;ΊþèËgõ½ƒ|†î+p¤Šo8šˆ~ ڣ蓟Ô>d©;ù ¦þ)ýRêqñq{Ií£öZõ¨·—öaG®ÆÍ±I|ɱIûŽƒó¾?Ç&ñÇaÉÙΟŽsâóŽ£¢wÇ[ZŽl¯#[írŒÔzv¤±®2E7üâ ±§=€}xX'vPg.öYÐU—}æ1ô¶wò~…ÎÃZg.î­qÕ=¸&i}¸¶¢oØÊþþúœgÑß>É>ÙYíww†/öFïx+/¥þ¸»³ß¬‡ÞŽû¾ÝCÑ? Ÿ½Ê“ìË/i~Üc¤¿r¢ÞQðS›æÁuEû°»òCö»2”Óý¨=Ò šo÷3”cp6íY'zqÏÑþê&ÿ‚;—öähžÜœsÝäqp7¨uîúœýù"vúÓ¢×èw¡Go+yÈ59¦Ͻyî­s¼k Ö¡ëYä”—‘‡8Ǻ¼¢Gyl\!äŠç{ê¨Ý®:ðAî p~ÿ#9ÚyUír^Õºtá¿êš‚Þ·§èÒÕz3ø,ú¨—‘O†Q_Wän:߻ʉ^\w!Ÿ5d|ªãßP9ªºÖ¡«.ýí+¹Æõ„ø¯…#§AÏä#tMCVSÿOÈ—¿BOUÐW’?ÛýzqŸÆÓ½=à"ä¥E’_ÜgñóèŽÿ÷!x»ãOÒ™Êj¹Ï7]ò‘¾å‹Šø>S=¾5Ïþ»%øÉWkáü«‰¯úM¹[ð¯!¿Š¿Œä?ßwø}Å÷…4ÿþb:Gû«ëÜæ¯ª}÷{Æ`üšžÕzñ Q{¼›tî÷ÎÆß ?_£¯Šô«¾…ø‡]]ùËPÿMø¥EE×þ}âË~ôgþw°Ï¼#zò»U¿ºÖ±Ÿ¼Ã~òl ÜÅyÕ«ù àg˜(þðhýløm|Uò^àÎ÷ïÔÞàCø…5Óú œÇŸí<åþ"ù>8Zü&¸UíÞ£~NáO~ {PcÕã}Eïûñ¿öãßéoÁ9óœê÷íáùg·ïñ!aÆaö¤ï¡—žŒcºÖ?†¿×’7,ÿ®3ø±w¦=4þZŒëÝÚüÉœ‡K~°ð$ówEüÀÿószQ½þ>Ð×<ígþ)”›&yÉÕzôwËkó?N=å·[57äŸGüÂç¡_ «|_wüÜ^ÄoìaÎói¿ó^À®×Rû¾¿ßRüýWâ÷–ößLÑ¿o©Æß÷ëî Úë["ùÝ·OúßUñ%#Éþâþ÷Y‡Ýâ'þ#ÌÃqñÿGøE®c~?Ä^x;寇À­âKþ«¢GÿÏøû¡¯öC?þ™§÷Õ_ÿlæ/M|ÇŽÿ9øNwâ@0/@/#%wú“¡£)ð¡—hg6õÏD_UZßnäù.ÑG€{7÷ýèÔ¿òÿD?WJOá_Ô¹ÍÏþæwHžñ‚þÇâ‡Ú]û­¿²~÷Çÿï,üì,ójì³°¿F°ÿ§¾á’óý…¡‡¯tNðĽ:Ø­õâ›øñ¯m‰ÿã}’ã}M¡çü? ÿÙñ/½Yr¯¿þ—§¥gò¢ö~->ç%¯‰÷ óÛOûµ½Î­~·äÐ@âxÀàTí[¿ö×`qâäkp_§Á½Ä›|"¾©Â}¢ãˆ÷‡=b-qÕÄÇEfGÑ‚8ƒ¹ä‰Ì=¡ÃÉßò9ñ,``¯øHðyBæ׳Œ<É`°0qóíõ÷à1ñ™À_è)ÿdžÞF¹ ½Þ^ñyÿVøÝVè¶ûÝz³ü“TnàͳÁàKøg÷Ž'^§Œæ?TFô~=¯É÷ƒž!Ò‹8÷^ä z^úŠh?íwÑÎĹÏÒxZ¸TûE´5ö/0Bs»Î"ÑAp)v’KÚ¯—Top‚äåÀ%­£ÀûšßÀAâAÿ&ö¯þâÿþ9øáïào#yÖ7DóëùEëÅsVíó.Ó>fЗ‹üW¹¦|õfä•›Ù—ç!¬’œxAûIàKÍkàKî™?†ŸÂßä¿ïD¾±&Œÿ=È×°CqL JFoº¸ïÁùz¼‹œ ©½.îçrSû\÷¡Çqi>\k°‡àßín">ãn«}µ[ëÔõ8çæÇµ?¸z¡oèˆ~ó3£ó¢úo!q6Nâhœ»Ð3jÐq?ì»èosÑŸc ú7Ðy¯ø‡ã²äkÇ/è_T{œ¢— ³±ÆÃ9ˆòG«ý'±Ÿ—鬥ùq–Ät¬ÇÏý3›£‚öo;çS{}ämÄ lÇ_ôuôoÈŸÔÂ7éGIí뎾¢?Çó:8ž×:r,’Ìñ«äÇwèûz W58 ºàþçØýJ¢_18?½z˜dèã}ìJ ûYýî&ï¯{®ä1÷ì;D§îâØç–~ÆÝýW\|ÒÂjص6BŸø·¹¢ø;|¿¹7ðcúYüеA|Π»0þs·ƒ•Åß]?i|-<&9Õ]?»B¬›_h‡ÁˆèÅ•€î'ê\êJ O³{Ûu¿ÀQèª2?´:Û£/o·¥úg¯ñ±oÇzqó4öâs;þÜö‘Ä›d¦žÒ¼¦nG¿=KrWj­ßÔ{´¯¥v?I-*LFÈ:üÑשœ”΢ó”9ª?µ•ú•úöÔ¯¥/Mý‰úÐÏØ‹>ì ÿø'7Ä/ügÍsêU­ÿÔƒø_g–ÚKë!µýzOíJýRå^‡‡Åÿíí¨÷ªÖ©ýŠÖ‹£<ë¶.ã– ™øw¼ƒx¢^{7}oŸ"~mŸ"¾j_-zwÔÑ׵î-쇿˜øŠ}"ó¸’xƒäg·¯”|bŸ©}Ð>8¥iâ‡vüÖíÙâWŽ’ð±šð§šêŸãÉM޹Z¿îtôý[Ø@ôæ¸GçKûYí¯ödéEì)ZöcâSvîé¶OÔ¾n·kÞìæíIüôßÐzL½Aü µ„ú—ZBûoÊkÄ›”ÿHÞ¯r“šwƒI‰çxGû\ÒUñ“¤ÃÄ]|BûhRGÑeRñ}µïY8Oü"yÞK©¤ñKi®~¦Ï;ù‚ÖyJ%ârÚh}¦´Ñ¼§pU ~0)Ü£”RLç–äß´Ï&ÿF×â[šÑ¿ËâoÉjHþSrPÊâ;>×¹35¬}35Hh_ ¿ø…8¸‡x9q ä!±WÃî5;Ø¿c–ø€cöÛN¢_ç$ì€ÜáìÎþÙ»d+öùRú»ã}ÉÁÎæ¢ ˲áGçÄNáì‹Ý°/v§±OzˆSx{Ã3’GœÏwØ»î7Ø«¸/ÓA¾jÇÔgö}/öÐqâ—ξâç&‰ž³yωýqòÉ8ú1†þߊ|6Gýq¸YßnÉŽBâާužrtWyެ¯öðùâijDÅoí·bw|\ç7;zMûý𯮢oû4øD:| ugâSvÀ×ðû/Eç©_ÂGû‰ÿ¤V%>¬3ëõEâR^$N²©Î!v'ñ'õáÆ®j°íh]5€Ks£ÎM©éçÔuÄë|/•ºº}[t•ºYãk¿¾Û;®Á&ÄÁt'dž¶‹Ö™½+ãöºèÕQ þÿóR}ŽÆÍY?‡G/Ç?ø<þÏëüà\=ì$~=5ñ·i¯ñuuÀ•@žXŠ]îrÏìx;õ»» vPþO+‰ç%ÕƒâCÞzøË8‰.†ÿy1Í“ç ürjãÇß?õ1Ä'Nâü_cÏ:¥õáv_æy vÁ¯°GnDÎz9°~*ĉº?Âo¾ªèÁÓT|ÈÓŒ8¢Ï|üÚ’ñ¿KüÁXünZhŸòôç}üš=ýtN·p?v´–šïÃOïÍj‡·Úë-#ý‚…ès¼3Äw¼é|÷£èÊ»ŸsÝüõˆ~¼¯¢Ï/&½«¯‹èÆ;“xpâò¼“°ãïæšÀ¹°>þdßH¾wïÂßnrö@õËý4{5qEž»{DgîÙøi½½|rüa­×I_]¿OÕWãì~šø–ÁØ/§oB'7a¯4XTüÖýç£â/î“Zoî£Ú×ÝÝ5ßîvPò˸}œƒSðc|?Fòs¹'I/í®-ý“»‰ÆÏÕ“óëDñQ׫Ðã«Øy >€™¼ ® ÉW®g±?'áçÐóõºZãìúûð/øñÅÿa+þ{8¿sqÏŠk5vïƒøÜÀ9¿~uÝ™Ÿ¯Ô?OcÖeIüäªjyngüN±¾~$Îå'ÖQü*ñ“÷ôÆ?´¥ÎažºøcV!Ω<~iåðg8OüÜ~æçs­/÷ü5Þ¤½ÐŽÃæ¼fî5ÐÙâ–ãGñ½ê3táiŸiGÜÖcšOøÃüôêàOñüãü;öh_pÁyí ú”Ä7}@^Çämìó>Ö]Î{6øT'øk'ž[àßš¤sš;›õ7~ö,ôs»Mâ?®ïàƒ[ £mœ£ßθ/Ëõ0tÑšõß¿…ˆèÛ…ï–&žìfücnƒNÿ"oÉ+äSÿE|(x {Æ%õ?ÔEó¤ò±ÏÔW FΨÞhWî=lMœ zÃÈÑg¬y^ëràÇøÍoã>ê­Ü“QØÜ‹'zŽ¿«òâw¢÷½“<àƒõ÷ØîÅóêﱻѻ´qv3îu]G>ÛöÄ¥´çÞZî Ž Ñ:‰ '¿N ÷sƒÑlñçè«jô¬ÖG”|Kc-ˆ‹É¤]èYbp/-ÿ›x£tôÇæþŠ_Äÿ ¦µA¿ßš8yä ºú¿˜A|Wú2ò«Öå¾–±ä_%obúžÑ·¥ûD—éNÍ{ºƒûdþ$ÒIî…9Êw䥰¼Hé_‘‡ÿ͌ܗô¸ÉÿĽ?›Éÿ´†ç¹äc5÷Íçý®ä—jÂß;¶Cïÿ¹·/=gö©ô 䃺@¾(â%ÒÉ›•Q—ß ÓÞÂ|wš÷ÈS™¾Ãô‹ß÷2ž¹ä­}“z·ñ÷ËÜ£s™òïæï¿PÞu(¹+ýoÚûãû=ó2ŸüVó±×W)½y½˜ï´íØ› ¢·N+Ýj2÷ä¬Ã޳;KªäëÞG“Wm yÖ–`ê=jvª4žpOÏÚqû“Ÿß?ÆžD>- #&.‹v•À·›8¡ÝÜ£ >¦“øx‚{ÄÏÿdûâ÷ƒ¿}ìoÖõ_äwΆï\‡Äטçij_”óXÿ–Ø Ä ‚‘ðÉ“Üoòü£3÷ڀѯÄïc€Ü¿kL?“/p°ö·è(•<ä55¾ÑšÜGäÞ•·‰ç[Gþûo¸g mÒï¡û%g„V·3„¸0x;ö;E×Aâ’‚¥¸—Ã`Dý V?C¯«ÿ¡Ó’B§°S]"îe¤ê Þ§¿k>‚‡Èµ—xÏ›hïü·Oë.H~Ã` âqìâ›Á±Ü²HòžÁùRBe%„&o9•<÷S°«µ¿ åP¯—ñxSå g“/'ý[.~ê-y Ô[úàª/8I篠ñ{‚þ>ßÉ?š¿`Qé]GðÏÚ¢uøÿâyüc$ù6ã¿ñ ö¥Í丿˜ ø|$yÆGþ'ß2ÉaÞÕ²{zoßñ ÇÎÄýƒÞÞ”?Hû´wy¦Vp>›Ï¹;›óòpõÇM~Xw{äþËœ{YÇ®OÅï,¬G\^ü²ûbOjOèä)g{Q1ѹ“ûQÍуÖÃNzVôá®zÜáh y·;u±'oð6vÄŠØO+¡Ç&:r‡ÍY‚8»ÉŸu·ø¸s08{éAìÊeð×.CÚ<ìyïq®þVtï.Lþ†Ã*èÇnæœw ç§ ì‚³y>„ý:‡8©\â£ãߎ‰kí"OŸ… ìIÄ ä\×{$蜋?ç â—Ä[üQõ8ß!®e®èÀ™I\NyÏ<Ìñ‡S[ç '÷9É;ììDqpÎ ÐÁ.è±Cع׫|çòþ|KÔèûaßþŠòß&žÈ`%ÉWÎZô³öú‰äŸ˜ˆŸÂÄkõÆ?¡ñ]]ðKèB¿›c—¾›çû±'ÔѹËYÇØÝ‰+[/ùÁñ‰ø¡ã‚æÁ óü'ú£ÏŒ]bö†ÑôÓ]?ø…4ìÜæÌÀN[—øÙrÌÛ!ì§±S€®[U¯ëaì×á?ôóÝØ/ÝKˆ‹Å\ò“€ž;ÑÛÖ'K9­GO_ÉÍž~ä]=CœáUöá¡ì?ƒ%÷xKnñâ—í­Äþüžúï¤}Ä3¿ÙÄ?v'Lчüž$øø*ä‘uðïwˆã#~dáâ#ûÑþ!”3Vû g,ýíJ¿9þ?Aóoáqä‘ÖjŸw<ûÙhòÓ‚¾öä/m.ùÃW„ñ¸È~gð½çåþ$ïrÑ‘7™}.Itã%NÜdžˆ<0„üDCËFj>½/k½Å¼=‰{èÉ~ÜŽ}µrÈýÌSG­oGé7½ ™×ûÈ'ÚýÙvôøÛÐ#îdßã;oiöï2|WFëÐs”ùýqþMüßó'ñ® ·ƒèÊ;zšÎx­&ŽýäÀÙÈk‹‘v ¿|Š¿Ô§ŒÇgÈ ð{®€?3þô¾ÞÄ™tÅÿ™óª/€_ô¯*Ç÷«æ!PZýl×z ®œ+_Ð|‡'’7¦»è(ú=܇ï"âãá—¸§óî{FôiaWхݸ¯“üqaü"Ã[$¯…7rïæ[Ú×ÃË´¾-ôó»Á…Ük¶?t0z;zÁÜ+›„~ñ̓…‡Éw_‰{­>Eçû¸ô|‘9ºÅ‡ÂÓ¹`´ä…ðxî5pJž]À¾ãÐþwç^°¡âÑfä%ªÇ}äaŠÖTy‘#¢—ÈSZ§÷~Èý ?¼YEþ¥•’"or?â›Ü_ùžÆ!Bþòhî·ýûÓлEsßíî3ø ½É>î)0Ø{mÓþø“Ï ŸÙ¢ó(þt‘Ãü^Fú’Haòœ€á6ÜÛq€û@{3Þ-?0t‰<(Í¥o wå^;»æ5ìី¦ÜW8^óÙ‰ÿî îo[‰^ùIõ#þy{ÈŸ›Öõ>äï¹Bþž³èÏjò÷²èÕÊj^ß¡,„ž¯z¶¢”‹HZüÍŸGÏæA_—Œ9…¿gð=÷@§}HýÜ#ž¶ý2ùÀÒ{p@cô‹_ÓÎý”Oõ´_)÷sÚóåî¥=܃‘vŽßGzúÍRè¡èSñ×Oÿ }iúÚ,ô±¯¡¿Æ.˜Þ ½i1ôØû£Ç+½$í_A{W Ÿ|?ûSô·õÜŒÞLÛNÿV2/ (/‰ç$ÆÉGy£ø{[úÝŽqhÇ=IÌwœq‘y²3nvSŽÊõ“/Ü¿Nßù×÷¶ž8›ÛŃ!ôdvs¿¯øŽÁÐPôzñÿæ~‹p9ò¯•%OÐržç²Ÿüͺ¿SûB¤–öåÈËÜ'Ý…ûþæÖÚª'½4‘Ü“ùûÇbò¡mÔ:3ÂŽ"ÿgè¸öï0ô.&ù(Äýa¡‹Ü“lò©%‰‡’È‹v÷åžbòP„j£­M\Í*'x=â}¢ÇSúRƒaòã‡ëJ>÷à>¡\öMw4þ1^rMd5|u|uñ;Ñÿ&ÈS5ž¼sop_åbî_ pÍlíÑI¢³(qõÑYÚ/¢ø‰Çڣ玡¯ŽIo{{TKò¯}¨sb|ù¬¶j_¡‡çž¶Ä)ò•">†û>â¸?¾‘Ή®ä9kKþ¯¸×ñùÝ ÷øòªÒù/þƒè'#Z[âMˆM”’\š xbæ=1¼ivîY@^¶ðcü÷mÚïÃä}3ø!øü¼XiÄU§U&n§ |¡ë¾ëù!øA{øEYø@ òÕadÅãüJž´Kš§ø×¢·øOÜ›ù‰è!QTç¯DQò¬9ˆÓ"ïa¼­øz¼©äƒ±3jGüî%yUýÕÀ¾QCë&V_ïÅjiccùÝ ý%ƽÅþ!ã*Jœù1òJã~µñ¢ó~oþ_‰£ª~†HNN%/Ú$âcBÜ7öŸ¬þ¶k^ÇÅ‚jüƒI¢‡`÷Ö÷!~)¬v„¾çù0´—û‹Â/á­¿P ÷Ù$éwƒAü^‚)Ú‚5Ù k|‚…Å'…5¾òGÂâ_Žjo #çÅzÜ/Sƒ8¤ˆg~¸äÅœKû’Ç€}Û{@r¯wy•±;z¯rþÿó6qTÞØ9vpÏ~<^âa¼Ÿc¿ù¼¿SoÎǵ‰;î¡vù^ =/p.þ„{JNŠû~–Üà[É9ÚàâØÉäëFüò“Ü«ó$yn“Ïû·ÊóÂÎq;Á0ñ\ø…y7hþ½oJ^¶ðCñ?ï*ô$ß‹_zÏa§:§ñó•Ö¸øª`§iÂ=,µˆ·½ì' ‡x»Õ«Ø—^e>&Qþò‹Õ”¼ï-^¥„Ö³÷­'ÏEñ/ÏOøK”Òs’øµz´»zŸTñ-¯ =Ž ýN.úòy}´wv™÷°G}‡Ø{•|à·à?x‹É÷!¾åëM¼÷:Gù&ogðgò&”$oGâð¿×:Ù+>ï/¦rü•¹?©)ñÍ o/öÈOÈ+²šç¹Øß º(÷-Ç|ëÈ{°„¼ ¿„ÎËþöäQoC\_C⦠º‰ÃWû†£øªÿ}âðß'®z4qƒÙä_O#ßÇ<Ñ……ëÅwüëK¾&ˆÁt“Ïü)¿Jÿí[ÍýA«ÉÓÄîØ•~ºE¾˜·èw#­{_yñY_Yþ^åÑ;ŒõÃý{Þâ[Þð›æÚ<ı{¸OÉÇ®6 ½ë+ø±q~uŸ—éI!s1ùª£ï]Š=mþµGUž·~«Åô¾×‹Þ΃>´|¯§ä oOô•£ÑcD‚oä ÍÕ¼Zø ý])úõš{Á þ­}ÐWG|ÚW;8þ€Þß°Kå^+ëhzJzI—è΄?-ÿæbû®Á9ÜGå`}?Ÿx;«Aü7½èϼmá÷ÁçîEŸüãô|0ȺŸÞz6õoì+«yðÒ~â+Ä:+D}çÉOrúÐ"ðÁ³èwϪ¾ÆâG¾;ÉWÑLãâ»Gû ïîûº¾ž×w¿Ö¥Ïƾðôá¾·4¾E’‹}™ø'X÷z±zÁð÷q…¯&÷ŠÕ„Î7{š|CÕhWgæÛ ƒý¡+ûVWí—¾>ÜÛÕ‡}ÑÃz ²=äYq³ŸºÑ/sß„oëù[üÀo°ïÓ¸øëÃ_Z‘åAòåŽ2~/Ñ•š¿hXòk´?öŒ§ÉÛ‚ß^$Ásoî]~Dë%Ò û@?ñÃH®Ê‹lG/#ùun"LWÉ!Ѿ¢—h ­ßh3înÈïMÐgµC?õ çê6¢¯h;ñ¹èôêÜc]E·ˆN¢ßð÷OÈïñ™äœXMxØõ?Þ=ÁòŽŒ@_0RrUüYÕŸ(.y>1ý|üiK‹_¿ÕØ+âæÞæØì<Üó#ßM¬>ú7ô«±NZ·±~ø«“#þ8z•‘’›â%5îñzú.^‡û<䃟†}~§K5>±U˜êÜëAžy ‡roD]üp‹áŸ{•uSTûBt t5[ë=zûyÉs{@ûw¬ ë®·öÁØPÍcì-æã-æoz"â2â•ЃuE?Fœn|8ñ ÐW;ãuÇzÜ?ò£ø}¼÷ã;òÓÆ›H^ˆ# ŽóXC¼ytúò~c汈è2öz¶ËÜG`ü ÿT¿âœ“ã%¸g ¸ô!±D±“’;cŸ0΋ÿâ—±ý’·âóˆSøŒ~줟?Ó.ü6ã[È÷´úV¡Ÿ|^óÍýÓ¸¿ÁC¾ Qèëÿq¿Ð|ÇëŠoÇNé¼;„ÿ÷qúFì4qÇÄ?bëX·«ÅŸcÐ{¬¬Æ)ú>÷ºoÆþ¸ ~öüvšø@´zz|¿ öÎCðÅ)¿÷Iô¤ßÛÉo·—{~Ó4×ѯ½®}&˜À^Ã}‚Á3È%…Øoÿ_uwþWsúÿq<Y"û®¬cìÆ:¶dcÏÎe„Š cZÏÑÞØwÙ—ìÂh’B2ö¥,Y;‘DßôxffÜæøþàöVÝÏyó>ïå:×u½^WÞÖ‰v¢¿³Ö!èªþ³Kj\Ò¼æ+ºožÑº s¸~¼¢½ðJóÌ5Ωüÿ€EÏ8¯ûq¢Æ¡'j<¿ß_üO(Þ.µ7"xž¹ZÿgÚq5¾3Të å:k|©q«›š?þVÛcš?}Ló(¶hܧ=÷sÿ1šo0Eï{Šê]Õü‚&O¦yê TþR=ÎóÀ²×Ò:FÍ›Ð<’ ÝGûÐ råù‚Âùþ®ëÆ:ÚUÁ6:î”_¬u°‚óý'XãÁÛ9/‚é>±YÇ÷fŽƒàŽ×A/”ÏÐJÇS?ïý”GQAã7£”g´JçU ÇqH Ÿg¨“ò/T"Tõ³C}5~â«ûO êqep\„šr? -Äë -¤q¢å¼Ÿ ´#ƒ7èú º£! ´®y–ÖéÌý$´°î¯æ¼ÏPsîW! •ÿ¥ëì^ޝìߺ_8ëz¥ñ}¿ Y&¿Lï×Mã'¡Ê ×xO¸â‡k<(Fã.´>hÿ¼ÖãߨW/Nõ5B5n©q¼m+^_h5{Yp? ¡ÇTÜöÜ_BÛóy}ÎÇi©ñ­ÿ:¢qábÊÇ)®ñbåßçm?×oKRœuz¿iú9Cãqª÷榟]ô¾òÖï¨×Ûžû\h_ÍGðÕ~˜¯qÀ¥Óz@aå5ÎÝ^ã]õ{ÍÇ›©÷1S.o ùÊ?š®÷©ï¹a£4^ï¬q·¼­®Ëa¿i¢$=ªÆáR5þ¶MóΪNÞGÍo°ÔüKßéóÿÕDãw©zþ4íï4ÅÝ/¿Lïk½âïWüýrÏ5ÿ  æ5¨_å׎šWÐQï¿¢âMÓóÕÒçæ¢ÏÉEŸŸ¿Ž_ÚÝÁ!×k¦ñ°¦÷³4Nþ•¾ï×÷ŸHKGrÿJ¤}TŸó60ŒvHà}Ø ï})ºîå>´W×Áxµ×ãÕ¾Ú¢ûÜSµLµ¾W¶î·¹oõ}mû#Pý©a¼¼­ îos‹«ÿã’Ægâhµ~§a¢ê/Ö}¢$Ÿ·Qu~ŒûT·næïÕW¿J)Î;Ãbw-V~~„æ;^Ö|Ú2ª¿~KëY^Uÿ”¯ÇWó!|k¨ŸÒ ~<ƒê¹MÑ:K”ïà«|øÍà Q?`~õoR¿çqÕî§~ö~ª³Ú˜óÒÆ|A¿±êŸ{¯~©÷ªc]‘ÏËï>ûÅï‰ÖMWÿXºêéÐ~ì­z#yÿ†‘êçÎÛF©þ:÷KC¼æ¡D³ÿ ÑWøMýæ#”¯¤þgƒæsk<êµúÝÎqý÷› qGõ{kë»Bý°ó8^|Öiñ 嵯P]ˆíš/l«¼õ–rõ5Ÿ¸¾Ö£T}jŸ©ª±Dë%-åsðYªþã:Š?DùT?¨þíhëŒV?ñ 幬×ë\«þʃ:*¯ÆIýå!gZ¯ãg›úu·qÜûz«_ÛSy:ÞêoVmýjkü«ªöW'#ôRô^ª®æøª.›o´Æ¢5>ùDu*žª¿?Nóµ.ïEïäÓy«ãûúùÕ÷®ñ€sPæçu­>êñºnøÚjNÒy2DyX£5¿ØAŸ¢çuÕçàªý¨zÒy[Ÿ›š­:¸Þ?òÞ üœpÕ/é¦:õ4¿?Cë?S‰gZ?é ×U¯™Êÿ8§ùýIª'—·­úx»•׳^ù«¸Žz­TžK;­#“¡|‘{ÊSHS]¡4­§RRùœžáÊ߈dÿyjý&ϽÊ_ˆPÅtÅ×÷Q¯Ê»Y­|—&ʳ)¥õJkÝ…ÒªCSRùï´?ÊkýÞjÊo°Òº¡y[kÕAøZ뇶S]½vÚ¯-µßúÓ¿æeÊþòÌV¦lŽ;OÍötU)?廸+_Æ_y;9O<7+ßdŽò‚ôòš?˜W—ÄÛBùN•T?±¯òžúª¾J_çÝPïªõFzj½“¾ªçÑGuWÖªŽÈ­c¢Õ;Ù¨ã"Fù‰äÕ™å¼õ>¤¼ÆËº>ÞÒ뾡z*7´._’ê¼ü¡ú;‘ÊWÚ¯Çí§½íýD÷åRzßsõéªvWWåí¨šÏå™ìW~P¤ò˜"uÿWûjîßkÕNX®| åÊë¯õáVjÝ@ÕÕ÷¹ ûÁÕ“ñçºê³Yõ£‚Õ®P]iŸùÊÚÈ}ÌGóK|ê÷Z×Ôç÷Ÿ3ÊǺ¢ú5ÉÊ[:¥üæÓìGŸÇZ:•ï>q´}TwÀçî_Åt?­©qìÂ\ÿ|‹(ßZÛÏóN©~V‚ÖÝ»¥¼Ÿdí—ý}¯Æý«}­|Ùãj§Æëùîëx{¤¿gr_òÉÔ<¦bšßRVùP…5o©¸Ú%T«²Ú}ÕŽê¢< ®juÓ¼¢‰š?ª¼¦cZï2û„o‚ò°n¨=õFífs‡[©Ž´µÚÑ.Z‡a²ÚϾì??7µ›¦jœ:Eíæå|÷»«öl ­kQƒû†aŒÚÿhœ×QãÀ ÔîÕø¹a„ÚÛÃ4¿Åë§!DóY”OdX©uLâÔÎOP»;’û­á„?Oñš«_Ñš÷e¨¢ùi•µÞËx­‹ª:͆C|ކÓzþx­—á§õJP?ä>õËíÕ8ónõ3j}Z+õǩޱ¿•Æ;«j<ò qýÇj÷›h¾Äc­sÓ•v„a°žßIßG'ª^y¼Ñƒû‚ñ‰¾ÿfqÿ1~Ðúߪk7·ƒú‹¿×x¾ûw®£ælÑú¸®pž_k½‰—¼_£æU÷+îïzÜqå½Åh½˜—Ê£+ ù”%8.Œù8ÿò¶†ß´ÞÌN}ôãúlðÒùã£ó-SóB²µÎoÞ¼-OÍëòÒþºÂõÉðRë WP]¦Ʀª×Þ›ãÆØFë)M§ýeô×:Lªobœ«u@Vkèv½þ%Zçi)çñ æ•W½’|:_,UOË’ý3·Œ^G¶â«?ȸCýÛ•W¨ñc¨öãRŽOãbîKF­ÿfì®Ïe¬ú-F¨>ÿpíï¼ù õ:µ.ˆÑ”öŽQyÈFÕ 1:sž=ôþ·k^É~>c$ç£ñ–öÛ%½þXîÃÆmò[5åš^ß}Í—ÑþÝ©yÀ»µŽÕ)Î{ãZͯ¬:ú¸ê:™¦u,ô:jh?”áºk,ÅýØpS×9O¼ßkÍÏ5#Žß{g¥´Nt°êž¬Ô|¨Mºî‡k}–oõ|õùÜ ]t¥óSõ‡üæÞ‡ML äÏ9Œó™˜X~*bêà䜳±Èù—ókÓÖ9Û¢_óâbïìèžóÿÒ8“Oµ¼,±&ŸLÁN6Ý;°ÕOf9?}þ¡`σÿþSÁ>½lþs~úð?hÓå0ç§¿ègc÷ù‡ÂÝlm» ð÷Ó˜åüâÓÿzfS]œ<ÜÿŸ½è“]Ý<œ\]>½ðâŸ>›Ä iŸºÛm7¶_Ãv¾ Û£s·›îyæn7·JaŒß|¿¥~k3k¶FüÖëømñÛ|ñÛ½¢Ø^Â輻ß1¿ã~g"ñ#já#fà#ÎàwUÇï¶"þnwüîXüž*ø=“ñ{‰¿7¿¯~ßü¾cøýGˆÀÀ ÐY„ø‘£ð‘{ð‡Ìñ‡Fà%þáíø#ùñGálÅÿ¾‰ø¿gáöÅ Ç}‡?ö†øQ=ñQ«ñQ¯ðǻ㣻?z)>ú)þD'ü‰Eø“ ˆò!>¦->æW|L*þ;Äm‰ ÄÇ&ãO}ƒkBü8?|Ü5ü醸ÓÞøø9ÄÿŸPŸð >á<þÌY⟭?;6ΟX•ø‰Sð‰1øó•ðç]ðI‰Ÿ…¿Pa<þÂïø?ÿbqüűø‹ð—Šâ/&þå‘øË»ðW ⯠Ã_Lü«Ûð×Lð×ìð×6ã¯o þõLü>øëð7Þâo¾&þ­ø[+ñ·^â“»âSl‰Ÿ²Ÿò»#þöBüyÄ¿s· þn(þî]ü½â§6ǧúãSoâï7Å?hDü>øWðëãzâÍ&þ£$|Z|ÚL|Ú9ü_ Ä\ÿx*þqþI5üÓÊÄêŠzÿ¬þÙ$üs'â??ŠQ ÿâGü‹Ãø—‰ÿªþ•=þÕ>üë"øôBÄOŽO߉Sÿfþí@â¿Ý‚ûŸÑŸ±ÿn=ñßeà3{á3Ãg¦ãß¿"~V7|Ör|Ösü‡Îø6Äÿ¸ÿ1 ŸÝŸ=?ן7 ëÈö^®?Ÿ¯µ ÛàÑloçúóùoåÆ?oÚ ojÄ›ÞÀhŒ7kàÉÖ ov _°¾à|¡YÄ/”ˆ7¯…7Ÿ7?ƒ/|šøE¬ðEÜñEbñE«à‹U$~1g|±h¼E9¼Å|ññÄ/~_Â_Â_"o¹Ÿø%‹âKŽÂ—܃/eŽ/mFüÒCñ¥wàËäÇ—„/;€øe7áËfáËõ× Ç—_Küòoðzâ+¬ÆWx¯ø‚ø•ºà+-ÅWzŠ¯Ü _¥ñ«,ÀWyˆ¯Ú_õW|µâW»ƒ·j‰· Ä[%ã­o¿z|u?|õkø ñ5¿&~MO|Í?ñµêâký‚¯ý3ñkŸÅש‰¯3_'ÿ¿Sį[_w ¾îø¯*áë•'~½‰øzQø¯Ëà¿vÂ×Güú‡ð ŠãŒÅ78€o¸—ø ãÄ7Ú…o\ßÄ”øMã›lÃ75Á7µÃ7ëOüfðÍ2ñßôÁ³ß| ñ›§ã[ôÀ·X‰oñßòñ[Ùâ[-Á·zŒoÝߦñÛÌ÷¹ÿö[ü·¡ø¶AÄo›‚o×ßÎßî¾ýuâwh„ïàƒïpß±>Þæ+âÛÌÆÛ$á;ÕÁwš‰·ý‰ø¶ øÎÕñ§â;Çá»Ä¿ke|WW|דønðÝË¿û|÷£ø¥ð=~Äç@üïâ{Zà{Úã{îÿ›ø½ á{ Ç÷ŠÀ÷.€ï“ø}âûlÁ÷ùˆï;߯/ñû­Ç÷ËÀ÷ï…ïÿ~À*âx…·ë†·[Ž·{Žø„øƒlðƒá¥á·ÇiKü!aø!÷ðC[ã‡ã‡X2~x3üp#~ø üˆ«ÄÙ?Ò?òþ‡zøQÿ#þ¨YøQ‰øÑµñ£gàí§ßþ4~Œ~Œ;~Ì)üØâ;TÄ;8ã¢ñŽåðãJÜxü¸#ø-ñ?:âÇ!þøýx§¢x§Qx§=ø »ˆ?Ñ ?q(~âü¤üøIÙÄw¶Ã;oÂ;gá]úá]{ßu-Þõ-~rOüäÕø)+ˆ?åÞ­ ÞmÞí)Þý/â{tÀ{,À{<ÄOm‡ŸÖ†øÓBðÓîà§·ÄOÄÿ4—ø?ÝÄÏh‚Ÿá‡Ÿq ÿóeâÏü?Ó?óOü¬ºø_êÿ—Ÿñ¿œÅÏ®‰Ÿ=?ǃøsâðžUñžSðžà½Nß»<Þ{Þ; ïSï[’ø¾ãð¾‡ð~%ð~cñ†ÑÄ7ìÅ ã#ñÆÝø¹;‰ïoŠ÷Œ÷߆0Á| ~`|à|`&>¨>ø{â¯Á§ãCzàCVâC—?ô>̶öÿë#âÏkŸ7?ï>~þ·ø­ˆ¿ ¿à6~asüBü"ñ]Ç/n„_ì‹_|¿ä"ñ—~…_:¿4 ¿ìøåµˆ¿ü'üòüŠêøSñ+݈¿2¿ª2~•+~ÕIüêãÄ_S¿f~ÍQüo¥ðk-‰¿Ö¿ö ~~=~ýÄ_¿^>ß°øóá7Âo܂߸¿é=ñ7÷Åo^ßü¿¥~ëwÄߺ ¿õ~[7ü¶øíK‰¿ý ~‡ ~Ç"üŽ4üÎÄh‹ÃGÜÃïjßÝ‚ø»ð»“ñ{šá÷ñ{ýˆ¿÷*~_ü>oü¾Køýˆ .þÀ,üDüÁÚøÈÄœ†ŒÇ²ÂrÇžLüÃ1ø#ñG\ðG¢ñ¿#þÑÒø£ãñGà•ÄG'~Ô|Ô~üñ¢øã£ðÑ#ˆ½  b(þÄüÉ­Ä?™±ÃÇlÂÇdáÿÈ$~lo|ìZ|ì[ü©žø¸îÄ[‰{?Ýz>~1ñãÿÂ'tÄ',À'<ÄŸI%þÙ6ø³!ø³wñçZâ¿!~â\|âMüù&øó|’ñ“.ã/|¿à‰¿ð'þÏóÄ¿XñgüųøK5ñ—­‰Ù9¥*þÊüUWâ_=¿VmþZþúïÄ¿Q cþÆ!üÍø[ňk4þÖ>|ra|òH|Ê0â§ìÄß6Åß‚¿½ g3ñï|Àßí¿»÷=þ^ñS¿Ç§®Á§¦ãï÷À?èJüËñžáÚâ.Á?ZHüGðiíñióði÷ñÝ#þãVøÇAøÇ·ñOšãŸ6%þS#þéuü³Føg¾øç^Ä~ÿ¢þÅlü‹$üËsÄU ÿê'ü«3ø×ÕñéÕˆŸî†OÅ¿©Œ3ÿÖ™øoã3Êâ3&à3Žâß&~¦%>ÓŸyÿÞŸU„øY?à³öà?ÂŽÿ8”ø·ã³óá³á³·äú$“kØfåú¤|}G³]Åö]®OÊÿ&7~’éwxÓÕxÓWøÝðfSØ.Å›=Áì„/¸_h>ñ =À›·Å›‡áÍSñ…ï¿H |‘|‘d|Ñføb‰_Ì_ì*Þ¢ÞÂ_|ñ‹_À—¨‹/1 _"oy–ø%kàKN׌Ǘ²Â—®BüÒSð¥cðe*â˸àËN$~ÙcøreðåÆãËÁ—$~…âø cðà+ÅW2'~¥øJ»ð•Íð•‡á« &~•­ø*Ùøªvøª›ðÕ‰_-oÕoµoõoýšøÕ»ã«¯ÄW¯Ñ_“Õ¢ÿ=ÐSpœ«›³½‡ ÃS9¿Í2¯=´Amçµ¾êêäbëèâáèö÷ËëÖËîKëæ8ÖÕÍ¡Gg÷œ?—þÐfy#{–ÿñÇÂn®Óæ‹ÿzôØIöîî_¼Œ"öö ǹå<Î$w¤ðßñpò˜äøÅ[-eçäìh=ÀÑÍÉÑݺϘ Žc=¾x˜…ƒëØ©Î9ïÚþӀدa7ÕÑú;{릭›´lóMË6Mšçü¿qkë13¬§º;º}ú²ôééŠf›˜äÿ×kõÈ LÜ/šl?v¢ýŽ_¾¹> w4÷ßÿÛÌ!9fPortfolio/data/ECON85LONG.csv0000644000176200001440000012441112323217770015413 0ustar liggesusers%Y-%m-%d;SPI85;SBI85;SXI85;IBOR85;LPP25P;LPP40P;LPP60P;MSCIW.USD;CHF.USD;WTI.USD;CFNAI.CUM;GOLDFIX.USD;EUR.CHF;GBP.CHF;USD.CHF;JPY.CHF;SDR.CHF;RUEDIF 1984-12-31;648.68;34.82;47.55;100;247.87;211.17;174.27;291.61;2.5602;25.43;100;320.159;1.8411;3.0426;2.5561;1.032;2.5259;480.342 1985-01-31;688.86;34.95;47.77;100.427;254.72;219.45;184.01;307.64;2.659;25.64;99.8202;302.791;1.8647;2.9961;2.6574;1.0457;2.5928;482.552 1985-02-28;687.74;34.78;47.82;100.902;256.38;222.45;188.32;308.16;2.8045;27.27;99.8401;299.1;1.8897;3.0626;2.7959;1.0735;2.6899;483.039 1985-03-29;687.74;34.86;48.2;101.3862;255.2;220.34;185.28;318.78;2.8033;28.24;100.3406;303.943;1.8943;3.1418;2.8092;1.0869;2.7093;486.889 1985-04-30;710.31;35.19;48.37;101.8413;257.4;222.13;186.38;317.82;2.5948;28.81;100.01;325.273;1.8735;3.2114;2.5829;1.0273;2.5642;488.608 1985-05-31;735.61;35.4;48.56;102.2748;263.23;228.79;193.82;334.08;2.615;27.62;100.441;316.367;1.8854;3.2607;2.6195;1.0401;2.5919;490.553 1985-06-28;774.99;35.52;49.08;102.7147;265.44;231.14;196.28;339.95;2.5721;27.14;99.8701;316.49;1.8842;3.2898;2.5702;1.0323;2.5628;495.719 1985-07-31;786.84;35.68;49.91;103.1478;261.65;225.7;188.91;346.88;2.406;27.33;99.5212;317.217;1.8633;3.3245;2.4182;1.0006;2.4633;504.092 1985-08-30;833.42;35.97;50.2;103.5456;265.83;229.92;192.89;349.64;2.2962;27.76;100.1601;329.786;1.8281;3.1737;2.2889;0.965;2.3679;507.041 1985-09-30;796.44;36.13;50.94;103.9393;264.25;227.08;188.83;352.16;2.3359;28.29;100.4711;323.35;1.8315;3.1843;2.3345;0.9853;2.3977;514.571 1985-10-31;881.13;36.38;52.01;104.3305;269.14;233.17;195.77;371.02;2.1692;29.54;100.1601;325.843;1.8127;3.0816;2.1664;1.0087;2.3092;525.392 1985-11-29;940.52;36.5;53.33;104.6825;273.23;237.87;200.93;391.67;2.1306;30.81;100.6119;325.295;1.8134;3.0625;2.1281;1.0433;2.2995;538.637 1985-12-31;1018.32;36.87;55.38;105.0468;279.93;245.42;209.06;409.91;2.1042;27.23;101.0353;321.719;1.8365;3.0438;2.1033;1.0374;2.2937;559.38 1986-01-31;971.1;37.2;55.08;105.4056;279.85;244.37;207.11;415.87;2.066;22.95;101.7858;345.377;1.8434;2.9469;2.0668;1.0324;2.2712;556.359 1986-02-28;954.77;37.61;56.16;105.7471;281.58;245.58;207.87;453.23;1.9547;15.44;101.0454;338.89;1.8125;2.791;1.9557;1.0584;2.2068;567.225 1986-03-31;1025.53;37.86;55.5;106.0903;291.58;258.16;223.28;497.42;1.915;12.62;100.8435;345.7;1.8204;2.7951;1.9066;1.0671;2.1914;560.577 1986-04-30;1052.74;37.9;55.37;106.452;291.98;258.25;222.69;510.97;1.9016;12.85;101.3896;340.439;1.8038;2.8455;1.9034;1.0861;2.1896;559.243 1986-05-30;1083.96;37.9;55.11;106.842;293.4;260.52;225.99;509.37;1.8538;15.44;101.2072;342.38;1.7897;2.8157;1.8539;1.1099;2.1648;556.67 1986-06-30;1017.04;37.81;54.71;107.2902;291.11;257.6;222.43;529.67;1.8406;13.47;101.005;342.717;1.7717;2.7752;1.8417;1.0977;2.1449;552.578 1986-07-31;942.28;37.98;54.24;107.7243;286.7;251.1;213.97;533.8;1.7445;11.58;101.5215;348.337;1.7283;2.6351;1.7457;1.0999;2.0761;547.898 1986-08-29;1038.65;38.39;55.28;108.109;295.29;261.25;225.39;580.3;1.6616;15.09;101.5824;376.6;1.6961;2.467;1.6607;1.0776;2.0088;558.407 1986-09-30;997.99;38.39;55.59;108.4826;291.58;256.14;218.79;557.09;1.6537;14.91;102.2346;417.73;1.6979;2.4332;1.6528;1.0681;2.0004;561.551 1986-10-31;1046.82;38.68;56.39;108.8382;296.55;261.65;224.72;547.38;1.6433;14.85;102.0916;423.509;1.706;2.3434;1.6407;1.0509;1.9892;569.62 1986-11-28;1083.8;38.92;57.24;109.188;298.36;263.52;226.58;570.39;1.6858;15.21;102.2448;397.55;1.7362;2.4;1.6859;1.035;2.0207;578.159 1986-12-31;1084.76;39.04;57.71;109.5726;299.7;264.74;227.76;581.61;1.6647;16.08;103.3137;390.913;1.7423;2.393;1.6664;1.0263;2.0098;582.94 1987-01-30;1049.7;39.41;58.37;109.9047;303.01;268.15;231.49;649.78;1.5616;18.66;102.4803;408.26;1.7322;2.3444;1.5568;1.0078;1.9486;589.62 1987-02-27;1007.2;39.54;58.84;110.2341;304.66;270.18;234.11;671.05;1.5403;17.73;104.2477;401.115;1.7417;2.3525;1.5425;1.0046;1.9466;594.319 1987-03-31;1024.1;39.66;59.27;110.5943;307.89;274.15;239.11;712.44;1.5391;18.31;104.54;408.914;1.7394;2.4447;1.5366;1.0143;1.951;598.717 1987-04-30;1006.1;39.82;59.98;110.9306;308.91;275.45;240.8;754.05;1.4959;18.64;105.0115;438.353;1.7151;2.4345;1.4948;1.0456;1.9321;605.848 1987-05-29;1001.4;40.03;60.21;111.2757;312.22;279.1;244.95;754.93;1.4705;19.42;105.7281;460.234;1.7061;2.4488;1.4662;1.0452;1.9163;608.144 1987-06-30;1045.5;40.11;60.6;111.639;313.8;281.21;247.4;754.32;1.5085;20.03;106.0881;449.455;1.72;2.4567;1.5087;1.0433;1.9404;612.073 1987-07-31;1121.7;40.35;61.24;111.9871;318.44;287.14;254.43;769.22;1.5365;21.36;106.9937;450.517;1.7263;2.4704;1.5345;1.0214;1.948;618.579 1987-08-31;1127;40.35;60.86;112.3328;319.62;289.09;257.47;814.51;1.5364;20.27;107.4763;461.148;1.7173;2.4543;1.5371;1.0416;1.9528;614.713 1987-09-30;1173.2;40.11;60.91;112.6796;319.94;290.3;259.5;800.15;1.5029;19.53;108.1555;460.35;1.719;2.4687;1.501;1.0482;1.9397;615.205 1987-10-30;884.3;40.11;59.17;113.0804;301.43;263.76;224.29;664.11;1.494;19.85;109.4393;465.355;1.7219;2.4823;1.4961;1.043;1.9372;597.715 1987-11-30;786;40.68;61.35;113.4425;296.23;254.84;211.68;647.76;1.3825;18.92;109.9879;467.569;1.6948;2.4515;1.3812;1.0212;1.8653;619.693 1987-12-31;769.4;40.97;62.18;113.7876;295.92;253.54;209.65;675.62;1.3304;17.24;110.7384;486.239;1.6796;2.4302;1.3297;1.0361;1.8384;628.071 1988-01-29;764.99;41.34;65.11;113.997;303.71;262.55;219.89;691.91;1.3466;17.16;110.495;476.58;1.6813;2.4225;1.3437;1.0544;1.8504;657.628 1988-02-29;828.73;41.79;66.08;114.1523;313.01;273.18;231.74;731.87;1.3916;16.77;111.3046;442.074;1.6941;2.4432;1.3908;1.0761;1.8872;667.446 1988-03-31;812.26;41.99;68.61;114.3202;314.03;273.83;232.25;753.77;1.3863;16.22;111.8737;443.607;1.7116;2.5368;1.3863;1.0899;1.9018;693.063 1988-04-29;822.21;42.32;70.57;114.5134;317.81;278.05;236.91;763.08;1.3823;17.88;112.4232;451.547;1.7169;2.5934;1.3829;1.106;1.9112;712.795 1988-05-31;822.19;42.16;70.74;114.7439;318.29;279.02;238.34;747.63;1.4111;17.44;112.4007;451.068;1.7323;2.6341;1.4098;1.1297;1.9393;714.506 1988-06-30;869.43;42.2;70.29;115.0356;322.78;284.78;245.28;746.39;1.4629;16.53;113.1903;451.332;1.7284;2.5999;1.4583;1.1464;1.9654;710.005 1988-07-29;884.69;42.03;70.66;115.406;325.85;289.57;251.97;760.22;1.5343;15.5;113.3035;437.629;1.7272;2.6097;1.53;1.1495;2.0004;713.711 1988-08-31;885.5;42.16;71.05;115.7573;325.61;287.95;248.84;718.25;1.5837;15.52;113.3375;431.277;1.7469;2.6878;1.5835;1.1838;2.0466;717.708 1988-09-30;910.85;42.24;71.58;116.0922;330.42;293.71;255.53;748.52;1.5764;14.47;113.5076;413.455;1.7505;2.6513;1.5753;1.1718;2.0402;722.998 1988-10-31;936.43;42.61;73.64;116.4526;333.8;297.2;259.08;798.13;1.5372;13.8;114.2593;406.781;1.7551;2.6727;1.5417;1.1947;2.0336;743.828 1988-11-30;921.74;42.69;76.03;116.8664;332.7;295.74;257.22;825.71;1.4675;13.98;114.6714;420.259;1.7396;2.652;1.4678;1.1914;1.9929;767.958 1988-12-30;942.5;42.73;76.97;117.3468;336.72;300.93;263.74;832.96;1.4799;16.27;115.5462;419.047;1.7502;2.6983;1.4771;1.1947;2.0042;777.488 1989-01-31;964.4;42.32;73.86;117.9227;341.44;309.05;275.92;862.88;1.5619;17.98;116.0209;404.014;1.7729;2.7664;1.5569;1.2248;2.0627;746.062 1989-02-28;955.6;42.08;69.79;118.5261;337.11;304.34;270.59;857.24;1.574;17.83;115.5231;387.508;1.7725;2.7611;1.5745;1.2327;2.0741;704.902 1989-03-31;998.1;41.91;69.84;119.1078;343.41;312.62;281.17;851.52;1.611;19.45;115.373;390.102;1.7921;2.7527;1.6044;1.2313;2.0961;705.48 1989-04-28;1035.1;41.26;67.75;119.7672;344.04;315.62;286.76;870.94;1.6469;21.04;115.4076;384.4;1.8321;2.7981;1.6452;1.246;2.1422;684.372 1989-05-31;1005.3;40.31;67.06;120.5935;338.69;310.92;282.7;849.37;1.729;20.03;114.4422;371.045;1.8462;2.8137;1.7325;1.2527;2.1881;677.357 1989-06-30;1094.5;41.34;70.4;121.3495;346.17;316.84;286.42;839.56;1.7089;20.01;114.1565;367.598;1.7888;2.6546;1.7098;1.1874;2.1221;711.15 1989-07-31;1164.5;41.5;70.09;122.0595;353.1;326.18;298.52;934.19;1.6281;19.64;112.9754;375.038;1.7845;2.643;1.6307;1.16;2.0741;707.95 1989-08-31;1209.4;41.42;70.4;122.8247;355.94;330.64;304.7;911.36;1.6605;18.52;113.5871;365.143;1.7885;2.6479;1.6623;1.1745;2.0948;711.079 1989-09-29;1176.7;41.26;68.67;123.6399;351.52;326.01;299.96;936.86;1.6866;19.59;112.8625;361.745;1.7931;2.6495;1.6873;1.1624;2.1045;693.594 1989-10-31;1107.8;41.05;68.88;124.4669;346.72;319.68;292.01;905.38;1.6302;20.09;112.2996;366.93;1.7967;2.5892;1.6312;1.1474;2.0747;695.709 1989-11-30;1140.9;41.22;68.95;125.293;349.56;323.58;296.91;941.28;1.6189;19.82;112.5244;394.261;1.811;2.5443;1.6181;1.1269;2.067;696.419 1989-12-29;1137.9;41.05;68.67;126.256;348.61;323.01;296.83;971.3;1.5686;21.09;112.4682;409.385;1.8313;2.5006;1.5679;1.0908;2.0417;693.619 1990-01-31;1102.3;40.03;69.46;127.2795;340.55;314.29;287.23;925.7;1.5175;22.64;112.1537;410.109;1.8236;2.5026;1.5155;1.0443;1.9975;701.609 1990-02-28;1096.2;39.99;69.87;128.2711;337.07;309.46;280.97;885.75;1.4879;22.11;112.9189;416.81;1.8124;2.5216;1.4875;1.0218;1.9735;705.72 1990-03-30;1079.6;40.03;70.49;129.2368;335.19;306.26;276.17;832.01;1.5133;20.42;113.1224;393.059;1.81;2.4558;1.5114;0.9864;1.9677;711.98 1990-04-30;1044;39.95;69.68;130.2504;331.47;301.24;269.68;819.75;1.4866;18.58;112.1313;374.242;1.8023;2.4336;1.4873;0.9386;1.9357;703.821 1990-05-31;1173.6;40.44;70.59;131.2105;343.32;314.33;284.72;905.82;1.4198;18.24;111.8737;369.052;1.7469;2.3795;1.4181;0.9226;1.8694;713.041 1990-06-29;1192.7;41.22;70.82;132.1982;347.67;318.01;287.52;899.1;1.425;16.87;111.639;352.331;1.7425;2.4341;1.4244;0.9255;1.8738;715.351 1990-07-31;1178.31;41.54;70.8;133.1882;347.28;315.96;283.63;907.02;1.3924;18.64;110.6719;362.53;1.7574;2.515;1.3927;0.9334;1.8733;715.172 1990-08-31;1018.8;40.93;70.95;134.149;333.58;298.5;261.84;821.84;1.3076;27.17;109.9989;394.727;1.7218;2.4874;1.3077;0.8863;1.8016;716.674 1990-09-28;894.5;41.05;71.24;135.0744;323.6;284.24;243.14;734.91;1.3069;33.69;108.8935;389.323;1.7162;2.4553;1.3061;0.9413;1.816;719.598 1990-10-31;925.6;41.3;72.01;136.0134;331.37;293.71;254.16;803.23;1.2818;35.92;107.2937;380.739;1.7326;2.491;1.2809;0.9861;1.8309;727.326 1990-11-30;901.3;41.38;72.1;137.0303;331.8;292.92;252.11;789.75;1.2569;32.3;105.2112;381.725;1.736;2.467;1.257;0.9747;1.8162;728.25 1990-12-31;908.3;41.54;72.12;138.0331;334.09;294.71;253.56;806;1.2814;27.34;103.7589;376.947;1.7466;2.4617;1.2776;0.9565;1.8244;728.49 1991-01-31;924.8;42.32;73.5;138.9709;340.24;300.7;259.2;835.2;1.2714;24.96;102.112;383.639;1.7258;2.4591;1.2725;0.9513;1.8108;742.426 1991-02-28;1017.9;43.1;74.86;139.9296;356.08;319.66;281.21;912.22;1.2685;20.52;100.5817;363.83;1.7532;2.4875;1.265;0.9705;1.8241;756.183 1991-03-29;1059.1;43.35;76.03;140.939;365.21;332.13;296.6;885.06;1.3918;19.86;99.1437;363.335;1.7733;2.5307;1.3821;1.0082;1.9133;767.995 1991-04-30;1073.7;43.84;76.46;141.9556;369.06;335.54;299.55;891.7;1.4399;20.82;98.8665;358.379;1.7434;2.5187;1.4403;1.0506;1.946;772.342 1991-05-31;1123.4;44.21;77.59;142.9051;375.92;343.38;308.55;911.64;1.4574;21.24;98.4718;356.945;1.7445;2.5097;1.4527;1.0522;1.9542;783.78 1991-06-28;1091.4;44.33;77.26;143.861;374.76;341.78;306.28;855.08;1.5297;20.2;98.5211;366.718;1.7629;2.5208;1.5292;1.0935;2.0198;780.449 1991-07-31;1123.3;44.53;77.61;144.8158;377.96;344.83;309.51;895.19;1.5481;21.42;98.2849;367.685;1.7807;2.5523;1.5501;1.1233;2.0476;783.945 1991-08-30;1122.5;44.66;77.68;145.7921;379.98;346.27;310.4;892.07;1.5201;21.69;97.7947;356.305;1.7886;2.5572;1.5208;1.1114;2.0306;784.666 1991-09-30;1078.8;44.74;77.85;146.7979;380.28;345.36;308.01;915.19;1.4803;21.86;98.0885;348.738;1.7928;2.558;1.4843;1.1031;2.0081;786.353 1991-10-31;1078.8;44.37;77.94;147.826;381.53;347.27;310.74;929.75;1.4781;23.23;97.4238;358.687;1.7916;2.5459;1.4791;1.131;2.0137;787.312 1991-11-29;1040.2;44.53;78.27;148.8303;378.54;341.29;301.59;888.95;1.4348;22.47;96.7635;360.157;1.8068;2.5528;1.4374;1.1081;1.9909;790.634 1991-12-31;1052.8;44.94;78.85;149.8493;383.92;345.94;305.59;953.38;1.3855;19.52;95.7433;361.725;1.8042;2.5289;1.3877;1.0825;1.9526;796.429 1992-01-31;1111.5;45.76;79.52;150.7888;392.54;355.85;316.65;935.45;1.4039;18.82;95.3229;354.448;1.8123;2.5365;1.4018;1.1195;1.9762;803.191 1992-02-28;1149.6;46.17;79.94;151.758;396.58;360.37;321.77;919.02;1.4561;19;95.3134;353.913;1.8385;2.5847;1.455;1.1403;2.0249;807.504 1992-03-31;1138.9;45.97;80.72;152.8925;393.09;355.66;315.91;875.45;1.5094;18.92;95.7337;344.336;1.8557;2.5993;1.5081;1.135;2.0598;815.313 1992-04-30;1169.6;46.09;80.74;154.0275;397.28;360.54;321.55;887.37;1.5194;20.24;95.9733;338.618;1.884;2.6612;1.5156;1.1352;2.0799;815.509 1992-05-29;1203.6;45.93;81.22;155.2437;399.71;363.26;324.74;922.38;1.4907;20.94;95.8295;337.239;1.8896;2.6997;1.4903;1.1405;2.0699;820.427 1992-06-30;1174.95;45.72;81.38;156.445;393.72;353.1;310.54;891.2;1.425;22.38;95.705;340.805;1.8579;2.643;1.4266;1.1238;2.0134;822.01 1992-07-31;1135.45;46.17;81.9;157.5735;393.96;350.56;305.16;893.18;1.3347;21.76;96.0213;352.72;1.8274;2.5585;1.3332;1.0613;1.9253;827.23 1992-08-31;1096.02;46.38;83.34;158.611;393.85;348.83;301.7;914.61;1.2966;21.35;95.3515;343.058;1.8222;2.5222;1.3002;1.0289;1.8919;841.798 1992-09-30;1145.77;47.73;84;159.5368;400.2;352.39;302.67;905.93;1.278;21.9;95.2753;345.43;1.7671;2.3734;1.2777;1.0412;1.8595;848.524 1992-10-30;1152.76;49.12;83.61;160.3866;410.72;364.45;315.74;881.1;1.3176;21.69;95.552;344.38;1.7434;2.1762;1.3122;1.0832;1.885;844.561 1992-11-30;1151.28;49.41;84.35;161.285;417.3;372.61;325.15;896.59;1.4291;20.34;95.6571;335.017;1.7711;2.1816;1.4281;1.1529;1.9813;852.01 1992-12-31;1238.57;50.35;84.78;162.0934;427.42;383.14;336.18;903.55;1.4219;19.41;96.0597;334.803;1.7603;2.2048;1.422;1.1463;1.9742;856.398 1993-01-29;1264.17;51.13;87.95;162.8296;435.98;391.6;344.41;906.3;1.4774;19.08;96.3869;329.01;1.792;2.2645;1.4764;1.1806;2.0351;888.402 1993-02-26;1286.76;52.32;91.24;163.5776;448.16;403.75;356.35;927.5;1.5178;20.05;96.5412;329.31;1.7963;2.1823;1.5169;1.2543;2.0832;921.566 1993-03-31;1343.76;53.26;100.04;164.2864;460.37;417.57;371.49;981;1.5206;20.35;95.9637;330.078;1.791;2.2175;1.52;1.2984;2.0995;1010.479 1993-04-30;1323.71;53.55;96.92;164.9895;460.36;417.11;370.46;1026.2;1.4599;20.27;96.3098;342.15;1.7808;2.2531;1.4586;1.2984;2.0618;978.942 1993-05-31;1414.12;53.79;98.84;165.6999;465.49;422.19;376.02;1049.57;1.4504;19.94;96.1847;367.179;1.7632;2.2436;1.4482;1.3115;2.0502;998.413 1993-06-30;1493.6;54.37;99.23;166.3961;478.27;437.26;393.41;1040.5;1.4769;19.07;96.1174;371.891;1.7452;2.2241;1.4722;1.3729;2.077;1002.307 1993-07-30;1517.95;54.9;98.58;167.0474;484.7;445.06;402.4;1061.66;1.5147;17.87;96.1462;392.193;1.7241;2.2648;1.5149;1.4057;2.106;995.772 1993-08-31;1573.66;55.27;99.52;167.7188;492.13;452.57;410.23;1110.07;1.4966;18.01;96.1655;378.838;1.6965;2.2343;1.498;1.4438;2.0983;1005.292 1993-09-30;1562.52;55.55;102.2;168.384;491.96;450.01;405.01;1089.29;1.4182;17.51;96.5605;355.275;1.6721;2.1629;1.4192;1.3465;2.0127;1032.274 1993-10-29;1703.99;56.29;109.65;169.0255;507.5;466.75;423.7;1119.05;1.4432;18.15;97.0154;364.179;1.6769;2.164;1.4394;1.3458;2.0269;1107.527 1993-11-30;1738.63;56.58;115.81;169.6605;506.57;462.48;416.41;1055.48;1.4969;16.7;97.4335;373.827;1.6904;2.2157;1.4964;1.3874;2.0775;1169.803 1993-12-31;1867.84;56.91;124.05;170.2447;519.35;475.99;431.3;1106.87;1.4634;14.51;98.0199;383.297;1.6529;2.1824;1.464;1.3323;2.026;1252.999 1994-01-31;2007.47;57.15;126.17;170.8242;529.43;489.19;448.14;1179.62;1.4716;15;98.1278;386.875;1.639;2.1946;1.4711;1.3195;2.0209;1274.45 1994-02-28;1850.25;56.91;117.68;171.4192;518;477.32;434.87;1164.09;1.4565;14.78;98.334;381.91;1.6293;2.1565;1.4576;1.371;2.0237;1188.692 1994-03-31;1805.41;56.7;114.49;172.0185;508.52;465.85;421.13;1113.64;1.4292;14.66;99.5809;384.128;1.6317;2.132;1.4301;1.3598;2.0046;1156.502 1994-04-29;1781.13;56.29;108.84;172.5928;505.71;465.42;422.95;1147.81;1.4383;16.38;100.01;377.271;1.639;2.1312;1.4383;1.39;2.0202;1099.371 1994-05-31;1789.92;56.21;108.04;173.2052;504.35;464.74;423;1150.5;1.4125;17.88;100.7931;381.413;1.6457;2.1249;1.413;1.3629;1.9999;1091.269 1994-06-30;1729.02;55.51;103.19;173.831;493.86;453.08;409.9;1147.04;1.3727;19.07;101.3896;385.643;1.6271;2.097;1.3757;1.3392;1.9635;1042.358 1994-07-29;1709.83;55.92;103.53;174.4659;498.95;457.99;414.56;1168.59;1.3239;19.65;101.6027;385.49;1.6186;2.0463;1.3248;1.3438;1.9307;1045.787 1994-08-31;1744.35;55.64;102.35;175.0941;499.79;460.5;419.01;1203.51;1.3184;18.38;102.5623;380.355;1.6125;2.0314;1.3173;1.3185;1.9166;1033.834 1994-09-30;1683.39;55.47;99.7;175.7062;492.13;450.82;406.87;1171.63;1.2892;17.46;102.8601;391.575;1.5959;2.0186;1.292;1.3072;1.8898;1007.047 1994-10-31;1660.83;55.68;99.51;176.3022;491.61;449.28;404.32;1204.68;1.2648;17.71;103.6967;389.771;1.5943;2.0301;1.2648;1.2839;1.8677;1005.164 1994-11-30;1708.79;56.25;102.77;176.8932;498.01;455.01;409.53;1152.17;1.2956;18.1;104.5191;384.389;1.6106;2.057;1.2941;1.3202;1.903;1038.033 1994-12-30;1725.53;56.58;100.26;177.5277;498.61;455.91;410.53;1163.06;1.3289;17.16;105.3797;379.286;1.6162;2.0708;1.3289;1.3262;1.9305;1012.726 1995-01-31;1661.29;57.07;99.16;178.1205;495.86;449.96;401.07;1145.32;1.2863;17.99;105.6541;378.55;1.5977;2.0254;1.2866;1.29;1.886;1001.616 1995-02-28;1700.4;57.48;99.47;178.6966;497.53;450.37;400.38;1161.74;1.2715;18.53;105.4957;376.64;1.5998;1.9973;1.2705;1.2931;1.8796;1004.857 1995-03-31;1640.85;58.14;100.23;179.2186;495.99;444.37;389.83;1217.45;1.1709;18.55;105.3692;382.12;1.5435;1.8739;1.1714;1.2921;1.7989;1012.227 1995-04-28;1697.36;58.95;104.55;179.742;506.8;455.46;401.36;1259.6;1.1384;19.87;104.7912;391.031;1.5263;1.8246;1.1342;1.3565;1.7916;1070.636 1995-05-31;1818.18;59.53;103.87;180.2319;518.06;467.32;414.22;1270.09;1.1693;19.74;104.4251;385.219;1.5428;1.8527;1.1663;1.3716;1.8195;1058.846 1995-06-30;1866.53;59.9;106.01;180.7019;520.98;469.94;416.53;1269.41;1.1588;18.42;104.6342;387.559;1.5416;1.8457;1.1575;1.3687;1.8111;1082.681 1995-07-31;1871.33;60.39;105.73;181.114;527.59;477.74;425.37;1332.64;1.1556;17.3;103.9251;386.233;1.5547;1.8429;1.1558;1.3242;1.801;1092.332 1995-08-31;1909.9;60.84;105.32;181.5485;533.93;486.01;435.34;1302.66;1.1962;18.03;104.8646;383.655;1.5599;1.8763;1.198;1.2622;1.807;1079.871 1995-09-29;1966.95;61.66;106;181.9247;538.62;488.9;436.51;1340.32;1.1868;18.23;105.0641;383.055;1.5332;1.8526;1.1891;1.1837;1.7646;1084.829 1995-10-31;2009.29;62.4;109.24;182.24;540.92;488.41;433.44;1318.93;1.1453;17.44;104.676;383.136;1.5144;1.8067;1.145;1.1371;1.7169;1120.259 1995-11-30;2085.66;63.46;118.19;182.563;557.41;505.2;450.79;1364.44;1.1437;17.99;104.561;385.307;1.5129;1.785;1.1419;1.1204;1.7078;1217.655 1995-12-29;2123.43;63.5;116.55;182.839;560.1;509.06;455.83;1404.05;1.1631;19.04;104.6237;387.444;1.5183;1.7907;1.1639;1.1427;1.7284;1200.62 1996-01-31;2122.27;63.13;116.29;183.1083;567.18;520.21;470.96;1429.15;1.1818;18.88;103.4067;399.452;1.5239;1.8036;1.18;1.116;1.7364;1195.453 1996-02-29;2177.74;63.64;113.52;183.3564;564.89;519.17;471.18;1437.56;1.1967;19.07;104.5191;404.762;1.5399;1.8353;1.1952;1.1304;1.7535;1168.943 1996-03-29;2325.46;63.92;116.96;183.6312;571.32;526.08;479.1;1461.19;1.1959;21.36;104.2477;396.207;1.5325;1.8258;1.1962;1.1293;1.7483;1211.944 1996-04-30;2352.06;64.51;117.63;183.9183;581.36;540.1;497.04;1495.25;1.218;23.57;104.7074;392.848;1.542;1.8465;1.2189;1.1359;1.769;1220.554 1996-05-31;2299.26;63.17;114.63;184.3211;579.3;540.31;499.25;1496.24;1.2539;21.25;105.2112;391.933;1.5634;1.8971;1.2533;1.1792;1.8116;1182.424 1996-06-28;2407.04;63.5;114.7;184.7152;583.84;545.43;505.42;1503.51;1.2579;20.45;105.8656;385.273;1.5745;1.9367;1.2561;1.1537;1.8137;1185.008 1996-07-31;2251.89;64.01;113.38;185.1101;575.17;531.11;484.35;1450.07;1.232;21.32;105.855;383.474;1.5664;1.9156;1.2334;1.1289;1.7882;1173.02 1996-08-30;2342.99;64.66;113.45;185.4455;582.42;539.2;493.37;1466.44;1.2029;21.96;106.2793;387.35;1.5432;1.8627;1.2022;1.1143;1.7545;1175.093 1996-09-30;2393.95;65.77;114.89;185.6774;597.69;557.83;515.51;1523.55;1.2343;23.99;106.5986;383.136;1.5631;1.9184;1.2309;1.1204;1.7849;1191.12 1996-10-31;2394.05;66.41;118.61;185.9582;604.76;564.32;521.29;1533.88;1.2586;24.9;106.6626;381.065;1.5833;1.9921;1.2574;1.1197;1.8119;1231.454 1996-11-29;2492.21;66.41;120.32;186.2782;617.7;582.1;544.63;1619.54;1.2752;23.71;107.2508;377.85;1.628;2.1184;1.2738;1.134;1.8494;1244.901 1996-12-31;2511.88;67.05;119.71;186.5694;622.86;589.98;554.93;1593.29;1.329;25.39;107.3474;368.997;1.6591;2.2088;1.327;1.1654;1.9087;1241.482 1997-01-31;2728.33;67.72;120.59;186.8392;639.22;611.4;582.66;1612.2;1.3913;25.17;107.6484;355.105;1.6904;2.3096;1.3925;1.1807;1.9692;1249.479 1997-02-28;2851.56;69.39;126.18;187.1119;653.18;626.79;600.16;1630.44;1.4541;22.21;108.7194;346.583;1.6944;2.3601;1.4526;1.1811;2.0107;1310.172 1997-03-31;2946.25;68.51;128.38;187.4045;647.4;619.44;591.45;1597.88;1.4634;20.99;109.3081;351.808;1.6843;2.3518;1.4653;1.1952;2.0179;1335.283 1997-04-30;3094.65;69.12;127.17;187.6878;656.56;631.44;607.35;1649.81;1.4618;19.72;109.3627;344.473;1.6735;2.3779;1.4599;1.1625;2.0049;1309.779 1997-05-30;3195.56;69.93;130.84;187.8639;664.48;639.35;615.69;1751.34;1.4331;20.83;109.845;343.84;1.6446;2.3368;1.4324;1.2029;1.9844;1347.086 1997-06-30;3548.37;70.24;136.81;188.0891;684.97;665.94;650.73;1838.39;1.4424;19.17;110.3625;340.757;1.6393;2.3675;1.4411;1.2604;2.005;1410.372 1997-07-31;3752.66;70.19;143.25;188.3343;701.36;686.93;678.46;1922.76;1.4824;19.63;111.06;324.104;1.6358;2.474;1.4802;1.2853;2.0406;1484.466 1997-08-29;3378.83;69.9;137.83;188.5502;683.75;663.33;645.82;1793.83;1.5128;19.93;111.6836;324.01;1.6225;2.4246;1.5145;1.2847;2.0504;1432.248 1997-09-30;3626.07;69.95;139.09;188.8008;693.39;676.17;663.36;1890.98;1.4702;19.79;112.6595;322.823;1.6196;2.3556;1.472;1.2184;2.0015;1431.595 1997-10-31;3474.77;69.84;139.67;189.1096;681.91;657.58;635.68;1791.15;1.4516;21.26;113.2695;324.872;1.6259;2.3687;1.4523;1.1995;1.9897;1440.935 1997-11-28;3634.65;70.27;144.05;189.414;691.27;668.97;650.14;1822.54;1.4069;20.17;114.2821;306.038;1.6029;2.3737;1.407;1.1243;1.9326;1487.752 1997-12-31;3898.15;71.36;146.47;189.6509;705.19;685.82;671.2;1844.45;1.4393;18.32;114.4079;288.742;1.5986;2.3896;1.4387;1.1114;1.9476;1512.224 1998-01-30;4078.41;72.84;151.87;189.8388;720.36;702.56;690.31;1895.55;1.4748;16.71;114.9354;289.095;1.6041;2.411;1.4739;1.1394;1.9803;1569.287 1998-02-27;4426.14;73.53;153.49;189.997;735.48;722.62;717.45;2023.46;1.4631;16.06;115.3499;297.493;1.593;2.3984;1.4637;1.164;1.9763;1574.163 1998-03-31;4716.64;73.05;149.57;190.2322;747.37;743.1;749.36;2108.6;1.4901;15.02;115.3153;295.941;1.6137;2.4684;1.4872;1.1529;2.0009;1556.301 1998-04-30;4657.6;72.41;144.63;190.475;742.11;737.87;743.95;2128.88;1.5051;15.44;115.8238;308.285;1.6429;2.5163;1.5054;1.1394;2.0229;1500.316 1998-05-29;4823.96;73.12;145.92;190.7431;744.59;738.03;741.6;2101.89;1.479;14.86;116.2299;299.1;1.6394;2.4223;1.4784;1.0962;1.9885;1520.505 1998-06-30;4932.36;72.62;143.98;191.0861;748.46;745.97;755.1;2151.45;1.4949;13.66;115.6271;292.318;1.6454;2.4637;1.4935;1.0638;1.9919;1498.94 1998-07-31;5146.74;73.07;138.94;191.3955;745.68;740.4;746.94;2147.68;1.5136;14.08;114.8205;292.872;1.6612;2.4873;1.5133;1.0759;2.0137;1440.203 1998-08-31;4216.71;74.29;134.87;191.6529;717.71;693.24;672.96;1860.96;1.4933;13.36;116.5325;284.11;1.6463;2.4389;1.4939;1.0322;1.9833;1387.7 1998-09-30;3692.44;74.89;133.13;191.9045;713.6;684.34;656.9;1893.55;1.4;14.95;116.4044;288.982;1.6174;2.3544;1.4022;1.0424;1.9139;1377.257 1998-10-30;4143.33;75.57;138.04;192.1054;730.13;704.16;682.54;2064.4;1.3373;14.39;116.7541;295.927;1.5955;2.2639;1.3376;1.1057;1.8779;1434.626 1998-11-30;4462.95;76.16;145.07;192.3858;750.78;731.56;719.03;2186.85;1.3852;12.85;116.906;294.121;1.6117;2.2978;1.3833;1.149;1.9248;1507.32 1998-12-31;4497.12;76.48;145.09;192.6117;752.81;734.96;724.42;2293.35;1.3604;11.28;117.2221;291.679;1.5943;2.2685;1.3588;1.1593;1.9049;1511.73 1999-01-29;4532.24;76.97;153.52;192.8159;768.19;753.46;746.9;2343.24;1.3856;12.47;117.4568;287.08;1.6052;2.281;1.3824;1.2226;1.9433;1572.978 1999-02-26;4470.42;77.13;156.62;193.0188;766.32;751.25;743.87;2280.57;1.4272;12.01;118.1518;287.328;1.5983;2.3215;1.4256;1.2219;1.9689;1609.214 1999-03-31;4539.26;77.07;156.48;193.2197;777.99;769.4;769.97;2375.19;1.466;14.66;118.0337;285.961;1.5948;2.3724;1.4647;1.2242;1.9976;1597.946 1999-04-30;4714.57;77.68;159.23;193.3796;797.27;797.27;808.52;2468.49;1.4971;17.34;118.0101;282.618;1.6019;2.41;1.4962;1.252;2.0299;1629.835 1999-05-31;4494.29;77.16;159.45;193.5445;788.71;786.48;793.81;2377.96;1.5078;17.75;118.8866;276.442;1.6028;2.4329;1.5071;1.2374;2.0325;1626.49 1999-06-30;4530.85;75.66;158.62;193.7417;790.93;796.95;814.87;2488.54;1.5374;17.89;118.7322;261.314;1.5948;2.4517;1.5357;1.2709;2.06;1609.819 1999-07-30;4531.51;75.61;158.06;193.9231;782.83;785.41;798.89;2480.74;1.5474;20.07;119.077;256.08;1.6041;2.4389;1.5499;1.295;2.0748;1601.747 1999-08-31;4607.21;75.24;156.81;194.1005;783.58;788.94;806.07;2475.99;1.5093;21.26;119.6499;256.693;1.6003;2.4231;1.5089;1.3316;2.0586;1589.52 1999-09-30;4570.61;74.35;154.05;194.4105;778.1;781.73;796.62;2451.64;1.5262;23.88;119.3989;264.743;1.6016;2.4733;1.5246;1.4243;2.0988;1550.628 1999-10-29;4705.24;73.53;144.63;194.7421;780.16;791.25;816.25;2578.74;1.4896;22.64;120.7075;310.719;1.594;2.4656;1.4876;1.4033;2.0694;1464.796 1999-11-30;4877.5;73.95;145.29;195.0445;797.95;819.65;858.24;2650.96;1.5543;24.97;121.4339;293.184;1.6049;2.517;1.5504;1.4802;2.1333;1462.552 1999-12-31;5022.86;74.44;146.26;195.3449;818.67;854.68;911.57;2865.2;1.5841;26.08;122.3848;283.068;1.6012;2.5526;1.5819;1.5423;2.1735;1473.73 2000-01-31;4717.22;73.78;147.05;195.6923;810.24;844.19;896.84;2700.79;1.5903;27.18;122.9245;284.315;1.6097;2.6003;1.5854;1.5097;2.1753;1492.377 2000-02-29;4750.92;73.6;141.84;196.0909;813.34;852.32;911.57;2707.75;1.6348;29.35;122.7525;300.007;1.6069;2.6126;1.6316;1.491;2.1976;1425.47 2000-03-31;5075.78;72.47;142.31;196.558;822.34;868;938.4;2894.57;1.6636;29.89;123.4419;286.389;1.6046;2.6253;1.6616;1.5592;2.2346;1437.595 2000-04-28;5062.73;72.75;138.8;197.0899;817.16;860.41;927.53;2771.85;1.6657;25.74;124.2593;279.694;1.5738;2.6286;1.6605;1.5757;2.2266;1382.252 2000-05-31;5269.66;72.65;138.74;197.6096;811.96;850.32;911.75;2701.34;1.719;28.78;123.5283;275.186;1.5565;2.5885;1.7164;1.5866;2.2527;1404.321 2000-06-30;5293.34;73.51;137.61;198.1698;816.61;854.36;914.75;2791.97;1.642;31.83;123.7014;285.725;1.5598;2.4785;1.6419;1.5488;2.1875;1392.058 2000-07-31;5504.14;73.88;135.71;198.7387;821.86;861.35;924.38;2713.04;1.6519;29.77;123.2199;281.586;1.5508;2.4875;1.6488;1.5273;2.1836;1374.329 2000-08-31;5681.82;74.57;142.13;199.3171;842.47;890.74;966.46;2800.95;1.7149;31.22;122.6298;274.47;1.5512;2.5538;1.7154;1.5883;2.2431;1449.958 2000-09-29;5423.6;74.68;139.52;199.9134;832.87;873.69;937.68;2651.69;1.7586;33.88;123.0352;273.68;1.53;2.5164;1.7552;1.6436;2.2743;1418.244 2000-10-31;5572.9;75.04;138.73;200.496;836.3;876.51;940.74;2606.94;1.7745;33.08;122.2258;269.998;1.5133;2.5671;1.7685;1.6311;2.2772;1405.902 2000-11-30;5533.21;75.84;138.7;201.078;828.12;856.67;904.55;2448.33;1.7779;34.4;121.7135;266.01;1.5213;2.5338;1.7767;1.6316;2.2784;1406.737 2000-12-29;5621.13;77.33;140.3;201.6434;831.25;854.14;894.32;2487.61;1.6855;28.46;121.1307;271.45;1.5135;2.4655;1.6874;1.5052;2.1844;1423.777 2001-01-31;5564.09;77.72;146.68;202.2189;845.77;872.31;917.11;2535.52;1.6305;29.58;119.8295;265.486;1.5291;2.407;1.6291;1.3933;2.1217;1504.266 2001-02-28;5320.82;77.95;144.81;202.7974;836.99;856.82;891.45;2320.95;1.6686;29.61;118.744;261.865;1.5355;2.422;1.6661;1.4341;2.1561;1478.702 2001-03-30;4952.28;78.96;142.75;203.3601;829.84;842.42;866.22;2168.12;1.6908;27.24;117.539;263.027;1.5357;2.4395;1.6878;1.3912;2.1606;1454.997 2001-04-30;5064.11;78;144.25;203.8989;838.46;859.38;894.61;2327.94;1.7131;27.41;116.0325;260.479;1.5287;2.4563;1.712;1.3834;2.1726;1477.173 2001-05-31;5183.45;78.28;145.72;204.4442;846.79;870.95;910.74;2297.6;1.7528;28.64;115.0389;272.35;1.5337;2.4975;1.7519;1.4383;2.212;1494.848 2001-06-29;5006.54;79.17;144.4;204.9965;844.03;864.28;897.98;2225.29;1.7856;27.6;113.3488;270.231;1.5225;2.4986;1.7827;1.4571;2.2301;1479.713 2001-07-31;4732.71;79.68;145.56;205.5421;836.09;846.39;866.54;2195.55;1.757;26.45;112.4682;267.532;1.5134;2.4867;1.7602;1.4129;2.1995;1494.249 2001-08-31;4540.71;80.26;146.87;206.0836;829.23;831.39;840.12;2089.84;1.6808;27.47;111.3268;272.386;1.5144;2.4137;1.6799;1.3841;2.1437;1509.104 2001-09-28;4085.51;80.98;144.89;206.476;806.53;792.12;778.82;1905.41;1.6338;25.88;109.7901;283.42;1.4919;2.3951;1.6386;1.3788;2.1019;1488.069 2001-10-31;4137.99;82.94;144.92;206.836;822.1;808.9;796.92;1941.8;1.6357;22.21;108.5999;283.061;1.4796;2.3698;1.6329;1.3461;2.09;1490.671 2001-11-30;4260.27;81.68;146.99;207.1815;830.26;825.82;824.76;2056.38;1.6509;19.67;107.3045;276.164;1.4665;2.3717;1.6509;1.3485;2.0943;1530.466 2001-12-31;4382.94;80.34;145.39;207.4991;829.2;828.47;832.5;2069.1;1.6566;19.33;106.7479;275.847;1.4743;2.3743;1.6498;1.2988;2.0886;1508.709 2002-01-31;4265.15;80.37;146.88;207.7927;830.14;829.18;832.49;2006.2;1.6709;19.67;106.4175;281.511;1.4738;2.3891;1.6681;1.2579;2.0928;1527.139 2002-02-28;4332.86;80.68;147.32;208.0939;832.32;829.94;831.72;1988.56;1.697;20.74;106.12;295.495;1.4774;2.4155;1.6979;1.271;2.114;1527.425 2002-03-29;4561.61;80.63;149.59;208.3776;840.44;843.56;852.66;2076.16;1.6743;24.42;106.0033;294.055;1.468;2.3822;1.6753;1.2778;2.0958;1553.814 2002-04-30;4519.16;81.6;149.75;208.6504;839;835.48;835.7;2005.59;1.6542;26.27;105.7598;302.683;1.466;2.3871;1.6549;1.2654;2.0801;1558.041 2002-05-31;4546.05;82.16;152.14;208.8647;839.66;832.75;828.78;2008.93;1.5889;27.02;105.8656;314.493;1.4567;2.3175;1.5876;1.2566;2.0301;1581.594 2002-06-28;4146.93;83.4;153.96;209.0812;824.96;805.13;783.85;1886.69;1.5399;25.52;106.2049;321.178;1.4716;2.2844;1.5408;1.2479;2.0034;1602.127 2002-07-31;3623.48;84.68;154.98;209.2245;810.6;778.16;740.27;1727.5;1.4718;26.94;105.5696;313.291;1.4626;2.29;1.474;1.2482;1.9603;1612.556 2002-08-30;3652.39;85.09;155.39;209.3556;818.19;785.37;747.19;1730.45;1.4972;28.38;105.3376;310.26;1.4639;2.2998;1.4977;1.2579;1.9789;1615.529 2002-09-30;3336.21;87.56;154.61;209.4862;804.26;756.54;700.35;1539.93;1.4931;29.67;104.9695;319.136;1.4651;2.323;1.4938;1.2374;1.9742;1605.437 2002-10-31;3442.53;87.49;159.75;209.6159;815.03;770.67;718.94;1653.39;1.4932;28.85;104.3729;316.557;1.4649;2.3242;1.4929;1.2051;1.9684;1669.264 2002-11-29;3561.69;88.09;155.65;209.7461;827.2;789.36;744.59;1742.29;1.4658;26.27;104.2582;319.067;1.4673;2.3028;1.4651;1.2053;1.9498;1619.024 2002-12-31;3245.5;90.36;156.63;209.854;817.09;766.44;706;1657.64;1.4388;29.42;103.4171;331.919;1.468;2.2855;1.441;1.181;1.9299;1626.315 2003-01-31;3089.68;90.53;161.92;209.9594;813.62;758.33;692.41;1607.12;1.3765;32.94;103.842;356.859;1.4623;2.2242;1.3759;1.1586;1.88;1687.847 2003-02-28;2907.11;91.1;167.55;210.0595;811.94;751.55;679.8;1578.99;1.3602;35.87;103.2518;358.97;1.4672;2.1922;1.3616;1.1406;1.8658;1749.301 2003-03-31;2882.43;90.43;165.43;210.1143;806.94;745.9;673.68;1573.78;1.3614;33.55;102.8396;340.55;1.469;2.1505;1.3592;1.1458;1.8629;1726.138 2003-04-30;3235.31;89.79;163.86;210.1683;826.55;774.39;712.52;1713.25;1.3783;28.25;101.7858;328.18;1.4954;2.1676;1.3773;1.1492;1.8884;1709.427 2003-05-30;3310.52;91.69;168.79;210.2177;843.63;792;730.3;1810.79;1.3111;28.14;101.5722;355.683;1.5148;2.125;1.3097;1.1175;1.8454;1762.312 2003-06-30;3437.73;90.9;166.02;210.2681;852.44;808.58;755.26;1841.9;1.3196;30.72;101.5519;356.352;1.5399;2.1914;1.3189;1.115;1.869;1733.178 2003-07-31;3620.38;90.46;165.67;210.3184;855.22;818.03;772.36;1879.09;1.3611;30.76;101.6129;351.02;1.5471;2.2091;1.3601;1.1463;1.9032;1730.552 2003-08-29;3674.7;89.44;167.94;210.3652;862.49;830.7;791.13;1919.46;1.3811;31.59;101.2882;359.768;1.5404;2.2021;1.3816;1.1637;1.9165;1758.767 2003-09-30;3626.43;90.64;167.37;210.4098;862.55;825.96;780.45;1931.01;1.3743;28.29;101.7552;378.945;1.5469;2.2198;1.3788;1.1987;1.9248;1749.719 2003-10-31;3769.49;90.05;171.59;210.4534;874.58;845.78;809.33;2045.41;1.3222;30.33;101.9386;378.92;1.5481;2.2172;1.3224;1.2074;1.8954;1789.806 2003-11-28;3842.74;89.55;174.48;210.5003;874.18;844.31;807.06;2076.32;1.3318;31.09;102.6444;389.91;1.5587;2.2487;1.3318;1.2192;1.9146;1817.591 2003-12-31;3961.58;91.19;176.55;210.5459;885.41;855.98;819.51;2206.42;1.2643;32.15;102.706;406.982;1.5549;2.2137;1.2664;1.174;1.8579;1841.532 2004-01-02;4152.32;91.27;179.92;210.5892;900.41;876.26;846.02;2241.83;1.2391;34.27;102.8396;413.788;1.5661;2.2621;1.2417;1.1672;1.8506;1881.488 2004-02-27;4221.28;92.47;178.54;210.6345;911.76;890.48;863.3;2279.37;1.2448;34.74;103.2724;404.878;1.5731;2.3222;1.2436;1.1672;1.8625;1868.657 2004-03-31;4098.04;92.94;178.14;210.6784;912.61;891.05;862.69;2264.24;1.2778;36.76;103.8939;406.667;1.5666;2.3328;1.2767;1.1764;1.8817;1862.56 2004-04-30;4252.39;92.1;174.33;210.7261;903.34;881.54;854.21;2217.87;1.2969;36.69;104.2061;403.26;1.5547;2.3375;1.2965;1.205;1.8937;1820.847 2004-05-28;4161.31;91.42;175.32;210.7718;896.55;872.66;842.61;2238.07;1.2839;40.28;104.9486;383.779;1.5408;2.2908;1.2828;1.1453;1.8631;1832.934 2004-06-30;4166.47;90.92;175.01;210.8593;898.09;876.95;850.13;2284.02;1.2503;38.02;104.5923;392.373;1.5187;2.2867;1.251;1.1431;1.8353;1829.096 2004-07-30;4098.61;91.82;175.61;210.9524;900.48;877.32;847.65;2209.45;1.2452;40.69;105.1902;398.091;1.5268;2.2912;1.2438;1.1379;1.8345;1834.21 2004-08-31;4016.27;92.87;175.97;211.0615;907.48;882.81;850.69;2219.16;1.2623;44.94;105.6329;400.51;1.5381;2.2976;1.2629;1.1435;1.8509;1838.379 2004-09-30;4057.34;93.3;178.22;211.1846;911.75;886.73;854.45;2261.14;1.2629;45.95;105.6646;405.275;1.5431;2.2641;1.2631;1.1473;1.8505;1862.603 2004-10-29;3987.28;94.75;183.67;211.3126;916.25;887.79;851.16;2316.47;1.233;53.13;106.4282;420.464;1.5427;2.2314;1.235;1.1338;1.827;1914.059 2004-11-30;4052.75;96.12;184.1;211.4429;922.25;894.25;857.96;2438.16;1.1711;48.46;106.5773;439.375;1.5221;2.1785;1.1732;1.1183;1.776;1913.266 2004-12-30;4234.56;96.37;188.29;211.5693;935.38;912.38;882.32;2531.23;1.1465;43.33;107.4548;442.079;1.5359;2.2103;1.1453;1.1033;1.7659;1955.1 2005-01-31;4305.72;97.92;193.49;211.7016;947.56;925.21;896.07;2474.24;1.1792;46.84;107.8639;424.03;1.5467;2.2128;1.1777;1.1393;1.7951;2017.103 2005-02-28;4435.52;97.16;186.46;211.8354;945.44;926.01;900.68;2552.62;1.1918;47.97;108.3612;423.35;1.5499;2.2468;1.1907;1.1351;1.8078;1940.473 2005-03-31;4456.72;97.71;190.05;211.9722;949.96;930.41;904.95;2503.07;1.1756;54.31;108.2204;434.321;1.5489;2.2354;1.1727;1.1147;1.7915;1980.904 2005-04-29;4444.06;99.59;192.86;212.1065;955.21;931.55;900.97;2448.53;1.1954;53.04;108.6651;429.233;1.5471;2.2645;1.1949;1.114;1.8064;2009.393 2005-05-31;4645.39;100.56;196.4;212.2391;975.37;958.51;936.33;2492.03;1.2172;49.83;108.8608;421.905;1.5448;2.2575;1.2173;1.141;1.8221;2048.989 2005-06-30;4752.39;100.53;195.86;212.3714;987.18;976.31;961.22;2513.6;1.2665;56.26;109.3518;430.657;1.5382;2.3004;1.2643;1.1635;1.8559;2039.866 2005-07-29;5025.01;100.56;199.77;212.5051;999.36;995.21;988.89;2601.4;1.2945;58.7;109.4941;424.469;1.5581;2.2651;1.2937;1.1552;1.8759;2080.139 2005-08-31;4977.17;101.25;197.98;212.6397;998.92;992.42;983.05;2621;1.2629;64.97;109.7133;437.93;1.5526;2.2652;1.2623;1.1415;1.8528;2065.196 2005-09-30;5271.01;101.43;198.36;212.7798;1011.09;1012.92;1014.5;2689.08;1.2671;65.57;108.8826;456.048;1.5491;2.285;1.2638;1.1377;1.8553;2064.165 2005-10-31;5338.4;100.21;197.75;212.9305;1000;1000;1000;2623.84;1.288;62.37;109.8999;469.898;1.5489;2.2721;1.288;1.1222;1.8635;2058.024 2005-11-30;5601.68;99.82;193.02;213.1098;1011.92;1021.27;1033.36;2711.26;1.311;58.3;110.9601;476.666;1.5452;2.2732;1.3098;1.1062;1.8703;2001.904 2005-12-30;5742.41;101.06;200.02;213.2893;1027.15;1040.2;1057.11;2771.33;1.3053;59.43;111.4828;510.097;1.5478;2.2788;1.3047;1.1003;1.868;2079.343 2006-01-31;5928.95;100.12;198.98;213.4714;1031.51;1049.8;1073.76;2895.08;1.2773;65.51;112.1873;549.864;1.5491;2.2569;1.2779;1.1075;1.8512;2069.097 2006-02-28;6012.26;100.33;205.1;213.6807;1039.76;1061.24;1089.55;2890.77;1.3052;61.63;112.3445;554.995;1.5578;2.2785;1.3041;1.1064;1.873;2130.738 2006-03-31;6163.39;98.5;202.71;213.9032;1037.19;1065.25;1102.36;2954.33;1.305;62.9;112.7046;557.093;1.5688;2.2753;1.3047;1.1122;1.879;2109.17 2006-04-28;6251.53;97.28;205.71;214.1422;1029.51;1055.05;1089.87;3044.03;1.283;69.69;112.6933;610.653;1.5749;2.2669;1.2834;1.0967;1.864;2145.657 2006-05-31;5924.57;97.53;205.05;214.3963;1015.02;1030.21;1050.63;2940.05;1.219;70.94;112.5694;675.393;1.5565;2.2772;1.2188;1.0909;1.8148;2134.181 2006-06-30;5955.64;96.85;199.07;214.668;1012.06;1030.12;1054.12;2939.19;1.2321;70.96;112.6257;596.145;1.56;2.2708;1.2324;1.0746;1.8226;2073.981 2006-07-31;6175.15;97.76;200.01;214.9455;1023.21;1043.3;1070.33;2957.53;1.2376;74.41;112.4569;633.71;1.5686;2.2796;1.2363;1.069;1.8287;2085.235 2006-08-31;6357.87;99.47;200.35;215.2466;1039.88;1063.53;1095.23;3034.3;1.2318;73.04;112.3445;632.593;1.5775;2.3302;1.2305;1.0613;1.831;2085.66 2006-09-29;6567.56;100.24;199.1;215.5717;1051.61;1079.81;1117.73;3070.48;1.2455;63.8;111.9744;598.186;1.5837;2.345;1.2433;1.0619;1.8437;2073.19 2006-10-31;6700.4;100.44;198.68;215.9061;1060.84;1094.42;1139.46;3183.17;1.2602;58.89;111.5497;585.78;1.5897;2.3622;1.26;1.0618;1.8579;2065.888 2006-11-30;6663.75;101.37;200.23;216.2572;1065.16;1097.52;1140.44;3261.12;1.2356;59.08;111.1933;627.827;1.5922;2.3624;1.2357;1.0533;1.8421;2080.457 2006-12-29;6929.18;100.31;206.51;216.6365;1073.47;1114.01;1168.64;3327.43;1.2099;61.96;112.0528;629.791;1.5966;2.373;1.2078;1.0311;1.8232;2148.04 2007-01-31;7241.78;99.53;211.81;217.0323;1084.01;1132.33;1198.18;3366.71;1.2431;54.51;111.06;631.166;1.6157;2.4367;1.2439;1.0327;1.8596;2206.512 2007-02-28;6974.44;100.14;210.25;217.4341;1081.98;1125.54;1183.79;3349.19;1.2393;59.28;111.0933;664.745;1.6213;2.4271;1.2402;1.0284;1.8581;2186.404 2007-03-30;7183.53;99.8;215.32;217.8504;1087.38;1134.56;1198.59;3410.5;1.2178;60.44;111.2044;654.895;1.6126;2.3708;1.218;1.038;1.8368;2246.201 2007-04-30;7620.11;99.72;215.72;218.2774;1097.69;1150.8;1224.38;3560.91;1.2124;63.98;110.7051;679.368;1.6374;2.4104;1.2116;1.0196;1.8425;2249.017 2007-05-31;7682.32;98.35;214.63;218.7272;1097.2;1158.83;1244.59;3660.68;1.2211;63.45;110.8159;666.86;1.65;2.4217;1.221;1.0112;1.854;2235.44 2007-06-29;7514.07;97.33;210.78;219.2199;1084.32;1143.72;1226.65;3632.44;1.233;67.49;110.4508;655.49;1.6542;2.4486;1.2332;1.0054;1.8644;2203.186 2007-07-31;7271.66;97.84;209.6;219.7151;1077.82;1128.45;1198.82;3552;1.2069;74.12;110.3183;665.023;1.6567;2.4562;1.2076;0.9934;1.8477;2191.988 2007-08-31;7231.45;98.71;208.23;220.2462;1082.78;1131.54;1199.16;3549.3;1.2027;72.36;109.4393;665.411;1.6377;2.4154;1.2027;1.0306;1.8398;2176.576 2007-09-28;7262.53;98.9;207.85;220.758;1087.4;1138.46;1209.29;3718.09;1.1852;79.91;109.1551;712.653;1.6475;2.3924;1.1861;1.0309;1.8298;2172.055 2007-10-31;7372.14;99.47;202.99;221.265;1096.57;1152.46;1229.89;3832.13;1.1741;85.8;108.3395;754.604;1.6704;2.3991;1.1742;1.0133;1.8304;2110.706 2007-11-30;7154.69;100.23;197.93;221.7717;1082.97;1124.44;1181.73;3675.49;1.1233;94.77;108.1772;807.331;1.6485;2.3281;1.1234;1.0113;1.7851;2055.514 2007-12-28;6925.44;99.51;199.45;222.2818;1073.19;1110.24;1161.83;3628.07;1.1402;91.69;107.5085;803.203;1.6586;2.302;1.1391;1.0154;1.7947;2078.086 2008-01-31;6234.18;100.52;199.56;222.7738;1050.35;1065.21;1085.32;3350.82;1.1006;92.97;107.0258;889.595;1.6189;2.1669;1.1008;1.0223;1.7425;2088.089 2008-02-29;6188.55;100.42;205.29;223.2936;1046.57;1056.6;1070.64;3331.42;1.089;95.39;105.7809;922.298;1.6087;2.1416;1.0908;1.0178;1.7294;2161.511 2008-03-31;5961.47;99.87;205.39;223.8311;1028.47;1028.69;1030.11;3299.49;1.0126;105.45;104.7808;968.434;1.5711;2.0274;1.012;1.0039;1.6512;2158.029 2008-04-30;6294.68;99.61;207.43;224.3555;1051.17;1067.24;1089.04;3472.91;1.0138;112.58;103.7486;909.705;1.5954;2.0034;1.0125;0.9874;1.6578;2176.994 2008-05-30;6333.56;99.48;210.33;224.8755;1052.65;1070.83;1095.7;3525.86;1.0448;125.4;102.429;888.663;1.6245;2.0503;1.0435;1.0008;1.6962;2205.628 2008-06-30;5855.52;98.9;209.72;225.3989;1020.95;1020.79;1021.64;3244.65;1.0371;133.88;101.4504;889.488;1.6138;2.0369;1.0373;0.9709;1.6808;2182.143 2008-07-31;5964.48;100.55;208.09;225.9172;1031.52;1031.08;1031.38;3165.37;1.0283;133.37;99.99;939.772;1.6186;2.0397;1.0261;0.9611;1.6738;2172.928 2008-08-29;6061.78;101.51;206.47;226.4346;1042.79;1044.22;1047.03;3120.91;1.0841;116.67;97.8827;839.025;1.6204;2.0434;1.0839;0.991;1.7177;2152.578 2008-09-30;5563.93;101;208.75;226.9929;1011.39;996.43;978;2749.71;1.1102;104.11;94.4216;829.932;1.5945;1.9954;1.1097;1.0406;1.7276;2179.719 2008-10-31;5044.85;99.43;196.28;227.5076;953.5;913.67;865.87;2228.36;1.1429;76.61;92.895;806.62;1.5202;1.9298;1.1421;1.1427;1.7282;2037.436 2008-11-28;4780.29;103.51;197;227.7456;959.78;903.45;837.24;2084.12;1.191;57.31;90.0415;760.863;1.5152;1.8251;1.1894;1.2278;1.7619;2042.68 2008-12-30;4567.57;104.02;200.51;227.8713;949.66;880.77;801.03;2150.99;1.1404;41.12;86.6927;816.092;1.5397;1.7075;1.1463;1.257;1.7409;2088.179 2009-01-30;4375.72;104.62;206.29;227.9714;945.35;871.82;787.3;1962.55;1.1267;41.71;83.1769;858.69;1.494;1.6274;1.1287;1.2502;1.7041;2155.283 2009-02-27;3929.92;103.63;206.08;228.0655;914.5;827.96;730.29;1761.67;1.1639;39.09;81.1558;943.163;1.4905;1.678;1.1651;1.2619;1.7316;2143.595 2009-03-31;4137.35;103.66;211.18;228.1421;931.55;849.94;757.47;1894.51;1.1555;47.94;78.4664;924.273;1.5068;1.639;1.1553;1.1823;1.7138;2210.753 2009-04-30;4487.52;104.64;214.69;228.2187;971.4;906.76;829.98;2107.04;1.1481;49.65;76.8204;890.2;1.5151;1.6873;1.1482;1.1633;1.7136;2254.897 2009-05-29;4615.16;104.92;220.33;228.2944;984.31;923.76;851.19;2297.95;1.1076;59.03;74.9987;928.645;1.5118;1.7077;1.1086;1.1455;1.6865;2317.361 2009-06-30;4662.64;105.93;220.3;228.3696;994.44;934.46;862.3;2287.58;1.0809;69.64;73.6239;945.67;1.5145;1.7693;1.081;1.1188;1.6706;2316.026 2009-07-31;5109.4;108.34;221.72;228.4381;1029.45;977.03;913.27;2481.33;1.078;64.15;73.4621;934.228;1.5202;1.7649;1.0796;1.1426;1.6747;2335.275 2009-08-31;5346.17;109.36;224.44;228.4984;1047.36;998.93;939.41;2583.7;1.0683;71.05;72.957;949.375;1.524;1.7675;1.0689;1.1262;1.6672;2364.018 2009-09-30;5461.31;109.96;229.61;228.5533;1062.8;1017.95;962.27;2686.68;1.0391;69.41;72.2816;996.591;1.5148;1.6987;1.0406;1.1385;1.6411;2424.394 2009-10-30;5402.58;110.13;231.64;228.6032;1057.22;1006.96;945.48;2638.88;1.0213;75.72;71.634;1043.159;1.514;1.653;1.0216;1.1321;1.6239;2447.808 2009-11-30;5388.37;110.71;231.08;228.6508;1064.97;1015.53;954.79;2746.71;1.0131;77.99;71.7416;1127.036;1.5104;1.6807;1.0123;1.1362;1.6202;2434.358 2009-12-30;5626.4;110.68;239.83;228.6988;1079.6;1037.35;985.07;2796.04;1.0301;74.47;71.4195;1134.724;1.5025;1.6694;1.0283;1.1463;1.6275;2516.535 2010-01-29;5570.19;111.66;244.84;228.7465;1084.16;1037.8;980.52;2680.47;1.0345;78.33;71.3838;1117.963;1.4767;1.6728;1.0337;1.1327;1.6193;2578.804 2010-02-26;5763.27;112.52;235.99;228.7941;1095.19;1053.79;1002.03;2718.26;1.0722;76.39;71.0704;1095.413;1.4673;1.6748;1.0715;1.187;1.6484;2478.907 2010-03-31;6007.84;112.68;243.65;228.8412;1112.97;1078.27;1034.47;2886.6;1.0666;81.2;71.0206;1113.337;1.4484;1.6053;1.0668;1.1778;1.63;2562.994 fPortfolio/data/SPISECTOR.RET.rda0000644000176200001440000047367511645005054016030 0ustar liggesusers‹4\y¥ ¥”)…©¯¤På É<ÏóœyžÇkžeÊ<'³JH$MDšQ©E#‰RI¿ç¼ŸÏïýã{ß{³÷Úk=ëYÏÚgŸô”L$6˜l b-±– ÿ¥Ãÿ]·ÿYC[ð±I_GUÿ¤¢¶ž˜ÞIb Ýf‚0œ U–ˆKDe´x­òµãŸ JÒ£rÎÞ›%oµëßR/A±=årey/Asê9’B%(V¥Û´.L“ÒÓ{”DÕô"©·EGØ\Lm AËιMÐüëÞ´´˜oJ—>4Þ”ËW‚–ܳOæA˶¾ÁyU– ¸ÿg½ä4NP²œR Œ´¸H¡=Oq_öóг %“ÍNj¯A‰t¾|– $ï$ÎÞ$hñAo¿4[Nê_Øeqb´`› Æo¸ffK%hoK~š4ÅåЂüîï*ûGc˜ ¥OæZâú”î϶η J‚„éÆp ‚æÊrö'}v«‚=Ôl›kŽ;0ïõ°Û¥i‡U#A î\ÿê.Æ•ò¸sæ7A3£±õ&(qîg--ì0®‹æ¶Ø%Ù§q†Àø-&'Þ*4_Æùýù‡ZfÄéÝõ"ÍS¢C½~ÔïËwˆš'hgÃö¨ó”X«ª"µq‚æXó`ƒSA)ç\£7&IÐtû¬]¶Àß¹oÖhÀ®3K‚ÈW†~yå]Ø'X6]|óÅ¥x[}‚"ø¶\s¿JP W?Éfa/¾Më¨:ÍoèÉ„;æ ¨?Á±ã Ö©&×w«ˆ ø]ÖÔ†}#[³wl&(fÔóçà·GØ‹±ÞÓü{`?Û€uÇ2îKfn3o (‡_?äÑ ¿=ÒøÄЏQ½ÃÌŠçõpýc¸îô¹c;Ü7[öÑJ‚u°asoæO¸Ët ö¼ð­Tp'(æïu\Þ²lnlƒ_%âSŸc]úv]²¶ šÚ7íæ¹ ‚âÊÃç9|„ „wN¿¯Ãý SÑ­XwfVó†i‚âûúóȳ Ü/õ=K߆ ©Ï•Ê‹Âÿ»Ìtã&p_EL¯7ü£7víþ(â*&h™u%êºZ $h›ø †ñbÝϽ{š <ùo6<£CPœ»{ds.´èoÞ“_o÷Š|‹ÀQz€«RUìØ÷ÂàÄ:|ŽˆÒñ”ÐaIÿ>Ügs¨Yj€ iÅ'ñO´ƒ"Öé`ü°&¥›µË-üŒÅ?ÕÅ®³¢Yñ >åxÛë4P¦2‚ÿýŽî÷oÅz þ¿÷$(Šážìbð“B’æ®i¬Oˆ+æ½Æó øæÈLÐlb¶™³_>Î~¡ûޏvγ¬#(!ô¯Tµ¸à.¿:Žcø¤¼_¾›IP,ƒ, W1Ž]äž³åò°÷€Ö½{\È÷uLÎXg¤øÎþ °CÿeêGÄÃéø›GìÀ§s͉/ÄÓó¯`ÿuŒcQm)´vžN<7žü€ Ä;ts¶õ=+­ºªqŸùãþoð©5¡jÖŒñDlËtøÏ±ŠwÝ]à1ý߬­âa!½íü¦úSÇo ìJ ëŠ|9Êh›±Œuë¬aáÂýnI[–èqÓwFùg‚|í½Ð§\‚&ñ]w/ü0ZD }ÒÒFÞ›s»oõù‰(Ît‚ß|ï®hêÃ_¼"hÖ¿s^oE|¼™´ßþF¼Í¤øï„À{ä…¿hg79ö›Ãbò°ËTÿòçÞðC93g!paõ¹¥x;òØ‹ãY'ë?Aåz8 ;i%ÇÞÿÿ?Z¸z±¥‰ ˆÇ ¾ÇwGq‡Oäx;­O…`]1<ÇíZ¤é”ÂUøÓ—/ý‰ð"xâ¬[nòŸúÙ÷rypÜûÏ)x Jü{)&Ž ©í?˜‡<×ikg‰ud3„€—sŽ´Ï4Ý%(Ñ’9Laàe=½ý–J˜Ïö¡kæ `ú«ú ¼–{¿ÆX¸\]òöA|sb«‚Ëv·Ÿ_“‘g‘z'ÂT'`—w»1âàsƒcŒä[ «.½;˜7óÚóò9ð”Ûõ±]áˆKÀ+Qn_ðhʦ÷öUà]“³cÍ$ÎüN[ŸE¾¹˜_¾Åƒ8QûD{·ÿn[ÝÕáoŠü“€ÂƒˆS²”¤ôkøÁ®O+ £*ÖSý8 𒦍‚3ââ(°*G`ý±7Úbâ>¡ÛÃøN5¡ß…ïiRŸ…Å1û}аÏeË&™Áy‚"¦ þ+¸Û¢æzóÛ´Wh<Ïï­»·GûðèÞ4nÞrã”ÝeüçG¿g'hQR+¼ˆ·½ô'ø#1-%Ê »òY¼ø|ð|7Õź3ÿ­&oEÜÃߛ֕À¾ ëWÕQ×lßVlJ«þæ:Ux¯"O>j²'Žié•0^²"E´D x³?õWøKܽmc)ì5­+Äxq—òë}ç6µÀ»Ö©™øw°Õž{-®¥o _ôßo`Ü ¾t—èêÅú¤ô#öÙgœ*?=‹ÿÁwôlÀ©Kh¤#®—•™½ w^¤(ã»éØ•IøÏ„aHqü&'QóñNzÖñÝuKLæ3ƧŠkjÙIPt¿ÕO+¢nЇá×ÐÝàÇ £øò üž6®?å|¿¼¦Ð讀OSº;kq_Œ÷²É]Ô1·L1Á%Øá?2²]|`gàöVëöžI-â†ÿc‚l*˃ÿ%r__†¿œë¬Á?¦/V;0~‚†ž[È üR4ù~yŸêP'»^Š (ÏZÁúCÝB½WÇѲ=ûvŸIPøÎˆ¿7R8œ£©”<ƒWÁÛ Je­½ØW*ÅÇ®LJ|滕‡/ u&ú¿S£)àé,™Ò¥ý×0oÓ¡KfÀ}^øwAíÇÀ‹v·…ptv$íQ#/A³ŸdbD~tù+3!¿S 'Å)¬7ÞÚ‚A¸×(‘”@Ü·5„ÿ¾ü¤lùbñŠÔOl!_€ÿˆ·M~ ‘9óÙ,u4_ÞaZ÷vX”ƒçί޼2رãÁ—æGñ=˜Qàùwè°æœ^Wðgä§7烟|]¥|ûǨAjŠÐ¡¬®²ÙÁ^²JZÉÇ5O"£Î§g÷-€o’n×›ÄHQcƒG“ÿ¸F¸ƒ—¯>û†yEy€ÏÏÒ®‡0ôíýM+ÈÉÃï^âïÔ‚¬ZÎ.ø=¥ò9;ò/ù÷®ør5ð†æ=ìÏÕy\x|ðߨ+Ä)z·ç ?²NœHó×oQÅlâéàjTÄ«Hè—lÍk ŠìôìYGŒŸxûÄŠìN²Õ¤›ùHPÎPVûQGttì^Õ]U›YP/9Oœ#u³ú—K³ðCÖ„Jø‡Øk°X6\Ê-0ÎÏz ¯pש·9o?&ƇJ`WÜžÒé"¨K”9÷‡à}ï‚l±ˆ{Œ¢‘§âåi‘KåÁú¨‚yÓ¨£¶ÓÎ_¦ ÏµX,ú`Ÿ#ýÏÚYäunùö;~­-Å|vø8!ýé¶/ô€gDúØ)±Ntú$Æž? ì âZªž Œž® ù}±€ qˆíÙÉ|§PÒƒú‘¢q9XyüdøðÝâž&Bßpõ0IæÑ»9è·Èg:SìЩ¡ùg*®CGdˆ-V„"?æÎHÄÀîü¨½{áÌ­¾¿lag^ó*¨‡¹ÆÓ® ¨{-Mt~%u½”¼Ó÷NtÿºoVÒøagMËâÚàX*¥H¾Ëk©ó¿zùqÞõ½3x¯•Oî˜w&h ñçöÀÎæÝÇ„‚ÿK¶Mh÷lE=‘dþç¯z(ýtª«‡ ”Öf±Ã_)?s^À‰C[´2p“¶ Q‹:_X-xâZ¾¿´)J–#hR7_f‡>w¸û†q «ð>Øj>HÞctMü³ók…Vò ±V£ùÍ™#[‡¼z(¸ã>âËÜQ8>ËK ÿìUð_æƒØS¬«ødÒ¨ÍÅ|Z\¹ñêÀMÊɧ.rq}þËy¬+ûÉî·ŒÀK±È…{ÈË$­²ž›Zè¼6—¾À8nz»¥7£Nd<¢>Fž[ü™æßþµw‰ Çßó ÆüA½‹ÚùŠþ'æÏœŽò( (ù?vnÝ~ ¾ÄõBõ9'?®e tœg¯ho)ìŽ0žÙüùœMWøêyê—ÀVðA£èÂÕEøßSN~öæsœX$ý¶i<]Œwà˜…+Ökªi¢ymÁ(~áAÛoit! ãæ>ÊyÙ{Ó] i¿/Šƒã&ÈCkúo½º¸>õ`ßÌÔ'/¯·Z÷°~«FŸIsà5Î9H;Æu¶n(z+êvÖ7Uí¬ËO¤ÿÝØÓ£c.ƒ¼´ëìŒ@½Šs<¨†þ‰Ê j5Š<´Úzîø<"¹Þ¸ý¶ÅìÌi#ð¹sKÁèOíªÁú{ÈËø¦P\yDz} ü#vŒãã x+ªáqd#p˜}JÉ× q62¹îx×GG\è¿=’Äüqê«§©`,t--vÝ»QðŸß@I{7ÉÛíY†ôЛIò)³à{š³yx¸êDp†ã® ÀU¹þ¦7ÉÉàÍ£7¼,QÏUÚžÖ/$ÿ½ßöW ë_ÙWàŽq}†zYÖCÇfk"n@·ïrYïŒx† 5j¢óÚ²(²þMúÂ9g=˜Â4OA9É’5Ò@òSUÜ¿Iø¹ m½ï,ôM¥Eg$xÌßuÞzàw±åKx'¢°´åìðØ›6NÃú3%ž¥|Ãu÷Â÷ Ã^Fí¡¤îLË1áAþx˜[û:Lûûçª{dµ0½ÀISص¹pê^Xì^kØzòQÝaô !éµyÀg¸‹}ô øÇsS7!JêÄ„1U)øI_m9ñøÞžá•yÖmòÏäáVÔçÓžšº »Ô ¤­NbÝ~G¿•#/Ì;‰8Sä¥{÷W\`‡C¥‡¢6Æó=îxøp?Èx^úA­b"ê ò,á /S<=ð±1)çôz€‰ÈLâ’ønêsxLïÀ…ëÂX·óðÇãʰ3¦Ÿsfó#\§U?)ùw²€‡åüŽ£NŸ M‚_õ¼î|û€õ+,¦Õ’u¨LýºRpB7ö/|ä÷x›ÃEÌc$™èî?ªFo^‹u„²°¢¹e³9úïi)—wB_eöù¶5z¾±»‰ãE^taÞ>ß÷žÁ¸x‚:²ñkú“ðG›ÕœÁ»î¹¡­{Q'T¬˜Ð/ûoÿn‹únÏI£©¡¾ùÅ¥§Ÿž<t‹ìOš^¿²#zÛ¤øÐ]äbéiünSîo¯Þ˜[ª]ƒxùo²ú‚uÑ<ÎxæG]È™wåG| /é9>N[¢¢ QdzF¿©™NûÍ_‰CÄ>®V¿ðŠ •&ßR»qëºhyw~ÉÎhþ, ~–ª3š¾Þûö,)ýÜ™¹¤†þ»Èû;ë¡OÖYnż¹Ö½9©”rsZ¯[A+ú>&C»|ßÿÝ|›?A9Ï7¸Ûè AcršÜWƒësG}+…¦iG†Àƒ_^ Ï>Á|¿˜TŠËÊÚ…ù6¸.°ø½Ü8™Lyâ›Zµô¾vç7TJÂäÏWM೚ÍÚ)Å!TZ޵D$ò© 7E¦ú…ýwõ>Üר¥rò*êlcî†5¦¨™:úþç¤oµý¼sÇP‡*|Á3yfAÕ_”š¿§z/ÑÍ;ƒPO”ðŸÙYrßïÿ4±6þƼUávü˜¯¾à¤ ÓøÇ_ÕéÓôkÖØGf*%qôUæ ÔýôC÷ªÒ$o)H†"¯Pÿ%´½<Ñg¸Ž¤k-#oòËÖ®0…ßÞ%k‹o\>—ûÒ õ)Þòêäƒ}C­€)ÆKh)àZ÷ zÁjq­êعÁLJbàÇîñùÐ%ÙÙí«#àÿBgõÑx਒¾ê\¡•qh9ùpmüãZE8ð_¼«+>&|nëï±|-óbü–/Ärú ê~ylYòK‚–?up âѳê=‡xÄ8nS4X¾¶>;§Ága¦¯Ÿ‰´2ÑkÇorÀ_Ò[ÚO‚·/¨æ_ñ¾)6 ¨_E¬N1oÑçÛÉn 8„¾Ë7¼Es ú–³Û8Þ¥ã:•Ùçp*÷]…^SýÈ÷Æ€ ‡Jôp^!(B=÷o¿…2ËkPöuŽ«bœÔö‘CàÙè‘älàã„¶üLüîwyÛˆò(T$ZÔ<šù;æð~ 0leyñ¸)¬å ÖýyÈ3òBG±Ë™Ô¹G…wGÁÎ?Ë] ë¹?˯Á:/Æ+Xæm&û¦¼º?{?À—ÔCÓˆG!ÿïéÿØÑo]eV=Lî»Ò>)>Î$ûû–_Ð1¹Ù? ƒ/â˜^oÎ>›Ú¡>eªì;z§âÜ.‰8VdlaKÃúsZZãúS÷~üžnv(ð­2Ö{ë3sÖûðb(‡7wßÇIÐa¥Mo{«‘/»:?nŽX¿øŒ‘®Ïnå->îz§‰uk­ /W¥Tlê@~Öeœ¿{u!‚nãa:ðÉi¹}ŽÐ)I—»j>‚<¢î®Tâ{ ÓÀJìø‘öp­;ú¢òŒão¦‘?/“*Ñçd0=;#‡þ0¿Ë»sËiè(fUk̾¼6ñ tÐY]ý(Ý*¬×÷xö–0ØÕòoàò-?˜{%.<4iðn |lÿP½Lu̲qJ!:)…Å"SýPúÑ|#6ðv ‹å½ûè/³JoU ¢ÞÆ´UI@'„çe*C§øygÖCž¥5gžOÀ|I¹Ã:瀻;cÔã|fµÔ—ˆ—Ei”îÔÏ<ûsÐCI¯í·CçÛ9¿½~|îY%pNŸÁ6ÂÉWy`ÿô.Žª„1¿zñÉ6vämÈ•¨M_€§¼ ióà?›[v¾ü¶;XRúA9Vß©æ}–»Êýñr«=ýu†K7TÛóùn~*Au7¾aã"ü‘üi×,òÞÇBF6Ï‚Ôß¾î¡N„îyD OT­î¸ ƒÙ/² Îd®ç1É\̦")õ“Ù{Iý}Í!›|~Ä×òò™¹io¾2@ökª ÞÓÐq?ž¯Aß:µ÷1Ö—?à5‹ùã'§Ök`üX‘«'Ÿ ÿµ;~Ò1¸ò~§-BîãŸ`ꆢ¿`ïC}²çh{Y^¢šJM¢Î%9IXþ¿&_µiG¾zçí<úöNwÍîÇ}qßÝÏAPŸ™%Ãþ´4§º»¨Îß·¥GýðKËü ä[üM‡ä•”QÛÄ 2À탯=¯ì1Ý©Ó׿\ë„ƒÏ Š!£|ܬßZÔáÀQŒï{ëµQ7x#¤wÙÅqS{nÉfŠ¿kç )¼ÂºtÖ>Ø-Jêþ¢ëß¡NF½Ûm ¼|~Û ]MñµZB|Ynú_+ú”<–žyOԇ蜯ý2ÙÈëåßñaˆwêYÆ{lð[ =÷‘=¨£¾´Ÿ1ó¨{‰ët Î;AW¦Y±«€?||&•5ѯæ—4©Éßg¶o;‰| ¹<2Ó <úé²ç?!ãV~zLùaé<±~-ìIî—,eEþ;ÝžHÀ¯¶_×;/€Å-Cö<¯ÙÚþÚ†ïnA…-•“d_ºœûÓ%Íus§¸2»¼;Ðå'†yßÄÂ/¡^]ßÈçXAK¿Ïó¨”J·<€¢³Tc™àgÓëïMÑOædݹÁ¡Šu$Ý‚Žá}·ÄŠü ¾Àÿ\ ~O¦à[$÷¦%^óOŽ-„ÀïÆ Q_‘÷±i¿…ËÖ¯ÎSöx&[2Ü©8 xdN‰jF\âýåèF>"Ÿ ?¼8‹¸ñ2‡ŒûOgKYíwãê­ËÁÿ–oXMÈçÏ>QŽ“ü%åÈø[®˜'®Q ý ì9öøÌ­3¸?>}²§é6òàOÁ߯ˆGBÀŽ_èIƒ¢¼)F¬Ï_üÓ´#Ù÷óHoOÃý’5öèÇ•=cÀ¼þ¸rS×!Þê›ËC'ú \ðð€‰¿œpd¸Ü•øù«?pã%#Y?Qüné=³‡þšC÷!£òo³mn³”§9]ŠÁƒ mÌãˆÝ뜅Yð„¯à£”ñnÔãóÆsu°O˜+%u6úÙÃPï•õk‡Ñǘ¨ýÇÂqÍ.:Ãn°šˆkÀ\Ã|+æu¶Š©¶Àgè³}wawÄàNÊèOÛ¡3$/…=pªÈ~í|³Ñ_úkÏ}æSCýºº6úÏN¹³œàËŸ{÷Ò7@O„ß߇ºåPÈ_ë…yc5ª’¯]€B"¾¤"…ô/Ý`ÿ nVr¿!`ËqÄ[Ñ%òc)ðhÉá7 Ý`³…çiðÆb·Fñ‹¸ÉáSN>ïn3„_¼›ŸDs=A¼“ÝX×®­–oÁÛÖ Íuià=7=Ägà*X¸}ñNü>PXy€svybw;ó˜"¾—JWI—“û#ªÎ;Ãÿi店ÀïÞö_„Éç ‘še ôƒ©=#¯–a¿uηÂ\W|lËë_¿PE½¬¿ã»öJìRßmÝ4 œ9öË™|nóýµ òÄõ§¦qŽ3A¡;¥ÖÊI>‡Ȫ^»>~7_€ß˜gûàȧû™MÁsZ©ëŸ‘û}?õH¿‰ø³ç§‘lV+A¸Ï»F–è–§½?vÀŸNUÖó1ØÐùÝkQ‚n%ä¡Ê èí:;Ey…ÞC‡Ä=KT4‰Cý¸®ªßAîïx¿^Í|OÐÝy8Ρ.ç?H«€Â’<„= ÷'B?Nµ[âÂsäÃ2÷ðä.[aŠâQÁüC ñI©V~Öv :fkàxŽ'Öu‹ö€ÜGóIÓúg^L=2$s}YÀ¸ôöÚ6òyßáqäOœÒñ‰5ÀÕÊÍÔPèþÀ 2/ïýÜökÀeywÝ êX²‡ŒÍ$ô\èŸY¯4ÜáŸf> üû×ä,\ Ï „¬‚§bxÜ‘·&K µ`Ÿcp£ôTàç9ÁÇÐÂÉ5 XÇŠ¸ú[JpÃeQy|†ì3éEÞ(QÃ}æÓÿ-Ão^û÷ß'—˜'VήM‰þÞÒ\ï±:œH>OôH¿Hò^p%¹OàôðîÕ'¨[‰k¥¦‘¦Ï/½i$Ÿ£5Ÿâ-€]îÝ|<é˜'\PèIš1ñx²ãGiåüCÞlìÞ1?Ø?š‹¸ÜTà•µ^¬^ž}«œ&íÞ—i„ûì69JÞî‚wjEþÄff|“‹ƒßíø6²:´3üš;Þ¢¯äÙåŽùÂöýwu#vyJî!êŠÝ gNÄ9´Ø}nÍ8x/¨1µë6Öqˆ¿DO‡¸4ýäªÛô)êÏ¥´¹Á>m“ÿ ÙäØq¯÷ëaèwšóxº#ùœÕ‘m«îÔ‰(yçœFÔÉ(Í+½«q–ò÷xà2z2Ñø n- Ã}FµÖ_I½{ÆžÏx±|wÙ×ñQ’áߌuÇŠ”·lƒ#e¢§4›¨ƒç`§KCa©XÏï–òGÞ«žïŸN£*éŽB?„úýÎjBœšZÝœÁ+~F{Ûao[z#ðãòÃÄŠ}u(ç}ÍðY`ˆ[ú'ñF[ÌK3ïöùiޏ¸?¸Ü• žQ¯‰k}8G¿;+sx>ú“ì7èy.ëAo9%Œ›—¢>G<ûï¼ ôrì¶Ö‘Á›]rɾ¥^l‚<Ýæ•€zø[zÜ® yt~Ôúü&È6ÄNö×c^§4 ãäîW;O;lEÈçïy&ã乖ϼCˆg<Ãóc×QÃS|7llpë²^„¿b†»Í ŽEl˜LÛœz;Üe~5w³Ê¯!ûšF.1ä«ûL‡«2ù\=Ð¥Eã†zèŒ.“ñéT›–@¾Ÿ3ŠKϞ䣳 ¯X{":8<$‹zù£‡¾‹ yÚù’ý¾ÿþ#—: cC:«ÇÃY/n¤ÏK%OL]˜^óß g÷ži3Ì¢j^tYl#hZ3ã*Iˆw‚Ö§}¿6ƒß~OWõ…to·žŸbÿÛŸÑ-B½:v}ø·5ÙW/òRŽãþä.õ`iÄ'!È/µ :+N!ÍW ydO—¨´º*8⼋%YçrU¨?Щ³uŠjÂÆ­‚QyÀ‹/×E‹ ø/¢-zÆxð½¹lÓJÖa‚×[‹Ë#ÏuE¨„r€¿M'çѧÚìa«C£šÈ…Ì¡ÿ3ê3ÈÃ:LÚ j„Üò§Ûõið¯)W™òL¢îVÒUðsʱÖq{Üg§Qt…|.×0Òþö9eGWïw&hz;»Ù‹0Ÿ´0O$ôÍ9E[l†Ü\”ëB_àÁSRKž·±·9 þâ+;' \»¾xçŒõØJò‰Ô7ÜÙbã.À~#ƒ„oŒÀ±¹ºŒ±&9ÏÇ•îYØqêúá»ëð©*ï/Ižïp÷5ªUF¼½­ûKÂn_Þo‡Yn'ù®£øîm½õ$y.Aåûêˆ_ý­F|·9RrvÛ~ØÝ~1;WƵ“ŒÓ>gô‡”÷¢6‘ûÅúM^1˜'r3[ðKð¶íaI\ç±¾Ëü¹­óÁ‘@ßèò…úQøŽ:ôÑË ~s²+u¿Ïè\I•Cài"Gs ã…}*N,„> ÛÌ· ùð…C ùüÅÿívÛðŽ“ºê]2o,iD<òÕ†I_u„ôSõóR_Gêð'#Œ>—»ÿ…¢"Òï§ã}å?öëXÊÉýd™Åw,°Ó ‡vð⦲y;+Y/T˜r+J+È󄿦0¯K«`£!xßәޗ|^$Ôü¥S ¿{í.y=EÖõžC£XgØŸmðVô<½Éuð°‡kÌ¿ðßñÇÜ–î°OêŒ8U‰|íûb« âás´žþÌ Aq`ü«„¸ºVì iÄ<™Wüx™ä•cÒÝ]à«rkv,Ã_q.Ú$þt.Ô±“:E,ø•xØþMÛÓm¸>|Ã7ê#Ôg—¸oZ·f‰ž÷Y«§’y¾ñøÎø?ùÓ]©ð”³eÕÀSÄÉ¡ÅOäúסµ ÀGTTp /ôÊÁöäFò|†îõq)ÄßC‹B]Ï/›šçOEÛÏ ñ»å˜‰øéDãý01Ä_ù¿ˆ£½È3ï£!Ìmz¤HR}_§rãs¬ËÔ&àÙ,êo¤¦÷Šêb@ÝMòœ£kº¾Å<ÖCåéÒŠA”›ø™ÌÞ†¬Gà9£c§TkaŸPã.]Qð˜/!õ¸›Ü¾*“üÆ=™z{y±ýƒ(Öã•`ìYŠõÆó üŠØLžŸdÑqßóf´?ÄïÊ}õ¬ä¾˜ãÛþÁ¸ßCëëNQàÔNë€Ú8ìÐ \|CâUÍ÷Ý\çô¨’kñ ¦ñ…1!ïÂ%`ýÚ}±ý`§1›âÈyŒ=õãW‘A³È¸œg¿z¦{ó4çNw8Ê“8–·µõ¿(5º½C®Å·®ül8zêžüæsÁ‰å3pi8¬)}ó* ø®À:õ¶ü½ê^ôü¯~ñ{¿C†ö’:4x[ìŠê)ή÷V®#Ï=„¦_Ä|M%XP¯þsÛéˆøFôOáC] âiùi‚>/ÔÌZ õ%}í)³ZàÍ–îlèd‡ K)/ÔÃäÐW!Óè{%O5ÚTá~å­§5fñigŸ_Ü Þ™ú.Z ý@¥þ®á€=[K ~ÒH=¸¶ër+fp@¿†÷8~éÖY¬Ïç\EÇ5Ä•ÊsTýlêã·D‹ÃÐÛy5'ŽIAgEËJ³ÚÀß_Ö“ýuÊú‹åÙ»Ú)ñÄÍ÷Iì–mˆßg4†$€§ìÃŽoeF^k©3e/à署ß|¡ƒü$YÒ®ç ª› ËQO#Ü6ŸÑ~¢LÞÈnE_žÜøo¼àص^šìçlóBñÝCL[€¸pXˆýz‰Ü§¨¨½Õ€:Ç%nž‡u¿ÿ{LŽÌÓĉ¬ÇÓè£Ì=ÿ' <¾ý>ŸÜŠË|lÝÿœöÝ*b ÝçhÉ~˜~uO“+Aÿ¬FuA]-¤?ýwh4Ž|n>Æú²{ùͲËM|és–ç«'päïdµ{úÐìfùÜǧ5ñ6yNÆ£¯göøØNÿœ–$üú¹Ù5x0¯–0–!×™°ïÞ0üà­45´„u„þcÉ%ñœ4SR£e†ûºdß—vZRwƒÀ+{*Ä_‡ŸB“ Dàb­þŽáïÁ|bµ>“û'Ž‘Ï7|6 XØ‘}úÈMí%ôOÛ\òÇ:üYænK‘úz4RÂ~dW߬´ù§{§dµ—Ô÷rM äþ7ó%3àpŒÁ•†¸;‰*’Ï3mêÁnVÛr§Á'ï o’z.†û'óUBîۥķÐ3´#úOOÒwUßZO{äcÀ=ÇêVÔ¹vS!ä¡ ã÷Q+Ü/ß_’Bî'™IüSþhT×_†Ï2~¡Žú8Ÿûf¿lø•2Є<Û§ü›::x¬ô@&ê¹SˆÒTø3˜¤è(¡‰haò/Æž~þy賃ooÖaÑ'' <Ê9ïÉ«‚]á÷¾þYÅ8>úúúºàq÷ß{ì{0NŠE‡iWY/“ïþO¸ä/vÀß?þ˜¿…_”‰?GÔH~¨¢Ÿ¾‚>ʶGPé>x_‚ÿðNøÝp[Åx^ÄkµaÌãÈò´ |”Ì1rtv'òìd_ô蚘‡ZùåäûLZÓ 'ï”Ü?ä‘Ïç†'ó £NqÝÜIž7f/cïøG¿Œ'ûT%Ç+I}«¢Oh‘ºÎJ|·"¾ëP….]Ǻ]Ö9¬$ë4Ïß#èÃuczsãñ»µë¦Ð6ïbº1žÕÖÞKÈ>?úgº/úï˜î—ŒgÍ0N­¨#qp´ï7; ÿæÞÚœ~tïïä­Æï§ÕoUî^•ö½v_·‡T\%Ï;¼èÃ'õÐøàQ¿å¬Ývà_÷-¢Ô—ä>j¾·Öà)a«U òÖ뺡f*ò=Xí×ã{È+…eÑã2°ÇqÁ Xãš2lì!ßG2>Ò¸HòkX¥PZ!ê%çõ<[Á_¾óÛ­[Ñÿ®½bó vš°>Bö¡Ýý_?´ÓÚŸ`ü¤æÞ…Zúæ†êm ¨çž]9K¾àbÕý}õÉøÌü®þ|ö*êQè£Ã¯ N;ý{;ø‹°Ìà¹u9q;=­³Ê†ßC‚·¶œF|¢^!ãk–˜ú3qˆ«ñ(ܼvIÝ ¿û^U,ÿÝbùôÃEr]ŽZÝq°WkéW·×ôºàJäÑŠºô½MMÛÕiøQoÃØÐðR†]Ñrþ+‚Â÷8s‚··Î;¼¢$ßàÏo†`whÅ=íÔQï‘§GW ÏíE‹ì%ßû¸²ó˜¸ýÛOž«sa¼ç€ß5uZ#È~Œ^%~‹Ó¾¥\ ½ãõ7%Âù§|N’nwoñmOѪ4µ cÔ©´¤`å£$^m¶ðå<„?í-»MÉs%‘|›—ÄG“»ÏŒ@7 ô_ñŧë™;)5ПWT½€#×õM>à…¨§1ÒU‡P¦¨ mYˆ‹¬ª˜®Óóm¤¯A\Ó|ŽBþø0\_}¾3ÒŸò/üVx¥ºûDr’Ü·Übr? ý_$!3ƒü“:N݈¼x–Ü?öuúdìN_ÔMãñxC'ðL¼(ýÒFRøÊ‹î#uXˆ†Y"êGÈç¿GÑŸèþ÷ìK ¹ÿ;\–ËFî3Ô±_‡_bMe/Š OðÒ7˜,D]¨Š¿z õvÏ+—¯§— ¾½sWP=žêÙ‘Ïst©µŽÈï˜ã’Fä¹½@íUŸÿê¯ÄØÇàÃynéO$Ÿ®Ž•f‘çWØDš6bÜÐÑz÷Ò'½Nò¹÷†™ËŠÕ°óRÖzÌïDÛ",…xºÙå±^N­+!%À»Š2þÒ¡sm»^›}Bþ„Ï0ËüŒù8šcϲg ˜7j‰î(¿G³ðdr¡^[½Ie¼ŒëÍó›Îu–;´ÁOô©\ÈßèÍ, # ÀUÝÈêaà+2kÿdü“V"‘òz9å©K˜~7t¦zû¨,ÖI½—ižøzG{Ü‚¿âf[“Ág®îï!÷©ã]…¹4¾‚/F×çWnÛ+>Uïªn¤t‘ûåÏjmۺ߾+DìñT‰“™'÷ó^9mß:åÿ´þ©æI–” ã…ÿ"Už¸VBê9O3¤c®¦·ÿƒ. 6£j‡áG—%_ï·K>X¿[—PY$üá÷¥n3pFsS\oÃŒù}Ù*jÁú»VœàOâ„mlˆµúëúÝà›ŒÜ¹'dœ“ä¥NÁï]1:ëÐïkëž\áB>Gi¦šÃÞT¯tç€èíÁœcð›Ñ¢±\.â+é(äç»s“|Îz´D–LF 'Ôu&ɇõ¸.@°úÆ9ðb¢5³äEèäüpº{i£-KÚtS’tÚÖRÕIEðÑÂJù·*Øs€ÛÃ늣[·‹|O¦œë’¿ êSrí~!2ï•CiÀ§¶Aò½'ˆgÚÄ:¹· à·0I=òy¹ßMã#äsÍŽm;8‡é97ï«â»ÁsÅ×JÀmÀûwä O’*þNEA/˜ã¨¡’ûþ1êrÐi¼_v‹ Ïš¼öøðåYõþÕ/àŠUƒ ýA¢šíÛ§Ð}á2¬¥Z°#v—-û)¬#qÔ}ºu?Ž³Ñ§…|¿ÀA'8¸/2šñ 4B­5$³ÌCô,M9~,º‡²Î#NÔ#•¥·áo™«uS¨Çn},PÇ‚Õ>•º nÄD½?-=Œïëø·"ž ²±ˆ‡sc6øÄUé“t5®wžÍ©I&Ï94òñ#¿ýìùüZÐ?ø \^íghqyÀ™‰h÷Ïrø5ÉR#¹¸±2ÛÑÙžó gåvÂï±:Ž™Xü¥øò/ðo8GCÔ ø>øÀà»6Ä1B.’:ÀwFxr¦—Ìß sìÈŸ™û“{ÈóôÃ¥C¨Ó©÷ôÿ¹ÁÎä¢i¯Íø{„é ¿jà7üw—ÉMા<(õ+>©%÷á#èíb©Ëþ÷€Ó8Ž äûyùßäëÀi–-ôbžÈ¯óá¼à‰”Ðû_¢.’Ír¾£~3o9v º±˜?áãþ1Ì¿"â磌~¼AåîGÔgÅÝËc1à á“Õ\ÐK…3¢. ¸î~EZlÉãÂâêzð‡ÒûÙ=è‡#7™Ç?þ’»åªÕ~ Ÿ17>Âü ,ŒùÉ÷—s;É}ù Õ\ÐÍG('\‘wgû ¶=Èw®ýÕoW™‡n\ÍhÆ:EoÀgQfyÛ6¡Þ*ôv«œÅxQÒ¡«¿É÷n÷ħ%¢wòÈë@|rz]âÚÑ_HåÿÌ‚ü1ÕÕ<†¸ç‘6åh.ÛÜ„0þÇj‰yÒ¯þø[ áÍÓv­q*®k ûó¸eLªÇz´E¶Låb}Çÿ“J}BÐZ5-¿k—UÒ–e¸.0oùàE‚rÞÖuâ‘ð¥(óh8H+ØÈ› žõǼ\¼u_òRÝ0æ—qÔ;÷øÍ‰*yû$®‡ßŸ he'; ¦Èóí :÷ÌÉ÷):v(‰EÁ.A §÷+Èß ²€ç"ñV÷ÔyºdÃ{X‡aÿë·Ãà÷œÄÏ ÔÁ,Þ°ËÕáߙݳƒàÛøÛ&ùßwïuµ§7ƒW|#žœéE’»®æ:ynÛ*„“®•Ô§ìgÁ2‚U£OHÜâ‡Ë*û$²ëÌìˆ8•|Åò_Ûè ¼D±]¦ž<†ñ;Ù=À÷¬uG2À)ûë=9×Ô£,c»À狾Ët์æWkÛú ZÝ×éã>èsÊ#Ÿæ«¢Ÿ ½.5ýd:ýßÅN/Ôòæ£nîd=”Z¢aœ$áPwòýø~Ñuˆ—nÝúäM%…ãkª•’ü@Þ~u>.Mo¥öxÿ°±+ô*õ¬3;êYÄžb:òygìõRæuˆãóö5 ¤Î8%Wæ]u¦XÚb‹ì0ÿÈ þH?ËýT|u‡û»u$ìI³Ì“>óJmð‡¾ åܼþòÔª²KE <•¡<Ÿ7ò¸–PÝÜG|¦à ½ߺ†ÿx3F35CtùÞÊÌŇ~äû6[r‚Q·Rµ½ƒÉ÷d¾·§ºa}A^¤ç”°Þ’QüžØÝ³Ë|ë°ÒTš¼Ç¿xI\B]µ£‹ZC¾—Qéeσ¸›°Ü`Q&ÏÑor®Kð:Db½i–µšýà‰¤Ò¶Š?Àah0û1ä õ¸÷¾ò|kYʧ­˜Ï1䑱p ›ªíKî+ïªÍ‡=ÑUEJä~WßÃ1ô±y9†þÐK1Á×ñ=d¢öÃWFòÜiçï¾ð’Qe”på§'—Ú ž±¹^=]loÁ²«8{.מ÷ búúü–¢høIø ¶“_ „¿ô½ù¾Ý$÷A'Vo*"Î9kU"c0~’•ûöI ò‚~Üeäa–â…¶-ä~Ýö¨/z,¼É÷`cŽ\ÙgˆëBþÉ]Ì@>ZO~Ω¹~§ü—•áÙÚü(î}üÀü8ÎvXóg‹‹™6Æ¢n06ž²B_Y“{àH'ø‹á{Éø?¬^…¨Eýˆ˜bï^ÿåˆkå ßÅú­kÁû!Rw|óa—sÃÀmèÑÓÇü<ÛáÇ3ÚóÚîŸ Šç%¦õq°3:f<Òõ.­ý¤˜4'ül.ôxüjÿË8x‘<—±ã©áOô¥q…ÄÃ[àŸáÍ.·‡iïÄO§‚7-åÚ~UÏé¯ñ¼>ƒù´®ñÞ_3µ®üÁ8Ç„%À«Éï¹X£?H^Qø„øz—Ÿw!ã²ÐñãÆÓoÔ:—>Oc¯ã:ÏNîÇ,ü©¿ÄJ1G_ãû‰7þü›¿rÖöe—–‰|I² /“Gñ\’)‰ƒžÎ2sÀ¸ñ^ñͶkQç^tÈ{‡A»¹×¸’ç-%׬>ž&Ð^¢~÷æ þ^ì³eâþðÔBI<ðḺ37y(~KÊ …%),1”ìîáž³Ðæ•Ôèπߌ# ¤>/ZaÚ4œïS Oì]ªTÝ »S9ìÇz2¹ü§bIþ®-çA]‰î[ÜÝ|Q¹ïæÓ#ÿÓþ~ÞÜŠþ'äݧW½ÀGXÀ©¥Ûäû•ÏïNÚ¡þ Ú|Æ›‘Ì_Yû%èE•ĶtðUI€†$ü@ýýç´QA+ŒÔ=’ö’<ÇÞÕø-’Šû”|#ag´—ÞeÔ!ßÐGòRˆkÖùñõ­Û0þÆ+1\ôàÏýã™ð›×gƒÂͤޖ{i5?z·íNGñNÛº\x$LMoBŸ%g²œ+„¼Zÿ:ú0üz¶âÀFñ¯ø}®qOìï+ѹ‰qnßT;#“YI>ÈøÃžt¾õs…òD¸Ú•3~:.»|`Ù ñŒT· ÿ=…2OQ?œkied»!ºî7î3X<¯x~óIsþ>\Ã#¥z—|Òsþ ¹ýP­ž¬“²¢÷Õ`ÜF•ÄYèrõïr‹ȾÞ[eÇaè0{íã×Z‘W)BëGïáºS{“w,"ŸÿlгÁ§éË~ £=Êí wãéß$BÏÆÉ²¬O ‡>9}2C}¦sæ§ÚNÔQŸÈ…ŒðÉ)á…Oä¿{“c§œ ?Ôÿ×¢¿'Ò{ø»Â^3£f‡/?õð'ÉlÔiß…í|äóOÏT¿ qÔ)ë²ÇüX¿öê‘ð%§ÅÝÄÿW¸ñ}Ùyæjj|¹‹|.«°\:Ü›«Ö½‹ëã2Q÷ŒNÙƒ=±nš» OÎû|/xèõŒëA÷Xg´tà>›Š 'ÚÍáyˆdùüµãGó{òùÚ¼Ã#ø7IÐbGî¯-m¾ ¼føOØõ_w¡¾/î÷v–šÞ‹ú¾-ëÖ ðoäS·<0LÐì` üÌ*§9Šï{ŽÕ8‘ûºëùìPßm–êªGÑ_:½å¶wFŸ0’T“„< ãýrý«“¯b‚¸ÊÔßM~M~˜õ]ë%ëÇ%.äez§*WâìñB ”q·køÍ?„Ï#ÒcCÈý4…öõi°3Ž]^¥¸‹n."ûðt-ðK€±²Ì ê¶Oœot•ëç=¿Ž—!´ˆ·Ÿ;eÚËÃгáGöÆ`¼8+t+ÄÁ¯Oê¹æõ~b°!^ ¼îtmý†Üß+9TèsMÕäùC‡«öc,¨#>½Ï¹!ÏÞ:WBžKé•ihGœ¢÷¸µȯõOÊY`üàCu¯WÃ/|–V$N7.¬ B×ÅNøJçNꎲ·Y°?ÁÞ苾Gzï9.ŒùÓmn—½Oúøë¸_¸–Å1:ΈghÝ̽ÝÀõÜ¦Ì XoÂÜFý‹ðsˆ«²AV.ùï´ ‡p`½?<)—À·MFÛ6 ¯ ’eºˆ¸öÞ¿á úøù:B#)Éâ>æꦮÉÀ|1„œiù^æ¦åä$rß½Y1\÷åß“‡þÁÏ IãxTÕ½nþ2â]ð¬ã…L Öñèñª êªnÿ»­°Óν{7Ùïd¸…°ˆ@ߥ+…Ù²“ïkþð!÷‡æy8œ°.7±Š·aÐ9¡Ö½ê{ ä©ïò»ì-ÈçÚ£‚G«çp½øËõ™àÿô²Æ,}à×kMÏ>Ä;=mÛœüCýûÆè.ô¸ï¹&ÜèÃcJöM•A—†¬K-|é\ºÜRB]ÊfœÀ|.êIÉsÎÆt}{±.E=É}O×Q=nGàßùðRÎvà6/Z¢¹uÁlCÞ &ù<`G°|7ôd¤ Çíò¹IÓí›Éó&7CÌ¨È 7GV©äû™R9Tè`»11ï ô¡i+)K8É÷ìãï¯Ë€}uÁ»·ñO_lÆüîÍ‚ ƒ’un _@¾.þªñ …Ú³nY‘<=#µMõBÇ”z“<7ø‹>à$t{æÇßQläþ¢Ö„Ãx *G„_óÛŽ^zÅuÆ=¾«ußñýС2䑻·1_(_«à4t¶C _2ð‘Â²× ” Vq;­ ?8þTÖF=JÚ|~Òê ør|¤: ¿û¹;Ž4a=!,ç¶‘õÕç çÛ×ð¯«ä¡µ’$ß ¤h3!e¾ ¤>=÷ZØ€¬ +aOøíþS3d?Ï"ç;Œºía’YµñAûû.aë°ùùâÚÆÿï›p`O%Ï÷Gà¶øžr¸ÒòoŒäË'ªOýÁƒþÇ `¿÷íž`#Ä]ÿ…•o6üe½Ïáæ Ôç4îÎ"Äéä™OK/±o­u• ±RêÚ¢>¹sßNs¢ï7Ñ(âÄüñ3Çý¿ùUïéT#‹ÙýÈÿµ@šõE‚VμÍïð·÷ÅúhÔ3Šý*³ˆ³]Krü6ôIv‹ça¯­¥Ù?Ro¶i¥'ާ,¯®¥ïI}“i{¾%SùÓÅôÓYc®î÷Ã`gj·O ü,³ßѺ)ÝPéç³èuº¬sÐ/ÁÕñ¡sÐ+§gÙü‡ÉójºÍßšào§·}‚0n@Ï*Í|iíqøñAòœ¾ò®Nà(úI~Á_àÞþ3w9®÷¼Æ«Gþ{N§„Þ³q‘u=ûMêYÏtL~%A¿zèÿ›O…í{¤˜ÇP—{÷ !Ͻ»¤Ù1„âÆh‹#DÏûÅüÕYÜñË·õy®OvA» õ,Ø9,ô6p;"œ|Ó¼2rßšq_™:ë=Š–Ó‡0NðT\Ä곿šãøýäR›Ø[䩆¬T.yŽÌ¸}Ëôsð˜nÅKÆdò<<¯¡^:=t³³«õZø¥lÍ òÌéï‹ °×`¦{ë bJv&÷QcïEX/^rש¦¯"0nðÕÊdVèßôÔà^Æ~ãFuüžÂÅö ‹ì›Ù¬ÈÇr é)yþÍrƒ­Y,xÖ{,ùQ,úèÄ]Ý'[Áƒ¡ÑÒ¹äó°”{ ‡*ÐÏÛif@‡{ÙÎÜÅuž._«ÈúkÈ¥¸Â ¼‡Ìy𺃷T[æý‡È}ìV{9t_ÆvGÓÈçmi/±Ÿ -J+Þäû/¢6ä9 n™¥|ØáÉ•±¾¼”êÖ¸û WÖøzAä¡Ï®@§<ôÃÑLÛw¢ßÈ«©B];xlÚ”üwm¨´‡P÷Bª¹¼D}±rdÏsƒýž]÷Lu—H÷£§óÁÏþK±pkõEO+÷žà°6hBýÐTrc–ÔÙþúÒdŸgQ9\¤<“ùŒ:äRd0ãú~‘yƒ=ü8pá#}©ÿ#?p#ü¼ì>­Â>ç•~ØE}Vñ`{ ê¥hÆýï¨+ +õ2O¡ÿ力Ⱥb§Y[/¿eÚöHêêÃ~»7ëï#O\w@¯¥( í„N´g_ûß ÄÛç§ô»"àWj:¥Ÿñ_ó»Ú• Õy}Z˜ØÜe¥žØ „_Sø}ñ¨¬ y{” Ø|m=bÆOþ{,®tÃû­nÞ*!hMá]OÊ%ZkC½òI¦^J]†úÝ{íåüo´Vò}miÉ­ÅÂSí¶ ø1·Ðàðõ§è³ûÄëŠ+Ñ>?Ò3±:9H]lúÍ×,Âû#ì Ýci¾×k|¿Lê›lµçН9€ë7ÇWN¯Ò·M=ã[s}ˆøx¯ñp0@Hx¼ì-ŒyϹ *'(| QlCÀyEí_Ì6Œ~RCz9ëêåEÛ%Ü'üŸþx5ÖÊÍ5<“ýÛÚP¼ê4}yÒŒç-7Y)òœ÷äœ{o ø¸Ë'œ|ž>=؉~ƒ8êR8ÄôL©z d|ˆ¸<Òl¼‹x{™¶5clý4à›’6´'Fù<½Ü/ø%Zä{›ÜÏV´yždÿõƒ»üÚ w£yæ²wêZ?ø½ îÍÅàÜɲo~"˜ü÷8Ê^ÝßûfÄèKÿŽÒB_/¹/f!êÀ¾-‰bN)@½Ñ:º xPZ“\1Jî¯zÕ¥ÏÒ“çá…;m_®f]i.’·åCnüŸLQßô'Q§?îÈNÂ[®¸ö Ž&ÊnÚ@îåù¦Y%þmØDÿ#Ï”§ š`½\»‚šÀ#‰ÏDØ: [Ò´éj/7žÙk¥¡ÓT’²˜ oŒölžÿ ;r™.(mÑF½ ‹K{мs˜\A>¯Ôî¿‚ºœ1/¢(ºBòÃ[YÔeçæÝ“àMïsýè·§ó{ÿ÷¾ §æÓ¨×Oß5ª¯´ª»½/‘ÿžÐÙqò¹°¬’ÊMÔý¤`‹™àÊÑ;èÊ3¬'`tÏ%.Ä%ï›cÈúø´‘‡ôÑ‘øýßáÀ^èDÿGÓuÇSý†íCQ¡Ò’P*‰Ð¢ŒŒcGfJföÞ{cï=³g©¬„Jã(Ñ A’P¡~¤¤"©Hïõ¼Ÿ÷ýë|Î9ßñ<÷¸îë~ÆýˆÄžÎzU-²$‚WÓZ¾wü.€¼9ëŒáý&Α§bÑk6f²ÞG_kü ôî´N‘!€ÌV oöÞG{žî˜m…Ý8Ž«ƒ’¬9ݨdyñëì½ÀÿPëß"ãàEÖÍW³!?HOJ<û÷?ØUçÈŽÐ_¶Pe_Éaè›ç›·xs@›1ã)ðÕ¬!'uaßògx7mG;Ãæviü‡ëÞrîSEž¥g¾]晇ØüðÖä ìMŸe»xòÉ×wLIÞÚ§m[„özý·3ê%xVÚç1½ ÀîfÄUÑi«}ˆþ¦4+À_,¼ÃÓ!×øŽ«^w—Ьã×K ¾$Õž .Þ[ìhˆó‘7¢Äà_ ~§^®žEg×qˆ ë”ÇS«‰-Å^{ ÿHö¢¬ºHÄ_ñ¨³ÀÏÐ…õ_o”žl°1'óØ&] -oTD¥-x¡Æ³]gUȼ[^ãë›dž)¾ôCÚgì: v öšóýŠá#kðæµ¶ÂÞòœ—ãÔÑ.9KÆ:ĵùÝá—ɺùiROůK{ðúoÁ»êØdÕ‰žœß„ïµÝYCÖKÄÐ7^=¾o00!uvd1¤çMÖÁ§kŒ”ãý²#Oš–Ñ>Ç)ú—oÐkHÞ ‹È½çk*eaŽe7ŸŽá¹>2æÂNÈî9,m~zþèA¾xÿNYÇåú|¨[ìo_d‹öð¹tø( ÿVÝÁÂ×IÝ­ë¸?Nò^í9èÑ«=êÐÄAÇ.ÿñ›°_£¹6gÜOs•ø¶íúEoSÅs¼u†#IýÖ»êɤNUÂMÎè#ÅWØP6vö½ùe ©gÛ# 4EÆ×cwî|î…ø´£ùó72ßÇŸœyç]‰{¿B-HJ¶_©‰çl“k!û¯Ü­mY¯“y>[;MGĤ¦ÏŸ¡ßh/“¥ä ø±åe;þwjuÄø»Èý£üBê †ä$óGè x{DK'ÏNè?Gåj;â!Õþ«‡â[U0›–Ã"^ÑqyàâS5éãSãKÀeÚx‚++äZYxõÂý¯¡Y4ªŒ·YÇW]môY¢˜B­/ÓU´i¢QƒÙÎÖ®?<_&öV’N£—i»pÑè…U}»®»!ž6Ôî¿‘~Ãóøã zIlÌz!äy­)¹×À3tè}ÆdýcIÊæO#ˆka݉G6AÏ{êŒ=‘/Ò¾Y™¯žg©Oë!o+N›þ8 ;4œŠRº9ÇŲm …žù_P–7ä0"²ª}…Zæ÷éðÍ+ƒ‘-Ÿ)Ú.¤nðamRO¡ÈS¬ÏbžB/Ë Yž‘/ò÷ixgFˆeÜ—nèËK›Çù<ø5ÝèÞâL„êÑ„ÐKz›ÕvR76û — ôXà'ÌøqM7A'ÈqwƒøÄÚ“¸S¶]ySf,ò#zä¤KOŒ…^àùãÓqøÁ½uõ¥À•ÏÒR¿®òc×f!OÝiïk®3$o;WÙÌ*ƒþ~‰´žul-çÃ{‹µ™x“ú$‚:z¢„÷kç9‡‘y|Ñ»ÁŽUÀIJÛùô/©Yý½:äœz¥]ÉïM2Q¦ö·xP ߬XGgö§Ðc=bj ÿ*‡ò7Œ4:MHUé)…ZXšÊõÿ§¸µk)À²ørLý[Ðïßš¥?&(ô §ÊØ€íG\ô2É+i‰ÊѰoÚü¿æ~àCÒ9μÊ=ÐÏ…ê!%RfõЃÁ£ÀuÕ-ÚÏñ¾È£<šÖI¢G/Ýa§¦¥d½Šc/ÇÌnð‰ˆkN¡²ˆûi AáÜâð·™×J.à+îÜ×vn½%~¾å³ ¸î¥ÛŸyYªqý•~N¡µtÞ×FÜõ¦UUãý±=ëÔ˜Xü=ï}Ù¹3¬”MÆmþøé…|ÓÏrœxô÷k ¯KÞ¼ž ^…OQ»5ÀÜùKò°«ðc «É8í ÷]|¤ž¯8Ç{}øurM¹ýnäoFô¶Ó¬dRÙjùVàD¼¬{ƒâ\në‡daÄ?w‹5¿à§–wÿÊÅ#~Dmýeˆ÷$¯Ñ\ø@¡{Áû¢Û¨Ÿ=¥÷DŸï?ÝBÆ=„"oˆ‹Â_x4â¯i µ:Ì >¶óéÍ4RÅLü;î ´~ÛÌ‚ø”T¶Ê¸\4Ûž¶K=Yü ¸sôEúï»°7©íã3àûqÊ'l‘8[I¤e‘ý,Fš”Ÿ}ú¬‚?¨¶ &L‘qms×V.ä·U’ÂýÛÁƒ}äxeÈ|§¢"ãÞwi‘¦Žø–û[õUú9§v‰Ù ÎÄ©38‘ø~¶Uë:Ùwý±]Ä”<ô{àXH.ú™]t³8L±œΆ>bZMÈü›÷!í•îˆÃ^‰7¤ÓÁ?cVX¾€œƒû>ß"ü5«åøZàluèªû/OÐ7Æ™à™ÅÌ«ßÊ*eÞ¿‰¢ÑÓŸôj`Æ{…’XȺ¹tý[ÇHýSiuƒqØïi5Rw&7ª©gyiB/ÿàlašló¤/ôcgõ¦J‘ÈóšéŒú;?h.Cê¹s Åïƒõ½ °»hãªá¿à5—^¸NѨ©IÜÏãs)T‘÷ºöâ½IÚ??ÓËTO}¯@œ‰¯R5õÍnŽ~v}ñIëùËgП䠒8Y–1«0§Î >wã°¤äW6\éõP‰Fõ–ºÂÜv~FqW„ßW,TpFBi5®Õåà®=QI\î;–d->{Jè(úé5ôœC€Ìg”½p®E?r­‡?]U~™ðäëšÕwO…ìT7KF<¶-«äÎyÄùª7ƒ—gÙPZçPèî1?bÒãáwÉçð~¿¢³Ãð¯Ô#1¾æàaÎǼ‘Ç&^S~¶ùv¢Ð ÈWøuìƒYF|ßo²Û8±CyU3øYbŸ˜ôàÜ|ÌÐzð"{îuÍð‡KÓ4 ÞÎT:4Á?ŽOTºœ¥ÞZ¢ˆÇ&Þv?D€»ŽŸçRƒweœ2ì¤_ f9”{Ø2,|ɼëÉh„<<ÓÀ1t3ÑÛƒþ§LàգȻ¨ù‚·´ÃãŸþ™ó¸#ŽËs<¹÷úòk½¶…ÔéoÝ}¡ñU!ñ^ÉÒÓi"kЮ_l¾¿ÑŸ¨¯O$‡´ÁŸYÊ<÷$ó˜újê«a?š•Ì'Á[Í>`êïèõ7†}»wˆ‰õ+úéÂhwÆy¶°Šƒ¿!¿¸œY øc`Ù.¾Uੱì«~­€eö±ñ!~'_H=÷–B?~Ðît0Y×.-zíÍn“‰šD>ã¡ {~ø2úœM~íqo@]‘Œ‹uJñjÁi¦ý¡ëÉ<ã®ÌÓ!çž?¹‹KVòÁí²°·S &ú\èwÌ«^ÙàËc>é;ñž³|»›™ˆk™J€'éÛYÞþU…?ÛêÔ#ï,ûrF£ òȪ̼GÍÄs«—ÅÈøž™dÄØ•.Ï ÑP<'âqÇírÄSŸ*ŽßuÀ;ªz§e!xcʸoßÄðªN`y5âPÌîç$¿çö{ц¼%ñOÒ…µ$Ÿ¼ÊÆ » ~wdíqðDí°ûé­À)Ǽày’oïÝö°ÝrN[W ü ü!w§å:ðžÌÉô¹ÇS/ï%yàNä >àT£[¥pàÚÆÈ/¢ulï ^èâB»<¬ ß Ω•‚Ó¤>yB|p4¼wƒ©iiz“4ârÁŸ®x—÷ˆ«šªëÇ€CùÖÖ|_ÀCó Wüûÿª9 êIÎeø·)`øº¾úºÙG¿áÊÅnØCæ…6ë–÷xO•¯ â¸wY/'ì¹H…ÇZrMRçj¶/L¹fÅ\÷sVlTEÿsJM†]ð|]½#mdýiì9&ó‡vŸ£“* ýÊ2Mì:›;3z7‰ç8Ö‡x¨þ*ùüäiR7÷ýÛYà„oŠ`Nâ»qà_7à‰×ÍkË[áoáïW_€¾?32Gñ •ª²—È¿ÓùºÞºS¨’bgºD!§Øj)‰ÜzØwMèîÉ9Þ}©ên3ÅÿY;/Œ®h?omåV'ó,2S‘ÏÁ#Õ’·‘%>b#·õ6Ùbΰ‹Ôu:™µ}5ü[ï}ìŸu4z¶Ì›wúàÝI–â¥È Ó‹.®O‹Ò¶H-;ç\Ÿ³pÆsŠÙxÓ€ó)ºÚ+’·b NO"ÿÊ º°ƒì‡÷z”?V û*ñpL6{8À.>à=ÛøÝ\øûƒü~vú#Žê¥0ù’vzØÎÞòÏOåäbUy»)þïc¡ïºíð_ábZ¹eÈtK‡=qâ|úôæ£øÄéÙ¿µêÑ4Y7qþî&qÄ;//aA+ô;1}Šõì‡?ÏZŽœ“á56Y˃ë,O”¦i½| o<†ÿËëX&‹AžìÛô¥ÿ¢2lº§ÜÞ¸n·B;³îÛ'_X½rTø{"õWê âG­ï_âä‡\£,Ù¯Œ@œš›wÀÞÔ6­…}Ù»4$šá:ûбg‚dÞb5g÷ à^¤À§ìG/Äh¨í(”š» Þßš¼~ú•Á¥ê.²•>e¯¬W8,êÏE5eŠp4ß-Y;ðhûŒ7ç¦À|ÛV«×B;$’q¯ãŸ~ÂÏ<|×îñ¯1ñVèëÄûc³—gÁ3c­v8"u~¦Ï^ì·ásÙâ"óE÷ÇÑ^»üО=gP–„|]äÂ.e‚¿{f‰ÓôáŒõÏI=|j±iy²ÿ”cä;⌵Ÿh¹>Þã±îc/™Gý¿Oª£i©k©ñºGä:úw¢IÊ»v'‘qÛÕxêø¾ïîØ«÷èU2{‘ûäç-¹//<6.“¡¤ò¶1 ¹…Ž6‹•‘ý[ÌT_¯hÝ;~9ç’úk#Õ×/‘ý)[4šÐ-nÅsó°—Ló6ÿŠ«ª€ÐÏw¼?lµòØMè?SfÇ4¿9äѽ¦( íXSªöÌo¬’ž<€ÿóL<)f°‹!±–·ˆCá²MŠˆ+2'­M$ɸ*7w©˜<©/÷¯è3ì=þú¶»Y.ˆûÆ ¥‡÷]¬8£Èºn›*mŠ÷(YÇWÈõ|ÁùÊDñU\o–Àâv ÷»í ‰'uª¹ñ\ ³ñ.=àkضó§èŸ×Æ_õ§ÍVWF÷èªÚ |—v’q³—yÈäiKE÷ð‹¼¨ÿöŸ$^3š†^=›Ä¯†Á®lê'3; ‡Œõ[Ä?(’:ÅlŒÀ^Ë穇Ñß )ÛÂx^¨ËŸœ4Äi‡˜¹2MÈ?Þ¤Å3Sö°çÆ”~xbñÆ`/ìÎÿo;±sŽÕ=¾x®Åö’6 |:°÷qmjôÑðÒ,صU`•õ+Ø‹âK£š.b'Î GŸî†]Yrïõÿ:¸sð$ùSÅ?ð³H7‡#¯À¿·^«q€ßRšúí²}1~Ü–Œs¤ß~ÖKêyÌj\ZIêϨÕ9JÀûË{-µÐßøÎ[?É<²uñ“¯¡h¯Ñ.ù=¿³Á+eè·!Ïeþ+À'MèÖ]7ÈþÑEõ=fÀ'»<_ðét¸Á{žÈöDMq#Ùvc+ü!æ«ï)?èç¾0©O­¸ŠÿÍ.ôg_rÚr ™§»üT¼ý0)›U%ë(U›,üðûöwG—ÕÐOåħúb42>Ö£ôvi©ü7ögik­· vïqÚäËOðY«øì—rhgˆ{¬DYâc mê1Áµmñ›%Ô ‡¢cìŽx¯•ÃÕå§Ð_ØèïƒéÐC`“ŽøŸE”Û…çhˆ€ÎQY2NXÅÁèÿ%6^òÂûƒEjî˜ÀŸ’þ>pz|4ª°« ~î¼dõöåÑœtpâ¤Å†š¬.ð¾ã[J€ËÚTuÏ2Y/Zþ–Ôy¯$Ô@Æ ºC47N^Iß ¿ŠõV'u»ÿµ)¢ÿYŽbž;`_Ê&uà-ö™ß'tÝ$_´¢]Y½U­ˆ#ÞîÙxŽÏ6ý˜è—bê¿è'¨ÿ†à\òܣæŸI].¼GížýèOÈ!ÂlR —~-ÄÉ?‰ûø˜¼ˆ¬›9ôÐzHÈ >|ùy²õÅžC6$ÿÓ¹ðŒ·ÿéÖßHöÃkÙçFêCõ‡/íƒþ£ö¦j?xŒö—sO–=,Ê4¿#ﮉåÄ÷`“¦¥b²©—ç™G‹~ÈP¾ÿ·õtG+“ù¶Š²ïðû§É™è‡ç>÷ËàëIÜ3]d}—åßr ­N¦ŠÃ z4»–Bðc3CT0x²QûŒñðV¤¬$fžà¿ÔÍwjð+wÉ21ô;0<a9ÇlùäkAÈñˆÚð'¿[Ç4Ò‰}p•LñCOæ;®³FÃNC.{™í@œ÷á÷÷uoð½=tøoA ÓHÆýVîeäO!;%YfxÈþ8ÇS[ÐÿÍŸCuaŸAß–¤áO†¿žé³"nzŠâ܇x´\m[½X|Ÿ¸{Ë{­ ?·è¿§Aî§¼˼µÂíZÈ|€Ûb‹º,ôy¸á«8Ù'í=Ñêó ¼Èw£iÈ8ì® G»¾0|TɬÃíõøVð²¼ßškü÷4äîuYæ 9ŸC]î(ôí2¶É-Žðèáå‡É°çÓŸG~¨’ø~hºˆìÓK  /y>…}äÿ‹þ¼»vžÔwpø™¦FÖM··ÉÁ¾ó~l˜è…<#Íê ^{KÏ xÜ,Û ¾fåĢʋçE=o3‹ëDŸ-˜üœ&~}¾Ø³<ÄŠ¸¸[ï¡u>Þ/°°uóÈß«òT9/Ú-Óq©J¿k‹ÜÜÆ{õZ>޼͛çÊuØ«­÷97²þÜsýQ?2î¿ÿVÓ𕈯™› G½iÞõLÐ;µJøë6؉sµý©‹¹Uý/9÷Ì’Ñé žïúõË•cðSŸU³MWÁSÕgì&r׺ƼLbl)/ŸØÏ{›¨9ämÖš~’u«=ãž'½Éz×AKä¼³îƒÊ\xïÄjV;9§«ðÑðÜŽÖâNÖCämŸC~ç-øˆÇšüÿµæ:Yoººnë?ø“w,}—4ü%qï’ÿ+ä×öÚ3ÏÈ~VF-Ï|à»ÆÅ–)Ä/ïÿ¬ŸÙ¿w.v÷^Iöëð—oD¾#^²?œkvbU=ËN\g~•YëüÒdq•Y¿ãÍW/Oö¹•m½c†|2¯R2S‚̈üÂu¦¿êyza§yçTŸß0]Ðé‚]FñLÊ[v/³ ´È:ÛVÓj<ç–ÐÍЗΌýÄC¼ÏjjÏŠEø‘ÍÝõµƒøt’ oÁs~<Ó~†¸ª“CYAöùžù2BÖíï•^¿¶sÑX\DœŠ>à?@æ­Ï·Óa×Q› }ŒË6öŸ² ³ï)¾NêY§Ïÿ|»òóõæªÏ&ë2cvüB\Ô3lWDÜ ›{·<ˆ"ûf¦ïGÄtmìš õ* þ†B\Õ©ù=­FòüSm÷9G‡)Õ®'uõ­/M–¡Ömc1°ÏІg·B?’:`Ç6"?ñx\Çû}ð³ÉùANÿ¶‘svLÓ˜"¡§˜ƒI”à§ÓLOÒ™75u·›¸¹ü°Þ4‹ÿÓóm…¾"K$\v]Gû>½zº>8¨{®aSâ”Zuãî÷¼`Øw’ðî+o+»À^wy^‡þRÏýrd\#ÂR<ñ/ѸüCðK=¦÷þ@®Î¶¦´Ÿ°¯œß¦6|¸ï¡ÍøNNmÏ ÿ ˆ Ë9‡8é¢xût*ôÂÚzÍ < îvÁr;ôª»pƒäß髼;Þ“ÇnBöšxò}$ukuß²>Üù˜Yù‹ýÿÊï: ކ­¹iiAp¯qS Y‡6Àð¸Aûåçºü"eKà×ϰ÷S£c¶bd\e¡6ø xî¿›áË‘µž#¤îÎËø­4‹V>ø“Óè8Ûz|÷(ŸÕD<²eq>8@æÏû^{Us’ý¡_ãÙ ‡Û“È|Ezxn¨/Ùos¶¯Ð<ø¨ËÉ•À ½ãÜ $Ÿ4ü!BìììÊ/Q£èÞ¾\î!Øa„ÜxÁ;´ÓŸmÞƒ‰ÈÑmëÓyèÇRÄoœŠøà›­¤ÉDðªo"EíˆS¶ãé'ãT¿ûßýÄû]>çß‘‡ÜÏòÎ&=Çël}¿öö_¥6™—ÚëkEêξ$ãüTï_ZS“È÷9„Ü òô¾öt‰ø`qfW€1Ú£\ay‹Ô¡;cõþóeè#¾Q§ù3òÚPrˆÉ‹Ú>¿$ûö½G¾£?qk6õÁýNF>[ Ï`H¾{$xírÖÔqv_\¹Òïyª³&Ÿv½‡þÃïÆ>á÷É:!¯Eé3šhOÀŽõ§WÌOÎ0‹CŸY/n "NûÞ<ØÉf ¿mx²q)«#~büˆÖpÀæá:äÁñI±ìKÉÈHç5ô_s…® žãaYæ^ ÞéÍÏ{‰Ô‰lzþžø#¦YÜzR›ܽ öŸ!©T'œùôl~áÝé#Ú§²!?¾ƒ‰Íø¾UGã0ìXÑðÙÐ4™([zõ xkÇþ'Îz:ù´â¼…Ô7ª{£‰xDÛáèÌ Þd2äF“%þb³}?ôªz-}YϨûÆiŠþû‡l&ë'Gl€çz&› t öG>H~²¯Š¬s;38~í âË) ;k]è×Ví– 'îsYì–V ò6N*šß´:6·¼vi›ôé2ÉCm4˜žqÀ^„Ï\%øhV.LxqJÄ™(?ÄåMy\÷ÿŸáÉÍ3xŽç?÷Ô=ÐOTï¿0äÇ–ÆC›ï¯&ç-ÞùŒÏ8f|î&ëDºÿMËè—_m*Yé“.µ™¬›Ÿ‰ˆA?R–9ZלG»Ïû„ÁÞj»uÐßtÇŸýõ°W6.Ö}°¿¬Ï?…O~[ÂÐnßµZ,°²³;–;Áß~ hÕâ»Ïä¿r6ðžÊýŸ<Ÿ]¢Q+ÖÒ$æZiô1¾o—w Y˜}½È9)y)F¡hW6×˦÷ø.š¿í1ÚëÎvùNø–!ÏÙZˆÏ…ì‘ÇX!þFAȯÈß?ý=ø GþÒ¦DØITçƒNà[F„óuÀ7»o:1à¯qcó»Èùå+ðÝê×°"äë9Ðø`®×ØPŸSù ~ø+Lêݰ•’}[+žîÎŒ>­q °ƒ|Câ©þMd~­Ÿ‡Ÿ=vP6¾žžHsøüSh5S€ýÅ3 *†#¶æTKäe—*Tai ·‡®“}S“ëm _Ë#¿Ù ~:S·”[ÜKÓönD3õOi’¼xò§:ð“álØô£@cò÷´#¤þƒäÄ˶½~×Àsíßfÿ#ûå\ãf?u”ÃÉþ÷M)ă¹FVrîa «„úR'(ìè²n•fu²„¬ï?-7…çxªJX{žë]¾²üÏ»ýoåoØ]´¨²5p2VL¬¾ìì­XPæ$â}¢zPW2©·EK‘»w<Âl—Í݈G*…ŒÿÉ ¶ZWÁ]Ÿ~°!ö?¶ËôG.…ÊjÊ öe`Ì,@Öf–[’óì¬.ßò…^Ô[n¨“sÝÝæ%øÈx½ßÝàZÈßLà#/+Ùç3Z°¹£ úå¹Y¿ø'òad‰ð\÷ÃÖ’ð‡“=Éd¥‘ó«ÞFÄC»«ß¥/—5 /¦³â½§ïûOYÁ¿¿Ü<ÔGê¹h<Ú »‰(>¸åìLTBýù_Üo¼ú­Ùï1S.šþqjŒãæKøMС»ÿµöã=‡}»|€?º™Té$oŽ*®D¾ª%—¤´ï=ñëæzAÈßš£ê ñsÖñMv¢ˆÏe¯[ɺPk—ßz¬À½×ëÙeá7þK_J´¡—áß³Éd_—5×W²ÏaÙæÚ*´×qˆ¶šÔ_é»)«{3¿‘#ö’à årÀaô/õ­ne?Ù7òöð“·dÞR6äÌß\¿^ºAö2{ |”º‘#kðªn}|0Ú«3Þ*©KÆÝw”´r’qê‡!Áä\X/q!·,<7.Ñ`’9«\}¦Bê¦%ªd¯NÃ{‚eNÄ2 _!YÏEíA|ÜýÖü~O{ÈòC0~1Éѹ|ÓÓc¿žñ›OÒö×`ÿ)Ì>ûžmç®Øãé†ß_ɲr@/¥ì÷uHžÏÇX˜ùÅëK‰|”ƒœä¹&YÁ_}œ„Éy.ª}îZÇáw£WW´Ü£Ð#ÇÞû Áoj¾²½ &ç ˜ê,ò:‘~­%u\k†ó?ƒ?X« WÕ<ȹ¿Ôdêó(ðÜd³¡XÄw?9V²ßLòîµâíŸÍ4½Ì<$aÞíÐcðÅX† ;è¿aVD äx„ºØáEY»:ðfí¸Ÿc '‹lÿæÀ{ÃïßY¹Å/†®û,´¹qâ Ç_=¾.~ðÉH¢~ç}$È9Ïð…s/à'ùäêç£_}†W7|;iˆ¸žëùç ì/”¹¥o‹$™¯ù¹?82¹ýñnàˆ› —òÔª¬ ɯ&iô”7FÛ.TVí$u¨·K®þ¥º eƒ'vV¬ç†ÜÒW–ÆýJƒG^0LC^66'É>ÌhnŸŠaQàI¯ìÉË?nÈ`¤Q‹ÞNJç“ý®Ý\JEÐ7ßÅüô%r~sûHœ›°ù¸ž›lÁ[ä‰û|›Ç}åaïz)³ÓYxn@òƒÓ¤plœðé'Šä<°µÌhÏ÷Jy´W«€OÃúÉð;ôA y¤ÁÞ{*ø?PÃBê18t×N}¶?‚ç€~¿¸˜7‡y©±¶|’7îÖuÓ#ë:¯DÍ“q¤Ã7Æ’ú´(»!׈É{{húÇÝ‚ ê¿W¥›H»Ì×À¾ìÓ9 ‚H}Óá£YøÃÐD­Þ“³{íû)gä©MMîƒÿqo^Mê(Eš‡„è’sd㵯,@_æ¡ê4øMBÖ{okä‘L!ìAd|(Ä¡~üÇwìÇvà”§û«O¿ÈøËI¥Ÿ‹{p:/¡]d>´Á úlða ëêŠxØ"”Á¿»ê-T?mϦ‘ß#b¨ß›/AÎ=¦“;HÝþóQ"¤þÒ‹'  ÜyFñ(ÝcL†Ô£O ¢ ã:;Ñ2_”<œ±«ø¡zHßO¾NYÂûÏyž‘S‚¼ãl¦:Å"³ÄmÞüÖóxÖA’¿ldÓhyNæM=ž¦Áo}Tžæ\Ï&û€4íÉøB¤Ú‰ÍÎ#°s'²WÁïíç'ç¥òDJ•ŠúÛ©:ï 'iŸ›d\2ð5åÏAün»ÀÈÄGÆÝvñבz‰#µG*ÀÇù–«È¼³Coi;©Oïùáh¿7üØ|¿†bðÆeO¨þ^Äm½“eTu²/&mûËØ£[ƧS¦À=£ªÀk¤n ²Ôýƒ¶ÀË k½)— §tϽ›za׬' §a‘\ß>ýï~ðAwN9\ŸxˆÓ³q/3[]Š~×)â— ûÕ’óÌ·^p•g!î â~™~FÅÞÿ]?èc“ ½ox´]ñ4Xlç9gÁ¾ÕY¬K>ÿûZáÏψ›ËŸxÈ8¹úÞOdÞøAmþgÄÃh§Ÿ]äÜÄœ-Ú:È·ÃÉŸX‹¼Ç~ôVÙg•ðÖðYáYG ¢N@Ž©)a"·HÝ¡Ã?7à=êz: ׈®-OHýöÈú“†mˆ/抾¤>w¦œU•ñ‘ë’Ùì4eí3Ïâß¹µ› Ïð?1G¨xŽ„´f2©_¬É—^¢;JæDöà{•òo ÿT=ÊTð›øu¢§:Ãx#ð›ÕgáçéVÎ’:µ¬M%ó%O4h7‘<ýÃi-2O¤Çw  øxêï&æLà–OØÁ©CèÌv‡{dþ!xÉéø4økÌ¡ yØeáö-ðÝØïË RWÎ)M ùÏÑ)Þ[GðÉÜZ+†|4†±qñ)ò`í™À¾sxN~ÐyÙqwà—Á-²'ƒm[à-àRêwÊГ—Ï®™mEä|Içé×d>¬ÉôºØcø­žË¯&²‹áÆ4ÙãÙÓùÙ-R¯¡Oµx”ì‡g\1„x©ýGøóièIpv3™Nà­waz‹ç\ Z;¼¿è£›†çľ¼-€ç%Øÿ ÛH¡fžÿ:RÓ»”Ñúö•½ð`/ž_Rø¡‘E‚œ™±Ô‡,ßóqÕár~eÙ=y2{±„ öï§æß8D‹~ä´î…Z:ªaKG;£óÙw„‘ýýõv’ó™c¨:³7¸Å;q<"Õ[¯ï¢"9¯^~™¬»‰*º;ùȸ¯05Þ9ÆÈDÛZ!.Ÿ/æÎ$½¾Ûö|Áµ,?™ÔGH[R |ŒÊ:8Ìþa¹ó†)™7Šœ¼XžTÆ*M]vµî©ÞAê~´¨íN>fé-=iDÞ’’Tçry„þÂùu/`GÙ%FQ–và—¬&åÀÒæÄò[ˆg™‚â¾ËpŸô«Ä ȡ伞h@5…^¡%v™9ÌÌUIüòâÃô_ ½îÃÛÖ¤O4êùÑ|ÿIÑèÙßv[k"¹x%úùÞˈO‘™+]¡·|©Ýϼ€ UÇî]>@£º†æ­'uÈb'»BNp¿ê}súñUºBêHf[]·ª‚¦ïÙóN„ƒB/.|úž>|Œ>ÿø#xq†xJäUZ ôÂùLÔí1…íËè—_à&~èÓ3’ðÞ¸·µÿçi+mNsu²½;y6ž PÏþú’ó¸ùP”áÁ´£?Âþ2ÌXª˜Á/oÅÖ‘ó;r6ò £ŸÖ›ÍfSÑ®4žkåd]™~ûKÈ7#;žw£ôY¹W|ò);(±_™B/xþö\YϾã}àGô3)pµÇaRש³ío+úã!7öèð±zSUÇ!ð¥ÔÁ¶¤VØ·¿†âSÙ­ÓߙҨýÂK94zô›¯ žg½As’Ô1:x•_¸“{æMäêy2o°¹pxqPŠJwð¾‚ûfnÃ5c›˜’îËÉê_ç»x±qbñ4ß"Pºò?øÏ‚Ôu z"¶^ ~tzƒ¢0ü‘ÖöFÑÏ9Çþö{…ê4Àn 9°|˜/ñ“µ°kE<2uà­îømJ.±r¼U÷«ø£l!¥êç&~¯ú®‡¸PµñÂlóOøÇ•Ô«ë#>ö[éü‡8âCѨ'óKg/}ˆS#xä’OÎDÊMuvJɼºüd€ðKÄÍT½@»fŠÜÇy¤>—wUèRç(Â÷n!÷Ì‘PWÊxL¡Kæ7´’<ÂüÛÁ3ˆo)Ï>³†zEøåCîb÷ä¹wæÑeÂ~qÃïßöÛœb'çk'øYsèÊ¿%_æ|M^ðŽˆU×\®C2£›ÚÿgkܾCßF¡êëÄ«6A¹>_ W]‚7E$‹‘:5wÎ%ëøÕ·DmÏȪeÝ üËõÍh+C^`”ü´ñ'ìÏßý¬bYo‘LýŒßƒeÿ뇟›I¾¾žÎó7ÖúÈoo?íùq:£[!±ŠÔ1÷t‘.ÿ~q¬¹örî®Û̹ ÄÍÚ!ާ ôŸzƒvo-YŒ¼>‹ò ›íJ,z©@ö÷ý ³“}#/W¹ì‡\Jëº2WQè•îJ…þ4jV´Ë‚ÄÈ•ÝV‰ý*…Z9ïqžFÕ:«pÓò ©ë1Ô^¥Ü8Løõ¹¸¨ÙŸd½?SJüÁ1}zéÂsàøÞ›†ˆ717©•à ‡MŸo[;¿¡Ôëv•FÍMsö L¢PõlhÅowâ9‰²ù þÚðߌè.'Äùä'7)?™oåIðÞ¤ƒÜQÑN×Uñ«ØŒ—Áós7éël PÏk&'³zã÷㻿‘º!*Ý¿¿Às‹vtýòƒ\›%Üõ'iíô»ÂýêRíô+û_7w%„3Üv‹_3_Ó}ñ×­V³ùU!ÒRý(î U¹X™½Iô)“„>ÓÞ yÚæGœô&õww±ØyäÒìÿDðÁÇóDàh ßùRw¨hÝ!V²¿õòϺèwN¼ÏimRtóK);ðÇ’ìúèoIÏúíGoç½3‹ÿˆÓèç¶(=a=Œ¸8ÐHêœûqRÖ þ•ÖfÜ|xéAÓŸZ{Ù¸yyŒÔ-p\oR4½Ø Þ=@Ö5»ùiÿZ®P{´–ŒŸn•[9JæS7¦6“ý3™›nQóð|ÃÙCNRdÆî‹Ö>à]ÚÖ˜Íu±ð£Kc ¤¾˜Ywä²täð!2oAÓTúEðËÆ̓è£ûñe¤ßBJkÐ.£M¯¾dÀÏî}åD»KÍžÍ)ÿ†œ€—gšª»9¯ø¹¹¾BÿÙ¯ß4ã{.»d0?â”uËýÁ<¼/+“­[zn8ðšì+‰î›þGê¦WÐȺ€!uÍñ&Ä›3+ÞÄ@_' œæ9Hž:Û¿!¬'éèXéþ³¯<©œœ¶=O9펋çz|qAS÷äê)’o¬¾´í#ü‚cdÿÈÍïUÇÌeð²¨jÇŸß™]Ïä¥qÝîtäÏ%]Ú!ÇØÍ³¥é䜓­ïÈ|B£âÝOºqmÒÙ¹Ö@gí7Ö£ ÚyóR}K53Wfj‰; ŸÓÁïšWƒÇZ'Ö^oŽ[*°¬ž©F§çÇ_ÓêÆ ®ç©åX‰’|1¢­tvcøéù›ídÞé“¶!à•ç_ž Ój±nû•¯/Éþ9QöÄ«È#¥‡Éyç[ø÷CüÞøîyâTfÜ;·; ¸îxÃÀoèOëËñF²ÿ´øKø*5­ñBTò1'eŽ•¼àO¾b#Ýç8)rs¢Õ»'œæºwf"_0¨øOcy‚ºàŸ r¾·»dïx¢.©÷½îôsdæèeàDÀýß⸟nw‘›ð=>éÿŠVÿ£NœKoŒ=rÒj%x·rà{áÏdÝÈŸG|'Ä)tÕmÑ ¹d<­ÿ+â^´}!·x˜Ç»²OÀäÄ>VÌÃlörÃß>¥ÿ½ŽºµòŠÂ|Ò¼“pŸ³Sô!CÄŸÝeªOÈyH =çS¬c߼ޥ”òIø€÷Æþk¦@^Ô4yö$öTø§Ò~rîA J>£âVàS&…&rîù­ Q?ûo¿/Mzz5Ÿø¼‚Ñþ„_ãÿN€GŸáŒrlÃ{]óÙ«É9ÞÒ ÷Èù¦½Ÿ‹ »j¾«lÐÓi-¦62Zâ®W »vaIj:Kös/]ì(A?<îR9>AžžbUL7Á5lÞ|½ ûµ×['ó#=Ôî!¾ÄÎò-Å‘ý*ƒ5#东=»<¿"þÆ:p‡ÉÁžã¿ÙHæ?l¼ƒ¶ ~)íh‹~ œY~q¾mâS2AÈ+ÿÜ[C¢Qu×ÊÍÿá/ç?AÆEWq½\‹þFŠEÎ]ÂwÛµ[ÖŒ’sVúö+C/ÓRê§]g~)ô“^oð]–ìãz¶3Šäuµ¿³ð<לÐû+T†:³‘ýY>"þd¾9üÔÑÌ=Àƒ’ú tð0åÎcd^?¬£xç-ð¹´ì†šdÿÿÁž&ðÏŒƒ¹ÇV*Q¨å­÷¹.E{`³Û{´+é¤ÒÊSÀ‹´±pQ9yÂ'6V‘})áòÁÙxO1sã1´Ó5ØRXÐÔÍ.ú ?6 \’Ì&ó‡Þqƒ`ß6E}+ÃÈ8õ*†·ˆ?É?cÊàOžýS÷õoÌö ^7ƒ<3޽·½g9Wõ¼DV\W·ªv’"if@xóD3cJ …ªZ÷÷püÔÊñFR§eí¿æ•ä|ê5ñÓÐ'W¹3z>á¯,Gä·-•ë)ð*6¯îß©Èë㜰*â_òÕÙguç\‚Šfɺ§dµ¿É~½g‘Gežª¾Î}[~¸4ÐEòNþÍ6ÑÀ™íªeÈEÒCéf/ä¢l&ÖÆ‚ödœ9z½xò½a#RŸŽþpˆ |Ãæ˜y/ÇÊtb»Ñóþ“pVvœ¸ñêP ü7bå?áÍÄ¿™ÒtÅ Ï êΆ=–™I‰^K£ˆ=ŠI‰„Ø4Æ}Q”•±d=sð¬jÉ+%6糆›,ŸÅÁ.’ÜŸÏÌØ{çßZËÄ‘W&¥|5¸PE¡ëœ¼:Q yKP$ç,:§…GK"¾*+ÄzL–a3‰ˆCö*b¢&°+— ƒð^‘ž7JÏà_6¾Êþ¯áWÞ RG>@?G$çIS1FÆ)´ßóÏ˳ÈÇ\ À^‚´Îyž ëy+¹‡Ÿ‚G¥‰Í~El,NZ•Œ~šdÔG»Ã~wË / ~0_Ò?gÜ*¸1< ™¹¢€÷xy}UN_ ó߈|hgÄÍð}*-d¡]ü#>kv÷µŸ°GhÀñÊC3˜E þ‘ëÁ»8ч¼äHÌ¥ÀtI—±èÑu$m~ìÌ*n»=s Y7ÌJÎï‹Öuâ&ã-elãV{¤BYYv~¿öà}¼ãE†ë Ïåc÷ ПU'˜za?iå×.wC^…Z±¿ëÍ(ôËûw˜ë!O)¢œ2þñ€B-‹Ù^+I£:®±h\Iä\Æ? ;ÓÜ&èNò¶kú’k(ôF›” _¡Ÿì63CæWhŸ—„ð†š­_eõ8Pg¢é|ܽ%Gòp §.§Vú ?Ùíˆx˜þ{ ~ÚÊÞÈ€ßÓ>gV"ïÎÉðî"û¼6ºžä€ý§×öùCNU“ð‹`½½*À¥8ßÇòÇ pýRÉNõõøü¹3£ïæHâ÷FœwdŽ?jyxpªG|PáÛ…üGãz·7©ß>wZj¿§26vÔ‡Á¤›M§aÏ™B™Ñ]¤¾ŠæëÓL°_Ãî f^àÛ1+Ý1uAî/T„ϼ%u瘘öáþð¾ÓoÈ>gµK“ð7/®ë; ‘'8(^ä­'û”™7IJÁBC;^¬„ŸúÏ´s-£!G®½™®™·ý¶gîhÚ †V_Ã[4¾=ƒ\S.)ž†=¥— 4“<4«û“ó8ÉÛM÷“qÅGw¸˜€çw]…<#séýˆ£Q_»vÔøW}ó¤ÿ"G&Éþ‚Èç2b„ÏF­½=~\:·^® ýñ Vʤ‚¯Uœ)¸Q£€öT~Û"}Dg®ö*¢Ð÷_¬&çGêi¶Æ _+ocО槗’}ƒ¶ ýoEv’õQŠðž‚}w&¾!qý°0â‹ü,âÊ‘_q÷H}¬¾£È‹U9Äl¶‡bm|?æ~Y)}TˆøuçÛÛLèËÙà›À/ô÷JÎÀî‡]¤~…èz𾨀»§Oƒ1qœC~èÞnDê»D”¸Ó‚€3ãç'cwV÷Ï ç̈ä|õKÿ~à2ðÄjy}ì/È?2bÚRrIޤ< î¸çmþ?K9.|Í®vxûº„•0ôwI"–àmÁ!ßuÐCTgGÿ]ÜÿÄûX0â–|‚’“üf¹o~Ú»®ixý,>Ÿ¹t枇? ¥ÐÙ Äû«d_rÁïrÝÈúÒØÅ»µÚ°“]EWâa7yÇ×Ý:€l“ÿ1Ô™a–ŠøGê<´|âyA¡Võþ`6…ë8ʯ݅?=9R„üµÂ"ókß,žqùvêlì}×BÛ± àÏñ_[GåE'/gwC­NG’}°gÄ;ïà ·‹„¿ÑÂŠŽž‡}닦‚÷ņüí$õÚâx}s‡Ýð|“îè³ÀÅöß áý²S»ñüÌØUŽ»H]ýüÎ>/è1WÉf…Ï] ÝäLpNp;§øÓžîeØÏ¡Ék‹$ÐÙ½È9\ç•êпsΩW.Âþ¼?gMGú4šõÁ3Ä«‘7¶ß”d*ÏYyjÖ—øûZAãÆˆ[A=‡`¶ |uÕЃN¦æ à’ãæŠÿH]œŒ¼£3edŸ‰ðÉIà´ÅâLóoømèJ‘–Qâ—åsù€sáüRÀ­Ü4³ ¾¤¾äÉžú(È%tÒÎðÉoWz˜’ñ'?¿¶EØW}·T#Ù÷Y9y@§~`P|Ö`¼`aZÿ ©©±?²<"êËàT:©+òÕ")ýw7þñ%»g®ñ)â-ÉwYÄÅ –‡KÅäüÏÙõÖ¥°gϸ£çU­5M,•'çÄ—\_Hô{®zþ蟭Y±yÑŰmÅzݵÛåÀ)ømFE¢°;äí9Ü×µMvn¬?œ¸D£FolÖ×é#u>Ælºù±NN"FŸÝ·Ê2a‡x¹p¿ùô8~ú’ ;ÔVðf.¥ùþ“ ”ƒ6}=uç®s±|7wšœ·RmiþrLH?¦…ü@[¿1ˆœS–¥Ãô¼"O¸·Éñ;9·ÉØ¥¸S pÊ  ùiYJ¿û=<'|J{l›2ú¥å—Åx^ÖžCù?H¥¿?éþþ}Š¿~ReÛ±v—±ôqU´Eî»uùªûd|ñQërþZ@GÞ2™×wçx%®‚¼4ú†ÐU½Ðƒ^se$ž+S”Ùô|Ïû¡ÉME².%Cñ°ì÷œÈ£Ûh§}¢À.×x²nÈ‹W~ßCõÎA;ì„Ú³qgÕÏ#N5Kÿå$çîöÕñìŸmJŽÚÿ·2áì"ëx”‚µ'ÀG‚ ÞÅk¢¿ºJŒëÈ< «ÐŠt²ÿ>o™ë.ð+Vbõµlĉ¬Øð‘iØ_gŒï*ØY–øöÂàWnΣajˆ›yWÕ˜*·Ã¯döú‘y#?=§žMлLÓ”V7Yg`rjáu2‰›û¾ú ý‰Yìz¡×‚͆9Ø£–;e©×vhOfòr/‰9Ýè-åôFïI| öO0AÜpd]{ìx¢cáUeÄ­ u“šx^ÈW¿Ž l =µÓäèÃ[ gœ³ý—iÄýN§Ñ«èÇY¼¬iôˆÝ‚»nG²TçêË\ñ\¾OQO!÷¼kуÉÈcüÏ<ýÏöQþ®Oªx™F/íŽ&ç§ mðmFûÓ¹euíiTš—‘#+ð"g5ßbð¸v£çÎàZpFBe;p4ãÂdÅxZäÛ$1 äSÍw€ežµ˜øpÆìÛ6ܤNƧ³H  ±w¨¸ÏûYðF²/ ÉF·õ_7ìYD^“×B­K¿8T|ˆÔm¦fo„òñKoE¼ë*BU£ŒžøH>‡þ›?»¯|%òËíµû¿">ïˆ9¹|³Ð™QšÔ—ºeýO~ì!úPíÍø¢öM¼£Þ¸"ø0ò‰7þ’óÆ2šÔ$Kp_Å 5Ö|쳜å"©w_xãc)©w|êAÆ’ªJr¸!üï\ש¥—ÐwºÝÞÅ/ 5p¿´Cò¹¸šaõçˆS›îÛFæ“•ÒJ`×eœw–çѾ½ù¤.išè©W™hßžÜË'ö/|ZþÞ ûʾ[¢ßHê9ä>'õË×>uÖ†s…~À¯ Ú¤Þñ÷“uËô*ðGzŽ®ìh€òѲÎR'¡P-ȆñJyïÀõ{Àóè˜Ô‡ÎÐsÐJÁ•ÜÍÀU·5!¾ä|ÞŠ‡ú›(t{Σ¹AÀ{¹WÓóv¸>äÌ?U;äWk'Tn¾÷/õå["~”»Æÿµ‚þœ<ȹ÷ÉGgÉ9î-ÐcІCQ‡ËHý©Üídœ¦fq-ÙW¦eÊá ž‘ËÄYÐo~ í¼è}ï)H¾8‚öÄ,Múè ¤´[8mçâa{ÉùýÆöìËêãÓAêô—ÒÕäÉ~pÏ»Uâˆã§ ‡^p!OHJÖnàØ¦\? ¿ß70¥ƒ¸õæ°þ*ø¯ëÏýNûÈøRÃ^A'Ý÷Ñìþ7àmz“ϳנ?a*7YÉø¹Ý/%fIà˜ÿŽu²¿ÚFâÁa=à`ó:—íÛ(Ô­ _š5¡§¸´ü,9ð•„„°çløîy×ñæĵpšÔ¯ýà­ÎS?»É¸gþõ]ÓžàùÇ%RÑŸ[ {Ú0xÔÄîçïpÿ¹¥€–‹¤þåWˆ ùí% ðcæÞËÖ‚¸>ü¸u»+®›éá çÏ8êV}¾ˆ4ò "u¸ÝAþïØêÿùmbïo‡e ÕV¾†ñxH¼’hËä1´·m:öxJ@äÚœoÐGÊ¿ªôˆ»aÉÇýúÀ;<6ñßþ°ûÇA6àæcNíà·c/îìÆõÖRvÉzÐJfá¡r6ðâñÑ–Ó°{õœñÿàßôÌž™M!ˆ7q]×„Ú ÿ¸ŽÞ—ÀÉ8ý¹yAÈ?jÆþü;Ø«á}æà˜Sù#TÜwdÛßâdØuì”ÍýàuzR’hWÆ>}Ã’?ªÜJɲÂãÕç†[`'RË —“ÑoÁ[Ò1°ójåÌ"2ŽžX3<ôv¸³®ýì8p(g¿ç^ØÓíÐ¥§Àÿ3‘~´3øôyaÑCêl8ɱ†~Îî¢;žM'ãÁlÊä\çF½Òþ„àKÙ‘¡ú½°ë,5fíÇ4zÛóøGà¾÷†Æ€yGUæ¶ŒÀ>|Ëÿ~€¸«è žèx~Þš û.Üø¦yKÔ¥/f_âñ]ï£(äm(wï™Iû}ÌÇ/<¶fè3Y_ï£Ñ‘lÙLÎ ¸~Õäü¤£q ¸˜ýÊêbo(äfû‹ì‹ô8ÐÓƒû³ÅŸ¶ÎŸ‚^G,gÈú²”ý¼—Ið¦Ùoàež·jæ‚W¤wnû÷ ö™8¬Á56‹þÊi‹œÂïy»n?Þýy튃½Ù/Ý~bÿOËóz§{ŸBõ)ä¯9 yDžš»¿*gÙWy÷/…~ölq+ÉNÓ(ÀËxW©zfÐÛøF’Ä_3¯ö.6|†0>‡çòËŠ ë4]»ßØ»ázÀS{u«Ð_Þ˜cȳ²•4ÛÛÈútνðSç×ýzËÀÕÓ±ù›Hëüý¥'Ž=€¾–û¶ ï‹#õÔ"Ÿlü¼÷ìácYp×Ã0©þ ÙZ¯ÎмÙñðVß›ð»ìÆJY2¾Á·Úý ìà˰Zø­Ç‡wJ‡HÝïDÛQø#õJ·'ì3ïœs£²;òÿöÖ»¬O¤hçƒhWzß¼òÅ~€ÆÜëټ܎8³°Û•œØ(:½rß5§–MøÚæè“†=$VhÙf ;Ð_ë+@ü0fIˆ:m »Xàæ&u>ÃW3wj_g6¬þ„~)§‚u©Ì\€œ|ŽäuB}Î ¢Àå7žÞxHìߟëïð­k×ð†!®Y¹ÞqÒíéÝ]2þ³bè ìC×ÉùúO<ߣØË³›œŸÃ¼UḠðlŒ¯Kþ¯šYð!×{\(¼ûöV<|üûúGͳGܼ"Ìô8è<µLrlG%ü펬ìÉ%R·dSÉF'2ÞÔ1&RÕü8¼•¬ÿ»¡ñmý³a~R =†½¶"õw,—#åû€ÛIƒ3¯Ê]Ð/å1 <‡6pm¥2p2xÝÐm´#sOÜKv1Øù 1aà]zXÅï<) Ý`ݽrâ×î3¿Öj•‘º°áWüw:ÉoìA¾žu³Y'Ý—}0Ÿ¬'·¢4G Î+ou]9[ÜyÀðÿ|¹kÃCÖA]yu±<©@¸y@†¬Cñ<è5BÎ#østöì#Cœõvð;X´>ì/ä•[§ñ~z áÝó…ìÉÜês¥¼+”ÃU·’Ôðúm9GY½ô»‚ïÞíR2fh—_³€2øJž’9ÿ#V<ÏÔI—ü«LeÜìHêÿ¢§¸ýO»yzçÙ2RG/âm0ò渋½‡«Éx}ZC˺LØíº‘ŸA$ÏßTy&‘œ÷¼¶“Óz?á©:ü)²YçèRºRí‹ýðsiwrÑg¶“‰è¯9Ë ±7O+ -²ŽüÈ-YøÁÙü!«é5Œåd9¯oƒ–À‘Ê MÓ¤èAgÖv|1vN.Mvè{¡åÄÒ…î¸vñ=#ð ‡ræ"§0…-µ#·|;G¬}ðÄ›#©«ŸŒ?Y ]€§IïÊ%û ù÷UõÀn¿RµaÇÛ;W}Ä{i+ü¯ÂÂR6?¿ðtÑßWœË*;g:<¶-7þ¦›yñìÄ¢¤e…üTkga7Y·í}þ×{-ä‘éÑó[ödYG#~‡ž¾Á9ÛVætŸG¿Œ?VÏ÷셞ɓº®šlJ³¸ßáͳÚU†ºyòå­dŸ¬;Ëœç0âLôDeÑ ]œ¦KíÂõÞždŸ¸Þª ¿ W¯uÍ?§x ¯Ž¾ËÁ[#žZ‡DzQè:ªû¶²’ùÙàêÃd|T¥¨ö4™çÓyW÷Ï1:æsšÔÓ7d®ÿFê„ó¥¹ÿQßWãûÆ’UI”HQ*EJ¤Ô©¤M{ï½÷Þ§½÷Þ{飈¢² %£ˆ £HɪüÞ÷÷õû½~þ9/ó<÷}_ã}½¯ç¹ïë²Fþã|~3£Æ÷y¬yøIä½Å>S¬?å›ú‘È·Y[ÛøOwRè ˵eeä9÷NÞ£Þà´ÄåÚLø[œþòº5ðÛÔ„K™ׂ(‡“ó4f댫à1ï^Ú‰‡Ý¿ÿâÕCêÚÎ…_KÙ•$RɹÅsœ+n‚ž°¹©;4ØÕ«¹ö¬Ï çÇž­|q!¡”õäušÿö¿Ì׬¹jé-9¯²[a•Ôk©5Kúž–å{áõ2Ƶ2aé>©·6ÍëÀ"#+2ù ßP§{ÙA~$OUì×~@ê$¶m€¿Ù”ÿÕvÇ}õú æ{¡/ï»òõ7“}Y²Ò‡-À,œ«¼\ñ2‹?æçj®ðÜ—¼×hÛ×Ä)9f”®X‚¾3¶®|Žë­_Ìè s_ÕºÖzµ|kQ ~ª5:c%Šñô½R-1?§@¡ê‡°ë¨ÐáéÏÀ éëí«!ç€÷Ç’tÉùÉýÚ_•`ç4Ç»äý[NŠš*îŸvçÒ4øezÕ|?ÙGxý”ƒ.ìù¨ãǹTèÛ†½a†ôÛNÖPûž~æ3Ug÷<< b{ªüj‘ïp*F}ßÏç›Hÿ>·¿à©Òô+H×ô65¦?¤¾V¨×L$╈’ó{r®Ä£twÌ©«ùñá³h U<{\oJŽôËœÝãA¡×WK‡öÓèÖi{øç¡°™ç‰LàUÞ_.×ú-þÿç//‡ù“|;G2¬ëtÚ7ûí3ìURqA¡ù¿CDË^ü>’"e³ëŽÚÊ2°óñ¡Ýö–ÞÄÖèÆ·®¯j˜ÛCžë½Õ &u¼ää]„_Føµì'û€‚FL¢ÌÈóß½e¤_MˆÝír.>oÈü ©1± z è1Ÿâ¿K“ŒgÂø!WîìQ.·Ki놞w—n°Ú¹† Ôfs κVÍ!}P+)­Œ°8[’/ç=Q‡\W–†X:A/!Á#K¤NÇ>ß̤¾_‡™•,Ö0*íøƒì¯Ìþíæ ¿ ¼x÷¿jÌ/ðîæ½¤ÿ£Ò¿¬³¤~¤‘p³úÿ‚È>S#w?`&ÿM’sº:«¯íÊ%öxïø<ðU/úy7ìù÷ûå@üß‹YY_ܤ ¼6òðï‚~´óJ7¹Cßö.\²×ðw}‡„­Y˜ŸÉ没«ßð}𽽯 ´û³Ÿýû÷||Ä‚ü#ùf±Õäúsf–¢˜_’Ûη‚˜ÂÆñà+Àw‹Ó|à“¡æ¨0éÏÚì:myÆ/§­ý‰y‰?ë?v§ê]u&õRtÒ\¾Yá>¾ƒ¿U¦È¾ñKìàë>ÿ,Ç€1RÇvsçš5qýðs•£\dŸG↠‡N~§ÐeömÒ> =G{îä žðäoÎúɈ´=Åz¢[lšW±w·æ)°“õ–rlŒÂúƒƒ(ÅàQÆšŸ$“øRÔv]öf±OTxô?é‰Õ“Æk(tÓìy¡)ÄáCÉÞûIß⸓[7#Ûº<~ÜrU=ÂEιN<7z‰R#u§mvKÛ sïÛLDYÀsü|÷çµwب_¡7€‡<}3ªIúu7¶~ìÂü¼ÿ¶×ó`q‰!çxb?7«'¹È{dŒÆLÒ_ú}ò¹à†;b€£¹KJÝûÉ{ *çO³;¤oøü$öêßT\º‡Ôµy`ä~‹ìg“Vùû ãÚ½s÷¯&8ËVÈü÷Í+ß1ü~(|Pzß,üÏÃS•ßóO¿Û´òÑž(ƒ~|œjÉþðÄá}lÀ‹y-Ïaîk3¿=’¿õ¯Üµq6ñ‰Óë^øSŸƒ‰*âÂÁº§Ã¸oLºú+ð›Ï;n€OkÍT»@ÎŽ¹»÷¾„\­ v—lO½<ÄAöçš³fA>Æsß”ôkôâ_<Ÿ|uNk8ÿ×%N¸½sp¡&Þ½‡¸ï7ºù(ø»—àëû]ˆ‡Q#î# ä<ǽ—<‘‡ø,Ùºbª "ýi“Ògo>A¼ÓªÉ Õ€œeLzv…ý¨‘O.jC>3ЧHä5°úÏ \ç>¶þ.x“cÚ[Á-À1w¡†[uDÏå _Ô¿3ò|¯€ÿ…dãþž·Nýƒ¢xW„"ïmØ‹¹fôkKÈQûh–^ ìJ¥ ×OŸìSËÓ0&ï£~'Kõa^iKwrb^^ï­8 =(ÿ>¯°¿KãO®/^yúó‹+8p²1#ö£ºâŠÚ=ÌÛ[d ºOyçÏ«¤Ÿ¦Ù®WçØ oçœGv{áÏÎþywNÀ¿B~ü#ëy/úbe-æ»9$yü…ªùö&#~àJÂïî/ã$Xû…Bꄾ,LÁüÜ–þ³¶Äz=®æ™üš~ª C>ÌÃóŽÃš_>úÕCxõ3¿ø—³ùÞc+0ýÒcž˜_˜å S9Ü'ÙK}6ñ+Œkçƒ;$î:ªwÁ¸“–{Óp}ØìP‰L-9G›«v‹ôÝÊd¾sórºÖüß]ø‡L² éCíÔ#y)vàng©¹RŽœ¿9aóeö ¬™Ãü‘£o½0^IÞz>&çiµdÉ9(ËUßhb^FÊü»“Ôà5¹Ç†I]è“÷3(ø=Õÿî‹nrŽ8$Žþã’Õ÷¢öê"º7ãüßOz4Íäì;tñzû!Ä7wÛª¸•˜§õ£ÉÕíÀ[éO¾´=äýÞµ=t䥕báÿáþi¢ÌG/C_§ìÄra'>ômH‘?Q„ϲg­ Ô=©j sz ¦˜¿Ñ•²G¤Ÿ«Õ‰RXGÖæp¾½_Ÿü[ú×a=†ù㽌¸OHx—E)y/=æÛ€ø`yGÝp2“ì=ð%ü=ý̆#‚{)ÔÃÞGvcæA1Ëšà/iÞO¿a^q“ý“¡XGÁ™À@mÄsãck·Làþ&·ÄÕðûô).oKÄ×°›¦›o’s _¾5U“z8mêݤ¾›·IZ±k.aWàZd‡n5pV`+‡Q¾w iêRCü Ú²]j|ÂèΪâ»$Žxì_4AÜ´ßíaMž/$r…—Â_}öLˆÞr«'çÒR¿Oô_ù_þÅ{ãS¹7¾ðî&ùÒËRï)ãú™õÿy`~×ÜÉùZW·_s#À%™JÁ-pé?¤®ƒWÊßÎ~ä•þJïÆœ°N·'=o¡c«Š…?„Wî{m&IÎ[Nd±Ãínî_ »w¬0¬ ûò†§JzÁƒãDÎ ¬ïUëäÌín[µgS€¾bm¢Sσ§F)­r‚_ÇêñNA^å'ì_yfWÅsyÜo’rKêî{Axü&ëa?YmÕCÛ¼áÏÏÇÚLÿg®Š I‘¦På.(¬å€¨{ýë%ýýþ®|Œ8Óz÷r0äv0‰Z¿Œ·à±XËDúaŸ¹yÓŠ8ó¤½Hæ»XvÝìÕ/ϯ³xû}ÃM ÕTi²°ö}Èû««&ì=Êë£ô%¬S§ã§a+y~#(ÌÖFòšŸ,d_“–æ˜r>ýz¨U¶ðç¤æÚÛûâí{Å= Oƒ~³§ øÔSîŠÃ}£æ×õ/°b=o$Ã-à¡3‡Å é»dŸ~T]»‘ øE’mœ×è …ê¹ºÕ÷¬é[ôàÓYÈ3ÏöGAëf =ÿ £’Å îSOm]ˆñ9ò,–Áߘ7êwÕa~1»Ž…ÞOÏñjã"û1Ò†m_²#ω±»'ÿxuUrA’ðã%ÃŪnÞHa ìÂY®¢úüAGëÀ”ô–&Rò—ûóºh7écm`< ~#MÛ6ˆùr½Š"8ùõå¹ÍÀ{=Ýß–ÐPî!“µ°וI1$Oˆ}»+vöÊÏÜï¿~ãXâ·UqàpÕÙíЧ͟«K2°/-¯£jæˆ×QÓGã:.ß7­á>\OJ¶ré¢Ð­óֹ݇=†|æñ\"uÜ'üž)'’÷"B RðK[Æ&‹Í„Wnk¹Õ \6ªþò”ì÷Rî܃¼'ÞÊBãòÌÀ°ÖrRbZ3“Ô‡uªNN&üY¯¯9ùR8÷QFQè-ùÚ~†[£ø\Çýa-yÿÐèÿ—Ô?ò©j]ü>µwy4Ñ„B¯:®«¬°H£—¹äÆênTŽ#©96Öˆyçq¿ü¶æ"øÝî­ö‰ÈÏLìK.¡Q¨ÿ9¯—>#­£«Q¨5Üôê©!5$¾k0Ÿì?騮 ®§P²&O+H÷×ÎC~¡1c5ˆuÔ|qÅbĉ°–’{à‰M›îßL[ Q󃌈½þû„ÀoʘϘüh@~;'Ëÿ¨kj•ìYO£»nø¸crO½ª[ ;?Ýúrà1…Ô¯ão³…½V^¿Œ8­bFž{\ t‡Ÿy9swç‚O¹? ;e;üÙßÍô[…Z|ã»/æÇ!økø³ab¯0øVfQØñߤ®_÷ï¤^oÄü¬ŽäuËô yÿõæJ 9¯âç"õ-öóírjpþ‘.ýZ ø…íT>ømjß3ÙvjUÕÕç?ðIg]Eö+f•+pl€¤¬~Œõ…x–~8iEί-gÖ“~ÌK›„h˜ˆð?|ï÷z‹_4ø€)sð ÆË,>Hc.Áï.¤hÑ”0NnçÁvÄËÓyA°ŸøF*Ò?niŽõ;…~‚¹„æ»I–ôÔéB¸Ò4O3­»Ò ;ô1Ë40o ¡[òM‘ü¬eË/:ìK'Ê{g ðÕBCj’ôw V‘Že„™½ö»a |Rjyât÷ û:v¾ëó ¦P?4Îݨ܄¿ÓV&>D~¿t¿’ì?ý}ÒÅŒìçW~Ö<,Snr…,p5¨æåðùaëÀs“ù%ÏG~YË™œC¾ÖTñßî矪y:Uîx= =Y\¸iÿ`7ÿE¡îé]u‡ødbA%©Woz¸$šÔsŒ¹xãªplx\‹B·7>×ãMÞ›Ò68Ÿ‹ÀçË›ù+Á[‚úl»Í€ë§ôD^þ¯ŽÆÙ¹±|*7Ú…›“|ZàXícR§Poå ŠìÏÿ®”Z¯â쿳!îêWT=ÜNêømŽLƒ]…Ÿ¶áî‡=Ŭ}Ñr~©C¿™@îGÛUð‡Ômó¼òx}Êa¢„ôMôè½S {NUÛùƒ¼ïŒµaêëòÁõÛÛrI½&éɃä|•¥üÖä–yÉ\ð2ä¥{ùkk:Ù÷¸i*…ô¹dfNê‰]Ùì€ï] Žþf9—"×ÕMö× JýýF¹eÍv°£¦—«/¬D\þsÙ[•¼¯l;½@êþëêL¾]uçÝ}QïäöVÄïÌ«xay¢g‹˜gVùG\X Ï´4Kîµà·õ]Â}FZnÁ½ª\qƒƒÏ|Ά?cñçú_ÝᡚkˆßÙ¯N+ï&xßls8–‘Ñðª q,ªskÐ¥5ˆŸ›Žˆ§}ˤïzÂOuˆî6ÄúõÊôWÌgh·ßÑ!—˜5Ñ…fX¿QÔ™Mê°WmîÔý¼Ì¤ÞLk®;ü8Ùéöº?kèUþ crÞtãêw¾bà‰ooýµNÀúì~ë,^@|¾¹zôüZ¸“ ~àÑ[¹óÖ`ñažƒÞË™¡7?-gOàqZ½‹‚<›&¡Iêhcà§ÁÕz®7a¶á¿%7bÞ®Ÿ…—À¯'7\6‡ý'Ås^\:Ôm™$GžÛ°ð=‚Åm-XGo ªŽ"ï÷,.÷â‡=¹­-̓žý®ë&d’çsÙËz¸.%^˜yÌ€BÕýfFú¯û¼s9;+Ž_?õyV€ÈßÄGƒ^«í7 ¯\Y‘ç£È»bx3 ®"î{¹`­Áß «.¥½½›‹®îC^a(>tÖDŽô•呯‚Ÿ%͹mºbþéŸÜdÕ½ÒñÂnqví‡~ïо ü§Q_êڜÿxbr`ȸ z¼bUa 9ÄîwPàŸ'õì©a¥ÐM s5ýsîÆ¼¯H¾²¹±éü ˆeŠo÷±þÂ6Ñ{K´hý²ñ&ìm@ù×üΦµÖÿÚ’Gv­¸Ÿ¸µ6I…Á†ôá`ð û<ãÚ«S¡§ÁýÏ$H=Éò káwy÷¨š­zöÇò“ %àƒç“?1Wb?Ÿ»„q •WGÁ÷áîÜ_c!§µûë¼i$.ÞÝSVIΓ×v.ò‹g nÕgk-F‹¬Á£äN-t0À/^L³Î“¾Ió «](ôÈÌkU‘À³3±âóÎ4jØ7ÎYØAZÂò‰ àÔáÙ¼Á%è±ì9ÓEä+Ô šmÛ?Â;$-…¤?±¡+k[l€ÿ—CÛÜàÏZŒŸFÈóp£º&›?˜ïάĂQÈe9Pª‡ÔŸtSõâÖCþºƒró®#ìån˯LøsE%ÇåC­zî®Þë†à§iëî%"žD¸¤çEž£’p§¬ëáH|Fž¦mIÑá_ÐÓVV‘}EÓL‡H}6¾­±d_Eî¢Ì)ØqØ#1/ržéwÕ©>²RZóèt]xýÍŽKá>:ß¶l޽fÞ°,FöË )ó“ó¡ûNêà÷Q/vñ#î&«üƒÞS¹ØÓåHß í÷§À£â•sHš ½+‡þµÛµŸŸ…'OMßæ@ܽ¤>/ {ŒeÛ#¦†OÖzj¤nOïèÜq~Ò?&Ìý%9w6tð¹ä_ôZ+¡mþùOn óIÔ¹¶ ‚¼?¼´5µ¼…xžå!ìÅGcé#ص{Ð¥`UèÅJÓ½ù!ü17õ•0G;Æ™œ¹½@ÎÁ›]êAž‘'Úï úö£8ý>v”ùC^`v-ì²ÏjÃJ|?ϯ±ÑŸ%ëâ\ÀëÜ~m5ÜF£æùÕº/ŽPè•SjðK·ñ»§ÇUHß/Ï#òä=Rûó 쌧‡ãØWÈ£ÞÂù‚)âzlZÀtü«üª˜ì6øMІ ûŠà¿ÑlÏß»CîËãFl}ª9‡­|->ƒã΋MXoÓž³Êp_ùð÷q=¤Ÿhü%=ä{U/‹]’GhTW7¯ÆPøW¥Ä-é„4ª»Ã…«Mo”J…}{Þ³î9äPè±e` ùyº‡,5 |SŸmœá’©Û1ÁE[¦Ñ«ºMó—!¿ÊΉ{hÔ¬ÁXJS$…^Èå鸺ùIl³eÎàânQžwäÜwÛ†ƒ,ï÷Ôz¯Ñ£Ñ+×ùR× ÷}ªÿIÀŽCÔ:1‚µH²(·Ô¿Ç༚FÏöåÜß™C¡žK>M)ÄIæ“K+cý‘SÂý§€—õÛ¤¶yÀ3_×­? ¿ áÓ A^ù²Üÿ†S¨%j,û¼ë G× ‰ÿo|æü…Åaw){ p]âx1ãzØ‘EÂt?ò‰Â_wæÄ¨ð›ä· ðÞÔ•E½§Á6Íê±_s~ÖÈszÀϾ”l‡ÿæo©eÛ†¼Ä$üìè¶R uð¨èÏÁwŸ\aïAË ްŸ–Ýü?'Øîº< ®oû[¤–L¡77ß9³"’B­\©`Òß}Ru: ¯l>Éèµú1SOì6%âInn#Ùyù,â°OsQ>ìQÞªöGxS‘ÿÖUä>öé#94Ò7èÁ©“ä}¤¼²€Ö•Ä(8î‰8–èVø¼ yQÜÁ´ÿ"9§Æ­óŠ[}\tëõ[X5¾WxàA$x\¡þW=ÀWW©­3Â<‡ëS `‰UÓ“?ÁugCíH?Ül™iË>¤ÿ ù5¬[wíªÏÉ{AÃ-»×?y—Ybþ4§ÓǪàçiv¢e^ðãÐ?ò›‘ߤšÎ‡ÕÝÄú^ŸÙç‡uŒÙ]eǼ⿶8žž¦\ñxï?K u¿<‚ø'ùûÕ*iò^ÑWæª6> (ÒeV)ôrùÝÑȧƒ¶2í9ußèßñ òHe·â]hÆý6–I¶ç,yÎÅÁ~=ù•0 9½Í™¿;:jqÂñ6`˜³4¸—p´¯çâZ¸Ðª¹{¤?¶+¯­øÝø™Ù|ø¼ ’XùdNŸoÞËcRŽ–†ÿ$K—è³Åd_ÉË7ç'ÀûK†E𼯠'ŽÊGÃzÙ’Ò/È£èÕÞ?÷‘/Xð3ƒW`ò®¥u/Ý ŸªPšú&n ÍK‚8¹]©Â|Tá±¼« äSáòuîëðó`Ç—jRé§Ú×!ŒgÒS4?ÕÒ[„žâÿ𞃟šô.é¾>jv½ã8F£ÆØô-Ñ€W9û§1^‚||ç>¹H¡³:m?ðzµMìßqx[²Kyk>ÛŽÕÇòŸÏžÿá; `¸+¡ãBû9̉uçšÍÔ)rW“ýOB¯bÉû‰^ÁIØYŒÝe³¯ëYÝH¿Çü“7Á'r%äÜô¹1ÏG ŠWÓIã]â…°ß`AOÅ2à]Uw¢Áñõ4zÅ–ÄÛŽë ü#û7£Ysï>Nø£vo3Ö?þèéwY6ù|q› …Ú¾ó»_Ï_9zë5'别ÝT[/þBØuñÍ‹Oü>oksl Ñ{ú7ô9OUÒÿÛ»µ÷ ­›z^ÀµÇ |â|OÁ']µ@¥•×[r«f½ñq>$v·Z®p—»m]7ü2çÓ6îØKÌ ÞR½çdÿiËV.'Ò70b¼zó²Md¯/ò[7QVŽyÒ®UQB~’ô!a³ã#äã™6¤¿tüã¼Ê& ]jæIûÖ—;"ö*Õ뱊Òbûˆ|ç#¿ «"雚.s<%ûú“çëï`Ü}µy†ˆ?Av ~|ÿ{yk1rÝ÷UŸô Îs8óòM-ô8ؤþ<À÷q«·xC¾üÓäÈ2ð ç–nðÈÇýR ïtKqeNEص5µ¼~ZSHï&ýú"×2\‚ånk$çï·.,7J¼î‰# [m'-Ù¼údJúN¥Ä¬â%ç…í‹®Åy\ºmtŸ‰™ÌcÛîN'îAŠzS,ÚœŒø¡!¶Eþ˜ÍQtò0ä\µmkWÉOÝ1¹R¹ŒÔ];øùðuÄ÷ô¯7ÿ Ïò¡¼Çzk*·*™ì¦QÏ5 ŸÙA£g˜°\$ýõþv ïIŒ(9ÿˆ |júåâOØ¥–Vç­ÝäýŠb3ÙŸ–¡÷üF5éï°iü%ì·¡Üz+ø„³©j3ôì}{oÿUò\ùcUv)ô›m-]Þb`wJqÝ/)/S òõÑyûkû „}Äï]î]4]$û$M;ŸðBþ[Š— É>ºþH²ÿ0ú‚¯Å®w,ü²Lú‰ûŽ´yU#Rïøv¹›Ô­ÌÑWÐ¥Ð]6)á~æO¢Yëà®"I”:à¦1c:…îÏwmí_àMð™ÉV.øS„è!Úò<òý.›Ø]¶Š:§Lòúj®"è³ÄÐà_ï#r~vó²ÏSE›ò½wÈh Ö¡’_k¼ŒùX…šXm#uìÖ3ˆ#¦ôî¼ùùLr²äÄ ðÃÔ#ȾSÙ¼ï}ÐsÒ;g6ð?ww–ùUŠì¢@©£ÉÇîª-ýÅõ‰ôËtvè·ùÕÑ™ð‡-Û̦1?]†{;ÿ?2Œ^ ‚ÏÑã´ÏÉ8bœ”œ=ûòÀ›ÓMD¾¥­Ažæ÷‰…ô OÚ~›ÏØÍ*u*ò!‡.—|©B‚mýü_H?ô¤½gñ; ÃÁ¬ àŸ¡â³óI•ˆƒ16—nA¯Êáéëë ߘØìëˆËoÔ‘çh4^ÎÎV\¯q>ôÂ'ÌûHIGÁià¥~iEÏÌ_¹ÏñY*ìF,c4˜œ{•é$õÓ‚ö@ñ#rä<ø³ÅkðKU¥¹ÉV¤¯Äþ¯­¸.Œý²GáRWöýjc ¯ 0}¿NDBÕëêL0~#M\¾ Nzo|>~ ~Uã¼kþì2Ò U8¾Zˆ™œç¤±ýs!}›»o²ÝNê8ß1\ ÿ í´ZNG¾ýœWï› ìç]™NÉ׃#[Hm»K,\u¿È~Ù/â–Ä^jkz ®†å!¤µ×o¡Íµ°Ÿ×ʆ¹øž~€¼×ªùt—I ø={Å4önüæAš~ϼ|ˆìÿõ ù½Pƒ{ë–HÝF¿“ŸY€KÖuÈ¡’rãJõu¬;µûd-…¼¿|;AúÑûé^dƒ~"Ö}9:jDò·Žh#ä{þ¿Æ‚´È¹¼G›äÿÀ¯f«§)ø>x‰~5y‰[?_“8yÿÓìý¾ÁïþÅóåa “dƒ|TxoŸD¾m¨Uê ¿óî*•:‰ø¨eÙ,zD8-™ªüŒÔ­ë‘uKúJ£Ö*‹¸‘÷‹së?¹€úØ[ó¼"ýy/Toû¨t|ŠùœÝò© ~kaFöノ»Dößí7Yò ûMZús¤€ƒå7V4=A\ÎR €ž¸sX€ÓŽ®MkÀw ÚŽ»Ó¿²w ú·ÀO‡ÆF·ý¾žY9î‡ßET¼ñ "çÊ ^šò@´ß¤ª÷ÝDÄÆwAžA÷F74Àn¶ÚrÀ³N|tOƒåÍÖ”<:H¡ëÄέdÂü"\[„k€ßtï8È ùÈÖøyà>Ve2ø^îÙp/ü߬Ýv{€ô‰¹Áz óÐ}¢Á¹z_Òå˜IÞüaÞ» óP|gGNê6%Ô€/iG×;Àn · ™¬@‹‰t^ÛŽüÕ?ä`´òBm-²Ï1êYÝ[7rÞâo6ôIµ]Ìøó~”»‚^o\-y­ÃŠøXµ©5î1;žð•Ëc£â¥D «(xJê=6Uð#ë¸RGÈ‘3¥ZzL È&ûïò÷Sí%Èy®c~ŸIžÂÈæBúLúvìêÆxQvªóÇC~ù‘“¸^¥¥%Z”=M³Ô¿¸ŸfÏã®? ϳÂúÊmÂ¥Ôɹÿ¹VðÈ^ûTRß:÷ÇÙíÚ¸Ï×càt²;â,=¹Ïa^s<ÏñçKðæ°¾ªÈD²Oé¬o™ßÊ}6cýŽíÖ9aþ5wwôÅAt$sà´tiúRÛM)­ô!ˆS¹§yìsQ{ ˆ8s£mìкVú:9¯ì;ázT~ÿñõ|5ü;ëP‡ÊGàÛ3ÿ`7Jv}±=»2çCâÏ?ó£öH=&Ó’ŸŠ&ð3Z5EùâG¦š§âr;Ù«–ñW–ô'«;û>Q®uMþê6·ß}%ì'Ÿãþç?ÈÏ&âÏs»@Î÷%´'¸€»ß3OKgD×ÞÔþGÞ[™Öþ–ƒÝÄ ŽJí®XÍ„y=gÿÓó»òå-ÉWy­ÇgÀ{6 ‹e•"oI8'BøÕ³ GÁß’Yd¥ýg©cy ˜ÿ¸x§†8x˜HûÈâFþ•ÙCð'Éå]Gó€óoj×ì½GêlÌ›_M’I·C¾_èªw蛩/àÐu ¸ìio±¤DÎët:— ?ô«q3>ü‹œ+aUf!çžÍ¨¿>ý}‹òç/‘ý/TÏe#³ Ü.9„ûè^ôN"}ÔªO?ø§¨J¡S‹.q¤Bî^½ùÿa§^ù>Ûƒ '§É_b>髇Ã%a±¬âÉ=ƒ DàŸŸÏ~«ó{ó5y/ô"a!¡ Œf~wçÓ^Øî…óàuÊ®‚—yyQ˜Á>£“öÆß‡ÅÉ?VOñßñCíîál†øú!×ù"âJðñ‹Vë ¿€ï—+æaªwDÓþßíê56k’÷*ô;á×GÚΖIÃþ2…?¿„þ¥Î3ä¼Äý­ÓÄÖÿCïe‘¾uîú+•À¿Üøokûa=žÔ'Àç¯ÜŸI”5©™ìˆ¶Ù¥áëÈs¿ÁÐ#/)tƒÎ¹Á¯—ç¹Ö? ý¡Qæ9Ä…`kYkx®îÜø6R×Q€í9#9Oæÿ'ÕÂz³*j–LFœRuÝ‚¿'+ض*Ÿœ£Râ>…<"à‡âØeüF1Ö˜w°›ðÚä¹°ŸKÝ[ÄkWš} y®:öCdrÞüg`H ßç°*žÕƒ<ã ^Z}¢:Y»¸H}Ä eѤ?P+ÿ“àÅÛáþ<²¿1XÊ¡à¢þ¾àÅ.Øû’ŒÔì7„õêÖAäÁ) “_‹«g‚]s–“$žžø²ùw¶ó¥¬iä}ãNRg,Zå?ŸR{ýGqÓO°UbZïùíTv’|MW’–.~$àwÿ2©g®×­¬âFò­ŒV~²_weÕŒòAå–ˆmÂoé¤~PÅê;- ÏseëpÌ×ÿ~u…x¢s¼¤‘ôT¾õÃÍG7¼š¸oQè‹Í<œÈs™\¦H¿œ“‹ýáñ×§ôr†Î'èƒIË«óHlž~Hö…uú‡Éš"¾œ|+MâAèIò3ÀûÀzAY/àUÁåGÏÂ~WÊzÎä—>J¿*yûpš^æëx?áÌÀÿ5ìrb½iÛÖ‰ØÁN2¥ú-QèγæyâXW>oÞŒMxL‰d(飚V´XLúsT»¬íÈÿ{+š{S=GdÆŒ\ǺüëXÅ^x¢Ëöãú8"ö|ÄèE99c7ïôà,æ§(àºö8ðÒŠ¿âœ2>=£Þ>yÜ¥]íóŽF<~3ËNúÊÆ¨ŽÅ…¿hoÚÕXsABw#!Ð2SIòœ_Vš÷(x9MßáÔvà`ÂÒoѤhòÞì°ñ8Ùß×$øj8[àñlÅè=ºf¡þ;ü=æ½p8>ÃV6]ú<—)µÂºT7(H’}eIò£HýµèáMíä9³yÍ$ð9Ä…¹V‹à¤iïÏ£d?Î?—² ˜·ã&­í˰SsËÅ\¯zá÷Š?/?šÁ)Gú>ÒXS“_À?äïŒ<¦†±]„|/¥k¿þEÞ³Üù÷üËý†Ÿ6Á— ÕÒ·åÁÃV¤{þ’‡;v?Âx/6M¯Hi”ù_½“Óûy¬¾˜Ù¾mßò¿wú°á;l<¥¿0/f“ øiÏšØÌÛïñ…{EÀµ½Ïä¾’ý~Æîë}Ÿ‚d#g¿ôk¯eúCß§^+?$ø˜]†¼Cçý…Ë͈³ú¢¢#ð‡p¶ÛB3ˆoμi´¸¯Þ•Ö<ÒgÔ>Ó$˜Ô!³UËÑDÞ@Ù½ÿ*âÞiËO¯Ê‘óµœ*ŸHʰ‰.cä7^Kâ<öG¤°©¬,ìØ58KÌöãcQ}¼Ê¡~ý°î/fð$;÷ß3h7ãŠõøË¹Ù !ï:ÝçÇ%Gð\f†|!â‹ÎEò|3PBsªö™û­ì £âvh³²0…ªû¥ñg79—~…Ïv'}›vbØKxULÜ™æø•ˆ/›~?"ûÆ%}”Ô‹3ÞcÞ9Böa¯•yX ¹¦j¯=_Cú¬­5»Núw9 8:‘ü@›¡'š ~ðú;z? ]þeLçä옯@ú.ˆ4—&¼DT÷`=ìŽîiäÍÁ ûŠ\¥ì*Ò¥(}F|õ÷e£ùÿO]S7°~`|_hÄ và£wÆ™ëâÛã}÷‰Þ™yŸÔIàvÙú ø”ÓåÌÞµ»ïárŽa7ϸ+©çíÿÏŸœ+êOT CÜ(Rid¼²þZdðxšù°L–=Ôü==ƒ8±óq}"8ôB]¹\¸º~Þ¿d ët˜= 9Ð^7ïÍ»ˆü)t¿àÄÏŒ#<é Ç½©@gð<§„}{H? ¿‘53g îè³è^—³”Œþ;þš‘R!†yçЦv²Pèµ·ê+Lü /úx+ ñÌc©ååmØyÍËlQ^U½Õv0‚|3—ÃëžëAàÛS¡4êeó«?»[hô“ d6Â.«¯ýè— Ñó“FO÷|9 ë ¯¤®ï+ý`ßÎÞ-s;Iý”våÖÓ«(Ôs'•lTîÐèy¼ÅoÔÁ^¼ÏmÑ«Gœ¹avîôURU1uó=…Zz*}Ë‚ôI-ù׃q*|ŽÞ,¥ÂÏý;¾Ü/)nô‘«£ÐÏYžàŠ?+3€Þ²m˜ô9™g¯xt8±ð9Š2ìÎW®ý.ì­vå"«ä7–«r<ª~ÛØ‹½¸..Âáiá³C/f3 —ŒÍ­Öàϯ'¶»‘÷T솿I°“Á?J*øËI]ñëð‰²/Y‡ ºƒE2Æu7-¾Bêz®²¼*ƒù¦¿û»××Ê}EêtºM¹÷h8a½¸Þûú6jUåzH_¬Ðj7ü¾~G`¢<ìéÔ»æÒNà@¢ý ©+”süP‰ò¯òþî/fÀ甾EJâc„·|q'î{åoƒ7òìÅÁ±S4zÁRû‡ào!ÝŸ¢zƒB­Š5ü´!F]›9Šø]TË«¿v‘¾ìþ¶÷S—¼GÎý…é+=SÆ<lGÅ^üмÌBêóåJq‡lû ;Oýd^޼ U‹GoÖ+dÐÿÇþе¢ì-â¢wXïOèÕÖžùæíœði2~›tÁ—ï/ìƒço`æÜþ옌"ôúµÎ4â&á+ƒ³·–)Tƒ”óàÕÔL®IJgâ!/£yNÓê,fÇŠÏ7< òˆ¾#KÓ\ðÛ€u bà‘É… dß@ȽwGïiÕ“ ›…àdzFŽ¿dÓyOêû%²XßüŽõåöö­dÄóW?>\®ü~#C|ç'Û|ü³¨gåýøO¦ quÙ¾W3ÑyîDö¾ëßÈ~íN·GÐsÖ×ÅŇÒÀS®v²ÿÅøbéÆ÷r¤¯_÷ Œßõ^b ôô𞓠øxOþ/ôì7Í`@x˜`Ñ¡ˆÅ…ñ‘eä¼é&ÚSäïu[‡ n¡Ñ§S²¬ú ®Ò!}›…ý懾²×Ï_R5íÈyÏÈŽ“Vìd?°ZoÝãÿÕEâ˜é!u¨>Lg¿¯¡µ×(YCê-ýÞT9Åô–‹Ö€å­–˜Œ`‡} \JkÄüb§ºØ^-yä.y~˜ øJŽÔÓ¼ùß5è[éÁû §¡ç:nqñh[Äó u¾lÄãÌt™‡dŸƒ¶‚ŽuxHõè*'+ðáhÑ'ÛŠ>ÀNÛ2"eJ1?åÀÂðíÊÒ«Å/ËhÔèñD±ÕG‰nÙ×;Ãà[Ÿ=ŠÂH<;cNúžU‡}+ÑW û-™Gßu@ÿRŠ®Ýð¿X&†òÏ̤ïÛÇŸ`g¥’;Å¿sCo·|ø¬ |Úä­vªö=%ÿ#yw%3£àä×%;Zü<¯Â^Ø‚wçɶØ(ÞGW¯Œ:–ãT?¬<ÙÿìlZ¾êûÚHð4‹†Ãa<˜×—R‡ÝØMlx~—“ïôóü·œ™I‡ÓœB-;;›÷f=…~fxÃóº[¸Ndé'©·—¹úþH'þž´~øó&äÁ¶æ®Ïƒa¿©5¿}‹á§’ÓÈoR9î¼ÿ }zJyÙÆB.á[ëÁ¿Ô˜“=å)äùR©ÅÆfÒŸÕÄb~ë+ãuo äj~â†é&v÷‘`ýÅNê ¼áä[ ý’\xœò[B‰¼QS?T üw:Ý+ùøèÿcbK:ì+sÿ¹OÐ[†}œÊä{yþí/ôà/ùyQ XO¯Ùòjø›±ªZÒO&]7éáøob²kx—cŠHÎ ¬+¶öCœx€›þÁº=ˆ³Ù£ëI¤CcëùïöâåýT¶'²+¿ÜöÝ ¼4éçÉÍÀwÏ}ÛíŸÝ!S( |3¿Ñøz üªh³¹áÀIØÿƒ7âÈG¢&­X81.¤¡×ØKä6ž?àK¢çdW éŸqº›Ëxà39¡];t¦& Ç o(òyßGúÙå<÷œ¸¿›—Ýý‰‹ô»Zú|}æ¿EVàNÑ„ïŸCï%Àm²ßVö'w#fÍTWÃ^S×X±ï¢ÐÍî©eÕ€ÇFëÛü©Àz\TZö“÷Ñ[ÏžzDìhHßuâqÆÍ¶é4øWâ±ÜœEr^¿/ÿ4rw•[u÷-#òÖè»C~àá>뤈ž˜Þy“:K&ÓJœ?‡ÂþSŠ;Mêg¼ •;ƒï#X,ÓSMk{/‘}}nW’f7 àsCfFì#I:KÁ‹ìk O? »Qú—?ˆÝ4Kê5ÙZ½~û5ÞX6ÌKøÌçé7JLvÆ ‘z<ɃÕaW×èHÝ0^EàS°ñøGð3ûo&ýÀפ¾ÕÆTä™é,>*¥Ã¯·ql•żD48vàþzVÖÌãSàIêü8xœ[OÇÜ1ð4uß•›{ǧËy}ˆ£‘þÁ×Ü·‘玻m~7¯›´ß~o»ó™Þ÷¶rÒÝÂxûx™ó§Øà슛k²bïáNö]Dü»Þ×üê:…î2µ;¢ þkèìUƒñƒšYl†DúÓêíp-Ÿo4_ÜǨÝMKzM¤!±rã …½8\\Ø]‚<Þ¾~v€œ3:yêþ³Ý˜ŸÍܰ˜!®óYŸÓ2IâëÆ×ÌÊðk‡D{¹_ˆS´úгk8)TÃç,¸€¡[™œEòTÉÏüIý×Å A!øíÚ*‘b-¯ôÊ«ñ½÷{–>Œ«‡„’Ø“ÃèÛd¥éú1›<²àIlÉ äu2ÐÕyòáwOâå`÷¹“~´ñOv’<ç’÷šÓ„Óµ?’úhâIMZˆ_2 ¦{<àŸÊ“`O3eà °÷ÄôÄ•kà÷11Züûp=]-ýÈcŸ­c Ùÿ;´qëO,ãå%ïCu|{#0®‘è/‰Eè%xt]o ò– ϲ$Ou½ü-jô=ûÝfyWí~7^FË gƒyétr”v}ìæ2.&à?4±ZÍNÜß»g…ØyÄÛ¨_6ËåÐëñ‰é]·0ÿà‰ïõ7û»Ó/"¯.VJâ^ø§½Zñq_Õ°Á|ñ#hŸwAáâ˜Á—SÿÛï‚x—|övÙUøk¨Á™cðŒ g³`O±gj¢SÀ›u"‡o}ÇüeW‹}U%ïc%#w€Fl—Ž…4myÙ|…Ôß<>W¼ÐP»ëñ]èÙµ»eeüÏf«ìïM¤æÃxÄeó.‘¡fèÝMÙ¶þÆ/ÒwÆüzx£Ã"ãÂÈ¥@1¨ ë7dÒW9ŽßEy,XAq¢Ž"3ªÖc8}E°þ,À}ƒ¹íãeñi¸¼Å…쓈(Q—†ž§Ï‘÷3¦9rÑ$?wx°ÅþèD»:LÞ?¿þgòT ¼z¾Ž‡ô—:lêvÒ vï•”_7ûÖÚ¶ÎqÁŠç»g 9Ç£z羺t']¸¯[x~ë!Œã[¨åÀEö÷y«Ÿ†…00 ¥BÎÖ7XLoaý §?slÂïGy¶}†Ú†å°̤¹Ûܸ€uìrñ&õ,ç£v\†ÝùÉ¿'qÍ^Ç4&q7©¿Z5Ê^qhAjÐq9y»}è-äcÚžžð+ëõR#Ö™ä½ã¿=äÑ5U*½ú)‰,ÿ&ò^×W;ù¿t؃®IQÝ9ÇÚøv”œs±l¬%çÚ´&™œýÞ’ºò­>1¤.ЄhøðŒðÕüjü=¨é~?9—_£”V¾ úa~VY{àç2Ù5=XÈ„? »ñâŽ(C^`ÏŸýòrZñÌ ~z¬VYL~•Áfëõó{Zù„ÔùMdô~JΛm»hWûd®Oj#çúËf¿ïßl‰ïU4‡þæÆ<#CÎisK늇¦Ä‹!/óÞ!HúfìȳZYGø¡ ƒyòFàĸñ&‚[m{Ûu ^³0jCÞ‡¶ý»úÂqÃlðYð%¤ãùs?ÈïDuJ%ék쟓#ù®Ør­’¼rûxby–¥yÁ®7Ó¬ j#ïk‹Î«ÿï}Ñ×›€7÷7UpC/ž¥‰‰¸ÎýùgM;üÞñÜã/ˆ x_8T’ý¸wê€O8†´Gäÿƒ?Å žñÖx‘þl^Ͼ‰{ÝËiµãÅ3l¾ÔKêêyÄÚCöÈWwf ßðZ•Zúó6›Êk%ç>¯fxÁ¾£Å†¼úH|rÜû0¾¡²X}zß_§ðr‹å0\ "çWe¶aM>ÅŒ?ÐWüZv©ÏÀa]¿+žm÷ÄŠÂuí6pBA**&Ä®Í/26¡P㔕4& §€=·v>Åú½<õ£ opÖ©/&õ(jv}÷%uLÝÞÿD\ »&¶­Ÿ&R÷cé°Ï„ êð(î—ú÷ÈA{à]ïd/²Ÿ~‹wØd.âăSä¹}´äuÕ»l¤þÒF‘9ð(î5+—vBßf‚½ÂÕô¶¯ÅºÌ¿LðA®6¿ª;Aÿ1yT®¥løUÔtf–ÖËðýaëvøkñ‘²Îz ÝP¿/–¸¦Ï¸_9…ä!ºêƒä|I¦ãœ:Ù÷'¡ðøæåL5Ì"ÏÉ8˜+ÅI| ÕÍøÐIž×ªï6W&yÛ“Ì4;è×áô×GŠdÿïέ·Ïa}Zß&l±Þާÿ`þœ_ûb}*lwY…ñ{ç¥ø8/ ¯2ç^Ö y=õç ìDµ¬¯v‘Æ®.¥È\í}ð1~Vòôì<ò0¿æI)R—6'¨–Nu…¼?æ'LçP)6.Å•ä}ùãØµˆ3â'˸}ð÷°Âå1ÿ¸S§îž#Ïû¶ñ–ÜÃßµ;„ý¨«Ê|? Üñè9-ô òÈìª{x›ÔRO'u5ÔöÜ?ŽøVvÎjùZ€1ßÜ”¥kNëÝv²?ÅjÕêÎßä<òô,sñû²ð{júýúNƒ·ì|Ptú¯¸ Hö$­Œ¸W‰uÆÈõ¸©>ÑòáWÁ§~X{`¼„.[að£„m÷TG0/‡ ð2‰ÓïâIÿšðrO>8xU¹rqý/—^MöÝë/†<·ïqh¿4UìÖzEžë+Ðb¼ð3̽՘WôÝîkÞÈ›ã]M>ýy/;Û#¾ûŸd>è†8–è1§º~·Gäö{òž9¬ïTeph¥±)y;2ós ó1oýÛÛ…ÿ;7Wž%ϯy¶U“z¼ngÝ`‡Ôm×cEȾ´‘ËÉû¼è¿oô?¹BôWÇÛXðÎã:ÿäc‡¡O5gñKoaoÖûŸôÅVRdÿö>8û”Bêòj_‚=éÇWÈ×s§&?{"WÊš“‚ÿ†ŒTb>>L…4ß‹·}FœÐÉïßAð:ì?ûcÍàOT??ÒËtPvÑ?ÅÔÕ¹{<Ý- ¿Œ¼¾_¼ø¡t;¥Íóö‹>‡ù9üÓÓP‚ÿDÏ 5îÅ8ÁÃK3›v“:^¿÷ÿ"òðéç¥tÕü¹D¼ߦŸ‚ühIvæd¿ª;ÿÌc"Ï€î²[Sò6b\—¡›ƒ!X—kßNã<Ø«ÿÒô™Tò~ÿÝdø—Å@ë/òÄHÝâÌUøƒTY›˜p5Ôçw»—éËt9”œ¯ÛXÏÇ‚yD0}ê—OÖo+íæ‡$¿jr"}¯¢¿Ë ÏÌ™ØG¡:ëQ'®KÈ;â/Ž<Ý\EàŸ$Æ9X '‰¿Ÿà8úªëÓZ·]%rt¡¼ÕG~ámñÚozs=UÒy—ìӉΜÛEö·ÕJèð…Q¨ÒÚ­þ¤OT(S‘>éŸîÇtùÝzàwñ«=ºÈ“Ë;¢'úKVL Å’zsó»Î"/÷Ö×-‚>U}ž™š7( C>êâ ¦¸Ÿí 5OŒäÑ¢•ŒÜäùÿÍÍŒo³Ã÷œ:äbÓÖø¿³¾xN¸jò÷õÐüÄnê †îë'Ÿ£¢•Kê7è¿þ(GÎÏ•ç"[.äd<T`Àÿ=Xùî%ïµÝ.¯:Ÿ™þ2u"ûÛýRöv¢×’³áO!§d~©å¸fÄ©üìAÒÏÆ«ÊL¸Ë x?´~þôa¾õsÙ|<×öñ½`Èßk×ö¨i’'ø³ãäqRúã aèÙ¦9#óT"üfÚHè">½”ì Ï÷¿<=(tƒ2ÈÅh+SÞà[¼Ïæûm€§j6ܯa|Ð-~ê_0Oø™»Ö¾‹k´H}<¥9y6è‹÷Å—ãÀ)† WÙ±n¶xŒ«Ü_l2 yj¯Õ–̓œÂ¾·¸€Ÿ;$p}ºGž+Ô%w@ï4ÅÈx^ð ¿–ÇaÍà‰¾:{¥SIÿ.£?h÷rsœ–I\d$üó&cü¶nÂGšÿ#û»†$!'çæ¡õà3¢ª1O¦ /ËUUQ70>-âöE áu! >£/Ãþ€÷ÓOSmI=’„K´8CR'Æ i|?òŒºÜ´AÜ__·Y£x«œ·÷$#~ïÕùmŸA#éýÙî þ_+ ׋*3•—¬g3ý_‘s\aIbä\¢z43ìýײh,Ù·”ÂÒº—Œw¥æÀôÕG{Ø þdþ#ÔX×yÊÔ “ç:. ÁW«ÁϺ&6|ˆ«±¹¾O 8}@èb/9ÐYöè<ü5àljGW O»ä:dÿDüÀæ‡ÏÀ¯êÛÏ2µÇ$:Õø@î!ig™ ÿ¶Ñ÷Ÿ¿²ªK;q²’ô!ø[.BΧÅèw‹ÀoC™Òy»‰žjì*öL‘¾¿oXÌI}€ÈDgÒo—sq<ˆªŽ8•¿ŠVÞ+vP ãð^½áC¡ 9F] “ü2ã;fè+Ô|dØö(%Û$NÞ;Fº¹IãzêÓ)àC!³Î¼VZdŸ¡ü¢Ç"æ½½‹MùLlL‚ÊøYÆ@o0é÷0¼xp3ü2-Ü´Hxí»"nxë;‘}“qLïðf¿ èWvAOăBÍÊ|ÔºÉv¥Ù‘m žáxS.¼ùR~{ZÇ™¸ÎàŽÉl®3ùÕuÙµ¾«‡žã6ì:ùûœ0ÌÐ!ç~µ>1ήNV ÍÂ:ôËüËä‘g•l¯š‹:@¡VUžh¥Qc¶»@>©ýuÙ¡v'•§áŸIì5g<ȈœGYˆ¾ÙƒuÅ™g&5Âÿ³z.0¼ {Õü±%öä8&´ó­$©ÓÛ«Húoy^þ·òæaÍö§ÐkL@êî °ó 2v½9èËMdÆ¿‘<jûf ^Ü›ar¡ï¼îÅ´”ƒ¸wX ‡\“ØmËù’aïÆ›È{Yð˜;y ‡%1•Iðb ‘ãž°KÝ·åa~:ž&- d?™_#æ¯ÂøÍ¶›ÔckU îæÃú¢††¸âïfì—/ùA¯üÒFVCï´‰åæÕˆ[6²×VíÁ}Ø¥­ IH|¸{²žß¤nL!Ïûs4 ßzô£îÿÉØ^£çwå±ì øV™©ÏöJkžØ·5ð>éÓåªU¥"ˆ|Çoƒzòm\g7”@ê2Ť¬¸Î œ9"³`†ù„<9–MÞ_Z}PIÇüyT­cýÁkCp?ïÔöœ ø‡ÍàÄ °GZçºñ5ØÛ)ÎbàO.gŽ pƲ)MëLx!õ¹xI[üÏäžì:„»q-Ö›¿ìwÊŸ…B=2¿¥þþï—ý2{ìØ3Ò:] ã§M> ÜJÎãª|ïsÚjðø"äo1ß>>‡qÒ˜>@ÿj¼±g1ïxoÍ%nüÞJ¥ÉÕ8&d(Ï8ŽûŠQ6[’þ×<÷SGl›Úžc^û7_µË#|¶Èg,‚ì+i“¼9éDú`8&¥€ºœ)+¤týµí|ðzHïéymÁœUìÚIꇛ_ìH†¿‰gI_‡þCwÈ<ŽíÏ›R!ïN”¥æàþ¦[¹+MÿªÓ¶1óø¿ÙXB±§@é…¾qÄ#¯§Ê·tÉ~ûoñÏIÿƒsÓ;bS°¾sÚ=XŸ³ÙƒpAÄ—Pcºyn¶éÕÊ àNÿ(bïgFô[Åðw3W—nÒ_Z¥` y_ès,Å>ñ!xÆiï àeì߈"Š…¾oû ò>Xßòvn<±Çõ‡NO!ÿ6½ú«Ö·JøñZ|סô¯!â©Ý›“½éX¿y¶¨N,îï^ÄhÍÿ}j>iDâæÆÓš„)¾Rÿu—ä)·ÕljެJsòòÉs/˟݃_¾‰ÛEêo8Û„~¿5úX{è8Ù×Òp­tc:âÿù‹m¤~¸¥ê]Œ¶ÃÕVã-Ù×{Žë6ì.%ûEì@&Ç“ûæðRtÕ)à}£òeðÛRŽSq_þHÏòføOd±Ër±cÅæ =c÷äùgÀׂ¸Dmè/O̺úa8ÆOñät莥Ÿ8ûŠäÎRr$ç}æ;‘<#ͯÿ¼1ü¥èf‰ƒæ¡}Ë£šôÊ|ä°m<ÄãØÁ5 ˆ7É>–‡Èsãñg9ìà{¹)Ì‹—ø›mTý)ôŠx‡é•ÿA¿Ç×|úüÁŸÿæÞTÜ?ïdŽU;ìíxô«\ØQqî}ø«ûꦚQ9R'{zï~è瘤EÙ'ÈÙ¯GJÉë ä~jÕ ;³ýÆ,î¹L©¿öpò®þ üõMX±B›ì¹ðãûcØ}ö ™™;o‡ŠX®38¸rè#ìÒÏÓõÃ_ ÊÿûG5½Qþ`ìñÄÆákd?ùÞ”tÕy‚Ÿ[½¦V#ÊßûhðZàCÕ9!è!†MàÉ øfTtš™"é¯]·ü~nÌ×W ýÚS‡vƒ¯P³ï·[ð$ywÝåN\çôuÊqì hnr¿òø˜ë/•=Ácm—b\´È>HuïµòÈwW…­Ù ¿ŒÜ,'Ü ¹ï;(è†ïi³)/9ëñùcO/?…Ê>²£œø©^á„öjÌÛ¶«o§á-¯•w›NÀï s~’z‡²jgX ¿ _gå{ÉyÃBƒç’÷Î×!ïÍÿÒÖuq61¥Èùœ{ÚNó2R_x«tþF²_ÄÒn¸‹V{ÖtÌg†[)%œo †M³°ÏSx= <26õ\|ºcWüSð 󇞤ÿ¦ù|ÂQ/\ç›¶À›²r;x½;ö}ކ yë³èí"û9B¯[“}z4ž´]Mê4Ì|MœÇðñ{ô¾ã8Z4Û‘~FŽ*ÀO˜"lv ^GÎÝ&ç´>w(%û¯ƒ…z[Èy ÿú66ÄÛ˜D9oòÜÈåè¡æ‹sÈ4‰>ÄEïܲÓÐ[àÓ^ø¿á}Ñ^Ì7j¬¡¾üˆ¶â\e0ì6¬ý¿qUà–‰þvrÞ#åŸ7òžŒ2EêÈÍRg³æâaw2+ŒBO Mbqšô«kz‹JÝó| z°è:ì0ºQAÖ×i¹’¬Eò¶ªiÌÓÏU“Õ‚ä•þ/»È>ø¯m :°»¼G›ûIç=í3l}‹]ß:Ö èÍÃëÿõÕaQO¸ vŠ|M BA¤”XRéîîrYº—îîFE0@Ä`QQ°± ±±D¼ïüžûÜû×>°ûùœsæÌ¼óΉöµsÐ/Sù°9ZÐ;¿ Ùè­À%·k_žKÀžâ?çfñJ0¸âž<¾%äWŸ$ƒ½Dï¾8ô“ü çª1ÝÌ8pùàÕJôWëâëÙ˜ožúkÐ?³ .ËwÓzüó%fw0þH{÷P|ú÷ݼGç>‚æm-ݹúŒ(¼Ÿð•ÈÜoFëã¡—;€¿•?Ø9Gú|Öœ„¼,ì¥wa¼‰"„|Oû²ª×ñžs§¯G 9e}íìºByɲ»¡ÿ.r¡_À³]G²²›¡‡vñE™Q°Wÿ=/¤8_\O ãˆç64^TÒ¿¼U|Èå¸ì0õÛíjôÝÐÛˆÜÑ…¯h_¨ë°8âýŽÉÇC¸(uëé‰RÊcYW–qó6Íìè¯k fqÜþEè™ãŸHaè—Óù°rêÿÞöWÖr¸Í}øèÙ^ ô3­‡=¼œò1y_à^:ÕO)ÚGûÿG6dšLàwu'õ3©ñÙë|àÛ[û¤® BOƒ«Ìýtè¼³|ÆÕª{YÊNù5u%“Á+ Ÿ( žÀ|ß^|g3ì?*ﻎC%ô²ßúÎì/´j*]¿œ”wx.åý<%­‡]Tu8ÜÚSt=óbز¸r ²-Ò•‡ŸJuZ홋ù1 ÿ4î¥FJEï3Bü½°×o)â×uCt´öÃ4Ã(º÷×rn£ås´ï;»M˜:±Î¿ ™¶ùáyø™È¦ ^UÒ«]6‘Ÿ ?)ïÛûç\„Ò‰©’€<"¦mwíŸO¨-í¾ÙÔ™E7Áì><]\|‹Q-¸þ“ò¥d®z²¿Ûñú×›+Ðsãñ]°77›¦q1¼7fê˘ÍÐÓøo—»#Î󫲡|-¦1ê’”¿³uùñPgªbȈ÷ |9VBçÙŸtŸŽÃŸÄèê30ΤêçŒ{ünôð­+G1íY^ä_jå'R½ô›ïÌVa^ÃÝ5ÅWÁÇçü[‚ßû]üýx«ðåI6•©S_È [†çµJZ{†}o¥¡}Ó:Õ:Z‡ËV¬üJçƒó֘оSÈ1à¾Ý«šÄéÔï,¡†?Ûà—¬c–>ÇxâoŸÇ88Þ™ë©9»þF/â§»\Dð{¶ÒŸ–uÐÓ{^[É^îî¢s¶Ù§?Ïb]½®¡PGzo½hz¹÷äÙ\øÕ€[_ÛBo÷d©”¸Ð=ÇTƒ‰ŸÀ %çéÑ”¯Æ¬ÞI÷¥>=-þì>ã÷]è“ëCÖ_;àaá–á©Êt~í§êáEÀ×xE#u´ç2ÒýŽ.vÆxŠ•ÞýÞ ž‘1i<ª6 Ë0û!‡YÉæÎþ‹ù4øîŽøˆÙìvMzU® ·öTóx×b3ç—æiÊß"Îo…q&[«ðõÁY­ÓÃÇh}d¨¦ãÌ>˜xµ“òUMltB|›}DxpãëïO.Ї$—û²g _6Þ ¾áÐ7žþ­Ú š ûÍX6{Ïê}Ðuá¯`iWd|7 þY|°mêä™Ú°ÞüÓ$x…ÁŒ'Ó@˜„83éÈŸšcwÁgEfÞ“ëÛ¯‰ö£mKžÐ~RESâ©Àø51³sfàW»¶Íç1îyf\?¦Oq›Îêø»¤É®uÄ{Òšw¤Mg0—zh\¤{‰)å&{àB›}N<ç¸ôx¬Íj¡ã†ÀÁ`Õ »”ÿØõŠ«¡¯ œšuÐ_‹Ä 2J‰Ïíé&<Þ^y9/½l¹J‹âš©{龨¥ØÆ^è©×ƒ)¦ÑýÃòå9“”o­_ðÕCiWGÔ~#ÕÝÍ+©ãQ¡õ„ÜU/ŽÁ/Ä™Ig>ç¦tÞΠ{35ºOš1¿ñ2ùÙèoë›_ÂðÛx$€ß¡»ÌÞ ÿ,Ÿ™Ü>þËÔ}/ïWŒ¯@Ý@ôú|º_ª$ÿãÉ=`±…y‹ÌLÞŹpïÑy™”©Ïxˆm-:ì ùûªì쎄ÝÖÍ~òO†Ãµ°8~ê äÀ‘ÐÑÜÐy^wW·@üá÷'q¡‹%ÕC]õÿgÕi%›B?]žÅ<ÄgiµÃ|y.ÜKX:KæëCÄÁ·Ò Åá—Õ£*žL_sU¹¸ú²•W¸Â™ö}>7T®@ÿS²­*à§ÒÞ­Ü =²Šê¸v~¸D(÷—⃴-Y>à‹Ì°1“t3ŠimgSDY÷èÝ©-KVc^B妲|À’¬o¨ÃÿçûéŸU Dû;^ÎòÛyhü`µÓy  z7ä(ÊI”Ð}Žß×ZÒ ß;ÏóDŽ@/­¶ h¢?uÿfÍ}ÏáÆ žÊô3ep÷uÜnŠüÃLœ¦y|q*­ ê§ï€þ¤ë_OðpÇømí·úÝÖïŸIÜ{$<„üÊŠº?*ðsKõÒFNÃËnرà·"9ö‚·™š¼? |Ò ¹¹*¼“êqW©`¾–ü–áHç`ÙU¨nô’7¬d7âDœÝ–´_úUí•O6ÕøÞÆs%{øåàWâyÇKGñÿÒÛüÕrÀÁ±L¿[a§U¥¯ÅRa/kÎF=n‹8g/vjåAu~ÉCÈ-èæý{‘ð ÙÙ×Þs1OILý~Ÿvü4§¼–†ÃF<À•’¥z5†W!¿’CÚJ'©¾èL‘+tn)n¡ŸÐØk&Kæ,­·Ù-Útþs¥bü|BÞŽNZ'.t0`‡C®nÿ ªa|ÿ|4¢h?Þ¥hûaà{Ÿµï8æÛ9&¹‚ò•ušºS^º—þ¡'2¸a…+hÂ2&ÛzöÏQÛÊútýŠáåʧ7Çûô‘×w3s!Cyr~~ï¼ßkÍ—³äÇýˆ3c3˜^'Ëj(нÌú|Š_Qqi'äåoþñÛðâÈ×5y•ߨ†ïóÝÔ®v"¾Œ¾ûêìYü½7ÔƒÎíxö”Á|g.c8Àÿ—+Üì¤ýÿ<·­EÚåxþ£„ÿ?´[ üEDîƒ)ûý“Áâñ3‡ùÁ#rö«XŽSžómÿ]¢z¬qvOmÑnÑÀµn~œÆáåT?éWMpx@v{åë·„sÝŠWaŽŽßlü{¹¸a~xßà3ŠÓ=Ÿò-Ç|Dß¿XM÷¼l: Ï€ÿp„^éÔOݵ-þ òr’$Ŭd9kÊ÷hõpã Ø+^À`8¨ÑZ¬4=8÷8™½Fï'å¥a‹¯ÏÞî{*Ûéžú”µþô¬Â'ùYÚ'ª;­[EõµÍ¯-†\kó’œ41¸ßl»Äaf/É_IûÁÍŠ7!¿ÆÇ2¡×§MúE´‹T¸g‹ ¾3Oq˜MŠæÿÃí6–ÏM 𗈽®'ÇÀo¸ªêob9Üܬ»Á 1?i5/¾$OE¾ïéݳ•ÃtY—×óί{-b|uT|{<rÚ#,öå/ÝÓ”¿' \±?qüRô¤ò¬þ£Z|:¥þ­¤º+œðþ,ÊwÒ²µag/L“§û ¢Ý^ÐCUíçi‚˜×”ê}NòÖ˜wW³úkÀýÂI½!.¸¡Z¸øäa½êär­÷¼hÜvø‘ç×Õ2°ñì’uöÀUËΪ7k)® ™ÖLù™âë_ÛÿØ{Â`>úðwæ[ØYÏ|aZO=Ä»Q“òfE¹;gâv^Öß„çþèzÞ =øO˜ò Ä/s)6ƒ…}¶Ù©þÇi$F ª½«7µ€Ýyg L.ïYâ”Lû`É] O蔡J$ݯ6¨J«T‡}žh}T ÜÏÉß|T~Viöû‚ÇqL 8YÕ«Û«¿홼ú¸üø×éHô«àÞ*µ#«áW>ŒE²¡7Š#»i<5óèá†çèÕÑvÝ}âÍS:O¤“ųü6Ss‘ìEð@¿_©î´ï‘B”ÏÛWÅûÔQøȯiÑïLá3·~Ã>Ü>(­4Åø²%ëÑè {œ·Þ(ò³ªLX‡¿ÓÞoLG’ezKxfwóúí ÜïuhB¼¼çZA>øPÐt‡ÝÀi­Æ>Ú÷uoèù‰¸;U‚±¢vÎzþ|<îÞ†3à¿ "ôl[ ¹ÿŽ%s1¸zwUØèoð•„Ä¢”ç6ör[_eeGz0í\*ðý, ÷ æ)WéèéÐX´Û©zã6xu”wæ[ûoékì2¼ÕÿÌ/ø1ÝÎÖ³ï\Û—ý ¼BKp2j äà±+Þòrm{[,Jùé¥4³ûÁ¿{-¥¢ ç–¾·Üº ×+"g»¾¤´o§ûRlÎKŠk½•‹-Dÿ"ÍnÍ¢ûtn·ùGŽwãV„Ÿ³?Àr*¢ó çM×ß¾”Yd"þ°_ñ;Oí‡ù_‰¸ÿê¿3 ¦Y¡Mô/ò/g»Þ–^éµ_$›êÇŸý<Üs@}ß èAFÀ‚.é½þú$®âwI©u ðë¶;¾I ½ùüz3Îa>í;ì_ŸƒÙ›Ú-uD{ eó¤ª?äÖ'\è¡óg¯¨þMøÐòôe… ®Çê¡cV°S÷¾gy‚à‰¯ÇþÜýÄ`®æÖøƒ×sKß•žZ…ø4oz[Hy´;äw®o­ SZ£JûÄ©ÊÐ{®¥í´,èCœâní|àq¬d§+ÅÅÛ"‹UƒÁ_  v™QœÍóeÉøïøÞœgmàqÚe|¡rÐþm5h7ïéç Ëá÷ G¦¸P¾‘ˆ ¯Å|¦:çŸ\{ñÏ›úuµÕûx¼Žòà¹$ÿ©IûÒ…Ó·'fø¿}þ4`4ïþÈÇåâ;Ù›øÊ4¥?ÇðþøíoZ½Wãy÷¨fø‡-7O}åPž‹*=´çz¡/ëx{ `6úáóòø!ÊW¼cêŠ@ª»’ùqˆíùîß;BûÿƳښà3pš9ï*W´«±©jJ*­³ZEë깆MÖ‘ ˜fÊwäßÉÀ ØáPaÐoÚ7»}÷öWØoÄ×ù¢ ”W²líÛK! ¦ÐºôëÇ!—=SÇùÕ0n;¾›ŠT?ÓÿÉ á™˜·TQ÷xØgØÊï%‡è…ŒtŽ:ì½øÆ7#èŸs¹r&ô3ãçÚŽãЧ ­w[­¨NIÏdè•Ç~Ûí¢tž×QQ¹ ò Û÷è7â_ÿ^iï̧CØÐæ@¼G›ÿÍÄ’Nºß&®uv_Ìè1ÚFrdþ`ºóŸÈ[Jö8òíOÈEsWŒËé:ü.­ØÒ¼0™ÅܸâĂª´tøåµákÐ~ÐK—Ü'À»æŽ”;èèçŒ.௄uËEüž%TdFuíÏ…îÝù†Ÿ¹v.pÈÝ'Æ x÷ká%-ŒËùRˆæË¢²ðˆÞÃÞ)‘?8æÝ¾2™êZ³6¿žþ8ìß²|óÁzW öY’òyÎü©¿YÐý} ñóÚEGß s¸ÉîùºŽ˜ÀÏ×CïmJžŒ:/‚¯éX=`û¬áÙ½ðn ,’…œÂÙÏji_5ëïÁ”ß:ÔûÓÚnðOÛ´îݹ”gÞéú¯×KúüžYìžÓ .ÇLïÏ¡|âܰ°ÑÌ1Œ;GCã°/üTÕ¦çäýÁóž>©9Oqp±]ØuÚgÞl!ú‘&is# |&äß®b9Äg^K˘‰¿z·ÂJ Ú'ö‹*ª…üÃvÏt¢ývΑ7ÀÑœØÆgÁ"ÿ /ù¹³ZÒ³Bè^ëÚ‰&Ê‹’þ·kïv:?.ùêñŒ­±Õ‹Ö…c¦ £.ŸŽGÁF_«Yƒö|;G,œ1/‘biãˆ;<ò3Ûšé¼¾ßö&èèÝ Æ2àüƒµ“èuÇ«ÜKÀ_íªˆ­ð«ùoó˜-†þ·lœÏB<éÕ—dÉýbwüX»ü7F6ã…øªI _~­ïM9zá#åSœsò…æwƒðäÕ{aU½/n{Lû'×îÀ/§Kü­K>„f8Êó(2˜>w×Ðùä=‰ú›ð½!ß÷Çd s럞€m~yz…ì2-AÁõ‘+ñF^·Õà9y‹Dé^ ß±%sá‹ÇÎg´¯¨Z0e ö^rÀ9ý̹6´c;ð¦A¬ìU0üY¼ÿiùñróÀ´°ö˜³®á ªãÄH̆ÞÇÝð°e€çœ\¶¿ó¾TÚËx]8=Iœuã>wí¦5ä”/øç 9ôÏùƒæñ8âñ›äBþ÷ïU݃üÃë,÷BßM_Éz݇?ß¡0¹g®],q ãŒ+dóv£Ý´ÒŽiwáS{Nì.¤ü[“u«/[¼¼zQ öž¼<ê¸.›2v\ýLÛ|?è ô<:,»ó¢¡ñÊ ñZAå£C§è¼¿«¤×\ÓI/ßÏ vãnÙüú-p*­‘½J^€êW¯ø½û,x]\ Þç~åô£ˆwÎpO·Âñ}¤˜ Þêçe»)ÛRaœIytdßó aރ섣 Ç7*e_½~…xP½ÿä¾/ óÿý‰£õÝŽìEŸáo¹LÙÞ°ü»Ù\àªá·’ .‡_Rwc9üðîÒ[×!§ÀÚŽ½½h'p^‘SÆU²äѳNðíâË“Ay_îŸá3è¼ÎŒð÷´>¬<=zâ<çÍìÿD OΣ.,È=q굪%À±‚ußäxŠÑ߯û²aïì§®•À…¼Ÿ{/½5ÓúæÔ]ª§õÀ~è—0äèî‘Ë¿¿û§xÿ⢌; ²EZ¥F@"W9 Мg>FöÝ~køäWön—®ám÷ðb —ÅÒæ!‘Æ~a_ª7]ZxxÐ`ùZÄþ/‡™;éu[3†ÁuíóÕ/ž‹ù/rÐÒ½ú öÒÿëkhì1M2Ûþ,}ú¤m xgÂ¹Ý {ðwá‰_;0žFAü„ÁÖÑ”W-âØ‚¨ ØG騋1ð·JcÙM'xŽçΊ:oøÍ#ûö©ÀžB®o\¼ æ»iØG~d½h¸6¾ÏT¯ýBë_sÒýÃcχ¦wQýW+fË9Èsó[åVøÑÒ{{1Õ£-‡Ò!¯œ¤¯[©nª×´é*øœÕýØòsŸ‘eÖ\ˆœ—ØŽO‡kÜÙÄœ«Æ~:HRž–öþtÞ^óð‚0’÷DsÒ¦ü_7ÌP ó¼é‡»Ž p¢èÜž*ØµÙŽÆŸŽ´ŸRZ1gk=üÜ,ÙâyÀ³ÅO7|CŽVü&||œ”ÊqÊd¼ÊÞÔóöÍpã?-Ýžîèoß=MŒvñ¾Hõr)Ë„ÑýÕCÌ0”?xˆ \AtÝ€]û,ÚÀxüˆ+ûðö&pÜ­aÑÄ6à{BãÖÛ¸[?VOë|+œ_×Oµ>r%§{|Y©XaHû9õÏÇÃe×ò áÇso­þËúyZ¶ØÒÚújWü®¿Ë3W› »âðý>ö˦9Ü2®Æ8Šãó‡!§ô”;=)ðÇÙÛÄ_…Þ†¦D+€$ 0娶V•H3:F¥å²šñ|ÔÆ«tÎ,|<^ü?ðká…Y“ñÿÔÚúi0¾}Ÿo/Àóy±ê.ƿ𞨌óCðûì1‡5§])ñعٰÇ+ç7¿†wVEª·Q=ô%übY´ßüÝ|ü)ï` ÖÂîÞ¿Ýä‰x kàŠÌ2ôÏòÕéC˜¯TéWÂT·ÕWTâÕ“ŠQÛ"€qûÝ,™/ ?ãxëÙ÷tÈOZ'üì:àZ‰ÿÊ¡£°g}ý#z7ø|Hè‚¿v” õ}æ?ëáw#^«ö-Cÿs/(.q¤s0Šyµ< `w=5Vòˆ»Â²u{€31;]ÖžN§†wnªž9œ\Oõmƒ'šÍàWÓôõe(m‡œØÿò¸žXøêʼïqÜšÌ×tá·@:Ïdª”@ã ߺènâÑ_1M2§Ó¯/.»©Îχá'T«¾½0î¤{1»Lƒ O¡Q7ÛßxÎo"#Ý ¸à°<*Rr œõbý3ʳ~/vø(V?}*â~nš‹Wûlʳ깞æoA¬Íð,õÀhÄOóË>—ÂÏH×È>þJ_¬ì#¾ÌX—_‰Ë[?_ç!â«ÖDµPøQ¿S‚cÀ…îuÏ/„øy|Ø ¼HjñþGñ¯øå÷´«ù-HΗÎuíÏqÜ »n°q…]$6¯ÏG«7¬~þ¦)ÝËÚ;Ê‘ÒþӀ猎uFØ»‹&瀇D5‰Êuƒº>Y§ô‚â»3³>Vcž<œÿ~¼DëâF÷¼$è¾VíÊ”zÈ;ZDëÚ/à†ƒ“ZÀiŠ/×N9¿ Ïí îñdx’ߌ:œ†v]uŒ$0¾â™ˆ§ãóÕï*Áoh;-‰¿‚~ØO÷ÝJùdJóù_Ÿ½úåÓÆ¼sª»=$à/Ššœ/´¬„Eå„/‡[²Ñ߸ÃÕë*p®V<wÛÅà—(7ˆ\ÉáfU4õYƒ7¹Ÿ×ò Å<¤©k~é­§|ç}šÓ9Ìúœ­U®p˜5 ÅŸ$GƒLkl`Qž}þèo|•ró7ð7·Å®anÑþ²Øí¢ À£Ãõ.Ý5œ3x½ŒõyX5€8-ûÉŽŸëÀ“Kµ{çÚtÐù —ÅWñ}Y[ð“rà‚Þ’¹;¨ž^á»/ê Øð÷åYEÙæn;Œ?|  äÕ¼›îП¹».‡7*¤ï·¸„¿7Êv¦øðÉàókˆÃ ˜"½ÁSì&œ¯|„Üóû ý&g€'í,Ù {¯Ûà²ðÝoy<Ç qSÝ.V‡·7‡›Y,¤Îžÿ&ô)v·ïîÃÛ³á_8ÉÛSx`?Ûk †Áß9ÿÞ's1o%gw” )·Õ*$g­ïL¯W©G?Ë[§î=—ÞüèÐ6àFð¨sÇ|Ìc®­üÂózÀõ¢-Fò“À©ø#º†&XNÿFëX|œå9›àg*¤5WÒù?wÐï¤ã¾¼—Á›¼­¯-Í®% ¹ÿ·ø”ã]Ùf ±ýT‹EÅ#Ï^C.¦_Ùý’cFÒŽÕÀ)ã)÷«€·¬5TñœËÖ/BAAÓJMÈ_ ª7@i+¿ $Ãί8´ŠÑýÔ;áÿÜÂßLÝTg5á²LÛwðŸðI%ì,4Á!ö/x!Ç1àu,ìÇvæ¦ÿfbü!ŽwŸ£<"Îß/2ô”¹[áwœüözY"ØwTœÁµ>¿µm7æs×Já-åÝû5Nõz«¶f3†Á§âD&ܯÏø´ÅÍ„ß ¹«¹¸|¤£%ñ¦KaŽ+ô'a²lU;ìŲ`X†ò;‡ýró~)ýÍ©ñ¿à;™N¦ŸºX å¿— & 1ÞäÄKR*ÀÓÜÍö½ÃÀmãöcça'y²c–N ÐK·JŠÛà¿WyKZÂfp*2—sÀ#ªŸÌo®½{½uÍzèéËÚÛÕàwá|®Í„ÅøûžÓÂû‹C™–2¼t>üÔ©nÈ£TIn\úìw9ï­cžü<4Hy~ ÅGÕ=`oöwnð"¹¥§ø8“¯‘TOû{ê9þŽˆ#âØúËNï ¼žÏ$Ïø—}Ì;ÙKõµæ:">I‹pfÖß…žoùb¼8W:#×3ñZЊmï I‡6®¢ûõ¬Á1èuIü§ñŒ_Öæè¹Ýˆ?V\­–ƒð:f±r©|ì0¢„yζÞèÚñþF!Ü_ z§õñ×’çÐûƒÚ^‚?r˜ª‚bÛàï×öX Ã>ªö þ¦:-Ÿ¶5ÊCÏö,k¹iÃárÿ¥Õ#Ãar6/ÚçJ÷ 6ª»ÍƒÜÒ¼°œþ…ÁtÝfî½<®Æk©ønðHA—œOàÕ)<}àmÚÂR/À£òb‡¡ŸùÂÏ~§_üþðRýYNÜSÚ?¯m Û·™ÃL0 ë:xãÙ^Õb ¾\dÒ0à]„ñD•ŒŠ;ƒ—׸%ŠÂN¢|?œ~ò‰«5¢õ;åŠÛt®#áÖlaõ.ÊWÒ–¥/‡ç4ZCF1θwõ^¼ îÚ.þýmCf_Ñ•yàe¡ÍÏ‹®A¿}ÔÊma7¥Ê÷>FÅ3˜FÛÄÒþoÒŒYR1ÿÁ9Ó&üÀÏXÌîIè‰gJðäÌc”ksŸÕo\¯ÙŸ œv¨Ÿ—Ô8rúiô FÔðø£ð‘’%‹c0δð#c[¾‡7¡ú{å/¾TÖÃþ zSjs ŸY 7vS=cQUÇ©À­ªrÉ-°Ï¼Å+/@oe~~xcÀà*ÌxÞŽÿ+¼(m.†-fqoBŸrßú å@>e¯ï×½¢s÷|s‡Ð^¦xÛƒ+°¯;y%º“›~^ì­Xt(-|5æÑ'ã/åS ¸°ý¿—èwŠÖÚ†ë7„H´¦u’À/™Ÿ€ 7JŒšh½§½$PÖšÎYýö…ž;•¥EB®ç3¦ÇísY‚té¥t9í „ieˆ¤’ß9qrŠÖs“ïJçë\|L(oI˯EqÀ]¿ù-Óô€§a?§ìOöw¾|ÙÏíò½(º¼:ÏøÎ#1ÄK¹Öz˺ÿ‡Nš¶¹$Òù‚{¹ ¡ÿq3Zö—O¥|B*õõÀay±³?gNÞ=ç÷Ît&—¯fpÃÌJiÿw±CÀèµó£©Šðë˜ým”Ÿ[~^£ìŒ‡­Ÿân@q…qH¿Ú‰S•”0^ ?ðfÝ*mÂW¹I­-Ðßžtÿa|¦tÕäXO¸ïK¨P¾ðÖ§ ÉSzà¿oV".PvñÎǺnèq=Jç>BÙrS yë,ùBoFú¼5zLç¦>RJ:ŒvgôÙ®¡üïï£$çC~Wl…+ß<à'åçeAoòíÄGÌ¡¼Ø#¯(wvOìs3àÊ‹KÎïc 7GO\ÁóÎ+Îå/E|`ôür*ühü¢+òFà/Gõ —B¯ ½i4;KçäÄ<Ð/<7i}8\©)H ö$eòmm4äi<ôˆþ$¬øƒº2ä±óDɪ¯•wœ”ýKÙ{‹» ㈾qçE%íû+¸.è§ú±+ÐýšµéÞ|´z¿®ÝGÊ‘6Z ¿Y¤Ö`Ñíû½ý%­õ ðçOޏ&üŽÞµÏ™´¾œÆÓ53_‘ÎO 4Y_üÿ÷òׯÜ5Y ½åóNñAÿÂfX=óß)€þÉ _3ƒ×µ•XA/¤+Ïš&Ò¾ å‡dà"«½èp‘Ë)Ùh¸úêúôq…2üWÜlu“ŸàaáͯïÓþ™#Žv}_ªš œ 9&ËÞGçêƒbàØ×£<(Lá†Ow¨þ kÙ‡Zº‡à:«/»ò‰2[z68ÊÞ°’ñFpÚU?sQð–?Mžð›"¸71(¯pBüào¬î¿'æÐ‹(¶ÿÊ«¸ÿÕ•\ÄÓvâ/¯? û^ˆ/ÿo!ùw͇ý]Ë/çû^ŒàyÿÜK~ŸÐ/ï?‹©^F’Ÿ‘§:ðeÏU¦Ñòo¯¾¥™Ã>bZ6¾FËݾ*·³r2Ö9*}‹âçÆ•¥RÑ¿'…W©ŽF²Áñ©{»¨¾ö:½Ã‹fë-å»ÀµØ‹ÏRݤ¨;+ZäOzß\¯€þêÕg––’Þçžlƒ¹ZÈîyº½6¯Eœç±JßþøçŒ®pÅAö‘§ øNTó<†1ÆñaJÀ,Äßqqs®\.¬=¾ÇNó:5þ›Ìheï­oN X¼:ê(ŸûoPó#¤«p |‰dÑk ~Ÿú)olÑNS%Ekåu2^V ;‰å=Úi½ÚW9¾çÚ7àÒ³?ΰ8»QfðÂQª[îâÖ 0éŸÉð)+/I]¢û¸úÿB^•WýYœ`ÌãÏ»Ðß°ƒÉÎÖT£‹•ù© <ÈåsÝ“cö¼[Ø>š,'³Šö)þ£ûù/¤v®¹ ÿþ´Ïj!ì<Ý^Je*âÂdÈ¥¦°×yAìO´NYi Ùþ öÔÑ$-ŠyÐç™zð5äPö|¢ü=ú×>[Y~4ö¡ÃAwà£UîªÇƒ»[‹bb¶'ðfÖqUq ô£eÑ}mÌÓ¾åÅe5¼nâÝËlðôík5Á¼V‰kˆÁÞÍ'fšBUٲߎ¡_®½Ÿ++€‡œ±Œ³ À7ÖÌÖ¶aØÃžv~«ù˜ŸÊ–i%~ÀåÌ)WÿN¦&yÛ$Ü¥úõu£\³ò­—1nÎÈáOÓá?Cí½‚C"êÛ*,Á«ÒÃ~±Í5è\­Q@?Õ øù±ÍCøÿÕwýÑY]¶æxišlÜóAÌgDK½J>ún¨’ÊSIy9-Ê1/ÁìÓåÀËØºWO|>N/<±ì0ì‰Å='Ô ?‘<ëê‰{,º×uì6éw¢­H÷‘[T‡Ú”ŠþÆúkÅ]oñ|‘Uó|EEâ÷NÚ_‹=ž‘|0´`úá´+ù‰"úmùmÐvfúh–-Õm ,½xS„¾¿}áßç =ñ<„ùáî_}uü’™|™öã+ <ð»^¦Ù$Æc¨sýú•–«Ë׎yçØÇd•#Žñrý#ûïõ–“^V { Ý{„øSÂÒ_nxOböåÌZøó¸ ϶Aøÿ}®Ù²à…ÂÞ¥Õ´/0¾Á1<ËJàòž :_ÃÇ•9 %#¡È‹qê;ŸòÎxM–+Äѽñ+9¶ ®ŠFþ3yÚÇ“±]Jç5åD³#`'!á"' )Ÿ£¢ïšŒ7§YñðÀCh¦¡åE51u;Mõ×äûÿRÔõWuƒÿ:7m[¾8Áú%3qv­ýO\ vè3^½\rò×úý˜ö×£Äû®Ðú‘ßÇŽýÐ{Ûi|uðûtæÑ¬¿ÞðÎõþè·ò3ëˆ ŒÇÍ©±b!åYü¹æä¹ç¥Á~ÊOs¢°‹êxÆDÈËvç…¸ ÔRžZ^~ªg´Ü^Äí9̨ÇüÆ(–?ccC³ìïàÿ®B"“`7&Ã\?wè“[€ä­I:·uØÂu™-ºd‚¸A7¨ï“úËiöê¤úN¿Œ+ gœcç¾¥C¯~‰i}Þ| L Dœœ½ôxú ðkÎ?gIØ[ò¡;Ï[h¿»L© í›<Ýy:—Ö&ÞÞP|•üÚnÁ¾Mc7Õ\Þļx>9¾î ü£°|0/ü;{(`•äAèCö_ëʲì4{N´ªJ°2‡?O½=ùEÚ½)Àøó7ßkH›Ã`J;ã@õÌR75†ÏÑž.›°Æx’ýý ¾AŽñ\{áExÞ{jLz üT>Û+3$Á”ö5ÚO÷ÿ#ojOÒýœÔæÈ¯Vh/éß‚C¼O1¾ cëÁ{x“õÉï…¬m‹y =båžžñYpNÊrØ•m‡D¢:øxœù ‹}èGlLû™Ÿè¯!óä臥=¯r/PH¾®H¼”U+:—êÇŸá±wŒH´÷EÿcùÃNã=ѹ¿&æâ¹dîlí‹Ðã¾Uvø;òdÍwà:cžn ä²5v4—x¿_ÜŠ-À¦Óg…‹ ?»žyL¥kÍEgø ¦×H]² úaÂ#mwz¯ 0åçÕËÎïÝðg1ÅÃÒ÷ ÿ¬°‡‰¯ˆ®Ÿqˆöƒ2¦ÔÌT†8+´9I3¸rÏÛGC^~¾ÞíùÐ[ ÖÈcâ žÇø?P=¥u§¼Œ"ð½‡ØÛå' ïé¿Nï`ã}6Êί¦u—¤ÐWóÇi<=l¼;ü”ÿfèmñ‰t»‡À»¸D‹iàYï³Ã Gmcªrmñ9ã¶aªÇ²Àvehòcúí#º<òßL·¾Dû5¹<¦Œ€wÐã•…¬usé^ù†i†À{ï—c=hÏÍ\xzðY­h2U…ÎE0?Å>„¿ß®Ï¨ ¹† —E†ÏѼ¯¯ƒqmV™»r¸ÿ è3Æé?Ù4Qùº­uýK륃e)Æð»ÛšÊ M€¿žS#Æîo؇5…d ë5ªúè—s_£¼ Ú‰Ê=ïe;c©žq XHuðâíÇ`‡Á«wÏÃ<$—&ý¥ ½Üõß>ø¹àŠE©T1ÅoèëõÅУ'¼| hþþ^:Žö½7+ßé¥óÒKÜŠ-é½"áR°+kÉy'ÈÇϽÙŠÏsg‡Hߊ$*è^tÄ ñî)xžÕ».ÿ+xÓž%z³Øtn꘿‰”/üïèçNªC’àÒ¬õøãðÒ~ ž‹uï}8“ògO¼cG@ù«•· >Œèêpÿ ÌV›—øÎ-…=:Q»ýS*©Üt4×÷·¼S£ã5èÁßµ–‚Ï迦ã÷±k÷öÁžÎt•X’­H²ãŽ^¹Ô})Æ™®0kÓþbÄ5ËwOr¾/f½¥:¦:6‘à½ÎÆs ª(¾Ö*ªNŸß™Y·k†QݺØÁœ~ÌÇü1“EàQG¬²‚Ч«öC˜ÿĤÓžç’=­n„gHLt#ÎrK¡wú ôì| ¾Ï8+8,s8ûWÊo⫺Žwy»|R¢óO6õ¾§s#»÷ÏßþÅJÞ»i âýJý›°3µÏoî­{IûÀç<¯RýÆc Î;€ßI‘w!çî™Oˆcšô·ìÂïì›y/Anì¢S-IødUM϶é~mû·¿ã·Ýüþ]xcÂUÕu¾˜ŸoEënÀÞÙ^ßo8eçåoÂÏLÎë¾¹.qàÙJþ"i©ÝLª«©×{QvìÌ-¦u S¹<Ê£“ÚÑ=eì•Óýò}=ä$-Âc;eª<±§õWnªÚþ?¡7êîítžÄ|èJÝ?âÕ» ßíÀø£âvM°4ªw`ܬ¥¹ÖãÓÔb“Eí÷Î{ðü‹}^R«ñC@áB9[ÌÊŒv]E:/įÓèbp×Ox ?púw,£¸b2{{£4­O•†ëåÂ.XNeJt¯!ÔÓ”òÛ†ˆe¬¥|D;yS}]§B·4b\Î?[“îÀäû<‰qÙd©eˆCNŒî¢1º×âºËóY4úñtGÆí¹À‰C <¹CF÷ Ãàך/dfâ=AþÓtÐŽ÷¦†Ú—>™y. rN’½ñ¤üÈ¡d[×P.ë1Nò¥ûRÅóWGà÷ñ÷¦²Íð>ÛÛ;gºC~æ¿›äE`ŸÁÚVÖï›=§±Ñ¾~Õ¢u*ÄcÏøœ1#¾öoÆÞH衪zã-ºÇߟ›?ˆq¨°œ‹q:kîyù¿5TË |ø¹ƒ ®Àoí¦ŠÝÀ·pÏÁy#ÐÃÀ•íBK`GÎeª>ð+»ï·|‹v|ŽþÞ~™öqþ .;€x'2p0¯šÖc[«§Ì]Hykžx¢ýÈïa²J7L™w(ïYÈiÖCcÈ—¥=cLŸaë¿úA>2Ê aTŸ2âšš ú¦á¾øÓxŸÃ]Ä1¹¯Î«/epµÇz´WêÍ«o®¸ÆÛk-[HëJ³:&Ñ\ǰ¤ º/>Ãy@ëóՎºS© »—ò!>4Î;¬zˆ¡ürxä.ñ™(fŠñØsfÁó(UàÇ>U/¸–8ºíÛ+Ú/]ª:{sƒiPrßëú¸c{ýùÏëekiܬñ3ÑIbjí—¤¼ ¹HyE¸}ÉÙ~K½z.¤z?’ÎÉs`Á¾s%V7}ûîÜJuJƒÿþ°žüôx¦Z+Æoµvl’ö•B§«‹þqix« ¼Jk˜j Ü r³3ü8üØ7´¼'±=jÖ£ÃtŸåÒöô'Ësè â=fü—3ñ\d€^âTöNÀ(üfdc[{&≔`ÛZÀ¿è‹ï×Pžá¸ÌÓ5ð\°å‹ùõN˜³íï¼4~ÁÐÆ@\z“+©Ã'%‡ùó*9}ï±àšþ< ~w.æïðÚ/È:¾|Ùª×Ð^Ø“oA¾)­‹ykD¼Î€=ìÜþ$l)ôÈîtqb?ôVvëÙ¬NÂ/}ÕÖ ®Ç’»ÂÃà²+ûÛþvÒ¾¯çïaØŸYïåÊ×èžË7` Ü2HÖ´8ŽñÛí±ZHëš&WªS©>î¶vºnTwf*ÕkÒe»¬¤øöQ$¸•zÝ8KóaxídKOh3_¼Fó¹ylVÞÓ¹Èöj#âö,þÔ=kÞš¼u![Ü­*†ƒ/Øûrõ¹|¹ýv0Ò;AçÑCKNmiÃ{¬ y|ò`×{Ö0®Fâû#q1øÉYo7E¡‚™» g[ö›ZªgÈÉ{ÍœFþ’iôáØjªãî!ôñ›Û=Æü`àÜØ?¥Y¼è×BéƒtNÊžWiê*Ù\Ui§¼ìçG¬©î¹®ØÓªgÐëè+Là|¤o»ú2ðãÄëÅß)¿Yô>Ýxã pYnBûKuøcÀw ~®"OÕç¹Éf07óò¾;=_¶%µñxð”´SÇàBÞõ¯Âü)O‘Pž9†I¦çDÓzδ3èÝVû¯€CNÙj!'ß§ˆߨIõ‘gŒDlÅ<8J--i·r…d´úw­ÜMöÒ¼q®pÝΦæùŒ'uþµCn°ªí½½t?-røé©À‡éä“31ÿNMOÂsžq®–0è>ÃÛïÏ;Q¼¾òi–ÿøa•gê–BëÎÁ²!‚t^ÀG3c”øþ€ß-•ȵª_V¸03v Öò^õÚn®&gg‚¿gTd.ôÃüOÖ»5íå…®[œgF*]\jˆyS¿7:v†Öƒ<ÚÔ¾W­¼( ý j­1Ø@yšµß߀ždz鵈WãûŠÅç?(‚¯þ»¡ÈA?’6ÞØñŠî/|j ã+¤<<¿œVà½é< +!Ï Þ»~Bà™^ÝUG¡°t <’ý§ þ‰5é*³zõ?¹CoUEÈŽÌf›³aG®ÇË~—KÒ}è 7N"ŽNó˜BùŠ£øÌ’õTÀsØ¿˜E{âïøäá‡ôä¢×xA¬ßM=ËG¸+=1 \‹YrÏy ô êÎn)ÊŸÏi ýG¼89b®Ú:ÈÃc^âÙåÐß°•yútoDlƒ¼úçìv*ñ÷zžþ°:†¸$ëxì¢,cÌWPœ´!ô=T€GHöb³X&®§†F»Sp¯2šÐ n‘Ç~Ì ëÓ—fWÄÃgÿ[yEúéh¥=Nñì·ç`>Œ3̨I¤ÑYyZ·Jê“s¡õ4‘WË›áO5osÂS(ÿU°…¿ÐnØ™‘¨ÑaZï?ñ˜—ròãý¯ù Ú娰k/eÏëªjÕe0KŠG借–«vŒ_ƒÞ›}®ÿº†ÖÁŸpV^‡]ÞüòÌ÷Ižx}w?œˆñ©[÷xÉ©ÐyWu1º?Ò –5ŸêZŒ{†x$ƒO[þŽÜøƒòŽ=ÌÖÂ|ý˜½K:üÑJÎ`ˆò¾Íx¤!^Þ¸DÊéæ!¹©ÍˆÎ¡hTyuÁnKÜÅ >7YÆö%)$s ¸dU s›ÎíXzÆß³÷|ëDuÙ5£t+¨§uó ¼V“ħÓ#±vMZ?¨Ù"arpT§[¸¯v˲q¿O½'‘ƒx˜›$Ú®Þç? w“Î#Å{-¸ÐÝÏÉÖ6yª--“Nùãc5Á¿Ç4fˆ}¤õçÌœµø}Е‘Ž*øG÷dÉ%ô¯Àñpž5ät,9Ñ òóKÖÄÿÃWÿ| ?¥|Þ×Lð«}{̈7›¤Í§ý=§Œ°!%è1ëóב~ÌÕ4;ŒÏSu¯ïðÆU„ŸÃ~æ-x\5ýͧ”\rŸÿÀæ$>Ãr'·NÏc_h¿Ø~Á–*kŸ ù\ ÷#^^pÓ¦%Ð8³R¹÷ üMDöGÄË;¬Ë¨®XÜ¢Ó¯SÚóò¥¸ÙñÌ‚‘)—Þœà!Ø©«bëº7R<Ï{ðÊíáŸAsÚßÝ0Ë#¼<²ön6æ3þß·tîÜXyåßÙtßs6ìaÏèÍgfh7­÷¿ol|ºµ4Í| ûû¿<,ñ•Bá,ØWÁÌéÒùtþVàžYŽÝ‹É/<×Ey=,Ïñ¦û÷Ûþ˜ré^]`Òy_Ä%y’+åùÅ0žº—q”o*}ÏLœlèáÊÈM#ÅxîòÄækjлŠÂº ”—j's£–ƒk4°¸rO9zhŸ‚ ùû‡Ûù¿ùMý `Iñˆë©7ôÒËÇÑö] Å–úõCo2«… Ã窱?úÏeݶþMùe>œž‰þúÕÚ¼ý3æ¿7žùë©©J>ŧ)çf8Þgz½±šòþæ­y›¤é;° °€~Åñ‹ó Âþë…{Å_@|s÷‚€£ð¨íL®žË)zÒ½ ¸šºdneïQ·,ÐÜ~û~èU±‚×wÄy1¿<ö#>³šuýëúû$ÿõ¯˜‚~諜Yù,:t1n],ƒ™³ÎôÓ>Ú—ºþß›dèi¦ˆ‰¥ pIGùÍ·}ð®S6”mDÿY޽rЫ4æÍÖ>àjhqÖAª[^äVÙp¹ò­“â܃_Œ2–“Ϊ•σ<¢¾+(HŸ÷½(tðüØ…‚¡fÈÓÓåW)½'¿`õpp åëùsuA â࿞/ßÐþ¢R³A²0­?ó»¿ãñ¨´Ê~­ì¹’A3øPŠÉìÍtîTÛš5ƒÖR6圄=fïi߸ó×¹DVöU0+«p†âZA·ç_rgŸý8øªéâ>7úýÓ·gD1Þ°Ò‚à¥ÞçVíZBûþÒZœvðÍ|m ïþ3Tãµ_“"ðRÇeÀ5~òШÝÚÓ¹)°ñMÑi‰GKÌ÷­=•¹ ~ÖmQ’ä´~Íæ’töÑ.ð•¢j>Ùpø•¤J}™äÅèw{ÔˆÚ÷K*Th‚=EÈG ÿY# vAže¯{| º1Žõoû¥4`/Á3ÕæÄÿU׈mIÆüOOPìì‡\æk/rÆ|8çGE0˜5]ÿÄ-ÿƒÚã#kûñp»väØKÚÓûgP¤»‚Eûá‰óB|K§¸ì>ÿ öžÚm8ü4šçu ø43Oµ³qîôùô’ަèoù՜ٷý«š]°¿5­7=Ðót#ù3'ð\šmO]2åtü{å¾-ìøbçið`ã]ýtÞ«äŠÇÉ©_ w×òC°CƒÝóTÞÑI¤E ó‘&³/ë;xOzÒ²Bï/ЛeÝÏÕNßÊúïéBn¹I</w¢ÝP—üqèCÕ¿tÉçЛMæÌèMn‚ûÚ¸ &¯Z‡É\Úo Ù0%ó•ê¬Oy©ÂëfOùß~á@æ¿%ÀóÀˆû ð ùþ+“Ýø>¢Ð58þ>àf{|ü¬ÕsÙoÛ!ï]v_€¿ ˆáÙKù(£nr‹7À¯å}xøQ|*ðp¡;úå wi-ëßpˆóæ.ƒY{!ÁBÄ‘Ãå,)ßÿú•_ò8zîõGŒwa.Ýo)ÈíîŸL}±¸–uá¼*üTî§9WÚLYÇ÷O(oc5c&÷‘ƒ9GîÞºcåú1°x¼hQŠ7üõ)óý›¡Ißݤ8Þ4mØÁ`–òEz>,@ÿ›9’h§ygaóøÏWÕÓ¼Ðs?M5ºçó´fø—sçw`üHr‚Ø‘ª?×ûvÛíøÏ¬Ë…°×âëÍ÷v€}Ь‹Ü »N»À.»Oñ´r ô<ênÿiâ~^‚ ß¡§KvXÓ>MÉè<Ê#ºä¸ÔÄù{ŒŸ ­îE}ÝP~’ôA£[JÃz7%ÙŽò°cÞÙѹ” ÉŒMðcë›VêR¾ºäÕ§=Ã`oÁæ6h×¥oíou¼×@G}6ñâÜoë§û˜a™ºågÒ‹†ÖÙsÌÊʺ‰‰¯à·ø¦Bn9mÍzKùðnE\ìüßÁ^e&,ß}-gL3ÒE<‘ù©A-<ÞjïóÄø¾éõ´FàÁEë­‰MŽÌÓNSõ ]î†à3Ìöÿ¶ñ|5Pá,:;ÕWqÑž™ßdÃÅeÍD\”òç—» ⤼¡ÐåR‹à}·<úvžÞ|R8Í,YÖ¼4ÓóôË=6Ùê««>Už¾..Ÿ¹Ènó„ÿˆ[s4¸˜4_"oö ·NÌò_k3‡Y1qbÿVôÛ^{ï4ò/.Ñ Á?(¯¬;ô-G·äp𳺰bù¥» ®ûG¿Ú_=ÝQ{qÓX <*~¦ôm*ÚOÔl´§:v•WâÊë—DÛó¦|ŸšRwêÍù܉ä—§§rгãÐϺi%To*Ãó¥rr)ƒ¹½ñ¯Ï èoIÀŽ›ã×a“ÛK¤\%‡“—èÞin‹ÀK1Ä#:µWŠawá&ÿö¾†„ƈŒPÞÁ”¿ûÆ.͇\¤jΪvSþÎöDÊ·ÄúOq_d¥^¿á|÷äSYYü­pdòâiG/¡º(ÄQ÷9Ÿ©^ÿñAøÙ¬™É3áóÞ.¼%ï‡~vÄÔI0˜g-4ý>s´çŠ;ì:[öghË&|ž7®ê‹b0¦ºÜ€þ¥ºvñ"öŸœ5òõcï=úý®ž&*X¼*˜»öKÝ[X+—^|OøÀ\ðvÎCÛÑbðâŸ;cµ°/ÿ©¦‰óÃæÓ>fݰ—;ÿ’nwfA9üTÚ…µq£åÐOµ%{~Á¾÷j/>tzfþæuåU‰J ·3€ýDÔ_X’C÷ÐïšV„¾ïYlõ¥KžîÉO9rü°ðÓg7Ï8øƒ_Rò‡;/yCbÀ#•^‰‰CŽÚ3ÎwñÓ»/ü¾;Îm}ÿ—Òr¥\€Î²[ Ò ·ŽƒCy/NE":Àá€ý^'ÞyRœÿ`!å%7ªNû7IëQ·eOÍÜe®ý¼D÷Ë9a¼ÚÁð£®*Eœëˆ3ö~~iG<©O&º8‘ú)ì€4pÆ1ôüŠàyâ¶ÿѾÕïp1kè™÷¡žÙ>h/]u냕ñð«1Gï6O¾–.JußzZws5¾dn-N œŠU‡¾;?p³¤úƒÒËã¶í†½XVÞ4£z‚á>ç´øÏQÝm¥YI†ò¦îRCZï/eÚà=ž©BË,éü]Ê¢^ZëÊÒ£|Úæ!ÿ.± §¼É/Š«WPñãÏ …ÎÒ¶%MÀ±Oš±+(ÏÉ4£::g–¬Tþ©~àÉíg»^vj¤ziQâç´hÿ3á•üfð{®ÛðàØeÌ×Û7.ÒzÉ-5 sàaŽf¸]ü'K3ƒGú˜`6;a7â@3ÞÐYa´O¾ô½,äêW÷6”㌱¸BçžjWèߥý½ÌsÛ’Ç'ÖV2פ_û Îô§uªá‘Äîª |‰Ð~‘aˆíÔ?p…=Êè½±§}o¿äÿ(_vœ2¿9·H>[žZ»êÒåÿ`Ó¹ÓR÷=ñw¸† ÿSŒ'^Ë\"ñoŠŽÝ¿Þúúeô>N4úäcØiÈYëÀ®ý•Í>Àn‚.¯¬^Ä\×:²þ5N3ôy?t6\.ª üï]wépß&Pëö$æ-2P4šÎ©‡žlXšäò‘›ƒ8#tMø×­t>tYúõ:·gwÒó­¯c‡ø€ÁÐW6ô››À<ù 8RtIIÊáp÷˸ö)èwÀ©Õ›"ð¼ð!ï7”§;&¼«4h%ìèÖÞ™’÷Ýç&4—Cå„£Û‡ißîùüIèk€JÉ^Ì'—%u/òÿõÕqQu]Û£"Š‚ R&"`0 ! ÝÒÝ5twƒtƒ"(¨ a¢ˆ" ˜`ŠßµŸ÷¹oßß÷òÏùÍp朽W\ëZçìµ6yNÇr¬Õô‰´ÒÜýgôö§wé[|5qAˆyF™<¹ä׆ÚLÁ¯i}¿†w!.ËΗk¯`ü´‰ô1)`HþIöE-¶ëÐoÕÉþ4m}úæç¿&ûƵ´wP€G±Ÿ¦ BÉó ÛC£äyæWÙAàm@æÁ/0þØö«›ÉsÛ`²ÿ{²¢îîDÌ7­õÇm7òž¢žáz)YŸP,ýF9¨jãûðuŽ,¡‡.‹çÈ%sÕ•[›…€G3nÝ!ýaoU¯Û Ÿ¾å².s· õ%ù…C¯nŸãq½"éÊ+özCøG+Ò¿:%ëLax©¿ì‘¶"¹û=%ïodÊ=À‡ì|–N6"¾¤]©/A<ÜË™ =–ȈU–’up§¾’ýa‚¯½n¾¤7pÿƒ~ì^fqÀn³Ïа:"žÒh皎WZžtׂ¼KƒùÚ’ë¸Ñß]€}<´vó!öf½oÕ3è§b¸VØ®þþyg¤=ôŸÕe¿1Çñ_am¤?ˆgôðÚ¨:—‚@èµ™[++¶“F5m¿w—Ô;YŸÝ¼"¼_jÉ]5HâÝ”Îþg¸N@o¾¢8âAFÇ‚SðÌÿ£Žï:²ÎüçÝÖód¿-ÊacRo0ÕÇ¢†ïíT›Âß²R‹ tÀ·½zd>ÅCiQI‹—‚§Æ¯š¶xIêä†6Gæ“z Š÷ð%Ä»àØï­#ÇËúyÜä½õçc²n»>Öú øõð¡«<Ðã–oq‰ðcº·wI6üDpɪàž´ ¿Ê9ÈÁ1u6vœ¼´KK‡<õ•hš›H½^£´ðÈfÿÓÄ~ðf‹’Ó‰NÀ3óú£Ù­¸^l²•ˆ=/äþýhø”½ ³êpÓŽ×Ö£ãW8Èú5×weo~…¸sâÎþàï%\QË¿?ÁxCTÕ(Ûpÿ‡:…d?ðô ¯Ïëïá†ç•_~×-"óyþÒE ò¯\ÉîE §Ñƒ9}{ œÎº®·ëÓØÛCÍ£SàA)/ #Ïã:vmûN]N$_H‰!ýó³)’¤^2ãvbhp zTvéR̳ìÕu‘8à‹€¿·(xOVÄÜUðžôEÞB›_¾²÷"çË:ä*Šû_X÷0NñÌÙW¼°òœæ¯ÅM4zÞ‰ÃY–Êз¥K¢;xMä­K_aÑóß?(#îF¸½Y <öTñ}yöY¶&þGþJ²n÷yuKÄÍu=ÔLn؅㛘O°›Ä”©äVämÙ5ôkØÉ~³òé°ÓFS+ø¿‡¤˜HâRÆñ]§ßƒÚšq ¬E6X¨UKö;Z“zö2æ¯9]œí=ªÙU~ƒ_Û=r‘¡à>êß6ó·Á^<êlÜ ýøLä í¾JB\#7…ÂcÛgo€Ï|þFúÚ8ísW0%ëYÒ¿Uáüˆ-ÅÂÑð{»Õ—Ü/’ý/†­™–ƒGÇoPk*œƒB²¯&¸|·R[ë-ä”TWùZ2¸€_Çî5®`oHté]Üt8¿¯¿ó3æx¶ñÅ6¸˜æEÖ1lx7Çžê#ÅP¶š\ï׎Öði±;K{¹£#í^AN·}'ënÂý'‚r·ê–¾¯Ñ%ÏñoUíXûTæÉMxµuÅðÂÀlPó‰9¥É·ùo²éø¢2Œ?åË•ç9À‹bÖl·a’/HŠšG~YdÛ,â¥?4a6ô.'o4ÜMö›MÛwñ‡ãàÛí{ëI?‡0‡©g­àeéGâ*;`×Áb̦NÈgýMè¥ô¡·Ö_[wC/&¼{X?ü‹þ°’~-IŽï£d0ÞÇåܸð»Ëïü€Ý öD;8B>ɼǗÚ<ÎÄ sAþPØ`>»êìTeÿèð)ðB¡ø AÀ5®—ëWôÁ¯Óe&ž¦À>õC%7Åõ+ã‚cõÉ:<Ç—‚ O™ÓžfT`¾î€óCêRáÏÇí€÷9ú¼ƒvßµ7dŸñ5÷ÙºœAùäÀB Íö£È#}dýÿ0#N»ù~¸€|/~VÖ¿7¿oìÕw…¿Ó_~‚œB¦Yw|ªZ³¬Ræ)ìŸ=]Æ&šB¯õ’›“-¤Ñ‹–my£àNöX1ä”xrýÖn1àC«ùÚCÁ.4zíÒš®·iøÝKIƒEðûS—º»LºéiÙ­õÀ§º®÷ïçiô˜E©náˆgÕÞL»¦Bpl±Ÿ:”B¡ž‘é´¦Q«ölµØlû»xóùbÄñX‹.Y7øuȶ“¯_‹S"cmýÚ3ŸóÃø®ÆŽŸxJ£6é{¯+§ÑK£Ó·Ü ø ]€>9ìndûCŸÎÍG&«(ôÁï¦}¡G™¶—úäùήú½y?ÀS:®’õ5qÆ|k‘ÿGIˆ±‹Ç“õ@ªêìˆ_¥r¶ÙÊvjcßEY µrÏ«ÀW4jÜÊ™Mˆ/á =kÛ‰\šÊO ¯õf™ª•÷V®ŸgD<Rñ{@꥓8º NÂÏSÒƒÎçµlÉE¯wïáû¶…FwáÝà“€ùÙûÕò Áä®\#ûX•ÊÍùÇß²ó*ЦàGÁ?™_}#ïMŸ®q¡ƒ?dÞ़I4`}uDülìÆÄp¾ªgÑÐ3n½P€©Cô#)Ðò …_ØÜ{*CúxØk<~çU”ÎÛi4”Ì"¿¹QLeEœßõqÃ6ÌñhïvðgI ‹—LÀë ©ÉåÐSêO«Ó«p™ý?‡s:ä}vÌpÿL&ä‘µó … ãŠs¡tÂ3BÂÉ{ÜcÙõ6)Tå'wò<Á!;Ÿq1ó´·ð4ÂuÕ«ýÐczA¥&Y7Pr,.ü“ üægÍŸbRÇ?ʳW\vëg#c2Jú­/ßñ²¿¼óIQçnˆsÄù3õ-–+(tÏÞ˜Ì7d]Ü2ÁÔR4,ã þ.°šã-xGJ(ËëÒƒˆÍÄ/Ô‘ý^|y8Ÿ^/ë_nKÖ%sØÃN+vLzA¾!:»*/G|g‰f_ û \Ô»Š²qþë䉲!Nfžj¯ ýøeéôJ»7X Fê{vÞ¬-†>ÇB‡"Æa?å*¤¯dÆ‚‡› âSNH׿y_ÄU)CvfäÍÉç´óípÔ<±ìÓ*kòØ)ÇŒúo•;]‰ëäû7.OŽkÈ\ür9ºã~k=©‹Z%*¿Œã°â8ôà–¶#yÅíšdê˜ /£œ*èswCxc̘óÄ…@¹¿ÀO«f^+“ç’‡eFI?¯˜ØW›ïâ¾¼’+’²o"©a»n@o놄äq`Ee·0Ä¥PKۈ˻3ŠÓp'ŠÐ7²Ôm…ÝÒ'U›šë’ sÊrâßz^*šyHÞän8wÛÔ,y;=˜µê7ÙÏ=³ž;MóNXRu_üÚzìŒ.•ãàžñï°??Y–è)çÄÔçedUmϲuà'¦L¿e¾b\vzÕR7wi;g%&VP¨–jz–2ˆ»Ú‘,çæa§ A{tÁ烲"ùƒHþgµ8½v›vÆLÚÉš¬Ï¿_R0ûixË£åN^q¹®®¹9wz¢´8Oßkà‰Z“µ«o“}|øçÖÀ®Š7Õʸ€:¾äÛ9TܦÓOÐÀ» K›ßsšÛ/Šƒ/fªT+¾”ä v÷À¿Bû¿I/\«Rçß[ϯBÖ¯p"Ͻ•Mõ ¯Á>,~ ²â~õ•[Z¾ãè>ë[AÅ8*ïH~ŽTŸ&uÞÖ¶Ìð“’oóe‚½¸ß •E»w½Mx¯‹·ï-ÈF|¬û®÷{FõÊXÏQ»è¸ÅÃÕ1*ýr!ôtŒéry3®WÂáy2ºB?î É^C£·¶ÇíQØØM/.8ÉmI¡—;ºÎí€vø×W>ò“§Vþ˜<%…ü2S—Æ,ð§ qñ”#˜_¯ÏÌYð:oöœ™BȱÁzã’,o½D=w[âË1ÐEÄ+ý-ã˜_þ Â=c øó±ò\màzEø½Ÿì|°ÿåÍI‘øœñá^¥Ô ⊮ÉŠìÜ—Ù2qÀ*¯ó2+ô_ç«k]J¡V77Ny-£Q[ÎlÏ»FžÏí3èƒ^²­Œï@œIkøöyZµÓ2Êp ú½<© ý§Éií%ï³½~üÞ[ÞÑšŒû^¬¦•Á¯3?ˆÝþºèîÊ?àÑåþ: dÿ¶g÷f9p]Úí UÄ¿¦-îbˆãö–»­Øw1¶ ÑâàM*•>°ÿ´öýΤyÎxÎ+Ù6øEgp«xbeŤIð{½Âëe‚Éo5ôÉ2ƽˆ ÁößôžÏ:¶*¨"ÐìÚ×XïÅu›§Â— ¶ÑÎRÏAŽNmšÈzሸ,à/Ï¿ûü¢Pwp¤ Nçܹ þ“oÖEêÂŽG{rR IŠy !àkûG…õônzt寵¤n1SÖáKâvøcýJÉ%8?ƒÃý|6p3«Bfjw îs¿Z^ysžÀôæ?Àµ_»‹²4R·u«) |¨á(W©ïÍ¥pF§–#pŠøNÆ]«Ûn¾R¶/õOð0ÆÃ‚ô=³s[òŽä u¡.Û¹õitZ…ö¥àË´¢ò“½¤ŽøuŒ Æ[É{Ò ro—Þ•¡t³®ïòiò>ko¿xkÅô‘ç’‹hT·ßq¿µáÿ™ÞåEÀ‰àÙ݇…É>Qñ™×Éû¡_Ó‘4ThÖŸ¢%{ÈÂO3–]•å'ë$UÄ7 {)eÆAOÆ ·ÍÇÈúõ§ƒê°k©²Aø^ÒúvàX¤)eÞƒ<ÿÜTÄ”<ã0½¡æxcY>± yn‘…½° ©ƒPålv†d5'k[®„]²±NÀŽ^gm¹ =ÞMÛõ˜àÈðbq‹ó4jšiq;ÆÙñÚXa#é+?èªÿ ù‹ÏÀA#7+£@à[\“ÚEyØGnž¼[ÆgàøòÌÀejÎžàíµÊÏFa'ÉÎËšN!OËm.8|ñš¦(fü(zÖ;gÝŒ¸P"~]Œ¬_ˆ—¬fa¤P½¤ò`¯5¾‹øêÙhTgµ«d}n^UŸóM_ µV;Õ©¼•F÷~>´ôÝUgj †ýåÔßäá3Àõ}oö?®†è¥æ€ï”,t|Ê!ïUÞ¼RC¼Ï<äcôþ¥oýr‰ÝØ=Aµ$ϱg·íQ!ûç îfµj¸¼dBž¼Õ­[{HÚ*©ò™¬³qZº1‰¼ge|7;yêX² ‹Ðè&Ü‚ï`·±Í–§áüjþ]º¿ÃIß}é€FðÌZË¥YŽ™4zæeÁ¹4ð§Ÿs;ÈSêvõÿù…ü4ÁV…/ öØ2ýâ0îŸ;ÿ»/ ùj…FuœÖµîܲ5'¯J<·U„#ÿ j\²¬¶íÉ*Ø@£×]Z]Ö@£–œ9Óz|'î·½As4|4Fìky?ð%žýˆp"ë—ñRqŒßãöØPò›8£×Æ­àñaWÊv’}ÛsµÌO‹ÀîKÎÖ°WMní\{¸_à®Ë <õ³Þ’Z¹ÖwÍOÜÇðórɇ4jŽãN­•ðÿ¼Ó²æÞ8Vž·Ò ;N£z÷Jî> þ‘¶G‰Á<ÌPÜÔ¬ ÷°ÎëÌNÄé½®B¼(uÒWì8„ë^ê[þþS\]üár%…ªpà–©ŒÚp•>žœô@`ƒ9âtÉѹ¤,~ ÕX¿2ü¥ÚÅ=ÇŸFw5 û]f \(=‡ßޱ‡Ð/ww“÷F•d‘ ¤·[à_uâ/ú˜׿H/…þª–þþr6—F{»ù¨=ô¿iþ¡r%ô®<%éuxãõ4ûDñ¯ÍËÔÝa¯|ݧEE𻚯v»iôÈ(¥ó·oRÌåÞ‘ýüGZe §*G…TòüØÛµ·ò$òÁ ޹;LÃ4j¸Ã!sâÇn+™hÀ7÷KfIÀ6Þ¶ dfãàQÊN”ݘ÷^o ËýÀ ?¡`iÄÇ'Y·ûùJN•œ†]=/îÁõ3LÝ2O1ÃNŸ(4Ã|³”#®þAÜ“øö5¶yͲ‰ÌÕd?Ý.‹«ÐoÅÍ…Üž+4ºù×^y²®+h©Üä“ãØ³g}=yo¿ŠŸ q¿h®X~ ×Éšö˜€\w 'ë(¨ËÎÿ xýÀÈãÙ‡ikM½"üCS¸Eüák7eÒiQÀ­ŸÛàïÁûÉû¨–‚ò&ømèUú=Ø{ê4?©çɬûáAê_·ôFBþ© 4ðËC’4¯ Ѓ›ÊKàalÙˆX4á_Ûn”“÷¤~Q6äymàÂ=³0Ø›·»œ âvà€#ëÎË]my{ƒ2âƒûèÛgàw…}?ªÕ€ûF ød–«ø]ÖÂO—fðô”Ñ–Ë‘Ÿºßú£Iê4+ôS^î ýŒšT뛑çÍŽ%¯J%û•§»©]®¿MœÚ‘ ÚNö3ª¸ur<ÙÎyºøù-÷¸-Æã»l¥ˆ y.qê©OJ^$èèÖDÖ |OÍ쎗Zbùlª()Ûƒù„ZP?9Ï?lj6b²,=R¢òdýIÉèfòïx‰ y.xt½s2ôž-î÷}øe±Pˆ…tì¡@ìP1ô£t¿¼ž¬cM ÌTæþú2n{ƒ¼ÕÚëˆ]0ì9yB™å=øK†®výrø=»÷Éä‘í?Ès¯ø+|§DÉ~Œ<¢zKRÿÀ©§/Ûí]KåIþíÃd=gþÃJ¥Œ‡°£NËB ào…?sÅã!Õ“A~1+î'1Çgx‘ØÏíô/K›q~æ}woI|VÞ±Tvãxé°ð—nòüyª2›yñWV™Sî˜çÞÉ‚Œ4œ}ŽO{ Eîó”ÿ%nØUÑô„®ø½Ruq£¬ç×= Uâk‰7Ù77«õÃõÐjà“šÒ+aà˜·òN׈ÿ¡ÜaŸÈó÷õá‰ß0®$FgÞUÐK¶Gž@J …~¸ôáRnÈ;…Ñ~¾¨÷œ“5ú‘žözôvZ£4DÙBöéÙÇɸ“¢¿ÖâH¡ºŠ X ¾šìÊ\Ý6~Ý>½Ìq5jï Y{òºûý§›Ð{´ÚjÊ3ä¯ëÞñ¾"þK_x¿ÞóZ®®^FìÅtµ éÛi½#¤!ª›ô-³ Ò@^”ñPÔv'òª÷@Q²þdÅ®³nðoÛŽ)Àµ_5ZÈgû3Œù!ǰ¾÷ÖaŽ~—šµ1¿Ôëq0¯ìkgr˜C¾ËkÚÎ:@>:æ בOFÖ×è ~ÇÀú®‚ôGêX+á{¢ \>\FÖ±ñ\ßî„ï= “ÊIýíÑéZ[àÄîHwÅ?Èü”—]ž2\v­¯›ä{¾LI³K0OÕ&AàV@Ìþý×À“«¶˜¦¼‡ß |öõB>uL•š¤„|Ìk=Ó^🔨ÃW»QƇâ<×øÜè®jÅ<‚ÎpùûœœÆubÛÚ¿C4Ê õ*ÂC$“~ O³7ê®ÍŸæÊw NGÈüê]€}¦žÕÔüú‘¬Ûf¿¿¸fÿ–¿+¬þpø+Yšñ¥ñVÝ ò¾µ~ƒîözý¾uˆ/;ì9n’:‡`ØKmS—W~ÎÒV|¾x–76ëp*z{4ÿüÒoêõñTÈ'pm‰›.áÁþ3ˆO½g=«¹hÔd3¡jÂw3š<ïIí²óÓ"ë‘eÖÉφ¾Žçð>t³½ù‰yçÎEô=³£P*à ^’¾)vWŒ<u1Q gá—YúL— ÏÍoR…kÈ~`gX`·ÎãC·¾Á^ioxh¤¾/&5a«xLÀõ§Â¿Ÿc‚¼¤áÿ¹7ŸTóºÇÍE’$Îeçå}…ýÛåt@~kD$ã–|çÄHÖ©/ùò€ ñklir%x ÿ•Í¿²á—aÇÒ÷oÁ¼hÝ®Ž‚È_r'ÆZŸ­$ÏA[1ÖÈt}¬ŸÏØkX¿öš±Ž»k«.Îg“´úNúZôn8¼Îy·û~âHTTuÖÚXðÕS…ï:à_Êï¿æsÁÞ´º^Â^<·²a|™{ÝÎî^I iÜ&ý1~à ãe 0ƒßçÿ/7p¥ÐÍýWè~Âùý]>Ìgô3WÝÐ÷佑`#Y÷Í`—ùüÊKªÐË} ñèí. è9~D>l¯ä“»Zxê©xwýòO·sÚm3àßêÍS g;‘¾“sÈGr~¦öP1ž« ¼Í)T•òó\ðg{ÆŽ#3OœÐîu‘ï.ñ-F<É•Y^=Ò ›KH¿«÷«-[HÝä·ë—¾º²Ã»Ù‘ï…m·¼Z^Ín[ÏâHxì&ß“œ¤DìujÇ Õc»/Õühû­ù}o1_é›ç¶‚gŸV ™Ÿðn(·¯d#û_©È†W‘¾„Ì¡ÿ<õšÖìßèƒôtÜ?Ê $ü/òÓ৯- _[6χwɺþ³¼—‘¯†/Ý<>h—a´ˆ¸’ÊÖr1Éxøùãìb²ŸÕ]ãÍÇÁ§Æ—#~Ä_gó ‚ŸD}. §AÏÉmœ™©rà4æ­÷ ¯ÈòtàV±í‡w“dþÙ®1àkØýxÁÅqýžàund½]Ü· Ò¯ Ýœ†ü𨫪n÷rð‹yÉ3Ÿpýp•z#Yàedeç»sÀUßãcUÃä9¦¦îNà`ü³d²Ï2§Òd-p+qdÅ.²Nto,§ñ)|öúÌ't×÷í¾7@x­µÔï´Ý°3ßþaUGØ‘ßé}à¯ëWÔ©ÊBþ’?ï‰FÊǶN1_ Påo¾,%õ+.^ ¤¾Ç"eá©×­K¸sxïÄüd=änbí3p × ·>è°~oÂgÕˆûg|Úù&|/ø0óþ‹à9 Í'jqŒ«×É‘î š—WÇøö…2ku“ç©¥§ ç€m[‡Èþµn×Þ˜"þež«žßñNŠN"ë½*L×~‡ÒœÖпÓíu*Wa/ÑýmÕú佩˜ïçè©øØ Ýb…O®“³ïNB%'pÔ‡“wˆìËxõÝà¬EùpÔQ¥wÛ‘÷;Ä£À"Ím&ý²œåIÈþ?ç¡Øƒ´ØFÒŸ÷kÖØý®¶ží˜¯Ûþ]¿¡ß˜;—·(‘u.÷ÌgWç#¿V»@ún~-ÎO!û+07‰}¨s¨Q1¾tñwœ.ŸtN 5 .¥H9¤`|Ž©\ŸMͲ?hø¾±¼FRÏËÜØâxóD«ž þÜ,Þ%‰ï}WÿèB|s{zG ß;Í'~ž&¸\ |úŠÄÅÚÉ;¸¯÷±ok¸ ¥ïoÞo"|[eŽä7¦ô•Oy G—ù í;à±ô6Ù7ˆ/žiÍ;.B E= ;Á‡Ì’2Èþ±Îìñ×# \_%Cú¥yYˆ<¿ žfõ/Àúó½Ißw×Þ³øü5JÃñöyð-§sbS÷Á/²ÊB®LÜǸ\[ŸUÃnŽð+±’z[¯…ͤoúÑçÖ3AÀ¡„¨ºg–›*ã?눞¥ç%>ƒnêÛ‘úéÈtÅ×< ûFû'®ˆäAܵ›tn€ÝÚLnfçŽhN6 ¯„¨1Н!u¢¿cl /— ÛoÈ:É%³ï7ËËÚLKâü£9â§5I=æÖ üÍÿËÏà›ÔH3ú8üÂç²§îò>20ŠñFpqvŽÿ…ôee½T¾åµ»»òø³Õ‰o¿@®FžýGHÿ%÷ÎûÕð;©ó˜§‡O3©³ö™ÿz—¼˜Ní>Cú½²ªþr¢Ö— ùæ©@ÐSÄO[kïdøy„¯‰ªðøðÅ+'È>剾ë¸2¡ëêâwÈ—\Ã5dŽ{/î>ì#ë‘$––›á<ÿ~^Q²ŒÂæNU|¶ _–™Â8’5­™Â€“>Wfe\(T3öÌaGŒÇÐT°ªö`­±Ë¨ã6äu½EúÆÙÚ¾:CújøœW)A÷ ¿}ò.Æå+´|+ÙgùùWÁSb Ëru[èíûééyØO°L ‡<üƒ¶Å%¤„ä{/*įL¶>úqþëSôHú:xTxo?óèÇ\µ¿!òÉÎf›6‚ýæ4Ž*>‡þ.…YÝ!ñ­±]¥€<׎ßêÓûÑ–ÎŒ•>‰ûkÄSÉ:RÆ‹;DI?|qË˰§…6É'àƒjµoÖ>‡|c=ViñA¡sL£µà‰Šov­`‡_5E9 >Í¿›ÿH|&Ô¢ùxˆø)^‚]%.%ïÑmû7Ñ&øÊ4p“Ô;9̾‰#~oòª2jZø5þ zsp`+ß¶ð[W*¿Ñ$䔑™óCšì£é)ü ã»!ÞK•¨Tä‚þR㟪âú‰a'«vQ¨VEYÆ{ íUå­¬d=)CT|_;ø`Þê“.Ы‡Çô•ЇëèöŒÓ‰ï¶Ÿì41£ž&MâäêoZRèR. ó!÷ —7= ÷€ƒFÀW¨Œú _^aÜ~á 4ØŸðÇÛ˜·-3ëÇ­äýT¸²°©ÞÐ(óx–£³ÿÍ(ò £†ÑK{á_òwYuÁ¯Ø§63†á:‘kEÆ.ÂNÝ/C^%·á0YÇ5²>7dé²R ös~µÆR¿Á©Gúl¤¬R;&œãO !}¥M5Ö­âNy_ÒŽ&õW»ä^ÂŽ2ŒûýD<´¬ å<Ö_–©yIÖ³N¬:IúÚúëûͪ퓺4וJú;[:²ŽØ÷>Ø[Êú?ç·Ï}~µÿο–xt¿-™Çÿ/r•üÂ}ø_޾$û_¸‹Ö~Ö‡^cØ×‡Ü/ ÙŸÝ+b°íOâ*Ø]èVárR÷gy}¹y*}äËŠt—ôùÃÄ ÉÑ;ai)Mdkiï/RÖp2ÿ)y_ÝÙÜÉEúd¯ÕÿŒ|=â·ÿ¾Íàû‘j ŽÁNìRï*ÛCNJª'‘çy¦¼UX{rW "Žy$¶Ïß¾©,ºðý=YÇæ7ÊûL0L~×Kô”5öžø’”7£,…qÄi}³ö|ˆÿ¯mÈåCœJ™4ØþTyô*å5¼L4jø£ÓpŒ3¼#þB"ü:¹oÿúšDe\‹É|ÿLæöUÄç)©ô |vt¾D·<µzì/“eâC=ð×MJfÿYØ…‚€ñä·u»Ä¤àoùÝù")Ô¼Õ›ú}P¨2…Ò§G wýÞèaÈãã"3R®—•w® ×35ºi©ÜË|qèÁÈ4ìÀWr±ôýuyá5àUˆó©p^!/c;ÓO9ǰä“Ã.UŸ\À9ÒŸ .â8³)Y°ªP*„ä3¡>{2¯´ä.}È#ºòì–~E¢÷ 9ù öI¥y8Ýä/0Ðò(^^sÖgiìüß‘“dOµ·ø·Jsô`w¥xky/ð“Úw÷sVbz8KÞ³ûiýù»ò(>Ä! ù¦Zo½ñiYdt–Jòþ/tê0^£|jÙÏ>ËoÛÁº›°Ïªµy˜Ÿké>룅¤ß•ÛdŸÝ ö‚޽àm&‰ú8ߍú»òûŒe=,ðë'Æ·#{ªMc€çNcB‡I=l}Oeé+s=ßÚ-•¬á¾÷F óÌìŸD¼[qa™±ûùìwÉú~¯Ú›ˆSvK=YKÖS­>ãø¹òÕÑ,}Ø»ÇHçÚ2à»Ïºé˜eæ„ç',Çýc]«ù\(ôÐAY…ûÇÀç½Ħ0NEÖ§ˆã¾­ qȧ…{’ß;¼fQà~\ßá…aYül›DÛS²ÏŒM=ï¯[Èœ=5ÆìÁ{üÞ <ê%uz{·=N¾ºeL3…ƒ/:ŒÍÂOK¦OH¦ ¾Ù½ŽïØ}E÷|ø¨€y­8ÑäLêÃãä‹wNŸ¡Põ$±¦ã³äÕ„\¸ÏÁ¯~ggb—¾¿±ÇvzÍ!pò#ð@PÚmb×ñs²ôÀüÌ·¯î(>ë¿8ϼ8é´½õÖKÈoÓU];\gŸ¨Ù/Õ¶sçï•° ;ŽM>^’¸È#óú0ÿ¦H!ïÙ½óúê׃¯ª˜ Œ[“ýÖ+Dä/ƒgþY,ÊÞåvÛI¯~î/ÎÆCÖY_”„8Íì²&}£‚y¤Zæqë±°~RÇí7Rsl)â€Ö· EEŒï€‹Ä}qÌ/>'zñÝ)øï›7tÄ«Šä÷>dÜI/3wà¾ÉJŸë¼aß!,c}°WÓã''¡×ä7ÍVŠÐƒwpÞØÛQ5× ·þµ‡JvðÓ„ïW'SèiÌî[7a~4×+‘Ë:W´nÿÊD~VÚ¼“i¼6áý¶Ï—`çUvoãàß'C_€}y3›{¿'u,ûª®Ü…_D¿QŸÞ ;ÏJy!‰¼<ãEÈælð[¿Ç*m¤®ËZoá*p7™¶ÚñÖm ]ævFƒ6ì&çØ¨RX3y^}¿Kx˜y`¥`àŽo²eçýN»Sò`¯É…ªðw‹§=/®MRžNb![jŽÃެ:…xŸ´eë…×~ªFî·õ>°Wýé6wWx."zuÓzI;ùع ë“ýè³9/¤Bþ™¡cí´€?*¾_Á é!îÛÌ>‚OïŽ%ë¬]è‚&y¤¾„㛸ÍÒ·¤ð73â µ‘AÓ=Â;;ªª5• ×Ó¢a僘W‹ÙïM6Àh†Ø Ç9É0²3ª.´`ñöSûGOؽ`~Þ5Èá {â%Ï8 ·s“º§½+IŸ¢®\F%äMzݪ0NZsdg;Æé¨ë±C¿÷M¨XP?¿^ÿT9’¬³Ü±¸6qÁ§ç´ô_Úóš…ôuv› ½ð˜Ô…9 !oò‘‰¡#õÜQ&êO2I}ïÖÝjçjNCÇ+Я³¢Â»`ØŸž’@¬1Žf7æ8WÂÞ‚âbŽÂ¯Ü «NµCß¶«•ž4’ç›q§oû!>„y£Ù¹ú´TI½Þí; >CþÖ™'Co,üUMM¸žá±û—: 7;/É®.ŒÃa“Ù1Kœg/Í­À‡ùçØØL×—tø8Vàzf‡æw†>}˜EïÄý,·\z„ë%~çþºupTäðL.Y¿xhÍ:R¿ö¾œtq(8¥ùi¹Yt™!/¹f¢XFò«Ö{•)‘w¬é ªàûˆ$ñæ%a˜oåÚ?0ϸŠ⻈»¡År;H±Ï$cÓbð=Ú)Qž+à†yŸ5ÀÏãøøUÉ>ܾýkÿWÿN‡rÆGtò>`¼Þ­~bÛïÒýÙñÆw<Æ|cuU"¯dÃËÙY›a·ÎƬë࿜|] |ꦻ~° 5·ô0ÒOÒqtÒ½žBî÷Aý0â'¿¥(©û÷æ>|¶ñX[ ü¥E˜´ywôW¾Û,„y7@úv‡ÇWÝIž[yïØ¿=dS‡û%sPö`<Öô,]AcR×r¿Nq3.Lþø›ÂÐl?ÝK¡7ýÊ|ÉFöÃ[%¯½{Œ7‹î¯ Y¹ª x·ç•S­/ÁÉ[¡dŸÓÈÿ)]ˆCÞA…6‡Á>4×½‰OK[!­¬>b’ñ¬– ç™.<7ÿÖ.²-ÑÃõÓžMɼE3k!tÊ~/óèÔyè±pý³{CLÀñ¸'1d?£—*÷’OÁ/>$DUa^¾ôþ5°?·Ž¬£›HŸÄq3)ä³Nc\ÀÇmÌÃBž@ÞJ‰ÇÂïžu5‡œmSœÿ!ï‡g–L!¿9¯qz-ùúèáï¢_LâÃ(ô ß3>“<%YùÒá!ÈÛ•Ò¶º¿‚ôY·Ø‘ƒñÚìÏÍŒ?Šž©d†²‰änçÁùZ*v7IB1AÁMu¸SŽÖƒ(È[İ`Ý|oV,± ã ˜¦¼“…œ¶°o$vH5ö$õï ]qÿŠ;WÇöë".¹4׳€'ø|6ýÞ½ª1ï­@œ¦gß©ÛóÈ—ì372UBêöTæË‡s4F„OÞ„}®Ê¹NúÃjg\YGúX¸Ä¦ªn=Göÿ¡¹ ×ä0}o_š(6àƒÞ¸ã´uôÔ‰n& /f] Ðc5˜¶ ÌwSmG’>Cù¡_‡'eÉs§Dß,IØ_ÌÜPRô/üÎbã:ê´àÅó=ŽsçunÚM§o@Ÿö+´ÌI¼‰Üh—㉼ÝEMþ~ôhŸK§äú‹nëÄðƒ¥ëžü‚{Ä'/×Ä}Ü?õî¢BÞêÙȾ^v œ·OÀ¿ä‡Þ.™%<8l$ò(pÇhךøÞg•æÂøÅÑñ×˰oIÝ pwè™&Îî\œJö%-(#ýä¶Û'¿_Jìcéääð%B8øGâk&{Ì7ÈñNÖAä1–3/g¡—€Ô ^ð›ÅŠƒ™gÀ>·]´[à–!¡¿`wjé™J:_¹üŸàŸ{×b]äKtóÁLGvè/+«iQßoø×›»ð?W‰cŸIþÛ4öóÅ…®ÈñÊq'ãÒõÛøàý̸ø:“tÝ8zd"Z~9ðÊ»¥|Xó³5ú³£|БÁ?×<ÏìfSÆï£¢#4wÀ.ƒ_â|_Ï'úÐS–Š×òwÐOD¡ðáŒÇ˳­2Иô±j­;€¸àsÎí3øt¥Ä &äeÇxq/éwÖ($bÿŸzô²—;Àó5’dƒSÀ‡ŽNL=öÂýÝO³t"òp ]µG#Û 2¸oà„½Â>ø«÷{«Wð‹ø´%FŠ‚ÀIFSÈ/ŽÁO<ÇoÎÅ¢cYO©F‰€|-S®æY“ze£ÖX²¯Ç“xWÈ=-:®%è Y/ÈâÎËMÖ'©X™’÷yƒÑëHÝÆ·[b+gá,á¤Ð-¹Þ/W\Ø~ïi#yŽz§¶›ðˆÀû&OR ·Â§Zyù¤óOÝ„Gß÷A|Ú¸ËíäwÌž›Qö`”\òEã nì3ínDe»ðtbÙ=YÛ¸ò€ï‚…M°3¯uŠ_3ñÿèé}Ú¤~…vêóyÛà”…Æ‹0Æï²Þ\ñÌGz¨Òóñe®øø<$¢xÄdëìu$ Z|Å5ç@9ÙwÜ(õÇ‘;òdÕùFŒ#¿¥pêŠøëƒç²ˆ¿Ñ·Úc!·ÐlÛuð¿”UfºZÐ+×¥M)[qŒ~ü]‡—¼ÿo} ¸ëS ýÅ4ß {n=¡ Þôlw¶æpb ß0ü˦BOþyÔ%¯?€ðF~gA)à‰.c¶•+ü&úúSñ&È•ùS÷U܇UúðäípåN?pV§æ} Î\}„•±ðÍÌ-ăSU¢2zÐw½Ž°pÅîµ¥‰æ*â$× <Š©~cö<,ÄÓf{ü.³Ñ̳ý3æß==î»)Ô}°—ì׿-:11ûÚ®x¡‘¼ÏéðÙ±6KšWÞ7oyûI°ZÙ–HúשŸÝ{v‘YØä·Òõ­£¦í(~±3æ0©×d~µÍ 8oÜЧdIòðämÃZ§àß¶þ;?X“:¢€zç“$¼þñì‡mãš;¤oÄžì„ÿ<Ÿ]^@žgÉ-/uBÞ•)¡¸¨. x¼~_Ä Ü?rM£Î!è9=@Šwòù£¹OÁO´}RâïáhµOAÉþ”-²*£Š <½»éÄ{èS{[Jr!þº6Ký2x\ÀùŒ Ò¿%ùô˜—-ð8Í¥ì;ð%^³ÿá(#ä´ÇôAä´üš÷!CÌO;<å&©Óôˆ~Òãn2LÊ]?¸Taö––žf\µkJs~gi¬’í„ÿe¾‰é¼öòËfŸKßp®¼ó3q§ø¦*Ku…žë2Õòs3ïÙÕäyaÑæù“àMõWúŠ×fÓ¨Žß¶úC¯I#´gdXa-Ëæñßä½ñËü ¤?FËìIøkÁ;)þ]zùòÂ]¯¶S¨¥a£âêø¾ÈÈt·„âbvXÞ2è'ŸÑçÆ—lÔÊ5ørYš°NòépÞ¹ŠìÓheÚ‹óÍ(w _GåVª É·žg 3#þ&¯Ö¾ÀHú‘[Ë1ð‡ü÷îˆ?1Ê·Ø@âûó“p}ù#áFä=É­'ù!ç%ûæfHÜ(k8eùšŠ‹N@ŽÉ|?üAþWnWÙÿ‰ìWorã¶{’$Xœñ[®­, ½ä/-àuüJúU½ÿqyY®È^1‹Jä=†FÆm*×*>Ò”öš¶½xV)д®ÎˆF¥ 2ب3"oôã1„½yßY8«„ñ¦ì<·©qÚ͸×ß§fõE†Ô½òM­‡üMj“X+q½‚Wß5˯'åHÿ×P¡õ#/€©KoèJc^é1ëŒHÝצM“K`'A¿:;´ÁÏ*¤|·ÒèQ{V}`c Ó¬«áÇ–œ:±ˆS©ó#œ«‘¯^­gprK¼|™]r2²tÞƒ8ï»[“qþ²Ás„¬'êëm }Ôâ5ÓŽ¨!þÄ$ >ž| ü–9pöYôí̾XàƒhèAVðVѪ“sO0~uQÃtà)5Ýΰùx‘î¾w›wè!œ¬/|‘Çyè-4†Mm.ò=;., 9Qc/F^Â}Ë<‘ö¬7²ÈÎñãEêb Œ_ÑKþòø³zÎ9è'òü”ª«ÌûòMÜ8ºùŸ‹ªËÃl\7Ê+Ëî#ø‰¶¾¤ÔoàûÁrÚÛŰ;Óé—VÉÀËT©½À 6;“Û_*%Ý©ap·›‡™ü/ÑŽ#o;øˆƒÓØ^Œ/\¸Çäð•&÷sy<ò&?Ἁ&Ìǯ¹ ¥‰ìwüÅaæ1âFzåmWR‡½ÊuðìÍÖíBˆ4䛕¶ú;©ó—ä`†¼cçž$¤Âï}É™$yÔël–Nðˆx¹Ä“°û€AçG#¸¿÷ÚÞS¤.Í]:Z¹ó1Ùø@‰üˆ¦ºS•Fúoäñ?;pÖ»S¨RÁ1gïãûÔbÿÒtØIPdŒg'xSL$ ú ]Æ´2 ö¾ÆïO"ä§µõæÈøMœè ¦ß¸Ü™¡»Òºð³öL›Ëà-þƒ‘½8ωùæ¥5È÷}Þ7¥ÏÁ.¼·[É1}˜YŽ-&yt†6gÙƒ°—oS¡--¿Gá°Ò~ØÕ³¶"ÄåȊ׳Àë{î-ókÈ~sÛão­.)kD¾ž8pdc*ð@å¦î¢°Ï˜Ž<Ëqø¯_«C(éÏsxv¾ ŸBU8lÉ}úù-éØœHx‹7[*éoènÇgœ£V?˜^ƒñÆÙ¾VÕí$ýënð'Ã.b•ÂEäÀW’N4ŒíÜxØ÷¥”â{çQß3!«veAì>å5ïn òÿ³r izÙÁiQ¹y µØ$ï&ð´r}bÝ›}àœ%·jÀ×N±ùL#Ž7óNÛ’A£·þm‹\ÓM?7ùšma<µNš‰ñ5xJņsº¾4jL¢h„âEQÏx仕zÞMšÕ"°7E!SKÌëJ=ÿÒ7¦Žç®…^R±vßøgÈÇðöžõ‹‘5sK‡‘÷¼ Å’w/ÔÑŠӗѨU.KôûúhôfÍevÐ[éAÙ-wšÿæëÙGŽiÆSèÕ'˜¯f5Ò¨ÿi¢H¾írnˆ›ìcYÏj/~€J£gtD¼Üþ~øæD©åF Õb‘ðAò\°òÌ·±ðIü¾nÅ#WNŒwÛ7ÎÐgõ¥wi¼TÚ¿÷K¬Ï·¼üÉ¿|»µí9psÿ§bQEÈëÜoG!9Ì‹ílÔb:Æå·òú7às~áÐ%öiØÏ¹® š:ð¿Óröòú)ï6ù¸ÎýÆ4Øß?GK&ñjÐsÅÿú^äÏÝ{šF'E+¨4nÜ>ÕM-é’I¼KêOŽÜóàH>¹µÍ~â”ëÐ%.jͱ}VGÃßÊ\iÝ)hz¸z©ùá`ÜE£Y[K/Á}"B/ˤ€6­Ûµ­Ò…FOÓ¬žbû”Å·#/,jdÝ–öƒìs§t9XósØËó‘ô¿(¸×¤Mú\¥/!ë7KÓWE_xyF1r|_×ß3ö>nB£Wþ<¹z¼q8èwìøÄéÏ2-b4ºK@q…3p7›Éä€ì±Ò¬³ì{ò«Ôó'¾Ïì礃UL~â K¦ÑËý®n©×®I7ÈÉè“ý¯Ë•Éz¯zÆéª;hôº-Ôg:Ìj…š–¬û8kòçˆÜGàÁ6O#Òï4]>}; pÊw²1¼ |õ¿Ç?g»&Ò.Jìç3wÂï3"˜™4„¡—ÆÏ­[þµGzlºº}ô‘¿y”­ø]veªÆ™ ~õ:¿<§i»¬‡êQÄ·þs>LdýLVöjR~aÚz©~à§lG£'IOQbpý⡽V—`ïQÅ/cœ)wn¸>ÏÈùd—ÄüìK „ž¢üýKI?â°--Š🌤[ôWÐÙÀP'yo›Ûr¼ú³æß?îqðÓ5V”?8~|Y2\M¡š¹œHšIÎÊ“>ž¹åó}È=— ?ý`]Ày×ï#/ÿîGçO™ …| ŒÇLuçG¯ä5š…_ÆU¼å,óå–þ†|Ô<ô0ŸYtaÃ7R§•»å‡Ê_ÿtch]e'Cùÿÿ¨æ+ùì`G¡?XŒ`7®?BnnÄøÌ¦ôK/"þ÷:ôœâÚygàw»‰á{"ÍWâüxn›]fȳ’ºeÓ®ñ"®0L]eC|µp9ò q5€uåóÝà=¡æWvaþÿåz§Ésޤ«¢Lš§pÞÎò  Ä¿lùó{dÔ!7•Yç¯CÏ7T^8 ¾ŸÅY曽öds}9?üÖc‡žžâöp%øWTÉ$xDàsÙÈ5å©ÓÂvä9žv\ÓÜåQ2u%£ü0ò¼<ÿÁÌåQV¹Ú6 yFÞ›­É¥°«+[GÉ~6Åj'Þ®X 9To £ÃŸx¥ÈúÔ¤°aÓ2ä'Þëk[·t–’-í&ýþ/_{üç˜ôú÷çÕ»q¿íò3çFåÅú™ç!¯{®2wÀÛKîŸé›C|Í®4±¯žÙ> ù‚¼]·´VŸ™ä»_?ŒÃë×ÌË…!ÿ,+©W^N¿Z^H£g.Y²° ¼"óÐx›õ% ½NhM!=ynâÀ¢EdÝÌ–ç;¸^ƒí“ÑÏö4zvæzQðLã7 Ü7°Žÿø à˜îU¶<Œ§N?‘¶ü«I½?äÉ]5ŸW š|«dò¾ä$pôÔé²=Þ瀃)#ÊKÁ_mÅOÎ:u9‹möq‘u˜ÍKÚI]qÖÍ£/=¶aüZ‹GŸ‚uV’|½øi®ÖK5²ò´5ñ-Äu݇»ðÛõV–\Iøg…Т}Àµú_k½¶ ÐèñRëGÙ)Ô³G­+Â!ïî›÷ü÷Fä5ô$ñÙõŽzó~§¨þOÀWyF~àʉýŸבú‘¹ØM›æ§KFòÔ賚ÐKA²f©m2ðˆ÷¥Ø/äùcä¤(Ôÿé•Ë”l½ZiÔRy…ºkÀ¡ñÄE‹¯ÿµ—Н„…6ѨIë¬&¥H=èÐÅŒçï¡q†&*ìòaÈÃà oý…]ûÿþηÊô%‡x—ÓÆŠTð‘Ü*ßDÛgíÓn¯ÊÀØ]Ö’©gÁ÷£xn æ{5ÃçþM›æ„ÿ—_OA~‹x+Ö°úîßû”,ÛúÙ&z þÜ¥»ÉïüÈTùï¢Gx‘ç¯ÿ#7[™ãÙ«¥ŠÁ×gORè:O ¸6“zQåÎÛ1ïÑ?­1¤þï‡gØ'M²NíÚÂÄ#]‰¦áPðáØx+™ü^W.ßýì5rxظ—ÔéqÞµ }…Ó…X¯Î¿ä†.Ìç2u,M¿ð’}Ò’| I@þľˈÛa’#w@nû¶µ4@Ž·jöÃ3õ éÁjôÆV®;{_P«I~ÇοqÝ‹¸â˜*þ°R‹£ zOËpª}ϼ¬£V¸¾ÇÉK—awE •“ñÙ`cú %øké-…QŸŽÖˆ~8†|ôé5Ýí#ˆ«¡Îíì)TwE“å÷?JøŒ²yÁÏÒwí)N€Üü$]¾¸Àn+š$Ú\ñ9›Ë}TíÆ÷v k4+®¿+D*ßÿsôü‘;cÞÔÊSî^®%OMgôXƒûWn|þ î꿼†çòØE*ýïï³ö$„Ýî‡Í^æé‚=˜FîH@£qÒ–¦€o4̤8 /žÉ ºÌE¡6ôºµ€÷½°ì¯]ÙnåÏ }z";¬,»µIÁ´ŽêðóûÇr²UðÿìfyCäG>Yî^sà+ѹôÁÃä½ÚÅ')û¡GÛ.ùÀ'ð‹ô˪*Õ°O½- 7ÌÉó¢ÿ±_jÕÓ$QðÔé;鋇0_ÿcëÿÆÅíÞ¶4Xøò\šÂ¹}¥À»ÐW¯yê‘ï¦ -ר¦Mú>Ñx½üñ$çU[ðÑ&¹M½,jÎ´Ò ÝG¯ºº+ë4y^š_Ó‰yüsÌÜX_¥CÆŸ¾Á²îÆý?Çï›`´â y/½VòóòÜÐÚ`¶ 8ý¸Wu#xA`g¸|®Ö²e\›ì÷Ìè9—¯\ÜËg×”žïÖøzŽû©_** þçÌ#ß¹q,&ÏíÃ/ÌD€év0 r‘ºŽ4•ä·®.U-d'­ˆ½úöÀÁ¹ô¸#˜ÏÍÉ„Bwø%ùìS§z±óØ‘÷YÚ™¤n¤­À%ìßÿSÓŸD³¿¥Pm2„_^‡ÿÚ¸Hïx†|&apgvP6pgÇ‚­Æâ¿óŽÑ®X<…óÄ¿ñ á¼(þ“÷„µþÚ…sæžþ—~²÷KzB/9ÇkÔÀ×¢Îg?c$ïåE˜– ¯äÝP^—Ž<ÇùÝó¥ÑÈóul¢Ü‘?Û(ey‘õÞ1Iw™Þ"ë}Û~ ý½O”JˠйïOÍütúôL.ä?[Óóy–õdAâÞ»ÐãJ¥~ØWÔ¶çìû€cêg-Éþi!Ùo‘|ñŽôˆy™hØ£ÎHûmRg2ПǎßWï $MBÞ9Ÿ¹ì„|•ßœ߯͜Ëϰ¥QsW^(`ç7:Û!ždçZí^¾W{³S`q ø›QçWä—u,–ákhÔ¬±‘˜gž_³S, yÏmûT< ó”¤ò|Ì«èóœ é+±Ì‚¼Ï«W||{ÚÔ() ~yD"Ò¸óú­ÌÛAÞ÷÷uOçc^Ñ‹&ný¼}–òª-ç+×Ëp³àº©_ ÅÉ~›}r/b>©M‡ZÈ~Aª‘Ṵ̈ÃôÙË9}È Ê’ Þl€<Öô \†~³÷º¼—?Lò´-¶!þ& ûpcÿõ‡¬7›³Ï|…qÉr^ ûy¹e©‚Êw~Ô;‰óëV²Ä˜õШy^/J}%~;¹=ÿ¿ý€k±á·²i°÷€K_ö·#J‰YFu„ÛKܤ"ÿ-ÔM,[„ñe¿-xöl)Æï3¤Ã”Œøç½áxôWò¢{þN Æ¥Ê!Îþš¼Ä˜ì3—v¦l-/æ‘Ã%¶†ôgö¾ÕÅ¿c ¼ ɪtpÕA±Û—B ܧ²¿yQn™D{qôjÝIÖëF.ëu‚_º¦ªçšcÑRë;ù€Ó®š—#àOÑ|ŸR÷DM]ñ#ïϬ<Š8`3bçuôÿàµbæ GF î}àjÅ'ðÅÇØ/Ïàßq͇éâÀ›´©Ã<¶ˆÇ‹EJjá_96^)»ÿõ·ÿêŸZ¥ÌU,N£;Y‰)¾¬–Åõ³?Ö¼9Ñ.Î^è†\Óvq74Cß)\æ³±¤ÿ½HT<7©Ë¾ø!úÀ ò£¥lßñÿèKWi{ÉsýÎÆo±¤ 댿ü]»5ð x¶¼ªG>=¿©òöšze¹°â|ºOf$îSÕù4â.ò®Š­ÎmÝ⤟§º ynå÷óYåpòXŠùqò\éu¿ó’¿r¡f*õšÝ_ý”$Yü_ü·ÐW#ûéœ~ñúöjø(GúìZhÞDžßŸY&ô x’x÷‚}ôåwLíë4ò“£O…t–â<ëœ[çT‡½Ž-—¨Eœ²®Q<±zŠoñ¯>õ7_ jFÑÒqkcw^'ÈÇË™ñ‚íïÿi¦aâ>»ÿŽ+1kÏMR_“ï¶åxâ®+½YBÛ‹ô×É=?„c%Ô¼"¨´¶X9‘ì?çɲú/¾ÑVô½Ëü_ùе»ûÒ¿@;õÔ~²Yj½œÔ&Ä[š._¬Æ^Ì+{Ð÷Ù?üVa ÙoèÌ,CÝŽ¿óŒ'øçâoÖüÁN+Ï÷iÕcÈ×ÿ=v)ì ë̲·päí¹€ü´ÓèûRØÃÚ¸õɇ7}X%‚¬#²öåÿv‘3 m€&*¨mÍÅçÓ >Ä‘Ž×®g"êœn«ø¿vnSlŸ-Ê û~ÏÀ<†üÛ%/¹é6ð"į áx÷ßó\ô>Î!žÐ“ý/ÑÁ¯sV6+ªœßÂøó.Ñ¿N±ÆÈAÔz¡~§[­\”þ’º*¶Öbÿw°º ü?̹+Ï ùbꆑ†È/³oÆš¹NwÏ'½ß¼×(?¤ žl&Þw,¸8Ó<­>LúÁ¯{Hú!%Š5î &õÉWSØÃÂæ“R\`_™ƒµø ÷¸l«©Kà‹Éz–¼—l=:VNÀŸG<»Ÿà<7Iš1ô§[Dú¡&5™geÀOÒ¾Jp°/'$ ©ÊºÈùßdÞÇý|X§[’gHŸÕæaÌ‹&É!—Ó‹ùÔsÕK Ú¶Ær‚¼¢«yRòDqôVß».¦oÉC^fsd!¼/ƒ;Íœœ­².J ¸Jçq ùpéF)é$ÌÏn“ëÚSÀU=eëed?ô„Qõ}£à×]·Ã8ªïüp|:ísÑXðÍìÁŽËîkA.ÑÉ®ÃC§ÈºŽÃщ°S¥=Gï ~ü÷HÍbr*ŠGÜIÿœÜ®1-úï‘Û/Rm¹TmÞü³r‰žÑ´…$øt*Ê\…=q†¯d~¸í­¤8u/+٧®;í,.ÄmÌ Ü‹ø¨¹âÚE²Þ«îü.:òƒÜþ:þ-‹€ÏÇÕÄ‘õß¿*Ÿ¥«’÷Þ.üË-ál ê·Èó§~OîÃ~c­å­½ðûœ„¸Ý%„Ob%ûó$‹| û#¼|Dúb‰,Šx³S¬†<ž5î~qæZ3Q’×â{ëžË ldŸøY6?àƒ^µñ òÉyIÖ%ä—-#ýeƒ Ö»Î/õ®…k¼'úÌÉÎU…ÿ3§ Çbž?‰¶û‹Gôz¤Ÿvż0 ú)¿ÇíEö…øŸcÅÌ£§ÿ ô¤³–!Ò-Ð{‰ü§pØCQÔ'eÀûcY)‹žÀÎ}Fä7Ú“uˆÿ9R‹_õÞ†ìØmM…߯r³²g€œz'Saïa㪋‡'®ã;Iö×ÍfX7¹äò¯¹íЫ¯‹DYO*âŠÞòG¤È7BJŒý?Ïy£¥¿<1ûù:g؃]þ2G²¾[Ï«¿³íË_¹µç³¸’õ]B dýeЉ·ÒêíÏø¢ðÀý¥Ž%Ùw2ÊZ?eùû?ÇXÖfÁßá_\"#÷Éz\>åv²?{Θˆ鳕¹Y‘ëI=®3s˜þ¿ä!wë•;øV„s}ÉßõÃûƒÉ~O~.¬ þ˜÷?Ç‚'ßîkO;::Ë‚?ņݥïBÞï—eÒ »Œ-¼Ó†ñf~;ö#|.õü£„<•?²oüOèêÝ4 Ý>ݶ|¼H!Nãžé¿ó ¦.úºø]×*Ž|QOìè^yÂk‡þPôuŸùœÎW‹­éÃïr¶ó#ŸÒ£h “u”×UïÍœÁü/Éé—õŽ÷Ƥ‘÷Vw‡f>4Ó›¹4¹WðÁ_ܺ+þâ#=aÀ#’ì«øx¿A™~/Þo û°ýôâ‡>ð/ƒ½Ì¬¢ð/žþ3¾ÿoœt»É2à˜]ç.fߊõGÍøùÑ›<=¦bÆ þòÏ17emÉ,~v{xáòÁqqOaOFïXúÁÒM{ #n¦<ÔH$}O5ÇŸoÁõRš JW¿þ9æl¬*ì€>JžG|¾øwœú)Úo+0þØyÁž2 ÝsÛûv'𨎟Kÿ[ï—óÿý_RR‘†UBi‘U¡ˆ\J(í´÷^W{×ÕÞ»”-IJöˆ.²g2B¢…DVFÆ÷~^o^^·ßç÷×óvçcœq?ç<Æ9’g(ŸšôñSdÏÖÌ7y9º´¶Aò["ºwkäì±ÑOAMŒç­ÒØuÓ»×]¢]—'? ¼`o"ùyÆþÿ¬o×_i¼Nõ:Z—~¡ú27ÇulC§÷C \‰Û’$¦‚øÏL~sÙmÐ;Ÿ¿¸× ý%h)‡ž¥žf|ª=Nuâ_}ç†?Ÿ?çó…úÀ…½Yt‰ùI—ûo¿œÜs~ ´Ìš¸4e,ü›äÔ±bbtîXÑòêXÄi!NEíëÁ_Wœ£4äþÏÓÌí­¸*{5‰)Óô·½È¡ò_ °[!Ûýæ®NEq]>]+Aûôñº)ßBñåOg«®åB;«àßf?¾sH ýW¯»fÄ…öWJÞ€_ûçÿÉõ¾Ë@¿î–å£ã~»¤úf¾èûOà »èY˜ºú±7І¼F­>9ï±L…å< z‹ódÎÁø—ò?Ò&[YôiãÂnƒý´Oý¿'3»î¶Ø³Æ¿|0 œÕHû+Øï  7fû¤‡¡ï‘¯¿xãw–ø÷¥”‡eüÌBØŸd1“‚°'®< ,«`ÿ öëCž¶‡Îš{\ºÄ­~`Ä€™b%ü×ày®O¯ÿ‡ï;:뾃ï~½ó["ð¾iXè)ÐóÏÓ_¢é™ ð.o4=#,ìgÿÁÍÆ _ø<ýýãÐïÖGSB7C›=d£äèÞý‡ÎdÐÕ,õÜá:çttíÅS˜g†ÐÝùð;Ì&e~§üÀEí%S&B®øÂ#§Ó}”ãGgÐ}0Ó§½àw0—ãrÒ/†‹ä÷Ò³˜Wð»S£Ù¾¾ð§ý“ö¤êC~BuòÈá{ÿýœÉáàŸå¼LK²sO•¦,¢õK™Í<Öcÿki¼;à'šñôZй–0'QQÄIÃÚn”_ÃÖfeZOJ ¾ûŽÖùB¸£uNQæÂÌ+û2`W—O½Jõ$·Ã4[áP7òðûÉü÷ûßýŵ. ”‡<™Ä]ÓóWNY<™_^$Qþq)!ï©/-†¿žQ2Z8|eagßì\Hzs†ßéò½7í¿>{_ãõ"è…åüÁ€UàÿÿÚgšö­+òbÐ8E?Ýú—~œ?tü3¯HFñ(ÞOÜíÐ¥‰y' ÅKBnRÚ—¿ |Õ.sÖHpÁßð[•~tŠÐ:¾·â;ÕzÙåO|áË ¡üºž~!K—-ÓU;Ó{`·M'ñÜØEu«&ç<”7Åœú'Az}Ý¥jÂ{…›”ÏÆdßâþç°£1™¾CÏ|(OÚ…5|£´ÛSã¥Èžß(³¹ ¹w5°aþÝ?àDpg¥ïƸ’æõ°VÁþ¤4è~Ø_ ¿äû±;ªÐ“O g?Ó9×ÇÏ“x`·‚. ;7‹ÎEòÁ/cÐ ¼ÿýü·ÝxÆÈn/øWÎùŠ‚€c&e >QÞ×x¡´yüðãcxØüOö»Ü"=à»sP’qü£p¡OÜtþ:`h¢Ú_¿œé+Ɉ[ ¹qÖ°Sæ…ý÷ù¸à åw^ŸÞÞ |t6WæÏ¢|ºK&œ€üšxÕݤ:%¿ÛýÓ>3¹É?Kò´ðа#üŸ3ê[·€O&*¦9–y”ß!Alc0Æ1Ïæ×ò¿Lc—P=éžœ¢[ªu;_aüEY»ìA×´CA¼A°ÿAƒã\Í’Ðîÿžÿ~v_úøìQr€„ÍY ½5y©éâ:fg?¬àU£¼[g%ʾ™vEò´^5÷+·!üßÄ‹Rö´oÃÚhÅ{T\Ç×7ÆNCX"íý^ÿßq2Ýï¯øOüþû3'ȇËü2â2çLÐÑ$GyÓ;‡¿|J¬8¬~þ¿ÉyßyMoßý·ÞíZGñUš÷$ð!fëÂä,’§Ý˵ÖÀ?5uÏ‹l@ÿ~5³?‚Ã6Þà†ïsn»4Ò¹'ç³Êà'›š*Ê^„üm×>sIUòݧ¸@ ïEÜ\=4vž_¤¼ÁÏ‹œ“ÕRúå+m_ù¼ ø–T¸&à"嫘àv8©©.‚výÂî½âüúËT¡Ÿ²ÆqSwì«b*Ò¹!ÿÏÌ „‹ÒÂGA×ßÏå)Î¥¬t2åÓçsà×ùöppí°)ð-A1*HÓ ý9`K849¥n ð#ýD^[áFÊó\Ò0¿9þ¦rë†ЛǯS^×Ú²²°k¦RâeŸz¨Þ™üX:Çú}oíƒh:ÏöÏ“ùTUÊü¾Ë?²…ô¬"ö ­ÏÜT˜Í }÷}R–^‹Ï.3"èTÐç4eí`’¯ï|t…3æÊI’‡Û®òÏÿmÇùxßÓ}ÀK“«skT0ŸßO¦ó%q“Ót®uW¥øëáÿã§p‚=Q53E;»Eû'`üáû£úº ï¾å_–ê~ùÛÎïßÿ¥cPESžòdÌÏ»QµñB¼$_í¢“è¿¾m.ô0ñÐãÂ:¼Þ7Sƒðë÷“swoøºç2æð× :¿º]œ³[˜îsõÕ«kÂ.þy/PÝhâ´ë?T謅q9M—tݾYO•¶¤<àÖÆ+=.1¨Ó¦%¯ ·ÖVÜòOAkƒÍÍÿÓ¾Ó²”;r ·³ëS WNÊÃ…Æÿ_\0V;ª:6ï?ïý.h7º§j½¼«}Šâþ¿vV9ÝߊòÚ3Ö“p2{ÃÉ©¯0®ÿã_új®Þö´¸ü»}Žæ Ïäì÷3Pª1Éôל³R¶ ãÏšòdi0ð¸°ÇT^v"¿öHš £’ÈÐÉëäÍ·÷€7ìVmÃ\ø=/ÛWûнϻ_Ô>B¯wÔtB®ŒÞh)(ãnæÅÕ1tŽHsžJ˜zHü è¥)òDMxë5ò:p6ÆUØ™÷*ÏÐ/¼ûÔ0®¤?Û/P¾¯Ç—}y!ךÛè~»uúKª–˜æ2Ú ÿÆÉÍ]Uì¯N;®UJ;ü¥/Ëâg5âˆFãˆ5°çaf·–Í—~˜±9'ÐŽfÓ{öÊãm*GñNibòBø3ñ­£+oäÖ¿®²ªÔ–Ñ98ùÒ&ÑÿðŇÓÔs v%åÚ­hÝ7 çWñm# ŽV¢ó\%Œ'}|è å)Ñ 7†üL;-QkŒ'Ô÷ù™¹”ož9oªÝwÝc‘vtKk=úzžÁHrq†÷`j¤.pÛÃåëíØép?}½cˆƒ’öÝm‚=69³}òaòÿøä½ƒj†À¿Kšeþ{ìó>ñòe[aº2r˜ÆÅeUùˆ8³P x«uÉI|„ì]¶¦1Ý[ ,evÿ´-¬¼$y{Tp½þûøûÉ‰ÙÆº¨Šñ†š¥ß+iOÖŽ«ê¡z“¶¿RÀ· ÞþÜ(ȱÇ×Rø]¶m OC¿µ~²å— Ÿ?ÏЃžüÇ.jEŒ.ƒŸÂù3Þ˜C&1â{è¾ìÚýÀ¶`”õð?¨þóT÷,ôó¿çß÷»;Èß°µÙÔ œ‰WUÔø$¼n¾U6Æ‘ßt<ä`ä1"Åè¤ ÝwÞäutøóôÙ3Gõm4{¼9Mòo=Ot‘äÊÃøƒÄ\®q#žw¹$0 9Š+Y4 < É[R7òâs +Äšø0kaßL ÈÁeÙSˆ×l.Ž»üzâþK eø®åêP¯¹ÏÇ¥lvœK ç{Òy»%ÃqBtnƒà<:ϹYOæ.å¿[&—àNþ†átö ØCÙG\$ÿ=ú^å©6)}Ò=„ñûŽ÷lÙ‡ñz(ˆT¿¡¸c9ÿ×M—³òÚa´Ïê‘âÝ‚q%,ÞøDWíøx¤î"yhÞ4ßóµuüüj ð?ÜúpZ øð»]Ž­À¯ò¬¿úÄô¡Lyß< .· Ã~ÚN¾Ó~Pòßö˜¢y?Vý+§Lç ý÷°KÌ<«ËZð7lz'ß7=&ŠäÐzQJK·îòHàÚî%!×¹‹…yá—ú*èçXÑ}o–Að=Ä&ÉÇAŸ~?9Z«ÏÞèî„j‹'2zÏÐýä³ùˆ´“*?Ÿ õ½Ïú^¸Àýçh5%Ï £ÖW?œõ7^þ—¶É³íF ߎ¯Ëýc¶¼ñ÷÷<'@íç¡´¾š½×üè+άG_þþž¬¥3ýEhê̾¼Ó潞ùí¥¼ÞßF÷ú"Ž HºŸgp¢44§Ã?üý4->rx]pïLÿÇŸ fXšŒ± üPÅOßw¿/Ÿ\3Á|=»87 'Ñuž§}þöëÒÅŒ4À|µëíÓÀ'—~öŠ%”7®û€Í¨ìÆË·WšÇ%Ey{'£?‹ˆõ§O©ã¬ŠOÀ8/ Ÿƒ^yžø’3û?þgDö›7Ѝî„î¸'¯ÑÿY¤çž½wÃŽú}Íy°|ý3®Ÿm::g¿Ÿ—c¢?¢ÁÇ´8=ÄÇåG•g‹•€Î?rkgžA]Zi_hý¥'yßm:ÇÃm6Lu<æ8i½þ«ä2ÜñäÃÌ7ddÉé‡„ï» ÒiŸ>oXsàÝ;¾+.-_JñâÓz1¢ûrÃ\¢ß»·ÂUðãlE„kn‚Ï>ÏCÆNcS?á7¦·VNB¥á–íó5»Ù¯ž|µÌðrÉ­Ôñ´ï´W"xr2{ã^²ço[ï2´1.AûÀ1àÿïqpB''° ¹!‡NJõ2÷¼AÙsKW«%ºðOFû³y§îÿ ¥üÖ<^¬tå¢Yøi‡V1ìÑy¤ûš´¼eºZïikð!4n ­Ã¥ûÚüüèÅàäähë_ÀïÁ%>V@OÓ »LmÉ¿råynÆUȹç»ÝlÊ#hú8à æœ¸ÓüÕßÒ.;µ0Ÿo¤Nž•D÷•ås+ ϱíîŠ"2ˆçÿ÷d¦Ù €½ˆ6ŒaIÐ>|æý ˆ[´g„‹î…~ä•+žk†=‘ªíí‡^Ä&MKM󎂦G\™âð/þ<]êm‹íÁïh­q ´Žk×èQ~öRúûá‡'ðzù+ÚÐýìûËA®ÍöDPž•øgëÎGÙ¡Ÿ#|àßÚÍä«HûÛ®oâë·ÎÇ|ç¾Kyœ|2Wš9L¸¥1éü£éší©Þjô3÷îgà…¶ÀÖg΄wÇßKÈ£ÓÙ.lÆû.ó–æ¶ýãG}èZ;ái62¸úïgv¨·ãÿý;3`›à Wøo¡á7ËÀ×d¡Ë‡¼O2˜Ù.®î”5ñ´Ð{kÒG‹6­K³÷†çn£ûÄŽv‹gA®|/sezü'~a«íúUõŸ}¬`nîÛÑn⃽s¸)_ã™Yü˜—VêBZ§zú(ì݇~cêóøíÉçµM |ýÆ8| µOžzö:ÅŸ™y óˆÚŸ¼‚òZæ­×óˆŸE»3¼ø¡'õÕ߇Ȟž­íŒ„¼‘½=z^¥[¶šöÃrû¥÷hÓzÞôÝv¦èß÷kÂ6IÂoø«‰÷êú€!VvˆÞŸvQ„ÝñYôá]0ð9DZA­~{|¹±Ø Ð%aDC7ý†zÚéœüýüëç¼oÉ¡| ‡Ò?~¹ï¶œzÇîˆÞX€ï56çÁæ°"&ES?ê¯eÚ.ÿû=ÓÝo·ùTø‡Ö£áG?î¢õ‰mý=øÞøäìèà–æñ3Wæaž63­~-Ž$ =^QÓC÷ÝO–¦cÞn¿Bï,†¼Z7éxXÑ>cðâÎû„-mç{@w>ÿFª¿ÄšÑx­ ñ|rû©cCàCË-p7ù£zâ·ôÜþÎÇ}cªÒÓR:[[sãúýäX?yÓÿ¨‰ò@7œÝ üÖ,]¾s Æg¼]çiõ›pdq~wÊ鸷tfO}¿ÈúÓtiÏ’·( ™³«g– ÜØBñ¿ òKÊo’ì0×rýyÌ#`—T:p NÊ}ö-ЧFg`~ìŠËn]ˆ7sªô~Á? · ÷ŸŽqå<|(9My™êªžù;~?µo¶ÃOIÚ|©98Ξp"päʲù‹Èȳ‘øgnQ视&—åÏ4ZìÊq;Îq5 ŽD]HJހϖ¬æ,:·ëª2ΖòUÓqx0{ù™)°ÇŽbê)%œ5žSùÁŸ\M¥á+7!7™÷¾‚Þ‘÷«÷'~?9ŽÉc~H4vé—½\‡‡6ÜÝ5³z©7³¨ò”5xÅë¿z¦1™O¹óüýäØ5ûÐ:fzÂÊ`,í³zî¸"¢*u˜Îÿ=U¤ºóF©Á­”ßP#mÏø™Ôî–!ˆÏò¾- ÿÄ‹x2°só‰oзÚ:ØïE3^2hýB­ÀÞíDLî8¾[ÞÝ5–ÎÝ}[è¾ ôMñÿæ²g9åU8°øÍ=Ø£ô·œœ"áÑmä_ÎiŽÄxÓÛ¾2º ½[ójèxxbV øiœøº-ã ,}õá,ðëÏS³©¬‹ö;ÒÎŒ¹Mû®ÑÛçÆÐ>YèŠ~ÙŸé"TÑû~@˜»“Ç]ÄÆÇœ¢>@.4›ck@×ü!M-é·ÿ†8‹%Û¡¢g÷‚ïNû®÷6Qž§›b’ãÜžÊß0}L£'“·\’;Lë%ºÂˆ_6/{̹gÏ(éâÎÀ{Yr|wÙT§Ù6Þ qVÖѼõš¡‡÷…ä£vý•?“Õ#ÚÂhÇf÷tÝwŸ°¾©öSþÆßÏôõx4fA>N|û:ôÕR´}vÃMʳ€»&AqVäײ_-ê¤ü´¬¶øv­ãÛï_ôpÊÈ·ø¾–·ݧ·Ë0þdM•LsèYXã´†XÈ{ä$›óvÿYŸ üÄ¿óŸ¼o!¯¾ÇÂŽ½bÄÏÒç*:7A. #nWMë ½oŽ^¦uóA޵j·ÆL¤}ýsã)Ïd¼$;BüŸÖíáo0Þ9…?6BnÂ=èî†?¦È3&qK‚„Ò¦¬}¯äÔÛòK=: ¾:»j^*¾D>™ôc èìë¾ f*›â]‰î¯Ð¿ßOŽIÑL£ ÿ¡k¸‰L¶Åk³’õOâs1_ÇÕ»/Û?Јy ŒóT'<ÙͳNqUïÙë^À Vhæê7ÐS§Ö¾ej˜OÛþ°Î°çûœªFéžõ;¿Þ·ð_"=Õï«/²bço(þ]<‘‡þ¶\úªàí…þÛšŸ7·¤_è‚òH{P=ª˜Ëg7?B»á×¥ç)ÁOJüîïó}ðŸo°ÑqÎîW¦:ìyვÓEÊœòâ”ñé› G/¯©)ýט٠ÃûuÀ·¼muÞ2-°;ê_Å/ ú')gì]n&„ù¥z·>oÄx\›–S|³é³šè§ÕP] Bë#Û i2¨ù@z üŒ7—WòðÛÒ£ç®èÄÿƒ, äLÁoÖ¯¯úöBˆgÏÜÌ‹u6v–¶ƒ?¿ŸÿŽË×Öe2ä…™›tå¡üý¢Î|ÁHèÛ †çtôçô^S^ø¼8,ü[(ìÛ8C½FðÑiëÏ\²cµï!Ÿ±Æ?7!Î`úð{´4Qýƒ<ÖFŒÓ¸`cùRZÇÌÑ<(Œþÿ‰«ýd€Z¼¦3»Á‡l“þ':ˆ³¦ž+½¹‰OŽÎ¤<ùsW¯.iò}Úøý;¹ï OYNùZ× ¼Ø¿åkûrSÈABüma°w±ÖO^P>؈:î8'ÄžN5‹?>Iö¼0NxŸö+ñ„<æ§<ü^ û¡f×fX‹~?d^=NÿüòßžFh£ó„²Öo¬üÉ_¯mºœ*.ÝY–Ï`nYffHú»veÎ~ø«§Þý…½7þV’J~ïÅ£ë+Ž¢_ŠŒ¾qàËÑS É.å‰k©mýÏú‚6ß½"Ðû÷“ãÇut™­Ã$(…æA¾nþ(”â§u•O¯a\¡‹ ©îóã~ e¼÷ûÉI=]^y!|üYîϼB7·+&­¡ºõ³/¾„¼$Ÿ(* uÀÂpVXÝk=5˶qByáÒ¡¯ïœŠCBß+çQý­;ã1þ¡b´{ÿ†×ÚϯM› {ðçéèÚ3ñ&è¾WV]$@ŽÍñØUêfþçwÜó}ó8dîtök«êó±ÙŸO=Ïÿ•G‹ûk; ¯œv&ü»ðÅÌ+ã´Ô}MصDÉÛ™6 ª_–?Ñ@òÛ·s3ù—æ×ƒ{ŸAJºŒ¿eÚ/Ë6†Ó}í1ÓžBnR*iêh¢ÉúÇhwkMiõðOø O¯ï¾ä¦,¾ï„ù˜]¿{Nô‰ZÛèöñ×Ú×q¯n®¡¼ÕM‹` RÇëmk¥{riŸVÿïò¼›ÆÚã÷Äà÷2ðÛ±õ­ìK†òónZ;´dN—ƒ£s1{?øÌ_¶èp§Xëc“6ä)ÔáFÀÁå”ïýŸ'Ó‡·äy¯“Ö¹}ŠEü[èÙ~¬ŸÎ$W¾z}Ðogeyk•¦š¬Gœ¡ñÕ‚<:õÎÅØŠòý·Gþ„‡í¸ÝpòV +Àÿ&¾¶œŒùŸczý§J 8žû{žéždOz•×a` r~K³ûØg”ßDìA²dÝW?u?¸žÔ]ïúŸø2]^{, ýY˜ÆÉÞ^g6Õ‡_þë'4䳩~ç§×â3œ­CêÖTçT×¥_h,¾ß>ù㨠Ëñd–È’ßb~ú“úÌëS‚öÈOŠ2kìu7sßÐA-{ÈË^ÓáR9/6⪽ ÚûÌ«3T¨Nóù hw[¢Ó™»Õ Î •ΖoØÌßONÇöM2+ÌfG©ÒØB6g‡Ç•žðû ï2ô"ÖB.ÒÜTzàçåÇN þ9É”³t/8_u?Iãð™ó¾~\Ò&Gãá2àaÁÕÒI«0þø–EàCñ Á‰ <ßEw~hCŸÊV FŸÄÿ·òö*7ìG?G>†^žœ»½‚ÖY*CW|G?iWæ§Þ$iXÂA\¿´ÃVþYYˆtA>¯tŒßõ®yÈ€^¬¯ %§…ÎxlŠ^ëeOyâòÄ* σ_Ìg÷çÛB_CŠëPÚmš9Ç0žÁIâ¼ð3ܲR=(殟>˜wÁ)iiÌ/Ã=cŸÞcËðv¶†-¿:æ/®ý´…Á™b”ú‰Aë3éz±À=Ÿ¬Št•{ßÃnŒ‹ý}–½šƒ3íWÜaŽÙƒ¾š0m²SæÓ~ˆ±Þ[p:¿W(iúm!ïè9.ÎÙiY¹Œ|S«èß˼rª“T¡¿ÕÒZ. ol9¯~þqš]GëÕãÇ~¥® ¨éC?v\Ù5/ÑÏš¯©ë¯7‹¼xN‚ü$Åá³¢¼ð®gJ‹hàpT%pÔäVå—ß(¯9bJõ1§´O`p\åxU¤áoù·Ôêz“~·-–3„¸hY7 ŸËýrBžŸÎK¿©õ ¿.uÝϪñ-kq½'ÐÃFÉcRé™Ó‘¨IR‡Í ÛçÂÞŸÕí†8É LL¢{MQrÏ.“ó] iš1äÝß´…ê ³„\ÚÇÑyŽÓ6^¡ŸÚ–tû1˜»>Ƕ þKp“†žkˆ¿Ût zP™Çµ½~]5O«ð˜‡lήÛ;5«÷°9YìñET°ÚØþå Ùíеã_þA¯‹êŸ4¼¿Ô9êžtú$å¯ã»y‰…y¦h«ŒwÌ=å|¢s‘æÊ #tOàÑðWÈsöAŸ÷TïIvu´Ô;Ð=ÑxÁ-ÝK{yïÄ©¥ ¦×•gzi 6ÑD8æZt#Üúœº×Jp:üéd…Ç¥q·LU“™—)Ÿch¥´Ë$ÈaˆæÚ3Ñð/CØäªÃï*}Õ|LL ò˜X¢ãŠq'(‘ŠÃïÁ§mÇ\‡(¶¦”Ö©Düëƒh¿@x–7tpÝ-Z«‹qo;¶oÝG[ÈeØv ­$øw"ý‡×½_RÒ‚L(¿bË+/ºW·¯CZ ¸o¯3síØ™’bÛ¶C—hüÕ ª·³Ê“ê©„ÔYݼròœîòº q¶ñÉçK¨î€Ê¾ ¥üï—­V; îŒ‡ Øà¿Í÷?!¬ezv´õ Ÿ0æàÉmIõ-T9;Û/‚ÿ~_- :ˆÆ7´1ocóí3Ÿcüæ·Ì$輩ãȲʯbÒ©š}òånr~î6Ð#Ì`üTŽÃY.›\Ð!ê¬Hþ³‡=#*þŠ“ÇÇ,Z¯ñŽ‹Ô¾¾9Z˜-†¼Ø¯Ð«i‡?™îîœ(=MÎõíGyr ¢£eVCÎ??R?z$:lPÃûIÍ>‹¥R 7ëEC8´,¢åìû^<ïžæ¼ÐçU?Ûiü‡Ñ å´˜%8•òÑFì®V¿S†f]žÇÅàä-‘v`0õkß¼^ù×?~†y¦jÛ»R=«,Å¬Ó Šr7zSž†ñeÏ”—!¾‘-Ò±Áü]w˜œìfpô—À Ç8bVK©¾Ìã¢û›a¹ªÓv@ÃÙɳ(pôÃÞÇÊh'ÎR€Au9Ì~Ь´Fº¿Îÿ¤|­ 6qCÑOuZÎÀÿr*»ö°q`ð%Añ4’ßí6¥ð 6Ï´×”€œ¯µ ûEÆß,ä ç¡îÏ 4ᯄÍݺàÚ Úú>ßïEÚp¶Þ~Æþª·­‚ž'Øy[Q<êý0xÆàP µýÂt?yCŸ>â$õæçK0ŸØè yšw×^»æ˜Jë¥k ŽŠÑ:ÆÒ ‡0>}Ý ;ÈKúá¦Bø‘ºQV÷1¯¼²‰A.Ú$ÍgÐzkæÃ>ØÑàäOº2S+ûç{¯Òºvxæ˜ûÀç­a“ëv-_üŠV?ÅàÈË„ß[‰ï5—WUbq·e<HPžófç!o/oøñÉîí34a×S±¥}¯ñüOva9 k,~ÂÏýìÍ? ~dØÎÙEu»sF¤2a÷>>7ý€¸©ïAx(pžÕ~¢A¸Ë’ŒÓ¿EöHié3Ú§ݼõ† áu½”"æP:¾wôÉÙ¬Fð%ú H|i½”ê–J.4V7¿Ï‡HJ€.¢÷~9=í³Œ¾ =2|#\4í¦—{Õî³¥”ã0_§‚éé~÷Vs®}°¿_ƒÕ¿¼Â¸RÎ|:¸ qDϸJ:gñE}3øQ¬Òv£x½Æ™ê¾äN»êyu{¦ ró}"ò0ò¼ð^Sg5ä0«*eËð?Ûè­j'ü´ Ï*Zk\Àà¸-¯êOûnû‡Òi}ÿ.¯EØü.pDÁøï½Ð-Júšsõ—l*ükÉÙÓÀ×ÔË—pás eÏ/ž} oãœõ÷€‡z«n¾‹¡õÁ¬:ø#±>/Z¿çós¸š÷³wu/øê¶säÉЭ4ê±úo¾»ÉŒ|ëÚjJyäÞ˜*­ ¾žfk=%».8ÿ0ä!úȉ‰Å”/f¦›èï+R}›ÎÛ…]*UÕÇøY±B‚è/!oK¿ËAȇ½êA~Çæ´Ý­÷àÑ–bº'ôÖL'ö;i,ßH'ô2²óE¢<ð+¶gï}¼,?`Qƒ~S®úXÓúµŽf¶øÄj>ß CñºGf´ì“V΄ÛA_VJÛEøkÕZ–Ma0^/îÖ¡{bŸüÛ'ì*?®Ên¤­tˆ€Ÿ±vẠcÈQÚ˜Ø6Cؽ >'0˜{ú/ß…Ÿ'>Øfü޲Xmór™þî˜>ì…»¯â2;¼—o"- š%4û(øž5÷X]üÍÈãÅÔ ;Lf° B€ïs.¨.A;ž£2u:À¿*Ý>{‰k s­Eä üvñ%YÄeá•Ë-©Ž´F×´ ‹iv§NfÁö ´¾Ÿ`Ó>81ÏçëØ*üß×pº^ð$µìÃò12”RUu6ü.ûS[Ç??Cë©Ó3_0˜•ºë šg°9†«÷{6P]‘¤Ãá0Þ8³Mch]0Úž+êÂaª3~}Ï‚ð_ÕæUò?§]äƒÞ”†ló3œ»,ç·ÿ)ô)eÉ™©Qˆ÷»å?к^ñÎ}-ëon­žß ¿6qv’Ñ䫨ô­À²ð7W¦¾½Dy7’'/¡z_ùÞf¥ÆÎTU@’~ ›Ü¹-ªÀÏЗh´ç׿öVæ'` Vºïq.¾@çŠß®ùv¸ãiêYJç ǯ^²ó‰ãúz‡ xŸ·Y!é×YGÃW"}íTÔu®~|~½*8™luLþ:ä2!ïîùe´®¥%µüYýhæ)à^B›Ì Â]Ó‰ÛM÷Â.FŸ8žãü³Žy1QãöÊ]¼ÉŸìéüŠŸÚè/ÌñGÖcøÅa»Ò³._§xû~z*ݰñ4‡^U8ï.Ö¼Áæ¤ZÊ»´ôØ4ëïàƒ.£òÆŸ~ÏãN2p­ dÉÚÏð³âcc®¬Y÷ôâ’$ÁÏõA ՂлäÉ…+ÇÃÏ ÖöT£ûi¦Ü[æ~‡üzÏ{±”Á)±Ïˆ JF\2{yšÂ ØÓ õ]ø_Ì*۳Ǘ&ÇOØBñ]žRªüÚãØco ãÿš‹^ÑzÊăƒàkæ…6eÚw Œþ‰qU(´pz9ã®ñkA¯·ô)­oÛôã=àWȆ+ÝÐ ïš-NºïÎ,3bi7›Eåä€÷E|ƒßV “¢‹ÄáÞ°¬„=Û¶[fpIäP+àW(p:mê+ÌsÛÛIßݯä»\Š~€q¥ßôàÖX½æß¥íS@÷NJæ5Á_Ýrî†sH,Õáþ’ Oüu¹¦v rYbëU|.\öaBä0K¥k²Ù7³a…œ…Ø-6§Þlùsiu63@iýÙËÀÕ´v=·(O½ÁÊ¢bĵzZÝãá—§?ÞYYÝKyÇoZú>E»—¯$Â/ ÉtªíþÄoP¨´>ÆÏ÷+ÈÄxtLÔúmŸœºÔ€y„' %jÐya%Ë '%FÌ1Ð5Ñcpèü{Ÿ1Â5wà?¬qé㦺tÎ…*¿(ÿsÇò:mÈpûÀ{'Ê£üМKÁŒ{Ùü:~eæÍÇá—¤Hj¶ãû䢩2–ÀOã‰eñï€K9ï# Çb‰•¢#˜GJíâ-¶ÐË9,öVÚoô•µÍ-E;ªº™:Àí’Båýõt.”5Ú:ž,]:öŒ•þ¶! |µ¬{ Ý~…ëýÌpÁ÷þ7ÒÓ'W+‡BÛ³™™¢®k1Ïíâû%Ð'×nó½ëLs‘• â ×H{ÞxøA9ÏÕú†Ðþòžµ£—0¿­–Ï-Ä€7I‹bíª`/ ó‚ÓË`W­žo‹¬ý4Ô¼¦®Åx·KùÔ3 |l¿Ã‘_9Zl,ðñsƒƒå³7ÞlæŽ'Åññ Ž®œò“tè[X®éÐ3øi›„“)²ÙÜ"¼zœ/øX¨­ tïn6ã€ßÚ×ÞP=ô˜ W“ÑO(ã¹&å]LÕ`U818+®ŸÑT óLr*aÿfý‡šéL®¾âÚÿ™t`r¹ƒiç¥X- \ÈÓ—ð‚Îßî7{@ñCð»Îû«©ŽôU ªßã§?ªajHû•\•Áã„ð.»‹¯h½ûÃmË'À©«–¯¢ú#;gľî¦ÍúEù…W‡g§P~uKùs0N·Ë«G×ÐúÚçMûvA¿–¼ir <ȬiKC>Â~ø¶Š©‚¿’¥%²]¸¾8üÝÝ#¾bÞ_µiÿ3ùÝæ¶›jÐwÉa§oq-ÂJ»`¿‹>.wܸQ5÷½p3Xðªß\!:Ç)òê>p7j–k#åvr¸ýß|Åðå#gíùøz"è£oöõ ütý¨}ItÐì›–^Kû(Û÷§æÒþßhã*_ÐÏ‚acBñN:§¡ÂúÖÁÁç$Qÿ‰;«‰]í4¯})o§`>a ­å h¿á‚ɧlðÙ}Ëk_oÄë^-…)G~QÓV p§ ldæé»Z§ŒüèMÎì%¥t®'“ç£êVÈÓ©í¦°£®Ê/ù¢ÿÔOç¶R>Ú¤”/³÷UÓýЫûy醋ݫI²}Ð üTYsû]Æ'?1µóŠH9ÊË¢ü2=uˆ×òçžÛ œ á3Ø—q{Ël+0Ä8 ²·10þÔjÓgT‡y¿äWû¯®À£O¬×/ oªb¼:³'M[ ~†È¾Wm~¥ôßjₜèe û±õðÍ™ËaÏ«æÄ\¯1f3=X¯š)>5)W8`ƒ÷<µý<†y.ªQN©£}æ¡TÇøÖÁv.MGqis Ýp_yøÅŒ/±÷ÖN‡žŠZ9 ¾–åÌèŽÎ¤z&³——’ž)*©CÞ¢œ0 º·®-IBŸ6§â?ÍÔ¥}ûgvÈÕºÃΣ]à7ï‰û!ïÑ~rMåÇ ¯†Ê CÞµ?å¶P~ú%áÕ TïÙuXØqsëšðÛmwß5žšEy:\ªŽO?3\¨-“~Jl= š2!¾du¼Ÿ3…ò ®Í9Luâc2Oi?N‚¾œÈ×t¥su®Ö×à_ä¬üv×~¯“í”|à_p™Üœ0´Ÿ÷²xRü•œs÷X´•°[Po)ðÂ~ðKS'¾{7øìY.Ý)Ky$2ͳ8NÀ%ƒGÖÃ{¬˜™gR¨¾ªö­Ëè/®K_‘î¿9{0ë§@· ÆNLɧý³íÉ´?|ãE(­Ïgª'~‚>ùÇì}¹8ìcYFçÓÎ9$²§Ò¾Ò¨ô©)ÀÿóÂÛ„Ëo¶„AîR%ønÍ#;çjwfæïfd¾›íF~1ž»ø8píX™S?7Ÿ”ç¾Ä<û%ôrOèÞ ¾;±K;=ð+è7”‚Þ§tùDÈN‡Ý[µt%íÇÛ;íâé¡ûÜ#Ï\/õÝìãqýÖ¼_ÿÃz·…ù~üno'þ¶þyÔ«¸,øÙ¦ãì[¾Ð:Ø”™¯ÏÃOò•Ž­YCõq€g;V]lNŸ†¸‰y!™ò±Ìí6¤û?Î× N¯YC¡ë¶!îôéÔš§ñmyx„ýUôã)” Xû4tñ,ÅIÕM~ü·V²™•»¤ÙœlfF@y¥:pØ/­®Žî UhML¿ãAyË_¾Þñ x½òÖýgç£Î×ŠÆ ænæÞ1•ÐCöÚ íÛ¼ oWZ.…ÌßyÖ‡½1³Ú@õÝCR³ÂE@7³2eä_,ØMë üã¢!Þ¡‚{W".Ó^¿3…ÏÉ>…‰»_ƒîžÓoÞéa´ ßy¤®H窃¾}„Þ:h¯|±íºLvâÉñ }ùhåÅ•#'íwÖ ¦P€8÷è{ó®¯ñ{ö´‘›¿0Þâ“jÊi)ðã/L3чÝñ;½)—ö³jGv½Tßré‡Ü¸ÍQ™==œÁ‘M±X’ú.Ÿöue+žæåÿ]Ö‡¼^ò™w”Á\b:‘üfM'n÷™àSN¨Ð·¹è'H`¢ñiÐÙ~nÃý¥´Ÿov¬2¤‰ê<9y€)¶¹÷ô€ûÑ/:y*?ÕLÒÍ+apª²Öη«‚ŸýsŸq'ü×í—*ŠUà_/,ZÇ¢¸å*·—ÏzZ–I¸ã¡u”äÅãV‘ÿKÈQ2Ssü.àAñâ°ÖÊ; C”ïŠ÷Ðÿõâ óÙ”O$§q1Æõ=h3/pÝu_/×C裚ه Œ““±Oì—å+4ušøý…ý8k½ú¨ÄûlÑuª3½L»Óöñb… ¿¥OZûíƒ3mýìtÿ§Ôu¥J⚪q> nÀßHí]r+ ï¶L3Ê€Ÿº½r¸ú^¬»õ—/â?3I=àtá37©›éó{`§oOŸP;mwåê—ò'Ýí¿SÞ÷íÜ’«0ÿÀ«…T oEž+† ÞYCUtŽÏÚÚ¸é'øê{z‚˜9æ“r_ùÝç@ÐíÒÊ_¹¤ÔÌŒêŸ÷¿Û¨ ?}OÅ—Ù [¢š²Ùô:G®¿@ú«uìµÊrZw’Þ½ø5­ÏÝUùòuSå:æéá$(ãÛDq\ãÔ)„g.›¶?¾†Ùë®?¹ >7îÍ|È“ùýZG:·¦ûõÕ:ßuØãömØkÇÉ~…h7Ï»LB3îÙUR]¼$7Å…é‘Ö‘Ã;‡é£Æ[9è³Å{æ oŒÇE5¼¥ øï4ÌÝ! \,½òêÅ|ð3c¯Ö®wˆ[¥Bb¶þGN“žßI7Ä|·+U ~€?fçõÁÿ ­·]^6öDëëø-ù´>k”¸‘ÁÜ5é±XÂ6'jÿù+­¦ æ’%óG©pèùcr]àÊ"»Ýñ{à—”ót^1ÍOï=~_*ô5ò'Ú±?å³£üÊPœ“ª'Aùú'GM}Mù®ž7ÅÃÎ2â3¡üEɬi2Ý»AÿÝ•Á2Ài§!~ xµKy¤/˜ÁÑ_¥oTŒöS£,1_ß½ê n⩺Y•ú1wZDçc8£ÚJ§óÈ,ãðaËö9SËÆoÒz/àýÄþ ÷>wß«bcE€O«osXŒñf¼Ó–¥:eÍͧ€®gÓ,ûñ}ÊžñöÉðçjïpݧõmý²b:÷aµõÀØíàä—qWÎ0Z¾¶Ï™Íïm{ºû>—"å,¥|l2Û¦Kcú·§ZCõœ¯KÀïO?4I[e5ƒÃã™t³ò“°*I}'å%<÷ý¡ ô#íÅÝg7;>h»·øã¬÷³]í†yü\µò¾¾³s§Ý“Û8ž ¾GžŠ±‡|Ûªm×L¡}æMsÒ=!-¦b‹ì ÛÖÏÌòÉë/ú ø•¡ó¾+q{¬’WãsÌ+ò „‚Öû¶~“= ;•0°²,öÛÆ ÁÿÎï”]=§x¦­vèå—j2w\Iç׃çË߀ݭVS ~Þ2=Kç_‚.½ˆqÖÇ”mÁ¼οÏÝ?Ê£à¦5ÕÉ›7êx'ƒMyÚ¾…N-AŒ†·nok}Ûf¿¥PDååZÄ™‰Ö‰W- gJñ¹«—®Žh¯ŠÂ|Bú«MîC^³Šï-ª?MÃ$&ï-ø±ÏTF¸|HäàVØõÂ,ÕiÙðOÂÓïäìÀ<øƒ»¬ ï‚¦{}(Ïneúi>èÅæÇÈ¥àˆZäPòÍs‡ËTGàL\âåÂû~Ðù ‹¶ò§ †•’\4ps|‹Ðª½¿WÞ~oæÉ‹v2°/V>:;L`—òw̪€ýòiWZ@õ’’ê]õÛ!ïE¾õÝüäg¶Ú=©Î]Ê_MçØËÞ¼¶õ‚^äo²PóEœWÀ¿„Mù%ÍöûŸ¥{ß™s$vÂaÍ“î¡sÙ¶‡ÃS±<ìözàZ9ßøn¼áÌŠ»„Ç*ÁÞÆžŒi×¾»œÔö%êÁs¥u`^!z3>aÜÞ¼7cÀÇT•Ù{)Ÿë°ë‘ „wþA« ö‡7¾ªaÐþÞëÝÀY%;ÈkdØ/‹éœKß “)Ð'Ÿ}±ãƒ€¿A{R½3à÷e$»fWÒ>í¡©Ü°_áç&ñÙÀ®»­‹ÌAI± l®Gìn¼ ¦}Ð"õ‡GoÚ­Ù´%ó 1Ý!_ß^OO]º¸üÈÁuäÉ÷•ÇŒÇÔÿdñŒç°—1VòZ)ßÔÃùÅ2 WÖÁ@‹y‡é\M‚BÈyØ5¿âþŸh/`û‘Àð/uQÕ£ø—/TE›ÉõMê~¡À6ë½}èò”׉›ò`Îü¦,;” n^¿ãˆãj>ãtzuÆ3ô ›r=,zS¼i ¬óLê·5º z%/<5ßÁ,Ypžç;âÛ(‘»Ã‡xõÂào¬ãÓ€>r fåoYÙ7À—ç·_ï&ù¶µ¹Aëäáëvå¿ë¢|›œ–ºïúE¡”ÇÑò|ÕyÏØ$·“¸|bФ"âe7³_fd×sï­žLçARKùïŽàÿqw^XM>ÆÍ5â£ûÝyÕƒ=•ˆf¯?ýbb¯Ó¾ÚFéÃTÞ!þQQ2ô?ìæ;'.øgš2 ›W¹¸ÑÞ;”eØy˜ÖoÓ’¼v¶#žÒN–O™Mv£ýÎÇ{ ”çë÷ÜFZ¿ÏêyüÛ y^¯ø›Û±¿|C'ÆkXhj ¾±"¬Æ!îʹešÌ`šÚÎ7¦x'º:ý‹*ìLÊíŸ&gÛI¾×’ß|õìOðƒYrJäåRøElóÀnÿXðctû„hoï¢áj©el޵ì Ê“èð-{ržÇ🻱®éÊtºO'[|ò ôêöΩ´ïWÜ<¦vxKÓÇ ª‹È2u¾{lVçCûÅ™U³c[£§2yå§-páúû‡šÉ>‚ü‡hô¾ß€8/àö–ñIx?LÃ2l-ä5äþ׎£°£±< ÎÐzaÊÍÀ£ETÔKhýÓkû;{è~n‚eJÊ4Äݾõ Žå´ž9åØngؽÍGòî|‚¼;Ûë §}Øœu:•9ü4qí ÉíŽ=Cç¼OØË'ÝxŸYRÝ!‹X£UtnÔWuövà–E^·ã>ÌÓpg÷+ºÿžÅÎdñCNgni߆¸ÌÌåÍÑCÀm‰s-`W×¶(¨`ž²+íL)ïRL…v<øè>ÏrÒRʃù¬{µ7çæWÊ_ÄQµ…Ý`/}¿J’Ι¾‹€_ñóãÕ;çÑαØÉªh7Vƒ}Qû#üÜšeb®€£Þ¹ ÖÐG›n ú¿óø‹´è~Êá{ä7IjŠU×Ó¾YÕÜç°;ž9íå% ÷±M]—Ù̃¾êzµÞg8çz7#^J¹èYeÿâÅÎHÊ×V±-íø¶÷GpÎ}`ω/ÿtg÷óõhŸÍzj—d9–j1Å3¾å´P5ä+û²G;åÿ o—] þÅ-Ø0xÂJXU*?.ï¥Î©sàcXàÓO¶h7ìhõ飓Ñ^þÓ5#Ðw—²ýA¿ÙqhßTªÇ t·*©¥ó]?ްÈî^÷²ô8å1»žFøék~ež÷n]~†8¦è@ZßruÈåÕ!ï©nËËÉÀ%Žý8FYpÂÏ_AG80<¶íäÃæƒX(úÝpP{;Åq5•\zÐ+ᢓ®¿³ê4ÊÁþÙkÉæÞ¾þ±o/Á^Úó|&€÷}®•ŠÂë÷ÙJƒ® Ð’F?A¯å»Ð9—I:3~€¾IÏìtæ#6q›¾Jí–,ýöf!p&óŒß0/üúøg¼º§ €›awù”;!ïÍ“¦L¦u>%Qóhðw™‡ùÀ&ŒÏe`œiü˜„†EG¸ñž“ØÞtʃ5ÿY%üXŸô·¼{)?å¡xÅŠã¾åX¹£?“Z.?õ©Ë¯Ž=£{dMºð¿tù¶À öp|å8Ú‡n1Íí…]egvÞu†¾†;xk+Æ£åð~uŽ:·û5àÙÁì î‹To(+Q„xQy?býnèhÖ£º!1 Œ7'Aù­é§Žã÷Å!Ú}/鞨í'4¦ngоrÖ~µàG„N‚.ð.R_úÒ&ªÏÉ?SÊþe|ʾyðË#—æ-Íߨ ÂîÏý€;ï—cœy+ïE=O€Þ·Y ì€þºÏ{xw3üë´<ÒÊ ÓÕq7ߥ{OÞiPþÌAÞ k0.ãµêaÈGSàÜí4>Gû§Ò£9žcéœÒ é`ð'À¶o–ü òÐæ;àw̯Áƒg)N¹}ä7`s“Úø3kO2ªé¼Bd¬G üøÕ¯¿.M_‡Ïf1›4öài8Kx Žö³~ðˆyÁîÄýÚw |5²íŽ¢ZrT·(ÊêÐÜJøåu‰OŽ‚¾q…7éžU‡ÛŽ_ë¿ü({]„þ ¢ƒ%ü 'þË<_÷!Žö|²Sâ%ô}FøTÆëg?0w1ìg’`ËløÁ¬õËõ`~Éì]k®üDÜú\âg!­Š58?9 ü°ôšy38«äüp˜üË@ ¸èu¿|yè 1Fÿ£;Ʀ¦•sú-;îäÖõ.­Û;t7$ ¾±pPòd_‚ÍýðžÓ½{‡À'ïCÜÆý´^´v‡ªVåsªpEüÍaè<) þ{ù¼¯¦üuŸ*Žx£ßÒén­°3YwÎLÌc¬îÙ¦ÒLy¨Y… ¢ü°“TâS ßêw ªÂOck&Tjè`^ó×WŸÄ8X2¦ Ð7×Owƒ1Ë Y7A/¹V£!ÄïÉž!æ=NTþ<ÿe´‘Î5øv3øÐ ež »ë¨hÿÁSÐ`Aèšm)ÉÅF\²IÔ©- rœ›otñÁ{ð1c\”æ™æ×ãb¹HqY€À‘é‘q­°rg;þããÃЫø˜Gõãà×;^[Nëy⧦ËaÜ۽įšלZÚ¯A>×Ïiyô8þÐ)3ŽözK{µvQý¼í”!_vGÝfb>ñö|ï`o£TmËÅ!ÿöüúÂbÀÏœ“¶N½ðWY·-ž]Ñð¼¦]û;Íä[”Çwˆ«åôT÷ô6«L´kèxÅ‚ôŠ¥Þfø|ÓßtÝí¬½ÖŒv]2¦—€üMjõnýƒ\ŸÎ)]ÖYž5Ä{>{mÅ5a]šî%ÿýóW©ÙЧŸ¢Ë†ÀI‡g)|R,Ê‹dÛµü5ÝKêŸyr³¼IIɸài˜»†î-õIÒºEPÄNwYØýÀÊdÓijI©þ¦¦›)q†[AOW¹¥c¿£¿@¯Âæ9C–nh…æãºgìJYèµ\ÿ3Z‡ï ‘…ÿGMók<úMÊÉQ¦óWEÃÚŽf÷Ñ_ס¾LAô?aŽOøíR‘ž:z¸à~ïÒ=àKP ‚Ž'ü=ÍzESaеP6ù)ÝK-ZU·úè!ÄwÅü˜»¯¾A?™šE<ð/JÝF’xž38jaᜠÀŸ¼‘¡-R Nö?ÅCS©nÉ´@“ŸTïv­üO´Ÿ6Ò'†8.°ûdþ è–ò“-cCëŸ=å/*ÉžË>±ä‡ÝÒ™ž|’Ö׃³EBm߇OÙåqAûqí»=@÷(ÝJkÄg©‡=Wh¡zCϲW!NJ¬çÑo„|/U䟀yÙD+¦ûÆ!S¹'­r }ìšþZw½ö´‡üpg·…YG]D+„AÎü—™N†>ù]Œ’&û”+¯Kqd9ԕΟiŒãÙþZØœ¬Ý´‹êyí"ûÅÒºÍôþxœ¬P£8ÍgÊ^ù½4/§_?âýœ‘÷Ù‰èßÿ’Ñxkè¥×tËøÁÅïV³e·¾€=`1µvàûäÏOçæ§JNÔ÷úe¯_˜yrãr±/ä}å‰*×KÆøWZ›Ä6bž©’ÊÓNC~ÃyW³ÿ˜†~×AQC\1 øh…QB4þ·¬9-ÎÏþ™ÅíÀçˆÙ.åká¿%ÆoInÅg]û·Ùkè>ÛÅ»t.8vmÌŒ§øÝºßë27Æí±7—ò¸³Í½­|W âäÑOÒ‡EŸd(/NÎVø;Ÿ¿$ù¡)R)|t¯Îî‘;ôÇóønÛuËMÞÝB· È/"={W¹ò&ü/žìžàsP&צéðÓ¸Ÿ»An£³º|ÎÁ.®ó³™pÿ÷ê_à‚q¦Í3ÛÝ 9sœøS·tÌÐÔ÷„©k ôS~ãð¶ë²ýóõÌc“Ä€¿¾ïZ(®:™Ãsj3å]!äÕz:·¯¾‹öt^ÆM—Â8N_ÏÊÏýZ‚þL<'¼.úN æ×Ä|c?mnE|cÁ.—êÔê¬Ø1ßk åUN.œ ¼P™·uo=›òÇœo½ >L6j•À¼ãlõÃÓ=?ÉIõj³Ào©ò]²CïÏ̤ü€1Ëv>ëÁÿ|—N²—Â÷Ž^Ùe‰ÀÙXu‘ýí׊•«öž}òfoi4ýR%´œà„Ÿ¹#³Úó²h‡œÆ¹º)~MÀ@Û´ü?Ýa…WS?å¯[F÷s&fK.u½÷q,¼¹ ~œ(› 9 ÔØl“*äñªZ‡)‘m8³í ÝCºgínË`Lú5ûÚKeîHÚ :§$yÃN¾aš ¼ˆÊ,’†\&ï[Ï-FõŽ”Íœ‹¸É{ÿŒÀÉ SB§Ã×óЯx½ÞA^ȹñ¼Á/‡I.òó¿-Ãgýîͧ@G¶æõ+R´Ž ¿÷ÂÅéT7kʆ#ˆ+=í6\!>öÊn¤}<6gn9äŒYÀzd¶‚ê²jD'n~‡´rŸW¤¼ïÝ’VÑT‡ëMÖ]àgøý‹Ì0Þ ºu§Ñî*®J#Êï`¿áZØ0ÉÞÔ/°'>mŠVyðó<ËU/ðÁ>y½<{sä`cºÏ%Z/¯;5=„ö?çÍ¢‡,wtÍx³ô<ÚGã¦úÂñÙ…¯À.Å é‰O‹½4(?_ˆÕÈâtÊÓb$2 >Z¿œtýèYÅ=¿–½öo‚ÏGè¿yjòÙéh'êh×¶ãàkôƒY^Ñ~å s Ê«pi–ãÌ4Ê«Ä#Mç Â^œíäò ó\=e°ÿ—ïÏ+Â|j ãRl¡O•órë /iUSól§û™O?ÜE?ÆÜézð×ÛûÂç€nž/¤%ÖæQ^ņôØ`ŠãFºgTþ+n)ä os¨_üâVVö—ô¸{ô*üpÅí'p, ÜhôNø¨®¬ºô¶ [® =+Œù,TÉà4½˜¿>û›YbÓ¿fÕIôÿ{ÅÊAÈñ.¿ûtϨ…~÷gÑÁ‘8Ó<Ï}vš“Q£re>ø•2OlJüÒß½TŸØ÷Çe¦(Ýë\´²JzǾÀ\ŽÏ[üy#R“žz,“öqyjßB>ÓÅ_4¤Yå¶òyÐûÊËö£‹`¯ú®-xˆ÷2¹6>9­ ¾Õ½ì¦õ‹C-|”§A÷œvÚÇ ü,]w<Õßÿ¿-TV%-•Š(TFB¸2Šì™½÷Þîµ÷Þd…¬$ ®D¥DCò)m©4PJýžçûøýå{ßïs^ãùz¾Îy×Yñ†ŸØÙª"K_ð ÷ß=¾ˆST7CÞºM˜¯«Â•‰ r.¥{ö>ôaó¦›>D¡VñÜ´=¼Í9e´ƒ#„ÂP?¬r|›Zh:Ò^ŸsnvŽ?ùfþîuÀwŸkÅRŸü*Xc3øºýï¦÷Ãðët±ÚxR/çVÇÄVGxP}•å5ø›Ë}‰“„ŸxµlÊ'õ›£Âi$ÿÍŠ/5¿ˆy&ðºŸÏÂ猎¯‡ÞSWËDzÞÈ¥ùcúïµÙCúä$íßgJÖ1^ I“:Vu÷š>çÂó`½Ý ŠüŠÒóÝЇ÷lÓ©où^ðÆ öퟹ½Å ñ!} 2á&ð×TN­‰Ô-ÅÏ>ùñ)ëôälüé:ç6èÃ6僄 Æg¸pŒ“ôï <Ø¥DÎÓ˜²_…=9,êÇ^Çû3 7¼â@^¾ôE€ó¿%)áÿ3¿(üo;äž$nÕ¹òÒZ1͇?%²„~%}úòVüÙzvjÝÒed 9ñpYý©Á¸˃%#}RÈ›áDî…z”üùµÙáñ¿/ñ}Óœ“¢ä^¯Í†S˜O†ÓNÎ^rªÇ§½µð³`»X²Žær¹)þÈŸ˜ÜhKÖW5¥U1kƒprŽ&vë·¸tØGꬫÜC`ìÅeë G~rߊÔ5wÌ;B±Æ’ÜcWv>ŒAö+›·ÿqBüónä øçÂ,¢E‡œÌnˆjØàïaìôo¤ÿñáÝɵEÀû¹kÏñ·Ç1m‡HýmnŽ+âJVÕÜÛYd_íÛ¡¿àzVGÆ®ÃÞ|íšÇà7qëøz‡_“sÛ5‚Wb0ó&ðïVES؉×h'äŸðÄ2<ù¯CWÈ*Ì+t·õá"àNÌ"‡x>â»ÃÈ×ax®¡¬Zÿ.È/0Ó¸ã)ä’b4tÑTòõŸrå*¼z_õðµùƒ™&‡ç­)úØUPcL ñ Ôkœ5þ}=è8øeŒ£Îû㵤>ôŒ¥(éÔ~ÏéI1ì2ä¡À7)Ò¿Üáô@#/韥/ó²„Ü{šyn;ôi#¶£/ƒôŸðmø \¤ š¶ßµ]e^¼¥Ò÷óÝÇû”)Ê¢ ½!Uv‚ÂÐ k çlbÍ’îèaþ™Â,Ÿš  ±?Œyf„Ÿú1™Faœâô»NäYù{#ôá˜÷‰}ãà[Ée±†¬Ói2±¾^%VN¨€ïû³œ0T‡ÝÆ­‘]Å€<SÔï{~;>vŠq&[ÓÏZWâã.LD`\Æ£k`ž;%ω^ú}÷xüߪ¦`¼·ÞõSñÏXÅþw,/Ùïnd”â½Ñ½—Yagö;*&tñ¹¸=›Ý³Éù ç«ƒÉ~„ÇáÝ•ˆÛÉÇ’;Á3ÍY¯™¯…K¿:žDîï“©¿` ;ΜáÙ«ºq•åÆC{ß`Ð>ŸGL `Ò¹Ó Ì'š‡UÁ v+*"JÖ‹–èÌvøžíñ…ã -ÿµwÍ~<êp^ÚÞf•uÄûl•9=€ QÖg&„;(ÔSB;f,á¿aÏ:>:¨’snqŒÈ¾vcNÿèKÁÊ`P Ï×VI%ýGl‡Þ²f@NtÝxA Ìo7ׯ‰$¼'ãèÐeeð:OÕU6CG^vø¹!ä{¡gÿ=ŽÀß]æ8‹;à/±S–¨ð(‘Í)øàõõÝéÈeŸñ»x¦)œ÷”ÄÁ‡Ælñ=gõ©´ —ÊÎÛÇA_ +/ÌV@~æ]©?eñù@ÓcªaÀÏŒé_Ïg.yƒRŸ‚Òµfržö™7é{æýÍÂïw98ʉñ1l¾ž~(ßÃg$ >àóe_ç·þÇï¯nÜAœNذ†ù¥J=–N†ßüÞñ ¬‘ÔsÅÿ´UO~hG„Þܧ]g)°#?»™Ó§ß“8Oõe%uNÖu®–Ð[Ôžv^ðÙl¡¤/àíþuçó|»õ£‹Â(°Ò6…Ϭ6šÁ¸óêRDrÉýBiïÀÊcV°®ƒ½%Úí[$u2±—–™èÈÂþûm~Bþ±üײÜàg±{§V‰#žÑŸ,6D\.µ]ó¾à¾÷öq%é‡xºb„¹óJØÉ´¿Gφrþo_9wÏýNÌÏyRjûC’Ç,my]Oò“ÃmbdÝ+Çe¢tõ-ØI›S9'é½öØÎ(Ò¯ÿë{^²^ïØWÝ„÷&®åˆ&ujT©ä Ô`£Wæfð§òÏ—›u)ÔŠÚâªúooÑÔgz ðåH]uq9©¯‹9Tœ=½tÅLóÏÚðHt%¹F´ä›/ì#íÓYÍ*²oËÑõåøMÖ=su²/Ú˜2ü'é(ò—Nã»Úa9q^`¿.'DÃL[9¶«Ö‘ûѬ"|¾Aßq ~vzÀ·Xiñ˜ÒÇÚàîƒüC¤/§Hû{µâXó~xêåS1<'*Æõâþø·jH Y_§‹µ¶ÁxÍý:ÖIp÷Õæšà‰ù'¹!WwòÞ¬‡{LÉz‘7»3éShµë@ízÌ;%J¡-b‚Ô󯻀ÜëVâóQÏ]“¾ýN »È“}Éðøþݘ_ØI¶BKàXö— èSƒa~cY?UxI/ÿÊM?08³ó«d_®ˆ¿g?ånG\²®1V1¹Dnûr’u6ÏIÀŸÕÖ|Ïy‰yd%¯SkÂ<<"üÆ: cS}HÎÅe1gÆß³»kÚñ¾ˆo¿¤Ã“å¶ç`~‘½Fv¹°_?±ÉGàOIç}¼ S€/uSB'ᇑâé"L†ÈÔƒ¹x¼§`ý¯ºJäSQE-¯`…çå»~sCnï®;¥A>ñåÁËb–ïß«ô‚Ø ;¹w"~SÂò%À½èE üž›eºLï¥)”qt¿Fv”íÃä[Öwnñj){NœŸ³`qÿb?¯ÿQ“7U <ò²X1æí¥^¿Ò=­#xúnžo=?/sûxüðP¹çŸ¹%ðÉôÄ¥w,{ŽJ”}ž>OòÌAu¯M¤Þ)ºÞjvŸV”®m€ñÜW²)ƒ|Â×øŽ‘óð^òL¥à·§¹*¼!ëž+m¾’~pc¥ÄÎmö{/^d›1wÅüü½$ydÜ¡› AàÛ_—2Š`'ëì¯%‘:Eß~åŒjÌ'ç*ã²òÍŸ*ë.’u'¶ÓxàFò†Ð‹Èët×Þ8ê¯@úU‹T’ûBŽäT®ÖÆçÂd2IýBfÜ™IyØå'ÅÉ3ÐËÙŠ¯›ªc^^aq›lßå.¤`^ÕÙÓ¯×S×Ë2–öÑ7Ò‡ûiÔ+ÊÊË~ÐÞ)Ê6SxoɆڬ!- £jÜPQ ~Ãétüo…±-{uŸY¿½^Àt~’é£FÎÙÚÉo¦A^eù ÑoÀ¦]£½àµI,§DY‚W?§q% P¿×ù‡TV_¬€ý&Z­¼²U‘Ü·xX`{©ó•JKÂ83øÓ»ö`üŽßØ®Á.s3Ÿ³õNÁÍ'VcþásÎû/\çW·N¹›Ù7Ucþ>;,¥çã?´» '”nkŠäuŒakwnÄúËðÍ>dŸ×]ñ¾6táúIÒ_äSéA®W,Aêle/óå—yªGö_=DúFeX$oÀû—Õ^‰ÿƒ¸)>O'yœæ^Ùˆ Þ…ýC¤¾%-z0áÎVü]>[ï"ì5骧Sâsž®Æ;ÑÈ¡÷PЭqØãÔMÉ¿·žRH4éìÑ®×è=øÆ¼ˆ£Ž âóÉ^•:øeÜ'Çø¥²Œ¼ÔZàÈÂù !¼×La)á~ ð-í«ƒ]¹šŒ°¼„ÜÝ6^YŽyûGßhóÀû­û¯yk!Þd Þ¬*¾@aìR-•'õ¸®k»ŸLžC_ÿÊ rö]úså9pdÕ–6¼ßêôj‹dþÂ%&ÿ*ðë!‡ýÄïì]4ÌW’ýÚ¬ƒþ+!×àqR?y1—?žöÎw’÷'ì>Äï²ÖoÄùìMg¦aö‚+H^JÏîQã†ü ‚3¯øoBdÉ9¶Ô£'ÌÈù o®(Ò碰çJ=ï UT¥~óÿÖ;U«ä`ßÔÀ +³H½¼í`zôUÄÉy[²¿ï‘¥– ùÅð-³üï3ðí\õ VØ±í¦—Þó°3¿ÙG³bˆªãáçQ§ èo‘OÄUœ/¿‰ñ{U.ÐŸã§™Ž -~´sðg5p'ÞáCK$ìh¡ÛV›ÜcX.Õn >®÷Œ£—¬¿Gê'²uoD„ñ±Ê’ºV“ýs›ñÈZGï½lÓú2!_ÿf‰3âðãä²ñó ÏlVË›˜_ØÃ.§e„¯˜¨UtMÃߢ[v½, ûSßF¾‘ºû¨]»Âv ¯æ”¯­Až3¸™ëòx›Õ+ÿAž‡õýD ‰ÅûÛ '»WŽIÇ w—­¼­S˜O¶›àÔ[ð {{ɳ-ðÃÓ³?/ ß.|úåE=äÝ=Ó’Ì»pp8¸—ì/ÜÞq&ß j-#ö£Ô˜ýßwŒ»{Øø™l~4Ü¡ ãéÍvú‚x}âÆåç‡Ù¢çö>Çœu!rÖ¯»âø%½jó¯ r.ì¿?ò?ÌI~æúö=ž)­Lögiº7rëëÁåÞžœ\¹|mðœØø5Ù¤ÎÊ%oÌŽ Ÿ‹~Ù6”FêNÿ;<ÜvœSŽ|S÷ïò¡{ä<º îúFÀ—˜Qðg“•á„'W*¶Ã²)B\G@þ/œèׇ1s†|GÁÛ¨f1Ú_l¡^ÿg²nb–møöQ2;öƒà&cßpþÃw~Ã$…Q&0³Óq…ZtÜÑ­ÈøÚ·îðVŒÇ]û¦fÞ{z¥.©ãHì™âC|;Û|ªá¡øÔ›øg-§<³I,…š¾ãÐAýîßEð„ØäÕwú!Ÿ”÷6´ÈÏêæë(ðˆ"öÒmNy°×WWÁ³©4£æ±‹°ÃŒR÷`-àQÔ†­«á71ÏãÖyé1÷ÎÀn÷LÂ8㙳Y—0Ÿµûyÿм¼v0Ÿœ¯Ñú¥ ¹œÎ{Í^Jâ~ù“bÏŸOþÝöˆ‹ç_¬ºÿŒçÙj@úÈ…§Ý'÷Eæ+ü5ᮀ=I¸Oû+4£ŸÔ¿?ðgk[¾8îªQgÀ »·Î¡©s¦Eë.ç$aÜ›^K’úÀã+À碶ޑ٠ž½œÊWÎJaX$è^šd†¹–5C>5¿­Â¸Óö½q¶¹9?×ø,Œ¼$~Õƒ×;Á#’â<™$ · +ÿ¤Äà ¯.J“sº†M%êÁ^$ß¿`¿ö“·´ïª$â]Õ³Ši%Ù_³­›Ëƒ|æê›"®Åœ $ý\ÙcŠð|¯>Ùug!¿Ðgþ¦;á—áã鮑äþÕêóÍ1ˆ{Á®á2g¡‡Êm{ÀŽS{ãË´Èzû­ÿÁï·”Vâ}ËlövÀ^¹g7Í€Ïè9êž;Šï‡‹_þû˜ìðÝù&AöT—ɈÁÎYY«S€÷¾éÏ<È=Œ¶Æµ§V¼½]kt•qÉð—Üb)ì"w$[FŠÒõU˜ç+Ù¶6ýñ™öb?±Ú¦r»´šÔ;$ø€øîw×3â(â™ÇPl<3Þç2zŠAÖ}Âk9 ŸBeóc rY€1}Ä9?¸V{Zp8>»ãñ½ù¸Ïr“µtÌ7çßeŽ<÷¤MıFÂÃO$ìUÄÏ’Ãôä1Œ;rŽ©اƒ8‘åþÉÀ’¬»Œì8 ýœì[-vW´ï–yÈ>èe˪+®àé~Œe3¤>6ݾµi©ß޹qš¬ƒ[?Џhñ¬ŒøS¡Þ–ÃÓªÁš#>çgIÎo‹·˜!§¤Ò¬&ØEÑùÊøñ\à÷aNs÷Ô~­²·'y›ø-ãŠL›¨:òë×— =?S¨gµÿ~äüB£Æ8'c“xvðR ð•¶ÇÑÐq9·º_ì“&æs€µw~]z:Ñø=~oú}›¬ï€µ=ìØ¿›Ó‹ÐB¼Ë¬R9GÙ‰ïq¬,ºCÅ|,”?LhP¨Šsëh¤ŽÒÅ; VŽÔ74w¯Ø>©{¢8Ÿô¿ ”x[P¿KSšÍ'ýQ_|Í(Î&ÓrÔ,€_ɾìC\‰~Øsrþ”t×KæHâÛ¶å?ƒð¹"s.0Uªó]~:¹÷>ªp!ÿÂ=資ë%{ ð,eè@âJ¾¹Ræ1²¶Y"Þ­œœË;UZƒ<"SCý·ðÉ[å\gÚŽÛѶð³—fwH}¢;ÿ‘ÛÚÀ7¯[ ç^"Îy«¿Sº{Vìœ?çùnM–Øü1läééÃ&ô94|q ó[rÉ+ýò0éç¿âh ò3ÚUƒ;FÀa¡¨€»°C»¹4à‡]ƾµ×¡‡¬Û Ïj÷×öU×Õà÷ìny¹¢H ÃC©I€JêƒÅ²T¼1®4E‰ÞRð€Ìç×[¥Ô Ÿ‘ ðÂ(×T-ø›ùè=óMæÎ£Ð_Ðò©¡vÒÿ¿vJQù;ôÁd?B֗㆚òŒ@.¢ÛüÅÿ½Üp)þ!ûZùÞ`glT ƒOÂÿX/¬ ‚ܾj'}ÿŒ5Ew!žfäÔ4“>Å [W7CO®yŸ/¹ùά`Ò=ý¨µr—é9òã(©±Ž…Ÿ‡Ø;>¬QÆüŒ¼·@N¼hñ´xäÐöMãŠî|·v |(V+µ9þä¶ác·pÊó¶™ùJ²¾+Ú½Þþ'©¯Y¾o-puýIQ]Ò/ËÇÀ%9z’º\jGú¯gºvý¬†Ý¦9mNDÞàzã×RïøAÓìê{R4ªwx…eÿ÷Ùû÷ð(zúÑÜnR7%Ø~®“ìû7¯=› =ÄÅUûœKPˆS'uyùk´>^„¿tȇµ:ÀÏf’׎ÁÞÒ·2Ÿé:K\ÇáßâRðû‚3ÿz^Òhv¶«=ð'õ‡4ðòrÏÅ€EÄÃ3ªª¾8·×ìíÊ…¾¯Œ¨o]¦@Ý$x£’à]V_½Ñ Œ£¡ìï:K_µQi¦ëY7‘íYÌkƒç³~nö}Ka4ÅjkY#O?Ïz½íàµÅâÈ϶œnjñ¶¸¾ËÞjñž‡ÙÛoÓçÞ7V -Hˆ,‡œÔ‡>%BÂÂÛl7Áï,œ—·"Ÿ(·_òÝEcÄ-{·mŠôƒyÃ~•¼ ôι_äþ’“£šDŸeŒÇ›ŽA¿Ê¼¬Ñ¤ïÍ gæè)Cv³ú-R|{ øió©¬ö™!(˪'‡<ö—ãô^ØsEÉ,Åé^²–ç$éÛm©0ÊLú < ¾.ùò>³á$äåSØX¬H£ÆïŒû}m|«}qì)ü6>ÆáM!âVþ½¨`~krúʼàá>×Ö5‘¾CÃä^º¸Cû2K§¯s&ÿQ¨gÊéïÜ€žÅYõ G %¿õÈÅ÷Ÿ÷ðsÀN¢ãƒ7‘{Ñ ¦Ç$SÔÚF>’›°ù ½ë^Å(ðÔ¿OÛ¼yé»ÊRöYÒÿñåÑE*üÉhŒYŒ¼w³VvpÞÌ/©r ì*+-3­ñ·¤H[-!‚Ü#¿^`ð@OÓ¶¸žÄ—„–«1ð3º|ØäÈÛ'ªB*ô‰õ7^NÛJöõ¾9¼†ÜòF&ì×?B<˶±Å{bŸm Až*7=¬ ··V©ÏEœËš¿éDúÊ<”Aü·WÐ]ñÉýU8Ô`ð^ïK]{q?òí¡;2°ÃŒû‡ýÏ’œ8ÃEa˜±meLÀ.’ß<ÏòîÉFxo'ûƒ¾×¼wÑáÏõÃ’#×wô“³O¯ºY!"¶ƒ àÓYÊO˜¨¤oÛ Í{K°Oÿ/bu rŽç¯œä`ïÍaL겞VžÆ{³ÏýìVjÅç¶7ÐYŽÂ¯™Y™ ŸøyñŒøÍ{Žœd¾ýR}dŸV€éÛÈ'ùvKWü5‘+Þ^þ~džcì·ç¦üM¥PuÚz9/À¬O/ZÃþ*ÓÓ5÷ѨûÍ8¶Âî¼x5_ÿ…~“U^_€]fx( ë3–ûYº0¾?1œU( iËs[/’õ΃+NO!NE'k$mž"ça£¾ÓïPâ¹÷ œa!%åNMÈ£|BzÚæðÞC»ÏÅÉß\ýtKKÃÓ8ÿ¤C¾¶ÁìÃ$¯+ûîÞ ¼t˜mʹÙLî“é]†¸ãÅ’añr7<]¸»rÊ8µ]Ä×&¦©øSЭ×[Áã‚Fåõ ÿØiVYÛ5ÐÛÄÏôûxNºŠO×^rߟÍ p-B2\íìK½‘ÙXrpü£Ïg =º›±+›“:¹¨²ƒÿ!ž(•N‹‹# Üs£aüôûNÀ®N²wrÆ<"š”Ú¸I}Ä— ™;²ˆsËýäÄû³“okÁNË\>ýy— ¹ÿŒ× ûÖ 6É‹ð[;‡¡ðŒ|+w'g<×Uöž/üËya™§¾ï«*ö‰ôÅôöHxNî³Rä±»CÖâ.±ºàï±[Àû©Úï%ׂ7SCÿ8~ò ÷õ*½‰<ÏYüÊóQÄ]Zê-ÕXüßOåìMWün­ÚoULêœ~MªïǼì2zÈ9´içZðúü,¡«#à9}ƒ‰î°«t•y«[°cî‡ï}c^W›Õ+NCþm eâÀåõA)dÿoáïÛ·Ì×§¦<ÐC•ˉ{ŸÂhԄȺéûQÀõ¨ïç—ðùjËQ7…£".<î|6š§L?Nòöz¯ºûgWQ¨–Uq°›ræÝ¦Öæàow·)u§2–\ü´î€ÿ™pÓÂÔ(òí:[ɹtš×ª¯¡¯ªâˆDã4Fs}Ó®øáF•Õ9Ws°ÄÖŸÐWàÂçÑÕãY×¶ÒnÄ?GžhÍ'dŸeüdÿäk­<õ›Ÿõw3ÎR¾ì»V@c”æ½yò˜B½|€«†±zjhž~ÿ¸8oÙ\–Dc$?¶(u@Ü*LÔèBÞY^¶Y~i¹jCøKÃ+bÆiÔæ¡äUó혇\ÏÏ~ µFão¨_ø‡eûá yÄ_:û€ì*§7ÌQj øý‘E¼¡rÞèš#xEÜÚ‘óÐguÕ…B…S4FôÜDm2øRVóåäø{Šéþ\r>¹šw£5ð+Þè™vþŸ»åÅ =Ô±­êñ¤1ªŒœûH_}ŸÂÜqð›ÂùÏüKÀ•êJÏeÇçhŒßgþÖÂ~Z¢–Q¨U;¦Øsüà÷y–óvˆ…£s¿Šªws<ˆkÄ÷®<²i’¢1ÎnÈ3h§QƒI¨ï%ç%Œþõ[Â~oÉuØyÐyO2>á¹ûò&ú«`£j¼|äžðG®à—ùÆ*N,Õêy–,ÎxèíSÝðoø{ÕóAÿ¨1#ƒã´ÄFÒ_9´YõX8òñÅw¥_.&Hm/¾CcTÔ¤vBi»ïJŽ#_õ]{’ü¨9—(ºâ>zÕgÓNΰnFòU»|¦jë}e»ÉšnF¢Þß¶4Øw@ÞECQ ÕTÄJË þ¥¾ü…àònrÞêñ R]­î}×2‡F=çêÄÍzƒÆsú×þDÔ.»þ_söŽgj…Z«úîsÛ]µ »ýâzÈ5F zÉ|WHT'ëmö÷xöP¹ûb£À“ÊÎ6EeA¾uLüÎ{q“ØN3ØyGräØ -œñ¯z¬Z™Ø@ÏÏŽxWǼˆ^½Ð59Ó÷pI`ü1VûÎ;`<ÕýÛËÈ>iŽèçnàöº—LÙWÏð,ÜØ³~êwë?[ðmmv5°7ýø:M#à_\Ñ$sÆUþB¾cì"ìÈbʪ‘ïÞ³u#ü+RïĆŽ_š®=Fž–xc¯EÆÙ´ä~® þ÷´„#èZjµñ=+pÔ7^¢(q'¡iÑ} ÞwîˆÌ¸ïM|/ÁcºKq53~”¸WYk#¾t‘u­L¦ S¸¸\üõœ½äX"òþ‹þ›4)È·Úl·—uS«¨Ó®þ4ªV³ð<ì&12¹Gø’}gÝU¦jÝ•ñ¯q4F]ýõ³›è4†YéÚç{I½…Z¸|$ò¤8ÙC§H]{ª‹\KÞq"ÿ*4jJ­AãØu-Ëjvç!5'Ôü| :Y/þ'¶ rˤ±¼§1â§¿Šj!Ž6ovœ„½¥î’¬Ù Þ[ì¼qƒßØýq[Çå jéâMÅk{I?¼¸-v¤Ÿÿ§°Ç¼ä\NSê6Äù’бV)mÌ?ùàŒ'ñóºk›Ò÷¶TØú 1äjGçi6æáÝFÖ9OOØ‘¾Z[JÏWW Ið@¾fãºIÆÈ;‹ŸTeH"?ô~ìÀ ?6—Ù‚8S2sìÀF<‡¡zk5Ùw{W±‡Ñ…ù_< >\)üñatóý÷‹œÐO´±¿÷8üXww]Å4ª§ý•o ŸðÍ=«?À/lØ*]d1®â¿¼Vƒ¿:¤NH?À¸ÊNç9üœ'}ŽOjõ@,ÆÀ»ûÿ,wò%BÞä[›É=‰q'›*Üž2æ2„_Ø_9ÈOêïËYÓ(òÿ´—,Éù7Kó,5GŒ«´š)ûü+øSää Ù5/çT(T½½—y2;þ×|ÿã†ÿ¸FtNXa|Q´µÉzÐ÷ú{›.Ë€Ŏ n³jÄÔNc|+Öa_v},ÈSr•ä¼£KçÓTÂo“RVë€;Ä-ÌÖb¼©³ýÒO’ýdÓ’:r­ä´âx_D'ûia #}íÞÛÿ€“>ËÕà?am©j¤O…¨ËÁ ðð£«ÊµOc¾X_™CÞtꌋx|¶ø¤km ô£Pgî€8${øª'¹oû^Ûi„G½ß².gã)»q¸óÊ’`V8uï«|åþþc÷4¡{¢(xVŸN¼x¹¥yFÒÞC#µàçþïÓþDþæ³É§§öïBé;ög¹›#p0η¡„¬‹6ªí?רð@rt\36y’ä ×bòWÁø£²u7€Gzß»½<3*nó€ì"sÒþ‰x‚;…zvj࣊yTŒ§<¹‹3i*[ÞÂ>ÜpÜWAê<ï©ñË"¾Å¤õºp‚LJµÕªhB~^•šõÀ7SÙö°q|Þ(7W„q%œCe—6ì)ÕÒäÛ~äÁqû¿Ï“¸DçÜ·¸]ßšÛ9$×'O<À¸–úôó`%·ž±(Á$w/.¾¼N/V$œxXÊÞC«Û¼RÏõóŒ¨ç~—ÿ›j7¤1"“3®“ó€´$6xOH°‘Èû*ÒߢËÏh„Â8%õç@'æ‘¥RªyƒBõþô¾Ñþí||áÐØíLëÎ )R×°ãç¦Z?ÈkKñ!ü¾§g§<É7/Ýó²ŠnȰÉ?…~¬ö©œSEoþï;©+Êá„<;ŒÍÚIÞSé;^äAaböW ÷ è{|>d®½=LêñGhmš(Ôclfž¤ÿaraæD"ü2ùïz¥n7ÒOo»I¥9x{ë`Iüßî®'ò3½7ßiu[îÙ”h1äE46ú¬ p#9Ö”)ùAÈ#¥GÀW³þuޤÎg¯êûúªÕ»Ë²ì¤¬öDß¼ÏåÛ…7·7kïro\fò«yrߊßl›ÁGØq†Êgƒ-ëðÿ .À©d=žÍ³ï‰jÆTØ™Ö)#J7É'ß^‚¾ãœã†Â>m&4¼WÁÞCØk^¸û‘ýpyMc#‡¤Úæ?"vv*8C/έuÇEH©•”.øVÐë¶ÓÂdëŠÜ Ì—æ=QsñxŸ@ ðßÚÔm7ØÛ¡Pþ³od2k¿*pÜ}âzøàlðíÑNdwÖÜýû¹ÇÊëoÆ_èEAìIì!ù…ÆÆ5–†‚ÊeÿRè3Êgm9ôlîP|Xˆ—ÜGýJ¼¼$I²˜y5ìÍúÚ À¾3"-;ë¿â{'¿ĸé6ýÖü° ÃÁm¤nH½”šâm²µþdÆoWë+ ÜÏ>9ÓlM¡Æîð®‚}(®K{ŠÏ‡>NºW@Î/;N’u†¤ë¿<`G¡"ÿ4€ó>GÔ6#¾$/“ ÿKaè¨ ª…þ¼œ ¢?”ú³Î Œw©¯¨|MåùêåÌx®]N²NŸ …jÌ·“1}äl9òå*Yÿ(ˆæ½ûÈ™kMû¼³^æ¡#;°âˆýµ vGÉæùrrÐç9@ú?–3ýTWßIcœ°fÌ‘z™ì]áÍ÷‘×$•(ÓI_Ô¤ö#2•ÀÛ¬æ×1“†qDòÛø\ñ+ ¾ø[ÔŠ-;ý퀇b¸|`×Y¬ÇS$Àλ*’xBcúTûˆzÔË6¼5Û|Y[ÏÍ«ç{²žô#¸k µ7êk'÷`n¸ôôÏÒÝ.\é ?0Ì<{“ô‘ Mª;ô÷=Æ*¿Ñþz3ã×à¶Oéë"1Ä!ó'§˜V@±­]›}µà,Lá·žñÏ×dOý èwá?ô»âüd×*9y…ÍÌ©—âgÀŸ<ÊfUÒsN„"žsG2âüÂ5´õŽYGä èÆsS¸¶Q&ý¨Ý;æG+~œþ}þ”Ö´èFAÞA5 ˆÂï7u;:‘÷E‹?l¼ =Ž®|³þãVzB}¸ŸÇ¹Þâ)ô6”Ðø­ÑökC=ø¬çªAŒãÔ6þwgÄs‘¢¤ou…õ®èØÓ þ/»rÈú{Çñx‚#ºâ~ïà÷ôGz¥dŸ1m&?­ošÂ8ýú‡?éŸêy 0ñÇÆJ`Tr°ºkúð»èÔükü.ð‹ép-Sésn²ö%§ué09wPvnÞñ×Âw_$'ð £–p²¼wÂbóðÛˆ`Ð(rBšß¨2 òb8üý¸þz¢J–úˆm“{)5Jêïy=€C”û§š W¥/¿ÙáyI’,àß:¿—õ‘s7‡Þ À®ôï¡’ý‡UÝžBø¼­6%w³ä=W³Ùú+üùâ²>x¬ić>gt(_”ô e3=žNMØd_>—yk>&õ˜V<–Bÿ±WßWŒÁüS†ò^½ï‰âÛsƇàÇ›Šðg¥Ö—Bàõ}!,äüø'ï<ä^v{ü¬ýc Õ]zb0ÏÉ«äéç¯Ò†_QR|c•€[|·žÌ~ïtmj7¹ßÒÃ…áÙ»9ò±ûÎg¼ï¥Yêò«ð‹±•]GAœüÅàá 3¾ßißa_)5û8³ÇZtµìÄ|B,M? C®ÉyßêȹXêÓ3©‡Çø+¶&ü?)ñ á#Þ÷r¿öÁî]êód­0¿t§ôâWÀÉ?¯ýÀ»ð ‘.Œód®çs7È+ÜŽ•µówŽ ÚCÖÏL%¿0C_AV«Hÿ{;AÍkÞˆË6…¶ÂOÝ_÷²`^Þ*Ì…v)ˆ¢™"à“óß^B/iœô–å×MÖáY²oQl))¿¦‡˜ K‚ßòÊ2®¿bZéÖw“Ⱥù1crŸ\âù­xž«PDzÇ·¡[NøÈÅ*Ĭ‡ÜGVÜNîK÷Ž`ÙÞCÎ'y.;r <Î÷Àé;;,ë ÿJܽãse%òˆëÌ0~+ž‘¤JrŽWÇÀ GŒôyrÐG>,Ð&ãØƒydúY®¼á ›f©åÆ8ã?ð}‡ÿ¥î-?ÞCkf Ю_l©|ÿÊܤ÷Žô¥ˆÜè/•ø¦tdÖ§òξ¾¿×‘B=Í´w:z´Hû½ã;öÇ]›Üçõ,ð=ü2vÁkìppX:jr;9¿j0l»@êpN-ÿ@xáC‹;ä<ƒ— R>ä>åq!qß?b¼ËÏ591@úÒ×–ƒRßÙ6ýGDÉô©ýn¹\c9ä7I"œÂw‘ÿÄHLŽ’}C=Ë\R§PþãZ ÙgW§*/Í«d‹¸I½¤ý‘²Cä\”L¶hâ;ͬ0q’Ô=zñ±—Ánù4Ȩ‘}p¦*nœ¤ïŽ÷ï²?_”ÖNÖï|–íúiNê-Ou_§•‡/p:¥¨µ¯xÉ}IÓl/0¿ß’"d¼*i­_ÔOŽíމB¼vÙþ¶x^Z’›¹ykMÓ•§žNõO˜€GG¨ÒÛ¥`¯^<áÜÉðÃT÷^sr¿CMõÑ;à‡¡kÊÁŽwg~OÐWß=/†yú¥{Ø}G<²1`åå„ý÷½.,[Žï…»¯<ùù¼ceóÄstK…gÿÿ'ÃÞëàÁ£d¿]ëݰñføÍdï­àôÃ7xEÀÏu»ުú;½GuÁS}Þð~ò'}íBN(CÞã#ö»ùìØ‰Ã¡~JM<šËTg¿{ôÝc;/¹OXË”ôóH–]JA~•Tø–*«Eéú¹ÙŠè?~ý‰ äá׺ΠüÀfå ªäïÿ­=ìÏÛÜöükر‚ÁÄåPàœ?­þ ø5â‚P‘Æé$¨£Cƒ>ül©}Ž|!À'…ƒO~9ј/†÷Šeõ=K‡<Ëw™èC®AW æÞðì¤>Ö>x}?á™ësŽ+î'ç{nB~ ±yê]èßúI•Ü2Zr¦zò¾q­Uñád†âbÙŸÜÿÀ€ôK+i”~„÷» ‰ÄB>¡Ëý~ØÁžcE›vfÍcœÚíÅ?ɾͬÄ"ü+®\³‹ <Òzh ·>ìÎ%©£v'ì(rTéÒ“×äž25—sð»ÿx/_ÒƒÎÞz ÿN‹ù³Ù£ñaìôoÒÏ;ê3#Û¸à²=OäôÝ+HO\Å ¿ ­¢PäâÏØaþ#[f„ŽP’CËÓH½Å W¾F÷ÝRæâ€»ÎN¡Ï»IGWKqÂ/Š[ÂLýHŸ6WVà¿SǶK_‘oû·‚?Œ9åâ,I?WÇ··œÎ!®h2–u½‚ù,þ¹Äñžœ_ ;©ÓMêzX‘{EâÒ+¿yQ>².‘û%Ë/~zŒyºÄ\jž{`çö™FþjfVM5ƒþô°ËaÜAÒGב>ž—ͶA‘I?¦É9Œ´^ÿ àl^°Áù5Úˆ_Z—46Ô`þ\R¯—}]âÃã¡7¯ºÞZ;ÄÕŒÕ,Wë0¯Ø£[-1CZ’7ªIOçéó>Ão{ÇhÊÚˆûš,Åv‰°£„Ïw¢ÀgÙv%‡!/GÕøŒ<7ÒþÂ9«©#ï¸Ï v+oæ!¸]ùþ["òÙ¶zÅàMyŸé~ˆ†LkŸ’¸Ë)öKz/òÒáÒ«`öWê|ø0Þ!Uïñ|+ï1OÙ]¯ I½ÓÕµ¤/…ÇÄ+y@|È1×8äÿW¼H¦¯*^w<&~Ä_û)ô“ÿâròn“ˆ6:é—²Ûâ8ò½˜»×ÔH_Û(qß=óð?áÄr^ÜTýKðA/R×Ö÷Ôu÷›?E~f³wæèŒÇ¢X| +Æ¡ÇÐòd‚ü|yí‰C²#å _ÁdgOàè©Ðûâ•„Ÿü{WÃ;tÌšé;CÖÇ‹Ùj,€§â‘•ë§Èý`e†ÁàÓVÅYàîñÊzCŒßMŠn· óË\½oÀöcôÙ¯àìdž{å ðƒ“K<'[xÉ}šLºîøµaåþGªÙµÌÁø¾#‹¥™ÔŸU^çÝÔ†8!<ü™óuaZœÅüNó~£ œUjLµ„_ÅNn{Ú‚8$Á-÷Dî·¯‰YÛVñù°ÏñÙ!]ÈÉ콄O䬡nfn ¼*Hî[tN&Æ&>x îs:ÇžÄ˳Uö%Y¹FÊ^ýÔIyÄ· (….ø_ÕŽæÓ¤Žz÷ä+4ó›ã]Ð_ñ§€î¿«€¿Š£I?žb1Uò’¬ð´óËðÿàeAS£¤à ë!Ä­Òu<+OÍ·EbüeÞ+³Œ—ðžC‰"^O®eh;…Q¡ì’ÔH£úÇ¿ð„¼ÏX^Òºä?º/Omn§S¦7¬¾…tÞ> ûô(šœN²½8è€øì±éÄgr/·¹¨ë-àxØÇõËIÓ~¾"Ï»ŸÏ‹s-}¾»µü³kÛ_ðƒn-»ü PègêÂ÷JwŠêåÁ®ìZÍÙ?b˜³7ž¸œáÜ[¸PÛý´ñ2*é~º©èQýÊvxüsïÀ¯ÀÄ+ýÀãˆçYaG1¯Ð]²×–!^Ѧ3È>{LÕëØ“à5îoç[ßc”]3®B¯N&>ßXaO ?d¾£½MÊ–`o9ª5å…»ïŠs€k¾ESÈ=Ú“R‚xNà.ZÑWðdÁLAu¼/&²¹WÔÅ›ùñ“ó@Ö'—ÛOüמœ"u\¾“”lðãœ@Mï%ç¯ì&qÝÏú(Oõá¡9Z£V¤¯±ü-Aò¦ËvÄÙ¨}SÀ5ûÐ-÷I¯ªH¿«d‡¯¤>Øÿè %ˆÏ†áštð8jævVîÍ;‘Ç^}`köžÿyZ~’Xö„ÆÝHö!Òë*Ü0Þ@K©1à‘Áê™ðœôä×éZð«þÖß/Ó,æ+2 Ž”b%y^L'Ëó&ð7-–U𣄥¼r>*Õs»¥…ÔI™øïm›Ë‹x Ÿñ°”mÄ3‘Ïu­˜½þØh+òi½TIþNr> æEæaä÷9¾ü—Šçø™,Õa<êwÛ}»IŸG…;|_лCGñyoÁÁ|”®Ù õ¤®þÔ哯·íü#Î0€_Áï?ý[†yDïN6€ÝÓvjS¨&ýûÚÇ /ü|üG2p<£î¶Ï2è¿ÙíÍ3èÁë9gxöñ.®—dÝÅÕñçÆïp,èZ)ðə˜c~cÓÎý&BÜ“îjAA¼§«ìâ1Àó¼G«ƒ×âïŠ>ܳ_€WæWs{‘Ï3¼"Û§ ^ ­\s ód/ä]…üÃJ_wñ÷ùðqdCÏÑ»´÷cÜŠ[ûûgHßÒ×€£J¿IbhÙΗÖÐkäAé‘>’§ü‹¸¢?¥›ÉÕCîÑú™œùîÐǤVp™ƒ˜øƒbu¹É#}¤yþä#o‰š©¨š¹õ)0}Â8~¥,æ'ÎnËC¼L8°qðxŸ–p“;â•—ÿõay¼?£pãôÀK 㤳³ç]²nwëÙH ôÓ>Jƒ_ø²Q%'0Oó®âØ}2Ëé-À ’s4[‚îTþ,eJî65[0$÷U-ߊñÚÝ2‰q(žW_ú }ú‡¼u>ÄIÎ×nñÆO»csÿ6¯)ý˜OÐØô—t+r×#éðo[Ó&{b§ÆEŒ\UÒlòö òÜÀ3žÖÀÁ“]·zè¸y¤÷5¹ïÃT¶ŸÛ :ýzs3‘G< ––?‹ÏÙ]:ŒŸ>•-侤ÈÅ¿m­OØêžsÓ§í­­bð‡x.ÃÞu¤N~Wq´â¥cÒ‹së!w3ásäÞì³úÄÎM¿¸/ð-FQǾî–Ãÿ½r 9Ã_FÓùe€ËWcî’¾kqcác°jFºRQðOTò²J ôÇvoÏ&ûç›×”Ý¡0*¨ÚÎÏŸžñ1;â}Šì,9Gf8Oà=à¡¿ÿ6ÓH¿âMyÀ³¼ªá×ɽ?šçïºt×èÃŽ‚·»×T‘sãráÈÛ¯ü~Câ‹óØ;Ë3ð—€çïZ±™Uí‹àï2_Dt } ïøMŽmà(äÉúâ·4é/eµ=òºÞëµ³mŸ$âB:kù(ä’nÔFpmãó…+À¡Sa? þŠÕlØAapëËh“û´Â߬ó[IÖICÙ»ûm`ß;µb×1bk¯ÕÄà{ÞÔá²Od|bAyì9áÕùqÄýÈè-!عl»~ôß{©–ô[¡½È f Nž(” ¬é&ç ;Õ„oAÇÏê>zI/GA>ÎZ~^Î$5¦§«}Š)r§COöé™Çá÷a^ÿÝæ7Çsÿå󊂇:DqQ—A_§]ÚdFÀc]„TáωAÌýéðŸm½pä7.Míÿv‘úÙO¥^yà;a FÆFÛžgYˆ#Êç2Hÿ­x¾a}ÒïÎïâ*WAðrGÝ<¤ÿfæî“yö"°‹¯›æYÁVG?x {—ûû‰ð+7ݨêÀ§ _žJMÈéÇ?îyÒca½ð-ØWR¬ëoÄåØ;ÙSà;9roDiä¾åZuðzG¿Á€3Rw¨âÌÞäxör¢'©‹Ü¼Á¤ ñ0ȨñÒo ¹÷Søƒ>ü$i÷Ðrßwpy` žçXr€y=ä1ÚàýÊv"ñI­ü%ê%ë9 ðò »/Õîˆÿ6º÷;ÉyÈŒüsW–¯E”¨¼é ©+ ºi"ZEîqWòo‚—YÝRº$ÿ}¢P ýz>|4DÎwËäÄâýÜåùdý=!ú·âv¨ùª"…* 5?¡¤m»(ìé^”?âe^þzÕnøsiATÛ>È3}Æë»K…qÆé —*9W1ÈZó xUÀ‘eOîÿ)$ò·~hµr?⌛^TüoØCf#_Ë Œ·¼+xOU?!¿à@ìxÊäx%©ó^2,&÷khë9ˆøO5»×yé*ðŽ6fyñÔ{(éP0á±ÓŸ\7S£gI‘uÕèY¦ZøaþIKÿÌ'VI;4†ôùª8¼zâ‰ûÀ_Á?Úëm…^äþ±“L¾È7(6¤Þ U¥ôÕš$ µ²FéüÔ6#J:Å`]¹W,˜rúž/è•7ÊKêÎíŠóÙ1ŽŽUíO ÿ«f~²ð—€ŒÿÑÉ:í³èÞŽ¤ßè©yñ߈#_4¿Ê¾¥Pu¨Ù)¿HjÊŽë6˜—ù¯—þÞÄOΕ¿x ? òºµÇy‘•Ð'øãQ¾Ñ-˜GL޲l<á…e¯nûàýâ×…„ÉübÕû¿%ÿwç'}‡R—/´´Ô{1­Ó7“C=¾ü…ý(ñ <9멨Tž‚_ø5t¹?|®Õ${×’>@„SÁ·JóÙ¢Ä7@Ÿ ¹›VAŽë­DO‘u˾p“w°§ôKém,àŸ™±ßö|¡0J~õl©øúüo)×X <€W:ú(䘼öœÆu÷-Eƒìǵç¿z ÷ŸñÎ]èËœ(âøÙSt¹Üõ4†EÅÊè5¿ïÉl— ò–½›/Æï‰Ô&à£5Öí’¥gG…D(·R¨ÙŸ³žõ´àù¿*Ï2ïÞÚRCîOf œr„¼i½L³1ø}fýãÄóŒ3Ú‘êç÷ê‡7í$ý4W8½%çUD>ÔD!®³h7A^ùû•o{,=m§ûÿÁ^c¥´8åáï¶޾q‚œ|³ºÇÎÀ.å.¨ï }‹Yèž²àÇy©'Èy½Ú;žÝ–LêZø¿À?Áðã°•Ã×À߬Æ)+ÞÃŽ½$wñ×’­ŒS³xIÝâNùPä·=™× A¾´GCG ™º>B4F˽'6ËiÔFÑgë×ÎÓ®]W™úaG-Ôúç-Y4äQÏKn’:ÿ/ªÿ-àùE±Ö2ñ¿¡üT‹Ÿä\…ÿ/rÎ>Û`îO:òÞb’WUÖ/Œ}î¤1<#;ïÞ!çÇjšóÜ€;V®ëµ€Wyß®#?s“u¡ xiWõéÑvrîíPpËfr^âûýÃ;ïâ¹ÛëE™¶!»Éx÷ãóêåÒwEyIÉT¡ûe¼SÒíòÃß)Û&À«²ŒŒ¬v.„½Y7 9…[W±ŽøÓvex‰àÎí5çí‘·%ñ…ä“uöÜ'VBcrÿð¾ð4r^J4ªî5ÁQ“roßY®kØi ­Bžxð3-B‰éäžà/&1Àó¬NWGfàÿSÓ°Õðõö‘€;ÛGïé’õ¿KáÐCôí8Wñà“̃¹:È3#Xæ1»ìàè¯ ›? ½á–úûK¥îZ[#ƒùuâOGžt¢õÃ&I<Çõàð¹ÍñX¨'Ù—ºÖ:AökÒïu4^°n6 ú·1בcC>—Ê{ÉDü½‚EùRæØä[صx´Ïß²¹å~µ òèƒ)ÿIÄ™ˆñ,zpch¤³z œPÌ»JêUÃTmõ÷`œË^´²a¾/TûóŸò9¼ú®Ao¡7·ZN³’ó˯¶¼{Ž÷ û©À®âløœ?Ž+ØÐ˜ œ¨¨~§”êGcˆçkP…1ŸE9‚ƒµËd ÏÛ\µ¿˜Œs¿Ó;·D µ‚–jÐ ^“RWp1ö“¯æZpÜ ||èï(᯻.¦³Þ¢Q£wéôE|ª×PЧP«Ï­U %÷\²ïõq%ýHŸi àÿU}vÛâó”K+,£æËXM=iŒ"]¾%kmøyìǯ‘Èo ¼øÞo}Jú£ù…~‡ž²§wh Hà¹' ù>_Ã÷nã€ü7Ë5å¡P';ǯ \bÛÀKÑJïînC¾WcQãœI£¾ÜœìoGú¯~R .Xos×—Äø=[ÔªhÔ{Jé‡nÄj?‚ç=ã7h>Mî;+ß »V+i17‚ÝÆ&r½¿+Z×ð,‘øû§áx™Ü‹X›â‡ø™2¸ùÄå¿à)~i¥0ŠŸ–Ž“ýó “æ2Á˜çdžöÓðc'Y¶UˆO—ò½}V°Ðtö[æÑ£¦œ¼ÄCcìÞ`úq¾|ܰÈC ¿[Ž}C|<ǵ,û;+Ñó$4×-á£ûfÛÏŒrêMõëê;?ó2ªýížb>—,À#2-o>¿U ùÄjÄ>–̱Ž÷ä'Àã•»©4V{bÊ QÓC£;g•OKµ€kÙû -ù;(ÔsŠÁ]hÔœ]åÍg[ÁWÙÆ¬ZÀß´'ŸÒ¥÷Ó–—‹‰ Ÿ*`;_ñnÏûÀw4ÜžF¥™õ/û©G¡6vè0­Ž¡Qóô ýT`‡‚¯~'ršÈÄ<ùu.sÅx3¾ú•ìOKß>®D¡6ξҭ§Q‹4#ÌŠ`7_Mʾ¬¢1ü›¢¸#> -\‡÷ŸÛøöæ žÿž›e¯Çÿ1÷Þ5þñÿø)’‘‰2#…¤TÆi!#‘†vÒÞ{žöÞCi§ÉȈ¤“MÑ9Bö,dÉßûóõx¿?Ÿïíû|p;î=îç\×õ|>öu]Ï'‡_v}ããhÄ‘§ ­Uæ#OØ“z¾ñ%ÁLüL°ùÑçÈsÓØ>tnÇmMÛߘ­Ìãî-{NyôhbñkÄÍÌø?ÏTa—yoR§ùÃOx½çóæ ·¸âË?Ô3 ÎÁn¸I%³úO¶X¾Ÿ}Ûóã¦¹Þ ØÝ>-×Q¨OªêΖýF>²wØw«SxÜò7 ²«*€¬Êê=Âã×&éþZYÇãºgrYÀ¯ÙVõZ›_æÕ}ãá{?lžO÷Jè}²]Ìû§ÈÓ¢vÅd¹²õ“OΔHBÜKåìÿÓÔŒ|ågÖ¹(äÓ{ÕFš'.äñc䯤Ãv½~ òºŠ…‚=Û¿ª·kôèÛšhIö|Žw]°¨øA¶n¹|Ö ö½uÌÚµÐ“Š­bpQ#/1øÁ˜ƒÏ“ P‡_—öÀOøÛQäˆúh¯çÅÖr}Ì矇‚¸~?ƒÇ×½ràçų&¹#?>¹=ïò(ëдõÙû²¹ë^¾‡ÞNø6eäÌÿ½ÕNgß¾ñÍý°Cw/ggçèëë" }|/䙼«>ÆC%÷~ñRÌCÅçé¿\PGÕ4->Òð•Ç‹µ73Âüï–S¿ÇÖ9Éßf¾træYe§êÑ×ȇþž?¤ ÿ>;Lã4òÌ´t›ýþeìý–†ã{Q7Ø:š¿:òxT!üáÖÛó­†!?4çKy¦ ß(ÎÖÓO¶<»Ü~*‡ëX:bnâŸyÿFZè_rÀÁSä1n*ç$Xÿ-ûKóèx[ÄÃûJwí0?~òß!¿ Œß¿Î80îìÇ{ÅŸýc႞ׅ5× ÿ²:ÈŽÝ××yÏÖó¶õ›Ñ[ ææÚÓ»„õñ:æ¤/G< uíêbÏõ䟹7…­#áywf/ÆÛÀ¬´Bqk˹Âéì¹Æðï¶Å PŸìŒ-@œ·›0g®;ÀùçÙǾîFŸ3…¬7QþÕuø®äÃѪîª8ƒ¨!È«òÛwé²ýÕ2”'X+a³û‰£æ¥7À/‰nÏ}„¸uàöíü~h¯˜cS ÛW`¡F®#yõvÅ]¨sâ_ÞÛ/Îöó+¼žnýÊÊ=!>ú²Y~ÎÖ÷ˆ;÷úÆ3²à_ÊHèKþØ ·»KﲺÜëQþ:¾ô"ì±`]Áåbäá±›ÞL‚ß×¹©nÎúœ¹·å ‡cÞöM›‚¸`}ò"üZÌ<›—,/H­z²×™"7Ü};ž÷“ú'¾l¶æ%ò¨ó#žß¸ÙÅÖ¡»RqöÆ-âLTêóòísÏzÏòêÂ?CwÌä¨+È [öíüûOØâuþåeØ_R|ý•ï°{ûtÁ/ÌcÌØ צóп{‡ G ~óê:gÎûˆ¸ÝjòqúÀÖ•f2[yü9>.Gغч†Þ{TÕÁü·çæ"vŸ[/0ÄzŸQš#¼)Mj\`ölø ŸE³n󸇤ÚΨò¸Ig+v²÷þ‹$Ÿ]ŠÄ÷®j3Ùúq;`²¹QѨ}r»fAŸ’æî<±׳v%·ô¼5{ŽÁ¯-x"{nj}ã%Ä'çA)S&ÂFnñ™X…|9CVzu âDæžU¶Žl·¼wœ3¿·ëè½iûyüš‡#¬fäqëª& ‹:=pL\aü΋+«Øzèb}Nl½Ò;m†ð²åG¿í­ò™½?g¡+…ü‰›1ÞBw?Ž[ÖV©š ûË,{{wÙ2¿êOð%IÔ)G_Úÿt€9ö8mF>Wúc£ˆâÀÏ÷"75~Hòºy1ÝQO®‘V¼w"ì:¿Twëjä÷‘5âÃ…Ð÷¬Ï‚¸:ä•Å£ŒOÉâú*¶§X(mD¾'xlV—‡|ŽsûÀ\Ô“gºz«…sÙóŠCnD¢ž:jÚó¨!º…[^éæ"šïkÜó‡=7Òp¤~¬~m‹³Ÿ†6·ªüÔ„v毧*¼ÚŒqÞ<+¬ê«¿7[åð€Óþ½ù¢ÏÖ¡óÕûœê_UZ†yªmÔ¹#ƒñ¶3ùÌÙ ?w{éÌf7í´Lö·Õl™3ãàŸ27ƉZïæ‹j~‘sÅxMKŽ.ôçq“ž®‚¾ÙW¶¼eëÅoÛ¶óï)~[¦q@ûcÞú+ðËÁ£SŸB¼š:Ðç&ö÷ æzŸx ZÊòÌ&—‘«‘÷I:Ý™ˆùÉi-Í™w y÷±JÖ¿ò/tôl„½ì Œ^öq‡[X0Á‘— ;÷a¾ñvŒoïÜ_Iˆ¯.¯ÿ=…=ç„ä'RC³oU~ûOª1¼ù þt¯V{aài_O$¬†í˜µð묧~Ý™ÉóTF°õf†.òDœÝ½záË‘¯ yÉÏ›ËyÜØœ‰FäÛñ§lO÷á:«¼Ekìxü*î º°K—k£Õ¤0>e-_Ë¿Cï-uU]pÝ•„/C÷9Ü=ÃÆçÆ‹JøÉ:çÄ[«!ÿ›µ°¸ê@ ·~|WàºïíaWv#/> ¶ôâï•û…jIŒû„=ù‹'cÜãŽmzžˆ¼F:{®W#ì·,8:@ñQU¬çälÈ·¨vi‰ 2˜ª§ŸÄáfZ·<Õ|‰ù¹ZúõúáˆîãgÛxü…ÛE¬6ÂÞmÜ&;ßE}rpýû¿¨C¹aãŽÆø9ú®=zžå1µ»$0Þ§ œ?̱¹_ ½(þW/µÝ¯^¿­GRôaÜñº8þÄ'ñ©l™QßÞëõ®wi^”gë",½úy¾O±Â¯ØsšÕš˜.ÔgÙ¶Ïo7b>,̃¿fþ×|ó¢wˆÿC-FõcüéÃß%é<‘VÕEœûêüz?cs£o-ô§rœçÁô‘<¾‹Zaâ¶Þê¡O“Ç!2|åp›­/T^ú¤ã#Ø0eê_¿ *Mޏ¾"#^mAܰŠQ0äÉá«‰ï› {ñ ¯ûVÃâ”p]Æ=Uêóù5M¨²^Ýo­Cþq¥G~&Æå™É¡o/¡‚ŸbRyü¬@™£[§p¸Öú}lÝ£ÊØ•~=a¾åœ™¡Ǹ-úøîôÍ2*gùŒkUiÆ ™'<®î¢ *«g+æÇú¶€ÞÙÆ¬VÄø›gÈ=„¾ç­Ô£xùÊf—“¡žpÒm†ß߯›ÃŒñÉ=4Egî-Ô1/B/°ý2 ¥¢]<ù¸ó·îüˆßkŸK8nšª”o ò·ŠÍKËÍ£Ø~—*óßOÃõœÿ—ÆCÜ)ù°Içþò_›{i¨{w»Ý¿„ø™2«dHüwð÷ÞfÈ—óÇz­ÖiÞ½ðñjÌ{Ú’ºÎ=‡8Üô-ûøÓÝ7S¾š²÷†4uÖ±çHdúYÆÖ,ˆ–€ëøTÖãM¸*=—ýëýà"èGÉæ"èaŽ„Î/¶.flŠ¿W×gö~¥·qÌ,èyBlÿ7MÅËš¬ŽŒøþ¾v4ëÍ©ì#v½ÞðCQæ§ô¯{âAÈÝþùy~Wùâé×xü¨©[{`§%nÁq˜Çƒ¦‚Ëex\÷ «2¿V˜k¯ul@Þ“Q`Ù»-»'ØMúÓ÷bë\èSöR=OÔq­¶…@Ï¢®yÑÎoMÁBü=mÁôø‰È3 ‹ßÐÂüèyJ°}£W¼ÏŽø–Ú;E[yZü±¥"Ÿ¯=2ý€s[<3:~üT|Éßsð'>S¼wk ïß6,¼ú¿ºF».ü@g®A æc¦…ÔbÌo¢Eæoa/üï5¥@;øŸþªË1þFGŽÍ`ëb|»uö´{ÉåÈ?‚º¿:†³ç‘L®Õ¾ËÁ÷öH °÷ÁßêÖNÐC<é~·Éþ{`Ç»LØw¬V÷=äñ)§-´Pwn+u²ÀyÕÉo±èÚÎãrÏïÁÖ·ÝÍ“zÔ{’­§XT1uq–éÞ-ðk.Ïå}`gI’Ƈ\ {ô9w>eñ§þØvØÉ¶Ñf ?à$?>ׂT$ÿ•yu«.óRó°Æ"ðÄ:ø£ÆÖܺzü®-gñ/#|†õ¿}Çá†8´•LÂ<ù®S?uIÚÙ/þ{Ù}Ú"Ûõq—ì•×*‘çÇJ6}{‰PTÓeûÂæ]üøfÆ!Ì×övëÇÐë]' Dp¼ÈŒâZ?ø‘.oÙ:\ug#ÝÜð÷¥šûžøýv·õ༞‰?Ãü¥íûlV?^V°}˜e Ûõšb3Æ=`¿kÄÔ39ÅÓ~Åßn²%_ʻӃºlo„ø³°?O‘µ×/B¾auv;~ÏC^©~’›1èµ’ð5ÛOj¿®‹¿+"âæ8äÝÁy擱ûû}×G©À„žù¶‹íëi¤øÓƒ=¿¾.?|]ò˜ØÐcâ#à‡ã…I#¾åa^V)WžE^šë¿3/ˆÕ'Mv•K¡+<_àp—ËÈ(.ç±÷z&Dä¡~²95óÆ)D~¾úSüNô¡›?`çe÷ÅŽr¸¹öABä‘ù"]£à§ÓúÅ{àÿrk-.#¿på6×ìÅu¹Lþ÷ž½?s:BVŸ<]Û|F{?&åà˜.Ô[‰k^êúÃOΕu èfïå¿Ü9q/ h²ÿ ø›âʆÆåw¡Ÿfb^»Ç“OøT~ðž3UGÛJŒÉò¶Òc~ ‡ž¿p’ÈÁy»-¬œù›Óúç:ê§À O7;XÝhcË—Â8Úê>ÆÖû’ùšÌî[Y?:÷nÆŸwüáAqäÙQ±å»xlÿÙ'îìýÇ䄹F&LÏ‚/iFÜÊÛØ›ž¾ ~dÎİ.˜çG=[—^…üɯ³Ì_–U«}n›ûÚ"·zày¼!Ðß«¶® ×Ëgû­ µNÁ®ªìî]]„z¿p’¾è7¶>bâ˜aÍðO™ÆùÖkÀÿóûÎäuÑ³Ž…øÃí5.ÃìèoCžUÆç÷ðïo4qüÌ3'!¯Þëu{ñëÉ—-Õïáo¬;4Ó¯S4¾…q*0®ÓçÕÂÏTÿíûkºôèc¶‚êž³ûa§?ŸoÄñö/˜`}q<[R!î)@<Ü›Å}n|ÈïVŒƵÂÊ3£õ7ò¿ðÕ“Jÿ*Z†®2½ö\ÚšÍã—©Ú®0»‰8¦ÎÙÇãæÜô ~Èü^ŽÕÏîþíÏ]x<¾½t‘{(æí²ó!ðÕ¼¶ìP9üÞ¹¡-/ìyüÃGVU+Kq¸û¶-¸)Ãã§ùªôø@qæËdGıԗ³–ð³{¤'ÊD£>9ß’$Åî+Q]´ÖŽÃ=r­Á4úôà¯Ä‘„OnÁ­£ñÙl?ðÐߨ#mdÆêš@OcÎ={Ìá:pœ®³ýT¢çH4©³ûL¯[ÿ ƒä÷7ôGâS}rD&òŽ“;-joOÔægš¶©ñ·`Ó?гêkѧnçñ«ëÞ+}z ¿qÍ%if3ÛÏ`ơ˰«Rï ]q>ïeï 8üÚ²—¦ƒq'~óú¤yÜ<5K÷KÃnC3ü-á¯Ò¦æ~…?:üxº{Z.â'çÓ“?qà×Þ9ú—}s`kf:âȤyM_vq¸ÇÆ}ÛžeÑ·_¯ùóæ¿ê“ÉûÖ3˜Ã6óÇþàñ÷5¬þí‰üíp¹}–òýÇ—ÝúdÁã‡&˜þ‘†žçWw¨¾ªàð ?‰î¬Gžš´ô©:âsƒRýÖÿK³žä½~¾ùáôvÛbø®xõ0èïI¹Í{ºàü%OôÍÛÏá†Î:Ôôþ)·`÷¸æÐçÐìÌ5ð;»šoD>°ËµºBþ&§ æ¦üeÃ6Û!·¡×GºJži¾Ñæ–Ù_9»—­3ê™Îžÿ=:baoÀD?ÙLbbòQ·˜á› î;<¤`¼e8Ÿ²ô¼ÒIgŒÛ7C='¶ÎÔ÷y+ÔWžâò_í׋ê_¿›ÿ¥ï:ùÌ37k{÷K9¶‰FDì1|߀­ÛuteVö]QmnEõ€3ˆc›_µµOb÷!t>ä/EÞsÄHÎÄâꦘ¢l?Èð›žÜ ×Q_U›ÆA/«ÕõEÿðøåóÖ‡Þþ€ºíߨ¥¾<~ô¦ÏW>²:°–y,ê±H§ê[¹ˆ»{ÿ¼Ò©Èáou×»¼©h彡ÓtpÞí³c4£.¹9µÓ$ zr@IÊv]>u¥/[7(Ua_¦âÏ}‹a ô¿Tºç•üR¶õͶoÇFƒêÓÙõõxÙÂ1_Þ¢.˜bø›Å˜+Ëm5¼Ùz‡å¡§QOUl{î=ß=êa³cŸáÒK^#OñV4a»ï¥íÃþŸìÂÖéXéÜûþ8î\ÝÔÃbÓÛ勨ýãÏ56ãï[—­@=ÄßÕç|Î òœé»WyŸZ«î¿}ɳŠý½ñ$Ÿ³Üùª9®3t_úbbA{!Î/ÁlX7{Oº;ƧùVÙ{‹Åúð¿{ÎF^îQÇq¾º-®\¿uRƒS ½®\S=-ĚǭÞÖˆüe#OÛŸíߘÛqhöøõzë¶îfϵ9 †çÀn+­øV†ÓØúd=Ó¤e1Þ¹C ‡…ú‰•l]íÙ%šÎðK‰e“ GQ-C"¾Ê¿Í¹Ý}»_ô/­O‘à ôØòBt+ðxÇaÕ£ ÇOGí‚]D?]h,ÎêC¹æ;3_Á9üÎÃ_ömIêD›|Q#>ó¾ÖZ:¼bëp˜Ž}ÁÖÉx"uª ys‘„í»VäMR>ç®,Æ8ɵŸ€½ÊÉ[™AŸjÞÌi(†>¦çŒx‰¸ë©P—®‹8˜×ë2èY'üÊl³¶+˜/ûüˆé[á7÷G_ûûy;âb“…2ןÃÝ g:¹ö¸ç£àh âSêöór‹>"ïª9ûRñÒê‡ûöÞxÜ&Yø—¸n°ÿü §åðûù‹¼Ý‹‘olÛg/%‡úÜÉÆ2nÊDö^›ŒE죺v©3o:ê1g§·«÷â8‘w?-œýÝÛ?Á ùPÙ§”'mð7!2&ì@žœ/Rìw‹ÇêÕ=å}ð#QvÒ/‘Ï—G 9+;þõ‰¤ûM7åÁÚœNÄ«ðXñ$v_×{ߚǨ¯3rŸÄub÷,rØó’®*oŽr¯B¯'Ää7]åq#l÷(Ãõeig9³ç£³Ãëm”ÍáŸCÓÜ%ðùÌ\6ã&âûÓÖ™ßðøáÎ¥)Å+Ù:¨ýPÚúªê=—Ç;ùh4òÆsƒ^–FÞåñ3“ûÝîÁî²NµåÜÇuxo—™$ÉÞŸüói~2_}÷Ý·µ¸îuÚîl]­uÏ7á|5>κoÈcÏX¨DÀ½'ßž*Áî·÷ªé¬¨gÏWÛMiA]Φ´/óï[¢cÍžïKçEÍÄ8ç+]‰˜q u¹^»›5þn±ýõŒHø¡½–€¾!ÐÛžûsMßbžViß‚ó«Ï¯…xè§±*0~)åÄzIØiܪÇmã_Á.;† ¿JÕuÙ¼ûôhǞȫË÷̽¬„¼ûœèi1èkÉ•žC…˜¿üâ~õÇwŽ.è>ý*¼ÊûC>{ÎàþaeÔ‰YᑦBÏòú—*Ú#¯ÍÜÿuê0~gÚªsJ¨Jþ]ÿ`> ÅÞãLlîzvŒ­S¤¹ìÂxÌ›³åq›räï1¥ëfÂ> ¯/WVÁïØjnî@]7öÛœàãЫ7¿È ïú£¦¡ËÖ+]ñãß2ŒW†»ÊÀ·ð+µµý[ y|ÓQþ2~ð¼É*IÆøÝò¡æSæs¸ª„é}ð[ëä&µB¾êÀ×d¶jV߯‹×î Ÿ(;êQ^YÅí£Ëyܘ_ÏGµÁ^"Ö§e\Cýœðèø·ß¨/Êk;ÂrxÜ †ãjIЯŒ¹gºêYþt·Úà:¾¡·õÝDĵyê¯o²ûê]™“ÜY?g—£8â–ëÊ Í:ð+éâ=÷6!¥}<«Æö_ô’rÿ=õOÐcÃÄÔ]ñ;ºŽ• aã»ÄB~0ÅËNå»ÏbYiãä»E¾Ôh`ïéy›>Á8dk¹é!J×|åûñ x¼|Qì:íîyUäsÙ‡gh.EÞ?7¿A~,í¦Ä^}ÔYñ½šßY~£3p(_—íg|ø,ê‰ì##'½ËáN;`¯€qòsþ±4ëGXR1œ=—÷yB'êDÃ΃-ã /¡*z&oÞ³&&Ë Þ‹Ýj•óñ+CMcp¨‡òcœ·¿»y{.«Caü'ÔEíí }wÙzîáÙlýó‚£®¼É¨ JãÝÇÏÀ8sfOE~o·À‚‡|+Ecí¼Ûöˆ€éì}¹ 2'Ùó“Î_÷&cž6Væ)(j³õÌÿÙ݆ÿÔñ©™r‚=O_/}3 þöój? ä×ÓüM'¨ðغ÷}b‡ŸÕiîÉã:IÎŒ³cÏ_äê¹ NJøPð× öd~er[÷cí=_öüT~þ«ÖBÖ×^\´ rÕå ³]Ùó[‰²²ˆƒÖ»?ùb\ìPÔÃyî,3”ëÈöAêlßj‹óq~гyJ¾âبNäs)ž'×ÿ˜‰8Ók+¬e÷EÏyE³ýV/›Š:swÀ/åYϽܟ=\§~~±¢66Âó”ö<8ÉvQU8µ³ ç—i?hSëƒ:O»zðDÌÒuÐëHi#ÀËà©_Ôu>øÚh«Ý-;Ò4^ó ãQü{í´¶V„¿iaÏsw¸ìüŒí“xôPÐ/ð"޶Ä|¥‰+ÑYûi¼¿gêâUÇnÛ'C£QUnåðçì7çÈÀ¿f+ùÚ?†ÿZ›^59ãÐ*&¾’=/?¬ù¡ëKËX¶.yÈ­¾¶ÏlQHŽzòÇÄ’€ÓE¸î «­J°ŸÀÑßÔ¯Bïõ‡ß]ÁöŸN“žhÀÖcÚ³®>ò7âóîØ{nÞÛ`ñ9Ë…?³õB˜ÂðDZì¹âܘâcŒ×b¿“¯¿ð¸+” åGÀUi˜dþ„J›`<ù„¿ö› ëðçÞëÞpï!Þ¤xšl=úËú†°ç$'îå]¬¯bvo`:{ß,þŠà¿u{¬åý‘φï=Ž8»`ë/Gä«^›Å»5Ý0 ã½eßz¶NFjŽr(ëÃû] ©º»ŠePõv‘”ÿÈÇ~åü¢áÉÐØá-³Æaü¬< È¿w¬Ï8mÚbФŒøzbÇô0jJGS;æ×©\.#ãnbzkâŒÆ“'Ìeƪý`¾"O+¸?D|Kå•+ÿiÂ÷ÌôŽžAþf¯óð+ÄçÜ+ÞçóÙûL Û*ö@ÿâ³Q×ó£®+4߇}ùÚ,;¯‰qq›”u~ÃÌsô–K'¥ ÿd8ö¹#tÉâ!ìùþëoê ç™†OöÌF~‘˜ïÒ{Ú{=¼ÂëÏhXõÁO4/!‰ú>·Þ[Ëutµ’eç07î~s‚ò«Œ_­FÈSºçI­E|OZ&cÛÍÖ?e%‚yÝ9hB{âCìeÝèläIÁ6G¦ üæŒ9ÈiþiVúzzZFBu‡«÷ù·éCŒGF|Ò òã$ÃÎOŒ9\ç9=1~Þ¿†²|a‹óåµlý†Ä ŽÉN§hDzÖÛ9ÜÅÍ{,Ùó>ù…Üû<á/G,Ú]Ò=ÕU-V@\Ê=xßJäA~Ê‹7Éaü}Úÿ¥ÿ>ºÜßûå#üËÖÇ©£GB22ÚüænÅ| V=#úp˜y¯$[w!ÓvîŠÓÈbx‘±CQ¿$<5È|ô9wëvµpø™ ‹êpÔ›{îŠýµ`÷O“üßŰ÷Gþ·|…¿’kòúˆó¹«»òÕ)¶ïvKsæ!ÐØ{ÉuÔ‡Åã]ˆA?³Ìbç0½)lüÆÖ›ùØ•ýõC^Ã_}ê­IÏ¥÷â|\¿«´«Üƒ~<ùø¢þÛê2ë|\W¸ gÎ$¶OÊãyk¶b>¢ÚÓEqQÉÑgÙs›t¬qfÏEg]ºûùUBhšØmøy›Ç’nìý#ÿíwÃF ¾„üÛyd!ÎÛûÔô¿ªø{Úà]yfˆ'/\[Q×åß“ËüÁöczkxŠ­÷ds{(»?–Ü]ûùŸçÌ«} Ùþ nîl=·Ñ•£Ž³uDFµ©AyÅü}°»ÀEcûÃŽÍÜ^GÞyfúh5Ôs%š×ãüü»KõŠbFUô|Çü{¥- /bü^DÎÚ*‡ñ-˜| þß2PI½5[·æÃ`Íeì9œÓZˆçÎÁ:jÝЗȩ™ºw÷ߥŧÙ:'c*d`w«û&¾ˆ†ÞDXl^ãëHÍ\²íC™­Y„ë œ¢­ ƒß÷ôš'¥÷Ez퟽h²:ê$·Ó&¯±÷¾ZtíÁgÎëºaÍw…›êÃອ¾]Åùûˆ:ßÊÞ/Ê)öþÊÖ©;,=n­7ü]IÞكЯt½0Qö^W£í1{ÄÝ€¿â‰ì½; ÉÏGaw61:?ŽBÿ'÷‹â¼WØñy‡ŸƒÄ¨·ì½&”%à§#v¨ŒüË팦{Þ?8ÖϹã˜^ô5%ž­/í¹ ñ5JûE_"ò?‹{ œq}).Ë›f@?‚ :V…^ñtjv?‡ß x•üQ õªÝĺ(èáα*vìù ÙˆÀZK¶þÂ÷,yø‘`‰£^Ø“Mw–2ÆÝkoÞÐVbïYIg›•˜}õû^A<ö ݼvü²“Ã툷‰ÊZQÿ§: 9üùŸßžLWä}ÞÞÌÁø§MZw‰?í²dÖ %ÌsÄ$õõl?¤½Òœõl?ÞÙm§/A¯eÜLzÙþ\qÓk=,%áŸoDÜ7†=çÿ[tEu6滹!h/âkp—{Ë$ö|¶‹VüTÎk7wøsÞ¼|IØet@F!{Ó„kßWÄö[}Ü÷çëÌ=b|ó“ÜÕ4u0¾ç `Ô”Ìá§Ïþä¶S ×_‘)w½ŸQ8QÑh!['劋4ìÉ¥¶s:Û¿//úÔìð^zÓ¿²ýnŸê=3±KÝËÞ· š}%|)ô:rÊD^¾·y©´º?ô"ð¢ü²ð .Û6Ùf÷Å},‹ƒßŒ¼i¹ æÍMA<ç ÆÅ}ÎýD>ô0SîëÚÌ¿ka‹Ý!Ø…Ÿ`¦ü—Ë­_3;8[<þ2[ÇhÛ˲ï¨cÔS6Mfïµ{^¾S1Õz>9~ÇVصõU¯1Ú¸ÞU¦J›¡Ï C_KþÆx„î°½ž=à-|—h»ã6Ûÿ-ë{¤«ñê‡ÝÃ|–ŽJÌbëÛɽs‰ù—ÃÂ/ùÏØ~*©6OᯣL—Ýùñž;áû¶\»ÆÅ¼%Ðüðx:üi³Ïñ•Ð/ã£Jµ/a‘Cr‘ßìKú  }‹:Û lüHs½@¯r¾gòª6¢>k=yÏk2òÈC[kw‰ .º}¿›PqûDòç$«Óiä53ŸIÎ…~Û¿ò`ï7¥É ªÅÖµ>.Çù&É&MkÅñâ8Wcü\—(ŸX »·Ê}m!{O?Ö+0~ÂÖØýmòÞ‘]E&¨v=Ò¯~TÃYñå³wa%®Ëq`Ô•ŒGг½Ÿza·j‘'ß­Áü9Îjeï m°›±þ=!nê™åÈŸ¬6Úh"¿±¾¿M$EŸÃ׋ÕIwÀùø'XÜ|Œ|ÙëcK ò~¾úzÇçìý/÷MVì9æ] žÚl=\I/]Ô7E×X_ôÙ¯÷d0—R¾âzJìZ^ÐÎìj¶µqÑ¥\WÌ:ñ* èƒKÏÉ!­ÐËèºÜèÁçÌŠ®Q‚]ú‰‰ˆjáxËG¿\Œã9µk$.žÅäÏ9á ~ÉèP7èÑÒöíSAn`">›ícoq4Aµ dzzëÚüבýÌwÍdv_Á£)âC'ìFÄÞIú˜|ÉrÏ&Ø]Ôósê8~ˆì@}$ìÛGwȾKlŸò…sã÷¢|ÿÉ=?S´»Âzèû¿¿³ÙóŽ1¡œÁ*¢¨ÓÛ"—M€Ÿ-sT^«x”ÇõöÖ”ñF\³Ù*ÿù5ì;OéÅûDÔ­™yƒúvqøòvŠVÃYªéyê3òžUxòÇLé„d'èA•¤lòдw-;ÃgDrí^ºÁ/e[–ºÂN-×mû9 ×Ç;î§)?âz5Ãû<æ5@BdæØmB„Û)¶/XjÛàÇŸ‡v¿šQ÷v²ýÅí‰Ë0!*Z˜§ð' EÝf³ëüQؽ©†Ë¢è¬›ÏøÃê¾ÇK‘¢5ˆëÚ5Oå0¾áº×Ù>Šn‹Ë^à st/A2Íö]ã 2 ^Œùwü!»’#ÏÖ;û×ç•î1^›­Kã*"”B¾·$u»Y«CÛ;à_B†"žÄlêŒãËLÌÔCª4'õ:ò%nÈÇ¥ÁZ]”6ÁþÝ÷›…°q^oß#€Ûàf¬>—n? ùPÅÃ$GÄ¡w9*Öð£YVš¢†È»æ×ò8é¸îÄÝÿ® ‡ž¨…'&±~õ»ŠÄx¶ÏÝ¥_“q^^E[¯vfãvѤ[ž­W×ß{Ç9Yêi>ڟǵëzZŠóN7üó v½¿¨2æ9óXªå¦rèÑH§[ÈGRÍ{u N¥8_]8¸Í,Gu:{^jŠì”±ì>Àº^a*â§ééU3oâúæù©fûkdì4 Üuyðèõc]0Q?ˆ|ýä&šsÄpÞ©CêæK±÷ë³DV¡îÛU°åŸ‡­¿ÿõN‹ëM?f£ˆ½+ts€ýî<•ÑsùnÒþoõ OVÝÓÇÖÀoyô¼šßÃÞ‡Z:o<üJY;r1ÿ“VocûÑÅï*’èËî»oô´¼ ÿ4ÿô™äÃiã¿UJzcMäÞï\c¿vë—hì»%Äux™Î·ßÅö£ýûºóŽ$âÒ¯Õ3Ù~Nñîó¼Øz¯1£‡ñ ¡ïQjCOÖ°÷<ÎÊz²ýÛ…ÇÊÍÁóæ½øñ”=/®µÏÇú”úº¸/L›½‡Ô”¾ñ1Acs9‹K©i ¬‚`G{®S>‘ÉÖ-9óë!ê²ðξ”-¸¾ÝæžCÖÃÞ¾[™¦±|%»#vÂOˆ6ù„8gêéúr:Žç*ÖÓw zèwÙEAq9U! V¿›/]Ò°õ ‡¿aOöæè™ã θ38÷¾³u7 ·×Ïeuж‹öh"o×x)åÄá—jKÛº‰Ã¯´ )qÙ‚yV«t˜^9ãäÕ)[yÜ2q¹Áox\•Wf§êó…;V×#ŽY†\­ÀïùþTeïOûZÖ5ØaþC7¥üƒpP=ÆúAa¿lãñ§.¾¸~´bn£c¯([,vûÞ$øÉÝšz—RáOõÊûšó¸ÎS+ Õ0¥j¿âÙþ¢Jíðbv³>ð»*ªl?™-*™ÐØO~“­à7‚[ÚŽÀ¸í ÿ:úã6Õ®RyEläœÂ{ÈsSïðÖ…~]x´—½·Ò+Íq'êþں쾰Ýù-’È« Ý­èAoŒßÏÿˆ<ÓÎÑfÖäóÑ‹Œ^|ûxùéÛ¶mÇøø{0O3ŽÚ×ëPS»ë†º¯x¤šòAnQjÛcÉ[níÕ1‚<~‰¹]æÓs°»²|­›nÈW•›d‚X?ëÆ-œŸûz1ò sùDzȯ½+÷Œáâø~}ßÓPGº8œÍ`õIhÇ èm‚ã›cŽð£ž<ÈXö¾exûZø•„ØÝÇŸµâûsϸOG<Ö§Šý u)ˆ<Œø™¶÷w©&Æ«,¯a™Cµ>ã]¸(‡»fxr‰Ö3¶ï•ØÙØ}Èåî-Õl=jýaɈ#ч´ o[mñ8Œå;ñžï¦­ƒ]Í©„|ê¸S²(òµåŽÏ_=yTµy ôa¢Dx8{î7 åv‡ì=}Ú ‰ºEðó}#ϱçýâFÍÙÝszüÞØe.ô&ó¼úœ ?ðÜ~³ ãnººò%êÖug¶0}Ûê>þÃHæÇ^*DÇüG&>'j‹xPï÷ñ5´dâ? Øi®oàâH\ÎöÒ—1®½)¨¿ø;³ÝS{P/Z|¾Y ¿œÅ{8°üówKŒï¢ç)Õô `/¶Ï6ße÷e¥FN^¹žùÃ;&¯×#¯³=-â …ïëÛÝëøo5ÇŸ$/ĦióØøŸÔmªÀßK·7ƒï;2vø’ð7÷„w²Y!êÆŽJààS¦—5á?C–úU¹!^Å®ç& ½-N¿ê_ßÙUÝþרØ9u Æ7VbŒ[gÑÁs¤nÎ×*oÏ%¶opìÝ{ç‘Çl7î ù½w×sw݈ëÎæ]á-žÁákpªj`Ÿ;—ô¯;‡y4—×bÏË'K<ßÇÖO•ä h±zµ¾øŸ>ôcç{¿É.ðï¾¼æRØÙ.ÞÂxiÄ™H½)Y+‘÷DpT Øó WmÈãÂ{Ù~ðc¬GŠqšÿj\=*‹¸_*f }Íü:d×¥˜¯õÞ~˜çÀQÙ1¥ÐûÈÇ¿)c´E/ 쇾XjÍÐ÷d}bͨ˹ 3žÇž^ ýösy5vx_nÂ6¶.žmã*]üþ®þ— Ã{Ø~œã'»Ä`Fêz ªò/ÓõpÖìO¶êÈëÜ—Ü_ÄÖ'rî7¬‚~ç´]™ª mwl¬úä9~N/ößéop<»/uì¡Éø%ˆ÷kO.4bùüÔ÷º°óÕŽãx…eæßb\$Ôf²çüôªO­dû’¥Éd–aþ7Êt{=åÍë— ÿxw­3Û;)éõ Zø·çÅm‹X}­¨ôðz~'.IÔóé6dèc=Ä©Œ4£)Ù¨;µk7ÈB³ª3?îõgåeñë×€cñwÙzMùËe«ÙºèA—‚¶Ï„ÞÕÛe‡ñËÎŒ0˜©†ëÖ¶Ú–Åž_;\ºåáø…Q+= 'ÆEû\v¡qzn1ãn7ç“¥ì0¸¶)?ú¬Àk4Âò!·nXæ½mòÈÇ9üZ•§“ 9\»gfÿÂE‡›ýüÆÖ=o*·ƒßÝcøñ˜)üŽ_×¾&eèu²h*/óWÖò"…½÷êïºQ¶ù‹åú!³²2o¾ :ˆx]0d€ÇÍËæ•Ö±¾±ò¸L‰™È£Š"“ëÅ ç7«Ö_Í`ñü ÈÄ÷¼k›þJwÂNÇÅWox…ëê÷sJCþ“Ô5U\uïtÕ¿³B¶®ä¸LÄMÿÏýl}$—ÆÖgêU4(½ÎîWÔ¿aÏG¶ÏjðyÀÖ™“zçã>ÄF\™­?¼fŒ”ê“ û޼çÉlŸÂ…Ã~¢Þ Ý´dÛb“³YÁ)öœîØ5Ǿ°õ݆ Åñýò¥ô1>±ÎMwõ o1~)ÙÛŸàEƒõZrÙþ &Cs+Ô¡' ¿5ÿðFÞñR\Àöçõ9ØP~+Jûõš ø]k‹Ú_c˜}ê>+Êö‡¹]-sß÷]ŸwtòÄ„…«G-ÿ…ø¡‘±çôËwˆÍ7öžlqÉvSø¹ ¦»ráW¾©øx%°ýØß·ºá<œK%'àï¹â¾Ás àÏõß1b÷S’wÍ\‹ëÎÌUk+Å<>ýô¤–ÃõP ¡‚ñôÜXgsç ‡»#㓤/ìkÖ8‰¬Sìþ„ö¿ùCG‚WUï=s{µnòPw\êò-+9lŸÕ- ã wFG\ÙýªÕ×r?A¯<{N)=E¼Í+´ïÂu‡J–U±÷ÅÒ—L™¢Çú¹ã$mmÚ¸=×j†}&Y_\>õæß(÷m/ÆUï¾éG¶?šõe·È%¸~ã­³z¥-ß.ßý~,Rt¿Üµð±“ÃY¿£¤¿=xàÿö \JÛ|Ï`ïQ+/~㸡ôEV öµÆhÕÄ» mËÿaüyê¿1®2%²-È“Ëz’: G9g‹¢~áÆ7Ôȉ"O2Ø zßóÂ7œ½'|ýÏ}ÜYU‘®ý×ïš?ßJç÷n’_ ½¾×`÷yyUÀ^ü4äÍâg Ó¡¡õƒ¯ú@MÓ³o?ÄùT¤^¨zöñ<ºúfÆ#ë£ÆÉU¨#SNpF-é1xb }qYäÆÖy±Tlׇ?õ›Ï‹Ÿfêî“ðWÜc|yPbâ¼¼cÇÌ>¿ƒÈ·ì6ÜÁú"uʇà2ÎzžÅïõV]:?ÂSÎL¯A^œ3*\­¿k¼¿sÇhØÛúÀâCÈ“¹®n¶§–Aoâ´Ê X~ûÔãgòvžUÕõ3ˆC%WõÌ%b<­§ì;Îö»þ‰,â^˜Ý ½«øýË–&ŸáW¼9'æ=`Ï“¶Ÿ®Üõ ×yY8øjêY.Ÿ`Ïí´ý -A}1!ãòTÉI¼qЯðd}û{ì¾ÅÆr…lŒÇÚÀ¯ƒ,0oIy†²õ&^¶o‚ÿÕ:ã1ôñª}ì|Û£»žá{ñ‘ª 'GÏäÊ<Û†8³É1ëõ8襮äÀ>ØÛÿ|òSüV/9.ƒãIÙ¿ˆ`ë6»N˜vcÆíNX©Ö!Ä75Õ+áïy÷•°z?ünÈõ‘ˆV4ã|¢Ì:~ v-f™Óֿܼ¡o:ë_ëÎýv¶›Ã/Ù¼úHCü~KÍâÏl¨O·Ìå§ü7|jú ýÍÉ”¹u£ùl¤YX)üé;Ζâ×Pçî©Ù¹z²×¤îÔ¿ã<®Ép­M ÙóÏ[BÙº qýç~±õísªî¶Js¸åæ§ñÒS'û³ûÕ¿Tù“áOÓª‡+"^„ŽÔ1QÂx§N:ê?4kÑÂfÌO¼aG§“:øî™Å˜§Ä  O‘W¸þ¾–­3¿§á„)Û7&æ„•ÏøŸìԛݭ°‡àHGOoë¯vœ§Ñ›$÷˜Çœ3Ç™©Â®Ç(}?ˆ|7vóƒ®wì}:ýçÁ‡¯à÷¶Ÿ6]´’ï‰|4¾q;5!õÆq_¾eý€ ›q<½úåwÌËý.O³gl˜Cö§qøÕo|¤ï$ðø•é9‡*$9üÒ÷T¶a¾ÍVžÑ‚ü·&Ÿ'3æ7›ù7¿©u2ïÀkc¶Ÿ^Ù>ÓeˆK%üôÂ3¨ƒ «ø]°×|› µlŸºÔJÃiS_ošrò]ô?çZ}ý¶¾Ò´KŠÍì}Äé"6–³0ŸÕ¦“¼a¿»¹SçŸkÃ|Ÿÿ×zuˆ¿ýÄn_¶ž«lã{øQ?›kïÿ¼¢>ß ¿ó5@þè,è“Ãcóí0^;ôMç%‡µï„¾hÇo+…ßJ¿óÖç/ÓûI^ŒMØs^³±÷ßÕýþ*=/oÎ_mŒq|U¥ÖcÌ㧉eÑ„Ý}êPÑ@^_:·ÎåÑRäe±}l¿ËòØΊÕ<~r÷µÀlžãbzÿ…½Y/|Écïõ¼ÎJeëÍŠ5ô‘¬vð$‡[p!¯1Gõ‡_hV0âkØì¦Ášð/Uû§ý F\ ûåÔÁžy½ÆCyß‘þ.Qè󦡆QÆ8ÿÊE‚úŒ1>EΙÈó÷$n:Ú<#e¾ˆÑsö\ªÃøç3ñ÷4Ç¥¢RÈ›w‹Hä Öc<~Êhñ‘票ú8ã÷' C„­«»°×=VŸ¹oq…ñITú郼¹¼aè‹„§°çWçïÂõþgÊïÆ»ªeßæM–X»¿¿ÍËDÁ—Ý_Œš~ß3ÚßsOšõÿ®Š¥§Á•©ÿùT€øíµ¢d°[·V^gÃfä=™ŸGÞ žç\Í×wìw*¶ØoDü²QôŠ@Œ><̼ õ•W{§-ô& ×°ñ"ò{¾»ólÔ9–ÓW°¾£¯ÖØ’Õ¨‡ãEwšÈ!o)˜h~Fy ®óûéÂBö~+GÓdÿ%è'gŒÃäawÃÊy¬á1»tãºÿå·jp{ò§³2>µ8¯ þ‰—ÁÏdüF‡í‹·¼auì±@òÉý­¬Ïñ[°i)üX¬Ü’ùÖ8NBŒÿÖõR([­ÂÞ÷¶©ÏW…žœkZÖ|!ÊݤúKâ–ñ÷Öð)l_¨'s¡o~‘óU³üÿ‚ŠîI\ÆÔt³(än“·%Àù„{h/_¿Uòwºÿê×øa!û³pþë6ËH³çŸÒ›çÁÿœ‘úÀ5GüœÔY¬Åú“¼«…ˆ?†?-fuáûrŸF)®] ç²:3\,ö™ã,Þ—vˆÃ=è,2:DœÇõöº©ô z·g®Gß•øÞÁÈßä0ïƒ*.ÁyÄKÊŸ‰Cý°½¾ü«õˆ*Ë"èeüw—öÂ_FËs²×…]9(êÅyæšl^܇qWwí<òÐ,¯)ŽoÃl_7ùÆßîÏ‚·Y¿)CL£ò8‡o §,(Å÷ü/>Ŭ*š·èеy¨ÃúbÎ˰gQ+ùÿmŰӨÇö÷Q‡èj«p¾³ºo¤ÙšfÄ?ýAŒØ}ñ½ê;¯7 yòïÈAäs©Ù7³çÞrG5>w?Áá_èéj6ƒ}}ùÞY¿Yµ1±þìF÷ØÁ«sžŸÖæg¼ü¢1Ózh4*ùNòtó*ðìîn(Îãßð˜V&RÆ?šôk×—ÇmüùbßüŠþQyëÏN…ÝÍ8׺XŠÇá Eº%ÂጆÏAöNnø‰øóÐ<|ÿÿP†‚ânã¶ÓÿK<g4q9ÿýŒÑæµÿóßÁº:Fÿçÿk7®Üö¿ÿ×Û´qÍÿþ_ß`«þÿëïFÿûÿ­« Výïÿ·m]kð¿ÿ_½v£ÎÿåèéÿNQÌÏÝÉ×çÿ_ç4ÌÓÃÇÉ×É×$[ëE,ÕÕ¹®¹²…>Q³O­<íÿ>—e^®Ixù â¯H">W•ä:Ê„u: ëF_oñõ„$_ÕFxµá5²Ä_s‰øúî$_çHxýÂëOßÀ–øF|“áM‡oÞNüÍÿˆoXCr£ Â[×ÞúøÛЉo¼Šä&Ú„Mz›fßL‹øf]$ßñ˜°EaËùÄ·¼K|+Ém‚ ÛÎ l{øv¾Ä·ŸBriÂ-„w9ßQŠøŽ$w>AØÅ‚°ëâ»&¾› É=¶öøMØs/ñ½ ˆïÕGrŸO„}ó ûéßï ñý³H˜B8HpÐâÇ?dÉà ‡u!~ÄLâGy’<„ø‡ÿÈv’×®ÿEøØ^â7 þño$?ù‰pÃn§´‰ê ñOg‘üL á&5ÂM‰6ŽøÍ HÞ2—pKás!Ä??ƒøç¯“üâe—<_žHüËçˆʼnä×ì ·Jn=Aü6Kâ_'y»áö„[ˆ/øM|a%É;JßZCøÖgâßÎ'þ’ß]Jøn7á{©Ä¿¯NüûOHþð>áG‘„+ÿñ-â? %ù3ÂÏå?¿BüžÄïšDò—c ¿l"üj'ñ_$þë“$s„ð[SÂïD‰ÿ®–øïHþq#áß *%þg}âþBòÞw„¿æþ¶Œøß^¿/äý „¨þñ€ø?£ˆÿkÉfh'ü'€øå‰ÿ÷êòvÎ…ÿp»ˆ aÑq<ú<û¿}ÉŬ FxÈQâ‹›è ’ûCxx5ᛈ?¢Ÿøe$—ÜCx”áQï‰?:—øc–“|ü"úûø‡ô÷I³éï“ô=™@’Ëzž2™ð”‹ÄŸêJ|¹ñ$Ÿ6Šð´S„§ÛÆpâϨ'ù¬:³·žý—ø ûˆ?g3ÉמWH<¥•ÄSú@Ÿÿšð‚  5é{ Ÿ_%‰äª1„+^ÜI|µâ«+\c:aVš>Ä×’%¾Ö%’/ã^îHxÅhâ¯8M|®-ÉuvÖ#¬{ˆøzÆÄ×ûGòU? ¯® ¼f=ñ×|#¾~É×í&¼žKx}ñ 2‰¿A‹ä›Þô˜ðæXâÎ'þÖ`’o›Aòmm$7ö%¹‰;aSi¦-Ä7s"¾ù’[H¶8NØÒ‚øVCˆou˜ä6û Ûn!lû‹øv{‰oo@r‡Õ„>vÔ&žãú»sa—®jÄs}B¿ëGrHžs {vß+„øÞ3Iî;•°ïÂ~Ä÷ŸH|ÿs$aMøä0⟬'~ƒÉOo#|úáÆjâŸÙDü3?H~¶—ps!a¾ñùï‰ß’Kòóé„/h¾ðœø‰iɯ(¾r‡ðÕpâ_S þ5ÉÛZ _÷&|c2ño\$~»É…»ßMøæ)âwØÿÖp’ßLøNáNcâwþ%þÝ}$¿_NøÁ:¾ÿ!õ‡ÛQ¸ý —ð“ׄŸR¸ýõ‡ÛŸQ¸ýÅ#Â]±„»©?ÜÞMýáö—ÔnD¸g:áê·¿¡þpû[ê·¿Ÿ@ø=Ÿðê·¤þpûGê·>NøË½Ônï¥þpûWê·÷îûEø;õ‡Ûû©?ÜÞOýáöŸ ÿÚMø¿2œ}R¸}€úÃí“ ÿ[Løõ‡ê D¨?,4—°õâ—‰7œú½ »ÿ¾/)Ax$õ{’Ô~¯` ‡ð˜ý„¥¨ß+¢~¯`,õ{ãKOXMxõ{ÒÔïL¤~¯@f)a™n“©ß+¥~¯@–ú½‚©÷ËE–§~¯@žú½‚iÔïÌð#°@•úÀµ·„Õ³ /¡>°` õÔh%^ºðRê –E9õÜY„¹í„µ©,С~°@‡úÁ½ó„Wº^5Žø«¨/,XM}a¾áµC ¯¥¾°`õ…ë©/,0øCxCáÔl¤¾°`‹É·PX`D}`ÁVê Œ—6~Fx;õ&Ôÿ˜Ý¦ï™‡ÞAý_Áêÿ ,¨ÿ+°ò&l-CØšú¿êÿ l©ÿ+°EØþáÔÿ8 #¾õŽ ;m#ìD}` õnké{n½„Ý©ÿ+ð þ¯Àƒú¿ïtúô¡¾¯À‡ú¾_êû üc( ¾¯ ú¾‚ êû B¦i%J}_Aõ}aIÑL˜·‹p$õ}‘Ô÷DQßW³ƒpì`±Ô÷ÄQßWG}_AÂO‰„“¨ï+H¢¾¯ ™ú¾‚Ô<Âi\ÂiÔ÷¤SßWA}_A–*á¬G„³©ï+È¡¾¯ ‡ú¾‚¼›„wΧ¾¯ Ÿú¾‚êû Ý I.¢¾¯ ˜ú¾‚êû ÊF.;N¸œú¾‚ êû *¨ï+¨¬!\eH¸Šú¾‚jêû öQßW°5áý  ¾¯ –ú¾‚Zêû êºJ!|˜ú¾‚ÃÔ÷¡¾¯ žGøØ\ÂǨï+8N}_Á êû ¦n¸Løõ}§©ï+8M}_Á™3„›ìŸ¥¾¯à,õ}ÍÔ÷´˜>'Bøõ}ç©ï+8O}_ÁÅ>—J_^CüËŸˆ…úÀ‚kY„[—ní&~[*ñ¯S_Xоpû=Âê „Ô©/,è¸Aø–?áÛÔܦ¾°àõ…w ßKøõ…÷©/,x@}aÁ#qÂŽ~L}aÁê žP_Xð¬Šðó „ŸS_Xð‚ú‚.ê ^ê~ùŽð+ê ^S_Xðšú‚7O ¿M üŽú‚wÔ¼§¾°àc(áO³¢¾°à3õ…_¨/,ø*CøëyÂý ÄûaMØJßøCÿC}^Á_êó þRŸWÈ |FŸ4ÎB‘ieôIã-iµþïS”Æ[8h2ñѸ ]$þ`êË Å&ÈÓ'͇P¬™øCh^„Cv_œæE(~šøCi~„Cmˆ?”ú÷ÂaÇèøÃiÞ„Ãw8ÍŸpÄ`âKÐü %Œ‰/Aó(”øGü‘ÔçJn¦ãKÒü %ͳpTñGÓ< G%þšoá˜"â¡ûB©tü±ºÄ›Gü±¤Âq\â'}ŽÏ þxÒ áMâO ûBéd:¾4é‹p¢*ñ'’Þ'>"þ$Ò¡Ì|âËþe:‰?™î/eçÐñeI¯„²7‰?…ôK8µär¤WB9_’ËÑ}¡ü%:Þ4Ò7á4wâO#½N—&þ º!œáHüt_B8s ñgÒý á,[:¿Y¤¯ÂÙ#ˆ?Ûšø³_î[çˆÝ¿Î9Dü¹tC¨È¡ã+’¾ kˆ?ÏxJ¤ïB¥½ÄSú½W^OÔ: š…¯ü×ÎO?4Á/ —S ~Æ/¤ŸS‹êó~‹<ñ‹Òñ‹ëàOÅ/¡·SKãÃèïTØ$|=žú~?ùá:øp|ø^|ø{üRú=ñ5>‚žOE¼Á/£ïSËÈ_ž€_^‚´ÇGn¯ T+žã£èUT,>Š^P­|B~´ >z >ºÿCoü*úBµ* ¿ŠÞP­îŽ_M¨Ö,%M>~m'üÚ0|ŒÏcèU̯<ÿ‰^QÅš’;‡÷‹Íůk_„_Oߨ֟Ão wTfâ7Ð?ª¼_\#|œ>î~“!>ž^RÅ»ããé'ÕæÚøÍô”*Á•ü„Cø-5ð[’q[é-ÕÖ¸DúK•˜„K¤ÇTÛpÛ·á¶—áv8âvÒkªñ¼ßNúMµË¿‹žSí^Gîî"|Ò|ÒOø¤BüžGäîíƒßKªö>Àï£Uû{¿?¿ÿ6>¹+>9€žTø ¾T\Œ?Hoª)òSÚáSBñ)Wð‡ÍðGèSÕ‘`üzU•ÚŸJ¿ªŽú“4 Ÿf„OóçÁ£wUé ðéô¯*ýþ8=¬:a@þ 7ü‰TüI}üÉÉøSô³êÔüéêøÓãð§ékÕÏ{Èÿ¹Ÿ1 Ÿ± Ÿñ†WeŽÀgÒçªÌRüYz]•5”ü¬8|V1þÜ`ü¹õøóô½êüS|6½¯ÊþŸMÿ«.<$?§7>'Ÿsÿ‹5>—^Xå.ÃçÒ«‹ñé‰Õ¥%ä_º†¿l‰¿¼YðWèÕÕ6ø«ôÈêê%ü¯¦xÕŠ|ˆWÙx1ÆË,¼FϬ´L|}³Ê›ŽÏ£wV×N’½>þº'þz:þ·:øôÑêÆü zi•_ ŸO?­nŽ'ÿf2þ–þ– þÖ^ümzku»‡þZÝÙ¿C­î¾"ÿwüï øßÿÂß³Çß§ßV÷7àïÓs«ƒðè»ÕÃò>ÁØà Öà ðî“ÿ¸'þqþñ]üúrUØ…üÂ¥øÂ|üÓNø§aøg‹É¦á‹,ðE ðEôìê¹îùÜó\ÜŸ­qż_1½»zÑ÷‚þ]½ô%ïeïWÒ_2 _r ÿ½¼*­‹/¥ŸW¥iøWôôªLÜ2W|Ù!üëø×ðoèïÕ›}ø7ôøêíü[ú|õn'ùïÞâËðåÛðåeø¿Kɯ†¯ ÷W/ñïíðlÉÿ°ÿ¡ÿqþãO•^t؈ΣJ/ÕØHµUSùÉN@ªÿ^™/º=ðº‘xÝ;ø]ñ5ÙHÍïñ5ÙH­øZì Do!ùz ¯ß¯Š×¿‚¯ÍÎ@ Lðì Ä _‡ÝÔý‚üºþøºYøzFøz~øúì¤þi¼!»1ôÆ7¬Ãó†nCð}6âû<ÇÅÞClú“kƒ·y‚ïÛßw ¾;éwߟ=ˆôÂ÷g"n“?° ~àRüÀ|ü Nx[ö"b»oËnD[೑!óÉrog†·›ƒ·ËÅeW"ö-ðöìKÄþ<~;Þ”üá~øáx‡Fx‡ixGö'âx?‚ŠŒpÇ`"#龜wrÅ;¥à¿®wf§"ÎßàÙ«ˆóü(v+2zù£wâG¿ÅqÂن˞EÆ–â]صˆK<Þ…}‹|ó'ùãlñãÖãÇáÇÀO`÷"Öâ'°‘‰_á'²ƒ‘I+ÉŸtïÚï‰w½ƒŸÌ>F¦Xá§°“‘)¿á¿e/#níÉw[ˆwSø©æø©¡xwv4â~ïÁžF<‚ñìjÄËŸç^Y<÷6â¹»™Ö€çÓØ×Èt~ÿôc¼oÞß× ï›Š÷cw#3jâg°¿‘ñ3ÙáÈÌäù»àý÷àý+ð³FãØçHÀv|;™=?›½Žn&?°4´ TŒfÇ#!ñ!ìy$ä)~»™kCþÜÕø¹ñózãçEãç³÷‘ùwñ¡ì~$t>”ý|wƒüñ Âð ®áZâ± ’Eßá±’Åmñ‹Ù É’ò—äâÃZáÃñaðß³’ðføpvDž‰_ÊžH"’áƒ8‰_fˆ_~”ç‘ì‹$r Ï#ÙÉŠCäEéò~QãñQÉø•:ø•ì$z >š’D—ã`$«Fò~«Êp«p«pkØ'Éš¸µì”díFüZöJòã3rcàcbð?õÅŲ_’Øp±ì˜d]OÜ:öL²þ6nC܆܆|ÜFöM÷%ïÇÎIâ4ü&öNßŽÜøùøøËøÍføÍsð ì $!¿…=”l Àoa%[Ï’ŸØŸè‡OÌÀok„ßÎ^J¶{á·³›’õð;ØOÉÎoÉß™Šß¥‡ßåŠß•‚ßÍ®J’ªá“ØWIÒ>|;+Ùó7ù{Gá÷îÄï}‡ßç„ßÏþJöoÁ'Ã%³Ã’qäàNWÚâr¯+‹ð‡ØgIJ?| ;-Iy„?Ì^KŽô"÷÷¼rä>•»^IÄeÇ%GoâÓØsIZ8>]—Ë#?»_I_ˆOçþWŽ›ãO´!ÿÄ\ü v_rÒ’ý—œšMþ)îƒåôøÓÜ Ëé,üÏìÂ$£1>ƒ}˜dœÆŸa'&™õÉÏäŽX2áÏrO,gÝðYìÇ$ë0þ;297Ž=™œßOþyî%ÛŸÍݱdWà/°3“œ¯ñ9ìÍ$ç þvg’;œü\î’%·‘ûd¹¸ ‰=š\ú_yŽöùg,þ2û4¹ò˜ü«Ü/ËÕÕø«Ü1˯½ñŠÝš¨xÅ~M¤^ر‰¶”|;gÉëˆÏãÞYò®á¯ ù×-ð×¹ƒ–ëWñ¿q-7LÉ¿Á=´ÜÈÅçs-ùø›äß<‡¿Å½´Üš‰¿ÅÝ´ÜáNZîòÏïÕÆßc?'÷'ñûîs/-tyßÜM˃düCvuòð=¾€}ìÆ°³“GoÉyÌ]µøçìõäùüŸìö¤¸;ùÅÜiKñmü îµåEþ%{>yy_®OJãKØ÷É_¿’_Ê=·”ÎÇ—^Á¿2×±û“² |û?yÝÿš ¼ñ'ÿ wàò¶)þ-÷àRÞ€çå^ŽÃdG¨é$%ò“{r­Ú¨©üä®\«ö®ÒkÕÙjºŽx]v†šn)¾{C­¦Ý}~rw®Õü_k=Ný¡¦WˆÓg‡¨é¯Åé³GÔ ¸G× Vâ ¸K×êôÀÕeŸ¨Õ]ÆûÕe§¨Õ³Â× Ç×_Bný<¼¡%Þ;vÍPá°cÔ¶Á7dϨ5¼„oÄ®QkÜ’üÆÜ¹k³ñM¸wךÌÂ7eï¨5=ƒ7b÷¨MDZԚ ¿9wñZs|sîãµ/êàÙEjÆ“ñÆì#µ5ñ-ØIj-Ǔߒûy­åG|+îèµV{ð­ÙOj­Ëñ&ì(5“íxö”šé+ò͸³×ÌðfÜÛkm†âÛ²»ÔÚnÀ·e©µ„7ÿ‘\sîð5 œ÷øšE®=»LÍÒoÉ>S³¼‹ÿ’{}­Cgr;p¯¯u¸ïÈݾÖ1 ߉§ÖIðVì95«ïðVì:µÎ—Éï‚ëÂ]¿Öµ®[Ï»³ïÔzøòû{p߯Ys߯YŸäó½Øyj½Òø\oöžZŸC|Ά}§Öw7®ÿHrús߯õ/ûìª|¡I-Ÿ€ ÷ÏKÄüÓʯ>Ñ7ŸheîoeîUõëOì}g ñžâôßð3Ü\ªÚ oÏ€ /»àO+'ÊU¿ßåŸïŸiðÖ ˜×ùPïÿ}Ús¦{pp•×0ðrqïìôés:•ßgóï„ø†Ìô®òGmäâëïm:Ö;È×;ØÔÙÃÏÛ3¤ÊÇêyxÎñÿô§vÿüÅ/U>ÞÆeŽ·©£û,Óî]M»õ¶±îccÝëÓßwýÊÔ#ÔtN°wÐçÿøûüëê|ÔÑ©þ¯w ùLn•@½Ùîž3ܧyWýÃýï*¿¬§ò¯ÿ䚦v÷fPortfolio/data/SWX.rda0000644000176200001440000011451411645005054014465 0ustar liggesusers‹„w˜SEû÷{{,X±Ë#v{°÷IÎI6ɦn² *ŠX°‹½÷ÞP`{²Ùì.ËbWPT슊ذw±·ww¿Ÿ{¼~áòzùÃñœ3gæž»|ï2s²'äí¼’·Ò Aƒ¼bß—îûße÷ýg©AƒVï»1héQaoÐRKÿgРí¿„9þ‹ÉwÂýÿ=þË@øó÷m]ëì@øƒkk†ÿøD ¼¨ïö“ÿißío6ék×:«¯g üÞ”7VÚ÷”@ø³ÛûþÝ¿ß?Ð ð›?>~mÍ6ð«ýÝÖ „_Ôÿ/ž×7ìã×Âs™Ï®_`¼Ù­}ÿsX <ëäþáGÿÆ®¿{M üô<Õw5ü§@ø1æµë§sýÿúÞgÞÞçúþ=?Ì<ÐõëœÆ¼vý Ïbžû ãnèº>]Çø7îÒÿ/¾™ù¯£ÿõÐuãÝ¿o]iß¾‘ú®áÓ}ÝO~ðŸ÷¯Ï—°Ž çBè³ëó™ÿ,è9y²Œã÷ãí_` | t oèØ…ûû#8|Šô?^©ïzNaœ Œ_`üt¦YGúÂðõ8è<†q«Û‘ôßúwfÃ࿵[CïÖŒk÷·bþíÐ+k‡ÃßÍoCô`cæÝ€~«pyÆ_ z–e+[?ôoäh÷ÿÃx+Â!ðÓÚáßÚŒ·>ýŒ~{nô¹–ùŒNkm=[T¿t­ †¢vmïo†·@^Û"çm ËÚ]xnzaí!ðÛäjíŒs|·~v} ã =GBÏÑØ•µ‡3ÿAèÃÞôÛñ¬Ý“~{0žéóÿàƒ½·ü9ŒûŽN®F.¦‡#áÙÉ~È÷ønýB>£ƒé»Çzí:H³«$ã'àg:í=³»ÆÁ—Zè©G®cxÏì/¿ÒÐcö˜EÏÌŽmžïÙu zgó}6Žomž÷òðñdôàøh8qãX{*ãÈ[Ÿ­×Öo­­sr¼”÷.E/®d¼«xn~Àü„ù™;éwý¦Â‡zÔÍ:‡/O².ó«/AŸùÝkŸ…/¢gÕíÐ÷«øé Ò}oiîÿ]‹™ÿ/æ·ëoç[øó1ý?e½Ÿ3ÿ‡Œ÷!ò]€ž¼ƒüÞgÝÕ­Å!ßqýëþ~[¼ó|ý~ýÀؼ6Ý·ùÿ`½¿#kÿиŽÿø+o%Íë­ :½¥5¾‡_òðÞF⧇ôðþÁ[÷­ÿ¦Ì³ól*ùyëˆNo-É×]a<Ó ã{ukëµ8òädü²kã¯Ý·Öäþý¬5þ›~}~ƒ}›~˜^=?bÏ&g›ßâc»oújñ°Í÷ï[û2tZüö_›~[kñ¶Ño­Ñó%zaë1>š~Uë³­ ½qvù·Þ79yË G»„ÚxÖš]}ÉxÖŸ«ÛYé¹ñÝÚ¯X·Ù•ñÛîÛ8¶N“ŸáˆÙ·ÙÅRzîZ³k‰ë¼åÐW»^ý6½'~úçû²ÖìÅìhøiï™™=¬ÆóÕ±Ÿ5 Ïæ%.töiï¯Êµ½o÷‰=ÃXq¡GìíÈ|»IÞŽða'æßAzìý—y¬ÿ¶¬cÖgïYKÜå‘WxäñŒGÜàGxÄ3q‡G\äïxÄG®%NòðãñŽG|àƒîÓ?ëág=ò2¼Ê›Æý‡ìú§3~‘u5 ‡{¡›|Î#ïòðïñw|"nõ‚ð™øÖ#ÞõŽB^Ç@7ñ«·÷÷þãgºÖäeúcú;Xvåð]Öi¸múDžã‘çØûá¿À±_À¥k¿¦ß¿Ù¹µÎ™|Éé·ÙyˆÓWò|Æ=·÷ȧÜú-O3¿hñ‰áˆá¬µ†¯æ§-¾0ß5<ýˆç懧æß­býÌ?>Ž™ÿ0´ç†w®ÞÂøæßd¼àÿóŒgu‘ÇÀÃǪâ¼9¼gõk-Λ=ÖßâG«—tó¾]Û{æ·ªÛWàç{à²ù)ÃmÓOðƒÆ_“—ùóSöž=7>߈CüCÈÇ=òu<ÝÅAÖ^“‡;¼£ápÏZÓOkÉÃ]\ôo-õ º†³ãí±ó?‘÷»ûoUÓk­Ù‰á¿µ[²›ßæ3Ü!_öÈ“=ò]¼Û#_wøFïðÛ®í9ù°w<ëöªúS'p­ù òN<ÍË8†ëç€_ã៵ÔÃ>ÞOo ¿ïgž›á—½g~ÂZëßÂ|Ôÿ¼)ŒKýÏ#/óîgæ?Úx¿ºŸùò7º G}Ï#ïôίò3×C7õGo òhd\ìÓÃî½WxN¾ç‘ÿyØ­7›u¾Î¼ØŸ¾{à¶¿<-vãc/>qˆ¿¦øçã?|pØ_Vüò©sùൿ’æññ?îÚž׸Öìz<âKÜv-ñ¾Nzà¯kÁayœOÝÓßKrwó =ØŸO}Ø'.ó‰Û|êL>õŸú†OÝħü¯-uiÿ®ÿ­?΀^ôÞŸÌ}ìÞ?•õú'CŸk™oôR§ñ©ãøñ>öåSwñ©³ûWÀ§«™Ïè¸~Ú{—1¿µW ÇöÞ5Ìwt`÷þ]\[{óÝÿÁŸ}{÷©óøà™{ïî[Ë>‚{¯:f}ä¡>qO¾êã¯ý™ðÃæw|ê|>uQŸøÕß‹u·ú»±NÓ;êÄþÁȱùP‡ô‰}êªn<â>§ÏøY7>ui¿ëãçüªÆ©nñon£ÏÖ…sýÌn¬=¾P/ö©SûÔ#ýqÌoöB}Ð?ƒþ¦G×2/~ÁÉ•}'Çü{NÞâã_ü›‹µ¦¦wÔ }ü—_aÝô·ö è"ô{ «ÌýNèÁÏùÔCÍ /êÀOÃò¸ú³³gã~ß§ëpÆìÛðÇìÚìÜì”:«Ó3â §g¦§Ä;N/÷EŽÄ9>û®5œ6ý²Öüƒá±ùIÃcòi§¯Ä_>y»ó“æWÍ¿P‡pזבŸÙsüÄ·ú†Å½æÇɃ<âr¯ ¿|½ÙøM‹À\ð¨kyÄÙæ/]kã“ÚµÑãÖGýÈùMó§æÿ‰kß2¾R‡rþ™z¦‹7È_-Npý­~eu-ê\Žnêaù…£ÓÆ·ºéŸÄoÖßÞ7~¿Ég<ògX|ò÷Ùÿvò >è‘'yԱܸԧMî¶‹S=¿‘7zó‰ŸÉ]hó›\©ŸzÔñœ_¬žüwU\fñõ'?òŸ|ÅÝ'_ù×ÖìÅôâßZÓ+ê>ù¿£Çâ/ó[1.y‘³Ã “ú–Ͼ·O^æ³ßéS‡qvl~ÍìŸú…OÏÙ7y£:™»6ü©Æ#êFþhÞ'/òÙ‡ó©£ùÇš_eìk:<³ûÖ’¹Öü˜½7’y / ŸÍ﮳߸D§^¶D¼ou2«ca/ÿà!ë1\2<²q¬^kxDÇ£îäòÃÃ…ô§ÎípÇðÅå3ÐE]Êc?Ê£.åìýmæµ–ý<ïYæ£~äuá*¬8Òå¿Ä¯ñ…»où²½guÖ2ÏmÜt63q‰Ë›-O'žõˆ‡]žmï[ÞÛ^¿ºuPÇòˆk<ÎýxÂçG˜z˜ëg-ç<öQ]?»¶ñˆ£<â$×Ïøj|~º,ÿ4nxnúezþ;6d~ßö1¸ïú™¿bÕ£næQwüÇ_#óæwªß·üÙè¦þfz¿D¼aùºµì«½ŽÎ?þ…æo¬?þÙÝ7?ïü6ã›?¨ŽÇÌ®7«Âýí±S‹ï¬eÄùÃI‹-°kk«ýû"îùèß¡j<ëgôؼF‡áµá¡áôñUy‹gù‹½gùšùËï-.·üŸs!®uuÞg¿ÅÅãÔßü‰Ðoq;õ:wm~cŒÍËø)ÞgÿÄ­Çè´Öè Žèüƒù kͯ˜?1ÿÂù—OÝV/°ûgVå–_Tçì/¹–º«Ø}«gØóêüúŸÏùAÿ>ZË×,7]>Ö ÿ,´ºÁVß`Ë¿Ì_³¼ >±ßæønr°ºûV®Ÿùqóó¦öÞ6óÚõ(è¶û–9ÿN?ÓS«X^^Ýš¾‡¡ÇâÓOÓ3Ë+MÎg¡‡&« YÉê6Vº‡k«£X¾lüÇß¹çvÝÄüì#úøCŸs:.·|ÜÞ³Öäjz`ãÙü6~p‰vü°ñ‹¬ßèÆ_úø?wmy/ò}®ª%_ôÙ'r-ùŒÏ¹Ÿ¼Ã'¿ñ_‚^ö«|òP·›ßø„ßöçAŸÕ¯ð·Žn³£Ûêø_G¯µøcGçŠ]}¥™u]ìÿºÖäÖ½&w›Ÿ<ËÑmôPowt9~Óšýš½S×÷ïa݆ œ sõDÓS«÷Y}ÆèªÖâ%Çk­¾cÏ.«Ú5q•«#Ú:Mþvßän÷«ùazC>ê³?áW997ùıþ{UýïÕvaò4½7y™Y?ãçüiè‰ÙŸcò1>³ãZ«Û·:yY=îøkxi¸dùUù -Þà|«Ëk-¿dÒÕÿ-¶z©å½–×ìiùãX>lãÙ~„å·6¯åɯXÝÔÆ³¸ÅògÏâÇòKËwðÇê²6ÿUë¶ù,Þ2¿P]·µÖâ‹ol?ÃCŽÖZü`~ÏüÐ1ŒoþŠóÎ/E ÷ämã˜ÿ㪻oïÊóxÏÖcõÎÛ¸õÛµÉÑêb&w«?TÇ“¿Z=¡ºža|5=°k‹íÚÞ7:¬žÂù"§?k¡¿œ/t­Õ+-ßµ|Âöã¬.eû–·Z~du0ˇ-o±çŸWXë òLÛ´üÌêœø3—ÏÙ>-xï»vìòVkÁ —ßÊýêöÞ—=ö—¼ÉäIÖzÄgî\øàZ;çdç¦ì<õu/ÝÔ‡<ôÓCÏÜ9"»Fßݾ>u$w \òˆ—=öå\kûðXõ·oûö䮵óYÖÚûÄ_ûrûhnßî_ ½F‡ÑG|ïø‚ýºóWÔó=êbû6ÿœk`|ðɃ0¾Ù9ðÆ_ܸì£zà‡G¾â‘xà„¸ó&'ã;q¬“3õ3wnÎZâo'oâxwßôÈäP}NŽ}×})w®‚üÄ7°óqvŽÁê/f'V§±çvßÎ]à]½†øÓ_0»³ûvmïß¹ç6ŽÕ›ðç®îBÜëñý—Ǿ¦ÃÎM¹Öê4ÖZ݈øÐ#Nqû$OWÍc¸btžØ¹Aà «‹ݶþÛX§Õ¹nB Oˆÿí|ñ´«ç½v¾ÃpÒðÑꈶ?`uA«;Ú>„á¨íÿXÑꔆßVO´çVO4¼æ|»®®?Ú~“ÕÅ8Ÿæêi&Wã§Õ MˆçŸÈ£Z}Òô³º%.s8s+ò­níµ|ŸáÎ Q/p8n8˜«²s³C‡ŸÈÁÎùz—2ïŒwvÕ{vÊÆ3;·s¨æWl\öi=¾kñ¨cxá›kxZ}ŽÖÖCýÀáˆ­×æ·÷'VÑoøÍ9‰Î[Y?äfóQ‡qþýáÎõB‡ù òyGŸÑatYkøI½É]Ûs;§lçÔ¬µsi†ãÇTùk͘1¿B\ìǺó½Ô/Üù^âA¸ß½oþÇžïnþ‡çÖîŠ]nÇ:¬%þ÷ˆË÷ ~ ýÇÕÖÓþø<µäå1¢¯|ú@A&PÎ8†@ùÑ_>óô•Û”»vXGylz€ÎòèÁÊ[ –ûÚ1òmÿlCÍ{ã*ã·O7 ßöõ~û“Ðu¢Æoïâúmñ½¼î@ (/«ëößX ¼´èmŸ->´· h ½qÀ‘Úož@û1Ëð£ýJÉ»ý‘ð€üÛßí| }îÚ¿]^×ïAÇZû-_‹îk¤·ík½íHŸÚ¿¿K|Þ4ð¼X÷_¢ß éAù­³ü‡æëX[|)?v”äþ ãÏázÆ@(¿Œ\—]–ÿ”–Ÿdõ’kyÒ,Í¥pª|󳚷ºí]@å× d}ôŠOå§™¶cÃíÆï2P t¬*ùw¬ýël,:ö•¾u “|;Î_:®ÿe€—K¯:¦‰ï×J/::ÄŽÉŒ;AzÙQ’Þv”¤·J¯:î§_I|ê¸HvÒq³äãÚ¤?ψ/mŒ÷2ëYÀ¸ojÝ®}]zÔñÛÀ†N ã5Æ{_8×ñ¸ô¡c·ê߯úN…ŽÓeÇgÒžÅ|×]¡ç“_[àßÓÒçŽO¤7•å´ÎʰÄþ‰ŽÊߺ߹=|ßù ¾T>’ÿ«|&yVfiÜΕħNö÷;דÿî\¹­~ ƒÏKŽâçÊ׿Îõ´þÊWš¿²@þ¨r7úþ,zÞŠ>­,¿[ùˆqZáÃҋʬ z¯E~¿2SzS™ˆ^.ŽTfÊÿV.fþìïøWÝ>¥8£ò;òþq3[ݾ/­|¨uVÀÓÊ•Ðqօƒ‘¬çpáqe¤ü]åpè;òVÉéÙkåLùÕÊ1¬{4í(ÅS•ÓÑÏëÑãÖW>WÊôïE¯®€ßwI/*ÝߊO3­¼7Iv]!^©ÄhsàڶФp¤2X~¾²~æ#Ñ×Ñ…ŸéÁ/Ý,¾wÌ”wPê˜Ãý4ø{ýÇH:.‘¾u\Óº:‚ÄàÇ¿ÂÏ_¢õ–ï#NØkâ 2þ°}žüzé5â½$ÏöÒ£öïeïí ˆ –U¼Töˆ7–&®¹]ô·O$ŽZ »mIü-¯-}(‡˜ÿ ñ¿|­ä¾d+¾•ç'tŠžòÄ•9ñ»|ð£<‘vqÁõZ_yãYû9ñƣĉ‹DgÇpðhøõrÛWtv¯utì,}ìHÈN;òô» ?:ß*üëxBãu<%½sm‘¸¥=¹¿ž“½uì/yt„¹ö<ôà\â…‹¤—NOŽÂï¯Ê¼{wý&9–ß‘œÊóàWíÅÒëòdâÂüIr½9ñìbá\9$¿_¾FúZîF/®„áRyâèEâOû'ŠÛÛˆÏOWœÑþqø“èÏ£ÄÉÓÈ®¿ÛßG/g §òí£Ð·µÐã ħvð¯½@¼>‰8zyF7qûZOûݲ§öÛÇ´_-ù´ï ;/}}Ã$¿ö¼üfû1е¥ô¤}°ìºôóo)ý*ý,?Xz—ûëCçš¿ô³ô¦ô˜ð¨t¯Æ/õŠîR½ô§4Mø_ºPùai/Í_üPü*^£¼­õcùÕ¶›¥WmïIÏZÏUÜÞv¸èjýLöÔz¹ÖÙ²ƒô¨©¢ùZFËžZ‡In­÷IîmKÉ>Û¾Ž´¯yÛÆ0ß²·¶¯4^Ûò¯m÷jmWjþ¶ÇDg>ÿÝ‹Ä϶Ez¿¸’ä[ÜQ~¤¸™äXÌJߊÓħb“ð³8A~±x·ô©xœÖ×ö½Ö_ÜFú\ÜMvQ¦x¥8G|/>(œ/N‘ÞÝ¥=Ñ=ÄÿÒŠgŠ‹%‡âGº_|úK¢«x1ü~û=âwñRùëâø¶XøóomiÑYÚXïW·Å¿%·Òòò÷¥µ$ÏÒêÐ…]—Ìn–F¿‡)>+¾!»,¾ÄzZdÿҝâ<ÙwqzÑ‹>Ì—V~ÿV\Yª¼²¸PqFñÙc±¹>Dÿ«…›Å”ì¦x¬ä\¼ý™ >[?|JëË—Ö὿ЫûX×e²ï"õÈâù¢·x/t]‡=¿.½)~)¼*~)½+m#;,­'úK¿ÒãÒXÍW ÉJ{)Î,‘Ïi<'~.MÿJÍâoé~áréùÁÒ4éUiŠô¥4üyLq^é%Éi‰–<¶ô òXˆÞ¼ƒ¾6JÏA×Gð­Mþ£Ô¨¸°Ô ’7—~Uœ\úYx]úQr-ý‚ž}?I®¥Yòs¥[ÑÇÖ=M8åÚ)¬ûQÖU”Æc·½Ðû0ýîRÝǵä祟Yß¿µ ¥W¥g¤g¥nɽDÝ©ôó= ÝóðMØËãÒR }ˆÀŸÑŠcK{c߀‹¿Ë.JÄ;Eö7‹'jÅ=õ^±EøUœ¾Q7l; ¿qŽì®u’ô¬í$Ûzø¾v¹3v´3þàa=oý™ë&ìîpùŸâò·Å]Ä—¶qÒÛÖ=t¿õù™–ƒ$§æ›O4/ÖýæW„ïM£ÅdžEÂÿ†IÒ»†ƒµžÆÙâS\ý›ï“¾4'÷ñ¥ižì²‰}ÅÆKÔ6} ½lºDúÕ o©þ½Ö=ýKù•†ýï–jl•¾5®ÎûÝ’g£¯÷W?h8Mz0}¡èŸ~±ìyúñcújÈ«Ð8M+KßKêß´†ÖÙø«ÖߨÍ<—J~ ‹µÎFÎM5¾B¿©ÐAœÔxƒðµq‘ô¥ñnÙeÓÑ’gS |ÛGzÐØ*úó’Oã&ZGãxæ?^úÔø‰üeSú#ðý¿Ü-}mz ½¤ü«é'É«išž7o ¿ˆïMèóÒè÷ÁŒ{ˆì¶ñgéIãÑÝxÞkÏ‘Þ7ÞËúO…?q¿"{oÜSüo ‡h¼†·þ?íšØeTtÿ[ÛØ.}m|:§¡?wˆ?gKNg!÷áÛòÒ¯Æs‘PϾW\Õp½øØ0Nþyú“ê7ýI½7ýÉ{ÚTñoÚµÒ§iMšúÑ?} ñkzÞ›ö’蜶Xò™vœø6m3áâÔçDß´£eSg‹þ©Ïiþi5ÌCývÚ¢oÚjâ÷´µi·ÖL%xè áÖC=¢ç!öqœª~^/ú ·üFú2uˆômjƒìgêéÓ´ô_ _Rj§íË:òÂÕiaéÓ´ÕàÓ–ðábÉyêS¢wÚÙ’Ó´§°ûM$¯émâçô«4ïônpbwÑ5ý7ýU­¯!œ©³6ð»GK´Ã…Ÿ g‰Ž†eŸÓ?æýÑ¿†õ…g ‡pmípú](>5¼D¿ÇÁ¹èÝ–è×Ò†#4OƒÏû§Hž ·Ÿk‚o{ §ï3îy’SÃâWC„þçbKƒ;´ Ôm/_Ä®Îá~'8em8·ŒøÜ´'vù4xu¬äÐtþdŽô¥)KÞx–äÒø ¸ø ô}!{lĸËáÞ–4’5΄ŽÏÀ§/¥?MgaçipmsüýÚøãtÍÂï݋߻‚÷¢øÉ$ïÿOúÙ4Bòi á÷ÛEGÓÒã¦ð+¯ š×Çÿ&?Ù¼‰ô¨é ñ­y æ}?ú"×_CßçâCó6²×æõ¤ßÍ'€ß ê×ü’øÓü ÏŸ-kŠ-ÇŠOÍŸ@ÇK¼·Xvֲ޸Þ\!ŽØ]ôµüGúÓr?ñùrKã.þµ´ÿ—™·§Ìµæiy•úÁ*Äi»i­žôµucñ»å,áFËžÒ‡– ëüVý›çàϦʿ7æ~^zÒ|©äײ3ëùCòn~Aô5G\xqÖAâkËÖ{•Æi¹:µ\+;l™.>·Ü!ù¶Œ ÎúˆøêSø·ë>ˆyöcüsEoËx­¯•ïŽZšeÿ-ÙGË­²ÿ–Ÿásr˜Å¼sÄ—Ö5ÄÖ#—ý¼–û8-ã¥XÇGÒ“p»å}á\ë`Æ[VtµŽ¢ ‰ß­ ‰Ö{ÅÇÖÃEOëþ¢»5‡œ7ã½qįñ¹õzú‡™owáWëeÜ¿ôdúSGº–<àßÚNá^ëŒó/mÛYÔ®ßÛΔœÚî–}·×8mˆmIéqÛ,î?#~‡¨_\‡|hyÓªÔ†ï¨ëC¨í+»+úÔÒcÈ_ÈgþG}¦†üg/­«8š:ÁᢧxŠäW¼SõÛ"ùvq ùÐ5khœë¨gÝF½ë>êS7˜B=áÞ›Î<ãµ/RÔLª“õì'½)îE;HuËâêÔF(¯mûyü…œ¶ŸÛz¯-Ìó×…³m¯®¦úvq)ê`ƒ©‡DðTø|r(ÀϵŸ]¼9U·WñüDê`ç‡ɪ'¯'m•¾oV=¢x+rj…oQ{ýhaü¨ŸÝ%},ΠÎõ¨ì¡øu·'xÿaêV{ñÞɬwê]ãg õÌ-‘ËÞðýdž[{õÌ$ü9BöRŒQÇœÀý‘UíVÔ¯¤ž¬y}óc·Ð^§zPq2uƒq¬oë9=¨£nÇ>~ñ\ø::ÈÇŠµŒ§î5=< 9_€\'À¿CÐë£Y@øTÜ ~s^¥¸ôlMýlMáYqêvËQ\Uëm› ~4/ÛÎ’}µqŽ ¸ºì°í!ôµU8Üv&x2Gòi{ z—g¾ÁâCÛ¯èͦԷßEßß .½;uû™}ê-KIO[¿_‹àè—Ò“¶ÕEwë\ÍߺXòoýLvضuú­¡osêñèÛíÔã/纖úþ½§íbêðsÁAè˪èýŠÒƒ¶EàñßðŸýñâÒÚ,æùOèãŠÈÑê³;©ÎUÜ@mÛèŸ\®‚Oo ‡KËîÛÚ©S-C]øàã.Ø ûvÅ•dßm_°þÇhoaÜ"rÁ÷aÈ{xu’ä×¶;ò Qÿ:–ø‡ýµÖ_ð7ÿ“¼ÚÆÂß­¤ÿmÑ—yèëðCëÀ·ƒ©ïnFýnoí;=ðêtð`,þ!Æ8§Àß±§ý±ÓM±‡Yçbpf(8¸!ó/_9?V\ ?³-ãmŠ]/¶€ÿ[Ãÿ͘ìþxÙI1.EÁÑ4û:Ç:ÞKâ.âùåøak/Ä~/T|^¼œ:ýØ—µ1ÞÓ\OmàN£âæbözë¤}‚â•ø•&pç ÖY¯¦-"§ 83 å\W‘ï"‹ó˜×ü€íg|Þ.b_á'éIieá[iSÚáê_Ú„úüVì+L½û`ñµt˜öCJÃÙ؉}‘¢³t‚øP:H¸PbŸ®4Bö\ R¯E½þñ¹t¥ì´tuîûy*uìkdï¥ÉôŸÈ>ÏìçP'(Måý‰ìœHÛ£N“ý”’¬;C=|,ûdÕ-q`©@]?ŸÎ¤%N.NüöZ¹ß¬x ÔH½ÿvÙW©™ý.Å!¥éÔãmïböÆ2O–~ç# ìï+ý+q.®t¤ü|©†}€‹Ùï`ÿµÔ)ÿèÚסo6ó^)<-]…<D^÷¡7®åý'‘Ã+´œ§,}(~·/ž÷*œóÝ^zÔ¾·æiß[üj¦õµ×ò|œöeÚSŠ[ÛG±>ñRõ?ƒýös82‰}ýÄÇö›eoíWqÿZÎß 9´ŸÇ¹iÐ÷€ô­ýNñ½ý ­§=Á{ã´®ö…Kí×Aïöû§‘}÷GÿFé[û“Š{Û?†¾WÅßòr’Sù¿Zw™ýòÒóòÁœk ÊGr÷8ÑQó~Fx[¾s)¾*ßÏù‹éœSyUq\y®ð³Lý«Ü »/÷rûÆû€ñÞ‘}•Ÿ_ÊHÊó|–øQ~~OHN噬ã­¿U¾D8Rî’* ½_ çËrÎiëüCzÓ±÷‡©_ç±;Žâ\l†~#„opf_Îßœ(»ê+ûë¸AúÜ1Aëí¸Uëèø€ó®¿K>_3n3ãq>¼£$ûè˜%긓ó>|×ÐÁùÓŽ³ÅÇŽ)’GÇœëO¿0óNæþmâKGë›,;èÈJ?;ÞÒú+Ëk=•µ9¿áœ\H¸T9ƒö,éiåDWÏõLɯr?çü¦K~• ´žJ“ì¨òç I«(îÜTtu®©q;‡q^ï+Λþ"\®PŸìÜ[ëïÌ(žèLq>òTŹù‰Îã´Ý9ZüèuŸÁ<çH~Ýc„+®=Oöؽ›ô»ûPñ»ûjæéuóLw¯ê>Ýè=ù~'>w/‹\|ôf“W%Ïm¥O7 ߥÀÎMZÛå¡iÅ™_)èÚRøÜõ_áBW}¦í|E|ï\,Ó”wÞ-~w ®<%>V^æüôQàÅÞŠ«:ë5çùØéMàÖ#Ðû8ã—±¯«ÿ.ðçkáB×èÿò[]iÞ®c…c]'Kn]GkÞ®SàWDqJ×ô}¨ð¸sð½sçÂÛ´ž® ¯wþoÇø÷ðþÂù.ü{×»ZG÷FÈ}ìÄÚåéO^Òõ'vÙ!ýî꿺~]]ó•Ÿt}¤ëîµÑG¾Ûê¾}¾}¼}?C~©û*ág÷ªtߊ]Þ)=Ꞧõt?/ï^ÈõkŠsº?“^ÍXNïÏXFzÓý.ót1ÿÂóîûåǺ?gÞ?¡óS=Ÿ±²ä;c ÙÁŒ!âûŒ”ôlÆ$áËŒ€ø7cÙÕŒ ÅŸ·‹o3î‘ÿŸ1Mx3ãÆ»Bö0£Sx3c‘ò´_Ê.zéyÏ>Ò¯žƒ$žZ­¿çÑÛsˆô½gæíÙWzÚsð¬'¨õôœ­|¦'-=í9]òé/úz.–ÜzÒÌ»½â„ž£¥=ž³ßÑó:t~'>÷Ì‘êáÜyO»øÓÓ+»íiWØó¾òÁÎõ÷<®ø¿çYɹç5ÙAÏÛ\ó]nÏ錷òùB8Ü3RvÚ³<|] \êYAv4ãGùÿžaÂëž0ü8Hþ¾gó? ø¢§…õýÀºÿßgn ×ó-ëø]ãÏÌ8 ágU;“ïg®'ÿ8s ­c‰ö Ñ7óLáÅÌ:éÅÌC…_3ã©™£Ï,ËîgÎWœÐ»–äÝ»´ž÷n$ûîÝHëë pSúm(»è=Œç{Kgþ$º{·ÿ{`öz¯”ô6ËOô6 ïzÛeÿ½ì·õÞ)Üì+=ém‘>õÞI¿ c¾øÜûô¡—ßéè}WxÙ{³ì®·$9ö6K?zo”ß™yƒâƒ™û©0sGÅS3G¢¯ ùÕÌó¥3_•ß›ùºä9óQáçÌË5^ÏSZ×Ìíxgäx›üÏÌNÙÓÌÏYñ`o”ul)=ê,½œÙ+=î]Y8Ñ»šæï]VqAï±Âû^ŸësCuËy‘Þåß{9GÞËï ÌZYyjï7šoÖ:ÂY늳.?gÝ/ùÎ:Kv;k–ð}Ö'âÓ¬Z׬'Ek_–¾ÏjÎ΢.9k¡ø2kŠø™:l|qÓ'ïêk/ZsÜ­WR;ÕŽ¼|£©·¼Êá=TàðžønûRG޽òÀ›/¤ŽX¥ÿF_­/•îï¤ø]Tf…¶úìÌ@ªŽ÷GG6l^a§¾÷>}NÇžÔ~ŸñꟋ©ý¹>à×·7qQ 5öÆÓzëÏ ¤b[õuø+òÛÿûŸÐ2T’6óä}8::¹oø3^ ¤ ’[ªö«ëóã‹TtRßÿœH-|M…æ¯sévƒ©ãŸ}ô¢5O껿ǑOOû¶o=¬×c½{swß Ô®þÐyðÔ.ò©úFÝô©@j ÙOjH·P ùÝþý’ŸI“ÏŠÉ™âC²"º’śɇ§õOHÎZnË#6$ŸÑú’•þe×’·ˆÎä]›ö/0¼­þÜ_ßÞ"¼LëJÞpðý}+$oÞ$oïï¾J yj»Îý-œW5÷3>¼XüNNJýòwääCï}xb yåCŽúy^ yßzýŒ$9oœ|z¾ÐOH ùñ2ýÉOe7Éï¼ÕSG¿ÒwÿÞ~’óûØtÿÜ@òµ¾á^˜H>%|MÎa~âälÅ™Éöï~ÿäÄ@²Ô¿Œ5É–>i®wã’íÐwöÍôq*+ù$‰K]•Þ$wíá—@òÙIòˆþeoHä·’²žƒöì[À1}÷¥_ɽûÙ~@ 9âçþäýÓHnÙ·Ì—¿$7ƒ/.èg\ ¹4ó-ÛOÖˆ@í_Ò×ä~ÈýO¢ÿI~…™ßÚSYWâéþÉr÷¤wÉS¤·É¼ìǵçÉþ“ç¢Ñà û–1òò@ò|ùñä¹²çä)èG½Üé÷OÆ^yP ù_Æß¦_­6 $7í3ó#g÷­›÷wAŸÖa]kóÞúèíF¬kå…{g"õÝGž+ÊNjÿkÉ>j?ÔxµoiµOô wà-Úgeÿµ/ô³Õ ÔΟk_¤å÷WjgóþÃ’kí|æùIëvík ý„jßC~ËBïÒðmú¸,v»f?œ¬Hn­¸4¹^o¿Á’CûÉY½oýýê8¡¯_Ÿù4üѧýðwN y$z’éŸv@òÒ~õ_7¼»˜Ñ·¬:ÉÐÃ7±3Ω&ŸD_{¹ß ɹÂÇäî?ßA_æÈÿ$gag]ØG=šÁz¦öIaÜmäåàI\|MÖb¿£˜'‡ÞÆ¡ï æ ^œNœŒÝÎ8cYÇyÐÅïj$óØ_-¸íóË ëãz5ËÁÇ(z“e='0þ}p|çÔ¾çÂÙd=ã÷Ç“‘>öOú:<\:‚öpáy2,¿”‰^ÿzv@ÿ·G¿÷E_d»²î]úÈÚ°¹Ï.°ûû‡[®ï=ä¼ú4œûÃáÏŽ¬Óìi'Úà…áÏ>àvœ WYpü2†ŽcàÇ èi¸nŸ},LÊ/'cø•:ù»äxÙSr"ý.ÂŽ'^}lÇÉ3yï ôä&ùÏ%ÚÉèïu\_ÞV·7ƒÿ³Ñÿ…´_Hþ©eÅÇÔ Ò¯ÔŠÒËÔV}lz_ µp%‘§BŠ{RèeÊŸS£¤ï)ŸþYÙa*)|K…è"~ˆÉRAÙWj\·#)~÷+îgï Ô©ÂýTBv”ʉ/©qÒÇTqàê@üÿ‘âoj_Ösãd§îþN’kjGâ•-„שµ¤©õ¡oeôä'üÀߢϵó±çúÌhó—É·ûÔý›{É÷°‹OÑ¿Wàÿ[ØÉ·ö >|]ëO¾Âx ÁÁ»·ÆõwìÃìôô×üö«ô{“ù^ç^ÀþÞÀ^_T<•\½Þ"¼O~ˆ}.¤uû±ò¦äKØý[¬÷ üꋊ?“/‚CüžxòGÚ¿5_jákGÇí…žìB|¸/ñå0ùóqDê¿èU€¸öáq*@œø_âÇ„g©]ˆ÷“¿H_Oí„þ[»ð'µ›p/µ'që¼·‡â‘Ô®â·k÷“¿ODÿ‡þ(ù¤öÃ~Žf=»H?R#„³©mˆãG ÷ÛÁ§uˆÓ×?çõ©ÓÓÓûä.Íg~Pž˜ZEúœü}ûÜúVï§–B~Ÿ-Ä|J\ø+òúŠø÷[ð÷Kðæú/†ÿ+i}Éß±¿õ4NjcéwjK®·—^¤v%®ì„=n£ø õ?éyŠ81E˜Ú¹îÿØ­ŸáԱȷù¥¤÷©ý}ð(?#àMZ8žÊ Wàtj,ùEz%?:šqŽï¢èÑÁÜ?\rH…ž {I¥x'u(ã?F ŸS{ƒo{BïÈqWò¹]$ÇÔÌ· z6T¸Ú”~[ßmÎ}~#µüÙ¾U<–Bÿ¡ðekòÆ•ÀÙuÀÕÕáÇpå)©aäi둟¦Ö/×çùºŠëR«#þrjUéojSø°ýW•^¦6’ÿJqN%µE_¸sú3}ôIS[‚ãcW› aŒ¿þmwøoùñfŒ»ñþïÅúE¯|ø{ùpBñd*_ˆ£Riô%A~œä=Ó¿8ó‡À‡ÃÉw"ïÞÿ³3ó`Û*®Hmÿ6Áî$¿ŸÚ~š½ü[»ëÝý®nMo¶Rœ“Ú‡k~ç#µ'ùüpä¿;8¸#zµoØé[ó@½ †˜¿·u‹~‰FÁïQøë”¦b¬st˜Ÿê³kô뎩zâ“:ø“¥ }¨S\•ª—rõ†Ñ0öP+éð!ßkÁŸ vG~·Ô/ðwoRõØ ùF*‹¿:?E¼—Gã,ôè<ôðbpðlðó,üÙùèùuèÛyø$zØ|¬mDOÛÀízÕ…<¤¾tô>€ü­-bwàοµø·ÔôêUâÜw°›×‘ß×Ðý“ø‘^ZüK/#ýIo'ºÒûKOÓû)nMÞ¥=éuúÙÚÓøé¤ô<•ý¦ÒßtHyoš:Júñ1?Mïüä;飥éð(=JüMï'úÓG‰Ïé#į4ßI¤Χcâo:-»M‡e¯é‚ì7íËo§#¬?/{I'ä¯ÒÇÉ?¤W¼šÆ®Óqñ-‘þ¥G çÓ‰ÿéCdOiòÎôÑð+!¹¤¦S¼_ýc•Ǥë¥ÿiì,]Ï|' §ÒuŠóÓgHOÓ§A÷ù¼?¾]®:FúbéUú*Å;éKåÒw/ÒW ïÒ“TIŸ";IN§O–þ¤OŽºëñŠOÓ1ÙMzœâöt-óD„§iòþ´‡\"²ßt\xœÉŸ§c´¯ºuú`á]ú(é}úáXúXå›éÑã(øáÉÎÒ1Þ#¿–®W¼”‡þ'»OŸ/ÜJŸ&;OO”ŸMß Ÿï@~7bw3_/ünGo¦²žYÌ;ý­88ý|z[x™þ~ü¢x2ýí·Ðñzù v÷úò…p8ý-z/öyŸp6}vrúr/ë?‹uO€þˆüTúXÖ{öwúÎ9²4¿š>Mxš¾\þ2}·âŽt³âÄtûæïn¥„¾{à_7zÕŽž7 ¯Ó÷ÈŸ¤§`?7¡§·B×%<¿\yÌ¿¶W£ç7!—k©_¥ËÂítëœþÌE¯ÞÞ§_GßæcOså—Óünqz¸ð|ý ;úCüÊ'f–eký™µ$çÌ Â»Ì¦â{f_áe&(ùgbÂÑLø—9Zz™->eøìÌÅÝòñL»ð#ó‚ì+3[¸™yO~?óªì8óµø‘ùZú›yOz›ùFòÈ|-»É,–œ3ßAß·ÂùÌ/ÂÛÌŒÿâûÌ/'»œô,ó—ô?ó‡ô,ó·ô6óâÞÌ|Õ½2oK™w…™¤·™gßdÞdݯI3¯O3Ô2ÏJ^™ú·IN™áoæ ámæDáUæléYæ2Ùc†¸%sã]#Ÿ¹šu7 3SáëtÖ_ÝN¾fºáÓ²ÌÙæøzð.Ã>„ko„?ç±¾ódW™³dß™S‘O‹p:S’=fæG2sï\ÆyYþ9óŽüSæ=á^æ=átæKäû üúFúŸùAòÌ.%~¹v}Å‘Yöï²Ãçfw¤ÝUúŸåw~]K}*ó3ü˜'¿œ¡nŸ3Ô¡2ìe¨7eÞB¿Kèý èÕýèÿÕÈy*ý•ŸÊ´1oƒèÎ\‡}ÞD{r¢žéø~¾üNææ½Rø¹º.E.×2þUðñ&ìõ^ùÌeØ÷]âO¦\èFÏÚÑsâÒL}kD_[í¾òËÌ“Èïqù×Ìãò»™çÑû·ïuøø1ï³Oy ¾=¯x&ó±üEæ]ìõì;víÂÙì æÿKôeWNe©3fWCÞkBÿïÈùOáhf.|[(?œy>Ïïf*>μ ßžŸf=³‘Ï ŒÏ~NæCø½¹޽ü†~}!?êè]¡ù‡ôÑ);Ïn/—)»ÊR÷ÊŽVž”MËž² Æ!þËžÄzOFÿ/£ÿDéIöù…ì™´—1ïuÂì ¢3{³üYövÉ1{½ä/ú³×«×2ß9Ðy/óÜ£¼2;Mø“½W~6ÛDÿNñ/Û-˜e?,;GúŸ}…÷¾¾d©‹f_潄ËÙ7X?¿š'ÜȾ¬¸7û"|xW8—핾d{¤—Ù§¥ÙgdÙ¹Òì ŠG³_JO³Š¹Õå·rÿQ>ž[Nuü,uÁÜêÐñ3|ø—6·²ì4·†ìë_Ûô?Nz”ËÊçÆ‹¹sEî Ù{n‚ô:7^ôçÆ*þɱo—»NòÎ].yæ¦ÒïvÅ9òÅÜ#âCîZÅ}¹‹•7ç..æÎ¾qÒ×Ü%²Ûq`î6ñ=Gžšk“seŹVå[¹©´÷ Gsø«ÜõÒ¿Üiòc¹ …¹:éA.݈ÿ¹£$×Ü ŠrüÞLŽ¿Ó—#~Ï……«¹0òò…;¹„ì?—”ÿÊ%”Ÿåâ«\„õ툾Η¾äÖÐûÙ?dg¹uåOrÔÓr‡r›Hÿs[!·í¤·9~¿>ÇïÔçR\’ óÞaÈýŹÙiŽ|7ǾáíñŠÏrìßæB?vUÞ“ÛMõ²ì§ºŸ}XüÍNÁN§³Î'Í®¸ßƒ]·*oÎ>‹¼®ú\v.öȾoöYìƒ}ÝìsŠ3³/ g³Ÿ)^ÍþÆû¿@ÏàÉ_Øñ׌cíûŠÓ²?—Êf߯^—?Ê~ÎûÖ¾+ýÈ·>gŸzÁçàÏ3ÒËìë¬×øð6óñ»úYþîHöMÖõ‚ÍNÏá7Ù7äײóYÿëÒ¯ìÛàÏ{ði¡ô0ûøõ×äÙwáÇ—à÷§²ßìGòWÙ/„3Ùïÿ;ÅyÙ¿ð'Ÿ³®/f¿EÞÆ¯o ûðw‘ì#û~à ùÇ,û%ÙïfÍ¿-†¿?âoø;¸Ù_¤çÙ?‰ã~—Ýdç½ß±ÇUU÷Ëþ-Êþ"Êþ%»Ìþ Þ Æî—’g§V‘¾gÿÄV¿ý ެ+?[SùanˆâÌÜêØÙ:ò3¹-Çæ¶€® Àï¡ÒÛÜ–ò[¹áÒûÜú’kn[Ź!Ê/rC$÷Ü–àéæ¼ÿ_É%w ãó]cnú >¦¸?—¯ù»³¹ 82qRàÌŠ+sçÀ§ó%ÜåÒïÜEðaý®’¿ËÝ]ÓÀí¢ì#7\}œu½,~æÁßÁÅjë–V>÷›äU·†â⺠4oÝªŠƒëÖN×­ª¸®nMéWîOæûLqWn¾öÑrse¿¹Wäïso€—ŸÊnrŸÈ>s‹xï}p‘¼8îÔñ÷ØêVÐúêÖîÔm(ý¬[]úZ·ì£ngùÛº}…?u#duëÊnëgÝpÙ_ÝP­£.®|®.'\ª;MzYW¯8¢î­ëŸ>]ªuÖÝ®¼¢îrñõÉ×ñw€êÀñº¥_uïHžu?2.õ€<ú–ßU~$O¾”߇v_É3¿­Ö“çH~/­#ÏùÅüîö\ùp~iácÝÏâk~„äßFvžßSxšßOø’ß[þ)O5¿¯ô&¿§ô5ÿ_áMž}«üð|¢îyÖE¼^÷,ü¿J8^W¯|³nò *O¬¾£|¥nWÅuÌS·†øS·¢p½n3ô™ó•u7¡×2.õº:êyu ë®nÕ] _b¼²p³®W|­›‰]ϼÕíÂ¥ºŠì¶î1èyX~¡®¤8ÄéÃ}Èÿ~ôünôéqèú]xT÷‹p+?XùC~äÌïý硜̯&–_ =â÷§òË).ȯÂx›Ïóhž<ßåùû›ù­„®ÝQ8–ß^rÈï…>PÌÇ¡ïdÙ•k9_˜?YñJ~<ã,<̳ϕ¯ÿóÊ~ó׋ùÛi/…^êÒùó¥ù«çJæ¹SrËß%¼È#·'Ï9ßü{Œó*òͼœÏÌ?ÁºA/Á½fä“ßøy¯¾x)ÿzñ²ì8ÏßAÎów:óÔ#òÏÁ¿9Èáiô…úEž<7?zŸoœ—ÌÇççƒûs ‡¸<ÿöù!úctqþ9ÿ%ï üÈsî4¿9΃Þ÷ç®É ò¯ƒ÷Á¿náS~Šâ›<õó|AøœO)^͇ŸåÙ?Î{ÂÝ|½Jâ§j°·Ý±ÿ=Ðsö×ó¡ïàx~áx~#å ùàÓÖŠ?óCуuЗM•÷燣gÛ(NÉoˆ]r ¿%z»'Ï}üØIèßéØã$úŸ}ߨ8&ÿròYŒ_ý~,ÀZû ãþ*¾VPÿ åQÖæ‰— « §¿I®ÃùïäGó¿B÷KòNï8§Ÿ¿™û·`WÓ”Ïçp¿¾¾†žSgÉOE_Ÿ˿¼ÏËŸç97åôëäü%ô’Ÿä9gUXJò* ¢ß¯’kaEágaE[@Î…ueß…ÍÄ·Â>ò…£å É­p•âÇçÎ ·)ž/L‘| ZWá2ɯp×—KÎ…Se…IàßŲ£û•…‰JÜñþ”sËNN"·™Èó1äމߙ‹>Í’¾ç—æ{ˆ³ž«Šã¾D¾o¢Ÿq;užýŸü<âEÎ!äŸ!~zÕä«:OþúÏ…¿¯á?Ÿcüùô{ º~•ß*¬‰lƒÝq®µ°)8´±ô¿@=½°µâ“Â0pv¨ê˜… Ä÷ÂjâCa9ñ¯À~ca)ì{08¶œì©°ø´<ï¯Ìøœ,p^§À÷I…ÑàåèÃõøFðú.üqQáuèïÄŸÍ¢ÿ=Êg ŸÓö°Žêö#Æ[À{ÄËK´obïƒs 7ˆ äÙ…çð'ÄÛ…¹ø“EêW?ÿùë^ÀûÔ‰ ŸÃ‡Ÿ…Ïõ«ÊÎê×ÒüõÛÈ×s.¹þLž³oUŽô³þJáSý}Ò»zö êÇ)O©Ÿ,þÖŸ#û«#YšøQ÷ÇKïêsòCõÛŠþú#„ÛõIɽž¼¬>Á8G1ÎáÒúÃdgõ wê÷“\ê97é®÷R<\ÏyÎzÎEן ¿Z¸ô¦žsñõœ‹¬?IñC=ß%ÕßÄ|ÔêÉoê?•Þ×ÿ>`Ü…òÃõ?)/©§þ[ÿø:f}áÕ˜ÿƬ#>,Ñ®-=³Šæ³ºâú1C¤cÖW|2f-áRýß²Ç1ƒ”GŒáwë¿B^œ¿¯gµþ5Ùu=ySýÏð‡vÌ2Âá1kÊá{½1Hëñ+ÞÂw:¦û{Ö—i~¯[vèñ;u^¯ðÍë_<ðÎû^þÔûûà÷2÷ÁcßðfÈ~Üßç¶¿þ,ïw)þu·ûù-ï®ßÿÝß·ù>Îy¯2ÑýˆpÝ{‚þMÒ÷÷æ9âÝ/}wGý:å«îïÖOƒ.û{êöwÙÏB‡ýr¾KñØÿô>çù»¬ç}æû¨Š^k^Î{x¿k\9­Ó¢ç>ßkúëŠ>ýô©ßúüî´?:~A¾3.ûÞ_Ðõ-ëC®>ç¢üÿè¹çý…Lž`|Óû;óà£ã‹µøEGÏòç¿#àø÷-ziÏo xþ)ó™üíïÕÏ­šÏþ^½ý=z›çäúziúVa>êNŸíïÏ?Êx&¯ù¼ozJ]Àñoèü‘ëA¼ÿ+ïUëÉ×ð×äó3t|‡>Úµñ…øÏ­Óôêè6ºÀ5ïìþúƒ$÷äûåí¯«þþÆè×öÏÿŸèóGŠ.ñßµüîµÏß/÷ù{çþÞè3û¼þÜ·q·@¿×ü$o§ïûÀ߃µ~ŸïC}¾»öë¿oïóÝŸã€s>gÞç{F2ã]!9ø×Kßüûç>轕ñocò9ׂ/>8á—¹?“u? ;XÏÃÐ žøàŽýCóßÅzÎó¹6ãŸ\ràÅXú'‡ïFüzæãïØûyÞ;ºÇ³Žó穬#M›â¹ÉwWè=}9žùŽ=ás‚ñŒ¾qÐCÜáæ1y±ßãS‡vòà<«s÷9Çïãg|ðÛ¿•~—0ïYð¯ú=Îm:yÞÝ&w£ëBÖ ò3yœÅ8§3­·šß—B­{óRg÷oáýkàÏÍà‡É#œJk÷ùÞÛÙƒÉ;‰^E Ãøl'3½Çß»òù»Sþ¹Ü7½3}³ñŒ~kmfww!G~OÊ¿‘÷n­’“ÉÕä×ÊzZ™ì쪋þfG½ÐKâúUXŸÙ™éI;ë7¹w“ÿðù Æ? ¾™½pÉé•éñÇøovaz1ŽuY{¿žÖìëžïÄûBÏNŒ»ãlÎ:ÀOïÖgqçƒü ôŽrÞÆ?þ®þ[\±Ï m~ÎùGó{kb£yÏìÚôßøã}¾rzn8æì:s»6Ü}ºðÛ>q¨ÿ -ñ©_‚âPÿ1®‰c|âM¿ê›ŸÇßúÄ>q‡ÿ&r§nç×ùüîÿ-ßOû‹¸þ;Á_ûÄ7>þݧnäï:=%nvúL|ë—ù›¦*ܼƒyÈ–ð[O±~ã›Í3õ~˜>ó‰ÃAóO†W†¦×柂ðÁÚ½ggø>ÒúA—³#ôßcõ'Â×,ãŒa~‹ Ì-~°Öæ5}½G@ÇðÍèrq ÷wãýÃá—Ù…Å=;r½1|-ÎÙ…ù6a]ü~‰‹s-?½{ˆÿ,¯Áx؇½yø_¸4lyñ½·)ñã^Ä‰à€‡¼<ö=ðß#~rù܃ÌcùÔUyûw.$îqùçTÝóÿoüï¯ Ö@nÄÕþPÞ·xÙò âh—7­ˆ¢þfðau®—âÚòþŽš¿tn ]ÛVÙ¯Åû–?lÇú,þ7>p.Â]›ü-/Yù­?m~{o0ö`ùÌêØÝÚèû|Ž_–ÿ~‡þšÞ1ŽåmN^&ÇM—Öû:¯Ë·í¾åïÆG¾¿ð‡ÁG“³Å †wæŸ-¯2=4ÿmzl|5}4ÜáüœÃ9Ó“‡é›ÑQÏ{Œ‚>Ã=ËëŽa~³óãÖßðÚpÞìÌÞãw½ü±ðÉü½ùË묵û5ô3~_Œ>ËG ŸŸûa?»A—­ßá=ú» |7þ[\Ì9C—…ßâ‹£ ,îC5-ž3ÿaò1ºÌ.Í®Ðc§ß+°nôÜ㜠«#Q?qz·,ïSŸöfÑŸ8Ø#îuu2â^¿ïê>=àù˜G>äG{Ä7ñ–× >߯8Ľy‡‡žxøW?ê¡ßö~E㇉ïÃÄiaÃ;Öé!7α¬gëßL| ¿ÂY;ñˆo<âøÂ#ôÈ#=ò¸Ókdæ­ÎDÀÕÍŒïäûq•GÁ»´j÷_gp}t»:/õ |Ä#Ÿö.ãšüÔ<ìÞc_È#^ñÀüÝC¯=ðÛg<ôÞÃ~<ò‘°á!ú~_x¶º¢Ÿsñ‡Éñ\è°õ˜¾Ùº ðçLZò}¯`¯îÚôÎúq.ãàôÝêã&Óç"è|ˆñLžV7n€~×Õ9ÍßX}ß½suuÓg«·›·z·Õ'Í­ÞN¼ï¿{/À_«[’{ä'çõ]ýÝÖMàêçßQòî…^ͺŒŸöÜÆ3°8ÍÖk­áù‘³—÷à#ù«Ïš}Ù<7›½ÒŸú…G^âëÎŽLOñ?u|Âõ;>[| .{äÝþÁÝ7{°8ºý=>SòÈ\œnóíöñÉ#Nr÷ñóÞZ¼G<ä Ž5ÁIâà0uß0¿CèYücôÛú Oð«~λþâ_ÝøoøÖá&õbxÅ;Éìþ\ÌÏP‡u~ÆôÉæ5aûH†k¦çÔuœÛþ“åKäÝ®?ù¹÷J•Ÿ²ý({nû V¯ÿ™yM­žnõ}Ë,N]?¿ò³ýœeÿo\nû4ÎÏ[ýÛâé}‰+,ï°¸Ëâ ËWù]Fþúà™qŠåíìs¸º„Õ¬NN¹:‰Õß°7W³úžÕó¬ž`í=ÄAöÜæ1º¬îŠ^úÈËgÇÕì¹íO!Ÿý¦%ê7³>«'ZÝÑÖ»zÑA<ã?VÅ?£œwu=Û7°:²­Ïêü6>ù¶ã7q—þûrýˆ˜þ,¦Å_¸kÓ£/×â@ôÔÇϺûä9ô.²”æÇ¹û«h¼z!osíaZw„:EdmÞ£¾w|öÙ|ËÃM^죹ú늀_F‡ouKòÓñ\„ø6B!Ow×äSò³õ•8ÁÎ"¶ïÅ<òèùO„ø0Bü!ŸŠ`oòœø!ÿp÷ÁñyF„|'2Šù­?ñ‘£û€ë®Åþ#à¾ëoë&ÿŒàܺÁ‹q™›?µDòÉþ,ÎGˆ #Ô#"ì3Dˆ§"Ôk#ÔÃ#è¶–ø2B}*B\!Žr­ÝÇÎ"ıöC"àIäøDÞÁ¾#àT„ýÿzA#ìÃGÀ™uÕû¯ì)ÂytwÿàZ{ŽG¨ßFÀ©õºv¥¥Þ¥~Å/D©ûD·‘ÞDÑcwM<E?£ØA”:aùE©óE±Ó(õÑ(zEn®…ßQöõ\êQòÓ(úæZüO”úP”üÀÖ!ŸŠRw‹âÇ¢Øa½‹ïG·ßܼäÑŽNê²Qì)J]-J}# v¥îe¿$Jþïú[?ê-Qòï(ñ`”8'ŠÝGÙW‰‚SQpÏ­Ëä`r3œ#Äåâ\wM<!îˆà¿"øþ/B]4‚?Ž÷G¨ŸFˆ—#|o!Þ‰<Í|ìDØ?‹L?ð‡üS„|ÔõïEðÎÞˆ"Äãò„H{¢ž!.s㳯âÖeë´uÙs{Ÿúƒ›ÿúý´Ô¡#ä[ιþäeêÔö‹Üz‰{~°Ÿèø`Ï©[;y~à¿#æÏ wðsò/Ç/â–ñg„x+B¼àôÃú:ýaß)B=×áçr"øÿ(þØáþÝá]›Zê¿QêªfßQò‘(ùkÙ×Xž ‡ìÚì–x"ŠŠâgýSÿ‰²ßÅE9Ï¥>eßÚá„áyK”s Qò:g׆“ÔÙ~ؼ†3F~ÙÑiëÜIþÞ]S7‰D©'FñQòÀ(õ›(y £—ü(Ê~{ô&ð‘ýÒ(u¨(u3·nã û]Qün”}äèÉUýØŸ‹²ßìæ£åWãÔãÄáñÙÌKàÞ#^wã?Å© ÆñïqöEâÄQqò7yS¿àîGűË8ñPœü)Ž=ÆÉ÷âäqp)N\7½á¼x@¯í:ŽþDZÛ8uŒ8úG¯ãäkŽ?äqqpĵÔëãÔ=Ý{Æ_üVœ<'Ž}Ä©£ÄÁ—8ùN;pÏÁ¥8û_ŽäÕqð7N|½äÇN¾ÄN>&/“ uà8~Ãéþ9Î9Â8þ;NÝ*Ž_qï±'^‰³'>ããø77/qGœótqÎĉ·œý›ÿ¿bÔ™ãäy1ö-bœK‰SuøL$Ný0Îù‚8çqâä…qê9qêW1⋸Åè›Ýw¸JÂá$çbÔcì§8üü¥Ž£Nçp˜| öü¥ž'Ïu|1cë´õ¿Ç7®jY§ù¯çÌœ¿`?Èõ§'÷:¼$þqrã¼Kœ|6N\ãî¾ÚsÃaâ&ןºjœ|8Îþwœx3NýÆá›áŠÙqcœzDÿºñKÎÑŸ8þ0¼œÓJß‘gù&Ì_/Øu‚ü:A}>A<@¯ÔIø±ñg‚¸4AÞ€¿ Î $¨g&È¿ÔÝø½û ì1½%ð? öýø›q|‚}f×â—Ø{brÕýëïzè'¯wýÙßLpÞ#A\–Wø‡¸•`ÿ?Á¹ãñC‚ø#A½(Á¹Ëù@q»;¿aç3ìœ õEwÐÎù°¿æÎmØw—øuwŽÃÎ+ÚùêŒîü‘k³ó%vˆýIý.w®œöÀcwŽ¿é¾Ë?ì<›}·Iüêú?»ï¨íÜ;8èÎ_Ø9wŠ;'jç|«ÏSÛùWìÖÝ'?vß ùì+»ï†ð«î¼·ÑA¸Ù÷·ó[à¢G<æZûŽÅ¾cwÜùuâ1wmçÄÁAG'qoç ì;UôÁ_Šqí=;çmë¶õPuß €/N¯Às|Û«³õÙ¹ âdw.ÝÎWÛ9;‡nr°só¶÷t}öx寷óæÔ•Ýy_üŒÓ?èvçzí|uk77·sIìó¸uØw_¦OÄ™î»ûNЮ©Ç¹ïà&!W»Ïþ‹ûÈÎCSGvziçšÀ1÷}(uXŸøÌ'Nrçrˆ‹Ü9#ôÔŸÉï|äéÎÙ5q¯;WDÇGî>ñ~¸ó,öýy;GC=5‚Ý}ü¾3qßuì'ºïÇð›>øèαéSt|±óXÔ}òJ÷q®;Þùà³;¿dß±Zÿ1ÌK>éìÙôž'À_9{¦.モ¤ë¾ó´ïÅ8¿ë¾ç5¹’Ï»óXäóî\–û"_qçÕìœ~À}WÛŒ}Ù9,üÛ?úÃ{vNìTÆ5}¶ï°m\[—}_fß]°ßéðÇä`ö`xN½ëŸódÐoßšýmJ?û.„|Ò÷7ü#ŽrßÅØ÷9ÄîûkÃaö{ ?Üwæ Öf}†Wì“ýóÝ óÞÙ8öýƒÑÍþûÊødü£Þá¾û°ïùì{=ã‹Ýw-r;Ÿ~ì¹ñl>ꑇì»û}ãÉøÎùyóvnxÕ}g„wç²í|µýù•ûÞÈüŒ3%?tßMØwvžÙ}‡G\þxœ“±óõøíâ/; >¸sÙvž–ý<öðWî{ê³u:–ûÞÜX✷}gM½Éýny›.»ßë dñ“ó³¦Õq q·ûNÆô;¿±xɾ³9¾ÊÏPßvß+±çpʾw7\"owçJí»xÓ;êwî;)û.ÕÆ5içE —í÷' — ¯Œnê?.Þ3üµïí;Rà ³w³_âÊ%ô·ú;6ã‡ùc‹°s—“‡»ï~ì;Oû®ÁäÈþ‘û.ÁâkÓË?à«Çw]öéñ¯Ë,.Çzà¶G}Ùé¡Ùå|·ï+î»âwîÜÎû›]¡?x뾋Çœ½ g8Çg?Û#¯ô,þ$.ð¨Wyàg˜ú{˜ø%LÝ'Œ_ £×aÎ燉#CÄ%!âñû‚!ò› øÂ…ØïvýÈçÂøvf?8L=.Ì9ƒ0ùGÿ&.ƒaêdaòÎ0ñcýƒkaøïîã÷ÃèQ˜:Žã‡}ß…¾¹q±›0þ;L]*L½'Lœ¶ï]á˜øØ¾#sr oñ¶BOLÿÍ_Z>dß[×¹ï¨[ºï›°‡0yt˜ºZ˜º›G]Â×ÜwiŒ&5úÃÔ_Ã2.qM˜}Ç?â¤0v6ûµ¼¸Á¾÷Ð'}Ù0þ,L>¦ŽæwxàËߟð¾n›þ¿mÞ0õÈ0¸dã‡Áÿ0ño˜<:l¿ÛdþÖô“º­/LoýÝ}öÏ¿*Èœ ã·Ãøë0û`ø¦®&Sÿ³ÿæ{$'ò†°ý.|wß¿¡o/ ìû"ÎÓ¸çóœs¬î»óצŸ†Oö]xî¾G"ÿs¸D¼æð.Ⱥñ‹ñ›ûÞˆóE~×}'Hþ둸ï‚ì»AÎý¸ï—¬eñ…á«}WD|è„~{?çôÕô™z é­Ó3Óì-lu ôÇÉÅôÌü$~Ô}‡hô›Üì{{â'WêŽ>³c£ƒøÏÍgzO+L=.LËá"û aò0u-‡³Ä»á#À=òª0q‰ÃoÖ¢ŽÂ>Bœ ·†Œ.£» a—!êo!òÕ0¸Bð1DÝ,ľIˆ81„ ¡—!òþzDNAâ° ùQ8"Hþ/Bèaˆ<4Dß‚ÄÛAÎÉ„¨·„ˆ§Bä!æ q^!Äy‡y…£Ÿ}šù{ˆýr g¹çä¯!â¡qMˆü:D¢Ž¢ž" §nÄ%!âšy|{ á§Cر{ÄŸÁá uÜ ç‚O!ö)‚œvI_œ|À¹ x¤$Þ’?ÑË ñmsAâ·ÐެÿêÖ‡Þ†8WBà@\‘ç¹ucŸ!ð2D~ÂφÈ;Cu½ÿþþð9®ç¾Î¹÷Þ÷´îk­{í¤ôþ¤Ö¤úMR÷Ôþ"©þ–Œé{š¿’Š}ÊÎw;ÀΕ۾Oë·ÚþÊö‰jŸ¤ìƤt©¤ô¤Ö¯¤ÆSRñIÝRùx“š’꾤$5%5¯'Ûê{Š7v»Gûú¤æ“¤ÆURëQRíôŸ}­ì„¤üSIõ߇KßIª“Š»IJò}¼í 4Þ’ò?%5%¥‡%eWù~ÂöAŠû0û5)¿…ïmß#Vr·¾§øÿ»í?eŸ$-ÿ„釶ß5»_~¨äWº>û¾â'’ŠóHÊOš”ýTÜcòµ¯íËíúíþeùó1»Øò÷j>ðý£ù·Üî×þÝö±fÛsµß7Áöwšç’²k|?lv½ú¿ïgìyèœE_éǾ;UŸ¶Ï2ží[4ÿ%e‡úþО‡íKÌÏgãÌ󥨿ÙþDþD¿^ÓÔO}ÿaÏGûv«¿¯úõô)銾×üáú„æW×ÅìþíÓîÛö²“<†}Zž Ó³ew{~Ó«5ŸºnØüó–WÅò›Na:¤çoÖu[>dËÿ¼CסöpžÅ9X>eËgmŸ¦wZÞóÿ&=ÕòÍ™ÆüûæŸ1¯éÛ–·Ìô]­sžwÌô\ó¯™_Eñž7Kë‹û¯4Ïý'­å¡µë0¿öÑî7V{{Þjù;ýþí9™ßÒò˜¿ÈüÍÅ󹙿ßôró[šßÆü3æ'ÒúåùÂL×ør?@ñ|Zš×ýûæÿ1¿=/óKÛïY»h|ü›ŸZ¿gqÒGÝ/]©¯æm×§5¿{^(Ó³-¿ü3ÅÊ-.Æž³Å»È¯íùoL‡7“Å«È^såg´ü(VöÞOÅ®ßât,?•åo´úž*ö;výÅóY~GÙ/î?0,ûÛŸƒéöGä~Ïâñ9–§¡ê³yCö¶ç‰²<™–¿ßümÅó–Yýçâ~<Õcþ½O‹µ‡ü÷~}v½æ1ÿ˜öžHvçùZf~5]Ÿù9¬½7ë_ÅâS|2ÛâÀdo{)‹#±ùÈü™6~ÍŸìù)…Íïdó“öížGOë…ÏS6ا͇҉ÝeqÒÙ<¯Ÿ}Ú¼`ãßüµwcq#‡`¿o~pË·©û´üZ>¯™¾,¿ƒÇŸ™¬yÝühÇc×oóœùé¤Ãz¾dËûjþ5›l~6?¶Ý¯ö#žÖž«Íûæ§¶yÔÛA|›¯¬ÝdÏøï[^Z{ž—PÜnþwËóëq&ÅâGdïù§Å‘ܪú¥ÿy^sÏsoØ~ÏxÒ›7­u2£}hFëWFzHFûfË Ö~2#;ÚpZû’´æÿÔ:“Ö|’Þ©ç¡y*­ýyZë“_ŸôŸŒÚ3síçõÊo›VÿHkþLËÏä÷gyd7¤e×X½õÏ yà?çýeû§ö~ž^ñíó2Òc2šÿü¼½ì5?§¯vÍHwÌh]ÈÈþôsñÒ‰¼^í2òãd/àù4¾=Ï€tÿ¾ìˆŒÖYϧ y)£ýRFë¾ç…Ð>=#½1#Êóhýõû¶ü–OÀžƒ='ÙÁهٱž@~…Œö éÍõƒŒöýÙ=­‡õ³ŒtجúSVûŸ¬{–˜µþ ;(#]Æ~×˵Nfvq½Ù´ÿ¾«“½âyÔYõ£¬žwVþᬞ_Vñ0žw@vLVíUûgµßËj½Í ]²Zo³Š‡Éʯ˜•Ý’•Îà|ÙëY­—Y­_YÙe޵_Íj½Ïªggèþµ/ñß»R¿/»'«þŸUÈjþÏj‘•½”Õ>Ïóع}­Yí²:•U;g¥oøyskËS {*«ý¦ç;_#«ù4;vÏjò< Ò)³šoý:,o€ìë¬æ]Ï# ;Ìó (^ÆÏÓ[~ƒây,ß‚úsV~E¿o«Ç·J·ÌÊ~ôü šO²Oëùh˜•~™Õ>ÌŸ“Õoy¤Ó{ž­?YùI²ŠwÎÞdýO÷#?G{ÎV¯æ»¬ÖѬ쨬t¬ìNÏû¡ûòüÒ2ÚggäËØs‘Þ›Õ>!#='#],£¸€¬öO­þ;jߌö·™•šg´¯öü,–?Eý8£u<#Ý!£}|f¹¾§þìùNìSzFFzAFº]Fö¹ç7‘~•Ѻêóžõ/ÍGÅ‹d´Îhÿàõ«?g´ÉÈNðùÔú§ÍgÕNÚçùü&ÊóžHõ|(Z/üï²Ó}þ³yEþAÿ=ùO³Ú—yþ›,o‰ú§4~l¼Ø§ÖŸêžÃòhØyr¯ê‡~~Ûæ;'­~ëç³µŸðóÙꇞ¯Bz²Oû«BÅÊîôóò²ÿ õ| µ>j=-”=Q¨ýh¡ÖUÏW ù®PãÚóXÍsž7Àòh~ò¼šç<_‚ì.ÿ»ž»ç-=ï|Ù‹9éû9é09é(9=÷œúqNãÓË5/ä¯;–ç“ÓsÌÉnÍÉŽ-Ô>ÁÏÏK!;Ò¯×òH÷òüvš_ü¹Ù÷¿ÐïZþ ;ß­~àç¹í¾Õ/rÒ¿sÒÑs²Gü¼¸ö+9Ùe~~Ü>e¯æ4þrG9õ/??.»#wF1žæ±œtõœæo?7nçÅí·æóœì ?­u%7[÷#û#§s'9ísê‡9õ“œÆí>5_ûypéª9õC?¾]×cçÀågósÍv>ÚÊ7«´®æd¯øùzåoÉižóóÿ²ƒ¼=´ÌÉþÏIßÈIÿÊÉ^ÎIÈÉ•“Ýìçöe'å4¿å´NúóÒü—SÜ‹Ÿ××xÏIgõóæZ§ýS:}NãÏÏk\æÔýï{ôœ´OÊíÓïk}ôsÜvÞXãÓÏ#KŸì¯~Üÿ®£¿Æeÿ\GÿêÔß¿–~Gó_é«þ^S­îg4½Rq+~.Vý×ÏÁÊîtÿ—}O냿 ¸oñóvþDíäçm5>¼~Å…ùùWËão~^Ó]Íg~ÙQ~NÀÎÃhž÷÷=˜ßÐò÷[­ÅS[~{ËgoïõP<_·]Ÿé|j/÷ó¨ûj\øûˆíü¯ƒ6Ý^~_ÓiÅtk{™éŸöž4íü<ˆó{Hú³ùûìŠô$÷óÉñóœæçÒ>Øõgó—I÷ñóæÇ°ö°<åÒAüÜ“ô –éËMoÖuÚû Õÿüýh¦Û+Êý™gû}ÓÑ¥×yþ{;fºµ=óÃkÿk~KÿMµb÷';÷ß÷²IWµë1]Ûò뛿ÐÞûcúy·b~Síký\’•›>¯ý®¿—Èüµõi~ó ›¿Æþ^Q×{R±çcº¾Õcï•Ó~Öý²‹üý¢oþþ@ÙÝ~îÖÞ³ø‚®Ãô{û´çd¿oþ éÍ~Ïú½¿—@×açÆŠëïvžYó…åÇOɾñ<ô¦O›mØôZ]Z~tÅ/x>wÓÁ5N<¿¹úµëôÚ¿¥t?)é^n¿¯óôž_¿í`ú|?å¹p?…åÉ×úï~‘û…¥ûø×þËǃæk?Ϫ}V?íëý\›ùÌnçëw«}¤÷¹¿ÍâƒdÏ»ÿÞ~ÇüDVŸw3?Í_Zoý=Š£ðóÕ²OúíÕ÷Íïf|ëölÞÑzåïõ´s¾ÖŸ¥úyÞâïcµsxjGçvþAz‰¿¿ÃÚËÞf~@•û¸µxŸvÞBçJ|“Ýæë¢­£¶ÎI·ò÷£Èïá~p{?yñø[Ÿ5Nûª_xüì&?'7D÷gçN5ïùúoçêlÝ6¿¹Å X€öOþ#{o¼öÝ~þØüÂæŸ5¾Å§Ùø(–ÿÁólX‹o0ûBûß¡ô+÷ÿkõ÷Ö¨}úJ÷õ÷[Ùyƒ¾òûÙût<>MãÅÏÝh?ÒWû´¤ž¿ÇÊ.NjšÔ~>©yÚÏsh=OØy'C??'û*);ÙÏ…X}Ò?->3!Äã?u__);;©}±_¯ö1IéfI‹ÿÑúçïiS;ù¹7µ£ŸòsdZïü½\ö~/{Ù`‹ëÐó_V,>B~³¾Z?¼|v±8 +·ø-{o¯Ù3Чó8-³÷ìzeï÷•þãùl¤«ù¹f{Ÿ–õ[{¯¤õ{ùw<.Íâr,.E󨟟²÷JIÿñü=?gñvv>Iö¿ÏÎ΃›]lï]2ûYë ý¾ŸG²v“=œÔsöxTé^I­OIÍ[§«s¸IµƒŸC²¸`/ǵq`<;çiñ¤Öÿ´ÏKª?$µÎù8Ð>Þãuµ®'µN%›éùHWH¨=j§„Ú;¡ûOhÞ1~²¿“ž˜ÐsHh}I(þÝã¸u¾?¡¸©„ìt?'¡ý^\ók\ý5.ý7®x¸öuç¯ýELý#ºŽúbZÇbšbzn1õ{?7 û7.»:®ç×õťׯe¯ÅÕ?â×èSzC\ëp\í×:×øˆË^Œ+þ7®þŸ•P<`Bó£Ÿ3Ñ~Û¯GÏ3®ù=®y'¡qêÏÓΉHôseÒÅüùÛùíûòg$d/8Oí’~àç¾t?·oçfì\üŒ µOBûe?7'CBíœÐ:îçcì|œS“~°þgõÙ}Û¹$­ ù3U¯Î}øy"Ù‘ Ùk~}v.ÊΉkûs’Ÿ,¡õ3!]ÁŸŸì ?—f÷oÏ[넟‡Ð>)¡ý Ï®_ý*!.¡~èÏKºTBq ­ov^-¡ùÜÏÑIßóóOÚ—úù;­“~žJv{BvŸ?‘NíýË>¥+$4Ÿ%dg%äwòs]ŠCOhý°õ8!û6!Ý)!{Îçé{ é© ùõœgýKvXBöNBövBã6!¿ˆóôs‹v>Ñ>mÞ’_)ñœ®SqX éaÞþ²Z×ü|©ü ë„ì3¿^é Ù1>î¤ $´î%4ù¹Ùe Íû ÍkvîÓÏëÈÞNHïöó?vÞlb±ñ`í/{Èdzì$¿û»ì¨„ü~®ÎÎÅÙ#º¨tŽ¨æ­¨ìÚ¨úYTû¸¨tŽˆÆ[TóiTûÛ¨ž{TºxTãÄ?u½1é,±#¹Ž˜Ú;¦y ÖIXý'¦ù:¦ù-&='*»/ªñÕx‹j‹Ê~‹ª]£úݨ濨úcTþǨôƨöÓQ̓QéQéQégÅûF¤gFäŒhþŽhÞˆjÝÊΈhÿÑ|aÏ3¢ñQ{F´ÞEw‘~‘.Ñxhþ‰j("û*"{1¢ýdDûîˆö;6¯D4oE¤7F´ÎEõ#‡ˆÖÁÈOúžÖ™¨t„¨æã¨ìÞ¨ÚËçy=ç¨ìü¨ì³¨žoTþ󨞋ϳÚ÷Dä×±þÕ¾ÄÇ‹}Oý+ªç‘NÑxŽÈÿçõ©ùïÉ^Ê®ñqjãXöyT핟×× õϨâ3¢¿h~‘žS|PTz”á˜ÆWLëLLvJÌæ?û]é¬6Åt1Í1{ÎêÏ1Ù!1í·kŸ“n“]ÓýÆ4ßÇdßÄ´ž»Ý!{/¦ùíâ–¿Fã&®õ,&=;¦ñ×ú—)®ýB\눷§ôç¸æñ¸ì ¸ö'qÙqÅ]xžÍqíâ²Gãê×qí¿ýyX°<²çâš—üïö)?{ŽWéþíyZžÙ5žCñUqÙžBû€¸ô­¸#ÙU ­« õÏó`zžì×CdX^¡„ž«ëDö=Ë'¡ýˆëR¥õiõØïé¹{žù \ßý󯞣ý¦é –çGö¯ç»1ýÄþnz‹éM¶ßÖúiù—/kŸoûjÓ ä—ñý©ìß§Ú~Öê³çdz ôº¸æ{Ë»âyxL·Ñ<ëy^LÓ¾4!0¡8ß„ÚÝõ%íKšG+u½¦CÈÿœP¼sBëFBv‡ëÒ;Úç¹îbyHÖÚ÷Õ4޽=ìyk}rÝÏôµw\þ+ÏCdúœüÐ ›ß¤×xž$Ë‹%»'nz³åµ9Âú¥ž‡æaÿ»}Ïæ7é8qͯqËãeº•}š.¢uÆó@ÉÎr]Ät1Í_ Ù®w™ža÷-—ëc¦OšÞ¢ýGBû4ëGq͇ž¿Çƹúo\zD\:C\ºw\ý?®~áù¨é¿#?r\û˜ø»âkœxþ+ÅxÞ»ïâ󈵧üµq/×µMïVÜT\ýÚ×Ù¿>¯Ùügùrì¾Ôö|¼½ìzlþQ|ŠÏK¦oZ;hü&æó’é§ò»ù§W›§ä/qÝÖæÓËl\k_êó—Ö)Ïß#»Åõl›·m2ÚtJÅ%´_ÿWç¶ñj:uËbãÅæsË[¥}­çÒóô~fú©ìˆ„tï粟ü9š¾n÷#ÀŸ›Í³Vnú²ìà„t›„쮄öñ ź®h~„îÅÆ“éÌ6ïÚ:dº´µ£ö»~}¶®ÈþKÈžuÝSë¶_Ÿ­7Š—ðyÕôYÓåm1ýÙtfÓu¥÷¹­u>¡qëùÐl~þ±ØºfyqÍŸl~"oϯ§ýcÒò®jŸê~;é‡IµRv¹ùñ’²Ïÿ“÷Vý&);2©u=©vJª»Tý7©õËóÞ˜^þ%çi½ó|Š÷HªŸ'Õ>Iå¡IÊ_âù™¬~».õ·¤ìò¤t¾¤ÖKÏ/¤þ˜T¿óüHêIé3žÇGvjRödRû"S0ÿªÖÏïk÷aõ˜X~Ï—d~]Å¡¹ßWv£_÷*=OùýyÊŸæùˆ,þAó[RãÂó)kžò¼Åv½Ò±’Ò=ߓݯìݤƋÇmXœ„åí´<¼–—ØÚÙò{Ú}É.òüN–×âcŠçÕ•Nëyš,ÎUýá?ùS-~Èâ*&r}g ÿ ê~<Ôóx¨ÙY÷S¤ß٬ߕ>íq—–?ÇòVXœ“te_–æùn,®Qö¸ÅgX\ÇgÚ§åÇÑ<íñ˜j7¿²¼gkqoêçO';°Ÿü³þ^ ‹3žæAÏ/ûÞßï Çã_-~T:‚ó5_ûui|x|¦Æq?é€ýä÷é'»ÔãK-¿„åϱøÛ¡º~WÏ«cשö÷û½]×kñs²O<﵃½'Eûý”úkJö¤Ç5îåz<þQúEJójJë›Ç]jÜ¥Ÿæù´_ñ<ZúIWIiâñƒò“öÓzï·ë²ûÑ9oç¼®_ãÒã µ>úûBdo{½²ç=îTû|Ï# ý)¥þèùÔŸR² RŠ›L©ÝSº®”ì×”Ö½”ÖÍ”å£~š’þ—’Ý›’’î›V;¥¥¥eç§5îÒŠýž=_é–G ¥ýaJötJ~÷´‡—]šVRZóTZëIZ휖˜VÜ“çÐ<œ–]•–åùd×8Öº—ÖøIkKKOOkßçyä·ößÑ:•Öz––=–=›–Nãù Ô>ž@í”–Ž‘–Ÿ3­õ*-ÿYZ~¸´Ö¹´ö¥ž§@vTZ:oZ뉟ÿ×>2­v±sÿwÈHÏÈÏæçô¥oûyvk'í'=ÿ€ÆIZû§´týŒÕ~$£ýRFûAÏ y9#}5#½ £y)£ù9#;7#;6#;ÌùZ¯ý<½Æ‘ŸÛ×øÊhÝË$uZï3-Š={Ò“-¯‚ç9иÍHgõ|Ò#3Úßf¤CZ~€´åÙ_'#Ý(­y&-Ý#£ñåùìy«þ­y-­ù8­õ)-Ý1mqäZÓ÷.{"µEó¯üv>^m\IÿK)Þ$­þ–]áýÜâ뵟N}¬yYã&%?•ç'Ñøö|*öwÙ)é;)Ôìÿ”쇔ô¬”tfÏw¢ù.-»<­}^Zë€Ï#6N¥#§e7¤eù¸ULé9Û|˜Òú–Òùñ´öiÙY)é¶ií»ÒZGÓÚ_ùü#û -{>-;ÂóžHWJKWòß±öÕúïß·ïÉäùJ¬ý,/ˆõ¿/hïg²§2Ú÷dô3º¿Œö>h]Ψ}¼ÉŽÈ´.6X^ ›o¤x¾ Í£ÿæ·Ð8”Ý’‘ß2£yÒçù!=ï…â¸ýܹÚÍϋ˾ö<Ú'fÕ³:Oêç³¥#gµŸ÷<Ò3üܶæù¬î+«õ*«ëÏÊ®ËjŸæŸjW?ß­çéy+´®e¥odµduYéGYù™<„Ö+?ç­ýPVëEVñ0^®ýgVö\Vû¯_ówVû]ϳ!‚ç&«8«¬Öñ¬æÝ¬t‰ì@ý]vmVþá¬t.ß·Öµ¬öÉY­3~.ÝòI(.Úó?ÈÞË*>kímŸ²G eßÚ}i?åï—¿6«qíçÐí¼¹úC¡ú¯¿w[q)…Ç…ºÏBÝw¡ìÃBµk¡ìnÏ»ú{¡žK¡Ú½Pû*/·žC¡t•Âõú}Í—þ>{{ß½Ök?_­}U¡tç´[¡Ö·ì\?¯­u·Pó…=Ÿ¬¾—U\Š·£ý®âÎ µ.Zþû¾žKVq»YÝoVù• ¥ûy}é…šÿ ¥?úó×ïûóÕ~Öß—ní ;ËÏ÷k¾(Ôuø§òBÊηóê9­ã9{/´âu íýÆšGrZgr²_rZŸü=ãÒ)sz>9ÝgN~6ÿÔ~'§ý`Žõ D‰#?øçÃJ”¨TöàgÉÁÃGü¨pðßÁ?—žvðóÈb”2)£Œ2þàÿ«À+qàà¿JpKú™h§þß ÿýoûïç_xÆ™ÿþ¿e³ÿߪY± KM=|ÂøÿŸ5”½dÌøá†ýO-ÿ¹ïŽ›ZïùÇ°í¸©Í%}žÕeŸ?Ì8ôÙvåín·? Üþ øç\ ¿C Ê;6w|Üi:üÎ àw)?ï-p×ñàn5áwÛ¿ûhÊ{÷ª îµþùá÷>Šò>¥À}_˜„áßð ¢<º ëŽý?~'üÄy”s®æàç×à~7ÁOµ…ŸÚNyæSpv6¸° üÂàçfP>à2ðÀºà›àšð‰”=Ç…”ïì Þ¹üõð¿9þ7?PþÝ×àïoÿpü¾€¿kå?] Þݼû}ø?O‡¿§å{Oï} üëøûjÂß·òß_ÿ1 ügeø>ÿ@ÊdÁ—ÿýø!þÛ%9,:¾}X‰Cåoþ¸ä½à#z­ãóø¥î¤¼ô­à2ç‚Ë|¿ìMð˵¥¼|KpùOÁfïØ~Å(¯ô¸òeàcêÂ?fü*)¯:\­:¸Ú:øÇ ‡_ýÊk”×X>¡~Í#á×|‚ò“׊€ký ¿ö}ðëœOyÝnàº?‚O¹ ~½Žðë}Kù©_‚ÌŸv&üÓ¶Âo8‡òFW‚77~~“©ð›žByó“ÀÍ7‚ϸ~‹ãá·x™ò3_· n]~ëgà·ÉQÞ¶øìÃÁg?¿]~»ý”Ÿó+¸ÃÝàs»Ã?÷'øSÞùfp—và.;àŸw=ü®­(ïÞÜý#p™ð{ž¿ç{”Ÿ_î=|A-ø¼¿ÏXÊ F‚#Ç‚#/«Hy¢ 8ñ8™‚ß·$ü¾Ë)O=N_NY ?Ûƒò\gpî{pÿ…ð´‡?à+Êmž rü!Ãz忇×à¸þÈÚ”:<êðè‹á© ÌZÊÇ>7<¾,üñ+àOHS>)žt<ùAø—öéo”_ö3xêðå]à_þüi·P>ýFðŒ6àŸÃ¿òZø3[P>«1xÖû૯€?ûTø³CʯyüZÁÿh+åŸ|Þr%øÓ†ð?}þÖË)ß6 üy-ðçáq üíÇS¾£ xÇ à¯†ÀßYþÎg(ÿæIð·ýÀßÿ»åð¿R¾ëð®_Á?Þ ÿ§îðÚMùÏß÷,ÿÒþ/;à~ò}×€kþícø¿Ï„ÿÇé”ï¯Þ_þk2üµáxýPyQ‰Wá¢ÃF‚?vŸ/â•Jy©þà#Ë‚| ~éü2%)/û¸Üà£úÀ?jüòK)¯x;øèÎࣿ‡_éø•ÛS^¥ ¸Ê6ð±sáW=~ÕO(?n3¸úàãëÃ?>€_ãRÊkŽŸxøÄWáŸt1üZU)¯s4¸Îsà“À¯[~Ý”×{ \?®þ©Âop!å {‚~£.ðý@y“à¦7‚›¿Ùçð›_Ky‹Yà–Á-߇ætø­N¥¼ÍÉà6o‚Ï¿mMøm7PÞî%pûaàs*Á?g5ü)ï˜w*îô8üÎ øÿ¦ü¼ßÁ]—»õ‚ßíøÝï ¼ç­à^À½¾†þMð{·¥¼OKpŸOÁ^ ¿  ü‚(æÁ±ËÀñºðãoÁOL ¼ïhp¿ãÀýÖÁO ‡Ÿ®Ly¶<8»\˜…Ÿ;~î Ê< üþ {á>Ÿò¡]ÁC_tüaçÂö å#¶ƒG^¾øLøo…?j6åc®_rø’wà Ü)”O8 ôí¢}èÛE¿ïÿq+ø,ðÏ'úvÑ~ôí¢óÀ·ÿ¾”@ßCßJž.™¾”BßJ¡o¥_—.‹¾”EßÊ¡oå+”W@ß*¢oG£o•K€+? >};8};¨‚¾T½ \­+¸úvpúvP};¨q6¸Æ—àзƒšèÛAMôíà¤Áµ®×Fßj£ouзƒºÁ§œ>};¨‡¾ÔGßT7X>m0ü†èÛACôí Ñ“àÆýÀMзƒ&èÛASôí yopó_Ág o-зƒèÛÁ™ß‚[Ý n¾´FßÚ om¯ŸÝ |6úvÐn&üöèÛA‡zàEàsÑ·ƒŽèÛAGôí ózp—‘àóзƒóзƒ®èÛA÷¸Gpôí 'úvÐ };8ÿ/pïûÁ o o}–R^p;8ÒAߢèÛA };H´'¶“èÛA_ôí /úvzœžΠoôí ‹¾äÆû×÷Gß oÑ·ƒÁGƒ?‚¾ E߆¢oÇ£o#€?};Õ<êgðhôí` úv0};»<îðxôí`<úv0};˜4 <¹1x2úvp)úv0};˜Z<õMðåèÛÁ4ôí`Ú«”O_ žqøJôíàJôí`&úv0+¾úðÕèÛÁlôí`6úvpÍïà¹ËÀ×¢o×¢oóзƒù‹À×w_¾Ü€¾܈¾,h^°|3úv°};Xˆ¾,ʃo¾ };¸ };XŒ¾, ¾ã8ðèÛÁèÛÁ]èÛÁÒ£ÀKW‚ïAß–¡oËзƒûß_¾};x};x};x¸+øá]àGзƒåèÛÁrôíà±íàǯ?¾<¾<‰¾¬˜~ú4ðÓèÛÁJôí`úvðì‰àg_?‡¾¬FßV£okÖ€_~};x};X‹¾¬ë ~ù0ðËèÛÁzôí`=úvðê^ð†»À¯¡o¯¡oÑ·ƒ7€ß<ü&úvðúv° };(j.ú o!úv¢oï¼ ~wø=ôíà=ôí`3úvðÁð‡UÀ¢o¡o£o[Jƒ·< þ};ØŠ¾lEß¶Ýþ¼7øsôíà ôí`;úv°£xÇwà¯Ð·ƒèÛÁNôíà›ÏÀß^þ};ø};ø};Øu9øÇzàÑ·ƒŸÐ·ƒÝèÛÁžà=ëÁ¿ o{Ñ·ƒ½èÛÁ¾gÁ¿õÿ޾ü޾ü¾ì÷ÿþ };8€¾@ßK\ºOÚ%<¬ÎR>iŸð°7ûú<œö Kž¿$í–|þø#ÂRÕjóIû…¥ÖÂ?’v ¼~iÚ1,½~Ú3,3~üaÙ§©¿í–ËÀ/G{‡G¿<í–OÀ/O»‡åÿ†_ÿFXñBê¯H+þÿhúExô2ø•èa¥=ð+Ó?ÂÊwÀ¯Œ$<æê¯Ò ~•Eð«ÐÂc;À¯Jÿ «Þ¿*ý(¬vüjøKÂãæQÿqô¯°z øÕégaõ-ð§Ÿ…5šÀ¯A k¼ÿü*aÍÔ_“~ÖÌÃ?‘þž8þIôÇð¤·à×¢_†µ&À¯…ÿ%¬½úëÐ_Ã:£áס߆'¿.ý6¬; ~]úoxJeø§à§ ë ¤þzôë°þQðë÷‡_%üSéßaƒRðÐÏÃÃ? Nذõ7¤ÿ‡ ‚ßqž^¿ã lt/üF{ÁoŒß'lr'õ7Ù ¿iWøMo‡ßtüføƒÂæçÂoŽ_(lþ ü3ð…-ÚR‹à·Ø¿ekø-¯ƒ&~£ðÌOá·Â¶š ¿~¤°õÔߦü63à·Ù ÿ¬Óà·Å¿¶½ ~[üLáÙu៿)l7‘úÛ½¿ý‰ðÛƒßþ5øçà‡ ;T‡ßTØaüsñK…¡þŽCáw\¿ÓÑð; ‚ßUØyü.ø­Â.…ð»à¿ Ï{‚ú»¿k_ø]…ßí0øÝðk…Ý#ð»ãß »ÿ ¿~®°çùÔßóø=÷ÂïÕ~¯»àŸÿ+<ÿGø½ñƒ…½oƒßXxÁ·Ôßçø}Àï³þ…gÃ/ÀȮ_€¿,Œœ ?‚ß,ŒÎ¡þè'ðcÍàÇfÁ}?Ž?-L4„ŸÀ¯&Þ…ŸÄ¿ö=…úûNß÷møýêÀï7 ~ ¿[˜Ú?ÿ-L_?.̼LýÙjð³#àg_‚_X~ÿ\˜ ?‡Ÿ.ì_~üuá€õxþÀÒðfà|þ üxáàÃáÆŸ~þ`üzáýÔ?ôBøCï‡?ôwøõ†? _8ìnøÃðû…ûÃŽÿ/±˜úGì‚?²ü‘‹àüþÅøÃQíàÂ?ŽÚ4~ÂpL+ê3þ˜Ïà_Òþ%×À‹ÿ0ûüqøÃq3áߎú'4€?árøòð'Öƒ? ?c8i2üIøÃɵàOÆï^:–ú/ÝJ øSFß²þ!³öàçÔcáOÅ/N}þåø'Ãi©Ú øÓž…ÅQð¯è:~ËpúSðgà¿ g¤àÏÀ^¹œúg–€?3æÃðgþÿ*ü›á¬ àÏÂÏÎÚÿjüáìÔ?ûNø³wßÓþœÛá_ƒ4¼æ{øsñ‡†sŸ‹_4¼ö+êŸ×þ¼àÏÛÿºÖðçã/ çÏ…?¿ixýð¯ÇÞpõßð!üÁ¿qü7ÿ ¿j¸ >üøWÃü›ñ³† kSÿ‰ð¾ÿ–“àß2þ"ü¯á¢Wàߊ6¼õbø·â o[Ký‹¿x(üÅkàß~4ü%øiÃ%à/Á_ÞQþømÃ;ÓÔçðï:þ]}áßõ(ü»ñç†w€¿¿n¸ôAøKñï†÷üFýËzÃ_vüe{áßÛþ}ø}Ãû–À¿ÿoxø÷㸅úøþƒçÀðføî„ÿЗÔÿpøã'þþ#ø‹Ãå-¨ùøË?ÿh3øÎ‚ÿ~äð±÷á?Ž?9|ü øãWŸ©ÿÉSà?9þ“oêüø›Ããá¯Àï>]þÓøŸÃ•£¨åzø«ªÁ_5þª—à?ƒ_:|¶ügñO‡Ï®†ÿ~êpu9ê_ƒ¿úiøÏ—ÿ|þü×ášÇà¿p8üð_ÀŸ¾øõ¿¸þÚ á¯½þÚßá¿„Ÿ;\× þ:üÝáº=ð_Æï®?ú×/†¿~üW:ÁeüWñ‡‡¯~ ~ñpÃMð7à_û‚ú7¶†¿qüŸÁ½%ü7ð›‡o\ ÿ üçá›M࿉=|k:õ¿õüM àošSþÛø×â“áág‹Þ‚Ô†žHýáXøáøùðó£á¿ƒ>|güwñLJïƒÿ.~ùð½ç©sEø›Áßü,ü÷‚ÿþúðƒ,üðÛ‡ ÿCü÷áGIêÿèQø—€ÿq þÇÃÿ¿~øÉð·àß·Ü  ~þðÓ_¨kø[ï„¿õgøŸu…¿ ÿ¸íVøÛˆ??þçÄ„_, þ/¾‚¿½-üí7Àß¾þ—Ä „;΄¿ƒxpǧð¿"n ÜÙ”úw^ç‡ð¿nÿëð¿!ž üæøßÖ‡ÿíTøß_~·‰ú¿¯ÿû‰ð¿þ'ÁßEÜA¸k ü]Ä„?V‡ÿ#qáOéÿ§µðw÷Eðw¯ÿ3ñ ážòð÷§îYÿâ½¥©oþÞ'àÿzü_ûÂßGC¸ïøûˆg‹Àÿ¸†ð÷û¨ÿ÷ßàÿÑþ÷Àÿc/ü?‰w÷wƒ¿Ÿ¸‡pÿOðÿêÿ@Gê?°þoáÿ}ü¿o>ÄÏ— ."_âËCüüaÄGä›ßŸOâ$ò‡o=T¾d ø%çÀ/¹þÍà—"~"_êJø¥ˆ£ÈÙþ‘ÄSäK_Ný¥CøeN_f ü2oÃ/KœE¾\-øåˆ·È—Ûÿ(â.òå§þò£à—_¿B5øFÀ¯H ~åüÊOÃ?¦ ü*Ämä«ôƒ_…øü±‡Ã?–8Ž|Õ(õW}~Õýð«À¯v?üãˆïÈ÷+üêÄyä«ß ¿:ñùãwSóà×X ¿Æ.ø't‚_“8|Í…ðk’?±ü‰ ÉŸt=õŸôüZ­áך¿Ögðk/’¯Ó~âFòu>†2ñ#ùº§Sÿ!ùøŸÏ÷àŸÒþ)Óà×#®$_¯~}âKòõ'ïOœIþÔש¿Á‰ðŒ…ßà5ø§Õ€ßø“|Ñð‡’?ýXø§’o4”ú=¿qEøÁoü,ü&ĩ䛖…ß”x•|Ó§à7#n%ß¼$õ7OÂoþ(ü3JÀ?#¿ñ,ùÀoA\K¾eø-‰oÉŸ¹”úÏÜ ¿Uø­î„ßêgø­‰{É·é ¿ ñ/ù6ßÃ?‹8˜|ÛöÔßvü¶_Á?ûløgß¿ñ1ùvÛà·'N&ß~.üöÄËäÏù„ú;4…ßá*ø>„n#ø‰£Éw¼~GâiòêÃïD\M¾ó¥Ôßyü.uàw™¿ËðÏ#Þ&ßõø]‰»Éw}~7âoòÝ«R÷𻯅ßãø=.‚ß“¸œ|Ïçà÷">'ßkü^ÄéäÏ_Aý½KÃï†ßûIø¿ñ;ù>qø}ˆãÉ÷9ÿBâyòRÁ}ð ~ƒé ?rü(q>ùèø1â}ò±%ðcÄýäã?P¢#üÄ"ø‰oá'Ïß—x |ßá÷%.(ßï,øýˆʧ®¥þÔgðÓ-à§çÀOoŸ!n(Ÿm ?KüP>û>üBâˆò¹S©?w9ü\¿=øý§À@|Q~À›ðg”8þ@âòƒ6PÿàãáðzøCªÁJR~è0øC‰GÊ_T þEÄ%å‡ ¤þaÏÀ~üá9øÃŸ†?‚x¥üÈRðG·”ù8ü‹‰_Ê_ü7õŠÁõüQûá.€?†¸¦ü˜eðÇß”¿¤üKˆsʽƒúÇî†?î<øãn‡?nüñÄ?å't€?8¨ü„¯áO$*?©-õOºþ¤/àOn ò<ø—'•¿ôSøSˆ—ÊO¹þâ¦ò—}@ýSO‡?uü©ïÁ¿¼üiÄSå§]qUù+ê¿‚øªüô Ô?ý ø3N„?c,ü¯Á¿’¸«üÌãàÏ$þ*?sü«ˆÃÊϪLý³†ÂŸõ<ü«†õ ø³‰ÏÊÏ^ qZù9Yøsˆ×Ê_óõÏ- nþÜGá_[þµÄqåçEàÏ#ž+?ïø×וŸ>õÏ_ þ^ø×÷€ýðo Þ+Ãÿð‹>rè˜q£üã¡®Ä_.S¯_ãz£×\üØp×á£;=aȸ¿À)ên½cŹㆠ3np.ã q)~ÊÙÎTWú? ËŽ3¹‰*ü_ßtñ€ñã‹]F¹Á& h2tÜÁï•8tFûeÂð )v«ÇĆR;:dÜð!ãk÷8bÈ  žVað˜AG¼ëÿ˜.öõ“c‡Ôî9`tí3šÕnÞºmËÖm[œuðÿÍΪ=pJí‰ã‡ŒûgÐüósGý]¢ÄáÿëZ'¬˜z‹UXú’ƒF¸hHñ›û¿pèú¡ÿR›!6n¦fPortfolio/data/SPISECTOR.rda0000644000176200001440000022261411645005054015360 0ustar liggesusers‹dÝu¼ee0~RJºSi )AFº¤Cºašfæžsî=ÝûĽCw’"HJwIK#H‡ÒˆþÀõÝ÷ý¼¿÷þ1{ö>O¬µžõÔÊ=¶Úw½y÷w–Yf™m–ÙæùîßÙ¿ûï³}÷Ϭ³Ì²Ðwf™gÏݶßsë-÷ÚuYf}YfÙ§9¦1f–ïÿÆÔ>´Â»¿?¦öZ<ë¿~ø»¿GÆÔ?¼àÙy7;uLý¿®öÙ1õw<¿üþqà˜Æ‹MymÛ?ŒiüÝ¿‹MÓ8J½O¾k潡1õF¾û›9¦ž™w³S.xvL} êÕWh|×Ð]cjÝS¾ï`Lí*ýþü»_Wû|LíïÑNm¿õ¿ÿS{<ú©Ïý}õÕÇÔþ®Ö)Ž©ïèù«?|W`»1õí£ŸÚÛß_lLíöø^»Ù÷®öV…o)૽ˆs|õ 7Ž©]£ÞG_}uð-ø×ÞÐÞê×ÿÚ ß£ý£1õ;of1õµÀ• ¼ê‡Á÷Mp< '¿Ì;¦¶>ü§Àÿ¨h·¾‹ç6ÆãÜ£¾ÿSÿ[й±[Ð¥±kÔoœômý4Æ~fÔop5:oã)ã÷oã:Ñ{.ðhdÕ?.àj´ÕûkпñŒþN<êï©7~VÔ/>kœ¤ü0¸OÕÎŒø½9»~¾ÖïÇú{'èÝœ5Ê7Wˆö›óÅïÍ]<Snÿè·9V»‡\ÍiÊý6Æ«¹CàÛœ¢ü” oó|íœp4§(¿·vŽ<šç_4kÁwÍÓb\›åÏŠqoŽø}Øûƒ^Í>øÎó^ ~oÖÀyšzÛÇø4wç.àÚÅû¡Êí«ÿIð¨_4/ÏmÊ=ï—Õ[ùc\šoFÿ­9=gÑî§àüGðWó tú¯÷F?­·ý~€¾{Ü­¥|_,Ê·õþ#å‰~[ûêï€çVß³üÞšôjUÞÖpСuv®ñþ×§Öµê_íyoзõ7åþxµÞõý9ð¾tkÝÎKõwEðgë:Ï‹ïÖYÁ­*üÚŸ¡\ú<žÄ8´vSn¿¯|ÕZ|ãû¬Ê­Œ[{ ð­|ÕZ¾¢ÜºúÛ~»û¾¿ò[šGÀo¾ø½y#¾¹_\‚JÚ?㟔Ç'ÿÐß ðœ‹Ãg¥˜7­mõ»|Òñoxù~iJot˜©þÉú§Ÿ]õSƒ_}†ý>‚F´wöÄ/Ç ÿ$ý㛉_ëXðn¤ýýñÝVÚ­{ž¤½­b¾´6Á»¡ÿ–øfí/eø—ú?õ}p¯ÎÙá»|Ê7ø.ó¹u:¸ND7ëmk-í¬æ÷eÿæÆí_Æõ|÷/ëÔgʯ‘Ö |›_¨ÿoëà7è²$|×çvàÚÚ8lç÷]Á¿*úm¤üNðßG[™ËAøÌŽžóZÏþf]úÌófpÝæiœ›3¼g¬sGàÿ¬ï%ûK ž›¢ÏZ~ßR;ø´¹¯õkó$Ýçž²Ýj\ʾ·¥ó‘u?=·Ôú×> ¸ªG;§Ìåœóè__+àªÏ繓óËcÎ[Û¼µs+Žsîú¡÷¯”;J½G¢ÆŠöÛUìË«‚»f>*ê7Ör.zË9aóh¯1«ïÿ‰ñh¬x52Úù“sÁ߯¶žÌo¼fG·‡¬;+˜kÛ_·_m¬üãr”vNVn²q)y–ËëÚxãw€qÛܾú#í¯‡ŸöÇîžû¨—ŽÿÎ_ë9ôxÂ9ìüøÞ¨¡óHcqô^Ò8<ë\ý²ó“sHýçèù°óÏ*ÆçXôû±óåëÎÅà'|V_6Æ­v§óé1OíEçãôœýrЧöÇ€«f¼ë‹D»µ'c^Öun_7êWŠrÕg´ó#ýíéœ{*~þ£÷'œ«»Î¹;oŸã\]‰òÕÏ‚®Õ^ü^ý‡ßw÷\-ú«¾pU¯Šu´š7oþpVÏ úV'DÿÕ¿:¯Ï®üYGu[åü«c¢ÝÊ-1Õ‚?*÷ýÔ(W~3Ú-ãR<#Ú+­ð—~t-šEç‹âÙWq÷¨_Ø,Æ3¿PŒOက§8kУx¸ç5Ñoéø(_Z<¾—æ ºò~BŒwéçgií Ki…€£´CàSú+xð­Ý£b|KÕ€¿ô@ðUéêø^^>Æ¡œ~ʵ¨_ÞÈï“ôûöOÏmúB{ÿ<Ë;<å}ƒ>åcÐy–è¿ü°ï΃åo¢^e倣ò{ï÷Æü©|åûéO¥t«\ëýàh·r\ðIågAŸòÕ_ù怿œ1¾3‚®ëmåäø^9>ÊUòû¬WùAÇò ðê”wÏ=Ú½Hù=ÑáæÇʬž¿Œz•­‚ß+‹|•‚ž•õƒ•µÐÿh¯²$ø–8*îå¿Âëtlèÿï÷‚¯þK¯ò3躚qYTû›é÷íâËrÉû q;PÿKÅ{éõÆy¡Çåg¹i<þ®ßMÓ/õ¿pЧ|~ÛKû£\y;ßO3Ou¬ü8?ùVÙ½7Ñþô==ïðîW9\gâ£Gðß?¬'Ë[_VŽv«‹Y—æñ¬’T݇ªäÕm­‡ÿVÇùÞ x«“üî>_ý±õj?ßgX×ÔÿJž«?5ð©žçy–~FÔ?<=ë;ùFu xçð;ùIuyø.|^ÝÆz½6¾}Ð÷Í•wÞ­Îï¹vбJQ= œ7XwK¾ >r‰ê^êýÒ»óu•\¨Šß«eýmµ­X'f‚w,¾s>ªü0ð©ìŠßŠøl ëâ³ø«‰¯~aÝ{,Ú-Íý•µ~o›~·ü.èSü‹uûaëäÃêmt+^fÝÿeàYúÄúù‰õõýÎmZP{Çü*¸?äïŒgaè?ÿi<‡î ¾<'ú$WtoÚ3Úz(è’·ïçG‚.ùJôŸ_9~z'úú‘ß7¼†È…òW©ÿ/ÏsÁCî èT°Î¬ûç€ÂvöÉ‚N…烅£ŸB!èRx@äuùÝôsx×€ÿ©ñûÐpŒ÷P3èœÿiÐkèyåÞ›<ç‰~‡ ç}fÈ9qðýh ö‚or/EýÜsïàZïÐzÑïÐæñ>ø— ßàTãb?´? n­G£\>úÍmáýì€|dðXý˜WC¿1^õø}hªw|:´¢ú¿7þëE»Cùý—à?#àZþÇ)÷ó€oèVýZ†®AïÍý>Wô;øˆr ÂÛ½sèDíÞ­þýèt¡~îŠzùµƒÎùbó[äç4^G×m”sŽÌïü4ô'ãycŒÓÐiøøHð. ž¢Ý¡½¯>ç·¡ãðûÖÆíuãÿ€yÁ^”Ï}a<׆¶Ôßoµ¿ ¼×ÏúYÂ÷_øžÇ¿K—/£Üàeñûàÿ õ¹)àÌ dŸ8²wÆïÙ烾¹Ÿ9ãž;Y¹/ðá¢A¿l+ÚËãš]-úÍÖµ·R´—]Õï3îÜA·,yxö À?û;ï§?f7 þ˼ï™ë¿Œu0»„òæQÿföŠþ3»™ƒÎäχüëÅø\pe:1³?ŒzÙ £ÿì9Q?ûçè/çü“Íêÿ‚€+kÞgÍ›ìIÚý¾?‰qÌ^ߢ^nÀ'Gî•«·«9Jn8êçîÅW¿Šzƒ?´ü×üš;úÄ¿ƒ³ǧ¬éø~ô\ÙÇwS¿a~æôc?tÉ‘›þT»ëèߺ4xüR¾_Ìûê»_a• Gá·wÁzÿgŒ[Á|-¬®½¶tNXÉ9`Ĺç\ç+¯‚}£p~à]¸D{W(w±~þâû‡îë Ä÷¢óB¼³pZЭàÜ[80è]øa<óïÃÿ x6À}ŽýèFíŒ×âèú±sy]a?øÙ§ 3}/«‹^ýè§@ÞU8¼‰ï›9ÍÎ9ÚèFVØÞykšzãÔs_/œïôC¯XxýÎö¼Ê8üIý:Ÿ:®EwçÈÂþð;þG¡Ï£àzV{G;òŸ½Uq•¨W\=à.—ž³=Ý»ŠKß7 ~-ü'ú-nª÷Ìâo£×HÏÕÚÝMý]ýî\^ÜÇs‚r^¥…ÉU~äü¿óýZ¾Ï‹¿îÕÏ·Î÷ô½¥ÝœûgªwnУ4ͽ ð—nvx/Ưô2¹}NyrãPzÚ½{Aõž‹vʳùý÷›uÉ1Æ‘è·<à>t°ûÏï!WZˆœf#õÞÀ·7¢ç?´3~~¦ü 1ŽåßÁß½®LßPÞH¿_ú¾"|¶×ïÖÚÛØûžøzqý-Œ/W7}Ky{t߈<Õú^úœ¼ô5ôzÐûYæg‡Üëfü3‚Ž%ónÈ|7~¥­Éc7"X8Ƴ„OJ=|Œ¯J›€=K»êç í³'(‘c–è1Kîá¥CËÑ^ñü ¾¿ÛzxuÀSt_/žbÝ<×óõ†¬‹öÓ¢yXdS|,ð+>dÞýžkXŸÈÏŠÿ×:Ê- çµÒéžMå*èv”ïæqéBøàÓé¾C²þ›©¼].Öî¡øÉ:V²•P? nç RVÿO+GoRzX{äå¥ãñ‡ý¶DßVÚ½¾öt®+>ªŸ¹ÑñoÆ‹¾°øQ´WLÐÿrò¥—ô÷z‡GÑù¦´7¾jÃïlp:·–ž€ç5øíëÇÜÖ ûeÙ}zt^¯k½³ž•^}MÉ9¥DîV"/±³(õŸÎƒéøø6å¯ÒnZîzxýY¹«Ñýå¾5¯—³nÌOî¾4üœCË+ÂgIëÄN𵿗wòûNÞ÷±Nì 﫬¿7ÂÀï‰u„=N¹¤}úÐòèçT®ZwÓ}ÏzR¦ï(wô–õëRpÞ¢ß;Ô§)ÿ|©üÿmßߎr•9ÈEWŽqªlCî¾9·u©²›rrRü^)ø>£b}®L¥'éÓŸ èoGòõƒé5Π¯Öïýäîö¥ÊÇä·‹Ó.G/÷99þÛžôK•Éuß"/_|O‚ë/à:‡þý* `OT¹]{OÓ·ÜLðgí«¸VÞB÷Éé7B—cÈÛw‡ï'êÿÓ÷¥ÈÓ7½p•Þ®z„vŽ¥gu>¬º_WÙaVÿÉþÀ~^›G¹·è·fI/_ÛŽ^šÜ«v,ýíñ15ú‘ÚXúé=÷HªOVž¼¢ÖÑÏDåoyQ£¯¯±s¬ÑWÔÐ_Oû-߯ïMúû3ýø‹ÚïýjôÆõe¼ËÞc§x¯WèíGëg=ëWÓë?Â^äfåîb_j]«¿Á¾bQv;| ÷â†}«Ñe7@OÞØ?ðiìtnœì÷ñWã vî{ çÛÆøÀ§qZÀÓ Çhл5ØO6È9?cWjߪÓ#Ô/d—rcÔ«ßr¡ÆOÙ=Ì|Ô /KíŒôÉ ti°ChÐÿŽÚµþ'Ê5çcç±&ûŽ5¢ŸæfìIõœÔ Þ·Jí~Ôû]ðmsvCG²;9Ïï7°!wlNdg2I¹)1.MöµÍcµ·­~¶ |›»¦v-Gs¥ {s;í­¯ßz•Ú¿¨÷[ðýZûgxÞïÙ‡±+l~Ë^méxo-p¶Rn±è¿µK¬+­M|gÿÓZQ½ß°G;=ØPôÛªkŸ| •hÿü€¿EÛš¡”»žžñlýUû¯‚ã© Wënåïgx;;öM­+ï–sbëlý_¯Þ•úÿ {³«õs±ïwk÷axÄŽí%ïßD?íõƒíÕ¢ÝöúQ¯½^ði{±è·Íî¤}x´Ó>*àkŸø´ÒÞ¦AöA¿öʯ¡þ*O›¼²½­ßÒ?û¶ö©G;ë~;ãÚÎÞíÁ·¶ór›~´ÝUîõÎïØÀ¿íÜÓþ#¸TïmýÿGùWc<ÛÏèBŽß~+æQÛ>Ý~!ƹý’önçÅÊÿ ½>‹÷„½N²l´Ÿ,âûѲfÐ5ÙÐ÷ ”ûUÐ1Y9ø,Y?àHöœ_ùEÏdÝè7ù™öèY“ßho¿ KrhÐ11ÎÉáW²ßWz'¿ :%æQ²wÐ99N»Yí²cKŽŒqLN×~Æ÷±iy¿oã–ìüÔàw|nŠñJ®õ¼Rù=áåþ™üظГ¶ÉÚãðÿWÆaw|·¾dçØ>Ç÷-Ô#'jOÀìÚk¥óÃü¦nÏõZwš—ûX³^Üéy=;Ó¼¿§ü7øoyüý#ü³˜yý)>›[àÛ<¼¬m÷‹vß_Ž­oí߃Ÿºí|Ñ>2àm“;¶Ùm·é ÛGi¿j~ƒ·ó]ûIý9Ç%³zn€Ÿ6Ä/?ÑýG²¬õàUx¿a|—T޽fòƒÀ?YK»“Œ{ ‰Øé%§ã#z©¤¢òèdX¹ó´w‡ïîÃÉ}æé³øýCóã}óâQÏ«”»~gáógÍ›·ôóŒrŸÞ9½íw~á¹cÀÑY.èÐYÀs· cçpïG=:'E½ÔÿmÀÙ™ðuÎQî"õøutÞôþnÀÓ5ðîuØt®qï¼øtÞ ~ë|Ïî1ºì»Ö³î‚Þ—qèòÇê<¿wÈy»sD»ÝŸ‚ã×îøè·»WÌ‹.9cw ¿ïxu飻Gëç˜àËî®Ñ_—_A÷`ðxu÷ò}øÝëyaô×yžþê £ãÍèpEàÝyÒx}pÒó‡àÞ(ø²»¹þ&úÎϧÛC¿ñèp:úec\»ô ÝsàÝQ¿î÷Wљܳû$:ܤ{˜î]woÁÿ;¨ÞA¯{÷ÞáÑ^ïðè¯Ç½ÇΩw¸rCA¯ÞTÏ­‚N=z÷»“{½»ÞÓw|¿gÿì‘Wöî:ô>ôû3Þï¾ìÑ?õ¾ <úóy.tì} ¿»b~õžùÝ{ü‰úÝOÑùÚ(×½ý®7Gà“ ¯î[à!/ê­‰.K£óøqwãq¾÷ËðùWúç§×£ïU´Ó…ç±èh¿î-áûÞ1޽}õ¿›v*Ê“ßô®†ÿÓÁ½ÇЕ½pïàϾý²?oðKŸ½xŸ}^?üÚ‰ñëÓ'ö£úäý+Ðÿú€§»vÏ xú÷«ÿ vgj‡]GÿRíÝxôùGõ¯×þ%~wÞê? Üuʽtì_¯›Ás8þ¬¿7Ïav§av4Ëÿiwšv×ÑßZÚ9]ØåôÉ{û•>9qÿöà³þïÑóFý²ëïß <ç1>ï©Ï^¶Ï°Ï¿´?œgù}x‘õòŸÆáiãÀï£;›ï+Ù¯{öëðɵ¿‚sÁ¦Î÷éç?ð!èþÇúý4:;wõ؃÷~ÿO²ñì9‡uß5þŸãÛ³õKÕÝ<;û}’ßÙItÝ÷»?v¾¸Ò³í÷9í#ì¡:¯Â7ñ¼Ä÷eGïuþ<×ùúHçöc×ßtHœ§vÞ=Î}qåôüì÷£œkí‡ }[r™só’Î÷ë:ÿ?ëþñ®{Á5é¹Ý“¾>YÝ=âaí¬ ÝEÜ¿_QnyxÍå~´ïr_¾?ø&™Ž1îoï»Wœ¥½ÝóÈ›ÛãÜ·øi´/9y»ïéÜÝ:5Ö“Ö¿Ý—%§áÿÝ WHågé¿é{zÿXÛø°OI6A—CàS€þJfA§{ô{ž{¿¾öÄôÞ§ùïè8. O=¿E¿­ûÉÞÏò<Æ=§ƒ>sïç·˜\£ÞGîïOú½¿‡Ü»ž‹ggAçå9ÜSvqoû@þ ÿÆ„dâ~“tÝóØ?%ü›“Gýþ†vnTïyåŽïfî‡+¸ß>ãü:-î9¼/ä÷WÈuvmàzÁ6{²v?϶ý¯ý |ò¹Ý+äéýÿšïÖ£îù×i<¸åÜÖ¢Wn±7i-G®¹&¹g—œ‘ië}ã=?þ8óënÿ¿ðk»§·O÷NÓ>øÛ´oçÕæÓ+Æ…ÝP›ŸmûOÚ»];O{>¿!󃼨ýkpNQÏà¬]HŸåÜR;<ð«­KögÏq¾³[­í¯|Éwþ÷µUƒŸª×ÒÒOTݪ»ÓòϨ²ÿ©ÞpVÉ«sœöX•¯é}7¢'>…]}RumzÓTêœW]ž¾ufÔ¯ît¬*ýc•]au,½);òêž‹{På/_Ý—þ·ß­b\ªìÒ«ƒúû½íÇÕ·ƒžUvøÕ:ýêá1>Õá“¶›Âýgån¢G~^ü†ª»‚ W›àv~®ò_«ý,ð«ýÜûÖô¦»Ó.L{°ñ¼ŒÞ“`Þ¿FÿQ[½Î×x55ãQû‰gžžž5~O5ör5úËšýª¶£~Óò;â×_ã;vºµ Е\±Ê>¾ú{|ÅÏ z:±©^„Ï^LÛ¡'¶/ÔÐÉzYÛß»ûAíàè§æ|_{âäÔÞÓÎßüþ1üãj3Ð]aí åÏ¢w>W?xßEý†úŸš—äžµ÷µŸúNæ=ðúëÇ´ kŸzý’è¯Þˆvëü5ëæyž·Î~¬Î~­>à{÷I\£º{Tß_ýëQω>º.^E=V}Àº†ësj—ýrí9|ñ7ëÏ™ÆeOôZÙø>eüÙËÔæ2R¿ÍÌ÷ËÍë{µeþ°;ªÒ_UÙ“Vù¯W'˜Ưz;~ ÕŸ~r¬Êçw…<¼:Yûgè¯k<·ï2ødO~µSØ+¼”òú-‰ÿ±O°£¨›/õ Œ;=e}ÎtÀŸ}ImGíò[©Í†N÷˜'À÷0õ7ôFµëÉî®:Þ:$NR•nuGãð¾ß_UþãÈ v üÙ9ÔŽð}sp®ØÕ¾Æ×›¿Ç7÷ ÇOÍþÄuþËõ+͇?Æ{c6ö öÛûò†qm,kå/R Ÿ¿«ÜòÎü¼êûý|M× okìjÿ_]Çþ~g'ÔØ\5öüqw:oˆаN5Îôý¦€¯á~׸˜½Æ¥Áï qÒ»°§ØD¿üAû‡½vcmöü²{{¦ëÈÌ_ví%´gÞ7ÎÔÞ]ðrÿh§5AŸ[Ñ÷ô£7¬ñ_­]Ž_Äs«ü?®j^öÌÃKðcº¦q(Ø™T¿0oSÿèÕ}¿Ô<å×VM×÷ù­¿Z§ù«Õø!Ö6ÅäXµYðçø˜}@õŸÚÕónçÔ~ê%pó÷ªN·>5RxÌ'ô«Ò#VéçªwZ¯^4/ØãÔ΃9ôè~ÿ¶Æ¾²v¸ïìýkâŸÕöKÏ ð;Ãûßþïuº¾Œu†ªö•ugíaðDŸ3dÝÏO ºåù›äÉ—òî ùùƒ.C÷E¿yq†ìCCÿŠßóû*_Žqͳ·Ì³£Í‹W°>îŒò…»ø-ãQàPt>-’Sa×Í»8^9ö Eû^‘Ý`‘ýp‘^q,úåØ×³{/’Ž¶Çž°xúÓS”Œy]º=Ú-Ñ‹”ĉ*³.ýÓø.âýFvéã|@С´;rë}Iü’’óL ¼¥à9üØùåùk«AçÒ’êó£)9W–ÖÁìKÏ€ÿh¿ôrÀ]úG¼úÏLgŸM“Æ)½>±9ø¦DÏX²n”ù½—Å-Ÿ¢½ì»S;â9Þ2ÿÇÊRÿÃgTÎ0 ‡ûdeöÀ§üoçÆå̧¿RСL~SæÇ_æQnÁGšÊÌû\ùÏ›ÁŸúé¤û§¸bi\ŒÊ¬ƒ+ZŸÄ‰Hã*UÅè-è¹­õÛúQý‡õèZí\îù '{•9qmËô꼈}•þ¡6Õ}”Ÿw ߤûJ=•Ïð­ïá|·žûÙ£~_˜<äγ8'þÛùì7ö¯ªsbâÝùµ~¾{Œsní#Ov¨5tªíþ«|wN¬}£ßyáÿ®sÁ=àZ¾9Ÿ{Ô²¾ÓóÔ××¶Þűªó›3†ïöUñjÖŸÚeú'Ç­ÝjÜÁÁ§Æn¿ö¤ïìÍjûÃçTåvrXÈ~+žN-Ý'Ó}š]gÕ=®ª½êuö·SÙµ§óæAû¤¸3•—Ý›N x*ü¨*â§U¦“ý2ð,‹ÏV™K{Æü¨\ì;;æÊ¦WùÊè?õŸ(9ﳈ£U|'ƵÀî-Ï¿%Ï~~ˆ=maßh§À¤è^[xÈþÆ? °dŒ_þOA§<ýp¾ã˜gWØÚþ26Ú+óÜ# âhç²ÎóÇ)’×'Š ¸Kâ-•Ø›•~e?81ú)ZŠsE?Å™Ú[þ_=‹ËÅ|*¼m¿Ú ÞüÚ‹ìË‹¯èßúRx=^µÏ_õ óÛ¯? ¸ +Ù÷éóë<ù‰úù1:°7ÏããüoÐU¼á¼¸9ù×cüó€#ÿ^à™? ýûÆ…~®@U\œoþEþ\Eþx…;¢ÝÂÖÚ±~æwù/~yLì6 ü+ â(Æz^‚ÎâNÑ¿y5êÿhŒ{þ]|a+¸ÇØÃ¶‹r…4þÜúúŸ€¯È— ƒžì” ü æCGA|‘t| äœùW£¸ù«Œ¹iž=|þpó¿ÎïaüèMóä…C¯E;Cü(‡ÌÓ!r—¡»ç–èÁî<ÏÎ9¿³ùé>—çw‘¿V?ähyöÕùýÁ±´r?‡x¢C숇։zƒâ¾ ’» ®ðäöÉ‘ψöÇǸ žü@™3ðʬxe—q̺OfɳâqeÙcføsd7¯ó^VÜËÌAï ùuö(í8ÿdÝs{{Š×”[6àÍþ}Vˆ~rsG½ÜaAÏçܶQ>‡¿sΣ¹_+o_Ï]­ëGÎy1'ÞÝà¶žàd§›{-ðÈñ?Ë£¿Šœ¸ù¹Ûƒ¯r×À—ÿR¶ídw ü²âèeÏ÷¼&Æ!{@à•½,úËÞ ŸÕw8Gn1J7þ:¹[ÀqSÐ?÷4:=«Þ ø\<ÂPcÌòÿ£óÍàÿ¾³Þgß×›àpÎÈ>ä\4K/”µŸgŸD?ú’Ü ÞO >Îñ‹Ï5ô+îIN—ÜmÞ/ƒŸu;'NtNœû{áºæ.ô|!ßæ'û¥AûÆ ¹ß ¿ë¡u£½ÁÌkòŒÁ‹Ðër¿?g Oü8è5´yÐ}ˆÜeˆ¿îÐùQoó;[WWqnH÷Cy òÎ9CîAyü>ô¥}Š4ÿ í‘çæÅÃÈÿDÿÿ¶o.býÿ-/h^\æüžWÚø…çÅ2_†&Äxñƒâ§;HŽ7È|Pü£Á4îx!CKø~¿zøiˆžqÈ<ªkÿVø¬ôâo:äü5Ä.vȽpèJçº £Ÿ¡²vþèwqâ†È‡þëœ2+:ޱ¿­³£+ÿ÷ü©Î)âùç7FOñvóüÅóî­£q®³º¿9  ž[´¿(8ħÎbäo”<·¤û¶ýp^ü—|Ï<̳[È7Ôï*­§ø-yùò¯)/~Qž?da>燭œ É›ŠâÑØøUszÁùæçSñŠÆ­¸cŒCñ1¿“ëÉ« ïkÿ%r‡9´÷­óÝ|ê§ñxÓøŠÎ%EúÑ‚üÅY§^OÛq~vþ*þÖÓz_t~*V½Ït~ž¦y'Šü[‹üŠŠâ÷Æ=Lã(¥ñ‰è™Š«¡×€s;¿Ã¢8¢ÅCÝÄy,.§ÿÅɳè÷ )_€¿@nU¸žüg âœÃFãÑgœ‡ æsA|«y`á5ã°{WÑxžáü}:O3.ò.Ý_‹äPEñŠUxÞþÏÅ¿hç^í¿€¾¸ÉkS­D¿Q¢ÿ.M$ÇdQ¢g)‘O”V<‹ô ¥¹ÀùˆûÐßðyN±hœù•—VVŽ|µ´²òïèoVðüšœË9¦´¸Oñ]<ËRœ,ûq{Œw ÝJö£}BIþ€;Þ’uºÄß®D[g®t¹:–øÝ–íåCÜ«÷ò~<ùSŸØù´¼=9™8Ãe~/eñfÿÏ;ùØRä^i? ‘‡Ñû–Å+½eÜî#'<Ü2Cá<\r/)]‰.ü&ÊìDËÖƒ2?ÉòPŠ:ð-±ÿÿ"žcѽ³x þúÉŠƒø‘]~‘]aIÜçÒ†øë§îíò¾”&zfÉYÙ‡”rƋܾt±vœ×GÇ“]\ɺP:I}r¶}‰_{‰}@yqrHö±åeðˇàIãu<©=ø•%?›œ†\«¼Žq£7+‹UN´>º›Wå“ñ‘x·åµàó˜qÿC‰ýb‰_oéyrÚ•àù´ñ{]ÿîÇeñÊ;ÃwJ´Sî“³Š—^¾ߟ‹ñWùzr+q2+ìD*ä9•ßc9'TØ[TŽ&·:A}ñÝ+ÇÐÍ ï©’k±ã¨ˆ#]±?UÄ¥¬üMù4þ±øañ¼F徿AE\‡ÊHеÂþ¥’%“/«BžP‘÷¨r:9ö¡Ú;~Ǩw2¼ØÕVاUÉ}ªøª"ÿW…ž²ºšò_Ó¯¥q6Ä?®Š‹Rýù"|«“[Îêýß䎟ë7Õ^«4ïÁjê-Mž=‰¼T¿5ñ¡j[“ƒÒÔr©}”òójG<ìšõ£Κù^ÿ¥Æ¯°ÆÎ­nÝù_8ÅïëçÉcÅ­ÉÇQs/«ý—|Zü·úÙé¬G.,îC<¿î\Q—g¡~:;|VŸD®,>z~²öOtzƒ<ù t°/× äø×Ò‡;‡ÔìËiþ·Ú4åäÛªÉQ·~×Ùµ×ÙûÖÅí©“;Ö>'w&W«ÍKÎO^QïzÔnåsòêc‹w\%ÕÿÓVSþ¼^ökø,ÄK|™*{œªóoõ9úÚßkG†ªõ¥&ÎtU|çšóe½tm~ôá7U#Wª­I¯0‹vÄ«]n<ÎG—T^o¿¯Ý§ý»•'°þãh¯¾°v?Kõ øáÇÆßù¸.N`í ã&®DmKôŸ \¿Ï6à_·¶ º­‡Ž Ò|mœÄ-ª¾oñÛkò-ÔÄA¬‰__wqÔŽü±æ^c_Y{<î;5rÖÚéajæAjä¼×XŒ üõè¿á^Ù¯§q¬ç©ì`fG³ƒúìg?UOüÚú{gƒ¿Uƒœ¾žÚs‰ó]_¶>Öü¥G­‹#Wg¿•æá©F_ôV”oÐ÷6äåhÀ~ˆ?j£ ¿ý”Kí€Ü_”O´Á¤Î^¥Î¯¦nýª‹#Y§¬®œ<-ÃØûÐÿ6^c$ŽtC\¢ÆÚà˜¬\9èÑX”ÞËý®.nQý|ûªþäA¨ï€wëâÖ›êÝ‹®ì|êâN§ã3šÓºW§­Îî¢þ¢vÙãÔÙ³46gW•A7ë[ƒbã vÞôS7Ðá«€¯ùøÊW×´¾5ÅOn:Ÿ6Å?m.tkòënöþæ`à5š)ôiN ¼›ì-›Mr»æ•Aßæ Aæ#Ê=ÏÖ¼gK\œÖ¯|_?èÓšãÝ:(èÜj{gçÕÒO‹ÿwË=¯u¦'ÿìÖHàÕz,èÕÂß-òý`ër¿‹ÚrOn‘¯µø£·ÄGNý Z×=[÷‚ë ß/Ð}më _ëÞh¯ý#~ ôÏ-ãÚ†wûŽ OûJßÙ»µÏ|Ú¯E; {Ùd¶ S²^”O¶þ’5£ýdLÀ•—% Æzœ¸¿Æë?0ù‰v–:´?ÖïûA§d^¿/ôKäùI–Œò‰xóÉÜÁ‡‰¸±É¼à—>YÍ»x’ ùM2.èðOMÈ1ñ“óàwaÐyô}Š~œS÷äxø²¿NäñLvÒÿ:ê­õÕßV½-bþ%â{%ì#’Ù‚ÛŸÆ÷ö‹èÂ6Ù[»Öóäýßã™üA?;¿9‚_ÚïÅ÷öžø Íùo|³þü'~{Rÿ;áñ^ÚómþŒí…ðÓ<ø“>·Õ<[KàWí´V0.¼x·öˆvZìZ;jï—àÛ_ïŠï7ÕÞ<~_Ôüµ¿·fÀï*óU܆ÖÞÅ…n™-ö¨­µÿ4øÙUµèZìE[ÓÀÃß­%~{‹MË}¡õ±zïòsÚ"ø½Í/¯ÝŽúí‹Ðõ8ôtîi§yKŸÔÞ+Ö3~³éüo±CoÏôo³ƒkŸbœÞ³Ð×µ;øâ|ßå9m‹3ÐÎþm÷Ìv_{çE¿mñèÚ¿÷N?Ô¾¿ˆÃÒ¶·Å“lOˆñn‹ËÐþžøÝþÜþøäñl³Ièãy]’µ<[æQÞ<Êš7â.$ä) »Ò„þ§ã|ÛY Æ¡CÐY1ðï_v6R~“À·“Âñ±ú ú.^V\¿kß@gœúòvä£è””«:§|é1ά÷zзóZÔëÎxuȹºìˆº?<»â²u'E»]qU»µ w×|ï²çìnê»8B]ñŒº'üÝ ÁñTð[wåÖñ¾~äOè©îµA§î 1.Ýož¸ù=öô½£|ïÑ_~µ'[ïïg|=ùézg]{ g¯øôR¿or·Þåž}zÏü=÷ªþ<ÑN¿¨ß'OîO ºöO 8û§¾ý{‚ßú§|ýv´×ïø}H;žý‚>}ñbúüúäJýKÿ>=}ÿ„÷þ W_±þºàùa<{Ö™Þ£èøBŒk!xñ¿ìÏý÷žúöÉ{úôt}ûRO„žûV×¹³g>tGWûyo\à3:5ýðWï¹gwÿa¼ŠàÞ9ðë]ðö.Õïßb|úä}ñÏúsżè¯ß4ÞÉ&è\D·4¾ ÿýáyâ}x¯€kX¾Áaëä°xkÃìM‡ûßp6ú–Çt˜]ѰøfûEÃ{=‡‹ÊË6,ßÌðzÑnÿ:ü!o_~½>?¨þ¾Ÿ ùãûòsõGàu~8G9rþ;à^Ös=pÍ¡üÛøâ9ãî¼3L1,oÊðÜÚ“O¥/oIMõäùýpüÊþyø7Úcg4|FÀ;ÜÒýÁ°üÃÎyýWŒçùø½õðÎñ>l¼‡é“‡åWO}x¬r—ê—ŸÏð.éx{ß\ÿ{iogø‰34¼˜ró¢ãà·?„ßï°^}Š_—A?|ÖûŸm½cÿÓcW×ÿõ ¾=vC=ö=yM{ÎÝí‚Î]ö!Ý=Ï.ûßî+ê/¥=ù¡{{›—ó§ó×:|²õô:ó•?`JïjïO*'žDoœ~îñûíð}ßü4ÿz)÷º¤ñ…ä 鿉Ÿ^ö>ÅqGÖ7>ÏXOÙµìt¡¿¯~ø`ãö”ïK£×²ø÷*ôÙÆyd6ûÜ—ÎQyü|¾}ïßæÑXë-ûãþÉø’½pÿhë÷tøÎmÜŽ2/nNÇË:Çžqx¬}ŠýÀð5èò:º¬ŽOŠÆAœËay½†Å¹¦ovïæ;<ÝŽ@×9у=Űuexºõþfx®põ÷4^àq>ûô=ñ±{·§ç3t$WèóÛêÓO÷÷Ñ.ùy_¾ÀþíèÒ÷©æÝ ßÈbðä¯6| ß÷ƒ·|ÃöÓá+£‘ÌçC¿™s<#oDÿ#ìÈF®3OωvGÈ]FÈۇɇGøïðSfd0Ú)ëO>Íúú‘7¾™[¼3Å#)ÛLr‹‘'À÷¨vÅg‘ndRðÙȼà>7Æoäõ^çœñûÌ®÷$à=cÁ ËÌBÔ›Ù·}oäòà»™âÓŒ|ôœI/s†8gÌpÌ´žÍ×aæºúû)¼Ù?ŒLEßqèþ¦õ’\w˜]mŸ¬ÿ˜ur-üã^ßçÇÕwÏ;š¾xÕ=zÍÞUö±ñ—øˆýõÍÇy¬Ÿô&ý­õÇ?­ÿyüwódiüz­ö?²˜ÇýÓ”ïxt=àGÒ_Ê<’¨g¼úì—{‡ÚïÅ/wø˜òw:O<®Ýå´+ŸFÿ2ó÷,Ïý<Å鵜þcþŠo×÷¿û¬÷œ ö ùz§8¼õ»Ÿ['í3ýõÒùíØ;z·Ø[´öEÏ…ÏóQ¿ù©ùøwð~¾÷|Æ÷7ŒÛEà= ƒG~éæãèõ~yL{×y¾ zÂÖOŒ?{•–{Pk-òqvÕ­ÕŒ3ÿ†–{J‹ÝH‹Bkyí¬›êÕÈÏWƒ¿|ïMþ¹Í‡#?“&}{“ž¦ùCôggÐ\ÌzÁN»ÎO·¾»u`ë‚8›uyoëZ¿ÙÑ×åãª[×êßX~IÎn¶±£ïò³×Å嫳#LãÔø;Ôøá×Ò8%ôºÕ#Ù+É~‚\íoôÏ{²C¡?©YêüejÖ£ú~ðäŸQÆzÍ/¨±ªöè-êäëõøÉéjW[W嫱3©óï‹§]ßX}þ¸5òÐÑ8CìÁkoûîÜY;™½Ã\è“æµOíRû ~B5~85yù꫃ÿgÆqÕ´vâšÖä…‹|¨&XíHãD_]Ÿ>âPŽÚ=¥vH‹¢/;Ë:¹U}söükâ4ÕÄë©]ƒ¾K—…ðWjCOQûüüÄjòÈÔä%­Ùjüÿjò‚ÔÎÖ¯üf5ñ½kiÜvÏ5ù/k³zòǨîÅ®î>vEâ+Uì[ùÑ+S£ýŠüaç‘JŽýœü›•Û¢ÿQ;½1wE\ÜŠû_åVõÄÏ­<åwv)•ÅÙ%þ×sûÉÔ>ÑúSzœ¬¼åEñF “Ù¯À^õ€§øïô=èPß¶$@êÿY81~/Leßÿ/öÖcb›qšoܤ|Yà[v¾ªÌ®<{èò-i½Ÿ²óÊh¼ ~„åY˧Æ%7p/|ñ/)W¨øI|/–Þâ†ÑAÞ»âÆñ{a0èUàgR‡·°[Ð-?tÈËÓVØÓø‰ËVÀ¯yß ;ñ1>ùŸhG¾ |šû~6üχ¾º ‰ƒ4$~õ¸ßCÜC§yó'Gn˜³^åä³ÌÑk Îp þ,è=H^8h}äO0ȾdP¾°ÁcÕç_8h]gyнxP¼’Aù—Fó¨‹;“g5Ç>:÷’ö–Pžœ?'>an¢wñBsÎYv±Yù|³âTg/Šv³ìz3òÝ Ð› œð X_gØÏ–‰ßgìpNgg:{¸©âO“—{šûÐ4ùN¿ ú9ýõF‚.§³»*ŽÙé‹}¦Ê«0•}àéâœN›'žÓÙ³OcW9mƒÿi)|Î)Óä÷šÆ¯hºxX3Ž ¸–‹þfìÏúˆò¾Lw¿žÁaƈ§}à¿èÆÎh@¼”ŒûcFþî¬8‡Yrñ¬óm–ÿrvþŠ6®ø;;1ðÌʇ•]#ðɲÏ’eÄ›Íò¿Í:äÄ‘Ïmü“V_œÊì?Êõüî^]6ÚËÐeè•2‡2wG½Ì§úãW—e”'4ç¼”sžË±CÍYßsÎu9q@²ø,+/ivïE¿ÙÍ£½QÿãEౠ=ËO&+.uæ‰è'sGÐ9Ão)ÃNz€b†¼3óÛàï »þÌÉ_¦ýeÄõÎÐ'gø=dö0ÏÄK wø"à/k€?ÀÌæ1îù2çWq²â¦dwŒòYñerò¨ææÁ7ü]³Ï¥Ot|=¾B'þvYözYvÇYvÍÙ¼ñÝ ²ŸË>ëw÷ë?®œ8s9ñOsâåØqåŽçZÆ]ܸû¬œx—ƒ«D¿¹—cœrâÎå¶Ó®¼L9þ¹†ö–ó.oŽßDNžÃÜþàù%þ%wZô›j”oåQÉ¥~Ðè•ûÜúN8(îÈàìiyýˆC;ß§ë>¿®œñÉ9ÏçÄýÈeÁ¿8¸í—9ñ³ò/dï¶Ÿ,èûs¾‹û–•?3ËÏ3+ŸIÖ¹ct^Û‡2üÕ3ö錼½rÅ ?Ê ÿ— ÿ¹t=à•/##ox†Xf5åÅqøyÂoh€ÞaÀ½f`ºu™Ÿìô½ŸiôMSÐqêƒÑîçÔÑ}‡~rª8+SWv¦\ðOþ&ž§ñ{;m|à=…¿Ú”|Ô?žî4þ̧½¨Ü©1nSæŒö§Èó5…ßõÔGƒOç1Ýó4y·§müq:{¦)ôéS¸¦ü[?ÆqŠ|˜SØÉO?ê4ûÉ”¥ÁÃ_ñ4ù&;oO¾Þäv“ŽŒçDñœ&~ã7qý ëñ}&ȧ5Ñ9o";‰è4Þ<Ïbü¡ÁGãù%¯m,yÛX~UcÿíûgÔG®3Á>=A~å‰ûF{Ýû'ÇïãäÇŽcœ{Û¸wc¼Æ/á{Ý»{Êxç½qì‚'¬Ïùâû„c£ñòO÷x¹Âx~‚ãßïØxŸ@ÿ0_íölØ Ms;…I›Æ¸L|=Ú™T‰ú“ퟓÅcœ,žìäùc|&™ç“ØÛO"G˜hÞN$gŸDŸ7‰ÿþ$÷ I;¦p}&^d<å¿ØŽrƒŸ}y‚xïÙN¼V¹‚Žåш'ž¯ýÇ¢¿‰·êç7A—‰jG\Ì ìÝ'Àw‚y1þÍø>ž]çøÅ¢Þ8ùWÆgÜÿt/~äø©ÑïøEc=G0N<ÉqäñcÙé/zyǸ%•s®ÏÎ`œûÚ¸;büÆñëç\=Îùll%êÝ4à<õõ¨7–¾bl+øn,;ÝSá3V\ƒSÉÛOµŸž*ü©³¼§Š+4vcÏ3õïÞ;Ž_Ñ8çîñì˜ÆÑ‹Œ—`Üuð=P=ú¯±üÆŠË6î$x‹c2î ôGe<¹Íxö›ãÅŸÏîi<ûŒ ìò&¸gO°Lÿi¿ÌCòý ì/'± HN7QÞ’‰‡á+y':Màw1Áýl‚ýnÂã࡯˜pGŒã÷ó âCùˆ&X?&ü.ðšÀž|Âñí~7&🜸”~^ï Ö[÷äIêMä¯8i’u@œßIì~'‰×=™^jòŸIO˜ß¯yw?ŸÄßxÒ$õù¯Mb§3iCí‹o9I|†IòÄMº"øir;Æi2¹×dç¾ÉûûNn2ù#OþÓ­£“í“É…'[/'ÿLûÖ¥ÉöáÉâiŸf½=ÍúvÙ)âýO]È>-/ÈÔÏ©öÇ©òÆLÅ·SùWN]2ðœŠ_§+÷{+~œv’çÒöë߸Ÿ~ôš¶‹ýÜøN_ršøÓøÙM7ß§ýNÉýÖ8MçŸ5œtº8Ó^sÞ!ß™¾Tà9ݺ;]œŒéü:§“M7ߦïny$§oôžÆïôtç‹iæûéüåN—_j¿ëéò)LgÚsÑÎtòÆé·ÂgPÿâN?äwÓ_qŽÓïtñ¤¦ó/ŸÎúîûöñiÖíé—Ãóãø}Æ®Áo3Ì÷çãüçgˆ7ã/~w®à9€žâÖ ˆ¿5°ZÖ˜qo6rïtNXع׾3ã?Aï»g¼ý,éiÝ™áÜ3ãðˆ1ãA¯£ÃS1¾3>#· _ào2°Oô7ÀŸ|à tqžœq¨ó:ûõ²ò÷yw_×càwÎùÂïô€c@¼ãq¤ø3 ÜÖG'ù)>"áÿ7Àvà1èœáï6ð¹{‡x‰™5Ü÷WrYÆûõ+ÞKæ@ßùáeÈ¿Ü?ìßò Œø™qÞò˜3ƒ^™ûün¾gÜ×2òôeØuˆÓ5ð˜ñç_: ~Û?È›Œ;ÆvΓݫøõÈ’YÅ“!³…ûûªLË3“æþáÿ›á·’¹ =åßÎ÷Ì9ðw7s¢ßÍ›ŒûBÆþ‘ù]Þ §/8s¸¶Iå&éø·ðëÌü ]èmèÄh›OÎqäÂôäì!Rºówø=>¸=ùU ¸ ð/øRûÏïýPyù¹2K¢ßxmö˜çú ûè =YÆù/ÃŽ>“Ư[F;âteØŒ¶#¾eÆ<Î8×gvÐînʳ»Èl¡ÞÚÊÏ®s(·q˜|éïâ¿eäË/dÀ¾4ðzÝÊEÑY^ÇÑyš¤ïêY§3ô†çØŒ}K¥øZ?ä-Èæw÷ô ×ÌÙæo?Ÿ¢ütâ7•¡?ȈgyÈwñ„3ä7ù2Ÿ*ÿt`Gœ/6Ã/-ó¦uä½t]»¡ÌÚM祼5y’2âXeS²ÌÃCÈOåiÉO^Dß”]š¼P^‚ìRús^ʈ‡–ù£~¿†ç[èôyáÜæÍýà|w6ømâûÏῺ¡½iúᇞ¹Â¸Ü”Âü¼3ÿÔþRô$©Ü‹Ýv†Ý|Æ=>CNš±gž@7zÔ {ƒ 9^†}_FœäŒý)s?x·H÷ ðÑdÄóÌì«ÿñ =c†>8#nwFüÆTN9ÇzÂo9㾕y}é{3ôÍ™gõÏ®/ËÞ'K>šÝˆ¼ðWøaz ÷ó¬¼RÙåñ lôÈ•Å7Ïž­½ß“Ë—”wö rey ³òmfåÈÞ­þKä¥âfääÍJ.,ŽCN<ª¹zî(ò׳•#ÏÎÍ$G¿ ç>˜cÇ‘»Y?ìÕrâÝæNõ~E¬W9ùFå·â‰äÞ¼—Œvé×ð}^Oq/ÅqÕûyωû‘{^¿ÏÑG¦ñ#åkϹgäœÿr‘Ë‘{èÏräF¹Ïb×$·fç<8†þ“|ppqzIy×ÍË=lŽ_bÎ=+·‘~å¯ÉNúÑÜNôLoâvƒÙÏÑqM|ð­qï8Ço"'sî €''OQ® üqÆG|Ü8Òxœôsÿ»vOgv¹ûSz¢½âàšç ¼$ƒûÑÿ²ÃÜÍøýʸ£œü&ƒò< Š÷8(ÏÞàGôÉïGù¡E•ÿ¿ü=žC ]†–úCëú>7>bw0(Îè¸,ƒâ¦q…ÿê;9ܼjƒøgh zuqȇÌû!y†è¡‡är^rϺ(ð’—|ˆüqˆ?áÐSôýìÔóòüåù³äùÉçùŸä'^ùãßg«ÏÞ6>yy>òòDä?‡sJþAíÿ]¿äUxƒ= ÿ÷Âìbzù_OŠvGícä.Òë­cEþ4EùñŠü»Šì”‹¯¾Eç‹âk앜 ŠìÆ‹ÎÉ%öÅ—ƒžEvãEr½â?â÷Òì_iëÀ£´cÀ_··DnTú£ß¿Ð¾vËòÓ”í¯å§bËì´*ôû÷­Š¼z-ê¥ößõšræcýSðž~ö)Y¿ÆöÆ…rãFßÝKé­M¢½–õ®µŠßÃ_>²5.èКãÐjyÞå;¾h}¦çÕ{"èÑz]»—€ãø½-Žq{Ǩ×^Õ÷ƒ.íí¾ö¡_;ãÒ¾Þó¦À·þÛü>ÛôÇmþríkƒOÚüÉÛk€›¹-^Fû@¿§4¿½¶¸ðmú»ö—G²lðo²n”OÖ x“íƒŽÉ ÑOru´“Þ„¿K"erMàЯ%ÏGÉÑ~g#ß¿ÔÏAŸ„¼'ùÖ“Þ¤³¡çéÁ¯ùz;ý¿{žÎýWç"ýÜ–>ƒçÒÎÇÁo+Ô2žÝÙήø_Ý ¢^÷Dþˆâ¼vÉuºÄ8wÙÏtï<º…‡îiO÷)ïÿwKAÇîù~§ßêŠ{Ðî}ïŸ.¹^g·è·³N|Oä!íÌð'ÃÆA^ÑÎÂð·¤3Nó}kãØ z&··ôÃ~º³÷VЧóTôß1/:·Äxvκuƃ—YG|ŠÎ_àÃŽº»eÀÑ•?£;-ƹ ¤1]q»ìš»ÏûNnÔ•O¥û×À£·\Ôïm¡¼yÜ“?ªw{ÀÕ“/0ÑûOà×û*úëÏ|ß§Çíé¯Ç~¶ÿ“ŸþªwÀ«/cŸþ¨‰çEAß>¹ÖðÊÑõß xúäÓýâ9ü“€wxbô7<5è4|HйÿDàÝŸ©^;è<<_еï<Þ§‡æï:,â0Öaùn†Ù wŸá®þ þÞÌwñ†­Ãß?¿ðßÙ;àwm„#wz^xŒÜô)Ü#üÏF&+·~À?²WÀ9B^5œ º/ý Ïrƒá4Ž{Øaçø>;þ>?™a~ÃóÆø÷ŠþûÍà³>;ß¾¸|=zàÞÏð—ûMO¼Ú>ä>ùAÈøÝ©½Á§}quûì_‡O4N‡‚G\Üþ·A¿þËÚÿi”ëñ/ëÛ/ûôµ}ñ_úszäý}qçûiWüí¾ü0ý§µ“ÆG¹Cû¯ã祃¿‡KøëÀgd.üÃn}D\®‘ÍŒ+»ø‘Äø’ ü1è0b]9ÊóÒ໑c¼¯¦ý;‚ŸG6ÁWòhŒÜô˜¹PÀ;“]ÇLú„™øoæ¶Þé§fnªžýlæŒÀsæüAÇ‘A|·0¾Jã­‡ 3žGù^êï¿”ï¹÷÷äÇè½Ï~7çzãð'ôÿ,à–ç`ø@í¿…ù ‹ó4|™ùù™y±ú“óÿÊüßUûî]}÷ƒ>=Q?p¿cþo®#Ö¿LôÛ»Þ:N_Õ;ÀzþŒýð ë=>îò›íÎívö·Ë“ÒùIÀÕ~Ë>'î@²«}åxç{ÕÛÑ»|%þóçžî.ö~ÏkíK÷Ø·È;ì–þÇv³¡;¡Î†AßÎ_Àû‡´_p¼¤½¢}÷t˜è\ѱ¿oo?›'~ïœç)>}çoñ{ç ððèlãÒF?òÙŽ¸ü=à!¿|"Cò„sž8øyC;ÖÓŽ|~y ;â-uù véÍ»Gzö‚]z箼]ögÝUœÈ;âw襺â’tŇë:‡v¯×ά§ Û§o2Ÿè ú‹™Gi\¡5ÒõËz-O/ü|«u•ßhß¹§ÿ¶yñs|¾>O÷»Í'þèýì3‹Ù‡ï°nOׯqè?f^ÎežÎ >~èÃÖ¯¾|¸£ç€ãÁ½XÀ×?¦Ç_¯7`!/è]áù%z€£gïýöÄéèÞk|n3/Ù…téË:ä§q6;ÖÎüÑoò4>‘w1¹Å8óãNœGöQIÝýA\¿ä0ç~ñË:ì<:äh£œßæñ;û—äqç\rè„=vòop±#I~©ß£­ü»:âüuä§êðßM^‰þ÷§¤ež\áIï’ì§ýõÌ'vˆÉ¾àÀÉ~Oàù<Ö‡çé|·9%ìT“e´+ßgò÷5÷ý¶üJmö¬íÛÝ3Kîkþmùt’ëÁ3›{h§•^;Çð¸{ÿMîÅëD?-zæ…Á7Mç³:«úσŸ«ÿ W‡­2¹T÷„ßXõ¬ K™RålòŽ1Aßú¢Ñ^íµ€¿±X|oÐ4~ç=•È—ÝüyÜúà\˜üïæ GƒCƒ=Iƒœ®^&?¢_­‡ûÙš¸+5~еÓÈèéjižèÉuÅ­Y/ªô ÿS|/ŸbßS•G­B^Uýsð[5Í?1t©Í¥=þ`õ9ɳ^%wÚÝ6ð½Nÿ[g'T„ŸúZèœæaàOY¥¯nJ>}@Œc;џµ.îl5è¯ôû?Di\÷†xy£qsî¸öíæŒãÞ'x?‰kŸG¾w™õ›KûÖ€wôûkö7þ±‰8þÉ×öÍgÈËØï$òj&Ú'ØK$_Ø¿ö³o¸ï$<+Ú?Ê~Ð"Ï›hÿË+wœïeò<þ"ÉLò¥KÕ¿C{ò$ÿÒïKà~ξFž”,¢ÝgíËoÛ7å%Jøç&Îωu4yËy[¾ÂäYøòËJ1~äæÉÖöaö¼íOŒÃ™žòæ$¿Ußý?»äjô¤§N.×KÎ?0¾öÉD<ˆDþ´Ñþ^öýyç¶9w¶qÎG8ùP?Ãkç‰ðù}Î â€'‹;gÍ­¿ôs£ßÿŒní]aüå£HØ©%o¹—ˆSšÌM.}—þØm¶ÅnóŸk¯i>:·µrnJç‘qŸpµç³î¼k^‰cÐÿµ%®];£zó¶¼Mí©ÚÛßìüßBñÚ å7ï¯Óž¼Ûí‡õc}mßâýdå&©¿»õB>ösè»>˜_›gGx®ïöFö/ɺæk*¯_Âø­œÒݹ8=¶Ðyú³çj±³iáß–ø-ñCÛüÚ'Ó7È»Óæ‡Ò~Q?ìÛYëæß¹øçàøÐú¶<>O&9¿òÓN2øk*xñqÛý¬ý²ñúD¿¯§çróutÝÖS>È„þ;qÏMÄ¿NþÎ]Áu8¾ÞHyûbÂ$¡ÏOØ $_ ûߴ󊧼¯ û¶äYp¬“·Y'Ä£ëˆ?ÑYÕýecóœ]v‡Zg~ëy\çH÷~•íÝÃÅkêЇvŽ%¯8ƽDü“ÎÚÿõö[óø ëÊTòvöŒzGƒ—^¯CŸÑ™®ßåá±ï«£«ørù|_\ùá%/LG܈ÎêèõwãÆo1!/O7.âW%/ÑC°ßè8ßw~äÞ¹´~–òžæO¹Ñ|š†žì°;‹ßóñçaÆu|Çî*aG—È_ÒþÂzð±ñ_Á:ñ6¾þ“õŽü¯ýµõŽÜ:!Ohª=e[ÞèöÞÎOwèçëLM;ëýÿô‘ë9¯Ìïµ±ûÞÖÎÛ/:W‰ÛÛ‚g+Õ_N±Žˆ£ÛÞ@¿ôómù"ÚCÖ qeÛƒžäE-z¿VÓù½Eëkç¾Ó¬'âÅ·²îÊ+ß>^ëúý(ëèÊàXÀº!Þt[^â¶ø%í[à#oB›_n›}@»€žG«3xžÕ¯¸yíoà÷ˆñ9×x’×µéCÛ⦶oUÎ=­½€~ò¾™úûúÎ΢ýxÄehÿÖ:.~RëeõÅ¡hñiÝoÿ¾\ÅøÿÞôrnó‡k¿Õ <Ïxи?‚žÎ)íkÐÇù ý ºY'Û©|'ݯ¶õ~¾oÛ1¯Ø¹$×*Ï¿"¹[ùë¬[¯Z÷èw;âuÜK“‡´ûµöÈ;ö¹Î,Ö‹µ­GòuÄùí¬žÓ¬ïߪ¿²þÈß;kZ/ÉÑ:âÊtØmŽÊµž´4àÅn+9Øwñf“óõë|‘Ìô½`lú=•Ÿ_ª}ñ‡ù0’×­—ì×;â t¶¯È·Ù¡7él¿m|ßÓº¼­ïü™:ÇÀó§Ú³®tvEq:ìà;#êɯбÃO¡#nDçAOñÊ:ô³È¡¢&×î²êþ*ðéÎðté;/éÿEû!½[ǾÒ]Ö>!.Uç*t¹\wƒçõ.tþ¾Nûצïêñwé<ž7ë÷ô›¤¿“Áµ/z°wîð/ûôŽ"{ûWöË¥àû.8V`ïE;j)Îj«aüÜë[· Çíúç?ß:ÁïÓÑeUí¿ùÂßü@¹=Ðëx¬}và­CÀµ¾’­ùaУÉÏ­µqàÙdoÛZKû‡á³áMþÚ:Q½Ýà!¾gS¼Œækú[Œ<òòÅùåÈ-7÷¼ÌóhrÍÓ´7žÜ²Kž¹£óZ*'ÝSù|ŽÔ?¾lî|Ü'3•›6 º57Ñî;ÞÝcš÷hï%õÐnÝó*ãðwðɯݔ‡¹¹Žvfaÿy­§|Lõ)äÚüzëòãÖÙ“ŽæI^Œœy_rg~õ—£¿ú3ì@É+jük›’Û‹»T½„\^\š¼æõM´ÃŸ¯Æ&?[gR?\äü£y¢ùÃÖÙñ¦ù¢«÷шw[ù}ÀUáçVæTÇ¿2oÐuÔ}b*§<ªôLµé+þô¨ËŸPÛ‰þâô9ŽžÀ=«ö}†ñ«ot©“ÓÖ6>ÎM¢»ùÕ8Óú¼#ýykCÞÐæ†žüÿ›³°ÏvÿÍÃk¿h¬ôlˆЯ¦±?;Ý?ûýxý\L¯ Zý°Á?¦Îް1}Ï+ÆÞtT/"{ýG]äúFÚϺÎdÔ.þÊà›ú?ÑK\‹:ûÞúþô/âkÖ¤wù‚=3þÍ»,~GãEóNÅfÇs½ˆø¬Í ̯ÍÍ÷9é%–g&=ÍÃÆiet-¡ÿþʉÚ\Üþ{{eþ” ñÖìÛâŒ6Vó}óE^ƒº8õKð¼´1øé\ð¬dÜ7 :6ÖÖÿ1ølC|%ÎEݽ¹±»ïK(//H:î ~Ù ~FYÏ6³>…~zßÇùãRûë²ö‰£­ã¿´ß¸o¶N³? Øä?j‘·È÷ZûÚöô]Üñ=f‹½Ë¨§a_gŸa·ÛºHyëOË}´Å¿¡µŸýõ'ö©’òò ¶2ú?Šže+ïÛÙw…7;ÂÖ)üöÑü¾«z[k_åwǯáó;ô8VÛ¡ßÞêÑ»4ÓüÏäbMçæWö'ñÉšŸâÏÒúö“/í3ø­µ<|ù‹µØãµ–ô¾¸'}D“ÿwó^ýžE¿x¾~ÙE5¯4¿^Öï'öÙ÷à÷ã¼~ÙÄqi¹÷´Öćâ¬4¿t¾ÚPùtüƤçtO¢Åÿ¹µ#zŸ¬|V?(/^K¾·ÖùÎýò·µ×u¾¥n£Wûèó¹s1{‡¶óA{Cçà#É Žsþ“_¾}‘ó/¿Ûö?È)è¯ÚìÛòd¶už~Ï=á_Î…o¸w°{Iì/‰|™ÉO|—læ^‚> ÿÁDœý„½e"¾_2Å÷œ{rËý:ëþc]O–Óï ʱ3MÄ÷N~ ¿…S¹<>$§˜ÓýÿèhÞåÙÝ3Ä»ißæ)ÿOû(¿³oÿÝ72.k¯_£¯u­}8¦“¯Œ÷]<ÝÑ<Ý©ÝHÏ{ª'½ ¼ç†6{Óö Ê}‹ŽË ãîè–ÚѸ'$ÓПsbÿHN4n«£KjÃï'y}åÛJþê Ðû·úß}ÝþÉÆ~OóVóËmÿ¼âí·Å-J–3þÛ€“ýH›¿@Â-Ù+Õ Gù£’ô3A{òÈ&òˆ%›‚3Õ'¦ü)ð9Q¹ ú‰ëœ\æ)>BrŸù fòˆï=üú{ø—õ7Éïî­É$ð_ŸIèÍî>é*ÏŸ.¹EÿoÆótã*Db]HRûÃeôÇî,a—“l§_ò dyý ¯_Ãÿÿ£ë¾ã,)ª¿ñ“$H$ç DÉQ@‚ "J AÉ9î.³3sïí›»oß;qwfWA@@@D²|‘ Š¢d ‚ä,Q‚ü~_ê]ý¼žáõüU¯î®pêÔ©êªSç|?‘ΣŸŒuâò>ê}N>j=š¦œû¼Œ¿Hv¥uò:ÿµ[­¯#ò]f}=?žw­¯¿·žßi=}Óó/ýÏ^R߬›þ'™óRv“zï‰÷‘Þßh]ŽçöÃÔ/VqŽdw“m']Àê9ÿŸ·ÔOŸ‰ÿ“ñ‡Î–÷_°~Ѻ,M÷;?Býâ×äKé »Uö ù ògxf_—ÿP;ç ®]ÎÎ*÷.?E»ôg9œÖ|ë{ü?ò«Í"ïio±¸_Pþ íý ×kw¶ïpzóqÿ çý|ß.B÷ ñþG=pþò{ý‡^uo;¿û ÿ£.{ÙîÖú'Ž|wwùØ“w—ïPõˆçÛ=Ž>ÿ8zûcéñOtÿ!^Uwo÷»¸€WÕ]Ð}Èôüô¯]öáùÉÝûî;躋‘7ëXwq÷ «jout®§ÿü׺º§øú¾Þšü—²/ˆ÷+Æ¥;Á ÑÎYøq¦þÃ}íŠoÚ[3ð·‡?½züî{ò/pßÑ;Þsèo>´'þ^ïqõ<àžÇ}EHîeN}A¯‰vœ=x˜E|ëÕ£Ÿ‚úá´öæõݼ鹯î}+ð±Ç?²73ð©w­þ^ÃÁýcO\ôÞ#¡_Cî+†Öæ?ã\+ä†35ô4ÿUÃ8 =èú£v›Ú¹0ôg.ÊÐuê¿Eûëy?nx-þ+£Ëº9ìüýç†î ýÞ.<Ë÷/‡ñ¶ïžèæG?üCùøIÓ·_¯?⌻ÿþ•zþø3Âedí¾ÄãåàV ÿ7–ã5L?=<¢?î·‡?Òþ›a܆íÆoQžË0}ú°ûÖax*ÃW(—g.ðð/‚œ ;¿ §èTßIü¿à ÃÑ~P9þz#ó¾ìø:b™Ÿá‹ç6"NO‡Ö=ö¼—áßkß½ô0œŠa~3Ã[àÓräúcãr€ü›?þ¹ÃÛø¾‡zém†Ù± ³Ãv¿| ¹ø½ñ¿lø7ê»Âø] <ýÁð1ø$~âÈÚøç3b¾G?ßöM#ëÊ¿šqb5âÞ|ÄýîHôãŒqÛ_Ç/~?#ÆöÔ»«çÍ]#p:G6Rïr¡#;Ë'žõÈ^Ú;,ŒëÈ~A~GÆä»Ä÷›ƒüޏih—ŸÜH[;GJÛê‰þ‡ìYFGÇÉÊÛ‡Œˆo8²•þÞe¾Ðw ó›^˜¼ýMzs¿!ûðᕃü ýÿÄ“æ_?ôùá÷?¼´rôgCÏ’牡¶õö0ŽC윇àó ñs^ÀºúºzÉÃðÈÑWÍ ~ÈÃßÕ¯Ãй“ñ=Ôüê‘‹Ïà7=ÿð‡Ê?®|Lãü~Yû¯àûç|ÿy…£;òyÏOºF¶ÒŽ{…‘MŒË\r1*½”<ßú?ú¹otÞPß(<¡ö:£â6ЧŽü3´3Ê/~tùð~tõPnÔþlÔþyô{¡£öµ£›¾Ž®ú9z¬öáŒ~æßØçCù18½cì@ÇŽ |;(ða Žå< 1÷Çc? õޱû¹rðÆà¤Ž±û»N¹;”ƒ{>æü?¾ªôóÊ?#?ü›ñ¯ºÇé5ÇáŒoêß"ôc| ùñgœþoü'Žñ³•ë9g·9N8.NÚø)¡ÿã»{?#Ô;Æþxìå0Îã‹„qG}ìå0ÎcpÏÆ^ ã8Æî̼{E½ì”Çù¹Œ‹³8ÎÏz|ÿ0nãgë7ÿÂñûfÍú9‹½òø;¡Ü,vZãÖíñ÷õçN|mÞ×øBÚq</ì%ã/^å¸{†1ÿ×ñeÑÃ_rŒþaÜ~jœÿÕ8?ðYôų5.ìçÆ|@½¯yf;kµð~–8eãpîfmÚµ$úà¦Oâ¼âñ›Ãó,vü³v tÍ:"Ô7kÇPnÖa¼f(…ï5 žÃ,qQfñïµO Ö6úw±vž|ží>r6¹š}f(7»Æe6{ãÙî]gïÊÏ~ÍûÇÔcÂ}ÊÄ×C'6 |˜p?á7ûÀç ø>íð~bŽúèfϯ½½ç‡?›]Þlóröd¨g6¼¼Ùî³g¨z‚=ã¤{¶Éo¹Ÿd9¹qhoâ½0>“›:&ÅŸô¿Ÿ¼[=ãž›òÏ å'–òS™ü0ðk’ÿøäCž9üÜ'ÿ ñ&@_/ä›ÜVýÛÉÏng’LŸtß< ÿrò°ÀÉSƒœOº¿žä÷2yOŸIq¾'á#N<äxâ-òÅŸx’ßàD¦þEÃxLnë…õnâ9ã÷ˆñ‘b?ã¼¹”ÞqöǾ_F~Ý£LŠS9¹!¾ð×›„ç5ù-í³{˜¼Ö³8å“âZMÒ?Cö¿|˜ú7¹¹v^§ó=ÿÏÕÎŽa<&J¡üÄ\|i¹œ\_¿ïÓ~'‡q›àÿ=)>÷;¡Ùâ–O°ãšøz kÿæÉŒ/û°ÉçÃøÎYãÅÇÎs6ûÇ'ôÎùúŠŸÐ?g ´3ç¡sš¡½9£ÊÝÒ¹ t?áóœ÷. í½ãûM»~Òß9—†~Í9ãÙ §üáæ°›óL§¹ôsÞ ý˜s3úùùÌÝzãOø8ç?çˆÛ<çñ#>éßœ{Nô=+¿{è¹Û}æ“qœ»]È7wqóåí×CyçÍ9÷ ›ÞλúCÿ3Ç=Éœ¿õ‰<Î]'”Ÿ»ÄMŸðsîFK†ö¾ø1wù0Þsô~{å¶ùD½ó\ñQæþÒó=Û~ÒîÜ$ôsîÅa<æö…ñ›{t—¹Ç}7ô¯ëñ~F×¹joÅÀŸ¹G¨ï<õ_pì'ý™ÛD÷éòÁ]™óðU÷þÍy+ðcîÚèÝ"ÈÏÜ3”KÂ8ήýäÛ-Œó\÷osÏ ò0×}ËÜÆ=A~êÆåš0þsÀ¿ƒ\ÎõšóJÇ9׆þ͹7Ð1Çþîª}¡ùÑ}màÏœ8Ü;Ϲ=ŒÃœ+>1$ÙyΩæ+;ÇIñ)&.7ïŒÓÄ5Öó‹üGà·Ì~Þ3\è ö¼=ë<Ö zñ ÷Åú;y¦z?ò}õü0Ô3›ýõœýÙs•?Äú¶Žúwöÿe÷4Qöãg5û1ùÿ¦¿â7L²£œ„9gáÀ÷ɧ­Ãô'ÿµ—­/×á¿’‰¾ýHÿF'{äÉ ÿúô‰}oè¿x[ÎWãûѱ¢~ÝŠž[­cpç'o±n_cݽÉxŠ?> wjòùÖ±^¾蚸Ç:y¾ÿ%=Þä¸y±™uþÿcŒßaÞÛ¿M²ûšœå?|ªôåPnÎZäw}ëϬ3ÖÇ“Éí6ažÎ¡ÿ˜sœüsÃüŸ3êù÷aÏ9!Ìï9?ôþ‡¡ÜæÍâÖ÷Í­gGy>×:}ºò5ëáùÚ=wí içóçô}Ûz¾„ÿÈÊú±„q¿Oÿé9'Ïóìü4ñ9e>±y^×~ïw!߬ÿ¾Îžn^Ð_Ìâ?>‹Á,ñYg¯Oîç |Ÿ eÖjÎc³~ç<çlœŸÀ,÷³6:¯Î‚£6{9ç¤Yè¸ß~Ö½Ýì9æóü?³o3?á&ÏþÀ<ØÝ>iGóà?äµc~ž<ß¼­š¯ô…“ú;i^N²G€7ñŒyögûñ5&žR~!ò¾®òki/ÖÏp´'.³üýŒ}Êägз¢ïw˜_p*'®4Îß1î«&ÞV/|ÒÙ íÎþºõî7¡¸ÞκÀ¸Ö¥î‘gÿXºŽsà¯‹ÇØ¥Œþ½ËŽÎÙôeヾ_IÃ}L¶?å+A>špÜ[kùþµÐŸöwÙaºG*pxŵl³‡n_¾·T»ïVÙó¬@wkÛÀ‡æd§&¼÷&?âæÙï'C¿›s¤ÝPOóñÀ׿÷Ã84Ì>ö`vÔ[†ïëym°køo6Øù6ORß¡¿MöíÍ öÑO>5¯ õ4O ãÒO«ù5ívÍÛô{·ÀÏÖÒ¡Ý&<âæ$zÅ•mDûëµCùÆøB_ÔdÒ„·Ób_Ô'º•Ov»-öM-8ž-øå-¸¨-û°¼­¶yÔ²?oY÷[ðƒ[•0ß[âe¶— ülÓøÝ—x¾W}â4´þúß§©-Î|³5:nd|uè>V›}@[\™6=C{:ùü/;gx¡í×”^½pãÛ¿R?}Cût¸ïoßÅ>”Þ1uߚ±lÿÛü`W’®Æ^\<žöOÍ“Ûâ{ùØ×´Ùå·ÅÑkómÿÂóèpoÓ†¿ÑrׂÖÊŒ¼îÖcžßÐo8mû”¶u5uO˜Ä.uïP_z`(ŸÈÎf¯0¾énì[WÃq‰ÛpáÛ÷zæ'Ø>߸8g´ßóü,:ÑqeÚüÚRx1éQžá~¥öñ鑸ÈÎ1ý¡ô4åÆ\Û”V*Žb*žiúcùGØ'EÜö1åÙ¦?“ß~jLíÒ=É[ô#Z}+H—Qÿªú±iàOº–çuÈéì”B÷¢Q®¼ç§Ÿ®¢ýFÊß-ý²tïáé8Gg©ž7õ¿M3ôÍ•ÂgH+Ú…ß™ò«J‡Ð?"ç)uÎHkì¿fI¯Æ—Ûññ&í^o<øµ¤¯ª.tzŸñ€WœÍògÛ±KÚ’“óBöev]±{Ú‡]ÔQò±ˆ~àÙLÏpú3þ¢Y?»+¸íÜñìBöcÑ«ä8sŸ˜Y'³ˆÏ#~qŸ9ƒŸ} _T¿¸¸ÙZÚþ]ü3¸û…ý?;¹4âR½‡¡§Æ%;‹=Øžw4Žü7Ó²òìhÒ¯_¸O){¥TÜ£trq„qÙ ôÉ醾t%r o"=I9¸@é™òŸ@Î"Gâì¦?EWI¹L~þó©8©}|z‰gvž©8´©8c)ýN:Wù~å*ú;MÿvÕŸ]Éß~ÚÝÁw~Ýí'ýw>ø=뙸£íÄ:W±.ú·^ô?õ¿iýÎÿýbóZûñ¨›GÙD|µCí+àa5=MøCMñ¾[_´y×þã‡ö%ðLb¾¦8­eíÏ6÷_ùzùYµN´xTý#Êmmß㾼夵µýÔ½ö1p ÿ;v¤­uÕG>ÛçHáê´ù«µ%öÿé¶äè«Þïf\#®Û^äÀþ u/œþÀxÛç¦_t¤ö·éJþS§Ùgðck¿.ÿ‚æÏÒäàMûzÇ6»’ÿ3îþkKù¯bù¤ÿ´¸c­Õ½Í-ÓARø- ñ›Ÿo5ûÉíÈ üª&ýhó<ùW²OvÙØ×¾w»ÐϽv.TøÁþ³ãqÌ 7«…´ñNèOãŒPÃúÐpßÞøN §1Ê7ìkãþ»)>R®UCœÞƽžùÉ7 tÕÅY©‹R/ô³Î.ªþbøŸÔí'ê=ýÒÿú¿õéð½ñôñ[lì¥þŸõ®öžT¾_½/…~Ô#ßvù·Õà{WÉWM\ö»àêáAΪ ã^Ϫ*.V¯§Â~¾úYåà¤Õœ£kðäê§…úëÛ¢ß:Yÿ6>=ò×øÅß³þã0õÙø·­±nä›þã[ý/¡¾Æ—ñAœ“†8¢Íÿ¼êe÷]ç÷^CGÍz_ã'RcwVc__s¿]{)Œ͹§îž½.>^íýù¾öàÚ×߯v ÷u~2õðÇ}s]üîúñèyN»ðŠkâ¦Ôį©ÙÿÖØ×E7}Bí$rÀï³&Tm¡POUüܪx9U~Õ×U~«µØO¸—5v&õ5¼W²&žomAòÂþ¾ÚãTåÿVƒƒZ;LþùÐ;Ÿ|î#«…üUþæÕËBÿª·Å~©GœØÚáêqoZc7XƒsT§·v¸÷“øK}'w|jìg¯±­ub~òô˜öoõvߨ(ô»±¿õíŸQ`½µohòWjŠÛ׬Z¯ÏòìÜZĺÏúx¯õ–¿CóÃøŸõߟëá~º¹«õßù¾ ç·¹Žÿ;ë&ÜÛ&ÿµæ¨|ìšµ/€³Úr¯ÝÚF½ÏÒ[ˆ÷Ö|=ây5[臮y³ýÇè}@~~GÍK¤ÖÙæŸo—t~ý‚üÐ9¿6ïÇ×§ÕÏî¾É?ú×7ás´œË›ÎÛM¸FM¸åÍ•­o윷J×·èwf¨¿Ž®ÚSäür÷žÿ‘¸uz 9®ÕÍO÷€5þµ/þÖþmÝZÁpQrx ùÎ/¼þkòw¼ÿí^ò¯ÿGæÛ)ä¾P¾úh £úY뎸 ýKù•@WÙ»|Qrü/]ø”Àµ®ÚgTç¨ïë¹ªŠ‘<¥Ÿpjìêk„ïuû·:\åú¾æ/>×Å «[_ëôŒµ'¬ç+è7û¬úêþ+îµë[[§B·u·¿¯êÜšÜø¼+—¡Ê.± Ï«ÿ[ûàëuÖOxèÕ•C½É‹þëöëq„’-•±PGò9|ÿª*®`B¯›ðç«îçÿ ºt /qÞIØO&«êÇ&Þ³ëKÄ£®þI;'†|ÕMÂø'ðÁ“ºñ†3œ¬ÿâƒT­ÿÕùCÿqÿ’+ÐkÿŸ8Ÿ$pc’Ã8Vá$ô3É·}ßðç¢|&âiW70p°÷\É{Æw/û¬ÝÑkW·Õ®}KU¼Îaò¨~ó³LÎó;±_N– ôUè‹ò–ЃWÄ®ð¹ÀÁ B?Å„ ;¯±´lÈW:Óû÷øò´ž Þè\/ðkÀù{àÚ?ÆO¼RvQïpàOùËÆï|ãpnƒòAa¼Ë%|ú6¾Ïgü§JìCK5ã þt¹¬Þ—û?•B}•ÃsYüá2ü¹²ÿPÅ9¶²2:ùÇWÜVÄc¬¸Ï,û?WìçËö8ù•ŵDh¯2HžÝ›”Ÿó§LÏQþ•zÿúY7«|/¹û Èiù÷ú·h÷²¸lû¤J;ð£bSq¿S‰ý°Ž|Ãú³´õ>AåŽÐ~âž+¡K¾lÝ9L?Å¡IÄIJÜCUíc«öSUû鄟t2&?=gò‘uü³è³X¬§ÈŸYÄkH‘ï¯è¸V;ü;ªôõÕãzgÝo>ù­÷ð±x^ ?úäyçɽôƒßFõ;ÖE~‹Ux Uúîê úùx˜Éãúÿ—âO$—k÷×úçž"‘<ì¿ר ¦ê¾'ǯºŠÿ‹szuÅ0> \ï„>&¡GIFÐï<“c¶ºýÊéögÇ8Ï*ÿjøG/^½XØ WÙe&îƒçä|òÉ?.ù•q…Ç–<†ìr’ü÷¿?ÖÉ*ÿ¶ª{¢ê䕟Zu'Ïä úmÿ·É ©Dܰä^ãty±ïIþ,½ßâ·~Š}î_Ôóh »Î¯®.žH?â²6p\wÎ¥ŸnÀ-©Ãn,ú9ÿï†ø³™Þÿ†^ò2ç¤_xvÞnˆKß8’¾[CòÆBúë\×XßøÝÖÙÝ×íëôÅ‹´óšó;¿ÂÆCê…ÇÛ˜é}•Þà–ð½.V}<êBÿêðÈêpÞêôçõ­­§“'çš}@Ý<¬[7ê[è×ÚYÊù#‹ã„Ÿ«Ï¿i×¹»±…óåÇèsÿÓø~ÞE°}ÁRøK?иR~ñ£šðr›uå¶rÞ¸nªÎXóçûKé ÚÎ×—†zô«Mq䦱¹–q†Ð\B;;‘“¨/pÞø‡ó®xÉMñið›âK6.Ò¾¸¬EýŸ¡g€£ÓxGä»Üù]âÆùSÚ½_ïVþ ùÙc4Rßé}¬ ÷l ¸GuöCõ·´+~}ýaï/1?µ_ÿˆüð7¯ÿJ:ìüú{õö‘+x‚5öÞõ÷ñ9ÎÇ5Íëaݾ¾Á_¬!¾QÃø7ÐO8h ñí¢~£Án²Î/©ÎO´Î.¦nŸ_·¾×ùÑ×£~Â=~ýZDý!í³Ï¬[Wë ç»è¡'i8'5ÄïnÜmÜ~m¼øW6ü‡ü+ï+÷`”Gr½’üÑÞ‡^¤ñú¥ÅÈýNôaðe›3è×v‘oSòI/Û„3פ§iÐ×7ÅvLÍcã}ú/ÕŸ9s?Ýø‘ñ<Û3\þ¨_j,(g­±´úäk¬I¿bßUg÷Y”w/ÖXX?à`5"]ô|çñÉ}nãòvŠz.7œë?q‡ùßïQæÞ¯ˆOÓåâ}Ž~õ¬wü}Šÿ¢¸õ1òµ¼÷eåãú —ª^!wâÓÕ¯QþßÙcÖß5¿ã|XÎ|Þ1ʧÔ=\ƒC£eœìâ¯4.×oxÛèzE߯ÃÛÓeä~®ö~ŒoŸô˜â5̳»„ýLãpïOÕ;©†øcžúÙ6øé6ŽU?{ˆ†ûÙÆwä‹ÿmûÞ¿’Æéøw†|ðYì•ÃèsþlÄùòz^v7§Ìszò{¹=[ã úõ¯)ïË÷¶þo.?÷†sg#Ó¿_ùn¿Ù¤‡lüA¿Ýç4Î'ÿÖ‹ÆãÒ¨—¶¸G§§nü+þÇÐû'ëüͦõ¬y„òGøßíá=}góþÃô‚­5ýÇgӇßm­M¯ ׯu` »õïO–W÷ôÓéñÅ%lÝçžÛýr[<‡¶ùÓ>š¼ëûøö:î±íKÛÎE\½sÚÆ¿-ÞTaµ­ûwqÓc¿ {þâé@àw*>J ;=™=GýFCùQõ»‡KúŸÎVo#Ú‡i÷ô@gz¼ôBõ°oLgjï$õ¹_L ?±1ïÅ{JíƒSø)|Ö”½eijNoUÏEìKþ ß‹ì€ÄÛÉ–g׳|àKÆ £oËØ}gû°'ú{ŸƒC¿2öm}ZÖú•ÝøSÄOëÉ/n`–z2úäl{¨¶úìË28‰™ûÙl@ù“C?3ú«Ì¾2Û‘<ƒlQ|y?^Aÿ"ì¬øeë£cù?[MÊ~#;½gk.av±öØ÷e¿ö|©ïp¢2÷GÙ츜C²û¤ö…^¼ûìmÏ/‡rµ=ó Ão©ãÞ½óCÏpÉ;gÈ7æSç<ïápvöÔî‘Òw=E¸›Õ7ú݉¸î÷ûþ¢üôýΗ ôæë…öŠøjü' Ü©}9{ýîO¾{èOÞ |Í݃懾äÛ†þä_’þ4Œk_5è+â–¥¾vèg¾Gœýinß•»ÈÅiÎëaÜò±À‡üyK}1¾Î9蟎Þï©~FÎÎ2ÿjç|ôÅïŸ3>ôzùõy~˜vÙÉæÛ(S‹û’S¿ýoóõµï\‘Ã]ÏÅÎù æ·x†c“W½ï—žï;\¡üXýœ¡>ðû·¥ýúq½gqÆrq6rv’ù´8.ê;F{ð¬rxǹu:‡{•»ÏÅÎ+¾Wôãõk~pn}Ì/1îâªç¿ÑõüEí¿Úénêïè/â_møÛ…?Ô§³ûåÐNw§PWòîúʉšhþð·èΣxÏ9¼ƒî"è|A{ó†ñé:_tôvýóçôÿvÏÏêW”ßÛÉÍø@o™ßMNØóåW’þƒùoñéAt(/gÞ/uÎÏÿj¼ì—rq{sþö9ü²ü·ÚÙÏ|ÚOÅóíð#È— ýê¸'Ïw3¾{ªÎIΟ5_T?v0ž‹š»Y?ßEïŠÖ;~aë^Yûüœ:ì#:z†ÇÙ¹+Ð×ùXû+èÜÉŽû£ÎkÆ.N~„ñ¯ËÐÇ_§Ï§î.ýŸ»ËÏ1L¹_’ï'úzü|XþUÂs—}@wØû9µv¿GÎØ³uí{º§ïM|?Aºyq‰Äï~ϼø‘zè»ÏÛÇäû“z¯3nRï¯]þÓ]¸]þ,Ý'ô‡QoÀßî;úå¿Ú}ýÏJï rÔ½}ô¨Ý³µsùõ;ùëÚqåìsº³ÕÿŽômó[ÜÔ®û“îS¡¾ÞZ¾ÞÚ¡ýÿ½îÇ!_O<œäüý˜¯·¦÷ð¸{ûþõv |èÑöàõôØAõÈ{Ï~¬ç~¡À«»2ð¡wzè•z¿Ò>¿Ö\½žx½¤¯„þ-¾ñçêý=ð¯Ç®×£w„vø‰öNðž~·w(úáuöNÄ—³B;½ý•_Å8¾C.ÁëE÷ü?Í8Ï0.Gâ;{ÊîoçeÞßf=ý·ô|fgßÛ=û9ëmä§·þ~Q¿ԭн‚q^ _Ùñ÷~n|ÄIêý ÿ~n\~ìò‡æ 凨õ ‰¯<Ä>hh¯PÏЙ¡ý!~$CŸó~ÏÐöÞ/êúBàÿÐÆR8TC{†þ Y†à6±OçnˆÏxBCÖë¡Å<Mºúá,­Æaˆ>­÷89¸ßç™=w—>©Ëî³{9¸ÜxŸÖ¿Þ"ääKêu®í}Ó¸‰ÕŸ¢Ë.¦ûy]ßá‚óì§¡¿½ ãȯw :ù;õÄ]éýˆ¼üÈø.¤ñS{“8s=ñ¶zðæzô6½ªúùsõFÑu¹‚û7´n(?´ñ`/2ô¥ÐÞÐ>òmêûŠä$>/è:”°3ÚÔ{¸IC‹÷ùõ߆اö^òþCüïÕ;_ïÄ?ó¯Gÿֻɸ;ïöèÃzô߽˽¯­—¬·†y³‰üô½âwüƒÚ›Ä×~óóGòâ9®¿ô˽yÉ\¦îûÚÛB}öÛ½äÿ::Äï±Gííl¼w0~ί½Õ#®M÷eí|,uïߥ/èÙöÁ·yí3Ùyvïöÿ:‘\Óëu¿oÝû¥ÿä€yG¸»¿öá´wß0?~éýUùÜwu¿èûšö]ì|ó?Û—³GΟCÿrÚß}_DÇÎò½kŸ5‡#Ó]×þ[÷‡èþ’þîŒ^8HùÓþþ«]z¦îáÚå/×]X¿–Ó÷û]ú™®õ¯KßÞ²Ë?·» >ðîî£Þƒ´·‡ÿËöóîùºÎÅ]zþîéÚµ 7¤ËN®»¸ýª8EüqñxŠø”ì–óïÚ·G\äˆûožçkÛ÷èýVöçâz„×ìs¯²>KZvž…Ó‘]1î*ëNÓ>øVûøxuï”?€® ]÷ÆsyÛÚ¸‰_“ÃÓËá¦v7·_†o—»OêÂ)ÌßÖÞëêçW—ûÏäÇ(¿—ý4{ÿ|ûöÉ#¼ÐŽhç ür/×¹}‘÷ŠÝåGîtž1Î9{Ëß¡ógçûè6Ä·Mé‡þŠïËÒO}Dïô;ú+þö?‹ì çûì#õLÐSÝJ/‡)›¤oë£ßºSù'>cŸ4s—½¤\¤ãz²çÂ÷Î÷Ô7¦3äÜu¸÷+Ó×½)@ÿeèv?…¾r›ð=}Az=,{ðôt~–~îh|´d‡©Nv°vÝGfÏãÓUÊÇø —ùõÐä3å·žÂ9O— ünÛo¤ËÓo³Kw‘Nzê@WÊÎ1e·”­ ½µéóÆkAýƒ ]Ä‹ú :7¤/e‡•>©¿pX³õÕÃÿ+¾¢»áì2ã|¾ïÇãÓ–øé¾1£_Êþj|b_öTÈ«8FÙ蟤·zfqç³­ÔóM){ºlí¬2E/¼½ùw8cÇ› ‘£Ë|o¡ã'úõ>þ‰SÜÙÝâ³dpI:Ÿ¡_O¤#þI‡Y‡ÝBgIëÅBê…››ÅxÛ+y~Æ<ãgÝçÞo¶Ã^·ˆçüëÖºÖ¹ïÓÿÔý/Ø/äÐgøŸæÛx¿¾r Y·ÄÏÌW°Îmbþ¼õv^í?¡#ô)×ÓŸîCûôßÿ#_D>xHù2ò¿‡o[G«ÊÅx@7ê×2Ú…{›Ó»uî3Uë£x¥q`:î÷²½¯¾ˆo]ÂgzÛìbïçQß7õNxg.9x-Èag õïâgy÷ôîÓÓÍ_x¬éÉî)Ø•füà ü~Y-x­/†qj±G*â¾áÞŽ½oÛ½^›Þ!ÝÞýÖÖ¡?éVÚ‡[˜~Íý»ç_`QôÎëŽDÛ½gº]¤ßýû®”ßiÚ±þ‰~Ý:¸®|˸co’n¬]ûÈô`å t·ßs_èÞ³Íÿ¶è§8’m÷­){üt;÷d£Æ¥k¯;eŸ›Š#—ÂCŠq"Ûâæ´áˆ·OÓÞ¼êsÏ‘^â>1ú“›ÙÖ—µ¬_1.úþö¥©ù“}Öó“êçwÂM£<½í~ðÿó#} ¿S®i|ÐÛ~'þwŒ»qMsÒä·¯MÅEÉØñ¥ðæ‹xwZGãÿÎkÊ¿6ý@¿.ŽkX××Un-ë¿ù±CI_“Šgš²‹OQ?=\JO’þÍÎRú®ú7ÑÞñþöÅÙŽ‘ϾϧØ?ïcœ¼xϘ-ˆNøœÅ8¼*¥§HéuÒ'ÿ—´ÿÿ™aïÙKep23¸* ìvÿ·Y¿>geÿ˜ý ÿîP{›,÷þÙø¿²ïÚ0ð5Æ•Îøeðâ2ñ: Zïvõì±'Ï~j]ÝÔ:t“õíNÏâø¥'ØWÃNÅ}LÅAO°Î‹Ú~ÁÿùßÖ£•½ßÈ×ýJûBÿ­•­+ûZOOí¶ÅlïæºuèWË}GëOžßQ<œö,tÁz÷mteÝc§“^íHü/ÄJá̤îyR¸©øÓEœÑó”çg•ãÿøSü …ò«H÷ó,þ]*>fº&þÇÿŠu+ågÙ~<¼oÃkkW¤âжùíµ”¿i ~@yóéP®O¹ÅnºÅªí½Øõ7W|lŒ°;ƒoÔX4ŒkcUöˆç²„‡^?äåòEûwv‹MvIMþ¸Íˆ ÷D «þ/ö†p–û«~Ccö€ô“§µ#.`ƒýEó|ö[ó…rÍçC{-q6Z1Žö¼A>Zp%[ìübó¶ÿn›}y›½DÁ÷3í·" <æ6ûÿöñÞ#ÎåÄ«K¿L^w#_ûqÅÓõÈÕªö#îaÛ¿ýio¬¾k”_B½Û£ÍÍkq›S÷ìéêö/î‰Ó-íá}·o6ŸÝ«µØ)µøi´Ü¶Nñ¼U «ù(þÁ½hñWj³ƒiÁ©h>C">J?9£×jnêiüÁ9a£ ¯÷¢dèoãät;vŽâ4 õ7œÓ룿°{øSwßW§G«»Çkð')ðQÜ£4~AþØ6¾Æ©¾Oàc=tÔï í×á³Õ[üf"Ž„u±Ú/e'_uþ‰»Ûÿúá\䍿<^ûfh¯j¬ÖBÿª‡ú’곎&ðì+ãÞ ü˜2;ÝÒAƒüÖJ«†öìÓøq÷ÓCöú3óÞ¾ƒ<õ—Â÷ö§ôÏÝÐþ€õjÀ~séûßÁECûgºJR¸á·„þ ²|÷zý\i½ð\Ú"ŒÛ {õÁgôo,”/ѯ–à镬wƒsà ²3\+Ð?¸¨ç3C¹AþÖƒô<ƒþ³ƒ×ùÎ~´ô%í=ê-³7-‘çrÓ{8evªe÷"¥Ãü+Ã;)»+Á)*í¤o‡r¥o†zKϺË{þ”O ùÊüÌË{~•éµËüÉJGãó Ï¥Ã÷Ò·}¥-CùÁ߇ñ-ñß+-…ÿüyJë¢ë‹Þßä¥ìž¿lP7©Ì.¿l)³'-_ ßgB¿Ëô$¥Èqô{f]ÚVû1îîéKöÃ%øáƒ†u¡T í–N”Âçä>È¿aÞMiu|ÚÔóÙAJìKÏ9/ï€Ïî—KîJö»¥¾À *€ìõÊüÿË’~c•õ]ö¿•cŸ+Ö…„}U²Vh¿rrôç•åù·%ÖÍÄy"™'´Ÿ¸·NØ¥%âýþ´ |LþæOW'¹+ŒO2[¾óC?’£C?“Ù¡?Uqד»µóv 3wš<#µn$ÿÔÞsò½ú“<úŸØ%pZñ-+ÿÔö:•_>UÄ#¬À¯¯|5´Wñÿ¯X¿+·+Û‡‹lŒp6xdÉ÷ôç'úË$aϘ°£OÈi²¼õ9ú¯n¢Uý„ S99ð­²qÝ>ÈKùÙPOe#)вs[ùæPOÙ¹²|”yÍ¿©Ä.¶´ uì©Ð¯A÷‰ƒüþísÉa ¥#­üÙ ~'Ö'fµÎ <žûßýX<Ð׿GèW¿x®ýò °ƒî‡;1ó‹aúØõÁGžÉO»Ÿ¾±ÿÂð¾ŸzÿÊžá_Ì„;Õ÷Ï ¿3á ÍÜ)Ô3“ÊLóz&œš™ìûfò›yo¨g&œ¡™ìgn¯žçúųëçŸß?Í{v§ýpgòs˜ ¿pæ%žáô±/ê»P; ‡zûØaõ½žg’Ÿ>vg}û*Ç¿¢®ñyW…vÏ#3nÏÓù¡Nƒ 1 .Ø úÆÝÀ×:g,äaÆRv 3Ø]M7¦ÛM›蛾D oü[†ü}ü´úv”öþ÷±÷îƒ9sõ0®}ôK3ùïÏôßè£íó¿ïs~룟é; _¬;}×â{ƾφ|çYOÏSî<¸^3î”ï¢@ÿLöÛ3ùÍä76“ýLq†fŠo4ór2œÃ韾÷oÚéÿ‚ú~K.œ;fø3ó¨0þ3ÝãÍÜȸÃcëcÑw{”'õ­JNàÉôµô.dßÍøM_ÑwRÈ7swüz×øL†~ö9?÷Á·ì¡¾´^òyß'îofø:c%r¶cÈ?ý”0_¦Ó?O‡ÿ7]à48ÓþH.á‹M·nϰ›n8ýÓ× ôOó< ~ï4÷‰ÓN–nÚŸö†öÏPžÜLã÷7Ýÿtú¡ÓÞ ü=÷¶ wç^ÆcÜÚéË ³£?ðBÎ}N¹ûBzÎáý9ðbÎa¯p¶u÷œéOçò&ÎÒ4ÿŸéâ¨Lc7íÕПsÝ‹O[<ðñ\xzçÀ•8Çü?Ç~÷|?çö@ÏÙ…rç°7?÷Ù0n犋t.=Ä9÷y:÷»A>Î…›7þhú"žáÏO¸vçúŸgþ\ø%Ó¬ÓØ-N»…¼¬è˜þ¼u‡é´ÃøO³>M§—˜~6ù°þLcú‰äc“@÷4þ‹ÓwÆç7B{ÓøÑO{)ðaš{õéâ¿L Ï3Ä)™áýŒƒCùk>œ·}hçñ¯Îk„~œ÷óPn<ãO˜Îç-dоvÏ›Æ÷<þ¢}p^ûÜCõY—Î_²o^ôƒø}õžŸxßèç÷ÝÇ»Ïÿ²Ï>¡Ï:Øw­vÿúè{ûÞ—~lýçïÝ÷|cŸÐ×Ô>ÜÒ>û‘¾žuJ¿ûf©ïuëÛòÖí~ÿõiþÛë‡~õ×úû–ýŒ8¹ýßµagÑ¿R ¿ÿà0ÎýÇù˜?ð­_|äþýpûøÝ÷Ãëè˹ܼ°ÿ€§0°™váõ_…z™þ/¨_¿gºÏŸ)ÎMÿVúË_bæANûÙýõó÷ì‡ÓÑú_¥7XÀ>‹^eÀ=kÿëoüâè-†C½â‹¸ßøþ³ï˜ÔÏ;í'áÕöÛ²‡dÇ18aÿ ‡~ÝÒà°ó»ðÁ‡}‡ó<8à< ‡²´ú«¾Áºó!;§Aøƒk ëΧì›áz–Öqþ4oKpÜ~ipAûu8iƒ‰ö£~çê¿+—ϼ¼Ã9Z¼ÒéÎË8'¼è¿¬ó­{¥ÒíÎpGKÿ4.pdKî?JîQËîeËKáŸÿV‰_pÉ9­Ì®¤¼‹só)ô^p;ËôåÍèY–—ºo.Óg”­Ëe~ðeûš2¼À²x(åŠúþî·½\ÌÊJ!{jeWçpíUàË–áO•?‡ðPJðäKôùåùõ~[i|Lð÷Pü½È÷Ûñ~gÙ­ìþ³Â>ªò¥ wòZ~9ô§âÜP±NVÜVèI+ð+×8¯ò‡¯¼ç¼íœSá/š°KH · /zîʺ÷¼˜ç­´ç?R~E?®ÆŸûéµ¾â| _¡üyr¬ä¿X"×åˆ'·þDýýr™=iù>|g×Y®â‡q¯ÌƱ_ ²3¾.__uއÃYÙ:ÐQ~‹<Àë¬lC/±'¾|A¿ã<¸€œþË8Ùç”áuW–§÷{‡<  ÷Jò¡\RÏ ê±Ÿ/³ç-;‡•?£y.‹ç\¦LßTþ29w¬ ï¼l})Ãs)»ç*³Ï-³Ï*³ƒ,­8å‹Ñuh'òÝŒúë«8;¥íèùà;býr,-ìýSô˜{o%÷¥9ês®/ÝM_ç^»dU‡© ©¼ºõäH|¥w)óÏ,Ã(·£~VÿRú?øWå6=|ÍŠxÝxmñµ*Γö~•mãü!?Ë‘¿SÉ+?™ ü ;ú \·JÄÉ[HyûúÊ=èqßW›QеœzÖ%ßÎUÅ÷UÉñ2úwþÿC9ãR™Ç:z7þ‰CUq_P9Y?ã: ïºòUôïª>øK~v•'Ñû¨uÎ}\Âÿ8!ç•K¤ä Âιž«Ð»Ò3Uø_UàáWŽ’/®—Îcúß œédaϯê_Ô®ˆ÷É’ô‚{ù¾uȟ̰~ÂùOþ.\ª>tr%}"½I'+Ó’pyýù½ýcèµÏ¯:—'ÑïêxƒÕSƒTퟫ>Uí«ôUrQÝV¿¯Ô\×Äþ êûçÏd.yƒ¯Q¹×ü¬›/Ö¿Šû›Ê;Æ}I¦žÄø±“Nö3γÈ+\”d6ºÄK^ ãV_?¿ªôÂUûö*»Àª¸4UúãªyW¥¨9§Öèýjô5÷º5ú˜šøeuñÛêG¾ÕáÖD»‡ú¸ûé'=ßåÞš}bc!ö«¸¿¾Á}3ýpŒQ·¯«?調 Þ¤p˜#î÷ôZ¨§a\î±sßâ¬7ù³5çaÏA?Ö\†}»«æR¡ß䇟Ùä¯×´[{Wvבß²³†KÕâçÛtïZØ{´ðÉ9¹5“ÝÍ}¡Þ nþÿëûœþ/¨?;³ŸO¡Íž³=ø:·á°µ¯õýâØ/öÀk9N×ýk;¤{㻆ô"üþ™÷ü-R8ßé\vbp‚ÒãÝéîÑ.Î{zŽtotÒ/¦gªîCÚ ýL/×þ½Þ³IÙ­¤/†~f‹…çliþ.ü%³}ß“]kôS:=Œ_6SjŸ™‰K•]®Ü«ÞLœ©ì7žÙ¡d°‡\’b´ÿ·_‹ø<Ù3ü€ÞÒþóèü·v蕳GÑͼó•ÐßËÎÉì,Ïýéä¨ã~¯sIàs' íwºèû…|ì:ׄþvÜ+wîãйK;wó³ˆv«ö¹x“[Õû{å£]íMa\;zÿ'öœþuîãÚù–övñ|\LÃxwüŸ:î;â9v.ôýÁÀ¯\\»Îpîü—û¿æ?tä½@wÞ ôå#ÊÅï—³¯½ ð;ŸèÉá=æô¼ùCê—_©½ôð_ù?~­a}ËoAߣoùƒ¿¹{Ü.;Ǿhî"gØewÖÝ ŒCW|ÜîOB}]x?]öL]89Ý•ØßŠÃ_ì™_oç¯úµ°ç|ï™è^P?Ä©ïüýô¦ùbúµ£ïðŠ:öe~‚ùbÆófòäþ¾s0¹b¿ów.ô>Q_Ç|Ç¥sö2_ÜÓužVîUöÑâÕçôÜyÛ¸:¯åû×]|ß×øNÓoø.9?í|1òm}êXW;âKæðä;Ï’ógñ÷iôóßÌwüÎòÏ+oÿ–o‚Îåµó:—Õ¿Õ{/~vrß±éʉ·26#Ð;&NËØÞÿ6Ð;v‡úo ü_(Ð9Nß6öfÈ7¾°nù¼ö±B?Ç^Ržþ|\Üôñmƒ|Œÿ0Œ×¸}÷ø±¡?ãßôÃ'_8ôc| Ïü‘ÆáŽEþÆsìâ cÎÇc‡vÆî—6ñ÷.üz_úf¿18ÝcÏàÛ½ø#>Θså˜ø¯c{þŒ±;cÇ<öˆ~í¥ÿÇêÇVÒ/àáþqvãßýgo9οu|t¼£pQÆ^Fï\ã¿aìÇè¥o¥7u=zQhoÔýðè®Q÷#Ïxï>ºoèÇ(?Œ‘ýÍÃãßFØ%,ÆoøìPÿ°ÿÈ0|¶aþ#‡‡zG¾ÆodSó÷ÇÖ¹·Âó0|ÏáÇÕ¿|£áYŸ¶ ï‡WžÍðcA‡¯ã8ì<ð‰Øÿïóoå·ºGæ×9ü5Ïü@†Uîõn!èáºg8pÃ5ùá ÿ-Ò)ßëø"^ãÈüÖ£ðcÏüZF–Æ/öp#Û'øA£kgÿ¹ÑÏYáŘ#ö¡#ÇYßö6žÏ„ñù“qàŸ3b¿;"ÞÁÜØ‘}¬—«‡ù0|C kø† ÿÃmïÆiø ãâcxãÐÏ¡_ù¿Ñ{ =†? «gKé¨ÿ•ñ9Uÿ­ÇÃÏãóOÃo—|wß9ì¼5Lo7|*9ëj‡ŸÍðyäã+ž×ÑŸuÈÑjä`Ëðý8ãÿý;ÏÍí‰Û<´¡}Œsf¯êé±ë¾ä£[²Ç™‹óÐ_ sývϹ!âjºçèÜkÿÌO¬ñ/wp¾¼Ö~píÐßî¶Î‰ðgòìCù÷æÖ³.ûî ö·ö¯î­»%ûäž}ò„vàkt/öþ.ûÖx¾Â¾yÔ~õ@õºgïŠkßýºrìPs¸†ù¸þE¿ÜIÏîÿó?:G¬å\°‡göY¹{Ûülåjžÿâ<ðO|ø»óÀ¾èÞŸŽ ß»p”»ÿã{%Œ{W¼òü6ç³›µë4‡_™?®?îñºpQòÿñY»â3äïàûÆÎôœ]ûâîÙÆé:ç qÛºüóâù Ç~¡û:zÖ/zÍ®ûÖÞ öãÛ;<©¿ñ,nh—=Hî_÷bç~¼ÝÿØG³ãìmä\±¾ýôæöõö)½Ãµq­ž1_.pîš‹þÎ]þÔ½Eõ÷urIßÑŽ/{ëïWÑ&~ÚÿuéËs8Ÿ9ûü®~¢y×!ßÃ9Uœß|'ú…W«­›ÑP®ó]çrñ*;G;W詬×_™÷OÐ;\jž‹¯Ú™ë=ÜÀΨö.“NЗÁÕÉW3ì#sþ<~ÖÒ-¯÷ѯ†y‘XGâ¹:êO¢¾>xÛza”{õÜHžßÀ×ûÈÇjÆgAùîPîLíˆCž_l^°cÏá&ågFºñ‹¾ªs%>|—^ç^zñõ:Öûξ/GŸ ¯¡ÀãaOšÂuK¦/þ/½o™Þ˜Qû÷ ôP ñëšp0Úâ;µÄýhÂhžê)ðSàD7— ïøÚèºÏ0o?r¿ßKŸï{¬§ w¿=¯{úº˜6GÝW¾ÇçæCîwb|öHõÝ ¸×g¯‘¨þx¼)èŒéb¡ÿË´ã^Ã?«oƱÆþ´¶ràoíÇžÚÏCÿЏ¾ …~Æç"ß°ñØØ½ÀŸè»Ýo§ÎÅ)}n¶f ;=u–¾Fÿ¿‹û™C]éö¡Ýìó)=pzI¨§È¿h7…3’®âþb«¯Í> õ6yˆqMð3ò½·Eô«ƒÏò7ußfÜbœ©8^ÿã8ßEN㸱SŒòSÔ'_S¼ÁO=³£h84ø¿L•Ç"îU”‹˜ß}Ví 5ûК¸Ã5÷wEüvËQnŠ~Ýø]Üû‰ó×\‚¼ÅøÞñ=ûæøL­‡Ý{±+Œï›îšoöNMûî&;šØN‘«hªÿîƒî•-|wŸé[ ßbÛ™šÆvb?"ÊÅú{ãx÷uøæõ0Nõ¾Õù«Ôé‹|ìŠç˜Ÿ½ZÌßGóSõˆïZc¯P‡»Z_5ô#¾¯ò¯¨º©ò©²ß*R¸¨IøÓ*=e‘ßhò$;~7Éš/•ûÙ%ù¯Vna/ôû†ø|z(Wæo[þQ »üUöœâ{—— åÊúW‚7Tºìç¼ùOb׸<û´›½ƒpëÙ_ ê×ÀáRñwôc@<Èè?G¾Šüì4Éu ÎT™Þ¹Ìnºì~»BNËÆ1æ«,ÉÌ~¡Âî ²l §èw컦Aãë)Úÿ~èwìÿà¿Ãûȧã6ÈO´t%»PåKG²óÛ3ôkðö†ñy$Èmi³@_ aLËâÐã`_Tróýˆ©¸•ƒä³¨?¦âÞ…âqž~ô)ÿ–¢?1}—¼E:£}%~ü‹¸üsËìCÊôsÅ8Â!)ï¨Þ­ì¿q-3ŒkyU|ø¹f/[ŒC6¥±ßø2Çbð”ÐîûÌýC{•PO!Ÿì«Ø 8 ðŸ0 ¹f_UÌ“8>âóFyüIèÏàŠìM·tÀ!*êg×5àžªx†?Ý?ŸùE_×ÏÏ9¦Ÿ*éó2æ[]è°~ ²›<.ð9Êóàäù†›בÒDè_1.ñ½çb½ŠiovPÅ8Çyõº÷q¼ã|0¯‹và òJŽ‹uÀ½~QïÔT½E~¸…\Y7ã8–“²g,³+Gÿ…øÌn¥ÐWù–qàO^þûÅUûØ |¤ ùIàËT—²à_”,ƒï1ÿ=ì‡oÅ·øÞ9¶ò3ö¢Ê%Ö‘doö’èM¶Ä¿—ì?à7TnB_E?c}ô* »Xo¾q²}Ç‚Ž Ôß"WâÙ•Åÿ‹ü*(¥.ŸD~#>†sFù/ú‹¿v •¯hG°ÊÁöY‹°;÷=ò½,n}IÜß²þT¬+v{q¼*§ÙDþ(ßýÑ"ÿáRxSE½‘ΟHǧŒ+~íMI ûê8Çü«ÂõLÄ{-Æ;¦ä Š®ª~F¹«÷*ù®òë©âkõ·öÍñùëR÷ÙÕãC;E=ƽꞱJb=5rZuÏ]ó_®¾Ä>—<ÕÜUÿNã_¤ÿ õ×f8LMc÷˜ßDõçxñ‘jæmmËÐNÍþ¢&n[½HñþïcÊ¡hW\‹"å_¤ü`jâ Õþª^8*E=‘®XL¿‡î˜ߢÞXOÌ¿ÇþLégõãñCã`S<‹¯]]ͺâ\íØ«ŸòXåçReGQeO•ð“ŽÏU86Õ5­SSþüÉÇê‹õ‹ûQ¤Ú‰ù’*yß×úý1^0ßžrÞh[ÿâwç¦ò€ùøëÍgÌóÿZ'¾©¾ø}é0ßÊðp*ð/Êñÿɯ!ÖSïT¬‘Žóýg"N zxdɹ¡žRÑÏeÔûýV®ÓŽýV²ž~&ÖÍ죱âß”ùÜþhð+Šrâ&”ù—ÉUùéö!CÖõ–ï°Î¯˜VØ×Vfà›x••µ¬Ó1]Ü:×ÿ¯Û'Á{.ogõoíÌcÝÇçR÷aÒ;ѯ£¼3ú7Dß,ßϲÛÜóú '§h—¾¯t©}} ¸¨%þP…Ÿê‹ä%¶Ã~¬èïç=¯¯=ù++çMSÃÁ98ٚĀ}Ξö¿òßþ“üž£Hr°ÿH¬'>ÚüNûð:罈UùˆüÂÓ)òEzb}±œ¸lE{pùþôÉ+Ö§H=Z">B±?kŸp¨yå_*÷‘³øý§ž·QËð´ËOùÿ.h>»2{¼8N1_‘~O=N‘Ëø¼ªgiô,ýË>H\“bÜãøÆgxÅ|‰ý9 ñ}ôG‹ãûßÇz¿¥Ÿp• ¹"oŸâ ½VÑ/û³2ÜÈ‚/±¿ñY¿ÊÇ(ùëò/±HùKÇùUÌÏ8ïâs\WÌÏÒ”W§ô˜sœø¿ÔÒý|œï«N_ý(øåŠ}b±áoÑOþNE=‘_QNâ<¶~ÅqKàvó'¦q\ãxÞn>F¹ŽôÄôÿAg±îN¿b}ñ¾ÿ8¯b=—;Àç/?à;ÿä2\± ¼Êø\nF¾טFäxž:bÊs,¼ Ǧ O®l¿Xv]”çï[ÞÓ÷XnjëõÅòp0ÊpŸÊðd‹ïìŠK¯ÐWˆÏVÐ ³¼®~HK#×ÓËõy¥ß"ÖW<»ÿ+Áç/RûêÚRå|ëJE»ñ=y+Úùâ÷ˆç§´@ø>ø‘~Ú·•Ä?+Úåb{³§ðe~ßã3¼ó"…#Sâ_‚/Z^“Üú^>Ò{8Àå_Ù7E¿ãUͧy¦œ;#Þ¦´È/_e!ÿ‘XÎþ«\ÕþQŸ„Ž¥õc7ã,ÎpAoÌéÑÎña]¸ÏwtíÛ/ùb=‘žc=Çv"ñûLôÄ|‘oè(ÚýäÇU”gwñ©zø1Ïñ{,ÿ° +¦üf‹q<½qü#ý‘¾ê”r±Þø>5žSø÷©~Ýf¼#þBÜ¿»×,ÖI÷ÿ÷¡Å{øų¸H•_ÛŸ^ç;\ý~W²“ý:Þd[ûxþ•;C{‰8WÉÖõ¿MIÕ[ÐÛ}(ê]|;îÃÔ—¡#ârÆç˜F:÷¢wÚÍ9ái,ÇŽ:é—/–;gJþXoÔ¯¹(êo'qTÔ7µ~ñ}þ² ¿Åâý…SòGúã3>øÇÏâ~ê9òñò¿ÃË)øÂo7ŽcÌW¼tÄñŽ|úÑ9u<â{ñ^8ÿŸ§8¾ìx ¹‰ãé)ò©Ÿs^H…¿^âþ<»]aG^y êñ%¾ÿ¡u￞ý_+ƽrLËOÉgŸQ Êß¾z¤~K/åÞ¦HÙáVŪһU;ÊÅ稿Œï§ÖÓ¯ÝkÕ·ú*½ÜìI¾Ìž„D þHí3ò¿­½X^¿×– ëQM\Úšó^L«éϳèˆi¬—dm1t¨¯Ê~®h÷)ïcþ…ñèGLÂC«¹'ª±¿ª]L_Ù¡d—[ƒÛTk‡õºö3zÆz £('~TÍÿ¹xW±Ç©ö4½åÔôßìMg¯¼.No]üÙø=æ¯=¤ýHª:<Î:ÊÚ«úÛƒÇY¤÷ÿßùcù"ÿÙ©Dúâwú¢~q¦êâÆ4æ+è‘ïSiìWLcûO·—ô3¦ñ;¿Á¢žHOLc}ñ{¤;Ò ÿ©¾JÈ_‡ïÕX0ÈWzþ¹¯£¾—q:ž}8¯õ³û‹ïá=××ó}SüŽã ׯŸ(w±QžÄ=ªÁ?/äpªÜEŸçëµSÖ­˜Š«Q=š>|sú;ë{uz\×ÜÏÀ#¨–«ü‰«ôÕÓ­»ìâªZ‡–RŸ8ŒÕ ¬?—©7Öó²ïìb‹z¯£·¿Úû'Ã8TýÇ«o¹gŠù݃UoR.>ÏÕnì×L)|ùâ=¿£âý¨4>Ûßil7Ò=sJ=ñ{¤7>Ç4òëþ°~íø^sïU;×ú#¾vñœ““6y…kZƒGT«OyT¿âý©ä'Öÿ¹h‡Þ¬(¼ §¸·8Þ1ÿúÚÎAnjp»j«¸[GºƒþÅöNDO,ïÞ¢h7Ž·8ÃE»±¾X?¹+R÷ÅÿpJ}Ÿ’Sý+úéŠü_ÐÛeç]´ÃÏ¿xŽôLÍ'NCÑŸ8î1_ì_ü¿5¥ÿ‘úUÔ‡O5ñŠrSùŸã<#ß5¸p—‹÷ûyþ†qŠã=eßQÐ'-ÚÅïHï§Æ%¾üÀÏb¾Äõ*®OqþýÃ÷¸.]7eÞÆ4~ëÚÔõÉ9³È'înÎRõioÊ:óÅú¦¦q½€[Wô'¦‘Þ¸þž땊ãR]?÷ÝôüvTÅóÏëà$%û‡z’ãä‹öªô‰Å÷˜~-ÚoØÇø9G^¨~qj’×âyÛûØ>»«"}B~øð ã®oAÏTú"Ýñ9öžU1n?uÿŸãxÅùþÿ÷©ó1ÊçRøýò”yGŨá)ël”Û¸ŽÅõc#ózSi\Ÿâ÷ÝÍ/ñÖjâ>×V@LJqýEÏíSâ|ÏSs~¬ñ+)èàQk[÷'µ3C>þÐ5úƒšùUƒ¯YsïRƒßWÝToRï’þƒ—â3œ²*Ô"å—_=&þ'=‹ûR=D¿á“W+Ú¹Îÿ3>?h˜e?óŽùô}@êû¾ÛŸUÏ5ÏNç6Ï‘ÞØNìÇÕê‹ùNô¿;WÕÄ-¬­÷ÓS£ß)¾Gþò笱ϫ«üŸ¦¶÷ˆï‘ï‹Êûý*9ÁŸ8.µ5ȼ‡Hg!ðÊkp³Šzn±ˆõh¯›Ø¿Xì'܇â}̧¿µSð;µ¾²ü«W|󚸣5÷îµËå‹éÙê‹é˜ùê¿PìãcyzëZɼ‹ö.Cè‰íÆ÷ìê‹öà^ÖÞ0_ø§Öî×.»¡º{ƺõ¨Î¨~@¯ºxµ¿  ø¹ ~=nœ­Æüa¼âs‘²O(ê϶!FcÏëº>õ^œš}]ÃülœúÛ ‡ÅwqJ |m°snÐß4žýlˆŸV¼¿:ô»¹€rç+Û‹©x9E»ñ9ÒËÍ òÒ /n\,¿x¿7CÚt?Ù<+ðµyhè“?x“Mó×?Í—¥ì2[Ÿ ù[ÎçÍ'øé¸oÑ'éŸCÿÚ+:[p.[ õ¶ØíïŸÑÎÛÞ6¼½6ýqû[a>¶— ôùØ´ç ãתÅ?¸%Žtñ¼MàOksõÄ÷Çy>Ù÷¡À§"í„vŠçÓõs,ð½uC 'ö»u¤þ‰ÓÛ—£å~$ò³)¾V󻡾æWŒÏ—Œ¼ÒæÂƃ}\ó·¡¾ø½ñë¼á:{šB¾ÝKòå'>Ÿ;eÞ°K*ä.¦ü¶Šú¢œFù×£qú®ô '¶˜7ðê‹÷QnAW¬'–¿îÿæKw•ž»Ho¶¾Xÿ"¾fñ|²öv5ŸÝ[ïá¸4.ÀvÄ1mºçmòmÆ»¹xàC¿R‘²›h®¦ÿoâgìÇè€?S¬Wþ#Å÷=­/‘¾Ùøé?Þ{ñâtý²!¾MÁ8ÿÅsŒ;Ó#­;‡£7ò5Æ)ò¹¹³~ÿÀ:ƒ_;µïþ¡è{‚~ý¬_âÿñ`è}{ú/ñ‡ëÏûïÜ諟EŸ¦\ƒž.Ò]‡UÔ'm|…íþ[ìë·Hã:ÇeoóeeíÀ%®?íÙúTð¯;Eþö“/–ã±ò”÷Qð©)>G!gâ»5Oó¾e¤ —¸éÜЬþ4ùÕ7ù5ïü+žÙKÛó ¾«4¶óåc;±]v@-q šôîÍ;|ôŠÛYÈM”o|‹|/øÜ2Ÿ#În”›ó)Ê{œ×QîáíÖÙ¿r ÞPý íÄöw}]ýuå&È {°"õ?(ê‰rrŽùé3ï‹õBœ¢&|„æ|Ç÷Ö þoøÙâÿTð=Žÿ—â}ïøLǧó´X/^ý¿çk±¾-kþÆùN®ë?·Åùó(>ÇyÃN¹v—y W²~…ôö ×uö¯qœŠñ†+ן²X/¢¼|ßǦ¤ê+žû¦Œß|ùâú×›ø|ì”þÄþÅõ‡|BÞ¾6¯ó”}t"nkÞLEœ° ¼íЏpÅó/Ù{Lc¯u,{Ž…½ÿF§²ûªÊ—}Eº{“èwCR¡Ç(ðúµ›ì@_Â_!áW•\ê=¿­"_ôSؘ^‚ŸQõ`ý>"êqœãÅñ®Š»S§ú˜ó©´°¿·O¨åÞï¨ÞÔyQüðâ^SÜ²Ú Qßç<ê>°x“râöTïGO×wñªÎUU8Vµù¼Ê9”eü^” =‘¾œOáUá|Wù%Vù_Vá‡ù—5Ñ®.Aqqþãóa¡|ò9v%_ò‘,lÜýç*ôñöÕËÈå0»ª>òq8ùXfŠ'=Má÷ G¾òuõŠßSÎÙë;—UÆÙ?Äø>Ño9¶Ïß:ï¸ò¨þlMï&nS"^Nr½ñ|ýýI”¯…ð?¦‘Ÿ—Òç틞ɿúëu‘ÞI¾ã= ?¯¢ÞÓèsŒ_1Npƪ—Èé‹ã|úÉI">LA‡ý@rùŠr凟AÁØîE!_EœúJ‡üð3Š|¬Zÿø³±žbüç ô—¾úÇ»²‡q•/¾õø)ø_±j‰WÙ‚7Ö‚_Ù†cضõCÏþïíA¾Z8_ݪœu Åo¹}„sY<¯= ý3œCá3·œo[k9—Áiñ[j}Û¹pmÿ_þú-q_Zâg´ÄÝj­¯w•soÞ¦ÏjÃíkñckÑ[´ù¶ø'çgrÖz-ô¿åÜÞâ§ÒºVû¿r>׫Ï‹ì1"îk_õŠؼ)ô·iÞ6[p:›OáËvÆÍy¼Å^£u+úøÕ¶Ä÷kõÐw>Á‹mmèj­d\é‹[æyË~ ÕgœÄˈòÓ^ÈøÂ§oÃ!i‹Ôþƒ|WKéÒõ]mú6º¶ÿSK|Þ”ßKûÚÀçöø §®}>8×´Óß z÷íÍõëbãéÿÕ‚ÐÚ¿vÓ_qÛ[pÊ Ü“G|o«Ç½\«ŠîÈ÷ ­£ñí:ùc|þÛ-¸D-qxÛâ?µøõµÙ¶ÅÃl¯¬ßâʶ٭µá¥«y¾Ùül†zÒU‚¥ :Rñ™SúÐô'ÎtÛ _©ýA Ÿ8…/‘ÂOwU»¼tÉÐt¹@_ʼÍ?½ ·¨Íž5…[Úþkà”‹ö¿è•à4´?–ÑP_ §8]IýðCÒÏ¢ÿóúµ–|üxÓµB}éú·~ìèJwWnuõì!ú¤wÊ÷~ÃñN㟺÷O_ 㟾€_¯(ÿ@w&žU¶lèo¶+þÆþ¼Êgüþ³y´óÏ Ç)?þô6ã÷Kãu§~:W¦?CÇèý…þßf\á.¦ÿ2nÿQÿÇ!_¶lxÎæ å3qгyB{Ù²¡žl³ÀÇl¿ÐÏìÜP_V ýÉÎP®èÍÎR/Üûì0|8)ŒKÆÏ8›!…Ûý ]âåfìŸ3÷’ÙB²ï¹ËÆox‡ÙUÚÿµþ\ŽNl_½ús*zèu3~wY®?ȬÆ';=öÝÙ vÄßÌÜ?gâd+jï[ø°–òKêÇŠò-¤þï«oWý=[þ#ôëÇèÜX¿÷UïîúùS‹ãf|Öù¼Ï&»E{W)Ç1_*Ÿ+EŸõ1{Ûû«Õsº®ñ>;?Ì﬇>÷HÙ½êW"sž†_'áËò‰7’õ«Ç>$ƒƒ˜]å÷‡|öl™û“ Þgö úáíe¿Õ®ýEÆÿ)»N½/É/®eögüðßËžòþ6ôþÌx5´û?¾ÿL{¿1¾ñ{U¹qýÞ ÝßTÿ—åß\¾ŸxÿÓ°þepG³#?;Î{?ÇÌ=IŸ>ƒcš½dÜÓ:ü;«—aýþ¥úg…~wöŠ/–=éûmèúƒzŸ×.~vÓßßï_£ãYùÜ7gO뜼Îo?:á{ç|ϧI÷‘n¢¼u¶3#Èggt>£_>t6 |í¬úÙ'µ³t§ÎŽÎÎ,ùWÇÿ÷‚œwv ýí¬ä¤CÏÜùœöÅóéÀ³éœûèÇaè£çéÀuÎ^ÁÏÕ?O”kùÅ#íØßeoêǪämtM9q,:{zz¶÷ý@馸¿’znиq:OéçèÜÇ÷õðõNí™~)ÿ¡þ|Iü˜«^xßrÃEʧ…zrøÄ+Â8å ~uÄ=ê¶>Åÿ˶Æq^ÿkqÖÒÛýŸ üN¿nÿ³ªÿþ6ö?Ö±t-㿬|üGÓ¯Úçøÿ¦ìRñ.Óý¼Ÿ7½Ú~éÏöÙÏ ªw¦}yG9x]©ÿ\ ×3u/˜~Å~ƒ\¥›{†#VôkIýG$]E={à‹øO©ýAz…ýÎÞ៦ðÛÓwì·ö#+âë[ê³¥âA¤ìí²¥­gk£/ÑÿøÜÖúµ¡ïpu³…ÍûoZo÷ðß¹Ö ®üÖÒåÛ^{q½}œ¼mŠîÈÕUæ/¼ðìOþGwÇÿ”yAÔ™Ü-§9í¸'îØ¿wv1o·ò~òïþµãüÜÙܼ™nþ×åO½wî|ǼÛÅóÒm­{?6ËÞÓwΑN |éœnêWßyòO·Þëyš|¿CWîо\ÞLçaüùuh'_6ð%‡§Ã ÌÅõÍ· t嫇zóåå·/Ïöø@ûö킼åëYŸ òŸ¯‹®WB¿òEÕ³ŒõÈy'翞óÏÌ×)ùn¯«ðá6튯Þ9Ÿ±7éÀ¡ÎÁŸ‡ñƒß]¾8ú#ðøs~GøÒùúÆÎo‡Ÿu矡\¾ zÍÓŽ{Â\Ü…üDý:ÿÆ×µÂº™ßÊåÊu ít— ttc»‹‡üÝEÑÿzè_wÛðܵ>v¿äý!ήýK÷ö@O÷oò©Ÿÿ÷JÏç>voýê^SåÏó\rÑãÜ…ÃÒ…Çß}G}?—ïAôÜ$ÿ·ÿ»Géßtt² êΔþ\þ‡ÃxtÅSèÚ?wÙ tïôÈ·Ÿz ã×=ÍóþÒ]Ð)^v÷{ä—ÿG÷’0N]zäîwÐç\Ý=@û›Ç·•ûŒyu«çÉ!ûîbÚß½ëáÓ5Úã_Û=L;âÅu3ï/A÷qèyß|Ñ_ö]z›î„üç¿_€Zw ýqÎê’ëî:øI?ÛÝI¹­Ðø W³»§|ü.ºô+]ñCºK׃¼ß ½îEó{"ÿðM¼ŽünëPÅ<¥·Î70ÿø1å1.߃Ƴ*¿{ä\<œ}W.¾|NOÜa·”“Çüó¼&߀Tüøü|ù~éyŸ0Îù¡ÖQqbò•û9:Î&7g«ÿiý}E9ñhòat¾¢þW­OX_‡C}]qqóÆõó1|_DûâAæï£ã=ùß°NÅô÷Ú»Mû wÖ휽Dþoóã³äD|‹üMýþ«ö·Ö¯Ó´W"Ë Ÿ>5çoÒ]_>Ðî¢ê}Ð<Ú™|‹'ßO¬»—tCò·y±úÞ2¾¯êÿßôãzãöGÏü óƒÐuïðŽóå¤[û/Ä}õí;~bß ¤Ã¿7û«}п¤ÿ°ŸºÅ>ç*ûÚ;}¿Á¾çû°«ìnçWû°#í¿*¾ß¨ÜÛöáâ¹dKÅñÍèï3÷‡YÛ>Œ>>{ÑþžÝeÖsnœ¡gyž®Ü.ÚÝÆþ3î7?ˆzý\Ó>_6þ,õ€Ú;Aû[zÞŠ>%¦ G=ˆgø£Ùñè8ѹã ûªíÖ´¿¬óÿ1÷ÞÿQWOü/(( "¨‘""( JS:‚ Í‚   HKÒ·¼·f7e³é $! I()›€Š(¢"X0Q@°aATQPD¿~òz.÷Þï_pÈãdöÌûœ9sæ´9sf¸GöÏÁÏ{UÿBö;Äaó/¿?åŒç܉ÿtÿkìç°cö`_pˆß‰Ç~åüx†ï>çüõ)ø_3¿5gþkG~åTR/ï ý?p^;…œßIþÚ±“ýÓìÇþ¥œ‹äÿÊølÉxoÉ8àœ~óqÓñ»šþ4ã)´ìAýÓ7±´ãA~|§ø™>‘ræ3ÞV°?Lbž²…æwè NL:þÐÒ+˜–Añ ÓWò}6ó$÷"é?2ný¡õ€yêè°0o<ÀúÔ‡õ »‹ ›Ú‘Á=C÷ófð³^T¹™ÄëÌÀ¾4óÑ™ÙFõe79ƒ8W™£Å÷Lî3Ügb“E܃¬/E–YõgíÕïÙw‰Y¿¨œìûÄl3øøýËâ=hû§¬,ñ9+Lôe±žeá¿#k©Ú—Å}@Vú/+Fôe] Œý_Ö¾_ã1{ ÊÉΞ"Rì²W‰®ì…*'û)õk6ñP²ÇÙÄÏËÆ.?;…|ÞÕeó®9¾d¿>þ³ß²‰ó™ÓAò”ƒ¾?§/¿ã0§|<|¿¾Ïé&¾åŒW}9¼sÏIçwü3çô¤üNЋßïüyfc?œÓZý3„ïŸý9¡8lQâSûΜ¥ê‡œ©Ðåf”3_ý’s߉;ø¼èÈeÎå{¿ú+÷uÉgn¼Ú›K|Å܃âG.úƒ<ôbyCUoÞÝ*7/Eý™çÐ÷y‹ÀÃÞ/øïùèûóïPyùø_ÊRíÍgþÏ'NÔâvlx^ål(_7Þ¬ï7bϼáñuÃ9ѵá[Õ¿ñ•»ñf•·‘~߀=Ȇs¢kÃ/¢{ã|ÁßÖwmÕO-EG!~ÌW9±âgÁ5ê—‚P}Ë(Ç/þnäýOq” ð÷Xˆ_Bâo=ýYc?=.9*ZÑxa>¦¨òl£œ½”ÑØŽ"—ê/â~¨¨Jü)š¹Bßþ°±ž¢ì:å§ò»Qï^•_xBßîÝ…Ø»O°Ð"¾îVû ñ«U¸Sí.üWrRtÇ¢F¸¨½ò‹†«¼¢!Ôÿ€ú­=LÑjRÞi=C»æŠ?EóI_Pÿá©h™EíÄž¥h½ú¥(|˜RÓ â vçE¡¯|í¿ÐµPÿ6„`ÊíØ³Q¾ ÿR9…ñðe¬Ê+l)º ïÆ>¬óIáõ’Ç‚äè¸ð ~¼áüÆ>»½mÁÃ’ÛòDüÛòƒþ¼û¤‚ ÈçEõ!ënatcGWtøRø;ý¹†t#íX ÝDOaè»—üùo…ËÔ®Bü%¢·)xKå”K¾ Æò;ñ ñûõcÁ<õÁpÚ_²‚Ghßò;ñý-´×Áx#R~Í –óÝtêËïèã îŸ6bµñ¢ø»ñ,ã±¾qÏ^ð6ý€½RÁ!äŸxh…ÈQ!ñ” ‰KZ8 ¾×·sg!÷—…S7Ü#Îî&º ±{*Ä®¬p ß±Ÿ-üœyâÚÇT~tõâ;ü `œ j.xãa$ó@Â:Ï<}W´–q†ßØ+óŽ“yd)xãoiœ7‹ð»™ò 6ö_Ñ×ÔóiãEÕ˜¢SÈßNÆ%qcŠÊCã˜q¾ØÇ|q˜ñˆ|ÕC÷ ÆóïüN¼ ¢)çè9½„RæOÞunj¢~Û4_tmÂrÓbƒM›4_lB»iè*n¦ú7}Jнõ¦†¿Ûµ =Ц½ÓûoÓšŠÛ‹?Å$O›þŸŠ±§+î üâÁÔ3Hü+^¨y­x˜ú»øfè<'þwQ{ŠoÿÑS<‰ï¦«ÝŽ%'Å£+Tï¾ÃßEñrõSñt¾„ÞÅ”‹½jñ)õCq=ôœ¿ŠKÔþâjñ³x'åmѸ*. ]Yü^”–´U}%ì?K¿%{4—ì]%eâoI–Ö›’×UÉ!ÑSÚLü)í¤úJ‰÷Wúä¹t…ä¯tä­tÆAéÉ})qºJÕ:Zº†ï§ðÝHÑ[:‰úKï•<”b7YÚQü/Ì÷øa)í$y,%Îii7ê»Zù%¼«.Ù­úJÊ5J–~ר%¼ï*y€öߟúK^KFHŽJÃWâßQ~ñÇš?Љƒ[|@ò]¼‹ümÈÍYñ£?%c蟡ÈñVKî_KFCïd}_A¿„A÷Åç4_†¾«Ä·ÖÍ’Vêâ_ÕÞâKÈχ|Gâïávo%]Õ%·ª_JF«K¦’ÎïaäiøPÂ8(é¨òK®ƒŸ¡qy‘öµ‘\•t‡ïwñý4ø²¹|LóOÉzèØ¡}MI­Ö·’úù£’“’³’zõ[iS•_ÚTõ—¢?-í­zJÛ‰¾Òîâi7ä´ùcKì#KOhžØÌýcé¿àýŠÿ†òμ?Ç›GŠ_›ËÕ/eøWÝ|Yã¼lªè-ûX|/;¤v–ß«òËNh*Ã/bÙª¯,Nå–eáû“’“2ìOË>¦žßIJ x§,cÊoP9å³Å§òâKù'šʈŽò÷¡ë´ú¥üs¾g½(ÿ˜ø#åÜ#•ïÒ¼W^«~-OòV^&:Ê«)7EóLùzèpKŽÊתÊmâSù—’ãòü^§ö•gŠ¿å?i]­h¦~(G[Á³,ù^<òžÔÇh~Ø«vn¹õò{­ê«Ä~«òÑU®ñQÅû¬ªn¢»ªµäµªr|Zü©¤Ò'üÊžê×Ê錯¥’ÇÊåâwå è³k\V®aœOW?WÞÇxÏ8ÇS%qF*“¼U> z+ñ«]™¡ù¨’{ƒÊ»èŸéÔW¤þ« ÐO³Éû úhßÛÔw¾”«¿+ÿß*OÐ?j®Ü#y©ê£}Gò^UI?–K¾ªðQ…¾¾ y®n­ú«öˆ¾*³øUõ"ýû»úµzŒæêßÅïê]Ìw1ú¾úWñ·¦ÚQ3øX#5} †ÇÔŒßÔXNͲ÷ÛQS«zjj®j¤£¦üKâc Ó™FzmEc­Î5ÖðM#ÿ]¾hl`¨ÆY`¨è L 6~_ó½ú¡æ³eª¿þÕÇ~­æÜŸòYs¡Kc;׈¿ÛªÜqå60(º/ÐÿÑ‘zm#Ÿ…ê‡Àõoàkµ?ð&¿/Cïƒ@ɳ‚wd7ÒøDtr$÷*Úµgo#õ†ÊygŒà×øîEÍ«üyêÄ¿Àµ?Ýk; ÿIÉQÿI¾ôןZ'j¾ƒ_YjgÍW¯Ù2B|ó?¬~ÃÏ} %ô¶â»ãú½æmÉ]åíFúj¢%75«Å·š0õgM¬äµ†w/5)’Ïšlõ¨ý5«Ý5Ç)ï-ä©HóWÍ/´³ý³Pã30Aã,ƒÍѺ¸º§¶S |BíiJ=ÿ m—5”©_›ÜÕXNÍç=Ä?ü¥Õœ¦¾V‘jßZGkê“ÔþW ï3µ3Ðwgc¹!’ûÀuÐ=:zÒïÄ LÒ¼¸ ùľ00zóûTú5yK^­ö†k à×=À¾8ðãËŽ¼¬âûµ.K=“5Ž×k} / W{}4žã”?•vCNCíà~/pík¯ù¨æ;èbßSsÌ%>Ý$þ:3ŽºÐžÎôÇ}ðkã­ý6õó͇ì`ðý£Œ»…ôß äc¥ä,ð8ôÍE>¦ÂŸ š7ÍTÍâCͧ«9ø±ÚqRòTsùü@ýS³Y㳦Pý\óÂ9Ææ™r<Ÿr¦2=5£±þjâ³W³îTg¾]'¹®=Õ‹Ô/Õœgkš¨Ý5œ¿j®W?W5OTÀþôµ³;öšfª¿ú‚䮯ÕU^uú«úUÑ_Í{¡šæ’÷ê¯DgõIÑQý3õ7aÞí©~¨¹CóQõ~Ö““ÌC¨k–k¼ÖD1?lVטÕîìÉj²TNM®äªÆ =©êçš•ZÇ3w“éßÅŒƒ[Ÿ;E /òÜ y¸.„‡<ÞÀx¼›qò r…ýJ yÆÎ3§ù2ðã€÷6*ê+h­Ô…\¿À|>†õåæí•Œ›¹¡u„vL”<¦jÜÔ°Ü®}O WòøùoãwÌ«ÖÝ@5ãî¨ä ¿>µ4ŽjÓ5jß×|\»Qü­ýZû—Ú_õ{rT{Fû¨Úí jkøžwµåš7k_S;jÿ”ÜÕ¾Ù¨ÐSû¥ÆI¡þÞ}\Ý%ú³Z?vtÖ÷;Újý­{Ií©KUûë&¨ßêÖß^ã²¶5ëoÁ-ÿ_~l‚ÿ—4Ž¿iÝ­í%>×Ε|ÔŽ”<ÖîÓ¸®ëªñQ×Mõמ§ÇÕu7jQ·Uò^·‘ö½¡öÕ}+:êxG_wTü«;§õ°î°ä©nŸæÝº%âcÝ,øx zŽjÜÕÖ|P;Lóxí󤼟¬Ýªy§vžÆWmwä~ß?’÷¯µÿ©]L??®ýt-óV-ï$§ï1>žÖ¼ø…ýЋ̣…ŒƒÈóñ!PÎ8¨bÁ¯@àyö=ËÙ=O9VäØË¼<{ƒÆS?Ö¥0Ö‡÷s kôÌ×>%ð¼ú'°‚rÜŒ÷—ÅïÀyö[{©ßý^€|”1“Yÿ_Ô~8PAû íoÊyšušøWDWmÆEKà5ï×Îf%è»Ú0ä)_ëD]3ý^7[ëNÝ ñµŽ¸uu‰’ߺGé·‘¿®7µ¯3ŽwJþjóóã’¯Ú/Tn­‹ñKý)ª'4îëÆ ßèji=¨ýWóZ]GÉQÝcÈ­¡qT÷”ö1uóiï÷Ú_Õ¾Šüß'¾Ö]£òkƒâgmóÄCÌ#ñÐß^òS-9©ÝÈ8]¤þ¬]A=K óÉQí½Èùõ’£ÚÛ]µ?¨¡ý\íAÍ'µAÊ9Ê8ˆ¦Þ ’«Ú,ðŸ×üRÛ¾^ËøÂ¿qà"òt–zGi^®Ý£Ï™Œ¿ú+ õªö0ߦ?Ó¿3™'ƈþº©Z—ên„Ü7ա܃š‡jãÄ÷ÚBøqy|‡ù¹~,F^ç±.<­ù¯–÷«?8§U±žü-zjÇ2ÎW1¾`ÿfѼ°±N-c<ÝÂ:~'ûŽ•èu>FµýÊ.ñ»Šz*ßæüMœœíG5?]ñŸÒDõ$s›Œ?Þâv¤Ü®v¦pÞOi)ú’Oˆï)¼÷OÁþ1™8xÉÜ“$‡-é²à$죒¨ß“Ɖž¤ÏH·Šž¤žIøƒJ¬z’ñ3“Œÿ×äq’Ïdâã&ý­ù>‰øKIoˆIØõ'õžM~5t¼¤þK ÅÍ î}~@’<Ðß_õxwë;/qÀ“®ÓøKš·‹Þ¤‡ivMIô»÷,éyµÇû¦ø™„yïg‚“‡Óþ9’×ä Úÿ½èJÁ/kJ²èH½NiÊGô#þ:R±ëM!ÎeÈÏFêñÏwƒÒÔUàg •ñŸz‹èH ½×Ì%ÅÎ<•w$) «tµSðû‘rrôx÷"‡DOJPýž‚?‡”ï)çåü+yJÅ\*q¸R‰Ç—zF°¯•äÑ7Y¿ûFª|Kh/þ }=D‡÷\>ôé¾µ×7BrâÃ^Àǽ¾¿‚¾\ñÕ—q¹}ìk}Õnþ|ÇUZsð¿T»}?PîGÀG)?@ùõ󮨗'þø¬Ð]+>úÒ)§†vãØÇû qcÒšbw­Æë÷Ðîßy'ðø™†¾0; ;ülÞ'ðn/­Zô¥G=íï~P;Ò~äwÞ7¥¡wòOÔwþáØ»ßû ì"ü‡yoñ1öúÌ3þ Úë?>v±é­±¿Ç_•ÿOð/ˆoþ±{oÆïŸê;ÿËÔ_=[ÔŸ~›èõãGÃÏ{!ÿNÊÛ QàßÚoUúã±ÓÇîÑ?ûüéÔ?‘w ¿àë@öpiÄ J;­òÓÞ…ŸÛÔÿi6úûúgµÚ•VÿyǶŸr’‘“oÉǬorˆ{c_øŸ½³‘§~’÷4ü÷¦áÏ8m%0ïÓ’ù}¿£oKæ2|œ«vø§Ñ/Ëõ½¿ô§_®¦Þ£|?†þÀÿ•¸øã9Á/·ýLÚaÕ—v‘z¯§Þùyßê¿yf\¥ýMÊ;ÿ­Ð9:oâ÷»I—‘¿y^Œ¿ß´ÏÕkè&º;s?vã~ôéþÙ௃Þ5ŒYà_¢ü—øñ[áßR©:~üŒøÍà'Âÿc|÷r\‡|¿ŽðÞ‚õ'@é7󮣻ú7½¿èIHíH¿Fô¦ão"}Ú‘>Nò•Þú*ô½?ñ†}¥ü™’øÓ øzäëŒú=-¹‹cÃ~5ÍŽü:ù5­p3ÆqÓðý,Æádò±w÷aÇæã‡ÿl_ã3äW{ r–z€}ÔÖk⣦®Õ÷©Yo±cL-c¾Ç/O*ï€Rþæû"Á©sDoê(¾§ß0•ã‹f} ~¨Ï ý¯ë;öj¾Ö×5’ _€4št)óBŠúÝ·ŸõðCÚŸÍ|²™r²®¡Wñ%°Ž}Áú¶Ÿü\èúšuóóXÈßÏÝô×hútiÏÒOÏ7“ß±nÑiMÁ»‰ñ=žò»3ïv å3OàïÒ· >~C?àÍgEˆƒá €ÿÊþ/䟻æÔöQïÑÿø-L­R}©¬©ÈI ՛ʼºPòŸÊ»ªæ“+ûÎÈ!|K]ʾÒ@n‰Wžú2åç'?0©øÅJeŸŸB\Œ” ö“1ì;yw—ZE¹³(§t\R¿¦öåÜò¡øÂ½j*~S—³/Þ_(7åaö¡áj_òËâSJ?Î?軤 ì÷{«~o’èw¿):Üø-LDïÂS"ç÷ ñÇ?gç·J›ÔNï'\øEsWÕÍþ7¿>‰øQtcàþLt$·µÓ;[å{¨>/ïù=¼/ñçÛÛTõyñèýsS[ÎM8ßÌæüõ/ç2âü%ã/0y¢ÊIþyéŒ|>Ç÷¼‡Mf¿šT9ɼïK~‘óöNÉÝEg2~4“Ø%íáÜ:×tRy)ÈwH>SÆë»”«8¿"9›òñ/žü'ù‰üŽŸ‡ä8/óN*ù%èáÝc2õ$?&ù;êoJ¹RÖåä*ÊÿY~¢’°NÊGÎÙg$qîOz€þxAã!i!é|·Gõ^ñ“M ï2ú—w^æeOŒè÷@g"þ_=¼õT¨ýžlÕïé ¼Aõx׫߽«o]ô»çqÑ•xZrèaÿ”¸•qp y?(ùôà‡×ƒó”w®úÙË;.¯ùÆWÒcÈõµÃ)ùñÇÃK</ëUöŠI#аoôž¦ü]y£ßhI9øÙJÂßhR_äŸqœ„²¤Ñ”Ã;Ò¤vÈéൃ¾·¡—}iRoè{”~ëÒS@çý”ÓMtxOПÃáýïùGõx.ÐûèöžÔ>÷‹^ô8^Îì{<ÿ"7¼§ôò>ÚûóIõcáÅnÔK|'ï丣^ö-ÞÉà-€ï½ ƒ¸zÞáÈ#qÜ<ÕÈ]È6~`ñï陕iÐv¸ï÷^äìæuôLî>¢Çu¿úÇÅúæ ú\Ý•:×<à<¢öºñÿæ&β‹x¥Î Ö‘–â«ë'ñ#/ܵ[ô9ßW{O‰/ŽláÛ=vÞoÙy§c'~–­Aùqt¬œó,øQ0f‰.<ö.êÛQÉ•m‹Úmk¢qjðNÏjˆn£–ÿþPmkÄoñ laÐ3Vü±]Rj'^«ãFñÙŽ?çg‡zŒc ~·ŸÝŽçh÷Ó⃸Ó6â2ÚîS}Æ ñÙ˜¦|95NBo©Ê·OÅVÅw¼Ï2Ðc«ÝFÕk½Qø–€ð,¼6OR¿™÷I-£•o%þ†•¸Þè´D¨\ËW¢Çr“~75×wñG”O\œx—¾OøPåY¨ÏÒF©•ñf%N€ÁþÀ¸—~Ÿ™ÁþÖŠÿ3ƒ¸cú\c¬úÏ%y5ðógà/Ø ®‚ ?ѶJú™uÔ¨‚Ï«UŸ•~3FAq˜ üêÚú«mO ?÷߆_ûpä½HåÙyWoǹ}³èµã/ËN:ûyµËŽJÛåÛÞ¦žBäçFÑcÃÿ}„mòÑ—v«<ÛJäùzääCñÝ`þ3JÔOÖïá+ïÒm¼´ÅÏc¼á/ØÆ{Ûxè*¿íØCØJ©±`ƒøØF2ý²9à]­¿àÖ§4Î-IJ ·dŠËoÈkrÊ~ɇ\¾£öZF©_Ì_‹nsÊå]§ù ÆÁ×È%þP­“Ä zkËãÈ=ñ¿,Ä1¬v™öªÜÞ‡š¢I Ô¦DÂFÕÏz“p³¾‹HíŽE»Kýãqă6µU»ÌO6‡Ýü¶ødîÇ|ù,¿÷½ænjŸé‚ødÂߣ™÷ø õ’OþÏÍ•ŒWô –•ô÷.–Ïéüó[6«k'ñÛŠ¿_ëEÆ÷AàSŒÏöÈ!þmäŸQùÆðî"eh @nžà»ÝŒÿ}¢Ã| d¼öFîðkcìaÞ%ÞŠíÉÐøçûrÊç^ÄÆ»\[Wµ×à|bc¾³%1L³wf^>Ïü?‰yÿ„örÑa'΢ƒyÍAü`;~vì?ƒw†r°S¶OïyÆY3~ÇŠ½óÈMÀãÀoÅ|‘!y²wæwâœÚ£¡ó”úË~˜ïsøÝÃzÇ»nÇ4ÖµpÑë ºƒ{_뜃ýš£xÄtŒfÞpgß8Ç ö)ÝÉÿCítìT?8oá÷7¡cë/ïÛÄ}uÞ!þ:¯aƒ^Ïù,ûγÎMâ·ó1•ëä=¨“õÆŸ>Ç~Úù+åܼ_õ;‘O'û.ç7”’úxçådt—ɾÏÉ8s®cµŠöâ7ʼnŸ$þ#œc« ç6Êç^Ë?rG-üÛ ùÀ1ˆýÙBú#†ú†@×µô~P%WÎÉÐ;zˆ—íÜ |(”‚Çúã¬WýÎÄG'çç`øŒ>Äù8|ó  †‹ýœ“{[û,W¾o ÿ#•ïº=Dõþ _ÙǹZ‰o.üM:Ýð‘õÎyýý#|<ñÜÏ9 ÊOã;ÎÅNô%ÎK컟 ìøArOÔyú¸ßqþ@>úç#'ç@g@óóSè:#~8ßï'ñÝu |ªz\q¤TŽ+_ípá÷Ôµƒï’U®k¯`÷ÕÂsßOšÄ9ƒxqCˆsìŽU¸Ñó¹‰_ë>'9uÿÌ9ÛÍøsEô"z¬jððŠƒHDæÝDýQ(þ/÷)‰KÄ¿Dâ>%Fªñ¿–È» Döωó9oM“\%;q˜Ú“Èy ‘ø‰Ø[z†‘†Î•]ÕÎÄ#¯‰¬Oî?Ñ·‡?øurG+‘ó©›s ?.ôçîÁœÏèW7÷nö=nüƹñŸæö¢ïëȹÑ?ˆÿ•ˆ~1ñøŠ·ž ð“êÆÀý%ú¿ÁÃo«û%RÆ¡›8ïîΑøÉq¿JûsU¯»¹Döc‰WÃßEÐÛ½#ñ^Üè'ÜKî¿ÜÏ^Á…—ëu¾Gæ&þ®{ò{;ô°Ïp‡×õß¿ô8íoJ;Bã “vãGÞ½ <Êq?Oýì“ÝS {=ôFŠÏîGáÇSœ£Ñg¸ˆÿã¾¼¤k(‡} »#¿7á<~LýäÂ/‡ËEyèµ]fÒhêÃþÁ…¾ÌuóR6ó5ïo9Ì·œ/’?ÞɹÇ9„ù‰û_'ïþè1œÜß8·ÿ!ófwæÍ!¬ïÄ…s°/rpßàà<àÀšc%¿¿Â~ŠùÐñ;åá¯ÙÙšõ…x‰NônÎq¬SÄÇvn`^w‚7 ˜{+'þ÷{)?h.ö®î´Ÿqà"΄k8ýÒžþÀÿ½‹ó¥«?ðMô[8ý„Ú‰½¶“yÒI„y¿P‰ÄçI,bÝÃn6‘8+‰è‘CëC2ëóQ"ò˜xå ÏJäýwâzæÿ,òÝÐËýSb4åg=1•õ8¯&?¸‰ÇЛs¾õtT=ì=¬ožw¹¿ÁÏžgúVîA½Ø y{ WÅ/¿—yÅ˽©=£½Œ‡ý‰ç8ë÷ê=þ–8ŠÞiÔ·ˆr‰+ïeï%Þ×G‡9½ºŸr¶‹ï ¾ïŠ¿àÖoGÚ{‘”ý¯—ý…çgýîmFýƒCúoÕãù—ü!”œz™W¼nôÙèá½Ü¯yÃ4½øSðÒ?)ð‡¸žÀq诉äI¿ ù­Ñ³£WòpïêÁÏž‡}‰ûb÷AžkÙgá/Ûså`GṚt噡w-ø©”ƒÒÃýµ‡¸`âxзx2ÞY{x_ãÙ>÷9ž‘?Îùž?¡ ý€—qã%^«ˆ^îŽkWì½ìo½ÌËÞÕÈþ_½øûòöŽ@¾^Éqi½è;½èg3õ#÷I¬OÞóÜ»„âk3ž¯Ø—2o&ÕqO³»QôÈI¯rO྇}nçÆdÎYI—ÅŸ$ô‹ÉÌgÉÜG%½H¹Ü¯$±ßJ"þLrsÑ—|3÷§è_’ÛpÛ:þ⻣Ðó7÷¥èõ“>çëè$ÎS’•ûHîQ“à÷IÛ+ÅÏ$â¯%ßÊýftqLFv%N1÷Éè9’_£=ìë“×øLÁ&™8NÉyÐü¥0ϧï#…ýgÊ«“âS})_ð÷")èSÐs¤D¯)ãè·3ôþ”“Ù&£/MîË}-~y“ÇÐ>[¨ýÜÇ59 þL‡nú-ÿñJü=üE§².¥B÷{zì9¸ïõõW½>üü^‰G‡Ÿ5ßC¢ßçÑ<áÛ¤ò|øóôïØGy\ĸë!¾ù‰‘†=~qÄÓ„þÞг:ß`Üg2ß ÏibÇK\EÿjèØÁïeÐcÀÏÅôçFÿ“*ÏϼèÇï´1íã\åÏ#½Hÿ~úBäy2òGÜwùÑ»úCqÜxÞ†´7r8yBß‘>ñòënAn'’ß™ù%4oÝéøM_Íx|ºÐs¤sï”^Á|…ß• îkÒ‰_Ž]Nq3ˆÿsÔž ôü·‚‡ëŒ2ðH¾2>R¹™¬“™ƒô]æ3¤K5d]ԙíDO&v™ÄåËÄï&ûÑLü®gŽR9™•Ÿ‘Ï8ç|•AüµŒŸ”f²Îeâo-s‰èÎįa&ï2ÿõ>¡~Ë\K»&©?3±ƒÎ\D9/Pq3[S©øž‘ ¿±{É(¥_ÜÐÿ2|AÏ•ÿŒÌ«á3ëk&q:2‰o›ù0t®T»3—küfZù>Ô.üðf>O{¦À?ì3SùŽø:™øuÍ< ßÞ#-#ÝË÷øIÊDî³ÚˆÎ¬»”ŸEœ…¬¾âsñ¬³îS½YƒU_vYQjo–CüË-9ÈZ,¾eE¨YÏÏ|ž¼fùD_V&õîS{³¾=ÙM¨ÿ(ßש¿³Þ¿²ˆ/“}Ú‘=DxÙ½ ëÉmñl²~ ]_Rï5ð½Nõd¯;3ùx ¹_ñ›E?gqþÊ$nbf®ð2ˆ[šÉ:‰Ÿ›L?ãä ßVg-§©ðñaøv'õsžÌÂfV_•—5>:à7ñܲlô/þe²ô 独UN6÷’ÙØ+f^ö(øy\õd]Ù•â_ÎU*'g(ü>¯vç´Q99øÁÏ&ÎH6z‹ìó¢+»’ï¾ß²?Õï9í$Ç9W‰9-)· ð*ð¸GÎa¼äð.gé¸P¾èÈ!Î^ã'‡÷ô9¢/ç1ÉuöRôÙkUöË’ÛlÎ]Ù…ÐA|”âæ< ö䌤3ùžxÔÙÛáçðìIä·€ßýÄ_©×ÿë‡ûàûrð±«ÍžNÊøÊÆ>{ø]ÉŽÀ_zv.ü^L¿ç&ëælÆY:r…^8óWæìQ2yÿ’Ù9æ}G&þ'2y“}kf4òØŠù9Ïø™qAü öÿÜCd4gýâÞ0#™ù6GìˆèÉøˆï²îý¬vgdROåÿ*#ê;ÆõÊû‰ï>û ö?ψO‘¤|÷4ëÆí¬ +ÿ™.³.e}xzœ|¿‘ïЛdcý}•ðÿæ¥ÐúòýÕŒñÝþ$þcÖx敱ÌÄÈà'èoì­3o§CÿçÀß@7ñ3ˆ¿šIœí /ûÞg¦5½”óÃcìטGýÜ7øëÙ—ýÊ~j4û7ìÚü•ª7øWÞge>€ýqx)ìǰï$Žªÿ=èa}óÿÍ~uûÍ‹ÐÙ‡}ö—é¯rË ]Ñì+Ñ/¥ßB=Û8gäRþ2ö¿ ho$íLaÏ~8ôn‡sUÚ$ÎïÄß¼·|ç„çÙ‡—°oÇ>Ð÷z $“Ê{êdÆWê\Þ› G²ýóˆoúîŸ}¯ˆ?¾(Ê= ¾ú*ù¾=úâ¦Î@Oó4ú¥JêÍP»®èo®ã vU)GH±—LáÞ4%O|JÁ>8åKÑ™ºJõ§z•¦¼Æw $ÉYèç.¡wš‰Ñ‚ÿ‹Þô€èË’ÄϤ}à7ç^ù÷b÷šDüZ/ò–Ì»‹¤:ô èÉ’Ð%íA÷žøšÊû‡ü ¤b§™ŠýN*ûþTü¥|$¾¦Ô©ÜÞ3¥ðN,%WíNÁŽ2õ5ú9Jô§$…{óÔ‡©;kþ¾|H±WòÆ÷6òÀþÄ·Dåøn=©è•SOB7öi¾âS*ö¾k%§!}^ ÷)ÇUO úëä虯’¿C¿ú7òüýE<ˆdî©’9W&×£gæ=vÒ\úí1ôê_ãß*é-RüË&}‹þy<ýŽÿï}Ü ¿ Ý?…ôõîµ<ÄÍH¼È}v‰í¹O›‹ÝÀwÜÿUa1‘û4âð¸y¿àÆ^ÇÍ»×3Ü?ò~Îý÷sðÑC|QOäôîÏjÉ["ör‰¼ïòŒá^ãì[ÐÏ{y7ëåqå>‹¸BIØÕzyÇîÙÎpц{®®Ü»ðʳ€{«Ü«|Ý¡ïroz÷2„ûìÛ¼Øázy÷ãÝÍýïú=ìƒ¼Ø y?%íÀ=S1tßνhìž°wwáþ½÷9Ä9òL¤?yOšxz?à^ò.ú»Ç¹àNÕ“KÜ»¼¡ÂË»_õåò>)ïIÍïùØynàÝÊâän`?·áêÛp£¾Ë]íÜpNýÿ­èÜ€Ýyþ»‚óÐÏç­V?lÀ}>ïò;¨?ò‰oœO|òü÷Ôžü¥¢'Ÿý}qxóðG•{ŒsÛ·¼ŸÏYGJ<éœ÷ák¾{8š8·ã2‹ólÖËœ#ú ?ëð˜O²WsŽI…ÿÑÂÏå}Q~¯sj„—ƒ=PÎVÎiÄ‘ËÆoGvH9ćÊá¾*§ˆsØ:Ê]K¿‡ô Üû^Ñ †ÞW³'ø})ñ³.P?z„ì³”ß9ÃN>ç~èžß.A/÷ 9øsÏYüÎåüÈþ*gåá'%gí/ïuÚÍ{òœÝÐïÞYåb'ƒ1÷fõo.þYrkþÊåiî;¢7ýHÞ¢'ïfõKÞñ'oŒÚ‘Ç=Mþ­¢'ÿ6ÕŸËwí)·˜qu·ä8»ýÜÍ’›œ±o9éê—Ü›Ôþ\Îѹ¼çÏ%\.öιĩÍýA|Êëœ?¥ròˆÏžß†ñ´Gôä%¨ó.2Ž›0^z3þгçñN/¨Ú›?qü™Ò wªü w1þ¸ÍMåägŠù3·C¯ðíʾ±ïÎî oèÊÅÿ~ž“~ÀlöáùéïSæ£6ÌCì'òÏ1¿ìÆïWîø‹œ8äîÆ¡ß/ wy蕈¯“ó4óH€~{Fý˜ûrEüëÜ>ÌŸ£Àÿ‘”s[ÎAú¹èr_`oƸÉFï²:Bzë=è“Ð'd}Ïy÷$ã´óÔ'Ì_1®»p®ý’òˆœõ;xœ—2 ÄïŒ>¬Sœ§ýï«ÓëÑàï$£#ø]9's^É`’Áýgº‰{¦zÎ…ÿpî+ä|…Ÿ.qÏÍÿw_^Áïç¾ûß´Pœà.œ{±‡Kû‰û’¬×=¹¿Íå÷/HkY¿—²n÷ã¾"¯¾÷¤Aî'žà>»ù ö{w£À~#ýÎËijLÿˆó>öÁWRüP¦§ÃŸ8î_ˆ÷篡}Ø‹ûá³?“{¨‹œÿ‰[–Åyyûçæwß_œ_oþˆR׊¯©Ø'ø°—ð½Íyú7åûöª¾¶¢7…8)¼+Nþ »¿87â!û7çvÕç‰ýónì‘Ù§8y7㨼wrŒà÷–ŽlÒÐ{ÞÙ:ñ›ïÄnÔI|8'qáœCìûíÄã²sÿî¡ßø·°ã¯ÖÖEô[Ôë©5Iß[yÿeð>ÊøYßKH;h\XQýÖTŽ…ûFë3–ïTùMõŸÂfÜ<&áwµ+Î+:ãoWýqkÅŸì&bˆ{Íý~ÔrÕ¿®Bxë–)?*CåFó2f¿Ú?¶è©J£ cý~ñoý­êÿèXð™×£ˆ¿MüÛ˜‚ãð߇=}ö»qœC¸OˆÇþ3{ð„{$G¦câ§9¨ßMèÌüY*:ð«eÂ.ÒŒ©-׊–—Å ñb­kU¿õ}gy_í¶rž³òþÈÀîÃØ"<Ûý*ÏàË€ï‚ r€½›¿còr¹h‹\ _2¸Ï³]¥rm¼›²÷¶Sä¥òmÄí2Я¼ã4¾‘œÙ°ó2¸ç6°o0ˆ÷kàÇÒÀ^Äø„zð¯a'¯¿6ì÷íØ§Û^¿l¥ÜÔó宾õ/õ‡•÷:ÖÍúÝè¬~1^Þð ýµõ7•g=KùŒoc?ýƒ>ÆŠžÓú(ýÈ{8«Cü²¾ Ì>ÅÀOç>p?ne_me]²Ž$]¤ÔB¼U+þó¬Ï‹/Ö­´ï+ÊãÞÆØKÿàOðÐ>Þ“Úæé;÷@†¡ß Þ+Ø÷¼÷³á'ÉÆºgë…Ó@¯dð¾Ý˜}7Ó®»Cü}Yy÷m-Pû¬;ïžO{°+² ·çɼ]åZ°µ0ÿš«Ä~ïLW© Ìï&â€&Ìý §ùŽ÷×fæ—ÞÅÇwd]á>.ôžßÄü‘€ž+}cþEâ±?‰#Žg\‚Úo}ñ‡ÈG¯»YüùPxQo‰žhô„Ñë»ÞgÅD’â×&ûû(ôGë± ‰-º×ŸRþzü¬ç½Žûáuè7Öñ¾}=úšõøÕ‰Æ¿Gþ-£~b=Å>%š÷Ñð;šqÅzÅ;‡ucôÝZü­}JßEbýï‰/‰¢+²+)÷Øm…ÏýáÌ‹áõ[8íÃçô„«ð'µò{áÉ}Hܘ°jGû5ijXÍûUøU^1^õ/G¹œùkyOÕ·¼‹äwyŽ~_ÙLõ¯ÈWþÞ­Î_ø“;¨ÿÚÓGíÃïoöüaø3Ã^2~®YBþ>Ñ>“öo¿"X·"rH]’ÇpæÏpÆq÷Åá÷‹á¼gÿ?¡ü}DôU½ת‘S¯m":"/ñ»[í_‹þu]sö]ø3Z÷ŒèX‹}L$û™Öȃ*/‚8µø1ˆ îVÄ^}ñ ð£âgñ×Ã{©¾0æÏ°ÇIiçšõðñ7ñ?ŒwMáø£ OR?†ã5û–pÞ‹EpO~^ýÎ9'œu'  aw«]a¼§  ]ƒÄ×55Èc¾ðV3NWá÷eõ.•·ºTüZÓOr»z°ø´?/«ñ¿¸ªX¿¯DÎV¡_o û_y«˜WVm£>â¯æýêæû5M©—usõ³à?"úW±~¬*—­Æþe ~YWq¯²2 òV.cV}/0ŽVà_~vJ+iÏ*Þ¿¯&nÏjìÏÖàÿn ûÈ0ât®ÆŸÁjöc«9/¯z¾ÀÇU´gU‘~_þ< ;Ê0Þ9…aov?ãy]³Š~C¯¾æOÆ+ò¶˜r𧆞"|ã/$øWÇþ2œsWø¯Èá—˜Ä|X¼rÞd>àZ8òÁ}^xhüàw$ÂÊüŠ}E8ç§ðDä˜ý[8~:Ã9¯E4aœ±>EÎQy‘‡õ]$÷¼k9¯F²®®}Nüä=êZîMõLô¿qŒþ*’¸J‘àóW•?¢ˆW%ØiE\Ãxç½Uó~ëUÄ,Úÿ>ó‰…réçóTø¸ýx8ïðÃ9߆odœó.*‚ø[œ—"ð ÁûßüçEàG&b°ÚAŠ]Qã.¿™ŸAÏLø…_°HÖéHö瑉ðï1щÞ)ýP$úêµ¼sZÛN¿¯ÅOÂÚzæaÞ×­{J|[ÏýÄzÞƒ®g~_gß×ýÆ9÷ öÇÕ¾(üÇDñŽ:Šò£ÞâœEê]QÌãQìŸÖçJÞ¢ØwEU{£NpÇÞ#šú¢Ñ#DÍP{¢ð{µVü[^r=ñ¸×³¾®@7þÌÖó.$j7ô¡Œz_|ˆæ½w4ûõ˜¶ê—Ö‹üÄàG=?N±¼§ŠåÝclKáÅ®½±øQí¥úcÙÿÇÒq”Ë<7Txqœ#â±ßŒ3ë»8ü†Äó2~šà¸7Ù‡²oŠ'l<÷§qí(?n±¼ïˆåþ&y‹c¿~>ýAü<ñ!?¾ñ'E<~øâKćxì6âq;Ù'GQï»´;˜¸ü2úì?cÙÆý±/‹ŽXâÕÆ^ï_Õ·€v÷V»â{Á·3ðÿ8 7è»xä ¡½êI˜ >&¬MØãšþQjÈù‚õÉ´½ŒYô˜Ð››¾FÃzi² bfÞ¥›?ÓñÙ„žÉô›äÞüúô#–úÎrè5cwc¹óíµÜ ¹°ÌS?Y8[8›§Ðž>úÞŒ½¹)å"æ~gÿmF^Ì/ñ;òiæ|izYô%`‡ib^ŒGŸš€ÿet&Œ%EŸwyg¾‰Çî%óXïùX÷æÒoè#*8§±Ï2ÝþwœïЗ™ÖA/zA~ãØ$0ß&pž1áÏ9ûýö© ˆÞ„TNû¤øÍО ¾rÉ>.ž}x<óEþ¯âèXüÿÅ>‹œ»ó2Æëdæ§•ó†ê‹Å¾*?vqáŒ+î?ãRDwþm¯œSªÜ8'zTÞkÅ/Fɽ]<úåøŒwîOãYOâþe!¯qåÔÃ>=¾=óú ¸=ŒÛLÆÝÿ—ôöŒq/0Ÿ0oÅy™›8æÉ¸OùÝÎ<К}û–xô™ñ}Có빇ù‰{âø$øÿ®¸Ð~Šóbz³8Γq¬Sq—){ÎxüV‡üä& &GÊ{°îÐ×$ ‡Løžu=‰û6SuhŸÀþø(&ôÀfÊ5³o3ãØÃ:K{ÍÜ_›‡©3í6ãOÇŒšafúÛŒ?_Ó÷¢Ëü*õâgÆÌ>ÖÌzcvS>çÆ°±ÿ«¿æQ”ƒÿ3ïl̼Ï4P{Løo6sbžÍT­~0e£Ÿ1•³.'ÀŸ'Ù'qn6áŸÔÄ9ÛÄú`й íŸÇ~e€øg"nŽé(ú_Þ‡êIøŠýa©Ú@œ©¾×„ªÞK'Ô€w+úbî;âëTnÂö̇ ìóð‡“À9?ñžÀ>ÏĹÝ4ýÊ4ö™¬O&ÆéUò­ð…ó„‰ûs3ñ!$_&ìŒLœ—ÍœKLÄå3}C? _01›À_~7wç{ΣfôæÇàÿ! 3ü6?=ø›6ãGÙrµÊ ¥æ/Ä_ËíÜSrmÉ~ûjK¼Úm),»%Þ5ZÎ*ߊG+þ¼¬Ø)Z+¸?£_­¹Ã/¢õ1~÷qÿ…ßvkƒÚaeý4nã^¯-÷!÷qï‚=xÈ?­ÁyÞèÄ}ûYãÑkLá>ˆwØqzŒÜß<É=÷³Æ3”}„ÿ ¿YÆêéªz­'Iñ`ýœû9ì÷¬?A'~¯V´ûsèFý3Ig…î}¸oÂO¡A<¿]þYŒ(õ“þÞ@Ïol¤ØÉ™Ü¾AŠ=¶A¼@c'üÀ¬m÷øŸ5BþçñdÜÈ=^èÞñî·ÑYÍÜÃrOgÅÏ•ÕA:‚ß±G²BN¸·°â/ÞŠœ['ã_Ï:KíµºB÷­Ðy/ôpn1æ#OÄS0ð_i°^ÄQ1ˆ;d´€üÛ†îÉ âØè îgŒ™È)t”»Žúy'a0œûlÜØn¡<ÎÆiê9êOä;£<ô@úƒwç3ƒý·Áû/ãÚCüFó“ùÓºwo£qhÃÞζ¸R|³·PûìØ9ØÞᾓ8xö;ÁcÚñûd‡6ì# Ö³ÝÖ¿Có)~¸¬;èçßioh¼‡øÏ{%+뉕w3ÖS¡ûPæ#ü8[ßdüàgÔŠÿnãú14< ?ï&N‘J»n;"ƒûJƒyÚzŽòÙ/Äe1nBNz0>‡þ-ÜçòÞÊÊ=…•sµ•8RÖ(ÿ¡VôæÖLðñûiý¸žñzåpÏc}ØÅøÂ±õMìDðle}³²3¸ÍgVô¬Vü‰YW2$ОиMD®Cq)Ðï×Ҟ¡qMù³îÛ­Ä µâ‡ÞšÎïœW¯Ø}pŸj½ ç!+þ,¼7 éqBö=füb™Øg›™Ì9¬‹vôD¼Ûµà¿ËÂzeEÊ9Åü<)úYSö]è«L°?áþ$!’ý÷J&ö&Þ“šÐKšˆkeÆï©™ó¡™{;3ç"3÷Ffì·ÌömGØ„üéïPùfìwÌÜ/™ ø~vhÊ~…û0ö È_ÄʾÏÆ8H#ŸøVüLZñ?gý„ïð#fÅ®Îú3ó}hŠЃqˆ?G+q üاðkbÜÉ>>±¡}óqŒwIyh|'>ØÞg`_náyÃvY¿Û9ÿÚW°^ ÷´OS?ÛÙ¿Ù}*׎ݹ=Œw€vâÕ9Ð_:f“¢‡pàÂA'þŒØÙ:>'?ŸàCRâ¬9¢±SÃ.ÜN:G5ßa—çH ýBô;ÛŠ^'ö2Îg±Cžlj>Ôù ©ú"§—”xÆN‹øæÄžÚy ûÖ*}wÅ¿.ëûºÄkp¡t-T9®pöo.ôÅîž*ÇÍ÷îWU¾û~'ŽÌ¿åªw!)ûZ7~ðÝØ•ºGª=nôøîgÕ÷;êG7ãÃ}Zõ&âßÍ}˜›¸{î=êG÷K”;šr±Ãvó¾Äͺ讕ü¸7‚ŸÂ÷KhßRò±ÛuqnsroêÄîЉ?VçiÒyⳓyÖ‰ÞØeÀßú¿Í.â´;WS.þØgºxWîâ|âÂO™›¸î§á7ç57ö .âÙ¹‰cä&n‡»7ëû?w˜äÁý¸èqÅî:ôN3–ß±+ps®qoGŽÐ'¸±£uß ò]د»ñ7}%×&¾Gïå:)<ñ\Ì«.äÉ•LŠ2ûdë± E®pò]ÈùfÊ'¾›‹ñáâý·‹ûorãúFòåz |ì2Ýøƒw‡üTÿBû\”¿]÷!.Ö}÷1.ü^©÷ ®Å/~Tݼ/p· ]Ì/.Þÿ»°Spqoç:D9¬®íŒgÞÿ¸ÇBÈ¿3ö¦nôUî…ô~,Üø¿t³¯¾’bÇèb?éâý”«˜þŠ »ïÔœ!äè{#Ô~§[rà`p„â¸üÍï­Ô~G@üp,c}`?hÇ»=BåÙ_à|RCj°®œà\Ã; ;v»vâ­Øñ;lg`ç=½7ëv¶vÞQÛé?;÷vâhÛ±Ó±chÇo³½ëSOì›yokû‡s~7mø±²c—nçÊÎ=¼ýaÖ?Ö ;ú)G7øvüæÞÊñ"ïvŠoŽ/õ»³3ó ~Äqw>$ùwr¿ëà]§?JŽ3⌺xïà"¾Ð½À•¸©è]])Œ‡µ¡ù 9ú84îù¿±.âÕ»¸×raO褜Ø:g‘†#/—Å/Gò‚žuÀƾÒvˆþC_`„ó0þ)ìÌ;ö—áçûлsûð¿3Žç¨—{z'ö@N/é&ÖïÖ¬ùî˜êu¿Ü?xq9CqhœØ58½à³¾8¸¶ã§ÁÞ{yî¯lNÆEÈŽ›x¦F)ç@ìÓ­ó9¯ÍáüÂ~Ûd?¼}ìpð^ç|²£¿ýñ”®ìCñ Cz0æ£Iè\Î98=Vìx¬ØÍYã»æüÒ/~È~—xVâÐYcÿËùÂ:„ý3vBVüÚY~aÏ‚þ:?ÿ¢ŸCï<°_1ð_a`Ÿx%NïI Þuùÿ×ù!¤Å~ÃFÜ*ƒýßc_HoJ=øY7ðwb°o³…ô:èlô›s‘ ?l¶{ Ÿû ƒó‚õlè¼…üq_mt„Nìµ9ïáïÆº ¾r_eyþreùˆó s&öâ–ŪÏüýÉþÑLüB3ïBçX3q˜Í¼c0_ÇýM/î+°/IÀ®Éä Ý 7÷¢×/¾=t>†^öÅWÎÇèŸ-ÄѲ¬zâ XˆkmAÏl±P/÷o–78ÏÙÂz`튜ágÁÊû| û-K:|E¯Àİ`Ÿkစ÷ZÞS[¯é“Ñ#a‡fáýŽ…}€…wfÞ+›xÏg"®•é/앸ŸKÙgß)~5ù¬CWî'±c4 ¡Ü[ùžu.žwñØ;ćîŸÙOÅ(ûãhìÖs®]ïÀ>}hÔpÁ¡÷vQcTÞ:æÍõò7פI³«þ+¾i“&m[þ—^ýÜòUÿ%×ÿ÷÷ßÏ-*þKÿo”ÿ¡¬^´jIäÿß$¼&ÿÓµµn“ÆbfÏœÂ¿ÍÆ}åÿ)Ó'Ì ý?~Æô‡BÿOž6gòÿë÷Ù¡ÿçLœ61ôÿÜ9S¦…þŸ4eúØÿgüäÿ‹ÄæëV/_ùÿ/šZ†­‰\¾vùšÕÿ£«Íÿx;öàЙcþÆÖ8¦Æ>a¯ÒŸ-éˆ,åò ~`¸à¾þƒá¢ü±="xœYøãû|ƒò'¾/xR¤à‡ºÿ¡·…?yµò^&xj;ÁSw Úbá?ròg4<£JðÌÇ„?ó_á?Z¡üÙÅ‚çL<ç¼ðçnþ¼‰Ê|ŒàÇ¿üDšðŸ!ü'¿QþSŸ ^à¼p ðþÓå/м¸§àÅ…ÿìZá?×UùK; ^ºWðóË…¿ìFá/{Eù/ì¼bà•×eµðW=®ü5³¯¹$8¬DøáÓ„þ»ò#¼6Gðº±Â_÷ƒð×û•$8f¨à˜/„ë~ÜÝÊOè'8á`SœðÍwßS¾­“òmo(ßþ‚ò]ד¾(<÷Bá%^+#ø­Záí›/¼·¯Öïû/ >P&øúî?…ÿî&忟/øàÁþ™Â¯Pù Ã7|%øCð þ¡O•ÿñaÁ‡M‚Ü)ü# Â?­üc‘‚ß*øø>áºJøŸuPþm±Kð—‹„¢•ðOÔ)ÿëJÁßÌüÍ¿Âÿ¶\ø'g*ÿÔÂOüýáÿ0Qø?ü¬üÓß þÉ'øçáÂÿùkáŸñ*ÿ¬Cð¯ÿzDø¿™…®ò¿]ðïï þc­ð/tþ…·•ñuÁ-|©ð/½"ü¿+ÿòÁÿ6üoU#þMkÄÿ i“Æü®úKðÕ%‚›MÝ«ô¼ð›oTþµÙ‚[ŒÜâá·L~«Êo}¯àÖŸ ¾Þ)ü6w ¿ÍQå·=$¸]¬à{ ÿƃ¿iòۯܡ“à{…ßq¹ð;ݨüέwÞ)øÖ…Âïrð»T+¿ÛÁÝg î~Iø·• ¿Ç4åß‘£ü^c•ßëGå÷ªü¾_(¿ŸKùý­‚ô<à#áŒþÝw(P7Áƒ&ü!·ÈÊúªàûž|ÿõ¿ÿEá{Zù#ž<ò*Á#· Ôláú[ùþ!xt¡à1“…?æ¬ðÇæ*|ºà £O8)ü‰)ŸtŸò'<ù˜à)†ð¾Kø¬üiõ‚‰<½»ð§¿#üáÊt…àY7 žõšðg/þœ6ÊŸ×Bð¼€àÇžþãW ÿñmʲLðüé‚ç_þSEÂ_0EùOüôO‚ŸÉþ¢„¿è;å?{Bðs‰‚— þ’ãÂ_jSþ²ÁË{ ^þ ÑÂ_õ–òW¯TþšöÊ_³Gùá/ ŽX$8²¥ð#k…¿v¾ò×ÏU.¼è‹þS¿Çþ&8._pü}ÿ³ð2•oö ¶ lùJøVð!Ê·l?"Øa¾³A¿»ßÓw‰‘‚=]„çÙ'<ï*å§´%Ý%¼ÔÅÂ󵞿¹`¥àôyÂOÿWøÊÏ*œ=Upö9áçl~îDåçœÿ½à iÂß8\ø¿V~ág‚‹‚7 þ¦£Â/6+¿4VðæÛo~_øek…_ÞUù[: nœnþK·.þ¶vÂßöŠò+w®Z ¸úáWW ¿æ1å×>*¸ö/Áu%Âß1Mø;Î+ÿÅ_¿”-ø¿Ó°Ò„¿Ë¯üÝI‚_*øÕÏ…ÿšSø{îVþÞ¾‚÷üFœðßì)ü7*ß~Áo¯¼¿“ð÷¿!üË•ÿîs‚ßk-ø½Â¡ð^«üú¦‚ë· Î~ð’ðJ•¨@ðG þè¬ð?Îþá±Ê?:RðÑo’,üc÷ ÿØÊÿô˜àϬ‚?ï'üÏ?þñÊ?±^ðWÝu@ø_‡ ÿ›[”ò&Á'_üÝ៺^ø§^Tþ5‚|Bðé«„z›ðš­ü3ÓŸùCð/…Â?;YøgUþo§ŸË|~”ðÏŸþï)Ê¿àüç ÁþECøÝ¥ü¿{ þ»^ð?Q¿|›ð/¿Ó˜_ßä­F¸¾é ÁWÝlQúZ#~ýÕK•ßüÁ×´|M@ø×>)üW+¿å?‚[• ¾n†ð¯» üÖEÊo“'ø†ñ‚oøIøm3…ßîå·¬ßÛªßoé­ßo ê»ÎÑÊï!¸ë­‚»î~·•ÂïÞ^ù=nÜãeÁ·/~ÏVÂïY«ü^•‚{ÏÜû²ðï,~Ÿ™Êï÷°à~çß•/üþ„ßÿgå<%ønŸà{† ÿž¯„?È£ü!vÁ÷|ïá5 ÿ¾;•?ìvÁÃÞ<#øÅ–±Vø/=©ü]sïúGð+eÂß=Cø»ÿTþk¿ Þ“/øõñÂý'áïÍTþ›©‚ß&ø­¯„¿/QøoVþþ‚üŽIøïÞ)üwƒÊÿ=Á#p«ð?Ø'üúUÊox^ð‡mø²ð-þG­”¸™àÕ‚Ìþ‘ËÂ?Z®üc›XðñsÂÿTzâúϤ'®ÿb´à/N þRzâúÒןž¸þëÏãü­ôÄõßJO\RzâúS1‚¿¿]ð÷Ò×ÿ =qýÒ×ÿÔAðO¯ þYzâú3Òן‘ž¸þìÁ¿>%ø7é‰ë“ž¸þœôÄõ¿?*ø÷¿ÿ!=qýé‰ë/HO\ñŒà¿²7Çÿ—JO\ÿ·ôÄõ—½‚ÿ½Wð¿Ò›HOl*=qð꾂›K¼v¿ðZIïlýlã÷Áë[ ¾^zß`é}ƒ7Hïl×Dp»-‚o”Þ7x£ô¾Á›¤÷ ¶/Üa’àÒû;Jïì$½o°óHÁ¿|«ô¾Á.Òû»Hïìö‰àîVÁ·Iï¼Mzß`é}ƒ=× ¾£›à;¿—ôÀÁÞÒûÜ$¸ÏnÁ}Ÿ~?郃ý¤ö¯<à Á¥”>8x·ôÁÁAô‡àÁÒ‡H"}ppè‚ïK|¿ôÁÁû¥“>88Â-xä=‚GJeÿ郃£{ ]/xŒôÂÁ±Ò ÇJ/ÿ¦à +O¼Yø¥N’~88ùiÁSZž"ýpða釃S¥NûGð#›O—~88]úáà¬ñÊŸ%}pp¶ôÁÁ9ÒçÝ/xÞ ÁI|\zàà“ë»ù ‚Ÿ’8ø”ôÀÁÒŸŽüLgÁÏH\$=pp±ôÀÁçnüÜË‚—H\ÚRøK¥.Û.xù\ÁË¥®8¸jо[õ›àÕÒ×H\#=p0"Ui¤ô¿ÁHéƒk¥ÿ ®· Ž 8Júß`´ô¿Áéƒq=ǽ'8^úß`‚ô¿Á„}Ê7ïly^°Uúß Uúß !ýoÐþ”`G3ÁéƒNéƒNéƒî‹‚‹{¤ÿ z¤ÿ z¥ÿ &g N-8Eúß`ªô¿AŸô¿AÿÁþϧKÿÌþ7˜!ýo0ëCÁÙ1‚s¤ÿ æHÿÌ•þ7˜¿Zð†Ž‚7HÿÜ(ýo°@úß`Ñu‚‹vÞ$ýo°Xúß`±ô¿ÁÒ Á›¼Yúß`™ô¿Áréƒ[& ÞrFðVéƒÛ¤ÿ n“þ7Xùàª$ÁÕÒÿ«¥ÿ ÖHÿ¬µ®ë+¸Núßàéƒ;¥ÿ ¾ÔUðKû¿,ýop—ô¿Á]Òÿwïü곂_“þ7øšô¿Á=Òÿ÷>.ø¦‚ßþ7ø¦ô¿Á7¥ÿ îû]ðÛ‚÷?$üý¿ÿ€ôÁÁwý‚ß)ø½o…ÿ~²ðJ?¬¿Gpý'‚ƒÒ¤6H?<ôàÖ þXúáàÇÒK?<ú‚àOnü‰ôÃÁcÒK?üìZÁŸÕþ\úáàÒ¿~8xb³à¯ü•ôÃÁ¯¥~#ýpðä8Á'O þNúáà)釃§¤þð¥àÝ‚OK?<-ýpð'釃gâÿÒKð/ÒÏJ?üUúáà¹Î‚Ͻ)øÂKÂûóýþ÷}ÿ÷?úýé{ƒ—¥ï ^–¾·¡Iô ¥âsCÓEJÅï=Ó˜^%~7\}«ð¯ß®Þ'üfÒÏ74ïp›RõGCó=¿FýÒpÍó¿VýÒpí.á·Pÿ4´X$üÒã7´¬Sý­Ôo ­ž~+õ_ÃuÍ„ßZý×Ðzžð[«Zÿ+üë¥ïoh3Sõ·Qÿ6´¹(üÔÏ 7 ¿­ú¹¡í9á·S7´Û üvºh¸ñgÕÓ8áß”%ü›$ 7~{ÉCC{ŸðÛK.: ~Ý4tôªþŽ’—†NC„ßIrÓÐé3áß"¹ièÍ…ßG÷ }ª„ßW÷ ýš¨þ~’÷†~¿ëQáõ—¼7ô/^ä~ÀTá Ð}GÃÀ_…w÷$áÝ'¼»ÏïÝ4 #úé¤aЬû†!#TïTáùFø÷Þ/ü{“„?T÷$ C?þ}º/i¸Ï)üûtoÒpÿQÕ?¬¿ð‡Y„?ì°ð‡÷þݧ4ŒˆþÝ«4Œì)ü‘º_iµNõzWøtþÂ`¿ðÔ=LÃèN­û˜†Ñ{…?F÷2 coTýc— ìná»AøãžþxÝ×4Œß)ü º·i˜°PøtÓ0±ZõOj&üI Òvá?ÔTø]Vý“g ²îy&_þÝ÷üŸ6î=¬ç»ãxäœO±*Ô’ˆ’Ãæ8¢åМbéH‘tphN-YÒÖrH"ÇDˆXsXˆÖrÚçý‰Éi΢Y´–C 7=¯]÷½®û]¿]û>êõõß¶×ëýSÎ#ÈwÞ‚w.ÃwÆß„A¤F<Å»Ð)—õxz!õYù®ýð®qx×BüÈÞøQôEjÔ ü(z#5º~4ý‘Mþ˜ëx·®x·(¼[þsz%5¶#~,ý’›÷!~|òLJãÇ_ÀO°ÀO˜ƒŸH¥&æâÝ飔û,¼;½”štŠüÉ&øÉøÉ'ð_4Å{Ð[)¼ý•šR?…Kyzï™÷ª÷š„÷JÇ{Óo)Ÿêxz.å³ïCߥ|+È÷‰÷Û÷{…Ÿê‚ŸF¦¦mÆO£SþCñþôb* ü€büôøékñÓÇÏ /S}ðôf*ð~&ý™ êI~P,>è~–=~Ö2|0½š ¾Š¡_S!‘øÐKä†YãÂàÂ7‡¾MÍ™‹›Cï¦æšáæÒ¿©yÁäÍËÁ‡›âÃgâóñ•ÿÚùîs~3ü|ú95ÿGüz:µ°ï·Ð¿0¿¨.~Ñübú;µø>‚OELÄGÐ穯öi€tÃG¦â#_ã—Ðó©¨ÏðQô}*ê~)½Ÿúzù_'á¿.ÁGÁGoÀ/£TËžàcèUL<>†~P-H~¬>v>öþü zCµ"¿‚þP­ì†_I¨V-!U~ugüê|œÏãèUÜ/<ÿŽ~QÅ›“?›÷‹Ïïi‹_‚_Kï¨ÖžÆ¯£Tëfà×ÑCªõY¼_B|‚>á~CC|"ý¤JôÄ'ÒSªuðé+U’;ùIûñ›jà7¥á6Ó_ªÍopÉô˜*9—LŸ©¶ºà¶nÁm-ÃmsÆm§ßTÛy¿íôœjÇ üúNµs ¹;‹ð)ýð)ßáS ñ»î“›êˆO¥U©wð»éEÕžîäï‰Æï¹ŽOëŠO‹Âï¥/U{Åï£7Uûá÷ÑŸªýŠüôøôp|úü üAzUu0~Ue´ÆgгªCäÊÆ6ÁÀ>ÿžþUe6ÂgÒêÌ#øècÕcòxàdàáN£§UÇöâWÇ‹?No«~ÜEþø¬‘ø¬ø¬Wøô¹êäpüIz]u²Š~We&?;Ÿ]Œ?=z-þ ½¯:óŸCÿ«r¾ÅçЫŸî’Ÿë€ÏÅçÞÂÿlÏ£VyKñyôÄêlüYúbun1ùç.áÏ[ãÏ/ÄŸüzdu±þ"}²ºxÿ‹9^µ!_ãU^Lñ2¯é›•>‰Ï§wVùÓðùôÏêÒQò/7À_öÆ_ÎÄÿZ…^Z]™Œ¿B?­ já è©ÕÕqä_MÃ_3À_sÃ_KÅ_§¿V×Ëñ7è±ÕmøôÙêæ_äÿ6 ÿ[þ·?ñ·†àoÓs«Ûëð·é»ÕOðwè½ÕÝ8òï>ÄßsÂß[…¿wÿ6ùzàÄàÜÄ?¤7W…¶ä.ÁàuÆ?ŠÀ?^Dþc/²ÂÍÇÑ·«'¸'³qOòp´Åñ~ÅôïêiKÜSzxõÌŸ¼gY¼_I|ÉT|É1üŸôóª´¾”ž^•ÆÿE_¯Êj“[æŽ/Û^ÿ|<þ=¾z±ÿ‚>_½I¯¯^m'ÿÕK|¹ ¾| ¾¼ ÿ7}¿ªø_Aï¯*žá_¿éOþ›µø7Eø·ýðo¿«ôbÀ.@ îWz©Æ>@ª­˜Â';©þ[e¾vÇFã oàktÅ×d? 5¿Â×dG µ:âk±'Ú È¯­ðFðFáx£ ø:ì ÄØ oÌÞ@ŒsñuÙH½ȯˆ¯—¯o‚¯€oÀAÇ7d— }ñëò¼±Ïgð¼‰Ï›²S¦x¿¦ì¤Yu|3v Ò|®yÎdÎd®;iñœ÷jÉžAZnÆ·d× ”k:oš€7-Æ·€oÍÞAZÇã[³{6ì¤íJrÛÞÅ™9àÌbqf·ø½v8 öbq ׎]„´ïD^åÿ†}ÿy ßÁßa!Þ’ý„X^Ä[±£«¹x+öòáÏäZ·Á[ã­ÂdŠïÈÎB:NÇwdo!šá;±»Î~äw>Š·i€·ñÆÛdâ»°ÇÛ:x[vb{ß•}†Ø’o7o—†ïf€ïæ†ïÎnCº³Û{Wœ=û é‘Ln2\ÏaüÞžIøžâØuˆã@¼ãz¼ã|/öâÔ—\§8¼ÓC|ïÞøÞ«ð}ØHŸÛø¾ìA¤o ¾/»éwümñ/Á\€ÿ¤3¾?{é¿ߟ݈ °Â`?"ç‘?ð<~~Ðlü <ü`v%2¤~ûrÿ);Úœü¡ø¡YøaMðæâÙŸˆóøáìPd¸'~8{q|—Úxw¼K:þ³xWv*âú9Þ•½Š¸¾Ád·"£F’?j;~ÔKühüè-ø1ìYdL)Þ]‹¸%âÝØ·Èç?¶?~ìZüØ"ü¸~øñì^düjüxö/2¡~;™¸œü‰·ðîÝñîÑx÷øIìcd² ~2;™ü+þ ö2âñ!ù ð ?Å?%ïÉŽF<Ïâ½ØÓˆW(Þ‹]øòÜ'›ç¾&<÷cW#Sñ|*û™æÅïŸö=ïã_—÷÷÷ÀûgàØÝÈôšøéìodú>ü v82ã-ynøÀ]øÀ üÌQø ö9´ÄNGf ÇÏb¯#ÁÉ.Á‡ ƇlÀ‡ãCÙñHØÇø0ö<ö?›]Ìq"ÎJüœ»ø¹ø¹±øyì}dÞM|8» _Šgÿ#_^!~'üüüüKøÖø…ì‚dá—ø…ìƒdQ{ü"vB²8ŒüÅyøˆ6øˆ`|ÄOø¯ØId |$;"‰<‰_žH¢“å‡:Š_Úÿõ!žG³/’èÉIV=Å­f§$«×ãW³W’o“ׇÿ®7.žý’ă‹gÇ$kzàÖ°g’µ×qëlqë¢pë pëÙ7IÂG¼_;'IÐø ì$±¹‰óð‰çñ-ðgã“ØAIR.~{(Ù„ßÄ.J6Ÿ"?¹9>9Ÿœ…ßÒ¿•½”lõÁoe7%Ûêã·±Ÿ’í_¿=¿£6~‡;~G:~'»*I©†Oa_%)»ñ)ì¬d×ßä§r+©Ûñ©¯ð»]ð{Ø_ÉžMø´Oqiì°do¹{¹×•}ýqû¸Û•}Eøýì³$½>–¤ßÇ`¯%{’{»^9x ŸÁ}¯dDã±ã’CWñ‡ÙsÉáHüav]ò}>ù™ÜÿJæ|&wÀòƒ%þH;òÌÁa÷%GÍðGÙɱYäãNXŽ€?ν°ÏÆÿÈ.L²šâ³Ø‡IÖqü vbr²ù'¹'–“ßãOqW,§<ðÙìÇ$ûþ4;29=š=™œÙCþîŽ%Ç ŸÃý±äTàbg&¹ŸásÙ›Iî üÏìÎ$o(ùyÜ'K^ þ,wÊrvþ{49÷;¾ò,íýg<þ<û4¹ð€ü‹Ü1ËÅ•ø‹Ü3Ë/xÅnMÔ2¼b¿&b‡vl¢—¯¹w–üNø|îž%ÿþ’Ù ™{h¹|ÿ+wÑrÅœü+ÜEË•<|÷ÑRŒ¿DþÕÓøkÜM˵økÜOË î¥åfCþù­:ø[ìçäöD~ßmî¦åŽ!ï{‡ûi¹“†¿Ë®Nî¾Æßc_'÷vâï±³“û/ÉyÀ}µP*ŒÉ«à^\*2𯹗×îø7ìåÍ^ü[öƒòv,þ-;Bm’Ì'wåºÚÈ)|r_®«½ªôº:ûBmèŒ7dg¨ Kñ5ØꚃnóÉý¹®ù¾ÖZ\mö‡ºv!Έ¢6Z3b¨¹KׯËqÆÜ§ëºÝqõØ'êzKy¿zìu}|ýH|ƒÅä6ÈÇ7´Æ7äž]7TøFìuãvøÆìuãsø&ìuÓÖä7åÞ]7ÍÁ7ãî]7›‰oÎÞQ7?7a÷¨M¦áMØ?êGÈoÉ}¼né…oɼþ .Þ”]¤6„7e©[ÕÄ·b'©[#¿5wôºõ[|îéu›]ø¶ì'uÛr¼;Jm¶oÆžR›ÿE¾÷öÚ" oÁݽn7ߞݥn¿ßžý¥îð Þò[r-¹Ç×VN8+îòµÕ=܇ì2µµ=Þš}¦¶¾‰ÿˆ»}ݱ ¹¹Ûׯà;q¿¯;Eà;³ãÔoÞSÛ|‰·aש»œ'ß–û~m†·åÎ_wmƒ·cï©í‚ðvì>u·ønì?uwò»ó=Ú¾ ÞžïÐöGñ=Ø…êžõð=هꞇñìDµc-òùÞí¸ß‹ïнÆãØj§T¼;RÝ{4¾÷N|Ÿmä÷áûtßø¾|Ï€î[öÞWù‚•Z~A!žï—ø§•_Åbd9ÁÆ2ÐÆÒ§ê×± ñŸ9Ðwf˜oÈ€oÀùÔÅ­ª ñõ ñ6(ôÝãʉtÕï›ùçûpýŸ‡uB‚ævùÔÿ?í=Ã34´Êkûx†yvñ y÷s•߯óï ó›á[åÚÄÍ?Ð×|Œoˆ¿o¨¹«W€¯wX•«ïä=;ðÝŸÚóýÑTùñvn³}Í=gšwëjnçàdïàÔÍñÝßwíeîn>;Ô7äý|¾ÿuußTÿ×»†½ &·J`íYžÞÓ=§úVýÃýïT~yPå_ÿÉ®ˆ×@ýfPortfolio/R/0000755000176200001440000000000013202316756012603 5ustar liggesusersfPortfolio/R/solve-Ripop.R0000644000176200001440000001073612323217770015153 0ustar liggesusers # 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 Description. 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: # solveRipop Portfolio interface to solver Ripop # .ripopArguments Returns arguments for solver ################################################################################ solveRipop <- function(data, spec, constraints) { # A function implemented by Diethelm Wuertz # Description: # Portfolio interface to solver Ripop # Example: # data <- 100 * LPP2005.RET[, 1:6] # spec <- portfolioSpec() # setTargetReturn(spec) <- mean(data) # setSolver(spec) <- "solveRipop" # solveRipop(data, spec) # FUNCTION: # Transform Data: Data <- portfolioData(data, spec) data <- getSeries(Data) nAssets <- getNAssets(Data) # Compile Arguments for Solver: args <- .ripopArguments(data, spec, constraints) # Optimize Portfolio: ans <- try(ipopQP( objective = args$objective, par.lower = args$par.lower, par.upper = args$par.upper, eqA = args$eqA, eqA.bound = args$eqA.bound, ineqA = args$ineqA, ineqA.lower = args$ineqA.lower, ineqA.upper = args$ineqA.upper, control = list()), silent = TRUE) if (inherits(ans, "try-error")) { # When Optimization Failed: ans <- list( opt = list(dvec=NA, Dmat=NULL), objective = 1e99, status = 1, message = "error", weights = rep(0, times=nAssets)) run <- "failed" } else { # Set Tiny Weights to Zero: ans$weights <- .checkWeights(ans$solution) ans$solution <- NULL run <- "passed" } ans$solver <- "solveRipop" ans$solution <- ans$weights attr(ans$weights, "invest") <- sum(ans$weights) attr(ans$opt, "args") <- args # Class: class(ans) <- c("solver", "list") # Return Value: ans } # ----------------------------------------------------------------------------- .ripopArguments <- function(data, spec, constraints) { # A function implemented by Diethelm Wuertz # Description: # Returns ipopQP conform arguments for the solver # FUNCTION: # Data and Constraints as S4 Objects: Data <- portfolioData(data) data <- getSeries(Data) nAssets <- getNAssets(Data) Sigma <- getSigma(Data) # Box Constraints: par.lower <- minWConstraints(data, spec, constraints) par.upper <- maxWConstraints(data, spec, constraints) # Set up Equality Constraints: eqsumW <- eqsumWConstraints(data, spec, constraints) eqA <- eqsumW[, -1] eqA.bound <- eqsumW[, 1] # Set up Inequality Constraints: minsumW <- minsumWConstraints(data, spec, constraints) maxsumW <- maxsumWConstraints(data, spec, constraints) ineqA <- NULL if(!is.null(minsumW)) ineqA = rbind(ineqA, minsumW[, -1]) if(!is.null(maxsumW)) ineqA = rbind(ineqA, maxsumW[, -1]) ineqA.lower <- ineqA.upper <- NULL if(!is.null(minsumW)) { ineqA.lower = c(ineqA.lower, +minsumW[, 1]) ineqA.upper = c(ineqA.upper, rep(sum(par.upper), times=length(minsumW[, 1]))) } if(!is.null(maxsumW)) { ineqA.lower = c(ineqA.lower, rep(sum(par.lower), times=length(maxsumW[, 1]))) ineqA.upper = c(ineqA.upper, maxsumW[, 1]) } # Return Value: list( objective = list(dvec = rep(0, nAssets), Dmat = Sigma), par.lower = par.lower, par.upper = par.upper, eqA = eqA, eqA.bound = eqA.bound , ineqA = ineqA, ineqA.lower = ineqA.lower, ineqA.upper = ineqA.upper ) } ################################################################################ fPortfolio/R/frontier-getPoints.R0000644000176200001440000000664512323217770016542 0ustar liggesusers # 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 Description. 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: # frontierPoints Extracts the efficient frontier from a 'fPORTFOLO' object ################################################################################ frontierPoints <- function(object, frontier = c("both", "lower", "upper"), return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE) { # A function implemented by Diethelm Wuertz # Description: # Extracts the efficient frontier from a 'fPORTFOLO' object # Arguments: # object - an object of S4 class fPORTFOLIO as returned by the # functions fooPortfolio(). # frontier - a character string, which part of the frontier # should be extracted # return, rrisk - a character string, which return or risk # measures should be selected # auto - a logical, allows auto selection for the return and # risk measure depending on # FUNCTION: # Settings: frontier = match.arg(frontier) # Match Arguments: return = match.arg(return) risk = match.arg(risk) # Get Efficient Frontier: if (auto) { Type = getType(object) Estimator = getEstimator(object) if (Type == "MV") risk = "Cov" if (Type == "MV" & Estimator != "covEstimator") risk = "Sigma" if (Type == "QLPM") risk = "Sigma" if (Type == "CVaR") risk = "CVaR" } if (is.vector(getTargetRisk(object@portfolio))) { targetRisk = getTargetRisk(object@portfolio)[risk] targetReturn = getTargetReturn(object@portfolio)[return] } else { targetRisk = getTargetRisk(object@portfolio)[, risk] targetReturn = getTargetReturn(object@portfolio)[, return] } # Extract Whole Frontier: ans = cbind(Risk = targetRisk, Return = targetReturn) # Extract "upper|lower" Part of Frontier: if(frontier == "upper"){ index = 1:length(ans[, 1]) test = c(-1, diff(ans[, 1])) index = index[test > 0] ans = ans[index, ] } else if(frontier == "lower"){ index = 1:length(ans[, 1]) test = c(-1, diff(ans[, 1])) index = index[test < 0] if (length(index) == 1) { ans = matrix(ans[index, ], ncol = 2) } else { ans = ans[index, ] } } # Add Colnames: colnames(ans) = c("targetRisk", "targetReturn") rownames(ans) = as.character(1:NROW(ans)) attr(ans, "control") <- c(targetRisk = risk, targetReturn = return, auto = as.character(auto)) # Return Value: ans } ################################################################################ fPortfolio/R/object-portfolioSpec.R0000644000176200001440000001630112620132672017017 0ustar liggesusers ################################################################################ # FUNCTION: DESCRIPTION: # portfolioSpec Returns an object of class fPFOLIOSPEC # .checkWeights Checks and forces tiny weights to zero # .checkSpecVsConstraints Checks if spec and constraints do match # .checkTargetReturn Checks if target Return is defined ################################################################################ portfolioSpec <- function( model = list( type = "MV", # Alt: "LPM", "CVaR", "LPM" optimize = "minRisk", # Alt: "maxReturn" estimator = "covEstimator", # Alt: "shrinkEstimator", tailRisk = list(), ## I think the LPM a=1 we don't need. ## params = list(alpha = 0.05, a = 1)), ## This is CVaR's alpha it should not be removed here, it is ## ... required in any situation when it comes to the calculation ## ... of VaR and CVaR Risk params = list(alpha = 0.05)), portfolio = list( ## What is the here the meaning of NULL and what makes the ## difference here between NULL and NA? ## ... NULL means, None of the three weights = NULL, targetReturn = NULL, targetRisk = NULL, # Risk Free rate ... riskFreeRate = 0, nFrontierPoints = 50, ## Should not be prined if NA status = NA), optim = list( solver = "solveRquadprog", # Alt: "solveRdonlp2" # "solveRsolnp" # "solveRglpk", # "solveRsymphony" # "solveRsocp" ... objective = c( "portfolioObjective", "portfolioReturn", "portfolioRisk"), ## Should not be printed if type != MV and solver != quadprog options = list(meq = 2), control = list(), trace = FALSE), messages = list( messages = FALSE, note = ""), ampl = list( ampl = FALSE, project = "ampl", solver = "ipopt", protocol = FALSE, trace = FALSE) ) { # A function implemented by Diethelm Wuertz # Description: # Specifies a portfolio to be optimized # Example: # portfolioSpec(portfolio = list(targetReturn = 1.5)) # FUNCTION: # Compose Checklists: # model.type = c("MV", "CVaR") # model.estimator.mean = "mean" # model.estimator.cov = c("cov", "mcd", "Mcd", "shrink") # optim.solver = c("solveRquadprog", "solveRdonlp2", "solveRglpk") # optim.trace = FALSE # Check Arguments: # stopifnot(model$type %in% model.type) # stopifnot(model$estimator[1] %in% model.estimator.mean) # stopifnot(model$estimator[2] %in% model.estimator.cov) # stopifnot(optim$solver %in% optim.solver) # Model Slot: Model = list( type = "MV", optimize = "minRisk", estimator = "covEstimator", tailRisk = NULL, params = list()) model$type = model$type[1] Model[(Names <- names(model))] <- model # Portfolio Slot: Portfolio = list( weights = NULL, targetReturn = NULL, targetRisk = NULL, riskFreeRate = 0, nFrontierPoints = 50, status = 0) Portfolio[(Names <- names(portfolio))] <- portfolio # Check Portfolio - weights, targetReturn, targetRisk: # ... at least two of them must be set to NULL! checkPortfolio = 0 if(!is.null(portfolio$weights)) checkPortfolio = checkPortfolio + 1 if(!is.null(portfolio$targetReturn)) checkPortfolio = checkPortfolio + 1 stopifnot(checkPortfolio <= 1) # Optim Slot: Optim = list( solver = "solveRquadprog", objective = NULL, options = list(meq = 2), control = list(), trace = FALSE) Optim[(Names <- names(optim))] <- optim # Messages Slot: Messages = list( list = NULL) Messages[(Names <- names(messages))] <- messages # Return Value: new("fPFOLIOSPEC", model = Model, portfolio = Portfolio, optim = Optim, messages = messages, ampl = ampl) } # ------------------------------------------------------------------------------ .checkSpec <- function(spec) { # A function implemented by Diethelm Wuertz # Description: # Checks for specification conflicts # FUNCTION: if (getSolver(spec) == "solveRglpk" && getType(spec) == "MV") { # Error Message: cat("\nExecution stopped:") cat("\n Specification conflict for portfolio solver and type.") cat("\nSpec Information:") cat("\n Solver=", getSolver(spec), ",", " type = ", getType(spec), ".", sep = "") cat("\n") stop(call. = FALSE, show.error.messages = "\n returned from Rmetrics") } if (getSolver(spec) == "solveRsymphony" && getType(spec) == "MV") { # Error Message: cat("\nExecution stopped:") cat("\n Specification conflict for portfolio solver and type.") cat("\nSpec Information:") cat("\n Solver=", getSolver(spec), ",", "type = ", getType(spec), ".", sep = "") cat("\n") stop(call. = FALSE, show.error.messages = "\n returned from Rmetrics") } # Return Value: "ok" } # ------------------------------------------------------------------------------ .checkWeights <- function(weights, eps = sqrt(.Machine$double.eps)) { # A function implemented by Diethelm Wuertz # Description: # Sets tiny weights to zero # Arguments: # weights - a numeric vector of portfolio weights # eps - a numeric value, lower bounds of weigths # FUNCTOION: # Check: for(i in 1:length(weights)) { if(abs(weights[i]) < eps) weights[i] = 0 } # Return Value: weights } # ------------------------------------------------------------------------------ .checkSpecVsConstraints <- function(spec, constraints) { # A function implemented by Diethelm Wuertz # Description: # Check if spec and constraints do match # Arguments: # spec - portfolio specification as fPFOLIOSPEC object # constraints - as charvec or as fPFOLIOSPEC object # FUNCTOION: # Check: if(class(constraints) == "fPFOLIOCON") constraints = constraints@stringConstraints if(any(constraints == "Short")) { stopifnot(getSolver(spec) == "solveRshortExact") } # Return Value: invisible() } # ------------------------------------------------------------------------------ .checkTargetReturn <- function(spec) { # A function implemented by Diethelm Wuertz # Description: # Check if target Return is defined # Arguments: # spec - specification object # FUNCTOION: # Check: targetReturn = getTargetReturn(spec) if(is.null(targetReturn)) stop("The target return is not available") # Return Value: invisible(targetReturn) } ################################################################################ fPortfolio/R/frontier-weightPlots.R0000644000176200001440000002473312323217770017075 0ustar liggesusers # 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 Description. 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: # .weightsWheel Adds a pie of weights to frontier plot # .attributesWheel Adds a pie of attributes to frontier plot # FUNCTION: DESCRIPTION: # .notStackedWeightsPlot Plots the not stacked weights of potfolio # .addlegend Adds legend to sliders ################################################################################ .weightsWheel <- function(object, piePos = NULL, pieR = NULL, pieOffset = NULL, ...) { # A function implemented by Oliver Greshake and Diethelm Wuertz # Description: # Adds a pie plot of weights for MV and CVaR Portfolios # Arguments: # Details: # The default settings are: # piePos - Position of tangency Portfolio # pieR - 10% of the Risk Range: diff(range(targetRisk(object)))/10 # FUNCTION: # Extract Coordinates: p = par()$usr/15 dx = p[2]-p[1] dy = p[4]-p[3] # Pie Position: if(is.null(piePos)) { Data = getSeries(object) Spec = getSpec(object) Constraints = getConstraints(object) tg = getTargetReturn(tangencyPortfolio(Data, Spec, Constraints)) ef = as.vector(getTargetReturn(object)) piePos = which(diff(sign(ef-tg)) > 0) } # Pie Radius: if(is.null(pieR)) { pieR = c(1, 1) } # Pie Offset: if(is.null(pieOffset)) { pieOffset = c(-2*dx, 0) } # Plot Circle: weights = getWeights(object)[piePos, ] nWeights = length(weights) Sign = rep("+", nWeights) Sign[(1:nWeights)[weights < 0]] = "-" x = getTargetRisk(object)[piePos] y = getTargetReturn(object)[piePos] phi = seq(0, 2*pi, length = 360) X = x + pieOffset[1] + pieR[1] * sin(phi) * dx Y = y + pieOffset[2] + pieR[2] * cos(phi) * dy lines(X, Y) # Add Center Point: points(x, y, col = "red", pch = 19, cex = 1.5) # Add Arrow: lines(c(x, x+pieOffset[1]), c(y, y+pieOffset[2])) # Add Color Wheel: psi = 2*pi*c(0, cumsum(abs(weights)/sum(abs(weights)))) for (i in 1 : length(weights) ) { # Plotting Only Pie pieces with Weights > 5% if(psi[i+1]-psi[i] > 0.05 * 2*pi) { Psi = psi[i] + (0:100) * (psi[i+1]-psi[i])/100 polyX = x + pieOffset[1] + pieR[1]*c(0, sin(Psi), 0) * dx polyY = y + pieOffset[2] + pieR[2]*c(0, cos(Psi), 0) * dy polygon(polyX, polyY, col = rainbow(nWeights)[i]) # Adding the Asset Signs: text(x + pieOffset[1] + 0.75*pieR[1]* sin(Psi[51]) * dx, y + pieOffset[2] + 0.75*pieR[2]* cos(Psi[51]) * dy, col = "white", Sign[i]) } } # Return Value: invisible() } # ------------------------------------------------------------------------------ .attributesWheel <- function(object, piePos = NULL, pieR = NULL, pieOffset = NULL, ...) { # A function implemented by Oliver Greshake and Diethelm Wuertz # Description: # Adds a pie plot of the weights # Arguments: # Details: # The default settings are: # piePos - Position of tangency Portfolio # pieR - 10% of the Risk Range: diff(range(targetRisk(object)))/10 # FUNCTION: # Extraction coordinates p = par()$usr/15 dx = p[2]-p[1] dy = p[4]-p[3] # Pie Position: if(is.null(piePos)) { Data = getSeries(object) Spec = getSpec(object) Constraints = getConstraints(object) tg = getTargetReturn(tangencyPortfolio(Data, Spec, Constraints)) ef = as.vector(getTargetReturn(object)) piePos = which(diff(sign(ef-tg)) > 0) } # Pie Radius: if(is.null(pieR)) { pieR = c(1, 1) } # Pie Offset: if(is.null(pieOffset)) { pieOffset = c(2*dx, 0) } # Plot Circle - Get weighted Returns: weights = getWeights(object) dim = dim(weights) returns = getStatistics(object)$mu weightedReturns = NULL for(i in 1:dim[2]){ nextWeightedReturns = weights[,i]*returns[i] weightedReturns = cbind(weightedReturns, nextWeightedReturns) } colnames(weightedReturns) = colnames(weights) weightedReturns = weightedReturns[piePos, ] nWeights = length(weightedReturns) Sign = rep("+", times = nWeights) Sign[(1:nWeights)[weightedReturns < 0]] = "-" x = getTargetRisk(object)[piePos] y = getTargetReturn(object)[piePos] phi = seq(0, 2*pi, length = 360) X = x + pieOffset[1] + pieR[1] * sin(phi) * dx Y = y + pieOffset[2] + pieR[2] * cos(phi) * dy lines(X, Y) # Add Center Point: points(x, y, col = "red", pch = 19, cex = 1.5) # Add Arrow: lines(c(x, x+pieOffset[1]), c(y, y+pieOffset[2])) # Add Color Wheel: psi = 2*pi*c(0, cumsum(abs(weightedReturns)/sum(abs(weightedReturns)))) for (i in 1 : nWeights) { # Plotting Only Pie pieces with Weights > 5% if(psi[i+1]-psi[i] > 0.05 * 2*pi) { Psi = psi[i] + (0:100) * (psi[i+1]-psi[i])/100 polyX = x + pieOffset[1] + pieR[1]*c(0, sin(Psi), 0) * dx polyY = y + pieOffset[2] + pieR[2]*c(0, cos(Psi), 0) * dy polygon(polyX, polyY, col = rainbow(nWeights)[i]) # Adding the Asset Signs: text(x + pieOffset[1] + 0.75*pieR[1]* sin(Psi[51]) * dx, y + pieOffset[2] + 0.75*pieR[2]* cos(Psi[51]) * dy, col = "white", Sign[i]) } } # Return Value: invisible() } #------------------------------------------------------------------------------- .notStackedWeightsPlot <- function(object, col = NULL) { # A function implemented by Oliver Greshake # Description: # Arguments: # object - an object of class 'fPORTFOLIO' # col - a color palette, by default the rainbow palette # FUNCTION: # Settings: weights = getWeights(object) N = ncol(weights) targetRisk = getTargetRisk(object)[, 1] targetReturn = getTargetReturn(object)[, 1] nSigma = length(targetRisk) # Select Colors if not specified ... if (is.null(col)) col = rainbow(N) # Plot first asset ... plot(weights[, 1], col = col[1], type = "l", ylim = c(min(weights), max(weights)), xaxt = "n", xlab = "", ylab = "") # Add vertical Line at minimum risk: minIndex = which.min(targetRisk) minRisk = min(targetRisk) # Big Point at minimum risk for first asset ... points(x = minIndex, y = weights[minIndex, 1], col = col[1], pch = 19, xaxt = "n", yaxt = "n", cex = 2) # ... and all other assets for(i in 1:(N-1)){ points(weights[, i+1], col = col[i+1], type = "l", xaxt = "n", yaxt = "n") points(x = minIndex, y = weights[minIndex, i+1], col = col[i+1], pch = 19, xaxt = "n", yaxt = "n", cex = 2) } grid() abline(h = 0, col = "grey", lty = 3) lines(x = c(minIndex, minIndex), y = c(0, 1), col = "black", lwd = 2) # Add Tailored Labels - 6 may be a good Number ... nLabels = 6 M = c(0, ( 1: (nSigma %/% nLabels) ) ) * nLabels + 1 text(minIndex, 1, "Min Risk", pos = 4) minRiskValue = as.character(signif(minRisk, 3)) minReturnValue = as.character(signif(targetReturn[minIndex], 3)) mtext(minRiskValue, side = 1, at = minIndex, cex = 0.7) mtext(minReturnValue, side = 3, line = 0.5, at = minIndex, cex = 0.7) # Take a reasonable number of significant digits to plot, e.g. 2 ... nPrecision = 3 axis(1, at = M, labels = signif(targetRisk[M], nPrecision)) axis(3, at = M, labels = signif(targetReturn[M], nPrecision)) # Add Axis Labels and Title: mtext("Target Risk", side = 1, line = 2, cex = 0.7) mtext("Target Return", side = 3, line = 2, cex = 0.7) mtext("Weight", side = 2, line = 2, cex = 0.7) # Add Info: mtext(paste(getType(object), "|", getSolver(object)), side = 4, adj = 0, col = "grey", cex = 0.7) # Add Title: mtext("Weights", adj = 0, line = 2.5, font = 2, cex = 0.8) # Return Value: invisible() } #------------------------------------------------------------------------------- .addlegend <- function(object, control = list()) { # A function implemented by Oliver Greshake # Description: # Adds a perdefined legend to sliders # Arguments: # object - an object of class 'fPORTFOLIO' # control - control list for colors and symbols # FUNCTION: # Settings: dim = getNAssets(object) namesSingleAsset = names(object@data$statistics$mu) # Check if polt is used for forntierSlider... if(control$sliderFlag == "frontier"){ legendtext = c("Efficient Frontier", "Sharpe Ratio", "Minimum Variance", "Tangency Portfolio", "Market Portfolio", "Equal Weights", namesSingleAsset) color = c("black", control$sharpeRatio.col, control$minvariance.col, control$tangency.col, control$cml.col, control$equalWeights.col, control$singleAsset.col) sym = c(19, 19, control$minvariance.pch, control$tangency.pch, control$cml.pch, control$equalWeights.pch, rep(control$singleAsset.pch, times = dim)) # ... else is the weightsSlider case } else { legendtext = c("Efficient Frontier", "Minimum Variance", "Tangency Portfolio", namesSingleAsset) color = c("black", control$minvariance.col, control$tangency.col, control$singleAsset.col) sym = c(19, control$minvariance.pch, control$tangency.pch, rep(control$singleAsset.pch, times = dim)) } # Adding Legend: legend("topleft", legend = legendtext, col = color, pch = sym, cex = .8, bty = "n") # Return Value: invisible() } ################################################################################ fPortfolio/R/mathprogQP-ampl.R0000644000176200001440000001313612323217770015742 0ustar liggesusers # 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: # ramplQP Rmetrics Interface for AMPL QP solvers # amplQP Convenience wrapper for AMPL QP solvers # amplQPControl AMPL QP control parameter list ############################################################################### ramplQP <- function(objective, lower=0, upper=1, linCons, control=list()) { # A function implemented by Diethelm Wuertz # Description: # Rmetrics Interface for AMPL QP solvers # Arguments: # objective - list(dvec=NULL, Dmat = NULL) # FUNCTION: # Control List: ctrl <- amplQPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl # Controls: project <- control$project solver <- control$solver inf <- control$inf trace <- control$trace # General Settings: dvec <- objective$dvec Dmat <- objective$Dmat obj <- rbind(dvec, Dmat) # Box Constraints: replicate <- function(x, n) if(length(x) == 1) rep(x, n) else x n <- ncol(obj) x_L <- replicate(lower, n) x_U <- replicate(upper, n) x_L[is.infinite(x_L)] <- inf*sign(x_L[is.infinite(x_L)]) x_U[is.infinite(x_U)] <- inf*sign(x_U[is.infinite(x_U)]) # Linear Constraints: A <- linCons[[1]] m <- nrow(A) b_L <- replicate(linCons[[2]], m) b_U <- replicate(linCons[[3]], m) b_L[is.infinite(b_L)] <- inf*sign(b_L[is.infinite(b_L)]) b_U[is.infinite(b_U)] <- inf*sign(b_U[is.infinite(b_U)]) # Optimize Portfolio: value <- amplQP(objective, x_L, x_U, A, b_L, b_U, control) # Return Value: value } ############################################################################### amplQP <- function( objective=list(dvec=NULL, Dmat=NULL), x_L=NULL, x_U=NULL, A=NULL, b_L=NULL, b_U=NULL, control=list(), ...) { # A function implemented by Diethelm Wuertz # Description: # Convenience wrapper for AMPL QP solvers # Arguments: # objective - list(dvec=NULL, Dmat = NULL) # FUNCTION: # Control List: ctrl <- amplQPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl # Control Parameters: project <- control$project solver <- control$solver inf <- control$inf trace <- control$trace # Solver Settings: c <- objective$dvec F <- objective$Dmat obj <- rbind(c, F) n <- ncol(obj) m <- nrow(A) # Assign QP Model: .qpAssign(project, c, F, x_L, x_U, A, b_L, b_U , trace=FALSE) # Run AMPL: command <- paste("ampl -t -vs", paste(project, "run", sep=".")) solve <- system(command, intern=TRUE) # Read AMPL Output File: file <- paste(project, "txt", sep = ".") out <- scan(file, what=character(0), sep="\n", quiet=TRUE) # Get Weights: Index <- (grep(";", out) - 1)[1] splits <- strsplit(paste(out[2:Index], collapse=" "), " ")[[1]] solution <- as.numeric(splits[splits != ""])[seq(2, 2*n, by=2)] Index <- as.numeric(splits[splits != ""])[seq(1, 2*n, by=2)] solution[Index] <- solution # Get Status: status <- strsplit(out[grep("solve_result", out)], split=" ") statusCode <- status[[1]][3] statusMessage <- status[[2]][3] # Get Solver Message: Index <- grep("solve_message", out):length(out) message <- out[Index] # Version: version <- system(paste(solver, "-v"), intern=TRUE) # Compose Results into a List: objective <- (c %*% solution + 0.5 * solution %*% F %*% solution)[[1, 1]] # Return Value: model <- capture.output(amplModelShow(project)) run <- capture.output(amplRunShow(project)) value <- list( opt = list(solve=solve, model=model, run=run, out=out), solution = solution, objective = objective, status = statusCode, message = statusMessage, solver = paste("AMPL", solver), version = version) class(value) <- c("solver", "list") value } # ----------------------------------------------------------------------------- amplQPControl <- function(solver="ipopt", project="ampl", inf=1e12, trace=FALSE) { # A function implemented by Diethelm Wuertz # Description: # Returns AMPL QP control parameter list # FUNCTION: # Control Parameter: control <- list(solver=solver, project=project, inf=inf, trace=trace) # Return Value: control } ############################################################################### fPortfolio/R/mathprogLP-glpk.R0000644000176200001440000001026012323217770015734 0ustar liggesusers # 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: # rglpkLP Rmetrics Interface for Rglpk LP solver # glpkLP Convenience wrapper for Rglpk LP solver # glpkLPControl Rglpk LP control parameter list ############################################################################### rglpkLP <- function(objective, lower=0, upper=1, linCons, control=list()) { # A function implemented by Diethelm Wuertz # Description: # Convenience wrapper for solver Rglpk_solve_LP() # Argments: # objective - numeric vector. # lwer, upper - box constraints # linCons - linear constraints: mat, lower and upper # control - control list # FUNCTION: # Update Control List: ctrl <- glpkLPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl # Box Constraints: N <- length(objective) if(length(lower) == 1) { par.lower = rep(lower, N) } else { par.lower = lower } if(length(upper) == 1) { par.upper = rep(upper, N) } else { par.upper = upper } bounds <- list( lower = list(ind = 1:N, val = par.lower), upper = list(ind = 1:N, val = par.upper)) # Linear Constraints: mat <- linCons[[1]] M <- nrow(mat) lower <- as.vector(linCons[[2]]) upper <- as.vector(linCons[[3]]) if(length(lower) == 1) { lower <- rep(lower, M) } else { lower <- lower } if(length(upper) == 1) { upper <- rep(upper, M) } else { upper <- upper } eqIndex <- which(lower == upper) ineqIndex <- which(lower != upper) eqA <- mat[eqIndex, ] ineqA <- mat[ineqIndex, ] mat <- rbind(eqA, ineqA, ineqA) dir <- c(rep("==", length(eqIndex)), rep("<=", length(ineqIndex)), rep(">=", length(ineqIndex))) rhs <- c(upper[eqIndex], upper[ineqIndex], lower[ineqIndex]) mat <- mat[is.finite(rhs), ] dir <- dir[is.finite(rhs)] rhs <- rhs[is.finite(rhs)] # Optimize Portfolio: optim <- glpkLP( obj = objective, mat = mat, dir = dir, rhs = rhs, types = NULL, max = FALSE, bounds = bounds, verbose = control$trace) # Version: version <- paste(packageDescription("Rglpk")[1:3], collapse=" ") # Return Value: value <- list( opt = optim, solution = optim$solution, objective = optim$optimum, status = optim$status, message = "none", solver = paste("R", control$solver), version = version) class(value) <- c("solver", "list") value } # ----------------------------------------------------------------------------- glpkLP <- Rglpk::Rglpk_solve_LP # ----------------------------------------------------------------------------- glpkLPControl <- function(solver = "glpk", project="r", trace=FALSE) { # A function implemented by Diethelm Wuertz # Description: # Returns control parameter list # FUNCTION: # Return Value: list(solver=solver, trace=trace) } ############################################################################### fPortfolio/R/plot-weightsPlots.R0000644000176200001440000005314312323217770016403 0ustar liggesusers # 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 Description. 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: # weightsPlot Plots staggered weights along the frontier # weightedReturnsPlot Plots staggered weighted returns # riskBudgetsPlot Plots general risk budgets # covRiskBudgetsPlot Plots covariance risk budgets # tailRiskBudgetsPlot Plots copulae tail risk budgets ################################################################################ weightsPlot <- function(object, labels=TRUE, col=NULL, title=TRUE, box=TRUE, legend=TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Plots a bar chart of weights along the frontier # Arguments: # object - an object of class 'fPORTFOLIO' # labels - should the graph be automatically labeled? # col - a color palette, by default the rainbow palette # title - should the graph get default title and labels? # legend - should a legend be added to the plot? # box - # ... - arguments passed to the function barplot() # Requires: # fBasics for seqPalette() # FUNCTION: # Check if we have a portfolio frontier ... weights <- getWeights(object@portfolio) if (is.null(dim(weights))) stop("The object is not a set of portfolios along the frontier.") # Use default color if not specified ... Title <- "Weights" if (is.null(col)) col <- seqPalette(getNAssets(object), "Blues") if (sum(c(par()$mfrow, par()$mfcol)) == 4) CEX <- 0.9 else CEX <- 0.7 # Compute Weights: pos.weights <- +0.5 * (abs(weights) + weights) neg.weights <- -0.5 * (abs(weights) - weights) # Define Plot Range: ymax <- max(rowSums(pos.weights)) ymin <- min(rowSums(neg.weights)) range <- ymax - ymin ymax <- ymax + 0.005 * range ymin <- ymin - 0.005 * range dim <- dim(weights) range <- dim[1] xmin <- 0 xmax <- range + 0.2 * range # Create Bar Plots: if (labels) { if(!legend){ barplot(t(pos.weights), col=col, space=0, ylab="", ylim=c(ymin, ymax), border="grey", ...) } else { barplot(t(pos.weights), col=col, space=0, ylab="", xlim=c(xmin, xmax), ylim=c(ymin, ymax), border="grey", ...) legendtext <- names(getStatistics(object)$mu) if(is.null(legendtext)){ for(i in 1:dim[2]){legendtext[i] = paste("Asset", i, sep = " ")} } legend("topright", legend = legendtext, bty = "n", cex=0.7, fill = col) } barplot(t(neg.weights), col=col, space=0, add = TRUE, border="grey", ...) } else { barplot(t(pos.weights), col=col, ...) } # Add Tailored Labels - 6 may be a good Number ... targetRisk <- getTargetRisk(object@portfolio)[, 1] targetReturn <- getTargetReturn(object@portfolio)[, 1] nSigma <- length(targetRisk) nLabels <- 6 M <- c(0, ( 1:(nSigma %/% nLabels) ) ) * nLabels + 1 # Take a reasonable number of significant digits to plot, e.g. 2 ... nSignifDigits = 3 axis(3, at=M, labels=signif(targetRisk[M], nSignifDigits)) axis(1, at=M, labels=signif(targetReturn[M], nSignifDigits)) # Add Axis Labels and Title: if (title) { mtext("Target Risk", side=3, line=2, adj=1, cex=CEX) mtext("Target Return", side=1, line=2, adj=1, cex=CEX) mtext("Weight", side=2, line=2, adj=1, cex=CEX) } # Add Weights 0 and 1 Reference Lines lines(x=c(0, nSigma), c(1, 1), col="grey", lty=3) lines(x=c(0, nSigma), c(0, 0), col="grey", lty=3) # Add vertical Line at minimum risk: minIndex <- which.min(targetRisk) minRisk <- signif(min(targetRisk)) abline(v = minIndex, col="black", lty = 1, lwd = 2) # Add Title: if (title) mtext(Title, adj=0, line=2.5, font=2, cex=CEX+0.1) # Complete to draw Box: if (box) box() # Add Rmetrics - Do not Remove! mtext("Rmetrics", adj=0, side=4, cex=0.7, col="darkgrey") # Return Value: invisible(list(minRisk=minRisk)) } # ------------------------------------------------------------------------------ weightedReturnsPlot <- function(object, labels=TRUE, col=NULL, title=TRUE, box=TRUE, legend=TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Plots weighted returns # Arguments: # object - an object of class 'fPORTFOLIO' # labels - should the graph be automatically labeled? # col - a color palette, by default the rainbow palette # title - should the graph get default title and labels? # legend - should a legend be added to the plot? # FUNCTION: # Check if we have a portfolio frontier ... weights <- getWeights(object@portfolio) if (is.null(dim(weights))) stop("The object is not a set of portfolios along the frontier.") # Use default color if not specified ... Title <- "Weighted Returns" if (is.null(col)) col=seqPalette(getNAssets(object), "Blues") if (sum(c(par()$mfrow, par()$mfcol)) == 4) CEX <- 0.9 else CEX <- 0.7 # Compute Weighted Returns: dim <- dim(weights) returns <- getStatistics(object)$mu weightedReturns <- NULL for(i in 1:dim[2]){ nextWeightedReturns <- weights[,i]*returns[i] weightedReturns <- cbind(weightedReturns, nextWeightedReturns) } colnames(weightedReturns) = colnames(weights) pos.weightedReturns <- +0.5 * (abs(weightedReturns) + weightedReturns) neg.weightedReturns <- -0.5 * (abs(weightedReturns) - weightedReturns) # Define Plot Range: ymax <- max(rowSums(pos.weightedReturns)) ymin <- min(rowSums(neg.weightedReturns)) range <- ymax - ymin ymax <- ymax + 0.005 * range ymin <- ymin - 0.005 * range range <- dim[1] xmin <- 0 xmax <- range + 0.2 * range # Create Bar Plots: if (labels) { if(legend){ barplot(t(pos.weightedReturns), space=0, ylab="", xlim=c(xmin, xmax), ylim=c(ymin, ymax), col=col, border="grey", ...) legendtext <- names(getStatistics(object)$mu) if(is.null(legendtext)){ for(i in 1:dim[2]){legendtext[i] = paste("Asset", i, sep = " ")} } legend("topright", legend = legendtext, bty = "n", cex=0.7, fill = col) } else { barplot(t(pos.weightedReturns), space=0, ylab="", ylim=c(ymin, ymax), col=col, border="grey", ...) } barplot(t(neg.weightedReturns), space=0, add = TRUE, col=col, border="grey", ...) } else { barplot(t(pos.weightedReturns), col=col, ...) } # Add Tailored Labels - 6 may be a good Number ... targetRisk <- getTargetRisk(object@portfolio)[, 1] targetReturn <- getTargetReturn(object@portfolio)[, 1] nSigma <- length(targetRisk) nLabels <- 6 M <- c(0, ( 1: (nSigma %/% nLabels) ) ) * nLabels + 1 # Take a reasonable number of significant digits to plot, e.g. 2 ... nSignifDigits = 3 axis(3, at=M, labels=signif(targetRisk[M], nSignifDigits)) axis(1, at=M, labels=signif(targetReturn[M], nSignifDigits)) # Add Axis Labels and Title: if (title) { mtext("Target Risk", side=3, line=2, adj=1, cex=CEX) mtext("Target Return", side=1, line=2, adj=1, cex=CEX) mtext("Weighted Return", side=2, line=2, adj=1, cex=CEX) } # Add Weights 0 and 1 Reference Lines lines(x=c(0, nSigma), c(1, 1), col="grey", lty=3) lines(x=c(0, nSigma), c(0, 0), col="grey", lty=3) # Add vertical Line at minimum risk: minIndex = which.min(targetRisk) minRisk = signif(min(targetRisk)) abline(v = minIndex, col="black", lty = 1, lwd = 2) # Add Title: if (title) mtext(Title, adj=0, line=2.5, font=2, cex=CEX+0.1) # Complete to draw Box: if (box) box() # Add Rmetrics - Do not Remove! mtext("Rmetrics", adj=0, side=4, cex=0.7, col="darkgrey") # Return Value: invisible() } # ------------------------------------------------------------------------------ covRiskBudgetsPlot <- function(object, labels=TRUE, col=NULL, title = TRUE, box = TRUE, legend = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Plots a bar chart of covariance risk budgets # Arguments: # object - an object of class 'fPORTFOLIO' # labels - should the graph be automatically labeled? # col - a color palette, by default the rainbow palette # title - should the graph get default title and labels? # legend - should a legend be added to the plot? # FUNCTION: # Settings: mtext <- TRUE # Check if we have a portfolio frontier ... weights <- getWeights(object@portfolio) if (is.null(dim(weights))) stop("The object is not a set of portfolios along the frontier.") # Use default color if not specified ... Title <- "Cov Risk Budgets" if (is.null(col)) col <- seqPalette(getNAssets(object), "Blues") if (sum(c(par()$mfrow, par()$mfcol)) == 4) CEX <- 0.9 else CEX <- 0.7 # Compute Covariance Risk Budgets: budgets <- getCovRiskBudgets(object@portfolio) pos.budgets <- +0.5 * (abs(budgets) + budgets) neg.budgets <- -0.5 * (abs(budgets) - budgets) # Define Plot Range: ymax <- max(rowSums(pos.budgets)) ymin <- min(rowSums(neg.budgets)) range <- ymax - ymin ymax <- ymax + 0.005 * range ymin <- ymin - 0.005 * range dim <- dim(budgets) range <- dim[1] xmin <- 0 xmax <- range + 0.2 * range # Create Bar Plots: if (labels) { if(!legend){ barplot(t(pos.budgets), space=0, ylab="", ylim=c(ymin, ymax), col=col, border="grey", ...) } else { legendtext <- names(getStatistics(object)$mu) if(is.null(legendtext)){ for(i in 1:dim[2]){legendtext[i] = paste("Asset", i, sep = " ")} } barplot(t(pos.budgets), space=0, ylab="", xlim=c(xmin, xmax), ylim=c(ymin, ymax), col=col, border="grey", ...) legend("topright", legend = legendtext, bty = "n", cex=0.7, fill = col) } barplot(t(neg.budgets), space=0, add = TRUE, col=col, border="grey", ...) } else { barplot(t(pos.budgets), col=col, ...) } # Add Tailored Labels - 6 may be a good Number ... targetRisk = getTargetRisk(object@portfolio)[, 1] targetReturn = getTargetReturn(object@portfolio)[, 1] nSigma = length(targetRisk) nLabels <- 6 M = c(0, ( 1:(nSigma %/% nLabels) ) ) * nLabels + 1 # Take a reasonable number of significant digits to plot, e.g. 2 ... nSignifDigits = 3 axis(3, at = M, labels=signif(targetRisk[M], nSignifDigits)) axis(1, at = M, labels=signif(targetReturn[M], nSignifDigits)) # Add Axis Labels and Title: if(title) { mtext("Target Risk", side=3, line=2, adj=1, cex=CEX) mtext("Target Return", side=1, line=2, adj=1, cex=CEX) mtext("Cov Risk Budgets", side=2, line=2, adj=1, cex=CEX) } # Add Budgets 0 and 1 Reference Lines lines(x=c(0, nSigma), c(1, 1), col="grey", lty=3) lines(x=c(0, nSigma), c(0, 0), col="grey", lty=3) # Add vertical Line at minimum risk: minIndex = which.min(targetRisk) minRisk = signif(min(targetRisk), 3) abline(v = minIndex, col="black", lty = 1, lwd = 2) # Add Title: if (title) mtext(Title, adj=0, line=2.5, font=2, cex=CEX+0.1) # Complete to draw Box: if (box) box() # Add Rmetrics - Do not Remove! mtext("Rmetrics", adj=0, side=4, cex=0.7, col="darkgrey") # Return Value: invisible() } # ------------------------------------------------------------------------------ tailRiskBudgetsPlot <- function(object, labels=TRUE, col=NULL, title = TRUE, box = TRUE, legend = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Plots a bar chart of tail risk budgets # Arguments: # object - an object of class 'fPORTFOLIO' # labels - should the graph be automatically labeled? # col - a color palette, by default the rainbow palette # title - should the graph get default title and labels? # legend - should a legend be added to the plot? # FUNCTION: # Settings: mtext <- TRUE # Check if we have a portfolio frontier ... weights <- getWeights(object@portfolio) if (is.null(dim(weights))) stop("The object is not a set of portfolios along the frontier.") # Use default color if not specified ... Title <- "Tail Risk Budgets" if (is.null(col)) col <- seqPalette(getNAssets(object), "Blues") if (sum(c(par()$mfrow, par()$mfcol)) == 4) CEX <- 0.9 else CEX <- 0.7 # Check: stop("The tail risk budget plot is not yet implemented") tailRiskMatrix <- getTailRisk(object@portfolio) # Compute Tail Risk Budgets: budgets <- getTailRiskBudgets(object@portfolio) budgets[is.na(budgets)] <- 0 pos.budgets <- +0.5 * (abs(budgets) + budgets) neg.budgets <- -0.5 * (abs(budgets) - budgets) # Define Plot Range: ymax <- max(rowSums(pos.budgets)) ymin <- min(rowSums(neg.budgets)) range <- ymax - ymin ymax <- ymax + 0.005 * range ymin <- ymin - 0.005 * range dim <- dim(budgets) range <- dim[1] xmin <- 0 xmax <- range + 0.2 * range # Create Bar Plots: if(!legend){ barplot(t(pos.budgets), space=0, ylab="", ylim=c(ymin, ymax), col=col, border="grey", ...) } else { legendtext <- names(getStatistics(object)$mu) if(is.null(legendtext)){ for(i in 1:dim[2]){legendtext[i] = paste("Asset", i, sep = " ")} } barplot(t(pos.budgets), space=0, ylab="", xlim=c(xmin, xmax), ylim=c(ymin, ymax), col=col, border="grey", ...) legend("topright", legend=legendtext, bty="n", cex=0.7, fill=col) } barplot(t(neg.budgets), space=0, add=TRUE, col=col, border="grey", ...) # Add Tailored Labels - 6 may be a good Number ... targetRisk <- getTargetRisk(object)[, 1] targetReturn <- getTargetReturn(object)[, 1] nSigma <- length(targetRisk) nLabels <- 6 M <- c(0, ( 1:(nSigma %/% nLabels) ) ) * nLabels + 1 nSignifDigits = 3 axis(3, at=M, labels=signif(targetRisk[M], nSignifDigits)) axis(1, at=M, labels=signif(targetReturn[M], nSignifDigits)) # Add Axis Labels and Title: if (title) { mtext("Target Risk", side=3, line=2, adj=1, cex=CEX) mtext("Target Return", side=1, line=2, adj=1, cex=CEX) mtext("Weight", side=2, line=2, adj=1, cex=CEX) } # Add Budgets 0 and 1 Reference Lines lines(x=c(0, nSigma), c(1, 1), col="grey", lty=3) lines(x=c(0, nSigma), c(0, 0), col="grey", lty=3) # Add vertical Line at minimum risk: minIndex <- which.min(targetRisk) minRisk <- signif(min(targetRisk), 3) abline(v = minIndex, col="black", lty = 1, lwd = 2) # Add Title: if (title) mtext(Title, adj=0, line=2.5, font=2, cex=CEX+0.1) # Complete to draw Box: if (box) box() # Add Rmetrics - Do not Remove! mtext("Rmetrics", adj=0, side=4, cex=0.7, col="darkgrey") # Return Value: invisible() } ################################################################################ riskBudgetsPlot <- function(object, FUN=c("budgetsNormalVAR","budgetsNormalES", "budgetsModifiedVAR","budgetsModifiedES", "budgetsSampleCOV"), labels=TRUE, col=NULL, title = TRUE, mtext = TRUE, box = TRUE, legend = TRUE, ...) { # A function implemented by Diethelm Wuertz # Modified by Venetia Christodoulopoulou 2013-01-22 # Description: # Plots a bar chart of tail risk budgets # Arguments: # object - an object of class 'fPORTFOLIO' # FUN - a character, the function name to compute the risk budgets, e.g. # "budgetsSampleCOV", "budgetsNormalVAR", "budgetsNormalES", # "budgetsModifiedVAR", "budgetsModifiedES" # labels - a logical, should the graph be automatically labeled? # col - a color palette, by default the rainbow palette # title - a logical, should the graph get default title and labels? # By default TRUE. # mtext - a logical, should the margin text be added? # box - a logical, should a box be xdrawn around the plot? # legend - a logical, should a legend be added to the plot? # ... - optional arguments passed to the barplot() function. # FUNCTION: # Extract Settings from the Potfolio Object: data <- getSeries(object@data) mu <- getMu(object) Sigma <- getSigma(object) weights <- getWeights(object@portfolio) alpha <- getAlpha(object@spec) # Plot Decoration: # name<-deparse(substitute(FUN)) FUN2<-match.arg(FUN) if(title)Title<-switch(FUN2,budgetsNormalVAR="Normal VAR Risk Budgets", budgetsNormalES="Normal ES Risk Budgets", budgetsModifiedVAR="Modified VAR Risk Budgets", budgetsModifiedES="Modified ES Risk Budgets", budgetsSampleCOV="Covariance Risk Budgets") else Title<-"" # empty string if (is.null(col)) col <- seqPalette(getNAssets(object), "Blues") if (sum(c(par()$mfrow, par()$mfcol)) == 4) cex=0.9 else cex=0.7 CEX<-0.7 # Compute Covariance Risk Budgets: FUN<-switch(FUN2,budgetsNormalVAR=budgetsNormalVAR, budgetsNormalES=budgetsNormalES, budgetsModifiedVAR=budgetsModifiedVAR, budgetsModifiedES=budgetsModifiedES) if(FUN2 == "budgetsSampleCOV") budgets <- getCovRiskBudgets(object@portfolio) else { fun <- function(x, data, alpha, mu, Sigma) FUN(data, weights=as.vector(x), alpha, mu, Sigma)$budgets budgets <- t(apply(weights, 1, fun, data=data, alpha=alpha, mu=mu, Sigma=Sigma)) } pos.budgets <- +0.5 * (abs(budgets) + budgets) neg.budgets <- -0.5 * (abs(budgets) - budgets) # Define Plot Range: ymax <- max(rowSums(pos.budgets)) ymin <- min(rowSums(neg.budgets)) range <- ymax - ymin ymax <- ymax + 0.005 * range ymin <- ymin - 0.005 * range dim <- dim(budgets) range <- dim[1] xmin <- 0 xmax <- range + 0.2 * range # Create Bar Plots: if (labels) { if(!legend){ barplot(t(pos.budgets), space=0, ylab="", ylim=c(ymin, ymax), col=col, border="grey") } else { legendtext <- names(getStatistics(object)$mu) if(is.null(legendtext)){ for(i in 1:dim[2]){legendtext[i] <- paste("Asset", i, sep = " ")} } barplot(t(pos.budgets), space=0, ylab="", xlim=c(xmin, xmax), ylim=c(ymin, ymax), col=col, border="grey") legend("topright", legend=legendtext, bty="n", cex=0.7, fill=col) } barplot(t(neg.budgets), space=0, add=TRUE, col=col, border="grey") } else { barplot(t(pos.budgets), col=col) } # Add Tailored Labels: nLabels <- 6 targetRisk <- getTargetRisk(object@portfolio)[, 1] targetReturn <- getTargetReturn(object@portfolio)[, 1] nSigma <- length(targetRisk) M <- c(0, ( 1:(nSigma %/% nLabels) ) ) * nLabels + 1 # Take a reasonable number of significant digits to plot: nSignifDigits <- 3 axis(3, at=M, labels=signif(targetRisk[M], nSignifDigits)) axis(1, at=M, labels=signif(targetReturn[M], nSignifDigits)) # Add Budgets 0 and 1 Reference Lines: lines(x=c(0, nSigma), c(1, 1), col="grey", lty=3) lines(x=c(0, nSigma), c(0, 0), col="grey", lty=3) # Add Vertical Line at Minimum Risk: minIndex <- which.min(targetRisk) minRisk <- signif(min(targetRisk), 3) abline(v=minIndex, col="black", lty=1, lwd=2) # Add Margin Text Info - Do not remove this line: mtext("Rmetrics", side=4, adj=0, col="grey", cex=CEX) # Add Title: if (title) mtext(Title, adj=0, line=2.5, font=2, cex=CEX+0.1) # Complete to draw Box: if (box) box() # Add Rmetrics - Do not Remove! mtext("Rmetrics", adj=0, side=4, cex=0.7, col="darkgrey") # Return Value: invisible(budgets) } ############################################################################### fPortfolio/R/risk-ternaryMap.R0000644000176200001440000003034112323217770016016 0ustar liggesusers # 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: # ternaryMap Displays a risk map for ternary portfolios # ternaryFrontier Plots the efficient frontier of a ternary portfolio # FUNCTION: DESCRIPTION: # riskMap normalVaR risk map function called from ternaryMap() # maxddMap max Drawdown risk map function called from ternaryMap() # FUNCTION: DESCRIPTION: # ternaryWeights Creates a set of ternary weights # ternaryCoord Computes x, y coordinates from weights # ternaryPoints Adds points to a ternary map plot ############################################################################### ternaryMap <- function(data, FUN=NULL, ..., locator=FALSE, N=41, palette=topo.colors, nlevels=11) { # A function implemented by Diethelm Wuertz # Description: # Displays a risk map for ternary portfolios # Arguments: # data - a ternary 'timeSeries' object of financial returns # FUN - the map function # ... - optional arguments passed to function FUN # locator - a logical flag to activate the locator # N - number of bins # palette - color palette # nlevels - number of contour levels # Examples: # ternaryMap(data=SWX.RET[, 1:3]) # ternaryMap(data=SWX.RET[, 1:3], FUN=.riskTest, locator=TRUE) # ternaryMap(data=SWX.RET[, 1:3], FUN=.maxddTest) # FUNCTION: # N=41; palette=topo.colors; nlevels=11; FUN <- NULL; ... <- NULL # Surface Function: if (is.null(FUN)) FUN <- function(data, weights, ...) var(weights) fun <- match.fun(FUN) # Grid Points: s <- sqrt(3)/2 x <- seq(0, 1, length=N) y <- s * x # Surface Values: G <- matrix(NA, N, N) xy <- W <- NULL for (j in 1:N) { w3 <- y[j] / s for (i in 1:N) { w2 <- x[i] - w3/2 w1 <- 1 - w2 - w3 if (w1 >= -1/N && w2 >= -1/N) { # if (w1 >= 0 && w2 >= 0) { w <- c(w1, w2, w3) xy <- rbind(xy, c(x[i], y[j])) W <- rbind(W, w) G[i, j] <- ans <- fun(data, w, ...) } } } surface <- list(x=x, y=y/s, z=G) x <- surface$x y <- surface$y z <- surface$z # Color Settings: colors <- .scaledColors(surface, palette = palette, nlevels = nlevels) levels <- colors$levels palette <- colors$palette # Image Ranges: yOffset <- 0.025 * diff(range(y)) yLim <- c(min(y) - yOffset, max(y) + yOffset) xOffset <- 0.1 * diff(range(x)) xLim <- c(min(x) - xOffset/4, max(x) + xOffset) # Filled Contour Plot: image(x, y, z, xlim = xLim, ylim = yLim, xlab = "", ylab = "", col = "white") grid() # DW # .Internal(filledcontour()) no longer works on 3.0. # .Internal(filledcontour( # as.double(x), as.double(y), z, # as.double(levels), col = palette)) # Use instead: graphics::.filled.contour( x = as.double(x), y = as.double(y), z = z, levels = as.double(levels), col = palette) contour(x, y, z, add = TRUE, levels = signif(levels, 3)) d <- 3/N polygon(c(1, 1+d, 0.5+d, 0.5, 1), c(0, 0, s, s, 0)/s, col="white", border="white") polygon(c(0, 0.5, 0.5-d, -d, 0), c(0, s, s, 0, 0)/s, col="white", border="white") box(col = "white") # Please do not Remove: mtext("Rmetrics", 4, col="grey", adj=0, cex=0.7) # Grid Lines: for(k in 1:10) lines(c(k*0.1, k*0.05), c(0, k*0.1), col="grey", lty=3) for(k in 1:10) lines(c(1-k*0.1, 1-k*0.05), c(0, k*0.1), col="grey", lty=3) for(k in 1:9) lines(c(k*0.05, 1-k*0.05), c(k*0.1, k*0.1), col="grey", lty=3) # Add Legend: cs <- cumsum(levels) css <- (cs - min(cs))/diff(range(cs)) css <- 0.95 * css + 0.025 cy <- min(y) + css * diff(range(y)) cx <- rep(xLim[2] - 0.1 * xOffset, length(cy)) lines(cx, cy, lwd = 3) for (i in 1:(nlevels - 1)) lines(c(cx[i], cx[i + 1]), c(cy[i], cy[i + 1]), lwd = 3, col = palette[i]) for (i in 1:nlevels) points(cx[i], cy[i], pch = 16, cex = 1.1, col = "black") textOffset <- c(-5e-04, 5e-04, 8e-04, 8e-04, rep(0, 7)) text(cx, cy + textOffset, as.character(signif(levels, 2)), pos = 2, cex = 0.8) # Decoration: pointCex <- 2.5 textCex <- 0.5 # EfficientFrontier: frontier <- portfolioFrontier(data) weights <- getWeights(frontier@portfolio) xy <- cbind(x=weights[, 2]+weights[, 3]/2, y=weights[, 3]) lines(xy, col="brown", lwd=3) # Global Minimum Variance Portfolio: weights<- getWeights(minvariancePortfolio(data)) xy <- c(x=weights[2]+weights[3]/2, y=weights[3]) points(xy[1], xy[2], pch=19, cex=pointCex, col="red") text(xy[1], xy[2], "MVP", font=2, col="white", cex=textCex) # Tangency Portfolio: weights <- getWeights(tangencyPortfolio(data)) xy <- c(x=weights[2]+weights[3]/2, y=weights[3]) points(xy[1], xy[2], pch=19, cex=pointCex, col="orange") text(xy[1], xy[2], "TGP", font=2, col="white", cex=textCex) # Equal Weights: xy <- rbind(c(1/3+1/6, 1/3)) points(xy, pch=19, cex=pointCex, col="brown") text(xy, "EWP", font=2, col="white", cex = textCex) # Individual Assets: xy = rbind(c(0,0), c(1,0), c(1/2, 1)) points(xy, pch=19, cex=pointCex, col="black") text(xy, colnames(data), font = 2, col = "white", cex = textCex) # Locator: if (locator) { for (i in 1:512) { ans <- locator(n = 1, type = "p", pch=10) w3 <- ans$y w2 <- ans$x - w3/2 w <- round(c(w1=1-w2-w3, w2, w3), 2) names(w) <- colnames(data) total <- sum(w) names(total) <- "Total" z <- signif(fun(data, w, ...), 3) ans <- data.frame(rbind(c(w, total, z))) rownames(ans) <- "Composition" print(ans) } } # Return Value: invisible() } # ----------------------------------------------------------------------------- ternaryFrontier <- function(data, locator=FALSE) { # A function implemented by Diethelm Wuertz # Description: # Plots the efficient frontier of a ternary map # Arguments: # data - a ternary 'timeSeries' object of financial returns # locator - a logical flag to activate the locator # Example: # ternaryFrontier(SWX.RET[, 1:3], locator=TRUE) # FUNCTION: # Long Only Markowitz Portfolio: polygon <- markowitzHull(data) object <- attr(polygon, "frontier") # Plot Range: offset <- 0.1 xlim <- c(0, max(sqrt(diag(getCov(object))))) Xlim <- c(xlim[1] - diff(xlim) * offset, xlim[2] + diff(xlim) * offset) ylim <- range(getMean(object)) Ylim <- c(ylim[1] - diff(ylim) * offset, ylim[2] + diff(ylim) * offset) # Get Points and Add Frontier: frontierPlot(object, auto=FALSE, xlim=Xlim, ylim=Ylim, pch=19, labels=FALSE) polygon(polygon, col="grey", border="grey") points(frontierPoints(object, frontier="upper"), pch=19) box(col="white") grid() # Please do not Remove: mtext("Rmetrics", 4, col="grey", adj=0, cex=0.7) # Zero Axis Lines: abline(h = 0, col = "grey") abline(v = 0, col = "grey") # Decoration Settings: pointCex <- 2.5 textCex <- 0.5 # Add Global Minimum Variance Portfolio: xy <- minvariancePoints( object, auto=FALSE, pch=19, col="red", cex=pointCex) text(xy[1], xy[2], "MVP", font=2, col="white", cex=textCex) # Add Tangency Portfolio for zero risk free Rate: tangencyLines(object, auto=FALSE, col="blue") xy <- tangencyPoints( object, auto=FALSE, pch=19, col="blue", cex=pointCex) text(xy[1], xy[2], "TGP", font=2, col="white", cex=textCex) # Add Equal Weights Portfolio: xy <- equalWeightsPoints( object, auto=FALSE, pch=19, col="brown", cex=pointCex) text(xy[1], xy[2], "EWP", font=2, col="white", cex=textCex) # Add Two Assets Portfolios: xy <- singleAssetPoints( object, auto=FALSE, pch=19, col="black", cex=pointCex) text(xy[,1], xy[,2], colnames(data), font=2, col="white", cex=textCex) # Add Sharpe Ratio: sharpeRatioLines(object, auto=FALSE, col="orange", lwd=2, pch=19) # Locator: if (locator) { for (i in 1:512) { ans <- locator(n = 1, type = "p", pch=10) Risk <- ans$x Return <- ans$y SharpeRatio <- ans$y/ans$x ans <- data.frame(rbind(c(Risk, Return, SharpeRatio))) colnames(ans) <- c("Risk", "Return", "SharpeRatio") rownames(ans) <- "Portfolio" print(signif(ans, 3)) } } # Retirn Value: invisible(object) } # ############################################################################# riskMap <- function(data, weights) { # Description: # normalVaR risk map function called from ternaryMap() # FUNCTION: # Map: tS <- pfolioReturn(data, weights=as.vector(weights)) ans <- normalVaR(tS) names(ans) <- "normalVaR" # Return Value: ans } # ----------------------------------------------------------------------------- maxddMap <- function(data, weights) { # Description: # Max Drawdown map function called from ternaryMap() # FUNCTION: # Map: tS <- pfolioReturn(data, weights=as.vector(weights)) ans <- colMins(tS) names(ans) <- "maxdd" # Return Value: ans } # ############################################################################# # Utility Functions: ternaryWeights <- function(n=21) { # A function implemented by Diethelm Wuertz # Description: # Returns a set of ternary weights # Arguments: # n - number of bins # Example: # ternaryWeights() # FUNCTION: # Settings: eps <- sqrt(.Machine$double.eps) # Creates a set of ternary weights W <- seq(0, 1, length=n) W1 <- rep(W, times = length(W)) W2 <- rep(W, each = length(W)) W3 <- 1 - W1 - W2 W3[abs(W3) < eps] <- 0 W <- cbind(W1, W2, W3) weights <- W[W1 + W2 <= 1, ] # Return Value: weights } # ----------------------------------------------------------------------------- ternaryCoord <- function(weights) { # A function implemented by Diethelm Wuertz # Description: # Returns x,y Coordinates of weights triangle # Example: # ternaryCoord(ternaryWeights()) # FUNCTION: # Computexs x, y coordinates from weights x <- 1 - weights[,1] - weights[, 2]/2 y <- sqrt(3) * weights[, 2] /2 # Return Value: cbind(x=x, y=y) } # ----------------------------------------------------------------------------- ternaryPoints <- function(weights, ...) { # A function implemented by Diethelm Wuertz # Description: # Adds points to a ternary map plot # Example: # ternaryPoints(ternaryWeights()) # FUNCTION: # Transpose in the case of a single weight if(is.null(dim(weights))) weights <- t(weights) # Adds points to a ternary map coord <- ternaryCoord(weights) points(coord, ...) # Return Value: invisible() } ############################################################################### fPortfolio/R/methods-mathprog.R0000644000176200001440000000203512323217770016207 0ustar liggesusers ################################################################################ # FUNCTION: DESCRIPTION: # print.solver S3 Print method for solver objects ################################################################################ print.solver <- function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # S3 Print method for solver objects # Arguments: # x - a list as returned by solver functions # FUNCTION: cat("\nMathematical Programming:\n ") cat(x$version, sep="\n") cat("\n") cat(" Objective: ", x$objective, "\n") cat(" Solution: ", head(x$solution), "...\n") cat(" Status Code: ", x$status, "\n") cat(" Message: ", x$message, "\n") cat(" Solver: ", x$solver, "\n") #cat(" Version: ", x$version, "\n") # Return Value: invisible(x) } ################################################################################ fPortfolio/R/solve-Rampl.R0000644000176200001440000002213412410250204015112 0ustar liggesusers # 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 Description. 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: # solveRampl.MV AMPL solver for a MV Long Only Portfolio # FUNCTION: DESCRIPTION: # solveRampl.CVAR AMPL solver for a CVAR Long Only Portfolio ################################################################################ solveRampl.MV <- function (data, spec, constraints="LongOnly") { # A function written by Diethelm Wuertz # Description: # A Mean-Variance (MV) Long Only portfolio solver # Note: # No other constraints are allowed. # Example: # data <- 100 * LPP2005.RET[, 1:6] # spec <- portfolioSpec() # setTargetReturn(spec) <- mean(data) # setSolver(spec) <- "solveRampl.MV" # solveRampl.MV(data, spec) # FUNCTION: # Check Consistency: stopifnot(getType(spec) == "MV") stopifnot(constraints == "LongOnly") # Force AMPL Settings: spec@ampl$ampl <- TRUE solver <- spec@ampl$solver project <- spec@ampl$project trace <- spec@ampl$trace # Get Portfolio Settings: Data <- portfolioData(data, spec) Sigma <- getSigma(Data) n <- nAssets <- getNAssets(Data) targetReturn <- getTargetReturn(spec) # Create AMPL Model File: amplModelOpen(project) model <- c( "# Quadratic Programming", "# Long Only Markowitz", "param nAssets;", "param mu{1..nAssets};", "param Sigma{1..nAssets, 1..nAssets};", "param targetReturn;", "var x{1..nAssets} >= 0;", "minimize Risk: sum {i in 1..nAssets} sum{j in 1..nAssets} x[i]*Sigma[i,j]*x[j];", "subject to Return: sum{i in 1..nAssets} mu[i]*x[i] = targetReturn;", "subject to Budget: sum{i in 1..nAssets} x[i] = 1;", NULL ) amplModelAdd(model, project) # Create AMPL Data File: amplDataOpen(project) amplDataAddValue(data="nAssets", value=n, project) amplDataAddVector(data="mu", vector=getMu(Data), project) amplDataAddMatrix(data="Sigma", matrix=getSigma(Data), project) amplDataAddValue(data="targetReturn", value=getTargetReturn(spec), project) # Create AMPL Run File: amplRunOpen(project) run <- c( paste("reset ;"), paste("option solver", solver, ";", sp = ""), paste("model ", project, ".mod ;", sep = ""), paste("data ", project, ".dat ;", sep = ""), paste("solve ;"), paste("display x > ", project, ".txt ;", sep = ""), paste("display solve_result_num > ", project, ".txt ;", sep = ""), paste("display solve_result > ", project, ".txt ;", sep = ""), paste("display solve_message > ", project, ".txt ;", sep = ""), paste("exit ;"), NULL ) amplRunAdd(run, project) # Exec AMPL: command <- paste("ampl -t -vs", paste(project, "run", sep=".")) solve <- system(command, intern=TRUE) # Read AMPL Output File: file <- paste(project, "txt", sep = ".") out <- scan(file, what = character(0), sep="\n", quiet=TRUE) # Get Weights: Index <- (grep(";", out) - 1)[1] splits <- strsplit(paste(out[2:Index], collapse=" "), " ")[[1]] solution <- as.numeric(splits[splits != ""])[seq(2, 2*n, by=2)] Index <- as.numeric(splits[splits != ""])[seq(1, 2*n, by=2)] solution[Index] <- solution # Get Status: status <- strsplit(out[grep("solve_result", out)], split=" ") statusCode <- status[[1]][3] statusMessage <- status[[2]][3] # Version: version <- system(paste(solver, "-v"), intern=TRUE) # Compose Result into a List: ans <- list( type = getType(spec), solver = getSolver(spec), optim = solve, weights = solution, targetReturn = targetReturn, targetRisk = sqrt(solution %*% Sigma %*% solution)[[1, 1]], objective = sqrt(solution %*% Sigma %*% solution)[[1, 1]], status = statusCode, message = statusMessage) class(ans) <- c("solver", "list") # Return Value: ans } ################################################################################ solveRampl.CVAR <- function(data, spec, constraints="LongOnly") { # A function written by Diethelm Wuertz # FUNCTION: # Portfolio Model # max CVaR # s.t. desired target Return # s.t. full Investement # s.t. long only positions # Check Consistency: stopifnot(getType(spec) == "CVAR") stopifnot(getSolver(spec) == "solveAMPLipoptCVAR") stopifnot(constraints == "LongOnly") # Force AMPL Settings: spec@ampl$ampl <- TRUE project <- spec@ampl$project trace <- spec@ampl$trace # Settings: Data <- portfolioData(data, spec) data <- getSeries(Data) n <- nAssets <- getNAssets(Data) nScenarios <- nrow(getSeries(Data)) Mean <- getMean(Data) targetReturn <- getTargetReturn(spec) alpha <- getAlpha(spec) Type <- getType(spec) project <- "ampl" solver <- "ipopt" # Model File: amplModelOpen(project) model <- c( "param alpha ;", "param nAssets ;", "param nScenarios ;", "param Mean{1..nAssets} ;", "param targetReturn ;", "param Data{1..nScenarios,1..nAssets} ;", "var weights{1..nAssets} ;", "var VaR ;", "var z{1..nScenarios};", "maximize Risk: VaR - ( sum{i in 1..nScenarios} z[i] ) / ( alpha * nScenarios ) ;", "subject to Return: sum{i in 1..nAssets} weights[i] * Mean[i] = targetReturn ;" , "subject to Weights{i in 1..nAssets}: weights[i] >= 0 ;", "subject to Budget: sum{i in 1..nAssets} weights[i] = 1 ;", "subject to Scenarios{k in 1..nScenarios}: -VaR + z[k] + sum{i in 1..nAssets} Data[k,i]*weights[i] >= 0 ;" , "subject to Z{i in 1..nScenarios}: z[i] >= 0 ;", NULL ) amplModelAdd(model, project) # Data File: amplDataOpen(project) amplDataAddValue(data="alpha", value=alpha, project) amplDataAddValue(data="nAssets", value=nAssets, project) amplDataAddValue(data="nScenarios", value=nScenarios, project) amplDataAddValue(data="targetReturn", value=targetReturn, project) amplDataAddVector(data="Mean", vector=Mean, project) amplDataAddMatrix(data="Data", matrix=data, project) # Run File: amplRunOpen(project) run <- c( paste("option solver cplex ;"), paste("model ", project, ".mod ;", sep = ""), paste("data ", project, ".dat ;", sep = ""), "solve ;", paste("display weights > ", project, ".txt ;", sep = ""), paste("display VaR > ", project, ".txt ;", sep = ""), paste("exit ;"), NULL) amplRunAdd(run, project) # Exec AMPL: command <- paste("ampl -t -vs", paste(project, "run", sep=".")) solve <- system(command, intern=TRUE) # Read AMPL Output File: file <- paste(project, "txt", sep = ".") out <- scan(file, what = character(0), sep="\n", quiet=TRUE) # Get Weights: Index <- (grep(";", out) - 1)[1] splits <- strsplit(paste(out[2:Index], collapse=" "), " ")[[1]] solution <- as.numeric(splits[splits != ""])[seq(2, 2*n, by=2)] Index <- as.numeric(splits[splits != ""])[seq(1, 2*n, by=2)] solution[Index] <- solution # Get Status: status <- strsplit(out[grep("solve_result", out)], split=" ") statusCode <- status[[1]][3] statusMessage <- status[[2]][3] # Version: version <- system(paste(solver, "-v"), intern=TRUE) # Result: ans <- list( type = "CVAR", solver = "solveRampl.CVAR", optim = optim, weights = weights, targetReturn = targetReturn, targetRisk = -optim$optimum, objective = -optim$optimum, status = optim$status[[1]], message = "") class(ans) <- c("solver", "list") # Return Value: ans } # ############################################################################# fPortfolio/R/a-class-fPFOLIOBACKTEST.R0000644000176200001440000000255312323217770016532 0ustar liggesusers # 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: # "fPFOLIOBACKTEST" S4 Portfolio Backtest Class ################################################################################ setClass("fPFOLIOBACKTEST", # A function implemented by Diethelm Wuertz and William Chen # Description: # Represens S4 fPFOLIOBACKTEST Class representation( windows = "list", strategy = "list", smoother = "list", messages = "list") ) ################################################################################ fPortfolio/R/mathprogQP-neos.R0000644000176200001440000001740512323217770015760 0ustar liggesusers # 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: # rneosQP Rmetrics Interface for AMPL/NEOS QP solvers # neosQP Convenience wrapper for AMPL/NEOS QP solvers # neosQPControl NEOS QP ontrol parameter list ############################################################################### rneosQP <- function(objective, lower=0, upper=1, linCons, control=list()) { # A function implemented by Diethelm Wuertz # Description: # Rmetrics Interface for AMPL/NEOS QP solvers # Arguments: # objective - list(dvec=NULL, Dmat = NULL) # FUNCTION: # Control List: ctrl <- neosQPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl # Control Parameters: solver <- control$solver category <- control$category project <- control$project inf <- control$inf trace <- control$trace # General Settings: dvec <- objective$dvec Dmat <- objective$Dmat obj <- rbind(dvec, Dmat) # Box Constraints: replicate <- function(x, n) if(length(x) == 1) rep(x, n) else x n <- ncol(obj) x_L <- replicate(lower, n) x_U <- replicate(upper, n) x_L[is.infinite(x_L)] <- inf*sign(x_L[is.infinite(x_L)]) x_U[is.infinite(x_U)] <- inf*sign(x_U[is.infinite(x_U)]) # Linear Constraints: A <- linCons[[1]] m <- nrow(A) b_L <- replicate(linCons[[2]], m) b_U <- replicate(linCons[[3]], m) b_L[is.infinite(b_L)] <- inf*sign(b_L[is.infinite(b_L)]) b_U[is.infinite(b_U)] <- inf*sign(b_U[is.infinite(b_U)]) # Optimize Portfolio: value <- neosQP(objective, x_L, x_U, A, b_L, b_U, control) # Return Value: value } ############################################################################### neosQP <- function( objective=list(dvec=NULL, Dmat=NULL), x_L=NULL, x_U=NULL, A=NULL, b_L=NULL, b_U=NULL, control=list(), ...) { # A function implemented by Diethelm Wuertz # Description: # Convenience wrapper for AMPL/NEOS QP solvers # Arguments: # objective - list(dvec=NULL, Dmat = NULL) # FUNCTION: # Control List: ctrl <- neosQPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl # Control Parameters: solver <- control$solver category <- control$category project <- control$project inf <- control$inf trace <- control$trace # Solver Settings: dvec <- objective$dvec Dmat <- objective$Dmat obj <- rbind(dvec, Dmat) n <- ncol(obj) m <- nrow(A) # Write AMPL Model File: amplModelOpen(project) model <- c( "param n ;", "param m ;", "param c{1..n} ;", "param F{1..n, 1..n} ;", "param x_L{1..n} ;", "param x_U{1..n} ;", "param A{1..m, 1..n} ;", "param b_L{1..m} ;", "param b_U{1..m} ;", "var x{1..n};", "minimize Risk: sum {i in 1..n} x[i]*c[i] + 0.5*sum {i in 1..n} sum{j in 1..n} x[i]*F[i,j]*x[j] ;", "s.t. lower {i in 1..n}: x[i] >= x_L[i] ;", "s.t. upper {i in 1..n}: x[i] <= x_U[i] ;", "s.t. linLower {j in 1..m}: sum{i in 1..n} A[j, i]*x[i] >= b_L[j] ;", "s.t. linUpper {j in 1..m}: sum{i in 1..n} A[j, i]*x[i] <= b_U[j] ;", NULL) amplModelAdd(model, project) if (trace) amplModelShow(project) # Write AMPL Data File: amplDataOpen(project) amplDataAddValue (data="n", value=n, project) amplDataAddValue (data="m", value=m, project) amplDataAddVector(data="c", vector=dvec, project) amplDataAddMatrix(data="F", matrix=Dmat, project) amplDataAddVector(data="x_L", vector=x_L, project) amplDataAddVector(data="x_U", vector=x_U, project) amplDataAddMatrix(data="A", matrix=A, project) amplDataAddVector(data="b_L", vector=b_L, project) amplDataAddVector(data="b_U", vector=b_U, project) if (trace) amplDataShow(project) # Write AMPL/NEOS RUN File: amplRunOpen(project) run <- c( "solve ;", "display x;", "display solve_result_num;", "display solve_result;", "display solve_message;", "exit ;") amplRunAdd(run, project) if (trace) amplRunShow(project) # Get AMPL Files: model <- paste(readLines( paste(project, "mod", sep=".")), sep = " ", collapse ="\n") data <- paste(readLines( paste(project, "dat", sep=".")), sep = " ", collapse ="\n") run <- paste(readLines( paste(project, "run", sep=".")), sep = " ", collapse ="\n") # Setup NEOS and AMPL Specifications: amplSpec <- list(model=model, data=data, commands=run, comments="NEOS") solverTemplate <- rneos::NgetSolverTemplate( category=category, solvername=solver, inputMethod="AMPL") xmls <- rneos::CreateXmlString( neosxml=solverTemplate, cdatalist=amplSpec) # Submit and Fetch NEOS Job: submittedJob <- rneos::NsubmitJob( xmlstring=xmls, user="rneos", interface="", id=0) ans <- rneos::NgetFinalResults(obj=submittedJob, convert=TRUE) out <- strsplit(ans@ans, split="\n")[[1]] # Get Weights: Index <- (grep("x .*. :=", out)+1):( grep("^;$", out)-1) Out <- out[Index] splits <- strsplit(paste(Out, collapse=" "), " ")[[1]] solution <- as.numeric(splits[splits != ""])[seq(2, 2*n, by=2)] Index <- as.numeric(splits[splits != ""])[seq(1, 2*n, by=2)] solution[Index] <- solution # Get Status: status <- strsplit(out[grep("solve_result", out)], split=" ") statusCode <- status[[1]][3] statusMessage <- status[[2]][3] # Get Solver Message: Index <- grep("solve_message", out):length(out) message <- out[Index] # Neos Job Version: version <- out[1] # Compute Obective Function Value: objval <- (dvec %*% solution + 0.5 * solution %*% Dmat %*% solution)[[1, 1]] # Return Value: model <- capture.output(amplModelShow(project)) run <- capture.output(amplRunShow(project)) value = list( opt = list(solve=ans, model=model, run=run, out=out), solution = solution, objective = objval, status = statusCode, message = statusMessage, solver = paste("AMPL", solver), version = version) class(value) <- c("solver", "list") value } # ----------------------------------------------------------------------------- neosQPControl <- function(solver="ipopt", category="nco", project="neos", inf=1e12, trace=FALSE) { # A function implemented by Diethelm Wuertz # Description: # Returns control parameter list # FUNCTION: # Control Parameter: control <- list( solver=solver, category=category, project=project, inf=inf, trace=trace) # Return Value: control } ############################################################################### fPortfolio/R/mathprogNLP-solnp.R0000644000176200001440000002232112410257402016242 0ustar liggesusers # 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: # rsolnpNLP NLP wrapper for solver solnpNLP() # solnpNLP NLP wrapper for solver solnp() # solnpNLPControl Control parameter list # REQUIRES: # solnp Solver in package Rsolnp ################################################################################ rsolnpNLP <- function(start, objective, lower=0, upper=1, linCons, funCons, control=list()) { # A function implemented by Diethelm Wuertz # Description: # Function wrapper for solver solnp() # FUNCTION: # Load: # require(Rsolnp) # Update Control List: ctrl <- solnpNLPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl BIG <- 1e6 N <- length(start) # Box Constraints: if(length(lower) == 1) { par.lower <- rep(lower, N) } else { par.lower <- lower } if(length(upper) == 1) { par.upper <- rep(upper, N) } else { par.upper <- upper } par.lower[is.infinite(par.lower)] <- BIG*sign(par.lower[is.infinite(par.lower)]) par.upper[is.infinite(par.upper)] <- BIG*sign(par.upper[is.infinite(par.upper)]) # Linear Constraints: if(missing(linCons)) { eqA <- ineqA <- NULL eqA.bound <- ineqA.lower <- ineqA.upper <- NULL } else { mat <- linCons[[1]] M <- nrow(mat) lower <- linCons[[2]] upper <- linCons[[3]] if(length(lower) == 1) lower <- rep(lower, M) if(length(upper) == 1) upper <- rep(upper, M) lower[is.infinite(lower)] <- BIG*sign(lower[is.infinite(lower)]) upper[is.infinite(upper)] <- BIG*sign(upper[is.infinite(upper)]) eqIndex <- which(lower == upper) ineqIndex <- which(lower != upper) if (length(eqIndex) == 0) { eqA <- NULL eqA.bound <- NULL } else { eqA <- mat[eqIndex, ] eqA.bound <- lower[eqIndex] } if (length(ineqIndex) == 0) { ineqA <- NULL ineqA.lower <- NULL ineqA.upper <- NULL } else { ineqA <- mat[ineqIndex, ] ineqA.lower <- lower[ineqIndex] ineqA.upper <- upper[ineqIndex] } } # Nonlinear Constraints: if(missing(funCons)) { eqFun <- ineqFun <- list() eqFun.bound <- ineqFun.lower <- ineqFun.upper <- NULL } else { fun <- funCons[[1]] lower <- funCons[[2]] upper <- funCons[[3]] eqIndex <- which(lower == upper) ineqIndex <- which(lower != upper) if (length(eqIndex) == 0) { eqFun <- list() eqFun.boud <- NULL } else { eqFun = fun[eqIndex] eqFun.bound = lower[eqIndex] } if (length(ineqIndex) == 0) { ineqFun <- list() ineqFun.lower <- NULL ineqFun.upper <- NULL } else { ineqFun = fun[ineqIndex] ineqFun.lower <- lower[ineqIndex] ineqFun.upper <- upper[ineqIndex] } } # Optimize Portfolio: elapsed <- Sys.time() optim <- solnpNLP( start = start, objective = objective, par.lower = par.lower, par.upper = par.upper, eqA = eqA, eqA.bound = eqA.bound, ineqA = ineqA, ineqA.lower = ineqA.lower, ineqA.upper = ineqA.upper, eqFun = eqFun, eqFun.bound = eqFun.bound, ineqFun = ineqFun, ineqFun.lower = ineqFun.lower, ineqFun.upper = ineqFun.upper, control = control) elapsed <- Sys.time() - elapsed # Version: package <- packageDescription(pkg="Rsolnp") version <- paste(package$Package, package$Version, package$Date) # Return Value: value <- list( opt = optim, solution = optim$solution, objective = objective(optim$solution), status = optim$status, message = optim $message, solver = "solnpNLP", elapsed = elapsed, version = version) class(value) <- c("solver", "list") # Return Value: value } ################################################################################ solnpNLP <- function( start, objective, par.lower = NULL, par.upper = NULL, eqA = NULL, eqA.bound = NULL, ineqA = NULL, ineqA.lower = NULL, ineqA.upper = NULL, eqFun = list(), eqFun.bound = NULL, ineqFun = list(), ineqFun.lower = NULL, ineqFun.upper = NULL, control = list()) { # A function implemented by Diethelm Wuertz # Description: # Universal function wrapper for solver solnp(). # FUNCTION: # Load: # require(Rsolnp) fun <- objective # Control List: ctrl <- solnpNLPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl # Environment Setting: env <- .GlobalEnv # Box Constraints: BIG <- 1e8 # inf does not works here, DW. if (is.null(par.lower)) par.lower <- rep(-BIG, length(start)) if (is.null(par.upper)) par.upper <- rep(+BIG, length(start)) # Linear and Function Equality Constraints: if (length(eqA) > 0 || length(eqFun) > 0 ) { eqfun <- function(x) { ans <- NULL if(!is.null(eqA)) ans <- c(ans, as.vector(eqA %*% x)) if (length(eqFun) > 0) for (i in 1:length(eqFun)) ans <- c(ans, eqFun[[i]](x)) ans } } else { eqfun <- NULL } eqB <- c(eqA.bound, eqFun.bound) # Linear and Function Inequality Constraints: if (length(ineqA) > 0 || length(ineqFun) > 0) { ineqfun <- function(x) { ans <- NULL if(!is.null(ineqA)) ans <- c(ans, as.vector(ineqA %*% x)) if (length(ineqFun) > 0) for (i in 1:length(ineqFun)) ans <- c(ans, ineqFun[[i]](x)) ans } } else { ineqfun <- NULL } ineqLB <- c(ineqA.lower, ineqFun.lower) ineqUB <- c(ineqA.upper, ineqFun.upper) # Optimize Portfolio: elapsed <- Sys.time() optim <- Rsolnp::solnp( pars = start, fun = fun, eqfun = eqfun, eqB = eqB, ineqfun = ineqfun, ineqLB = ineqLB, ineqUB = ineqUB, LB = par.lower, UB = par.upper, control = control) elapsed <- Sys.time() - elapsed names(optim$pars) <- names(start) # Version: package <- packageDescription(pkg="Rsolnp") version <- paste(package$Package, package$Version, package$Date) # Return Value: value <- list( opt = optim, solution = optim$pars, objective = fun(optim$pars), status = optim$convergence, message = "not available", solver = "solnpNLP", elapsed = elapsed, version = version) class(value) <- c("solver", "list") value } ############################################################################### solnpNLPControl <- function( rho = 1, outer.iter = 400, inner.iter = 800, delta = 1.0e-7, tol = 1.0e-8, trace = 0) { # A function implemented by Diethelm Wuertz # Description: # Returns control list # Arguments: # rho - a numeric value. The penalty parameter # majit - an integer value. The maximum number of major iterations # minit - an integer value. The maximum number of minor iterations # delta - a numeric value. The relative step size in forward # difference evaluation # tol - a numeric value. The tolerance on feasibility and optimality # Notes: # DW: default trace=1 changed to trace=0 # FUNCTION: # Control Parameters: control <- list( rho = rho, outer.iter = outer.iter, inner.iter = inner.iter, delta = delta, tol = tol, trace = trace) # Return Value: control } ############################################################################### fPortfolio/R/solve-Rsolnp.R0000644000176200001440000001531512323217770015335 0ustar liggesusers # 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 Description. 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: # solveRsolnp Portfolio interface to solver Rsolnp # .rsolnpArguments Returns arguments for solver ################################################################################ solveRsolnp <- function(data, spec, constraints) { # Description: # Portfolio interface to solver Rsolnp # Arguments; # data - an object of class timeSeries # spec - an object of class fPFOLIOSPEC # constraints - an object of class character # FUNCTION: # Settings: Data <- portfolioData(data, spec) nAssets <- getNAssets(Data) mu <- getMu(Data) Sigma <- getSigma(Data) # Compose Arguments for Solver: args <- .rsolnpArguments(data, spec, constraints) optim <- Rsolnp::solnp( pars = args$par, fun = args$fun, grad = NULL, eqfun = args$eqfun, eqB = args$B, eqgrad = NULL, ineqfun = args$ineqfun, ineqLB = args$ineqLB, ineqUB = args$ineqUB, ineqgrad = NULL, LB = args$LB, UB = args$UB, control = list()) # Extract Weights: weights <- .checkWeights(optim$par) attr(weights, "invest") <- sum(weights) # Check Messages and Get Status: # ... unfortunately solnp has no status variable, # so we have to analyze the messages Status = 1 # Result: ans <- list( type = "MV", solver = "solveRsolnp", optim = optim, weights = weights, targetReturn = NA, targetRisk = NA, objective = optim$fx, status = Status, message = optim$message) returnFun <- match.fun(getObjective(spec)[2]) ans$targetReturn <- returnFun(ans$weights) riskFun <- match.fun(getObjective(spec)[3]) ans$targetRisk <- riskFun(ans$weights) # Return Value: ans } # ------------------------------------------------------------------------------ .rsolnpArguments <- function(data, spec, constraints) { # Description: # Create Arguments for Rsolnp # Details: # min: fun(x) # subject to: # g_i(x) = eqB # ineqLB <= h_i(x) <= ineqUB # LB <= x <= UB # FUNCTION: DEBUG = FALSE # Settings: Data <- portfolioData(data) nAssets <- getNAssets(Data) mu <- getMu(Data) Sigma <- getSigma(Data) fn <- match.fun(getObjective(spec)[1]) # Box Constrains: LB <- minWConstraints(data, spec, constraints) UB <- maxWConstraints(data, spec, constraints) if(DEBUG) print(rbind(LB, UB)) # Linear / Group Constraints: # ... targetReturn may be not defined,then set it to NA if (is.null(getTargetReturn(spec))) setTargetReturn(spec) <- NA # ... has in the first line the return constraint, if NA then ignore it eqsumW <- eqsumWConstraints(data, spec, constraints) if (is.na(eqsumW[1, 1])) eqsumW = eqsumW[-1, , drop= FALSE] Aeqsum <- eqsumW[, -1] aeqsum <- eqsumW[, 1] minsumW <- minsumWConstraints(data, spec, constraints) if (is.null(minsumW)) { Aminsum <- aminsum <- NULL } else { Aminsum <- minsumW[, -1] aminsum <- minsumW[, 1] } maxsumW = maxsumWConstraints(data, spec, constraints) if (is.null(maxsumW)) { Amaxsum <- amaxsum <- NULL } else { Amaxsum <- maxsumW[, -1] amaxsum <- maxsumW[, 1] } A <- rbind(Aeqsum, Aminsum, Amaxsum) lin.lower <- c(aeqsum, aminsum, rep(-Inf, length(amaxsum))) lin.upper <- c(aeqsum, rep(Inf, length(aminsum)), amaxsum) if(DEBUG) print(cbind(lin.lower, A, lin.upper)) # Nonlinear Constraints - Here Covariance Risk Budgets: nlin <- list() nlin.lower <- NULL nlin.upper <- NULL # Check Constraints Strings for Risk Budgets: # Example: constraints = c("minB[2:3]=0.1", "maxB[3:5]=0.9") validStrings <- c("minB", "maxB") usedStrings <- unique(sort(sub("\\[.*", "", constraints))) checkStrings <- sum(usedStrings %in% validStrings) includeRiskBudgeting <- as.logical(checkStrings) if (DEBUG) print(includeRiskBudgeting) if (includeRiskBudgeting) { # Compose Non-Linear (Cov Risk Budget) Constraints Functions: nlcon <- function(x) { B1 = as.vector(x %*% Sigma %*% x) B2 = as.vector(x * Sigma %*% x) B = B2/B1 B } if(DEBUG) print(nlcon) # Compose non-linear functions now for each asset ... for (I in 1:nAssets) eval( parse(text = paste( "nlcon", I, " = function(x) { nlcon(x)[", I, "] }", sep = "")) ) nlinFunctions = paste("nlcon", 1:nAssets, sep = "", collapse = ",") nlinFunctions = paste("list(", nlinFunctions, ")") nlin = eval( parse(text = nlinFunctions) ) if(DEBUG) print(nlin) # ... and finally Compose Constraints Vectors: nlin.lower = minBConstraints(data, spec, constraints) nlin.upper = maxBConstraints(data, spec, constraints) if(DEBUG) print(rbind(nlin.lower, nlin.upper)) } # General non-lin Portfolio Constraints: # ... todo: currently overwrites previous selection nlin = listFConstraints(data, spec, constraints) if(DEBUG) print(nlin) nlin.lower = minFConstraints(data, spec, constraints) nlin.upper = maxFConstraints(data, spec, constraints) if(DEBUG) print(cbind(nlin.lower, nlin.upper)) # Return Value: list( pars = rep(1/nAssets, nAssets), fun = fn, grad = NULL, eqfun = NULL, eqB = NULL, eqgrad = NULL, ineqfun = nlinFunctions, ineqLB = nlin.lower, ineqUB = nlin.upper, ineqgrad = NULL, LB = LB, UB = UB) } ################################################################################ fPortfolio/R/solve-RquadprogCLA.R0000644000176200001440000001266112410247202016333 0ustar liggesusers # 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 Description. 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: # solveRquadprog.CLA Portfolio interface to solver Rquadprog # .claRquadprogArguments Returns arguments for solver # FUNCTION: DESCRIPTION: # .quadprog.CLA Wrapper to solver function ################################################################################ solveRquadprog.CLA <- function(data, spec, constraints) { # A function implemented by Diethelm Wuertz # Description: # Portfolio interface to solver Rquadprog # Example: # solveRquadprogCLA(data, spec, constraints)[-3] # FUNCTION: # Update Specification: setTargetReturn(spec) <- NA # Transform Data: Data <- portfolioData(data, spec) nAssets <- getNAssets(Data) # Compile Arguments for Solver: args <- .claRquadprogArguments(data, spec, constraints) # Solve Multiassets Portfolio: ans <- .quadprog.CLA( Dmat = args$Dmat, dvec = args$dvec, Amat = args$Amat, bvec = args$bvec, meq = args$meq, lambda = args$lambda) # Save Arguments: ans$optim$args <- args class(ans) <- c("solver", "list") # Return Value: ans } ################################################################################ .claRquadprogArguments <- function(data, spec, constraints) { # A function implemented by Diethelm Wuertz # Description: # Returns quadprog conform arguments for the solver # FUNCTION: # Set up the default quadprog QP ans <- .rquadprogArguments(data, spec, constraints) # Optimize: # min(-d^T x + 1/2 x^T D x) # Start from it and modify for CLA: lambda <- spec@model$param$lambda ans$Dmat <- lambda * getSigma(portfolioData(data)) / 2 ans$dvec <- getMu(portfolioData(data)) ans$Amat <- ans$Amat[, -1] ans$bvec <- ans$bvec[-1] ans$meq <- ans$meq - 1 ans$dir <- ans$dir[-1] ans$lambda <- lambda # Return Value: ans } ################################################################################ .quadprog.CLA <- function(Dmat, dvec, Amat, bvec, meq, lambda) { # A function implemented by Diethelm Wuertz # Description: # Goldfarb and Idnani's quadprog solver function # Note: # Requires to load contributed R package quadprog from which we use # the Fortran subroutine of the quadratic solver. # Package: quadprog # Title: Functions to solve Quadratic Programming Problems. # Author: S original by Berwin A. Turlach # R port by Andreas Weingessel # Maintainer: Andreas Weingessel # Description: This package contains routines and documentation for # solving quadratic programming problems. # License: GPL-2 # Value of slove.QP(): # solution - vector containing the solution of the quadratic # programming problem. # value - scalar, the value of the quadratic function at the # solution # unconstrained.solution - vector containing the unconstrained # minimizer of the quadratic function. # iterations - vector of length 2, the first component contains # the number of iterations the algorithm needed, the second # indicates how often constraints became inactive after # becoming active first. vector with the indices of the # active constraints at the solution. # FUNCION: # Optimize: optim <- quadprog::solve.QP( Dmat = Dmat, dvec = dvec, Amat = Amat, bvec = bvec, meq = meq, factorized = FALSE) # Set Tiny Weights to Zero: weights <- .checkWeights(optim$solution) attr(weights, "invest") <- sum(weights) # Compose Output List: Sigma <- Dmat * 2 / lambda mu <- dvec ans <- list( type = "MV", solver = "solveRquadprog.CLA", optim = optim, weights = weights, solution = weights, targetReturn = (optim$solution %*% mu)[[1,1]], targetRisk = sqrt(optim$solution %*% Sigma %*% optim$solution)[[1,1]], objective = optim$crval, # To do: Add status information status = 0, message = "minRisk") # Return Value: ans } ################################################################################ fPortfolio/R/portfolio-efficientPfolio.R0000644000176200001440000002642012323217770020051 0ustar liggesusers # 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 Description. 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: # efficientPortfolio Returns a frontier portfolio # maxratioPortfolio Returns the max return/risk ratio portfolio # tangencyPortfolio Returns the tangency portfolio # minriskPortfolio Returns the minimum risk portfolio # minvariancePortfolio Returns the minimum variance portfolio # maxreturnPortfolio Returns the maximum return portfolio ################################################################################ efficientPortfolio <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Computes target risk and weights for an efficient portfolio # Arguments: # data - a rectangular object of assets # spec - an object of class 'fPFOLIOSPEC' # constraints - a character vector or NULL # Example: # data = as.timeSeries(data(LPP2005REC))[, 1:6] # spec = portfolioSpec(); setTargetReturn(spec) <- mean(data) # efficientPortfolio(data, spec) # FUNCTION: # Match Spec Versus Constraints: # .checkSpecVsConstraints(spec, constraints) # Optimize Portfolio: Solver <- match.fun(getSolver(spec)) portfolio <- Solver(data, spec, constraints) # Set Parameters: # Do not use ... # setWeights(spec) = portfolio$weights # setTargetReturn(spec) = portfolio$targetReturn # setTargetRisk(spec) = portfolio$targetRisk # to provide overwriting use: spec@portfolio$weights <- portfolio$weights spec@portfolio$targetReturn <- portfolio$targetReturn spec@portfolio$targetRisk <- portfolio$targetRisk # Add Status: setStatus(spec) <- portfolio$status # Add Title: Title <- "Efficient Portfolio" # Compose Portfolio: portfolio <- feasiblePortfolio(data, spec, constraints) portfolio@call <- match.call() portfolio@title <- Title # Return Value: portfolio } # ------------------------------------------------------------------------------ maxratioPortfolio <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Computes Capital Market Line # Arguments: # data - a rectangular object of assets # spec - an object of class 'fPFOLIOSPEC' # constraints - a character vector or NULL # Example: # data <- as.timeSeries(data(LPP2005REC))[, 1:6] # maxratioPortfolio(data) # FUNCTION: # Match Spec Versus Constraints: # .checkSpecVsConstraints(spec, constraints) # Transform Data: Data <- portfolioData(data, spec) # Compute Sharpe ratio to be minimized: ratioFun <- function(x, data, spec, constraints) { # x is the target return ... setTargetReturn(spec) <- x[1] Solver <- match.fun(getSolver(spec)) ans <- Solver(data, spec, constraints) # 2012-02-21 DW: Return if Solver does not converge BIG <- 1e10 if(ans$status != 0) return(-BIG) ratio = (x[1] - getRiskFreeRate(spec)) / ans$objective attr(ratio, "weights") <- ans$weights attr(ratio, "status") <- ans$status return(ratio) } # Start Solution - Equal Weights Portfolio: nAssets <- getNAssets(Data) setWeights(spec) <- rep(1/nAssets, times = nAssets) fp <- feasiblePortfolio(Data, spec, constraints) setTargetReturn(spec) <- getTargetReturn(fp) ## 2012-03-10 DW: ## tol = 10*.Machine$double.eps - higher tolerance added portfolio <- optimize(f = ratioFun, interval = range(getMu(Data)), maximum = TRUE, data = Data, spec = spec, constraints = constraints, tol = 10*.Machine$double.eps) ## 2009-04-19 DW: ## It may happen, that the maximum ratio portfolio cannot be computed. ## One reason is that the portfolio does not exist since the constraints ## are too restrictive. ## Another reason is that the risk free rate is above the highest return ## point. ## In these cases we stop the computation here, and return an error message. STATUS = attr(portfolio$objective, "status") if (STATUS != 0) { # Error Message: cat("\nExecution stopped:") cat("\n The maximum ratio portfolio could not be computed.") cat("\nPossible Reason:") cat("\n Your portfolio constraints may be too restrictive.") cat("\nStatus Information:") cat("\n status=", STATUS, " from solver ", getSolver(spec), ".", sep = "") cat("\n") stop(call. = FALSE, show.error.messages = "\n returned from Rmetrics") } # Continue: Succesfully computed the minimum risk portfolio ... setWeights(spec) <- attr(portfolio$objective, "weights") setStatus(spec) <- attr(portfolio$objective, "status") # Compose Portfolio: portfolio <- feasiblePortfolio(data, spec, constraints) portfolio@call <- match.call() portfolio@title <- "Max Return/Risk Ratio Portfolio" # Return Value: portfolio } # ------------------------------------------------------------------------------ tangencyPortfolio <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Computes Markowitz tangency portfolio # Arguments: # data - a rectangular object of assets # spec - an object of class 'fPFOLIOSPEC' # constraints - a character vector or NULL # FUNCTION: # Portfolio: portfolio <- maxratioPortfolio(data, spec, constraints) portfolio@title <- "Tangency Portfolio" # Return Value: portfolio } ################################################################################ .minriskPortfolio <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Computes minimum risk portfolio # Arguments: # data - a rectangular object of assets # spec - an object of class 'fPFOLIOSPEC' # constraints - a character vector or NULL # Example: # minriskPortfolio(SWX[, 1:3]) # FUNCTION: # Match Spec Versus Constraints: # .checkSpecVsConstraints(spec, constraints) # Transform Data: Data <- portfolioData(data, spec) # Compute target risk to be minimized: targetRiskFun <- function(x, data, spec, constraints) { # x is the target return ... setTargetReturn(spec) = x[1] Solver <- match.fun(getSolver(spec)) ans <- Solver(data, spec, constraints) targetRisk <- ans$objective attr(targetRisk, "weights") <- ans$weights attr(targetRisk, "status") <- ans$status return(targetRisk) } # Minimal Risk: portfolio <- optimize(targetRiskFun, interval = range(getMu(Data)), data = Data, spec = spec, constraints = constraints, tol = .Machine$double.eps^0.5) ## 2009-04-19 DW: ## It may happen, that the minimum risk protfolio cannot be computed. ## One reason is that the portfolio does not exist since the constraints ## are too restrictive. ## In this case we stop the computation here, and return an error message. STATUS = attr(portfolio$objective, "status") if (STATUS != 0) { # Error Message: cat("\nExecution stopped:") cat("\n The minimum risk portfolio could not be computed.") cat("\nPossible Reason:") cat("\n Your portfolio constraints may be too restrictive.") cat("\nStatus Information:") cat("\n status=", STATUS, " from solver ", getSolver(spec), ".", sep = "") cat("\n") stop(call.= FALSE, show.error.messages = "\n returned from Rmetrics") } # Continue: Succesfully computed the minimum risk portfolio ... setWeights(spec) <- attr(portfolio$objective, "weights") setStatus(spec) <- attr(portfolio$objective, "status") # Compose Portfolio: portfolio <- feasiblePortfolio(data, spec, constraints) portfolio@call <- match.call() portfolio@title <- "Minimum Risk Portfolio" # Return Value: portfolio } minriskPortfolio <- function(data, spec = portfolioSpec(), constraints = "LongOnly") { # A function implemented by Diethelm Wuertz # Note: # NEW VERSION DW # FUNCTION: setTargetReturn(spec) <- NULL portfolio <- efficientPortfolio(data, spec, constraints) portfolio@call <- match.call() portfolio@title <- "Minimum Risk Portfolio" # Return Value: portfolio } # ------------------------------------------------------------------------------ minvariancePortfolio <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Computes global minimum variance portfolio # Arguments: # data - a rectangular object of assets # spec - an object of class 'fPFOLIOSPEC' # constraints - a character vector or NULL # FUNCTION: # Portfolio: portfolio <- minriskPortfolio(data, spec, constraints) portfolio@title <- "Minimum Variance Portfolio" # Return Value: portfolio } ################################################################################ maxreturnPortfolio <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Computes target risk and weights for an efficient portfolio # Arguments: # data - a rectangular object of assets # spec - an object of class 'fPFOLIOSPEC' # constraints - a character vector or NULL # FUNCTION: # Match Spec Versus Constraints: # .checkSpecVsConstraints(spec, constraints) # Transform Data: data = portfolioData(data, spec) # Maximize Return: if(is.null(getTargetRisk(spec))) { stop("Missing target risk for maximum return optimization.") } else { # Optimize Portfolio: Solver = match.fun(getSolver(spec)) portfolio = Solver(data, spec, constraints) setWeights(spec) = portfolio$weights setStatus(spec) = portfolio$status Title = "Return Maximized Efficient Portfolio" } # Compose Portfolio: portfolio <- feasiblePortfolio(data, spec, constraints) portfolio@call <- match.call() portfolio@title <- Title # Return Value: portfolio } ################################################################################ fPortfolio/R/mathprogNLP-ampl.R0000644000176200001440000001264612323217770016060 0ustar liggesusers # 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: # ramplNLP Rmetrics Interface for AMPL LP solvers # amplNLP Convenience wrapper for AMPL LP solvers # amplControl AMPL LP control parameter list ################################################################################ ramplNLP <- function( start, objective, lower=0, upper=1, amplCons, control=list(), ...) { # A function implemented by Diethelm Wuertz # FUNCTION: # Control List: ctrl = amplNLPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control = ctrl # General Settings: if (length(start) == 1) { n = start } else { n = length(start) } # Box Constraints: if(length(lower) == 1) { par.lower = rep(lower, n) } else { par.lower = lower } if(length(upper) == 1) { par.upper = rep(upper, n) } else { par.upper = upper } # Controls: solver = control$solver project = control$project trace = control$trace # Add dots ... args <- list(...) m1 = names(match.call(expand.dots = TRUE)) m2 = names(match.call(expand.dots = FALSE)) Names = m1[!(m1 %in% m2)] amplDataOpen(project) amplDataAdd("n", data = n, type = "value", project) amplModelOpen(project) amplModelAdd("param n ;", project) count = 0 for (a in args) { count = count + 1 if(length(a) == 1) { type = "value" } else { if(is.matrix(a)) { type = "matrix" } else { type = "vector" } } if (type == "value") amplModelAdd(paste("param ", Names[count], ";", sep = ""), project) if (type == "vector") amplModelAdd(paste("param ", Names[count], "{1 ..", length(a), "};", sep = ""), project) if (type == "matrix") amplModelAdd(paste("param ", Names[count], "{1..", NCOL(a), ", 1..", NROW(a), "}", ";", sep=""), project) amplDataAdd(Names[count], data = a, type = type, project) } amplModelAdd(paste("param lower {1..", length(par.lower), "};", sep = ""), project) amplModelAdd(paste("param upper {1..", length(par.upper), "};", sep = ""), project) amplDataAdd("lower", data = par.lower, type = "vector", project) amplDataAdd("upper", data = par.upper, type = "vector", project) if(trace) amplDataShow(project) # Add Objective: amplModelAdd("var x{1..n} ;", project) amplModelAdd(paste( "minimize Function: ", objective, sep = ""), project) amplModelAdd(amplCons, project) if(trace) amplModelShow(project) # Write Run File: solver = "ipopt" amplRunOpen(project) run <- c( "reset ;", paste("option solver ", solver, " ;", sep = ""), paste("model ", project, ".mod ;", sep = ""), paste("data ", project, ".dat ;", sep = ""), "solve ;", paste("display x > ", project, ".txt ;", sep = ""), "exit ;") amplRunAdd(run, project) if(trace) amplRunShow(project) # AMPL: command = paste("ampl", paste(project, "run", sep=".")) solve = system(command, show.output.on.console = TRUE) # Read Result: file <- paste(project, "txt", sep = ".") ans = scan(file, what = character()) ans = matrix(as.numeric(ans[-c(1:3, length(ans))]), byrow=TRUE, ncol = 2) index = sort(ans[,1], index.return = TRUE)$ix solution = ans[index, 2] # Return Value: value <- list( opt = args, solution = solution, objective = NA, status = NA, message = "none", solver = "amplNLP") class(value) = c("solver", "list") value } # ----------------------------------------------------------------------------- amplNLP <- function() { # A function implemented by Diethelm Wuertz # FUNCTION: NA } ############################################################################### amplNLPControl <- function(solver = "minos", project = "ampl", trace = FALSE) { # A function implemented by Diethelm Wuertz # FUNCTION: # Control Parameters: control <- list( solver = solver, project = project, trace = trace) # Return Value: control } ############################################################################### fPortfolio/R/frontier-portfolioPlots.R0000644000176200001440000006403212323217770017617 0ustar liggesusers # 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 Description. 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: # frontierPlot Plots efficient frontier # minvariancePoints Adds minimum variance point # cmlPoints Adds market portfolio # cmlLines Adds capital market Line # tangencyPoints Adds tangency portfolio point # tangencyLines Adds tangency line # equalWeightsPoints Adds point of equal weights portfolio # singleAssetPoints Adds points of single asset portfolios # twoAssetsLines Adds EF for all combinations of two assets # sharpeRatioLines Adds Sharpe ratio line # monteCarloPoints Adds randomly produced feasible portfolios # FUNCTION: DESCRIPTION: # frontierPlotControl Sets frontier plot control parameters # FUNCTION: DESCRIPTION: # tailoredFrontierPlot Tailored frontier plot with addons ################################################################################ frontierPlot <- function(object, frontier = c("both", "lower", "upper"), col = c("black", "grey"), add = FALSE, labels = TRUE, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, title = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Plots the efficient frontier # Arguments: # FUNCTION: # Check Settings: stopifnot(length(col) == 2) # Settings: frontier <- match.arg(frontier) fullFrontier = frontierPoints(object, frontier = "both", return = return, risk = risk, auto = auto) upperFrontier <- frontierPoints(object, frontier = "upper", return = return, risk = risk, auto = auto) lowerFrontier <- frontierPoints(object, frontier = "lower", return = return, risk = risk, auto = auto) # Check for 'xlim' Argument: Arg <- match.call(expand.dots = TRUE) m <- match(c("xlim", "ylim"), names(Arg), Arg) xArg <- as.character(Arg[c(1, m)])[2] yArg <- as.character(Arg[c(1, m)])[3] # Plot: if(xArg == "NULL" & yArg == "NULL") { yLim <- range(fullFrontier[, 2]) xRange <- range(fullFrontier[, 1]) xDiff <- diff(xRange) xLim <- c(xRange[1] - 2.5*xDiff/10, xRange[2] + xDiff/10) # Plot: if(!add){ if(frontier == "upper" | frontier == "both") { plot(upperFrontier, col = col[1], xlim = xLim, ylim = yLim, ann = FALSE, ...) } else { if( frontier == "both") { points(fullFrontier, col = col[2], xlim = xLim, ylim = yLim, ...) } if(frontier == "lower" ) { plot(lowerFrontier, col = col[2], xlim = xLim, ylim = yLim, ann = FALSE, ...) } } } if(frontier == "upper" | frontier == "both") { points(upperFrontier, col = col[1], ...) } if(frontier == "lower" | frontier == "both") { points(lowerFrontier, col = col[2], ...) } } else if (xArg != "NULL" & yArg == "NULL") { # In this case only xlim is specified in the argument list yLim = range(fullFrontier[, 2]) # Plot: if(!add){ if(frontier == "upper" | frontier == "both") { plot(upperFrontier, col = col[1], ylim = yLim, ann = FALSE, ...) } else { if( frontier == "both") { points(fullFrontier, col = col[2], ylim = yLim, ...) } if(frontier == "lower" ) { plot(fullFrontier, col = col[2], ylim = yLim, ann = FALSE, ...) } } } if(frontier == "upper" | frontier == "both") { points(upperFrontier, col = col[1], ...) } if(frontier == "lower" | frontier == "both") { points(lowerFrontier, col = col[2], ...) } } else if(xArg == "NULL" & yArg != "NULL") { # In this only ylim is specified in the argument list xRange = range(fullFrontier[, 1]) xDiff = diff(xRange) xLim = c(xRange[1] - 2.5*xDiff/10, xRange[2] + xDiff/10) # Plot: if(!add){ if(frontier == "upper" | frontier == "both") { plot(upperFrontier, col = col[1], xlim = xLim, ann = FALSE, ...) } else { if( frontier == "both") { points(fullFrontier, col = col[2], xlim = xLim, ...) } if(frontier == "lower" ) { plot(lowerFrontier, col = col[2], xlim = xLim, ann = FALSE,...) } } } if(frontier == "upper" | frontier == "both") { points(upperFrontier, col = col[1], ...) } if(frontier == "lower" | frontier == "both") { points(lowerFrontier, col = col[2], ...) } } else if (xArg != "NULL" & yArg != "NULL"){ # If both xlim and ylim are not defined in argument list ... if(!add){ if(frontier == "upper" | frontier == "both") { plot(fullFrontier, type = "n", ann = FALSE, ...) points(upperFrontier, col = col[1], ...) } if(frontier == "both") { points(lowerFrontier, col = col[2], ...) } if(frontier == "lower") { plot(lowerFrontier, col = col[2], ann = FALSE, ...) } } else{ if(frontier == "upper" | frontier == "both") { points(upperFrontier, col = col[1], ...) } if(frontier == "lower" | frontier == "both") { points(lowerFrontier, col = col[2], ...) } } } # Add Title: if (title) { labs = attr(fullFrontier, "control") title( main = "Efficient Frontier", xlab = paste("Target Risk[", labs[1], "]", sep = ""), ylab = paste("Target Return[", labs[2], "]", sep = "")) } # Add Rmetrics - Do not Remove! mtext("Rmetrics", adj=0, side=4, cex=0.7, col="darkgrey") # Return Value: invisible(fullFrontier) } # ------------------------------------------------------------------------------ minvariancePoints <- function(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Adds the minimum risk point to a MV and CVaR portfolio plot # Arguments: # FUNCTION: # Match Arguments: return <- match.arg(return) risk <- match.arg(risk) # Get Portfolio Slots: data <- getSeries(object) spec <- getSpec(object) constraints <- getConstraints(object) # Add Minimum Variance Point: mvPortfolio <- minvariancePortfolio(data, spec, constraints) assets <- frontierPoints(mvPortfolio, return = return, risk = risk, auto = auto) points(assets, ...) # Return Value: invisible(assets) } # ------------------------------------------------------------------------------ cmlPoints <- function(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Adds the capital market line to a portfolio plot # Arguments: # FUNCTION: # Match Arguments: return <- match.arg(return) risk <- match.arg(risk) # Get Portfolio Statistics: data <- getSeries(object) spec <- getSpec(object) constraints <- getConstraints(object) # Add Capital Market Line Tangency Point: cmlPortfolio <- tangencyPortfolio(data, spec, constraints) assets <- frontierPoints(cmlPortfolio, return = return, risk = risk, auto = auto) points(assets, ...) # Return Value: invisible(assets) } # ------------------------------------------------------------------------------ cmlLines <- function(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Adds the capital market line to a portfolio plot # Arguments: # FUNCTION: # Match Arguments: return <- match.arg(return) risk <- match.arg(risk) # Get Portfolio Statistics: data <- getSeries(object) spec <- getSpec(object) constraints <- getConstraints(object) # Add Capital Market Line: cmlPortfolio <- tangencyPortfolio(data, spec, constraints) riskFreeRate <- getRiskFreeRate(spec) slope <- ((getTargetReturn(cmlPortfolio)[, "mean"] - riskFreeRate) / getTargetRisk(cmlPortfolio@portfolio)[, "Cov"]) if(slope > 0) { abline(riskFreeRate, slope, ...) } else { warning("CML Line does not exist") } # Return Value: invisible(slope) } # ------------------------------------------------------------------------------ tangencyPoints <- function(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Adds tangency point and line to a MV and CVaR portfolio plot # Arguments: # FUNCTION: # Match Arguments: return <- match.arg(return) risk <- match.arg(risk) # Get Portfolio Slots: data <- getSeries(object) spec <- getSpec(object) constraints <- getConstraints(object) # Compute Tangency Portfolio: tgPortfolio <- tangencyPortfolio(data, spec, constraints) # Add Tangency Point: assets <- frontierPoints(tgPortfolio, return = return, risk = risk, auto = auto) points(assets, ...) # Return Value: invisible(assets) } # ------------------------------------------------------------------------------ tangencyLines <- function(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Adds tangency point and line to a MV and CVaR portfolio plot # Arguments: # FUNCTION: # Match Arguments: return = match.arg(return) risk = match.arg(risk) # Get Portfolio Slots: data <- getSeries(object) spec <- getSpec(object) constraints <- getConstraints(object) riskFreeRate <- getRiskFreeRate(object) # Compute Tangency Portfolio: tgPortfolio = tangencyPortfolio(data, spec, constraints) # Add Tangency Line: assets <- frontierPoints(tgPortfolio, return = return, risk = risk, auto = auto) slope <-( assets[2] - riskFreeRate ) / assets[1] if (slope > 0) { abline(riskFreeRate, slope, ...) } else { warning("Tangency point does not exist") } # Return Value: invisible(list(slope = slope, assets = assets)) } # ------------------------------------------------------------------------------ equalWeightsPoints = function(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Adds equal weights portfolio to a portfolio plot # Arguments: # FUNCTION: # Match Arguments: return <- match.arg(return) risk <- match.arg(risk) # Get Portfolio Statistics: data <- getSeries(object) spec <- getSpec(object) constraints <- getConstraints(object) numberOfAssets <- getNAssets(object) # Set Equal Weights: setWeights(spec) <- rep(1/numberOfAssets, times = numberOfAssets) # Add Equal Weights Portfolio: ewPortfolio <- feasiblePortfolio(data, spec, constraints) assets <- frontierPoints(ewPortfolio, return = return, risk = risk, auto = auto) points(assets, ...) # Return Value: invisible(assets) } # ------------------------------------------------------------------------------ singleAssetPoints <- function(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Adds all single assets returns and risks to a portfolio plot # Arguments: # FUNCTION: # Add Single Assets: Statistics <- getStatistics(object) Type <- getType(object) # Match Arguments: return <- match.arg(return) risk <- match.arg(risk) # Get auto Risk: if (auto) { return = "mu" Type = getType(object) Estimator = getEstimator(object) if (Type == "MV") risk = "Cov" if (Type == "MV" & Estimator != "covEstimator") risk = "Sigma" if (Type == "QLPM") risk = "Sigma" if (Type == "CVaR") risk = "CVaR" } # Extract Return: if (return == "mean") { Return = Statistics$mean } else if (return == "mu") { Return = Statistics$mu } # Extract Risk: if (risk == "Cov") { Risk = sqrt(diag(Statistics$Cov)) } else if (risk == "Sigma") { Risk = sqrt(diag(Statistics$Sigma)) } else if (risk == "CVaR") { nAssets = getNAssets(object) Data = getSeries(object) alpha = getAlpha(object) Risk = NULL for (i in 1:nAssets) Risk = c(Risk, -.cvarRisk(Data[ ,i], 1, alpha)) } else if (risk == "VaR") { nAssets = getNAssets(object) Data = getSeries(object) alpha = getAlpha(object) Risk = NULL for (i in 1:nAssets) Risk = c(Risk, -.varRisk(Data[ ,i], 1, alpha)) } Risk = as.vector(Risk) # Add Points: assets = cbind(targetRisk = Risk, targetReturn = Return) attr(assets, "control") <- c(targetRisk = risk, targetReturn = return, auto = as.character(auto)) points(assets, ...) # Return Value: invisible(assets) } # ------------------------------------------------------------------------------ twoAssetsLines <- function(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Adds efficient long-only frontier of all portfolio pairs # Arguments: # Note: # Only supported for "Short" and "LongOnly" Constraints! # FUNCTION: # Supported ? check <- rev(attr(object@constraints, "model"))[1] # Match Arguments: return <- match.arg(return) risk <- match.arg(risk) # Get Portfolio Statistics: data <- getSeries(object) Data <- getData(object) mu <- getMu(Data) Sigma <- getSigma(Data) spec <- getSpec(object) constraints <- getConstraints(object) # Add Frontiers for all Two-Assets Portfolios: N <- getNAssets(object) setWeights(spec) = NULL for (i in 1:(N-1) ) { for (j in (i+1):N ) { index = c(i, j) data2 = data[, index] Data2 = portfolioData(data2, spec) Data2@statistics$mu <- mu[index] Data2@statistics$Sigma <- Sigma[index, index] ans = portfolioFrontier(data = Data2, spec = spec) lines(frontierPoints(ans, return = return, risk = risk, auto = auto), ...) } } # Return Value: invisible() } # ------------------------------------------------------------------------------ sharpeRatioLines <- function(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Adds Sharpe Ratio # Arguments: # FUNCTION: # Match Arguments: return = match.arg(return) risk = match.arg(risk) # Get Portfolio Slots: data <- getSeries(object) spec <- getSpec(object) constraints <- getConstraints(object) riskFreeRate <- getRiskFreeRate(object) Type <- getType(object) # Efficient Frontier: frontPoints <- frontierPoints(object, frontier = "upper", return = return, risk = risk, auto = auto) x <- frontPoints[, 1] y <- frontPoints[, 2] - riskFreeRate # Tangency Portfolio: tangencyPortfolio <- tangencyPortfolio(data, spec, constraints) # x.tg = getTargetReturn(tangencyPortfolio@portfolio)["mean"] x.tg = frontierPoints(tangencyPortfolio, return = return, risk = risk, auto = auto)[, 2] # Normalization to fit in EF Plot: norm <- x.tg / max(y/x) index <- 2:length(x) #index = index[diff(x) > 0] x <- x[index] y <- y[index] y.norm <- (y/x*norm) assets <- cbind(x, y.norm) lines(x, y.norm, ...) # Search for Maximum: index <- which.max(y.norm) points(x[index], y.norm[index], col = "cyan", cex = 1.5) # Add Tailored Labels - 2 may be a good Number ... x.tg <- x.tg[index] norm2 <- x.tg / max(y) Range <- range(y/x * norm) # Take a reasonable number of significant digits to plot, e.g. 2 ... nPrecision <- 3 Labels <- signif(Range, nPrecision) axis(4, at = Range, labels = c(" ", " "), cex.axis = 0.75) axis(4, at = mean(Range), labels = paste(Labels[1], " ", Labels[2]), cex.axis = 0.75) # Add Axis Labels and Title: mtext("Sharpe Ratio", side = 4, line = 2, cex = 0.75) # Return Value: invisible(assets) } # ------------------------------------------------------------------------------ monteCarloPoints <- function(object, mcSteps = 5000, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Adds randomly feasible portfolios to a plot # Arguments: # FUNCTION: # Match Arguments: return = match.arg(return) risk = match.arg(risk) # Get Portfolio Statistics: Statistics = getStatistics(object) Type = getType(object) mu = Statistics$mu Sigma = Statistics$Sigma N = length(mu) # Get Specification: if (Type == "MV") { # Get Constraints Model: Model = rev(attr(object@constraints, "model"))[1] Model = "LongOnly" if (Model == "Short" | any(getConstraints(object) == "Short")) { # Monte Carlo Loop - Short: for (k in 1:mcSteps) { s = sign(rnorm(N, mean = rnorm(1))) weights = s * abs(rcauchy(N)) weights = weights / sum(weights) Return = as.numeric(mu %*% weights) Risk = sqrt( as.numeric( t(weights) %*% Sigma %*% (weights) ) ) points(Risk, Return, ...) } } else if (Model == "LongOnly" | any(getConstraints(object) == "LongOnly")) { # Monte Carlo Loop - Long Only: for (k in 1:mcSteps) { weights = abs(rcauchy(N)) weights = weights / sum(weights) Return = as.numeric(mu %*% weights) Risk = sqrt( as.numeric( t(weights) %*% Sigma %*% (weights) ) ) points(Risk, Return, ...) } } else { cat("\n\tOnly for Short and LongOnly Portfolios\n") } } else if (Type == "CVaR") { # Monte Carlo Loop - Long Only: x = getSeries(object) alpha = getAlpha(object) for (k in 1:mcSteps) { weights = abs(rcauchy(N)) weights = weights / sum(weights) Return = as.numeric(mu %*% weights) Risk = .cvarRisk(x, weights, alpha) points(-Risk, Return, ...) } } # Return Value: invisible() } ################################################################################ frontierPlotControl <- function( # Colors: sharpeRatio.col = "blue", minvariance.col = "red", tangency.col = "steelblue", cml.col = "green", equalWeights.col = "blue", singleAsset.col = "topo.colors", twoAssets.col = "grey", monteCarlo.col = "black", # Point Sizes: minvariance.cex = 1.25, tangency.cex = 1.25, cml.cex = 1.25, equalWeights.cex = 1.25, singleAsset.cex = 1.25, twoAssets.cex = 0.01, monteCarlo.cex = 0.01, sharpeRatio.cex = 0.1, # Limits: xlim = NULL, ylim = NULL, # MC Steps: mcSteps = 5000, # Pie Settings: pieR = NULL, piePos = NULL, pieOffset = NULL ) { # A function implemented by Diethelm Wuertz # Description: # Sets frontier plot control parameters # Arguments: # FUNCTION: # Return Value: list( # Colors: sharpeRatio.col = sharpeRatio.col, minvariance.col = minvariance.col, tangency.col = tangency.col, cml.col = cml.col, equalWeights.col = equalWeights.col, singleAsset.col = singleAsset.col, twoAssets.col = twoAssets.col, monteCarlo.col = monteCarlo.col, # Point Sizes: minvariance.cex = minvariance.cex, tangency.cex = tangency.cex, cml.cex = cml.cex, equalWeights.cex = equalWeights.cex, singleAsset.cex = singleAsset.cex , twoAssets.cex = twoAssets.cex, monteCarlo.cex = monteCarlo.cex, sharpeRatio.cex = sharpeRatio.cex, # Limits: xlim = xlim, ylim = ylim, # MC Steps: mcSteps = 5000, # Pie Settings: pieR = pieR, piePos = piePos, pieOffset = pieOffset ) } ################################################################################ tailoredFrontierPlot <- function(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), mText = NULL, col = NULL, xlim = NULL, ylim = NULL, twoAssets = FALSE, sharpeRatio = TRUE, title = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Creates an easy to use tailored frontier plot # Arguments: # object - a portfolio object # mtext - not used # FUNCTION: # 1. Plot the Frontier, add margin text, grid and ablines: offset <- 0.10 risk <- match.arg(risk) return <- match.arg(return) # x - Range: if (is.null(xlim)) { if (risk == "Cov") { xmax <- max(sqrt(diag(getCov(object)))) } if (risk == "Sigma") { xmax <- max(sqrt(diag(getSigma(object)))) } if (risk == "CVaR") { alpha <- getAlpha(object) quantiles <- colQuantiles(getSeries(object), prob = alpha) n.max <- which.max(-quantiles) r <- getSeries(object)[, n.max] r <- r[r < quantiles[n.max]] xmax <- -mean(r) } if (risk == "VaR") { xmax <- max(-colQuantiles(getSeries(object), prob = alpha)) } xlim <- c(0, xmax) Xlim <- c(xlim[1]-diff(xlim)*offset, xlim[2]+diff(xlim)*offset) } else { Xlim <- xlim } # y - Range: if (is.null(ylim)) { if (return == "mean") { ylim <- range(getMean(object)) } else { ylim <- range(getMu(object)) } Ylim <- c(ylim[1]-diff(ylim)*offset, ylim[2]+diff(ylim)*offset) } else { Ylim = ylim } # Frontier Plot: frontierPlot(object, labels = FALSE, return = return, risk = risk, auto = FALSE, xlim = Xlim, ylim = Ylim, title = title, pch = 19, ...) # Add Grid: grid() # Add Center-Hair Cut: abline(h = 0, col = "grey") abline(v = 0, col = "grey") # 2. Add minimum risk (variance) Portfolio Point: data <- getData(object) spec <- getSpec(object) constraints <- getConstraints(object) mvPortfolio <- minvariancePortfolio(data, spec, constraints) minvariancePoints(object, return = return, risk = risk, auto = FALSE, pch = 19, col = "red") # 3. Add Tangency Portfolio Point and Tangency Line: tangencyPoints(object, return = return, risk = risk, auto = FALSE, pch = 19, col = "blue") tangencyLines(object, return = return, risk = risk, auto = FALSE, col = "blue") # 4. Add Equal Weights Portfolio: xy <- equalWeightsPoints(object, return = return, risk = risk, auto = FALSE, pch = 15, col = "grey") text(xy[, 1]+diff(xlim)/20, xy[, 2]+diff(ylim)/20, "EWP", font = 2, cex = 0.7) # 5. Add all Assets Points: if (is.null(col)) col = rainbow(6) xy <- singleAssetPoints(object, return = return, risk = risk, auto = FALSE, cex = 1.5, col = col, lwd = 2) text(xy[, 1]+diff(xlim)/20, xy[, 2]+diff(ylim)/20, rownames(xy), font = 2, cex = 0.7) # 6. Add optionally all Two Assets Lines if (twoAssets) { twoAssetsLines(object, return = return, risk = risk, auto = FALSE, lty = 3, col = "grey") } # 6. Add Sharpe Ratio Line: if(sharpeRatio) { sharpeRatioLines(object, return = return, risk = risk, auto = FALSE, col = "orange", lwd = 2) } # Add Rmetrics - Do not Remove! mtext("Rmetrics", adj=0, side=4, cex=0.7, col="darkgrey") # Return Value: invisible(list(object=object, xlim=Xlim, ylim=Ylim)) } ################################################################################ fPortfolio/R/mathprogLP-symphony.R0000644000176200001440000001033112620372204016656 0ustar liggesusers # 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: # rsymphonyLP Rmetrics Interface for SYMPHONY LP solvers # symphonyLP Convenience wrapper for SYMPHONY LP solvers # symphonyLPControl SYMPHONY LP control parameter list ############################################################################### rsymphonyLP <- function(objective, lower=0, upper=1, linCons, control=list()) { # A function implemented by Diethelm Wuertz # Description: # Function wrapper for symphony solver # Argments: # objective - numeric vector. # lwer, upper - box constraints # linCons - linear constraints: mat, lower and upper # control - control list # FUNCTION: # Update Control List: ctrl <- symphonyLPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl # Box Constraints: N = length(objective) if(length(lower) == 1) { par.lower <- rep(lower, N) } else { par.lower <- lower } if(length(upper) == 1) { par.upper <- rep(upper, N) } else { par.upper <- upper } bounds <- list( lower = list(ind = 1:N, val = par.lower), upper = list(ind = 1:N, val = par.upper)) # Linear Constraints: mat <- linCons[[1]] M <- nrow(mat) lower <- as.vector(linCons[[2]]) upper <- as.vector(linCons[[3]]) if(length(lower) == 1) { lower <- rep(lower, M) } else { lower <- lower } if(length(upper) == 1) { upper <- rep(upper, M) } else { upper <- upper } eqIndex <- which(lower == upper) ineqIndex <- which(lower != upper) eqA <- mat[eqIndex, ] ineqA <- mat[ineqIndex, ] mat <- rbind(eqA, ineqA, ineqA) dir <- c(rep("==", length(eqIndex)), rep("<=", length(ineqIndex)), rep(">=", length(ineqIndex))) rhs <- c(upper[eqIndex], upper[ineqIndex], lower[ineqIndex]) mat <- mat[is.finite(rhs), ] dir <- dir[is.finite(rhs)] rhs <- rhs[is.finite(rhs)] # Optimize Portfolio: optim <- symphonyLP( obj = objective, mat = mat, dir = dir, rhs = rhs, bounds = bounds, types = NULL, max = FALSE) # Version: version <- paste(packageDescription("Rsymphony")[1:3], collapse=" ") # Return Value: value = list( opt = optim, solution = optim$solution, objective = optim$objval, status = optim$status[[1]], message = names(optim$status), solver = paste("R", control$solver), version = version) class(value) <- c("solver", "list") value } # ----------------------------------------------------------------------------- symphonyLP <- function(...) { Rsymphony::Rsymphony_solve_LP(...) } # ----------------------------------------------------------------------------- symphonyLPControl <- function(solver="symphony", project="r", trace=FALSE) { # A function implemented by Diethelm Wuertz # Description: # Returns control parameter list # FUNCTION: # Return Value: list(solver=solver, trace=trace) } ############################################################################### fPortfolio/R/portfolio-rollingPfolio.R0000644000176200001440000001650312323217770017564 0ustar liggesusers ################################################################################ # FUNCTION: DESCRIPTION: # rollingWindows Returns a list of rolling window frames # FUNCTION: DESCRIPTION: # rollingCmlPortfolio Rolls a CML portfolio # rollingTangencyPortfolio Rolls a tangency portfolio # rollingMinvariancePortfolio Rolls a minimum risk portfolio # FUNCTION: DESCRIPTION: # rollingPortfolioFrontier Rolls a portfolio frontier ################################################################################ rollingWindows <- function(x, period = "12m", by = "1m") { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Returns vectors of start and end dates for a rolling time series # Arguments: # x - a timeSeries 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. "1m" means one month # Note: # Only "monthly" frequencies are currently supported. # Example: # x = sort(as.timeSeries(data(smallcap.ts))); rollingWindows(x) # FUNCTION: # 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 - expand series x to a monthly series: positions = time(x) startPositions = unique(timeFirstDayInMonth(positions)) # for non monthly data # series(startPositions)[1] <- as.vector(start(x)) endPositions = unique(timeLastDayInMonth(positions)) # for non monthly data # series(endPositions)[length(endPositions)] <- as.vector(end(x)) numberOfPositions = length(startPositions) startSeq <- seq( from = 1, to = (numberOfPositions-periodLength + 1), by = byLength) startDates = startPositions[startSeq] endSeq <- seq(from = periodLength, to = numberOfPositions, by = byLength) endDates = endPositions[endSeq] # Windows: windows = list( from = startDates, to = endDates) attr(windows, "control") = list( start = start(positions), end = end(positions), period = period, by = by) # Return Value: windows } # ------------------------------------------------------------------------------ rollingCmlPortfolio <- function(data, spec, constraints, from, to, action = NULL, title = NULL, description = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Computes EF on a rolling timeSeries Windows # Arguments: # FUNCTION: # Roll the Frontier and return it in a list: roll = list() for (i in 1:length(from)) { # Data must be a multivariate timeSeries object ... series = cut(data, from = from[i], to = to[i]) # Calculation efficient frontiers and save them all in a list: portfolio = tangencyPortfolio(data = series, spec, constraints) roll[[i]] = portfolio # Now you can do any "action" you want to do with the EFs: if (!is.null(action)) { fun = match.fun(action) fun(roll, from, to, ...) } } # Return Value: invisible(roll) } # ------------------------------------------------------------------------------ rollingTangencyPortfolio <- function(data, spec, constraints, from, to, action = NULL, title = NULL, description = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Computes EF on a rolling timeSeries Windows # Arguments: # windows - a list with two named 'timeDate' entries, "from" and # "to", defining the start and end dates of your windows. # ... - optional parameters which can be directed to the optional # function action(). # FUNCTION: # Roll the Frontier and return it in a list: roll = list() for (i in 1:length(from)) { # Data must be a multivariate timeSeries object ... series = cut(data, from = from[i], to = to[i]) # Calculation efficient frontiers and save them all in a list: portfolio = tangencyPortfolio(data = series, spec, constraints) roll[i] = portfolio # Now you can do any "action" you want to do with the EFs: if (!is.null(action)) { fun = match.fun(action) fun(roll, from, to, ...) } } # Return Value: invisible(roll) } # ------------------------------------------------------------------------------ rollingMinvariancePortfolio <- function(data, spec, constraints, from, to, action = NULL, title = NULL, description = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Computes EF on a rolling timeSeries Windows # Arguments: # windows - a list with two named 'timeDate' entries, "from" and # "to", defining the start and end dates of your windows. # ... - optional parameters which can be directed to the optional # function action(). # FUNCTION: # Roll the Frontier and return it in a list: roll = list() for (i in 1:length(from)) { # Data must be a multivariate timeSeries object ... series = cut(data, from = from[i], to = to[i]) # Calculation efficient frontiers and save them all in a list: portfolio = minvariancePortfolio(data = series, spec, constraints) roll[i] = portfolio # Now you can do any "action" you want to do with the EFs: if (!is.null(action)) { fun = match.fun(action) fun(roll, from, to, ...) } } # Return Value: invisible(roll) } ################################################################################ rollingPortfolioFrontier <- function(data, spec, constraints, from, to, action = NULL, title = NULL, description = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Computes EF on a rolling timeSeries Windows # Arguments: # windows - a list with two named 'timeDate' entries, "from" and # "to", defining the start and end dates of your windows. # ... - optional parameters which can be directed to the optional # function action(). # FUNCTION: # Roll the Frontier and return it in a list: roll = list() for (i in 1:length(from)) { # Data must be a multivariate timeSeries object ... series = cut(data, from = from[i], to = to[i]) # Calculation efficient frontiers and save them all in a list: frontier = portfolioFrontier(data = series, spec, constraints, title = title, description = description) roll[i] = frontier # Now you can do any "action" you want to do with the EFs: if (!is.null(action)) { fun = match.fun(action) fun(roll, from, to, ...) } } # Return Value: invisible(roll) } ################################################################################ fPortfolio/R/a-class-fPFOLIOCON.R0000644000176200001440000000415612323217770015752 0ustar liggesusers # 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 Description. 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: # 'fPORTFOLIOCON' S4 Portfolio Constraints Class ################################################################################ setClass("fPFOLIOCON", representation( # Function Implemented by Diethelm Wuertz # Constraints expressed by strings # LongOnly, Short, Full, ... stringConstraints = "character", # BoxConstraints: minWConstraints = "numeric", maxWConstraints = "numeric", # Group Constraints: eqsumWConstraints = "matrix", minsumWConstraints = "matrix", maxsumWConstraints = "matrix", # Covariance Risk Budget Constraints: minBConstraints = "numeric", maxBConstraints = "numeric", # Nonlinear Constraints: listFConstraints = "list", minFConstraints = "numeric", maxFConstraints = "numeric", # Buyin Constraints: minBuyinConstraints = "numeric", maxBuyinConstraints = "numeric", # Cardinality Constraints: nCardConstraints = "integer", minCardConstraints = "numeric", maxCardConstraints = "numeric") ) ################################################################################ fPortfolio/R/backtest-pfolioBacktestSpec.R0000644000176200001440000000533412323217770020314 0ustar liggesusers # 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: # portfolioBacktest Returns an object of class fPFOLIOBACKTEST ################################################################################ portfolioBacktest <- function( windows = list( windows = "equidistWindows", params = list( horizon = "12m")), strategy = list( strategy = "tangencyStrategy", params = list()), smoother = list( smoother = "emaSmoother", params = list( doubleSmoothing = TRUE, lambda = "3m", skip = 0, initialWeights = NULL)), messages = list() ) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Specifies a portfolio to be optimized from scratch # Example: # portfolioBacktest() # Arguments: # windows - rolling windows slot: # windows - the name of the rollings windows function # params - parameter list for windows settings: # horizon - length of the rolling windows # strategy - portfolio strategy slot: # strategy - the name of the portfolio strategy function # params - parameter list for strategy settings: # smoother - smoother approach slot: # smoother - the name of the portfolio weights smoother function # params - parameter list for smoother settings: # doubleSmoothing - a flag sould we double smooth the weights? # lambda - length of the ema smoothing parameter # skip - hoqw many periods should be skipped for smoothing ? # initialWeights - vector of initial weights # FUNCTION: # Return Value: new("fPFOLIOBACKTEST", windows = windows, strategy = strategy, smoother = smoother, messages = messages) } ################################################################################ fPortfolio/R/portfolio-feasiblePfolio.R0000644000176200001440000001107312323217770017665 0ustar liggesusers # 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 Description. 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: # feasiblePortfolio Returns a feasible portfolio ################################################################################ feasiblePortfolio <- function(data, spec = portfolioSpec(), constraints = "LongOnly") { # A function implemented Diethelm Wuertz # Description: # Computes Risk and Return for a feasible portfolio # Arguments: # data - a rectangular timeSeries object of assets # spec - an object of class 'fPFOLIOSPEC' # constraints - a character vector or NULL # FUNCTION: # Data and Assets Names: Data <- portfolioData(data, spec) if(class(data) == "fPFOLIODATA") data <- getSeries(Data) assetsNames <- getUnits(Data) # Specification: Spec <- spec # Constraints: Constraints <- portfolioConstraints(Data, spec, constraints) # Get Weights: if(is.null(getWeights(spec))) { stop("Missing weights") } weights <- as.vector(getWeights(spec)) names(weights) <- assetsNames if (class(getSeries(Data)) == "timeSeries") { # Compute Returns: targetReturn <- c( mean = (Data@statistics$mean %*% weights)[[1]], mu = (Data@statistics$mu %*% weights)[[1]]) setTargetReturn(spec) <- targetReturn # Compute Covariance Risk: Cov <- Data@statistics$Cov cov <- sqrt((weights %*% Cov %*% weights)[[1]]) # Check Solver: # if (any(constraints@stringConstraints == "Short")) { # setSolver(spec) = "solveRshortExact" # warning("Short Constraints Specified: Solver forced to solveRshortExact") # } # Compute Alternative/Robust Covariance Risk: if (getType(spec) == "SPS") { myCheck <- TRUE funSigma <- match.fun(getObjective(spec)[1]) rcov <- funSigma(as.vector(weights)) } else { Sigma <- Data@statistics$Sigma rcov <- sqrt((weights %*% Sigma %*% weights)[[1]]) } # Compute VaR: alpha <- getAlpha(spec) returns <- getDataPart(getSeries(Data)) %*% weights VaR <- quantile(returns, alpha, type = 1) # Compute CVaR: CVaR <- VaR - 0.5*mean(((VaR-returns) + abs(VaR-returns))) / alpha # Compose Risks: targetRisk <- c(cov, rcov, -CVaR, -VaR) names(targetRisk) <- c("Cov", "Sigma", "CVaR", "VaR") alpha <- getAlpha(Spec) } else if (class(getSeries(Data)) == "logical") { # Compute Returns: targetReturn <- c( mean = (Data@statistics$mean %*% weights)[[1]], mu = NA) setTargetReturn(spec) <- targetReturn # Compute Covariance Risk: Cov <- Data@statistics$Cov cov <- sqrt((weights %*% Cov %*% weights)[[1]]) # Compose Risks: targetRisk <- c(cov, NA, NA, NA) names(targetRisk) <- c("Cov", "Sigma", "CVaR", "VaR") alpha <- NA } # Compute Risk Budgets: covRiskBudgets <- (weights * Cov %*% weights)[, 1] / cov^2 names(covRiskBudgets) <- assetsNames # Compose Portfolio: Portfolio <- new("fPFOLIOVAL", portfolio = list( weights = weights, covRiskBudgets = covRiskBudgets, targetReturn = targetReturn, targetRisk = targetRisk, targetAlpha = alpha, status = getStatus(spec))) # Return Value: new("fPORTFOLIO", call = match.call(), data = Data, spec = Spec, constraints = Constraints, portfolio = Portfolio, title = "Feasible Portfolio", description = description() ) } ################################################################################ fPortfolio/R/portfolio-riskPfolio.R0000644000176200001440000002611612620132672017064 0ustar liggesusers # 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 Description. 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: # pfolioVaR Computes VaR for a portfolio of assets # pfolioCVaR Computes CVaR for a portfoluio of assets # pfolioCVaRplus Computes CVaR-Plus for a portfolio of assets # lambdaCVaR Computes CVaR's atomic split value lambda # pfolioCVaRoptim Computes CVaR from mean-CVaR portfolio optimization # FUNCTION: DESCRIPTION: # pfolioMaxLoss Computes maximum loss for a portfolio # pfolioReturn Computes return series for a portfolio # pfolioTargetReturn Computes target return for a portfolio # pfolioTargetRisk Computes target risk for a portfolio # pfolioHist Plots a histogram of portfolio returns ################################################################################ pfolioVaR <- function(x, weights = NULL, alpha = 0.05) { # A function implemented by Diethelm Wuertz # Description: # Compute Value-at-Risk for a portfolio of assets # Arguments: # x - a time series, data.frame or any other rectangular object # of assets which can be written as a matrix object # weights - a numeric vector of weights # alpha - the confidence level # FUNCTION: # Transform: x <- as.matrix(x) # Compute Portfolio VaR: if (is.null(weights)) weights <- rep(1/dim(x)[[2]], dim(x)[[2]]) n <- dim(x)[1] x <- apply(t(t(x) * weights), 1, sum) n.alpha <- max(floor(n * alpha)) ans <- as.vector(sort(x)[n.alpha]) names(ans) <- "VaR" # Return Value: ans } # ------------------------------------------------------------------------------ pfolioCVaRplus <- function(x, weights = NULL, alpha = 0.05) { # A function implemented by Diethelm Wuertz # Description: # Compute Value-at-Risk Plus for a portfolio of assets # Arguments: # x - a time series, data.frame or any other rectangular object # of assets which can be written as a matrix object # weights - a numeric vector of weights # alpha - the confidence level # FUNCTION: # Transform: x <- as.matrix(x) # Compute Portfolio CVaRplus: if (is.null(weights)) weights = rep(1/dim(x)[[2]], dim(x)[[2]]) n <- dim(x)[1] x <- apply(t(t(x) * weights), 1, sum) n.alpha <- max(1, floor(n * alpha)-1) ans <- as.vector(mean(sort(x)[1:n.alpha])) names(ans) <- "CVaRplus" # Return Value: ans } # ------------------------------------------------------------------------------ pfolioCVaR <- function(x, weights = NULL, alpha = 0.05) { # A function implemented by Diethelm Wuertz # Description: # Compute Conditional Value-at-risk for a portfolio of assets # Arguments: # x - a time series, data.frame or any other rectangular object # of assets which can be written as a matrix object # weights - a numeric vector of weights # alpha - the confidence level # lambda - split value # FUNCTION: # Transform: data <- as.matrix(x) # Input Data: if (is.null(weights)) weights = rep(1/dim(data)[[2]], dim(data)[[2]]) n <- dim(data)[1] Rp <- apply(t(t(data)*weights), 1, sum) # Sort the Portfolio returns Y sorted <- sort(Rp) # Compute Portfolio VaR: n.alpha <- floor(n*alpha) VaR <- sorted[n.alpha] # Compute Portfolio CVaRplus: n.alpha <- max(1, floor(n*alpha)-1) CVaRplus <- mean(sorted[1:n.alpha]) # Compute Portfolio CVaR: lambda <- 1 - floor(n*alpha)/(n*alpha) ans <- as.vector(lambda*VaR + (1-lambda)*CVaRplus) names(ans) <- "CVaR" attr(ans, "control") = c(CVaRplus = CVaRplus, lambda = lambda) # Return Value: ans } # ------------------------------------------------------------------------------ lambdaCVaR <- function(n, alpha = 0.05) { # A function implemented by Diethelm Wuertz # Description: # Computes CVaR's atomic split value lambda # Arguments: # n - the number of oberservations # alpha - the confidence interval # FUNCTION: # Compute CVaR lambda: lambda <- 1 - floor(alpha * n) / (alpha * n) names(lambda) <- "lambda" # Return Value: lambda } # ------------------------------------------------------------------------------ pfolioCVaRoptim <- function(x, weights = NULL, alpha=0.05) { # A function implemented by Diethelm Wuertz # Description: # Compute Conditional Value-at-risk by mean-CVaR portfolio Optimization # Arguments: # x - a time series, data.frame or any other rectangular object # of assets which can be written as a matrix object # weights - a numeric vector of weights # alpha - the confidence level # FUNCTION: # Transform: data <- as.matrix(x) if (is.null(weights)) weights <- rep(1/dim(data)[[2]], dim(data)[[2]]) Rp <- apply(t(t(data) * weights), 1, sum) .f <- function(VaR, data, weights, alpha) { S <- nrow(data) X <- apply(t(t(data) * weights), 1, sum) -VaR CVaR <- VaR + sum((X - abs(X))/2) / S / alpha CVaR } # Compute optimized CVaR: ans <- optimize(.f, interval=range(Rp), tol=.Machine$double.eps, maximum=TRUE, data=data, weights=weights, alpha=alpha) ans <- ans$objective names(ans) <- "CVaRoptim" # Return Value: ans } ################################################################################ pfolioMaxLoss <- function(x, weights = NULL) { # A function implemented by Diethelm Wuertz # Description: # Computes maximum loss for a portfolio of assets # Arguments: # x - a timeSeries, data.frame or any other rectangular object # of assets which can be written as a matrix object # weights - the vector of weights # alpha - the confidence level # FUNCTION: # Transform: x <- as.matrix(x) # Compute MaxLoss [MinReturn]: if (is.null(weights)) { weights = rep(1/dim(x)[[2]], dim(x)[[2]]) } x = apply(t(t(x)*weights), 1, sum) ans = min(x) # Return Value: ans } # ------------------------------------------------------------------------------ pfolioReturn <- function(x, weights=NULL, geometric=FALSE) { # A function implemented by Diethelm Wuertz # Description: # Returns portfolio returns # Arguments: # x - a 'timeSeries' object # Details: # A fast(er) reimplementation # FUNCTION: # Compute Portfolio Returns: weights <- as.vector(weights) if(geometric) { X <- t ( colCumprods(1+x) - 1 ) X <- rbind(diff( t ( X * weights ) )) Return <- x[, 1] series(Return[+1, ]) <- x[1, ] %*% weights series(Return[-1, ]) <- rowSums(X) } else { Return <- x[, 1] series(Return) <- x %*% weights } colnames(Return) <- "pfolioRet" # Return Value: Return } # ------------------------------------------------------------------------------ pfolioTargetReturn <- function(x, weights = NULL) { # A function implemented by Diethelm Wuertz # Description: # Computes return value of a portfolio # Arguments: # x - a timeSeries, data.frame or any other rectangular object # of assets which can be written as a matrix object # weights - the vector of weights # FUNCTION: # Transform: x <- as.matrix(x) # Compute Portfolio Returns: ans = mean(pfolioReturn(x = x, weights = weights)) # Return Value: names(ans) = "TargetReturn" ans } # ------------------------------------------------------------------------------ pfolioTargetRisk <- function(x, weights = NULL) { # A function implemented by Diethelm Wuertz # Description: # Computes risk from covariance matrix of a portfolio # Arguments: # x - a timeSeries, data.frame or any other rectangular object # of assets which can be written as a matrix object # weights - the vector of weights # FUNCTION: # Transform: x <- as.matrix(x) # Compute Portfolio Returns: if (is.null(weights)) weights = rep(1/dim(x)[[2]], dim(x)[[2]]) ans = as.vector(sqrt(weights %*% cov(x) %*% weights)) # Return Value: names(ans) = "TargetRisk" ans } # ------------------------------------------------------------------------------ pfolioHist <- function(x, weights = NULL, alpha = 0.05, range = NULL, details = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Plots a histogram of the returns of a portfolio # Arguments: # x - a timeSeries, data.frame or any other rectangular object # of assets which can be written as a matrix object # weights - the vector of weights # FUNCTION: # Transform: x <- as.matrix(x) # Suppress Warnings: opt = options() options(warn = -1) # Plot Portfolio Returns: Returns = pfolioReturn(x = x, weights = weights) if (is.null(range)) { lim = 1.05 * pfolioMaxLoss(x = x, weights = weights)[[1]] xlim = c(lim, -lim) } else { xlim = range } Histogram = hist(Returns, xlim = xlim, xlab = "Portfolio Return %", probability = TRUE, col = "steelblue4", border = "white", ...) r = seq(xlim[1], xlim[2], length = 201) lines(r, dnorm(r, mean = mean(Returns), sd = sd(Returns)), ...) points(Returns, rep(0, length(Returns)), pch = 20, col = "orange", cex = 1.25) # Add VaR, CVaRplus and MaxLoss: V1 = pfolioVaR(x = x, weights = weights, alpha = alpha)[[1]] abline(v = V1, col = "blue", ...) V2 = pfolioCVaRplus(x = x, weights = weights, alpha = alpha)[[1]] abline(v = V2, col = "red", ...) V3 = pfolioMaxLoss(x = x, weights = weights)[[1]] abline(v = V3, col = "green", ...) V4 = as.vector(mean(Returns))[[1]] V5 = as.vector(sd(Returns))[[1]] yt = max(density(Returns)$y) text(V1, yt, as.character(round(V1, 2)), cex = 0.75, col = "orange") text(V2, yt, as.character(round(V2, 2)), cex = 0.75, col = "orange") text(V3, yt, as.character(round(V3, 2)), cex = 0.75, col = "orange") text(V4, yt, as.character(round(V4, 2)), cex = 0.75, col = "orange") yt = 0.95 * yt text(V1, yt, "VaR", cex = 0.75, col = "orange") text(V2, yt, "CVaR+", cex = 0.75, col = "orange") text(V3, yt, "maxLoss", cex = 0.75, col = "orange") text(V4, yt, "Mean", cex = 0.75, col = "orange") # Result: options(opt) ans = list(VaR = V1, VaRplus = V2, maxLoss = V3, mean = V4, sd = V5) if (details) { cat("\nVaR: ", V1) cat("\nVaRplus: ", V2) cat("\nmax Loss: ", V3) cat("\nMean: ", V4) cat("\nStDev: ", V5) cat("\n") } # Return Value: invisible(ans) } ################################################################################ fPortfolio/R/backtest-methodsShow.R0000644000176200001440000000544612323217770017040 0ustar liggesusers # 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: # show.fPFOLIOBACKTEST Print method for 'fPFOLIOBACKTEST' objects ################################################################################ setMethod("show", "fPFOLIOBACKTEST", function(object) { # A function implemented by Diethelm Wuertz and William Chen # Description: # S4 Print Method for an object of class "fPFOLIODATA" # Arguments: # object - an object of class "fPFOLIOSPEC" # FUNCTION: # Windows: cat("\nBacktest Specification:\t") cat("\n\n Windows Function: ", object@windows$windows) cat("\n Windows Params:\t") winParams <- object@windows$params paramNames <- names(winParams) chars <- nchar(paramNames) for (i in seq(along = winParams)){ cat("\n -", paramNames[i], paste(rep(" ", 24-nchar(paramNames[i])),collapse = ""), as.character(winParams[[i]])) } # Strategy: cat("\n\n Strategy Function: ", object@strategy$strategy) cat("\n Strategy Params:\t") strategyParams <- object@strategy$params paramNames <- names(strategyParams) for (i in seq(along = strategyParams)){ cat("\n -", paramNames[i], paste(rep(" ", 24-nchar(paramNames[i])),collapse = ""), as.character(strategyParams[[i]])) } # Smoother: cat("\n\n Smoother Function: ", object@smoother$smoother) cat("\n Smoother Params:\t") smootherParams <- object@smoother$params paramNames <- names(smootherParams) for (i in seq(along = smootherParams)){ cat("\n -", paramNames[i], paste(rep(" ", 24-nchar(paramNames[i])),collapse = ""), substr(as.character(smootherParams[[i]]), 1, 5)) } # Messages: cat("\n\n Messages: ", unlist(object@messages), "\n\n") # Return Value: invisible(object) }) ################################################################################ fPortfolio/R/object-setSpec.R0000644000176200001440000002327012620132672015600 0ustar liggesusers # 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: # setType<- Sets type of portfolio optimization # setOptimize<- Sets what to optimze, minRisk or maxRetururn # setEstimator<- Sets name of mean-covariance estimator # setTailRisk<- Sets tail dependency matrix # setParams<- Sets optional model parameters # FUNCTION: DESCRIPTION: # setWeights<- Sets weights vector # setTargetReturn<- Sets target return value # setTargetRisk<- Sets target return value # setRiskFreeRate<- Sets risk-free rate value # setNFrontierPoints<- Sets number of frontier points # setStatus<- Sets portfolio status information # FUNCTION: DESCRIPTION: # setSolver<- Sets name of desired solver # setObjective<- Sets objective function name # setTrace<- Sets solver's trace flag ################################################################################ "setType<-" <- function(spec, value) { # A function implemented by Diethelm Wuertz # Description: # Sets the portfolio type for a portfolio structure # Notes: # What types are valid? # MV Standard Mean-Variance Portfolio # Objective = Covariance Risk # Constraints = Budget 1'*W = 1 # Allowed Constraints: Box + Group # CVaR Standard Mean-CVaR portfolio # Objective = Linearized CVaR Risk # Constraints = Budget 1'*W = 1 # Allowed Constraints: Box + Group # Arguments: # FUNCTION: # Type ? spec@model$type <- value message("Solver set to solveRquadprog") # Set Solver: if (value == "MV") { setSolver(spec) <- "solveRquadprog" message("setSolver: solveRquadprog") } if (value == "CVaR") { setSolver(spec) <- "solveRglpk" message("setSolver: solveRglpk") } # Return Value: spec } # ------------------------------------------------------------------------------ "setOptimize<-" <- function(spec, value) { # A function implemented by Diethelm Wuertz # Description: # Sets the portfolio type for a portfolio structure # Arguments: # FUNCTION: # Type ? spec@model$optimize <- value # Return Value: spec } # ------------------------------------------------------------------------------ "setEstimator<-" <- function(spec, value) { # A function implemented by Diethelm Wuertz # Description: # Sets the type of mean-cov estimator for a portfolio structure # Arguments: # FUNCTION: # Estimator ? spec@model$estimator <- value # Return Value: spec } # ------------------------------------------------------------------------------ "setParams<-" <- function(spec, name, value) { # A function implemented by Diethelm Wuertz # Description: # Sets optional parameters for a portfolio structure # Arguments: # FUNCTION: # Extend Parameter List: spec@model$params[name] <- value # Return Value: spec } ################################################################################ "setWeights<-" <- function(spec, value) { # A function implemented by Diethelm Wuertz # Description: # Sets the weights vector for a portfolio structure # Arguments: # FUNCTION: # Weights ? spec@portfolio$weights <- value spec@portfolio$targetReturn <- NA spec@portfolio$targetRisk <- NA # Return Value: spec } # ------------------------------------------------------------------------------ "setTargetReturn<-" <- function(spec, value) { # A function implemented by Diethelm Wuertz # Description: # Sets the target return value for a portfolio structure # Arguments: # FUNCTION: # Target Return ? spec@portfolio$targetReturn <- value spec@portfolio$weights <- NA spec@portfolio$targetRisk <- NA # What to optimize ? spec@model$optimize <- "minRisk" # Return Value: spec } # ------------------------------------------------------------------------------ "setTargetRisk<-" <- function(spec, value) { # A function implemented by Diethelm Wuertz # Description: # Sets the target return value for a portfolio structure # Arguments: # FUNCTION: # Target Risk ? spec@portfolio$targetRisk <- value spec@portfolio$weights <- NA spec@portfolio$targetReturn <- NA # What to optimize ? spec@model$optimize <- "maxReturn" # Return Value: spec } # ------------------------------------------------------------------------------ "setAlpha<-" <- function(spec, value) { # A function implemented by Diethelm Wuertz # Description: # Sets the CVaR alpha significance value for a portfolio structure # Arguments: # FUNCTION: # Estimator ? spec@model$params$alpha <- value # Return Value: spec } # ------------------------------------------------------------------------------ "setRiskFreeRate<-" <- function(spec, value) { # A function implemented by Diethelm Wuertz # Description: # Sets the risk free rate for a portfolio structure # Arguments: # FUNCTION: # Check Validity: stopifnot(is.numeric(value)) stopifnot(length(value) == 1) # Risk-Free Rate ? spec@portfolio$riskFreeRate <- value # Return Value: spec } # ------------------------------------------------------------------------------ "setNFrontierPoints<-" <- function(spec, value) { # A function implemented by Diethelm Wuertz # Description: # Sets the number of frontier points for a portfolio structure # Arguments: # FUNCTION: # Check Validity: stopifnot(is.numeric(value)) stopifnot(length(value) == 1) stopifnot(value > 0) # Risk-Free Rate ? spec@portfolio$nFrontierPoints <- value # Return Value: spec } # ------------------------------------------------------------------------------ "setStatus<-" <- function(spec, value) { # A function implemented by Diethelm Wuertz # Description: # Sets portfolio status information # Arguments: # FUNCTION: # Check Validity: stopifnot(is.numeric(value)) stopifnot(length(value) == 1) # Risk-Free Rate ? spec@portfolio$status <- value # Return Value: spec } # ------------------------------------------------------------------------------ "setTailRisk<-" <- function(spec, value) { # A function implemented by Diethelm Wuertz # Description: # Sets the tail risk value for a portfolio structure # Arguments: # value - a list with two matrix elements, $lower and $upper, # with the pairwise tail dependence coefficints. # Example: # LPP = as.timeSeries(data(LPP2005REC))[, 1:6] # setTailRisk <- .nigDependencyFit(LPP) # Arguments: # FUNCTION: # Tail Risk ? spec@model$tailRisk <- value # Return Value: spec } ################################################################################ "setSolver<-" <- function(spec, value) { # A function implemented by Diethelm Wuertz # Description: # Sets the solver value for a portfolio structure # Arguments: # FUNCTION: # Set Solver: spec@optim$solver <- value # Return Value: spec } # ------------------------------------------------------------------------------ "setObjective<-" <- function(spec, value) { # A function implemented by Diethelm Wuertz # Description: # Sets the solver objective function name for a portfolio structure # Arguments: # FUNCTION: # Set Solver: spec@optim$objective <- value # Return Value: spec } # ------------------------------------------------------------------------------ "setTrace<-" <- function(spec, value) { # A function implemented by Diethelm Wuertz # Description: # Sets the trace value for a portfolio structure # Arguments: # FUNCTION: # Set Trace: spec@optim$trace <- value # Return Value: spec } ################################################################################ fPortfolio/R/utils-amplInterface.R0000644000176200001440000002704512323217770016645 0ustar liggesusers # 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: # amplModelOpen Opens a writes to an AMPL model file # amplModelAdd Adds model specs to an existing AMPL model file # amplModelShow Shows the content of an AMPL .mod file # FUNCTION: DESCRIPTION: # amplDataOpen Opens and writes the header to an AMPL data file # amplDataAddValue Adds a numeric value to an AMPL data file # amplDataAddVector Adds a numeric vector to an AMPL data file # amplDataAddMatrix Adds a numeric matrix to an AMPL data file # amplDataSemicolon Adds a semicolon on the end of a data input line # amplDataShow Shows the content of an AMPL data file # FUNCTION: DESCRIPTION: # amplRunOpen Opens a run file # amplRunAdd Adds run specs to an existing AMPL run file # amplRunShow Shows the content of an AMPL run file # FUNCTION: DESCRIPTION: # amplOutShow Shows the content of an AMPL output txt file ################################################################################ amplModelOpen <- function(project) { # A function written by Diethelm Wuertz # Description: # Writes an AMPL model to a .mod file # Arguments: # project - a project name, gives the root name of the model file # FUNCTION: # Compose File Name: file <- paste(project, "mod", sep = ".") # Write Model to File: write("", file=file, ncolumns=1, append=FALSE) # Return Value: invisible() } # ------------------------------------------------------------------------------ amplModelAdd <- function(model, project) { # A function written by Diethelm Wuertz # Description: # Writes an AMPL model to a .mod file # Arguments: # model - a character vector with the lines making the model file # project - a project name, gives the root name of the model file # FUNCTION: # Compose File Name: file <- paste(project, "mod", sep = ".") # Write Model to File: write(model, file=file, ncolumns=1, append=TRUE) # Return Value: invisible() } # ------------------------------------------------------------------------------ amplModelShow <- function(project) { # A function written by Diethelm Wuertz # Description: # Prints an AMPL .mod file # Arguments: # project - a project name, gives the root name of the model file # FUNCTION: # Compose File Name: file <- paste(project, "mod", sep = ".") # Trace File: cat(readLines(file), sep = "\n") # Return Value: invisible() } ################################################################################ amplDataOpen <- function(project) { # A function written by Diethelm Wuertz # Description: # Writes the header to an AMPL data file # Arguments: # project - a project name, gives the root name of the model file # FUNCTION: # Compose File Name: file <- paste(project, "dat", sep = ".") # Write to the file: write("", file=file, ncolumns=1, append=FALSE) # Return Value: invisible() } # ------------------------------------------------------------------------------ amplDataAdd <- function(name, data, type, project) { # A function written by Diethelm Wuertz # Description: # Check data type and adds to AMPL data file # Arguments: # name - AMPL data name # data - the data object, a numeric value, vector or matrix # type - eiher "value", "vector" or "matrix" # project - a project name, gives the root name of the model file # FUNCTION: # Add Data: if (type == "value") { amplDataAddValue(data=name, value=data, project=project) } if (type == "vector") { amplDataAddVector(data=name, vector=data, project=project) } if (type == "matrix") { amplDataAddMatrix(data=name, matrix=data, project=project) } # Return Value: invisible() } # ------------------------------------------------------------------------------ amplDataShow <- function(project) { # A function written by Diethelm Wuertz # Description: # Prints an AMPL data file # Arguments: # project - a project name, gives the root name of the model file # FUNCTION: # Compose File Name: file <- paste(project, "dat", sep = ".") # Trace File: cat(readLines(file), sep = "\n") # Return Value: invisible() } # ----------------------------------------------------------------------------- amplDataSemicolon <- function(project) { # A function written by Diethelm Wuertz # Description: # Adds a semicolon on the end of a data input line # Arguments: # project - a project name, gives the root name of the model file # FUNCTION: # Compose File Name: file <- paste(project, "dat", sep = ".") # Add a Semicolon and an Empty Line: write(";", file=file, ncolumns=1, append=TRUE) write(" ", file=file, ncolumns=1, append=TRUE) # Return Value: invisible() } # ------------------------------------------------------------------------------ amplDataAddValue <- function(data, value, project) { # A function written by Diethelm Wuertz # Description: # Adds a numeric value to an AMPL data file # Arguments: # data - a character string, the name of the value # value - a numeric value, the value of the numeric input variable # project - a project name, gives the root name of the model file # FUNCTION: name <- data # Compose File Name: file <- paste(project, "dat", sep = ".") # Write Name: x <- paste("param", name, ":=", collapse=" ") write(x, file=file, ncolumns=1, append=TRUE) # Write Numeric Value: write(value, file=file, ncolumns=1, append=TRUE) amplDataSemicolon(project) # Return Value: invisible() } # ------------------------------------------------------------------------------ amplDataAddVector <- function(data, vector, project) { # A function written by Diethelm Wuertz # Description: # Adds a numeric vector to an AMPL data file # Arguments: # data - a character string, the name of the vector # value - a numeric vector, the values of the numeric input vector # project - a project name, gives the root name of the model file # FUNCTION: name <- data # Compose File Name: file = paste(project, "dat", sep = ".") # Write Name: x <- paste("param", name, ":=", collapse=" ") write(x, file=file, ncolumns=1, append=TRUE) # Write Vector: vector <- as.vector(vector) N <- length(vector) write(t(cbind(1:N, vector)), file=file, ncolumns=2, append=TRUE) amplDataSemicolon(project) # Return Value: invisible() } # ------------------------------------------------------------------------------ amplDataAddMatrix <- function(data, matrix, project) { # A function written by Diethelm Wuertz # Description: # Adds a numeric matrix to an AMPL data file # Arguments: # data - a character string, the name of the matrix # value - a numeric matrix, the values of the numeric input matrix # project - a project name, gives the root name of the model file # FUNCTION: name <- data # Compose File Name: file <- paste(project, "dat", sep = ".") # Write Name: x <- paste("param", name, ":", collapse=" ") write(x, file=file, ncolumns=1, append=TRUE) # Write Matrix: N <- ncol(matrix) x <- paste(paste(1:N, collapse = " "), ":=") write(x, file = file, ncolumns = 1, append = TRUE) X <- cbind(1:nrow(matrix), matrix) colnames(X) = rownames(X) = NULL write(t(X), file = file, ncolumns = 1, append = TRUE, sep = " ") amplDataSemicolon(project) # Return Value: invisible() } ################################################################################ amplRunOpen <- function(project) { # A function written by Diethelm Wuertz # Description: # Writes an AMPL run to a .run file # Arguments: # project - a project name, gives the root name of the model file # FUNCTION: # Compose File Name: file <- paste(project, "run", sep = ".") # Open: write("", file=file, ncolumns=1, append=FALSE) # Return Value: invisible() } # ----------------------------------------------------------------------------- amplRunAdd <- function(run, project) { # A function written by Diethelm Wuertz # Description: # Writes an AMPL run to a .run file # Arguments: # run - a character vector with the lines making the model file # project - a project name, gives the root name of the model file # FUNCTION: # Compose File Name: file <- paste(project, "run", sep = ".") # Write Run Commands to File: write(run, file=file, ncolumns=1, append=FALSE) # Return Value: invisible() } # ------------------------------------------------------------------------------ amplRunShow <- function(project) { # A function written by Diethelm Wuertz # Description: # Prints an AMPL .run file # Arguments: # project - a project name, gives the root name of the model file # FUNCTION: # Compose File Name: file = paste(project, "run", sep = ".") # Trace File: cat(readLines(file), sep = "\n") # Return Value: invisible() } ################################################################################ amplOutShow <- function(project) { # A function written by Diethelm Wuertz # Description: # Shows the content of an AMPL output txt file # Arguments: # project - a project name, gives the root name of the model file # FUNCTION: # Compose File Name: file <- paste(project, "txt", sep = ".") # Trace File: cat(readLines(file), sep = "\n") # Return Value: invisible() } ################################################################################ fPortfolio/R/risk-pfolioMeasures.R0000644000176200001440000002073612323217770016700 0ustar liggesusers # 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 Description. 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: # covRisk Computes covariance risk as standard deviation # varRisk Computes Value at Risk # cvarRisk Computes Conditional Value at Risk # FUNCTION: DESCRIPTION - DEPRECATED: # .covRisk Computes Covariance Risk # .varRisk Computes Value at Risk # .cvarRisk Computes Conditional Value at Risk # FUNCTION: DESCRIPTION: # .cfgFit Fits bivariate tail dependency parameter lambda # .lambdaTailRisk Fits tail lambda for multivariate data ################################################################################ covRisk <- function(data, weights) { # A function implemented by Diethelm Wuertz # Description: # Computes Covariance Risk for assets given weights # Arguments: # data - any univariate or multivariate object which can # be transformed into a matrix # weights - a numeric vector, the weights vector # Example: # data = LPP2005.RET[, 1:6]; weights = rep(1/6, times = 6) # covRisk(data, weights) # FUNCTION: # Data: if (inherits(data, "timeSeries")) data <- getDataPart(data) Data <- as.matrix(data) nAssets = dim(Data)[2] # Covariance Matrix: Sigma = cov(Data) # Risk: weights = as.vector(weights) Std = sqrt( as.numeric( weights %*% Sigma %*% weights ) ) names(Std) = "Cov" # Return Value: Std } # ------------------------------------------------------------------------------ varRisk <- function(data, weights, alpha = 0.05) { # A function implemented by Diethelm Wuertz # Description: # Computes VaR for assets given weights and alpha # Arguments: # data - any univariate or multivariate object which can # be transformed into a matrix # weights - a numeric vector, the weights vector # alpha - a numeric value, the quantile # Example: # data = LPP2005.RET[, 1:6]; weights = rep(1/6, times = 6) # varRisk(data, weights) # FUNCTION: if (inherits(data, "timeSeries")) data <- getDataPart(data) # VaR: weights = as.vector(weights) X = as.matrix(data) %*% weights VaR = quantile(X, alpha, type = 1) names(VaR) <- paste("VaR.", alpha*100, "%", sep = "") # Return Value: VaR } # ------------------------------------------------------------------------------ cvarRisk <- function(data, weights, alpha = 0.05) { # A function implemented by Diethelm Wuertz # Description: # Computes CVaR for assets given weights and alpha # Arguments: # data - any univariate or multivariate object which can # be transformed into a matrix # weights - a numeric vector, the weights vector # alpha - a numeric value, the quantile # Example: # data = LPP2005.RET[, 1:6]; weights = rep(1/6, times = 6) # cvarRisk(data, weights) # FUNCTION: if (inherits(data, "timeSeries")) data <- getDataPart(data) # CVaR: weights = as.vector(weights) X = as.matrix(data) %*% weights VaR = quantile(X, alpha, type = 1) CVaR = c(CVaR = VaR - 0.5 * mean(((VaR-X) + abs(VaR-X))) / alpha) names(CVaR) <- paste("CVaR.", alpha*100, "%", sep = "") # Return Value: CVaR } ################################################################################ # OLD FUNCTIONS: # check where they are still used .covRisk <- function(data, weights) { # A function implemented by Rmetrics # Description: # Computes Covariance Risk for assets given weights and alpha # FUNCTION: if (inherits(data, "timeSeries")) data <- getDataPart(data) # Data: Data = as.matrix(data) nAssets = dim(Data)[2] # Mean Vector and Covariance: mu = colMeans(Data) Sigma = cov(Data) # Return and Risk: return = as.numeric( weights %*% mu ) risk = sqrt( as.numeric( weights %*% Sigma %*% weights ) ) # Return Value: list(risk = risk, return = return) } # ------------------------------------------------------------------------------ .varRisk <- function(x, weights, alpha = 0.05) { # A function implemented by Rmetrics # Description: # Computes VaR for assets given weights and alpha # Arguments: # x - any univariate or multivariate object which can # be transformed into a matrix # weights - a numeric vector, the weights vector # alpha - a numeric value, the quantile # FUNCTION: if (inherits(x, "timeSeries")) x <- getDataPart(x) # VaR: X = as.matrix(x) %*% weights VaR = quantile(X, alpha, type = 1) names(VaR) <- paste("VaR.", alpha*100, "%", sep = "") # Return Value: VaR } # ------------------------------------------------------------------------------ .cvarRisk <- function(x, weights, alpha = 0.05) { # A function implemented by Rmetrics # Description: # Computes CVaR for assets given weights and alpha # Arguments: # x - any univariate or multivariate object which can # be transformed into a matrix # weights - a numeric vector, the weights vector # alpha - a numeric value, the quantile # FUNCTION: if (inherits(x, "timeSeries")) x <- getDataPart(x) # CVaR: X = as.matrix(x) %*% weights VaR = quantile(X, alpha, type = 1) CVaR = c(CVaR = VaR - 0.5 * mean(((VaR-X) + abs(VaR-X))) / alpha) names(CVaR) <- paste("CVaR.", alpha*100, "%", sep = "") # Return Value: CVaR } ################################################################################ .cfgFit <- function(x, y, tail = c("upper", "lower")) { # Description: # Fits bivariate tail dependency parameter lambda # Arguments: # data - multivariate time series object of class S4 or a numeric # matrix # tail - which tail should be considered? # FUNCTION: # Match Arguments: tail = match.arg(tail) # If Lower Tail: if(tail == "lower") { x = 1-x y = 1-y } # Fit lambda: lambda = NULL n = length(x) for(i in 1:n){ lambda = c(lambda, log(sqrt(log(1/x[i])*log(1/y[i]))/log(1/max(x[i],y[i])^2))) } ans = (2-2*exp(sum(lambda/n))) attr(ans, "control") <- c(tail = tail) # Return Value: ans } # ------------------------------------------------------------------------------ .lambdaTailRisk <- function(data, tail = c("upper", "lower"), margins = "norm", ...) { # Description: # Fits tail dependency parameter lambda for multivariate data # Arguments: # data - multivariate time series object of class S4 or a numeric # matrix # tail - which tail should be considered? # Example: # r = rarchmCopula(60, alpha = 2, type = "4") # .cfgFit(r[, 1], r[, 2]) # x = cbind(qnorm(r[, 1]), qnorm(r[, 2])) # .lambdaTailRisk(x) # FUNCTION: # Check Data: if(is.timeSeries(data)) data = series(data) n = ncol(data) # Normal Margins - Create Bivariate Copulae: x = data for (i in 1:n) { y = as.vector(data[, i]) x[, i] = pnorm(y, mean(y), sd(y)) } # Match Arguments: tail = match.arg(tail) # Compute Tail Risks: riskMatrix = diag(n) # Compute lambda: for ( i in 1:(n-1) ) { for ( j in (i+1):n ) { riskMatrix[i, j] = riskMatrix[j, i] = .cfgFit(x[, i], x[, j], tail = tail) } } attr(riskMatrix, "control") <- c(tail = tail) # Return Value: riskMatrix } ################################################################################ fPortfolio/R/monitor-stability.R0000644000176200001440000006267713202336404016431 0ustar liggesusers # 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: # stabilityAnalytics Retroactive stability analytics # FUNCTION: DESCRIPTION: # turnsAnalytics Retroactive turning point analytics # drawdownsAnalytics Retroactive maximum drawdown analytics # garchAnalytics Retroactive Garch volatility analytics # riskmetricsAnalytics Retroactive Riskmetrics analytics # bcpAnalytics Retroactive Bayesian changepoints analytics # pcoutAnalytics Retroactive Principal component outlier analytics # FUNCTION: DESCRIPTION: # addRainbow Adds rainbow colored stability indicators # FUNCTION: DESCRIPTION: # waveletSpectrum Retroactive Morlet wavelet analytics # FUNCTION: DESCRIPTION: # parAnalytics Graph frame settings for a desired analytics ############################################################################### stabilityAnalytics <- function(index, method=c("turns", "drawdowns", "garch", "riskmetrics", "bcp", "pcout"), ...) { # A function implemented by Diethelm Wuertz and Tobias Setz # Description: # Retroactive stability analytics # FUNCTION: # Run Analytics: method <- match.arg(method) FUN <- paste(method, "Analytics", sep = "") fun <- match.fun(FUN) # Return Value: fun(index, ...) } ############################################################################### turnsAnalytics <- function(index, spar=0.5, main=NULL, trace=TRUE, doplot=TRUE, at=pretty(index), format="%m/%y") { # A function implemented by Diethelm Wuertz and Tobias Setz # Description: # Retroactive Turning Points Analytics # Arguments: # index - an index or price S4 'timeSeries' object # spar - a numeric between 0 and, the degree of smoothness # main - main plot title # trace - a logical, should the results be traced? # plot - a logical, should the results be plotted # at - generate pretty axis positions # format - a string describing the label format # Note: # The lowess and supsmu smoothers are by far not as good as the # spline smoother. # FUNCTION: # Settings: stopifnot(isUnivariate(index)) if (is.null(main)) main <- "Retroactive Turnpoints Analytics" # Smooth Return Series: rets <- returns(index) indexSmu <- smoothSpline(log(index), spar=spar) # Turnpoints: warn <- getOption("warn") options(warn=-1) indexTurns <- turns(indexSmu[, 2]) options(warn=warn) indexTurns <- indexTurns[indexTurns[, 2] !=0, ] # Add Verical Lines: turns.tps <- format(time(indexTurns)) n.tps <- length(turns.tps) # Trace Results: if (trace){ cat("Series:\n", colnames(index), "\n") cat("Turning Points:", n.tps, "\n") print(turns.tps) } # Positions: positions <- sign(returns(exp(indexSmu[, 2]), trim=FALSE)) positions[1, 1] <- 0 ablines <- time(positions)[as.vector(positions) < 0] # Plot: if (doplot) { # Turnpoints: range <- range(log(index)) ylim <- c(range[1], range[2] + diff(range(log(index)))/4) plot(indexSmu[, 1], ylim=ylim, main="", ylab="", xlab="", las=2, at=at, format=format, col="black") title(main=main, ylab=paste("log Index", colnames(index)), xlab="") abline(v=ablines, lty=3, lwd=2, col="steelblue") lines(indexSmu[, 1], col="black") lines(indexSmu[, 2], col="red") if (turns.tps[2] > 0) points(indexTurns[, 1], pch=19, col="red") abline(v=as.POSIXct(at), col="darkgrey", lty=3) box(col="white") box(bty="l") # Add Returns: center <- range[2] + diff(range(log(index)))/4/2 scale <- diff(range(log(index)))/4 returnsScaled <- (rets-mean(rets))/max(abs(rets)) * scale/2 + center lines(returnsScaled, col="orange") abline(h=mean(returnsScaled), col="darkgrey", lty=3) box(col="white") box(bty="l") # Add Rmwtrics - Do not Remove! mtext("Rmetrics", adj=0, side=4, cex=0.7, col="darkgrey") } # Check Turnpoints: if ( turns.tps[1] == "1" & turns.tps[2] == "0") n.tps <- 0 # Return Value: invisible(list( data=indexSmu, turns=turns.tps, positions=positions, ablines=ablines, n=n.tps, smooth=spar)) } ############################################################################### drawdownsAnalytics <- function(index, spar=0.5, main=NULL, trace=TRUE, doplot=TRUE, at=pretty(index), format="%m/%y") { # A function implemented by Diethelm Wuertz and Tobias Setz # Description: # Retroactive Maximum Drawdown Analytics # Arguments: # index - an index or price S4 'timeSeries' object # spar - a numeric between 0 and, the degree of smoothness # main - main plot title # trace - a logical, should the results be traced? # plot - a logical, should the results be plotted # at - generate pretty axis positions # format - a string describing the label format # FUNCTION: # Settings: stopifnot(isUnivariate(index)) if (is.null(main)) main <- "Retroactive Drawdowns Analytics" # Series: rets<- returns(index) # Turning Points: tps <- turnsAnalytics(index=index, spar=spar, trace=trace, doplot=FALSE) ablines <- tps$ablines # Drawdowns: maxdd <- drawdowns(rets) # Plot: if(doplot) { # Plot: plot(maxdd, main=main, xlab="", ylab=paste("Drawdwons", colnames(index)), las=2, at=at, format=format) abline(v=ablines, lty=3, lwd=2, col="steelblue") lines(maxdd) box(col="white") box(bty="l") # Add Rmwtrics - Do not Remove! mtext("Rmetrics", adj=0, side=4, cex=0.7, col="darkgrey") } # Return Value: invisible(list( index = index, series = maxdd)) } ############################################################################### garchAnalytics <- function (index, spar = 0.5, main=NULL, trace=TRUE, doplot=TRUE, at=pretty(index), format="%m/%y") { # A function implemented by Diethelm Wuertz and Tobias Setz # Arguments: # index - an index or price S4 'timeSeries' object # spar - a numeric between 0 and, the degree of smoothness # main - main plot title # trace - a logical, should the results be traced? # plot - a logical, should the results be plotted # at - generate pretty axis positions # format - a string describing the label format # Description: # Retroactive Garch11 Volatility Analytics # FUNCTION: # Load Library: # require(fGarch) # Settings: stopifnot(isUnivariate(index)) if (is.null(main)) main <- "Retroactive Garch Analytics" # Fit Garch11 Model: fit <- fGarch::garchFit(data = 100 * returns(index), trace=trace) xseries <- as.timeSeries(fit@data)/100 Index <- cumulated(xseries) colnames(Index) <- colnames(index) # Turning Points: tps <- turnsAnalytics(index=index, spar=spar, trace=trace, doplot=FALSE) ablines <- tps$ablines # Plot Return Series and Standard Deviations: xcsd <- timeSeries(data = fit@sigma.t/100, charvec = time(xseries)) if (doplot) { # Plot: sdPlus <- mean(xseries) + 2 * xcsd sdMinus <- mean(xseries) - 2 * xcsd range <- range(xseries, sdPlus, sdMinus) plot(xseries, main=main, xlab="", ylab=paste("Volatility", colnames(index)), at=at, format=format, # type="l", col="steelblue", ylim=range) abline(v = ablines, lty = 3, lwd = 2, col = "grey") lines(xseries, col = "steelblue") lines(sdPlus, col = "red", lwd = 2) lines(sdMinus, col = "red", lwd = 2) abline(h = 0, col = "grey", lty = 3) box(col = "white") box(bty = "l") # Margin Text: # mtext("Volatility Band: 2 sd", adj = 0, side = 4, cex = 0.7, # col = "darkgrey") # Add Rmwtrics - Do not Remove! mtext("Rmetrics", adj=0, side=4, cex=0.7, col="darkgrey") } # Return Value: invisible(list( index = index, residuals = xseries, volatility = xcsd, fit = fit)) } ############################################################################### riskmetricsAnalytics <- function(index, spar=0.5, lambda=0.9, main=NULL, trace=TRUE, doplot=TRUE, at=pretty(index), format="%m/%y") { # A function implemented by Diethelm Wuertz and Tobias Setz # Description: # Retroactive riskmetrics analytics # Arguments: # index - an index or price S4 'timeSeries' object # spar - a numeric between 0 and, the degree of smoothness # main - main plot title # trace - a logical, should the results be traced? # plot - a logical, should the results be plotted # at - generate pretty axis positions # format - a string describing the label format # FUNCTION: # Settings: stopifnot(isUnivariate(index)) if (is.null(main)) main <- "Retroactive RiskMetrics Analytics" # Series: rets <- returns(index) # Turning Points: tps <- turnsAnalytics(index=index, spar=spar, trace=trace, doplot=FALSE) ablines <- tps$ablines # Indicator: sigma <- .emaIndicator(abs(rets), lambda) sd <- sqrt(.emaIndicator(rets^2, lambda)) # Plot: if(doplot) { # Plot: sdPlus <- mean(rets) + 2 * sd sdMinus <- mean(rets) - 2 * sd range <- range(rets, sdPlus, sdMinus) plot(rets, main="", xlab="", ylab=paste("Volatility", colnames(index)), at=at, format=format, ylim=range) abline(v=ablines, lty=3, lwd=2, col="grey") lines(rets, col="steelblue") lines(mean(rets) + 2*sd, col="orange", lwd=2) lines(mean(rets) - 2*sd, col="orange", lwd=2) lines(mean(rets) + 2*sigma, col="red", lwd=2) lines(mean(rets) - 2*sigma, col="red", lwd=2) abline(h=0, col="grey", lty=3) box(col="white") box(bty="l") # Margin Text: # mtext(paste("sd/var Volatility Bands: 2 sd | lambda", lambda), # adj=0, side=4, cex=0.7, col="darkgrey") # Add Rmwtrics - Do not Remove! mtext("Rmetrics", adj=0, side=4, cex=0.7, col="darkgrey") } # Return Value: invisible(list( index = index, analytics = sigma)) } ############################################################################### bcpAnalytics <- function (index, spar=0.5, FUN=returns, method=c("prob", "mean", "var"), main=NULL, trace=TRUE, doplot=TRUE, at=pretty(index), format="%m/%y") { # A function implemented by Diethelm Wuertz and Tobias Setz # Description: # Retroactive Bayesian Change Points Analytics # Arguments: # index - an index or price S4 'timeSeries' object # spar - a numeric between 0 and, the degree of smoothness # main - main plot title # trace - a logical, should the results be traced? # plot - a logical, should the results be plotted # at - generate pretty axis positions # format - a string describing the label format # FUNCTION: # Load Library: # require(bcp) # Settings: stopifnot(isUnivariate(index)) if (is.null(main)) main <- "Retroactive Change Points Analytics" # Turning Points: tps <- turnsAnalytics(index=index, spar=spar, trace=trace, doplot=FALSE) positions <- tps$positions ablines <- tps$ablines # BCP Analytics: fun <- match.fun(FUN) series <- fun(index) analytics <- bcp::bcp(series) # Compose Series: method <- match.arg(method) select <- c(mean="posterior.mean", var="posterior.var", prob="posterior.prob") series(series) <- analytics[[select[method]]] # Compose y-axis Label: ylab <- c(mean="Mean", var="Variance", prob="Probability") ylab <- paste("Posterior", ylab[method], colnames(index)) # Select: if (method == "prob") { ylim <- c(0, 1) prob <- timeSeries(data=analytics$posterior.prob, charvec=time(series)) prob <- na.omit(prob) } else { ylim <- range(na.omit(series)) prob <- NA } # Plot: if (doplot) { # Plot: plot(series, type="h", ylim=ylim, las=2, col="grey", main=main, xlab="", ylab=ylab, at=at, format=format) abline(v=ablines, lty=3, lwd=2, col="steelblue") points(series, pch=19, cex=0.5) box(col = "white") box(bty = "l") # MarginText: # mtext(paste("Smooth:", spar), adj = 0, side = 4, cex = 0.7, col = "darkgrey") # Add Rmwtrics - Do not Remove! mtext("Rmetrics", adj=0, side=4, cex=0.7, col="darkgrey") } # Return Value: invisible(list( index = index, analytics = analytics, prob = prob)) } ############################################################################### pcoutAnalytics <- function (index, spar=0.5, main=NULL, trace=TRUE, doplot=TRUE, at=pretty(index), format="%m/%y", strong=TRUE, k=2, cs=0.25, outbound=0.25) { # A function implemented by Diethelm Wuertz and Tobias Setz # Description: # Retroactive PCA outlier analytics # Arguments: # index - an index or price S4 'timeSeries' object # spar - a numeric between 0 and, the degree of smoothness # main - main plot title # trace - a logical, should the results be traced? # plot - a logical, should the results be plotted # at - generate pretty axis positions # format - a string describing the label format # FUNCTION: # Load Library: # require(mvoutlier) # Settings: stopifnot(isUnivariate(index)) if (is.null(main)) main <- "Retroactive Outlier Analytics" # Turning Points: tps <- turnsAnalytics(index=index, spar=spar, trace=trace, doplot=FALSE) positions <- tps$positions ablines <- tps$ablines # Series Settings: X <- log(index) Y <- returns(index) Z <- cbind(X[-1, ], Y) u <- Y v <- lag(u, k=-k:k, trim=TRUE) U <- u[time(v), ] # Principal Component Outlier Analytics: ans <- mvoutlier::pcout(v, makeplot=FALSE, explvar=0.99, crit.M1=1/3, crit.c1=2.5, crit.M2=1/4, crit.c2=0.99, cs=cs, outbound=outbound) # Plot: colnames(X) <- paste(colnames(X), "X", sep=":") colnames(Y) <- paste(colnames(Y), "Y", sep=":") Z <- cbind(X[time(v), ], Y[time(v), ]) Z@recordIDs <- data.frame(wfinal01=ans$wfinal01, wfinal=ans$wfinal, wloc=ans$wloc, wscat=ans$wscat, x.dist1=ans$x.dist1, x.dist2=ans$x.dist2) rownames(Z@recordIDs) <- rownames(Z) wfinal01 <- ans$wfinal01 if (strong) { V <- as.timeSeries(Z@recordIDs)[, "wfinal01"] W <- lag(V, k=k, trim=TRUE) S <- timeSeries(data=rowSums(W)) Sfinal <- S == 0 z <- timeSeries(charvec=time(Z), data=ans$wfinal01) z[time(S), ] <- as.integer(!Sfinal) wfinal01 <- as.numeric(z) Z@recordIDs[, "wfinal01"] <- wfinal01 } ans$wfinal <- ans$wfinal01 <- ans$wloc <- ans$wscat <- NULL ans$x.dist1 <- ans$x.dist2 <- NULL U <- Z[, 1] wfinal01 <- Z@recordIDs$wfinal01 datapoints <- length(U) U <- Z[, 2] outliers <- length(U) - sum(wfinal01) percent <- round(100 * outliers/length(U), 2) weights <- as.timeSeries(Z@recordIDs)[, "wfinal"] # Analytics: Indicator <- 1 - weights invWeights <- as.vector(Indicator) extreme = sum(invWeights[invWeights > 0.75]) / length(invWeights) analytics <- c( mean = mean(1-weights), sd = sd(1-weights), extreme75 = extreme, indicator = Indicator) ylab <- paste("PC Outlier Prob", colnames(index)) # Plot: if(doplot) { # Plot: plot(Indicator, type="h", ylim=c(0, 1), las=2, col="grey", main=main, xlab="", ylab=ylab, at=at, format=format) abline(v=ablines, lty=3, lwd=2, col="steelblue") points(Indicator, pch=19, cex=0.5) # Add Grid and Box: grid(NA, ny=NULL) box(col="white") box(bty="l") # Margin Text: # mtext(paste("Smooth:", spar), adj=0, side=4, cex=0.7, col="darkgrey") # Add Rmetrics - Do not Remove! mtext("Rmetrics", adj=0, side=4, cex=0.7, col="darkgrey") } # Return Value: ans <- invisible(list( index = index, pcout = ans, series = Z, analytics = analytics, prob = Indicator)) class(ans) <- c("analytics", "list") ans } # ----------------------------------------------------------------------------- addRainbow <- function(analytics, palette=rainbow, a=0.3, b=0.8, K=100) { # A function implemented by Diethelm Wuertz and Tobias Setz # Example: # analytics <- pcoutAnalytics(index); addRainbow(analytics) # analytics <- bcpAnalytics(index); addRainbow(analytics) # FUNCTION: # Get Probability Indicator: Indicator <- analytics$prob # Check: stopifnot(isUnivariate(Indicator)) stopifnot(min(Indicator) >= 0) stopifnot(max(Indicator) <= 1) # Add Spline Smoothed Indicators: k.spar <- seq(a, b, length=K) for (k in 1:K) { curve <- timeSeries::smoothSpline(Indicator, spar=k.spar[k])[, 2] if (k == 1) curve1 <- curve if (k == K) diff <- curve - curve1 lines(curve, lwd=2, col=palette(K)[k]) } # Add Difference Indicator Line: lines(diff + 0.5, lwd=2) abline(h=0.5, lwd=2, col="orange") # Return Value: invisible() } ############################################################################### waveletSpectrum <- function(index, spar=0.5, main=NULL, trace=TRUE, doplot=TRUE, at=pretty(index), format="%m/%y") { # A function implemented by Diethelm Wuertz and Tobias Setz # Description: # Morlet Wavelet Analytics # Arguments: # index - an index or price S4 'timeSeries' object # spar - a numeric between 0 and, the degree of smoothness # main - main plot title # trace - a logical, should the results be traced? # plot - a logical, should the results be plotted # at - generate pretty axis positions # format - a string describing the label format # FUNCTION: # Load Library: # require(dplR) # Settings: stopifnot(isUnivariate(index)) if (is.null(main)) main <- "Morlet Wavelet Spectrum" # Index Returns: returns <- returns(index) Time <- 2:length(index) Returns <- as.vector(returns) ans <- dplR::morlet(y1=returns, x1=Time) # Returns a list containing: # y Numeric. The original time series. # x Numeric. The time values. # wave Complex. The wavelet transform. # coi Numeric. The cone of influence. # period Numeric. The period. # Scale Numeric. The scale. # Signif Numeric. The significant values. # Power Numeric. The squared power. # Turning Points: tps <- turnsAnalytics(index=index, spar=spar, trace=trace, doplot=FALSE) # Wavelet Spectrum: p <- as.vector(ans$Power) vec <- c(mean=mean(p), sd=sd(p), skew=skewness(p), kurt=kurtosis(p)) mat <- c( O = base::norm(ans$Power, "O"), # "One Norm" I = base::norm(ans$Power, "I"), # "Inf Norm" F = base::norm(ans$Power, "F"), # "Frobenius" M = base::norm(ans$Power, "M")) # "Max Modulus" if (trace) { cat("Stats Measures:\n") print(vec) print(mat) } analytics <- c(vec, mat) # Wavelet Parameters: wave.list <- ans wavelet.levels <- quantile(wave.list$Power, probs=seq(from=0, to=1, by=0.1)) add.coi <- TRUE add.sig <- TRUE crn.lab <- "RWI" key.cols <- rev(heat.colors(length(wavelet.levels))) key.lab <- expression(paste("Power"^2)) nyrs=NULL crn.col <- "black" crn.lwd <- 1 crn.ylim <- range(wave.list$y) * 1.1 # Settings: y <- wave.list$y x <- wave.list$x wave <- wave.list$wave period <- wave.list$period Signif <- wave.list$Signif coi <- wave.list$coi coi[coi == 0] <- 1e-12 Power <- wave.list$Power siglvl <- wave.list$siglvl Signif <- t(matrix(Signif, dim(wave)[2], dim(wave)[1])) Signif <- Power/Signif period2 <- log(period)/log(2) ytick <- unique(trunc(period2)) ytickv <- 2^(ytick) coi2 <- log(coi)/log(2) coi2[coi2 < 0] <- 0 coi2.yy <- c(coi2, rep(max(period2, na.rm=TRUE), length(coi2))) coi2.yy[is.na(coi2.yy)] <- coi[2] yr.vec.xx <- c(x, rev(x)) # DW # par.orig <- par(c("mar", "las", "mfrow")) # on.exit(par(par.orig)) nlevels <- length(wavelet.levels) key.labs <- formatC(wavelet.levels, digits=4, format="f") asp <- NA las <- 1 xlim <- range(x, finite=TRUE) ylim <- range(period2, finite=TRUE) ylim[2] <- ylim[2] * 1.1 # Image Plot: # DW # ... now you can create more than one plot on one page # plot.new() # plot.window(xlim, ylim, xaxs="r", yaxs="r") # Use instead: plot(xlim, ylim, xaxs = "r", yaxs = "r", col = "white", axes=FALSE, frame=FALSE, ann=FALSE) # DW # .Internal(filledcontour()) no longer works on 3.0. # .Internal(filledcontour( # as.double(x), as.double(period2), Power, # as.double(wavelet.levels), col=key.cols)) # Use instead: graphics::.filled.contour( x = as.double(x), y = as.double(period2), z = Power, levels = as.double(wavelet.levels), col = key.cols) title(main=main, xlab="", ylab=paste("Period", colnames(index))) box(col="white") box(bty="l") # Add Contours: contour(x, period2, Signif, levels=1, labels=siglvl, drawlabels=FALSE, axes=FALSE, frame.plot=FALSE, add=TRUE, lwd=2, col="black") # Add Coin of Influence: polygon(yr.vec.xx, coi2.yy, density=c(10, 20), angle=c(-45, 45), col="black") # Add Axis Labels: xtick <- NULL for (i in 1:length(time(index))) xtick <- c(xtick, which.min(abs(time(index) - at[i]))) axis(1, at=xtick, labels=format(at, format=format)) axis(2, at=ytick, labels=ytickv, las=2) # Add Scale Legend: nCol<- length(key.cols) positions <- seq(min(x), max(x), length=nCol+1) colLevels <- paste(signif(wavelet.levels,2)) for (i in 1:nCol) { lines(x=c(positions[i], positions[i+1]), y=c(1.03,1.03)*max(period2), lwd=3, col=key.cols[i]) text(x=(positions[i]+positions[i+1])/2, 1.07*max(period2), colLevels[i], cex=0.6) } points(positions, rep(1.03*max(period2), length=nCol+1), pch=19, cex=0.7) # Add Rmetrics - Do not Remove! mtext("Rmetrics", adj=0, side=4, cex=0.7, col="darkgrey") # Return Value: invisible(list( index = index, spar = spar, wavelet = ans, analytics = list(Time=x, Period=period2, Power=Power))) } ############################################################################### parAnalytics <- function() { # A function implemented by Diethelm Wuertz and Tobias Setz # Description: # Sets the graph frame for an analytics chart # FUNCTION: # Graph Frame: par(mfrow = c(2, 1)) par(mar = c(2, 4, 2, 2) + 0.1) par(omi = 0.2*c(1, 0.7, 1, 0.7)) # Return Value: invisible() } ############################################################################### fPortfolio/R/backtest-getBacktestSpec.R0000644000176200001440000002245612323217770017607 0ustar liggesusers # 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: # getWindows Extracts windows slot # getWindowsFun Extracts name of windows function # getWindowsParams Extracts a list of windows specific parameters # getWindowsHorizon Extracts windows horizon # FUNCTION: DESCRIPTION: # getStrategy Extracts strategy slot # getStrategyFun Extracts the name of portfolio strategy function # getStrategyParams Extracts a list of strategy specific parameters # FUNCTION: DESCRIPTION: # getSmoother Extracts the smoother slot # getSmootherFun Extracts the name of the moother function # getSmootherParams Extracts a list of smoothing specific parameters # getSmootherLambda Extracts the smoothing parameter Lambda # getSmootherDoubleSmoothing Extracts setting for double smoothing # getSmootherInitialWeights Extracts the initial weights in the smoothing # getSmootherSkip Extracts the number of skipped months # FUNCTION: DESCRIPTION: # getMessages Extracts the message slot ################################################################################ getWindows.fPFOLIOBACKTEST <- function(object) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Extracts Windows slot from an object of class fPFOLIOBACKTEST # Arguments: # object - an object of class fPFOLIOBACKTEST # FUNCTION: # Description: # gets the "model" slot from an object of class 4 # Arguments: # object - an object of class S4 # FUNCTION: # Return Value: getSlot(object, "windows") } # ------------------------------------------------------------------------------ getWindowsFun.fPFOLIOBACKTEST <- function(object) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Extracts name of windows function from an object of class fPFOLIOBACKTEST # Arguments: # object - an object of class fPFOLIOBACKTEST # FUNCTION: # Return Value: getWindows(object)$windows } # ------------------------------------------------------------------------------ getWindowsParams.fPFOLIOBACKTEST <- function(object) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Extracts a list of windows specific parameters from an object # of class fPFOLIOBACKTEST # Arguments: # object - an object of class fPFOLIOBACKTEST # FUNCTION: # Return Value: getWindows(object)$params } # ------------------------------------------------------------------------------ getWindowsHorizon.fPFOLIOBACKTEST <- function(object) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Extracts windows horizon from an object of class fPFOLIOBACKTEST # Arguments: # object - an object of class fPFOLIOBACKTEST # FUNCTION: # Return Value: getWindowsParams(object)$horizon } # ------------------------------------------------------------------------------ getSmoother.fPFOLIOBACKTEST <- function(object) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Extracts the smoother slot from an object of class fPFOLIOBACKTEST # Arguments: # object - an object of class fPFOLIOBACKTEST # FUNCTION: # Return Value: getSlot(object, "smoother") } # ------------------------------------------------------------------------------ getSmootherFun.fPFOLIOBACKTEST <- function(object) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Extracts the name of the moother function from an object # of class fPFOLIOBACKTEST # Arguments: # object - an object of class fPFOLIOBACKTEST # FUNCTION: # Return Value: getSmoother(object)$smoother } # ------------------------------------------------------------------------------ getSmootherParams.fPFOLIOBACKTEST <- function(object) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Extracts a list of strategy specific parameters # Arguments: # object - an object of class fPFOLIOBACKTEST # FUNCTION: # Return Value: getSmoother(object)$params } # ------------------------------------------------------------------------------ getSmootherLambda.fPFOLIOBACKTEST <- function(object) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Extracts the smoothing parameter Lambda from an object # of class fPFOLIOBACKTEST # Arguments: # object - an object of class fPFOLIOBACKTEST # FUNCTION: # Return Value: getSmootherParams(object)$lambda } # ------------------------------------------------------------------------------ getSmootherDoubleSmoothing.fPFOLIOBACKTEST <- function(object) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Extracts setting for double smoothing from an object # of class fPFOLIOBACKTEST # Arguments: # object - an object of class fPFOLIOBACKTEST # FUNCTION: # Return Value: getSmootherParams(object)$doubleSmoothing } # ------------------------------------------------------------------------------ getSmootherInitialWeights.fPFOLIOBACKTEST <- function(object) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Extracts the initial weights in the smoothing from an object # of class fPFOLIOBACKTEST # Arguments: # object - an object of class fPFOLIOBACKTEST # FUNCTION: # Return Value: getSmootherParams(object)$initialWeights } # ------------------------------------------------------------------------------ getSmootherSkip.fPFOLIOBACKTEST <- function(object) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Extracts the number of skipped months from an object # of class fPFOLIOBACKTEST # Arguments: # object - an object of class fPFOLIOBACKTEST # FUNCTION: # Return Value: getSmootherParams(object)$skip } # ------------------------------------------------------------------------------ getStrategy.fPFOLIOBACKTEST <- function(object) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Extracts strategy slot from an object of class fPFOLIOBACKTEST # Arguments: # object - an object of class fPFOLIOBACKTEST # FUNCTION: # Return Value: getSlot(object, "strategy") } # ------------------------------------------------------------------------------ getStrategyFun.fPFOLIOBACKTEST <- function(object) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Extracts the name of portfolio strategy function from an object # of class fPFOLIOBACKTEST # Arguments: # object - an object of class fPFOLIOBACKTEST # FUNCTION: # Return Value: getStrategy(object)$strategy } # ------------------------------------------------------------------------------ getStrategyParams.fPFOLIOBACKTEST <- function(object) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Extracts a list of strategy specific parameters from an object # of class fPFOLIOBACKTEST # Arguments: # object - an object of class fPFOLIOBACKTEST # FUNCTION: # Return Value: getStrategy(object)$params } # ------------------------------------------------------------------------------ getMessages.fPFOLIOBACKTEST <- function(object) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Extracts the message slot from an object of class fPFOLIOBACKTEST # Arguments: # object - an object of class fPFOLIOBACKTEST # FUNCTION: # Return Value: getSlot(object, "messages") } ################################################################################ fPortfolio/R/backtest-pfolioBacktesting.R0000644000176200001440000002575512421162422020200 0ustar liggesusers # 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: # portfolioBacktesting Performs a portfolio backtesting # portfolioSmoothing Smoothes the weights of a portfolio backtesting ################################################################################ portfolioBacktesting <- function(formula, data, spec = portfolioSpec(), constraints = "LongOnly", backtest = portfolioBacktest(), trace = TRUE) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Backtests a portfolio on rolling windows # Arguments: # formula - a formula expression to select benchmark and assets # from the data set # data - data set of assets returns, an object of class fPFLOLIODATA # or timeSeries # spec - portfolio specification, an object of class fPFLOLIOSPEC, # by default as returned by the function portfolioSpec() # constraints - portfolio constraints, a vector of character strings # backtest - portfolio backtest specification, an object of # class fPFLOLIOBACKTEST, by default as returned by the function # portfolioBacktest # trace - a logical, should the backtesting be traced ? # Value: # A list with the following elements # formula - the input formula # data - the input data set # spec - the input portfolio specification # constraints - the input constraints # backtest - the input backtest specification # benchmarkName - the name of the benchmark returns # assetsNames - the names of the assets returns # weights - the rolling weights matrix # strategyList - the rolling list of optimized portfolios # Sigma - ... # Details: # Allows for user specified rolling Windows # Smoothing is separated and can be user specified # Example: # portfolioBacktesting(formula, data, spec, constraints, backtest) # FUNCTION: # Data: if (class(data) == "fPFOLIODATA") { Data <- data data <- getSeries(data) } else if (class(data) == "timeSeries") { Data <- portfolioData(data, spec) } # Constraints: if (class(constraints) == "fPFOLIOSPEC") { Constraints <- constraints constraints <- Constraints@stringConstraints } else if (class(constraints) == "character") { Constraints <- portfolioConstraints(data, spec, constraints) } # Formula, Benchmark and Asset Labels: benchmarkName = as.character(formula)[2] assetsNames <- strsplit(gsub(" ", "", as.character(formula)[3]), "\\+")[[1]] nAssets <- length(assetsNames) # Trace the Specifications and Data Info: if(trace) { cat("\nPortfolio Backtesting:\n") cat("\nAssets: ", assetsNames) cat("\nBenchmark: ", benchmarkName) cat("\nStart Series: ", as.character(start(data))) cat("\nEnd Series: ", as.character(end(data))) cat("\n Type: ", getType(spec)) cat("\n Cov Estimator: ", getEstimator(spec)) cat("\n Solver: ", getSolver(spec)) cat("\nPortfolio Windows: ", getWindowsFun(backtest)) cat("\n Horizon: ", getWindowsHorizon(backtest)) cat("\nPortfolio Strategy: ", getStrategyFun(backtest)) cat("\nPortfolio Smoother: ", getSmootherFun(backtest)) cat("\n doubleSmoothing: ", getSmootherDoubleSmoothing(backtest)) cat("\n Lambda: ", getSmootherLambda(backtest)) } # We invest in the "Strategy" or (return) efficient Portfolio: if(trace) { cat("\n\nPortfolio Optimization:") cat("\nOptimization Period\tTarget\tBenchmark\t Weights\n") } # Create Rolling Windows: windowsFun <- match.fun(getWindowsFun(backtest)) rollingWindows <- windowsFun(data, backtest) from <- rollingWindows$from to <- rollingWindows$to # Roll the Portfolio: strategyFun <- match.fun(getStrategyFun(backtest)) strategyList <- list() # WC: track the sigma over time: Sigma <- NULL for (i in 1:length(from)) { # Optimize the Portfolio: pfSeries <- window(data[, assetsNames], start = from[i], end = to[i]) bmSeries <- window(data[, benchmarkName], start = from[i], end = to[i]) pfSeries <- portfolioData(pfSeries, spec) Sigma <- c(Sigma, mean(diag(getSigma(pfSeries)))) strategy <- strategyFun( data = getSeries(pfSeries), spec = spec, constraints = constraints, backtest = backtest) strategyList[[i]] <- strategy # Trace Optionally the Results: if (trace) { cat(as.character(from[i]), as.character(to[i])) spReturn <- getTargetReturn(strategy@portfolio)[[2]] cat("\t", round(spReturn[1], digits = 3)) bmReturn <- mean(series(bmSeries)) cat("\t", round(bmReturn, digits = 3)) nAssets <- length(assetsNames) weights <- round(getWeights(strategy), digits = 3) cat("\t") for (i in 1:length(assetsNames)) cat("\t", weights[i]) cat("\t * ", round(sum(weights), 2)) cat("\n") } } # Extract Portfolio Investment Weights for the current period: weights <- NULL for (i in 1:length(strategyList)) weights <- rbind(weights, getWeights(strategyList[[i]])) rownames(weights) <- as.character(to) colnames(weights) <- assetsNames # Compose Result: ans <- list( formula = formula, data = data, spec = spec, constraints = constraints, backtest = backtest, benchmarkName = benchmarkName, assetsNames = assetsNames, weights = weights, strategyList = strategyList, Sigma = Sigma) # Return Value: class(ans) <- c("portfolioBacktesting", "list") invisible(ans) } # ------------------------------------------------------------------------------ portfolioSmoothing <- function(object, backtest=NULL, trace=TRUE) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Flexible Weights Smoother Function # Arguments: # object - an object as returned by the function portfolioBacktesting() # backtest - an S4 class object of 'FPFOLIOBACKTEST', the same as # used in the function portfolioBacktesting() or a user modified # version (obsolete) # trace - a logical, should the computation be traced ? # Value: # a list with the following entries # Example: # data <- 100*SWX.RET; object=portfolioBacktesting(LP40~SBI+SPI+SII, data) # portfolioSmoothing(object) # FUNCTION: # Obsolete Argument if (!is.null(backtest)) { warning("The backtest argument is obsolete and will be removed for the next release.") } # Backtest Settings: formula <- object$formula data <- object$data spec <- object$spec constraints <- object$constraints backtest <- object$backtest benchmarkName <- object$benchmarkName assetsNames <- object$assetsNames weights <- object$weights skip <- getSmootherSkip(backtest) if (skip > 0) weights <- weights[-(1:skip), ] nAssets <- ncol(weights) # Add Smooth Weights to Backtest object: if (trace) print("smooth ...") smoother <- match.fun(getSmootherFun(backtest)) smoothWeights <- object$smoothWeights <- smoother(weights, spec, backtest) # Compute Monthly Assets and Benchmark Returns: if (trace) print("aggregate ...") ow <- options("warn") options(warn = -1) monthlyAssets <- object$monthlyAssets <- applySeries(data[, assetsNames], by = "monthly", FUN = colSums) monthlyBenchmark <- object$monthlyBenchmark <- applySeries(data[, benchmarkName], by = "monthly", FUN = colSums) options(ow) # Compute Offset Return of Rolling Portfolio compared to Benchmark: if (trace) print("offset ...") cumX <- colCumsums(data[, benchmarkName]) lastX <- window(cumX, start = start(cumX), end = rownames(weights)[1] ) offsetReturn <- as.vector(lastX[end(lastX), ]) names(offsetReturn) <- as.character(end(lastX)) object$offsetReturn <- offsetReturn # Backtest Return Series: Datum <- as.vector(rownames(smoothWeights)) nDatum <- length(Datum) Portfolio = Benchmark = NULL for (i in 1:(nDatum-1)) { Portfolio <- rbind(Portfolio, as.vector(( as.matrix(monthlyAssets[Datum[i+1], ]) %*% smoothWeights[Datum[i], ]))) Benchmark <- rbind(Benchmark, as.vector(monthlyBenchmark[Datum[i+1], ])) } # Portfolio: P <- timeSeries(data = Portfolio, charvec = Datum[-1], units = "Portfolio") object$portfolioReturns <- portfolio <- colCumsums(P) object$P <- P # Benchmark: B <- timeSeries(data = Benchmark, charvec = Datum[-1], units = "Benchmark") object$benchmarkReturns <- benchmark <- colCumsums(B) object$B <- B daily <- colCumsums(data[, benchmarkName]) Daily <- window(daily, start = start(portfolio), end = end(portfolio)) portfolio <- portfolio - portfolio[1] + Daily[1] benchmark <- benchmark - benchmark[1] + Daily[1] # Add to backtest: object$portfolio <- portfolio object$benchmark <- benchmark # Backtest Statistics: P <- as.vector(P) B <- as.vector(B) Stats <- c(sum(P, na.rm = TRUE), sum(B)) Stats <- rbind(Stats, c(mean(P, na.rm = TRUE), mean(B))) Stats <- rbind(Stats, c(sd(P, na.rm = TRUE), sd(B))) Stats <- rbind(Stats, c(min(P, na.rm = TRUE), min(B))) colnames(Stats) <- c( "Portfolio", "Benchmark") rownames(Stats) <- c( "Total Return", "Mean Return", "StandardDev Return", "Maximum Loss") object$stats <- Stats # Return Value: class(object) <- c("portfolioSmoothing", "list") object } ################################################################################ fPortfolio/R/methods-plot.R0000644000176200001440000001557112323217770015355 0ustar liggesusers # 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 Description. 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: # plot.fPORTFOLIO S3 Plot method for 'fPORTFOLIO' objects # FUNCTION: DESCRIPTION: # .fPortfolio.plot1..8 Internal plot functions ################################################################################ plot.fPORTFOLIO <- function(x, which = "ask", control = list(), ...) { # A function implemented by Diethelm Wuertz # Description: # Plot method for an object of class 'fPORTFOLIO' # FUNCTION: # Control Parameters: Statistics = getStatistics(x) # Use default, if xlim and ylim is not specified ... mu = Statistics$mu Sigma = Statistics$Sigma N = length(mu) yLim = range(mu) + 0.25*c(-diff(range(mu)), diff(range(mu))) # First, take care that all assets appear on the plot ... # sqrtSig = sqrt(diag(Sigma)) # xLimAssets = c( # min(sqrtSig), # max(sqrtSig))+ c(-0.4*diff(range(sqrtSig)), 0.1*diff(range(sqrtSig))) xRange = range(frontierPoints(x)[, 1]) xDiff = diff(xRange) xLimAssets = c(xRange[1] - 2.5*xDiff/10, xRange[2] + xDiff/10) # ... second take care that the whole frontier appears on the plot: fullFrontier = frontierPoints(x) xLimFrontier = range(fullFrontier[, 1]) xLim = range(c(xLimAssets, xLimFrontier)) # Control List: # YC: merge with user control list con <- c(control, frontierPlotControl()) # YC: remove double entries and keep user args con <- con[unique(names(con))] attr(x, "control") <- con # Plot: interactivePlot( x, choices = c( "Plot Efficient Frontier", "Add Minimum Risk Portfolio", "Add Tangency Portfolio", "Add Risk/Return of Single Assets", "Add Equal Weights Portfolio", "Add Two Asset Frontiers [LongOnly Only]", "Add Monte Carlo Portfolios", "Add Sharpe Ratio [Markowitz PF Only]"), plotFUN = c( ".fportfolio.plot.1", ".fportfolio.plot.2", ".fportfolio.plot.3", ".fportfolio.plot.4", ".fportfolio.plot.5", ".fportfolio.plot.6", ".fportfolio.plot.7", ".fportfolio.plot.8"), which = which) # Return Value: invisible(x) } # ------------------------------------------------------------------------------ .fportfolio.plot.1 <- function(x) { # Description: # Plot Efficient Frontier # FUNCTION: # Control: con = attr(x, "control") Type = getType(x) if (Type == "MV") { xLab = "Mean-Var Target Risk" } else if (Type == "CVaR") { xLab = "-CVaR Target Risk" } # Plot: frontierPlot( object = x, xlim = con$xlim, ylim = con$ylim, pch = 19, cex = 0.75, title = FALSE, las = ifelse(is.null(con$las), 0, con$las)) title( main = ifelse(is.null(con$main), "Efficient Frontier", con$main), xlab = ifelse(is.null(con$xlab), xLab, con$xlab), ylab = ifelse(is.null(con$ylab), "Target Return", con$ylab)) } # ------------------------------------------------------------------------------ .fportfolio.plot.2 <- function(x) { # Description: # Add Minimum Risk Portfolio # FUNCTION: # Control: con = attr(x, "control") # Plot: minvariancePoints( object = x, col = con$minvariance.col, cex = con$minvariance.cex, pch = 19) } # ------------------------------------------------------------------------------ .fportfolio.plot.3 <- function(x) { # Description: # Add Tangency Portfolio # FUNCTION: # Control: con = attr(x, "control") # Plot: tangencyPoints( object = x, col = con$tangency.col, cex = con$tangency.cex, pch = 17) tangencyLines( object = x, col = con$tangency.col, cex = con$tangency.cex) } # ------------------------------------------------------------------------------ .fportfolio.plot.4 <- function(x) { # Description: # Add Risk/Return of Single Assets # FUNCTION: # Control: con = attr(x, "control") # Plot: Palette = match.fun(con$singleAsset.col) col = Palette(getNAssets(x)) singleAssetPoints( object = x, col = col, cex = con$singleAsset.cex, pch = 18) } # ------------------------------------------------------------------------------ .fportfolio.plot.5 <- function(x) { # Description: # Add Equal Weights Portfolio # FUNCTION: # Control: con = attr(x, "control") # Plot: equalWeightsPoints( object = x, col = con$equalWeights.col, cex = con$equalWeights.cex, pch = 15) } # ------------------------------------------------------------------------------ .fportfolio.plot.6 <- function(x) { # Description: # Add Two Asset Frontiers [0-1 PF Only] # FUNCTION: # Control: con = attr(x, "control") # Lines: lines(frontierPoints(object = x), col = "grey") twoAssetsLines(object = x, col = con$twoAssets.col) # Points: Palette = match.fun(con$singleAsset.col) col = Palette(getNAssets(x)) singleAssetPoints( object = x, col = col, cex = con$singleAsset.cex, pch = 18) } # ------------------------------------------------------------------------------ .fportfolio.plot.7 <- function(x) { # Description: # Add Monte Carlo Portfolios # FUNCTION: # Control: con = attr(x, "control") # Plot: monteCarloPoints( object = x, col = con$monteCarlo.col, cex = con$monteCarlo.cex, mcSteps = con$mcSteps) } # ------------------------------------------------------------------------------ .fportfolio.plot.8 <- function(x) { # Description: # Add Sharpe Ratio [MV PF Only] # FUNCTION: # Control: con = attr(x, "control") # Plot: sharpeRatioLines( object = x, col = con$sharpeRatio.col, cex = con$sharpeRatio.cex, lty = 3) } ################################################################################ fPortfolio/R/risk-tailBudgets.R0000644000176200001440000004256312703721404016150 0ustar liggesusers # 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: # .tailDependenceCoeffs Returns Lower and Upper Tail Dependence Coeffs # FUNCTION: MIXED GUMBEL-SURVIVALGUMBEL-NORMAL COPULA: # .rgsgnormCopula Generates G-SG-NORM copula random variates # .dgsgnormCopula Computes G-SG-NORM copula density # FUNCTION: MIXED G-SG-NORM COPULA FIT: # .gsgnormCopulaFit Estimates the parameters of the G-SG-NORM copula # FUNCTION: NON-PARAMETRIC TAIL DEPENDECY ESTIMATOR: # .cfgTDE Estimates non-parametrically tail dependence # FUNCTION: COPULA FIT WITH NORM, NIG OR GHT MARGINALS: # .empiricalDependencyFit Estimates tail dependence with empirical marginals # .normDependencyFit Estimates tail dependence with normal marginals # .gldDependencyFit Estimates tail dependence with GLD marginals # .ghtDependencyFit Estimates tail dependence with GHT marginals ################################################################################ .tailDependenceCoeffs <- function(x, method = c("nig", "norm", "ght"), trace = FALSE, doplot = TRUE) { # A function implemented by Diethelm Wuertz # Description: # Returns a list with lower and upper bivariate tail depenence matrixes # Example: # x <- 100 * LPP2005.RET[, 1:6]; .tailDependenceCoeffs(x) # Notes: # Tested only for NIG marginal distributions. # FUNCTION: # Check Settings: method <- match.arg(method) # Compute Coeffs with desired Marginals: fun <- paste(".", method, "DependencyFit", sep = "") funFit <- match.fun(fun) coeffs <- funFit(x, doplot = doplot, trace = trace) # Return Value: coeffs } ################################################################################ .rgsgnormCopula <- function(n = 1000, alpha = c(2, 2), rho = 0, weights = c(1/3, 1/3)) { # A function implemented by Diethelm Wuertz # Description: # Computes RVs from a mixed Gumbel-SurvivalGumbel-Normal Copula # Arguments: # n - an integer value, the number of random variates to be # generated. # alpha - a numeric vector with two entries. The first denotes # the parameter value of alpha for the Gumbel copula, and # the second for the Survival Gumbel Copula. # rho - a numeric value denoting the correlation parameter for # the normal copula. # weights - a numeric vector with two entries. The first denotes # the weight of the Gumbel copula, and the second the weight # of the Survival Gumbel Copula. The weight for the normal # copula is evaluated by 1 - sum(weights). # Example: # .rgsgnormCopula(20) # FUNCTION: # Checking: stopifnot(any(weights >= 0)) stopifnot(sum(weights) <= 1) # Upper Gumbel = 1 , Lower Gumbel = 2, t = 3: weights <- c(weights, 1-sum(weights)) N <- round(n*weights[1:2]) N <- c(N, n-sum(N)) # Random Variates: r <- rbind( if (N[1] > 0) fCopulae::rgumbelCopula(N[1], alpha[1]), if (N[2] > 0) 1-fCopulae::rgumbelCopula(N[2], alpha[2]), if (N[3] > 0) fCopulae::rellipticalCopula(N[3], rho, type = "norm") ) index <- sample(1:n) ans <- r[index, ] N <- c(n, N) names(N) <- c("n", "n1", "n2", "n3") attr(ans, "control") < -N # Return Value: ans } # ------------------------------------------------------------------------------ .dgsgnormCopula <- function(u = 0.5, v = u, alpha = c(2, 2), rho = 0, weights = c(1/3, 1/3), output = c("vector", "list")) { # A function implemented by Diethelm Wuertz # Description: # Computes mixed Gumbel-SurvivalGumbel-Normal Copula density # Example: # .perspPlot(.dgsgnormCopula(u=grid2d()$x, v=grid2d()$y, output = "list")) # FUNCTION: # Settings: if (is.list(u)) { v = u[[2]] u = u[[1]] } if (is.matrix(u)) { v = u[, 1] u = u[, 2] } # Match Arguments: output = match.arg(output) # Mixed Copula: weights <- c(weights, 1-sum(weights)) dCopula1 <- fCopulae::dgumbelCopula(u, v, alpha[1]) dCopula2 <- fCopulae::dgumbelCopula(1-u, 1-v, alpha[2]) dCopula3 <- fCopulae::dellipticalCopula(u, v, rho, type = "norm") c.uv <- weights[1]*dCopula1 + weights[2]*dCopula2 + weights[3]*dCopula3 attr(c.uv, "control") <- c(alpha = alpha, rho = rho, weights = weights) if (output == "list") { N = sqrt(length(u)) x = u[1:N] y = matrix(v, ncol = N)[1, ] c.uv = list(x = x, y = y, z = matrix(c.uv, ncol = N)) } # Return Value: c.uv } # ------------------------------------------------------------------------------ .gsgnormCopulaFit <- function(u, v = NULL, trace = FALSE) { # A function implemented by Diethelm Wuertz # Description: # Fits parameters for a mixed GSG copula # FUNCTION: # Settings: U <- u V <- v if (is.list(u)) { U = u[[1]] V = u[[2]] } if (is.matrix(u)) { U = u[, 1] V = u[, 2] } # From weights to gamma ... # G-SG-NORM: W1*Gumbel + W2*SurvivalGumbul + W3*NORM # with W3 = 1-W2-W3 # Transformation: Use Weights W1 and W3 # gamma = c(gamma1, gamma2) # 0 < gamma1 = W1/(1-W3) < 1 # 0 < gamma2 = 1-W3 < 1 # W3 = 1-gamma2 # W1 = gamma1*gamma2 # W2 = gamma2*(1-gamma1) # Note, this transformation has the advantage, that gamma1 # and gamma2 are independent from each other. # Estimate Copula: start = c(alpha1 = 1.5, alpha2 = 1.5, rho = 0, gamma1 = 1/2, gamma2 = 1/2) fun = function(x, U, V, trace) { alpha = x[1:2] rho = x[3] gamma = x[4:5] weights = c( weights1 = gamma[[1]]*gamma[[2]], weights2 = gamma[[2]]*(1-gamma[[1]])) density = .dgsgnormCopula(u = U, v = V, alpha, rho, weights = weights) density = density[!is.na(density)] f = -mean( log(density) ) if (trace) { params = round(c(x[1:3], weights[1], weights[2], 1-weights[1]-weights[2]), 4) names(params) = c("alpha1", "alpha2", "rho", "gumbel", "survival", "norm") cat("\n Objective Function Value: ", -f) cat("\n Parameter Estimates: ", params, "\n") } f } # Fit: fit = nlminb( start = start, objective = fun, lower = c( 1, 1, -0.999, 0, 0), upper = c(Inf, Inf, 0.999, 1, 1), U = U, V = V, trace = trace) # Fitted Parameters: param = fit$par # Named Parameters: alpha1 = param[1] alpha2 = param[2] rho = param[3] gamma1 = param[4] gamma2 = param[5] # Weights: weights3 = 1-gamma2 weights1 = gamma1*gamma2 weights2 = gamma2*(1-gamma1) # Tail Coefficients upperLambda = (weights1*(2 - 2^(1/alpha1)))[[1]] lowerLambda = (weights2*(2 - 2^(1/alpha2)))[[1]] params = c(param[1:3], param[5]*param[4], param[5]*(1-param[4]), 1-param[5]) names(params) = c("alpha1", "alpha2", "rho", "gumbel", "survival", "norm") Lambda = c(lower = lowerLambda, upper = upperLambda) # Return Value: list(param = params, lambda = Lambda, fitted = fit$par) } ################################################################################ .cfgTDE <- function(x, y) { # A function implemented by Diethelm Wuertz # Description: # Estimates non-parametrically tail dependency coefficient # FUNCTION: # Upper Tail: lambda = NULL n = length(x) for(i in 1:n){ lambda = c(lambda, log(sqrt(log(1/x[i])*log(1/y[i]))/log(1/max(x[i],y[i])^2))) } upper <- 2 - 2*exp(sum(lambda/n)) # Lower Tail: x = 1-x y = 1-y lambda = NULL n = length(x) for(i in 1:n){ lambda = c(lambda, log(sqrt(log(1/x[i])*log(1/y[i]))/log(1/max(x[i],y[i])^2))) } lower <- 2 - 2*exp(sum(lambda/n)) # Return Value: c(lower = lower, upper = upper) } ################################################################################ .empiricalDependencyFit <- function(x, doplot = TRUE, trace = FALSE) { # A function implemented by Diethelm Wuertz # Description: # Estimates tail dependency coefficients with Normal marginals # Arguments: # x - a multivariate 'timeSeries' object # FUNCTION: # Settings: N = ncol(x) lowerLambda = upperLambda = 0*diag(N) assetsNames = colnames(x) P = NULL for (i in 1:(N-1)) { # First asset: r1 = as.vector(x[, i]) fit1 = nFit(r1) estim1 = fit1@fit$estimate p1 = pnorm(r1, estim1[1], estim1[2]) Main1 = assetsNames[i] P = cbind(P, p1) for (j in (i+1):N) { # Second asset: r2 = as.vector(x[, j]) fit2 = nFit(r2) estim2 = fit2@fit$estimate p2 = pnorm(r2, estim2[1], estim2[2]) Main2 = assetsNames[j] # Optional Plot: if (doplot) { # Plot Distribution: MainR = paste("Distribution:", Main1, "-", Main2) plot(r1, r2, pch = 19, main = MainR) grid() # Plot Copula: MainP = paste("Copula:", Main1, "-", Main2) plot(p1, p2, pch = 19, main = MainP) grid() } # Fit GSG copula parameters: fit = .gsgnormCopulaFit(u = p1, v = p2, trace = trace) if (trace) cat(assetsNames[c(i,j)], round(fit$lambda, 3), "\n") # Compose lambda Matrix: lowerLambda[i, j] = lowerLambda[j, i] = fit$lambda[1] upperLambda[i, j] = upperLambda[j, i] = fit$lambda[2] } } # Result: colnames(lowerLambda) = rownames(lowerLambda) = assetsNames colnames(upperLambda) = rownames(upperLambda) = assetsNames ans = list(lower = lowerLambda, upper = upperLambda) # Return Value: ans } # ------------------------------------------------------------------------------ .normDependencyFit <- function(x, doplot = TRUE, trace = FALSE) { # A function implemented by Diethelm Wuertz # Description: # Estimates tail dependency coefficients with Normal marginals # Arguments: # x - a multivariate 'timeSeries' object # FUNCTION: # Settings: N = ncol(x) lowerLambda = upperLambda = 0*diag(N) assetsNames = colnames(x) P = NULL for (i in 1:(N-1)) { # First asset: r1 = as.vector(x[, i]) fit1 = nFit(r1) estim1 = fit1@fit$estimate p1 = pnorm(r1, estim1[1], estim1[2]) Main1 = assetsNames[i] P = cbind(P, p1) for (j in (i+1):N) { # Second asset: r2 = as.vector(x[, j]) fit2 = nFit(r2) estim2 = fit2@fit$estimate p2 = pnorm(r2, estim2[1], estim2[2]) Main2 = assetsNames[j] # Optional Plot: if (doplot) { # Plot Distribution: MainR = paste("Distribution:", Main1, "-", Main2) plot(r1, r2, pch = 19, main = MainR) grid() # Plot Copula: MainP = paste("Copula:", Main1, "-", Main2) plot(p1, p2, pch = 19, main = MainP) grid() } # Fit GSG copula parameters: fit = .gsgnormCopulaFit(u = p1, v = p2, trace = trace) if (trace) cat(assetsNames[c(i,j)], round(fit$lambda, 3), "\n") # Compose lambda Matrix: lowerLambda[i, j] = lowerLambda[j, i] = fit$lambda[1] upperLambda[i, j] = upperLambda[j, i] = fit$lambda[2] } } # Result: colnames(lowerLambda) = rownames(lowerLambda) = assetsNames colnames(upperLambda) = rownames(upperLambda) = assetsNames ans = list(lower = lowerLambda, upper = upperLambda) # Return Value: ans } # ------------------------------------------------------------------------------ .gldDependencyFit <- function(x, doplot = TRUE, trace = FALSE) { # A function implemented by Diethelm Wuertz # Description: # Estimates tail dependency coefficients with NIG marginals # Arguments: # x - a multivariate 'timeSeries' object # FUNCTION: # Settings: N <- ncol(x) lowerLambda <- upperLambda <- 0*diag(N) assetsNames <- colnames(x) P <- NULL for (i in 1:(N-1)) { # First asset: r1 <- as.vector(x[, i]) fit1 <- gldFit(r1, doplot = FALSE, trace = trace) estim1 <- fit1@fit$estimate p1 <- pgld(r1, estim1[1], estim1[2], estim1[3], estim1[4]) Main1 <- assetsNames[i] P <- cbind(P, p1) for (j in (i+1):N) { # Second asset: r2 <- as.vector(x[, j]) fit2 <- gldFit(r2, doplot = FALSE, trace = trace) estim2 = fit2@fit$estimate p2 <- pgld(r2, estim2[1], estim2[2], estim2[3], estim2[4]) Main2 <- assetsNames[j] # Optional Plot: if (doplot) { ## MainR = paste("Distribution:", Main1, "-", Main2) ## plot(r1, r2, pch = 19, main = MainR) ## grid() MainP <- paste("Copula:", Main1, "-", Main2) plot(p1, p2, pch = 19, main = MainP, xlab = "", ylab = "", cex=0.5) grid() } # Fit GSG copula parameters: fit <- .gsgnormCopulaFit(u = p1, v = p2, trace = trace) if (trace) cat(assetsNames[c(i,j)], round(fit$lambda, 3), "\n") # Compose lambda Matrix: lowerLambda[i, j] <- lowerLambda[j, i] <- fit$lambda[1] upperLambda[i, j] <- upperLambda[j, i] <- fit$lambda[2] } } # Result: colnames(lowerLambda) <- rownames(lowerLambda) <- assetsNames colnames(upperLambda) <- rownames(upperLambda) <- assetsNames ans = list(lower = lowerLambda, upper = upperLambda) # Return Value: ans } # ------------------------------------------------------------------------------ .ghtDependencyFit <- function(x, doplot = TRUE, trace = FALSE) { # A function implemented by Diethelm Wuertz # Description: # Estimates tail dependency coefficients with GH Student-t marginals # Arguments: # x - a multivariate 'timeSeries' object # FUNCTION: # Settings: N = ncol(x) lowerLambda = upperLambda = 0*diag(N) assetsNames = colnames(x) P = NULL for (i in 1:(N-1)) { # First asset: r1 = as.vector(x[, i]) fit1 = ghtFit(r1, doplot = FALSE, trace = trace) estim1 = fit1@fit$estimate p1 = pght(r1, estim1[1], estim1[2], estim1[3], estim1[4]) Main1 = assetsNames[i] P = cbind(P, p1) for (j in (i+1):N) { # Second asset: r2 = as.vector(x[, j]) fit2 = ghtFit(r2, doplot = FALSE, trace = trace) estim2 = fit2@fit$estimate p2 = pght(r2, estim2[1], estim2[2], estim2[3], estim2[4]) Main2 = assetsNames[j] # Optional Plot: if (doplot) { MainR = paste("Distribution:", Main1, "-", Main2) plot(r1, r2, pch = 19, main = MainR) grid() MainP = paste("Copula:", Main1, "-", Main2) plot(p1, p2, pch = 19, main = MainP) grid() } # Fit GSG copula parameters: fit = .gsgnormCopulaFit(u = p1, v = p2, trace = trace) if (trace) cat(assetsNames[c(i,j)], round(fit$lambda, 3), "\n") # Compose lambda Matrix: lowerLambda[i, j] = lowerLambda[j, i] = fit$lambda[1] upperLambda[i, j] = upperLambda[j, i] = fit$lambda[2] } } # Result: colnames(lowerLambda) = rownames(lowerLambda) = assetsNames colnames(upperLambda) = rownames(upperLambda) = assetsNames ans = list(lower = lowerLambda, upper = upperLambda) # Return Value: ans } ################################################################################ fPortfolio/R/plot-vaniniFig.R0000644000176200001440000000541512410245712015612 0ustar liggesusers # 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 Description. 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: # .vaniniFig Creates Vinini's Figure in Portfolio eBook ################################################################################ .vaniniFig <- function() { # A function implemented by Diethelm Wuertz # FUNCTION: # Load Dataset dataSet <- data("LPP2005.RET", package="fPortfolio", envir=environment()) LPP2005.RET <- get(dataSet, envir=environment()) # Example Data: data = 100 * LPP2005.RET[, 1:6] mu = colMeans(data) Sigma = cov(data) one = rep(1, times = 6) # Short Selling Solution : invSigma = solve(Sigma) A = (mu %*% invSigma %*% one)[[1,1]] C = (one %*% invSigma %*% one)[[1,1]] B = (mu %*% invSigma %*% mu)[[1,1]] E = (one %*% invSigma %*% mu)[[1,1]] D = B*C - A*A # Minimum Variance Point: xMV = 1/sqrt(C) yMV = A/C # Frontier Points: x = seq(xMV, 4*xMV, length = 500) a = C b = -2 * A c = B - D * x^2 yp = (-b + sqrt(b^2 - 4 * a * c))/(2 * a) ym = (-b - sqrt(b^2 - 4 * a * c))/(2 * a) # Asymptotic Slopes: slope = sqrt(D/C) intercept = A/C # Tangency Line: x.tg = sqrt(B)/E y.tg = B/E slope.tg = y.tg/x.tg # Plot: plot(x, yp, type = "l", xlim = c(0, max(x)), ylim = c(-0.08, 0.08), axes = FALSE, xlab = "Covariance Risk", ylab = "Mean Retun") lines(x, ym) points(xMV, yMV, col = "orange", cex = 2, pch = 19) abline(intercept, slope, col = "blue", lty = 2) abline(intercept, -slope, col = "blue", lty = 2) abline(h = yMV, col = "grey", lty = 3) abline(v = 0, col = "grey", lty = 3) points(x.tg, y.tg, col = "red", cex = 2, pch = 19) abline(0, slope.tg, col = "brown", lty = 2) # Return Value: invisible() } ################################################################################ fPortfolio/R/backtest-rollingStats.R0000644000176200001440000001661712410031014017201 0ustar liggesusers # 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 US ################################################################################ # FUNCTION: DESCRIPTION: # backtestStats Wrapper function for calculating rolling statistics # FUNCTION: DESCRIPTION: # rollingSigma Rolling portfolio Sigma risk # rollingVaR Rolling Value at Risk # rollingCVaR Rolling Conditional Value at Risk # rollingDar Rolling Drawdowns at Risk # rollingCDaR Rolling Conditional Drawdowns at Risk ################################################################################ backtestStats <- function(object, FUN = "rollingSigma", ...) { # A function implemented by William Chen # Description: # Wrapper function for calculating rolling statistics # Arguments: # object - a list as returned by the function portfolioBacktesting() # FUN - a character string, the name of the statistics function # Example: # data = returns(align(SPISECTOR)) # formula <- SPI ~ BASI+INDU+CONG+HLTH+CONS+TELE+UTIL+FINA+TECH # backtests <- portfolioBacktesting(formula, data, trace = FALSE) # portfolios <- portfolioSmoothing(backtests, portfolioBacktest()) # FUNCTION: # Perform Statistics: statsFun <- match.fun(FUN) ans <- statsFun(object, ...) # Return Value ans } # ------------------------------------------------------------------------------ rollingSigma <- function(object) { # A function implemented by William Chen and Diethelm Wuertz # Description: # Returns rolling sigmas from an object of class fPFOLIOBACKTEST # Arguments: # object - a list as returned by the function portfolioBacktesting() # Example: # rollingSigma(object) # FUNCTION: # quick fix ... there is some confusion with getTargetRisk of # @portfolio and @spec portfolios <- object$strategyList prtval <- lapply(portfolios, slot, "portfolio") ans <- sapply(prtval, function(x) getTargetRisk(x)["Sigma"]) dates <- sapply(portfolios, function(x) rev(rownames(getSeries(x)))[1]) # Return Value: timeSeries(ans, charvec = dates, units = "Sigma") } # ------------------------------------------------------------------------------ rollingVaR <- function(object) { # A function implemented by William Chen # Description: # Returns rolling VaR from an object of class fPFOLIOBACKTEST # Arguments: # object - a list as returned by the function portfolioBacktesting() # Example: # rollingVaR(object) # FUNCTION: # calculate VaR for one portfolio: .var <- function(x) { alpha <- getAlpha(x) R <- as.numeric(getSeries(x) %*% getWeights(x)) quantile(R, probs = alpha) } # Get Portfolios: portfolios <- object$strategyList # Calculates VaR for all portfolios: ans <- sapply(portfolios, FUN = .var) # Extracts the dates: dates <- sapply(portfolios, function(x) rev(rownames(getSeries(x)))[1]) # Return Value: alpha <- getAlpha(portfolios[[1]]) timeSeries(ans, charvec = dates, units = paste("VaR", alpha, sep = ".")) } # ------------------------------------------------------------------------------ rollingCVaR <- function(object) { # A function implemented by William Chen # Description: # Returns rolling DVaR from an object of class fPFOLIOBACKTEST # Arguments: # object - a list as returned by the function portfolioBacktesting() # Example: # rollingCVaR(object) # FUNCTION: # Calculate CVaR for one portfolio: .cvar <- function(x) { alpha <- getAlpha(x) R <- as.numeric(getSeries(x) %*% getWeights(x)) z <- quantile(R, probs = alpha) mean(R[R <= z], na.rm = TRUE) } # Get Portfolios: portfolios <- object$strategyList # Calculate CVaR for all portfolios: ans <- sapply(portfolios, FUN = .cvar) # Extract the Dates: dates <- sapply(portfolios, function(x) rev(rownames(getSeries(x)))[1]) # Return: alpha <- getAlpha(portfolios[[1]]) timeSeries(ans, charvec = dates, units = paste("CVaR", alpha, sep = ".")) } # ------------------------------------------------------------------------------ rollingDaR <- function(object) { # A function implemented by William Chen # Description: # Returns rolling DaR from an object of class fPFOLIOBACKTEST # Arguments: # object - a list as returned by the function portfolioBacktesting() # Example: # rollingDaR(object) # FUNCTION: # calculate DaR for one portfolio: .dar <- function(x) { alpha <- getAlpha(x) R <- as.numeric(getSeries(x) %*% getWeights(x)) dd <- 100 * drawdowns(as.timeSeries(R)/100) quantile(dd, probs = alpha) } # Get Portfolios: portfolios <- object$strategyList # Calculates DaR for all portfolios: ans <- sapply(portfolios, FUN = .dar) # Extracts the dates: dates <- sapply(portfolios, function(x) rev(rownames(getSeries(x)))[1]) # Return: alpha <- getAlpha(portfolios[[1]]) timeSeries(ans, charvec = dates, units = paste("DaR", alpha, sep = ".")) } # ------------------------------------------------------------------------------ rollingCDaR <- function(object) { # A function implemented by William Chen # Description: # Returns rolling CDaR from an object of class fPFOLIOBACKTEST # Arguments: # object - a list as returned by the function portfolioBacktesting() # Example: # rollingCDaR(object) # FUNCTION: # Calculate CDaR for one portfolio: .cdar <- function(x){ alpha <- getAlpha(x) R <- as.numeric(getSeries(x) %*% getWeights(x)) dd <- 100 * drawdowns(as.timeSeries(R)/100) z <- quantile(as.numeric(dd), probs = alpha) mean(dd[dd <= z]) } # Get Portfolios: portfolios <- object$strategyList # Calculate CVaR for all portfolios: ans <- sapply(portfolios, FUN = .cdar) # Extract the dates: dates <- sapply(portfolios, function(x) rev(rownames(getSeries(x)))[1]) # Return: alpha <- getAlpha(portfolios[[1]]) timeSeries(ans, charvec = dates, units = paste("CDaR", alpha, sep = ".")) } ################################################################################ fPortfolio/R/object-portfolioData.R0000644000176200001440000000613112323217770017001 0ustar liggesusers # 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 Description. 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: # portfolioData Returns an object of class fPFOLIODATA ################################################################################ portfolioData <- function(data, spec=portfolioSpec()) { # A function implemented by Rmetrics # Description: # Creates portfolio data list # Arguments: # data - a multivariate 'timeSeries' object # spec - a portfolio specification structure, from which # the mean and covariance type of estimator will be extracted # Details: # The first argument can be either: # 1) an object of class "fPFOLIODATA" # 2) an object of class "timeSeries" # 3) a "list: with portfolio mean and covariance # FUNCTION: # Data, if we have already an object of class "fPFOLIODATA": if (is(data, "fPFOLIODATA")) return(data) # Data, if we have a "timeSeries" or a "list": if (class(data) == "timeSeries") { series = data = sort(data) assetsNames = colnames(data) } else if (class(data) == "list") { series = rep(NA, times = length(data[[1]])) assetsNames = names(series) = names(data[[1]]) } nAssets = length(assetsNames) names = assetsNames if(is.null(names)) names = paste("A", 1:nAssets, sep = "") .data = list( series = series, nAssets = nAssets, names = assetsNames) # Statistics: if (class(data) == "timeSeries") { estimator = getEstimator(spec) estimatorFun = match.fun(estimator) muSigma = estimatorFun(data, spec) Cov = cov(data) rownames(Cov) <- colnames(Cov) <- names .statistics = list( mean = colMeans(data), Cov = Cov, estimator = estimator, mu = muSigma$mu, Sigma = muSigma$Sigma) } else if (class(data) == "list") { .statistics = list( mean = data[[1]], Cov = data[[2]], estimator = NA, mu = data[[1]], Sigma = data[[2]]) } # Tail Risk: .tailRisk = spec@model$tailRisk # Return Value: new("fPFOLIODATA", data = .data, statistics = .statistics, tailRisk = .tailRisk) } ################################################################################ fPortfolio/R/object-getPortfolioVal.R0000644000176200001440000000461712323217770017321 0ustar liggesusers # 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 Description. 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: # getPortfolio Extracts portfolio from value object # FUNCTION: DESCRIPTION: # getWeights Extracts weights from value object # getCovRiskBudgets Extracts covarisnce risk budgets value # getTargetReturn Extracts target return from value object # getTargetRisk Extracts target risk from value object # getAlpha Extracts CVaR alpha from value object # getRiskFreeRate Extracts risk free rate from value object # getNFrontierPoints Extracts number of frontier points value # getStatus Extracts status from value object ################################################################################ getPortfolio.fPFOLIOVAL <- function(object) object@portfolio getWeights.fPFOLIOVAL <- function(object) object@portfolio$weights getCovRiskBudgets.fPFOLIOVAL <- function(object) object@portfolio$covRiskBudgets getTargetReturn.fPFOLIOVAL <- function(object) object@portfolio$targetReturn getTargetRisk.fPFOLIOVAL <- function(object) object@portfolio$targetRisk getAlpha.fPFOLIOVAL <- function(object) object@portfolio$targetAlpha getRiskFreeRate.fPFOLIOVAL <- function(object) object@Portfolio$riskFreeRate getNFrontierPoints.fPFOLIOVAL <- function(object) object@portfolio$nFrontierPoints getStatus.fPFOLIOVAL <- function(object) object@portfolio$status ################################################################################ fPortfolio/R/a-class-fPFOLIOVAL.R0000644000176200001440000000223112323217770015745 0ustar liggesusers # 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 Description. 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: # 'fPFOLIOVAL' S4 Portfolio Values Class ################################################################################ setClass("fPFOLIOVAL", representation( portfolio = "list", messages = "list") ) ################################################################################ fPortfolio/R/backtest-defaultFunctions.R0000644000176200001440000001122512323217770020041 0ustar liggesusers # 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 Description. 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: # equidistWindows Defines default equal distant rolling windows # tangencyStrategy Defines default tangency strategy portfolio # emaSmoother Defines default EMA weights smoother ################################################################################ equidistWindows <- function(data, backtest = portfolioBacktest()) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Defines default equidistant rolling windows # Arguments: # data - portfolio assets set, an object of class 'timeSeries' # backtest - an object of class 'fPFOLIOBACKTEST' # Note: # This is an example for a user defined windows function ... # Example: # equidistWindows(as.timeSeries(data(LPP2005REC))) # FUNCTION: # Settings: horizon = getWindowsHorizon(backtest) # Rolling Windows: ans = rollingWindows(x = data, period = horizon, by = "1m") # Return Value: ans } # ------------------------------------------------------------------------------ tangencyStrategy <- function(data, spec = portfolioSpec(), constraints = "LongOnly", backtest = portfolioBacktest()) { # A function implemented by Diethelm Wuertz and William Chen # FUNCTION: # Strategy Portfolio: strategyPortfolio <- try(tangencyPortfolio(data, spec, constraints)) # If tangency portfolio doesn't exist take the minimum variance portfolio: if (class(strategyPortfolio) == "try-error") { strategyPortfolio <- minvariancePortfolio(data, spec, constraints) } # Return Value: strategyPortfolio } # ------------------------------------------------------------------------------ emaSmoother <- function(weights, spec, backtest) { # A function implemented by Diethelm Wuertz and William Chen # Description: # A user defined weights smoother for portfolio backtesting # Arguments: # weights - a numeric matrix of weights # spec - portfolio spec, an object of class fPFLOLIOSPEC # backtest - portfolio backtest, an object of class fPFLOLIOBACKTEST # Example: # ans = portfolioBacktesting( ... ) # emaSmoother(ans$weights, spec, backtest) # FUNCTION: # EMA Function: ema <- function (x, lambda) { x = as.vector(x) lambda = 2/(lambda + 1) xlam = x * lambda xlam[1] = x[1] ema = filter(xlam, filter = (1 - lambda), method = "rec") ema[is.na(ema)] <- 0 as.numeric(ema) } # Lambda: lambda <- getSmootherLambda(backtest) lambdaLength <- as.numeric(substr(lambda, 1, nchar(lambda) - 1)) lambdaUnit <- substr(lambda, nchar(lambda), nchar(lambda)) stopifnot(lambdaUnit == "m") lambda <- lambdaLength # Initial Weights: nAssets <- ncol(weights) initialWeights = getSmootherInitialWeights(backtest) if (!is.null(initialWeights)) weights[1, ] = initialWeights # Compute Exponentially Smoothed Weights: smoothWeights1 = NULL for (i in 1:nAssets) { # print("first smooth") EMA <- ema(weights[, i], lambda = lambda) smoothWeights1 <- cbind(smoothWeights1, EMA) } # Double Smoothing ? doubleSmooth <- getSmootherDoubleSmoothing(backtest) if (doubleSmooth) { # print("second smooth") smoothWeights = NULL for (i in 1:nAssets) { EMA <- ema(smoothWeights1[, i], lambda = lambda) smoothWeights = cbind(smoothWeights, EMA) } } else { smoothWeights <- smoothWeights1 } # Add Names: rownames(smoothWeights) <- rownames(weights) colnames(smoothWeights) <- colnames(weights) # Return Value: smoothWeights } ################################################################################ fPortfolio/R/solve-RglpkMAD.R0000644000176200001440000001634012323217770015460 0ustar liggesusers # 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 Description. 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: # solveRglpk.MAD Portfolio interface to solver Rglpk # .madRglpkArguments Returns MAD arguments for solver # FUNCTION: DESCRIPTION: # .rglpk.MAD Wrapper to solver function ################################################################################ solveRglpk.MAD <- function(data, spec, constraints) { # A function implemented by Diethelm Wuertz # Description: # Portfolio interface to solver Rglpk # FUNCTION: # Settings: Data <- portfolioData(data, spec) data <- getSeries(Data) nAssets <- getNAssets(Data) type <- getType(spec) # Compile Arguments for Solver: args <- .madRglpkArguments(Data, spec, constraints) # Solve Multiassets Portfolio: ans <- .rglpk.MAD( obj = args$obj, mat = args$mat, dir = args$dir, rhs = args$rhs, types = args$types, max = args$max, bounds = args$bounds, verbose = args$verbose, nScenarios = args$nScenarios, nAssets = args$nAssets, targetReturn = args$targetReturn, Alpha = args$Alpha, Type = args$Type) ans$solver <- "solveRglpk.MAD" # Return Value: class(ans) = c("solver", "list") ans } ################################################################################ .madRglpkArguments <- function(data, spec, constraints) { # A function implemented by Diethelm Wuertz # Description: # Returns glpk conform MAD arguments for the solver # Details: # max/min: obj %*% x # subject to: # mat %*% x ?= rhs # dir = "?=" # upper/lower bounds # # Rglpk_solve_LP(obj, mat, dir, rhs, types = NULL, max = FALSE, # bounds = NULL, verbose = FALSE) # FUNCTION: # Settings: Data <- portfolioData(data, spec) data <- getSeries(Data) nAssets <- ncol(data) nScenarios <- nrow(data) series <- getDataPart(data) series <- series - matrix(rep(colMeans(series), times=nScenarios), byrow=TRUE, ncol=nAssets) targetReturn <- getTargetReturn(spec) Type <- getType(spec) # Objective Function to be Maximized: objNames <- c(paste("e", 1:nScenarios, sep = ""), colnames(data)) obj <- c(rep(1/nScenarios, nScenarios), rep(0, nAssets)) names(obj) <- objNames # 1: # The negative MAD Equation Constraints: # (-diag + [Returns-mu]) %*% (es, W) <= 0 Aneg <- cbind(-diag(nScenarios), series) aneg <- rep(0, nrow(Aneg)) dneg <- rep("<=", nrow(Aneg)) # 2: # The positive MAD Equation Constraints: # (+diag + [Returns-mu]) %*% (es, W) >= 0 Apos <- cbind( diag(nScenarios), series) apos <- rep(0, nrow(Apos)) dpos <- rep(">=", nrow(Apos)) # 3 and 4: # The A_equal Equation Constraints: A_eq %*% x == a_eq eqsumW <- eqsumWConstraints(Data, spec, constraints) Aeq <- cbind( matrix(0, ncol=nScenarios, nrow=nrow(eqsumW)), matrix(eqsumW[, -1], ncol=nAssets) ) aeq <- eqsumW[, 1] deq <- rep("==", nrow(eqsumW)) # 5: # The e_s > = 0 Equation Constraints: Aes <- cbind(diag(nScenarios), matrix(0, nrow=nScenarios, ncol=nAssets)) aes <- rep(0, nrow(Aes)) des <- rep(">=", nrow(Aes)) # 6: # Group Constraints: A W >= a minsumW <- minsumWConstraints(Data, spec, constraints) if (is.null(minsumW)){ Aminsum <- aminsum <- dminsum <- NULL } else { Aminsum <- cbind( matrix(0, nrow=nrow(minsumW), ncol=nScenarios), minsumW[, -1, drop=FALSE] ) aminsum <- minsumW[, 1] dminsum <- rep(">=", nrow(minsumW)) } # 7: # Group Constraints: A W <= b maxsumW <- maxsumWConstraints(Data, spec, constraints) if (is.null(maxsumW)){ Amaxsum <- amaxsum <- dmaxsum <- NULL } else { Amaxsum <- cbind( matrix(0, nrow=nrow(maxsumW), ncol=nScenarios), maxsumW[, -1, drop=FALSE] ) amaxsum <- maxsumW[, 1] dmaxsum <- rep("<=", nrow(maxsumW)) } # Putting all Together: mat <- rbind(Aeq, Apos, Aneg, Aes, Aminsum, Amaxsum) rhs <- c(aeq, apos, aneg, aes, aminsum, amaxsum) dir <- c(deq, dpos, dneg, des, dminsum, dmaxsum) # Box Constraints: Upper and Lower Bounds as listn required ... minW <- minWConstraints(Data, spec, constraints) maxW <- maxWConstraints(Data, spec, constraints) nInd <- 1:(nScenarios+nAssets) bounds <- list( lower = list(ind = nInd, val = c(rep( 0, nScenarios), minW)), upper = list(ind = nInd, val = c(rep(Inf, nScenarios), maxW)) ) # What variable Types, All Continuous: types <- NULL # Should I minimize or maximize ? max <- FALSE # Return Value: list( obj = obj, mat = mat, dir = dir, rhs = rhs, types = types, max = max, bounds = bounds, verbose = FALSE, nScenarios = nScenarios, nAssets = nAssets, targetReturn = targetReturn, Alpha = NA, Type = Type) } ################################################################################ .rglpk.MAD <- function(obj, mat, dir, rhs, types, max, bounds, verbose, nScenarios, nAssets, targetReturn, Alpha, Type) { # A function implemented by Diethelm Wuertz # Description: # Rglpk MAD Solver # FUNCTION: # Solve - use Rglpk_solve_LP: optim <- Rglpk::Rglpk_solve_LP( obj = obj, mat = mat, dir = dir, rhs = rhs, types = types, max = max, bounds = bounds, verbose = verbose) # Extract Weights: weights <- .checkWeights(rev(rev(optim$solution)[1:nAssets])) attr(weights, "invest") = sum(weights) # Result: ans <- list( type = Type, solver = "Rglpk.MAD", optim = optim, weights = weights, solution = weights, targetReturn = targetReturn, targetRisk = -optim$optimum, objective = -optim$optimum, status = optim$status[[1]], message = "NA") # Return Value: ans } ################################################################################ fPortfolio/R/utils-amplExtractors.R0000644000176200001440000001160012323217770017071 0ustar liggesusers # 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: # .amplObjval Extracts objective function value # .amplSolution Extracts solution vector # .amplModel Extracts model file information # .amplRun Extracts model file information # .amplSolver Extracts solver name # .amplVersion Extracts version number # .amplPresolve Extracts presolve information ############################################################################### .amplObjval <- function(ampl) { # A function Implemented by Diethelm Wuertz # Description: # Extracts objective function value. # Arguments: # ampl - an object as returned by the the rampl[OPT] solver # functions. # FUNCTION: # Return Value: ampl$objective } # ----------------------------------------------------------------------------- .amplSolution <- function(ampl) { # A function Implemented by Diethelm Wuertz # Description: # Extracts solution vector. # Arguments: # ampl - an object as returned by the the rampl[OPT] solver # functions. # FUNCTION: # Return Value: ampl$solution } # ----------------------------------------------------------------------------- .amplModel <- function(ampl) { # A function Implemented by Diethelm Wuertz # Description: # Extracts model file information # Arguments: # ampl - an object as returned by the the rampl[OPT] solver # functions. # FUNCTION: model <- ampl$opt$model cat(model, sep="\n") # Return Value: invisible(model) } # ----------------------------------------------------------------------------- .amplRun <- function(ampl) { # A function Implemented by Diethelm Wuertz # Description: # Extracts run file information. # Arguments: # ampl - an object as returned by the the rampl[OPT] solver # functions. # FUNCTION: # Get run file: run <- ampl$opt$run cat(, sep="\n") # Return Value: invisible(run) } # ----------------------------------------------------------------------------- .amplSolver <- function(ampl) { # A function Implemented by Diethelm Wuertz # Description: # Extracts solver information # Arguments: # ampl - an object as returned by the the rampl[OPT] solver # functions. # FUNCTION: # Get solver vector: solver <- ampl$solver cat(solver, sep="\n") # Return Value: invisible(solver) } # ----------------------------------------------------------------------------- .amplVersion <- function(ampl) { # A function Implemented by Diethelm Wuertz # Description: # Extracts solver version. # Arguments: # ampl - an object as returned by the the rampl[OPT] solver # functions. # FUNCTION: # Get Version Number: version <- ampl$version cat(version, sep="\n") # Return Value: invisible(version) } # ----------------------------------------------------------------------------- .amplPresolve <- function(ampl) { # A function Implemented by Diethelm Wuertz # Description: # Extracts presolver results # Arguments: # ampl - an object as returned by the the rampl[OPT] solver # functions. # FUNCTION: # Get presolve information: solve <- ampl$opt$solve Index <- grep("^Presolve", solve) solve <- solve[-(1:(Index-1))] Index <- grep("^$", solve)[1] solve <- solve[1:(Index-1)] cat(solve, sep="\n") # Return Value: invisible(solve) } ############################################################################### fPortfolio/R/utils-exampleData.R0000644000176200001440000001462112410245174016310 0ustar liggesusers # 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 ############################################################################### .exampleData <- function() { dataSet <- data("LPP2005REC", package="timeSeries", envir=environment()) LPP2005REC <- get(dataSet, envir=environment()) nAssets = 6 lppData = 100 * (as.matrix(LPP2005REC[,-1]))[1:20, 1:nAssets] nScenarios = nrow(lppData) targetReturn = mean(lppData) Mean = colMeans(lppData) Cov = cov(lppData) start = rep(1/nAssets, nAssets) names(start) = colnames(lppData) madObjective = c( rep(1, nScenarios), rep(0, nAssets)) / nScenarios markowitzObjective = list(dvec = rep(0, nAssets), Dmat = Cov) sharpeObjective = function(x) { ( -Mean %*% x / sqrt ( x %*% Cov %*% x )[[1]] ) } markowitzFun = function(x) { ( x %*% Cov %*% x)[[1]] } sharpeFun = function(x) { ( -Mean %*% x / sqrt ( x %*% Cov %*% x )[[1]] ) } lower = 0 upper = 1 # For LP with glpk vec <- c( rep(1, nScenarios), rep(0, nAssets)) / nScenarios A <- rbind( c( rep(0, nScenarios), targetReturn = Mean), c( rep(0, nScenarios), budget = rep(1, nAssets)), cbind(-diag(nScenarios), Returns = lppData), cbind(+diag(nScenarios), Returns = lppData)) dirA <- c( rep("==", 2), rep("<=", nScenarios), rep(">=", nScenarios)) rhsA <- c( targetReturn = targetReturn, budget = 1, lower = rep(0, nScenarios), upper = rep(0, nScenarios)) # MAD with Box Constraints: madbox.linCons <- list( mat = rbind( c( rep(0, nScenarios), targetReturn = Mean), c( rep(0, nScenarios), budget = rep(1, nAssets)), cbind(-diag(nScenarios), Returns = lppData), cbind(+diag(nScenarios), Returns = lppData)), lower = c( targetReturn = targetReturn, budget = 1, rep(-Inf, nScenarios), rep( 0, nScenarios)), upper = c( targetReturn = targetReturn, budget = 1, rep( 0, nScenarios), rep(Inf, nScenarios))) # MAD with Box and Group Constraints: Bonds = c(1, 0, 0, 1, 0, 0); bonds = 0.3 # >= 30% Foreign = c(0, 0, 0, 1, 1, 1); foreign = 0.5 # <= 50% Equities = c(0, 0, 1, 0, 1, 1); equities = 0.6 # <= 60% madgroup.linCons = list( mat = rbind( c( rep(0, nScenarios), targetReturn = Mean), c( rep(0, nScenarios), budget = rep(1, nAssets)), c( rep(0, nScenarios), bons = Bonds), c( rep(0, nScenarios), foreign = Foreign), c( rep(0, nScenarios), equities = Equities), cbind(negDiag = -diag(nScenarios), Returns = lppData), cbind(posDiag = +diag(nScenarios), Returns = lppData)), lower = c( targetReturn = targetReturn, budget = 1, bonds = 0.3, foreign = 0, equities = 0, rep(-Inf, nScenarios), rep( 0, nScenarios)), upper = c( targetReturn = targetReturn, budget = 1, bonds = 1, foreign = 0.5, equities = 0.6, rep( 0, nScenarios), rep(Inf, nScenarios))) # QP Box Constrained Markowitz: Budget = rep(1, nAssets) investBudget = 1 qpbox.linCons <- list( mat = rbind(Return = Mean, Budget = Budget), lower = c(Return=targetReturn, Budget=investBudget), upper = c(Return=targetReturn, Budget=investBudget) ) # QP Box and Group Constrained Markowitz: Bonds = c(1, 0, 0, 1, 0, 0); bonds = 0.3 # >= 30% Foreign = c(0, 0, 0, 1, 1, 1); foreign = 0.5 # <= 50% Equities = c(0, 0, 1, 0, 1, 1); equities = 0.6 # <= 60% qpgroup.linCons <- list( mat = rbind(Return = Mean, Budget = Budget, Bonds = Bonds, Foreign = Foreign, Equtities = Equities), lower = c(Return=targetReturn, Budget=1, Bonds=0.3, Foreign=0.0, Equtities=0.0), upper = c(Return=targetReturn, Budget=1, Bonds=1.0, Foreign=0.5, Equtities=0.6) ) # QP Box Constrained Markowitz: qpbox.funCons <- list( fun = list( Return = function(x) { Mean %*% x }, Budget = function(x) { sum(x) } ), lower = c(Return=targetReturn, Budget=1), upper = c(Return=targetReturn, Budget=1) ) qpgroup.funCons <- list( fun = list( Return = function(x) { Mean %*% x }, Budget = function(x) { sum(x) }, Bonds = function(x) { Bonds %*% x }, Foreign = function(x) { Foreign %*% x }, Equtities = function(x) { Equities %*% x } ), lower = c(Return=targetReturn, Budget=1, Bonds=0.3, Foreign=0.0, Equtities=0.0), upper = c(Return=targetReturn, Budget=1, Bonds=1.0, Foreign=0.5, Equtities=0.6) ) budget.linCons <- list( mat = rbind(Budget = Budget), lower = investBudget, upper = investBudget) budget.funCons <- list( fun = list(function(x) sum(x)), lower = investBudget, upper = investBudget) groupbudget.funCons <- list( fun = list( Budget = function(x) { sum(x) }, Bonds = function(x) { Bonds %*% x }, Foreign = function(x) { Foreign %*% x }, Equtities = function(x) { Equities %*% x } ), lower = c(Budget=1, Bonds=0.3, Foreign=0.0, Equtities=0.0), upper = c(Budget=1, Bonds=1.0, Foreign=0.5, Equtities=0.6) ) } ############################################################################### fPortfolio/R/object-getSpec.R0000644000176200001440000001210212421220204015540 0ustar liggesusers # 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 Description. 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: # getModel Extract whole model slot # getType Extract portfolio type from specification # getOptimize Extract what to optimize from specification # getEstimator Extract type of covariance estimator # getTailRisk Extract list of tail dependency risk matrixes # getParams Extract parameters from specification # getAlpha Extracts target VaR-alpha specification # getA Extracts quadratic LPM Exponent # FUNCTION: DESCRIPTION: # getPortfolio Extract whole portfolio slot # getWeights Extracts weights from a portfolio object # getTargetReturn Extracts target return from specification # getTargetRisk Extracts target riks from specification # getRiskFreeRate Extracts risk free rate from specification # getNFrontierPoints Extracts number of frontier points # getStatus Extracts portfolio status information # FUNCTION: DESCRIPTION: # getOptim Extract whole optim slot # getSolver Extracts solver from specification # getObjective Extracs name of objective function # getOptions Extracs options # getControl Extracs control list parameters # getTrace Extracts solver's trace flag # FUNCTION: DESCRIPTION: # getMessages Extract whole messages slot ################################################################################ # fPFOLIOSPEC: # model = list( # type = "MV", # optimize = "minRisk", # estimator = "covEstimator", # tailRisk = NULL, # params = list(alpha = 0.05, a = 1)) # portfolio = list( # weights = NULL, # targetReturn = NULL, # targetRisk = NULL, # targetAlpha = NULL, # riskFreeRate = 0, # nFrontierPoints = 50, # status = 0) # optim = list( # solver = "solveRquadprog", # objective = NULL, # options = list(meq=2), # control = list(), # trace = FALSE) # messages = list(NULL) # ------------------------------------------------------------------------------ getModel.fPFOLIOSPEC <- function(object) object@model getType.fPFOLIOSPEC <- function(object) object@model$type[1] getOptimize.fPFOLIOSPEC <- function(object) object@model$optimize getEstimator.fPFOLIOSPEC <- function(object) object@model$estimator getTailRisk.fPFOLIOSPEC <- function(object) object@model$tailRisk getParams.fPFOLIOSPEC <- function(object) object@model$params getAlpha.fPFOLIOSPEC <- function(object) object@model$params$alpha getA.fPFOLIOSPEC <- function(object) object@model$params$a .getEstimatorFun <- function(object) match.fun(getEstimator(object)) # ------------------------------------------------------------------------------ getPortfolio.fPFOLIOSPEC <- function(object) object@portfolio getWeights.fPFOLIOSPEC <- function(object) object@portfolio$weights getTargetReturn.fPFOLIOSPEC <- function(object) object@portfolio$targetReturn getTargetRisk.fPFOLIOSPEC <- function(object) object@portfolio$targetRisk getRiskFreeRate.fPFOLIOSPEC <- function(object) object@portfolio$riskFreeRate getNFrontierPoints.fPFOLIOSPEC <- function(object) object@portfolio$nFrontierPoints getStatus.fPFOLIOSPEC <- function(object) object@portfolio$status # ------------------------------------------------------------------------------ getOptim.fPFOLIOSPEC <- function(object) object@optim getSolver.fPFOLIOSPEC <- function(object) object@optim$solver getObjective.fPFOLIOSPEC <- function(object) object@optim$objective getOptions.fPFOLIOSPEC <- function(object) object@optim$options getControl.fPFOLIOSPEC <- function(object) object@optim$control getTrace.fPFOLIOSPEC <- function(object) object@optim$trace # ------------------------------------------------------------------------------ getMessages.fPFOLIOSPEC <- function(object) object@messages ################################################################################ fPortfolio/R/backtest-netPerformance.R0000644000176200001440000002041512323217770017475 0ustar liggesusers # 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: # netPerformance Returns performance from a portfolio backtest # FUNCTION: DESCRIPTION: # .netPerformanceYTD Returns year-to-date performance # .netPerformanceCalendar Returns calendar performance # .netPerformancePlot Creates a net performance plot ################################################################################ # DW - TO DO: # Add argument doplot to function netPerformance # Make plot() a generic function # Problems in plot function # ------------------------------------------------------------------------------ netPerformance <- function(object, format = "%Y-%m-%d") { # A function implemented by William Chen # Description: # Returns performance from a portfolio backtest # Arguments: # object - an object as returned by the function portfolioSmoothing. # format - # FUNCTION: # Settings: cumP <- object$portfolioReturns cumB <- object$benchmarkReturns P <- as.numeric(cumP) B <- as.numeric(cumB) monthlyP <- object$P monthlyB <- object$B char.dates <- rownames(cumP) dates <- strptime(char.dates, format = format) # nye <- new years eve nye <- as.character(dates[dates$mon == 11] ) years <- substr(nye, 1,4) nYears <- length(years) # Net Performance Plot: # DW: Needs repair, all following plots fails once called # .netPerformancePlot(dates, char.dates, years, nye, P) # NET PERFORMANCE TO YTD: netYTD = rbind(.netPerformanceYTD(char.dates, monthlyP, P, nYears), .netPerformanceYTD(char.dates, monthlyB, B, nYears)) rownames(netYTD) = c("Portfolio", "Benchmark") # NET PERFORMANCE CALENDAR YEAR: netCalendar <- rbind(.netPerformanceCalendar(nye, char.dates, P), .netPerformanceCalendar(nye, char.dates, B)) rownames(netCalendar) = c("Portfolio", "Benchmark") # Print Summary: cat("\nNet Performance % to", paste(rev(char.dates)[1], ":",sep = ""), "\n") print(round(netYTD,2)) cat("\n\nNet Performance % Calendar Year:\n") print(round(netCalendar,2)) cat("\n") # Return Value: ans = list(YTD = netYTD, Calendar = netCalendar) invisible(ans) } # ------------------------------------------------------------------------------ .netPerformanceYTD = function(char.dates, monthlyP, P, nYears, ...) { # A function implemented by William Chen # Description: # Returns year-to-date performance from a portfolio backtest # Arguments: # FUNCTION: # NET PERFORMANCE TO YTD: # summaries for last 1, 3, 6 months, # 1 year, 3 years, 5 years, 3 years annualised, # 5 years annualised (if possible) monthly <- c(rev(monthlyP)[1], sum(rev(monthlyP)[1:3]), sum(rev(monthlyP)[1:6])) if (nYears >= 5){ IDX <- 1 + c(0,1,2,5)*12 yearly <- numeric(length(IDX)-1) for (i in 1:(length(IDX)-1)){ yearly[i] <- rev(P)[IDX[1]] - rev(P)[IDX[i+1]] } annualised <- c((1+yearly[2]/100)^(1/3) - 1, (1+yearly[3]/100)^(1/5) - 1) * 100 combine <- c(monthly, yearly, annualised) names(combine) = c("1 mth", paste(c(3,6), "mths"), "1 yr", paste(c(3,5), "yrs"), paste(c(3,5), "yrs p.a.")) } else { IDX <- 1 + seq(0, nYears) * 12 yearly <- numeric(length(IDX)-1) for (i in 1:(length(IDX)-1)){ yearly[i] <- rev(P)[IDX[1]] - rev(P)[IDX[i+1]] } Names = paste(seq(1:nYears), "yrs") # calculate some annualised rates if (nYears > 1){ ys <- seq(nYears) annualised <- NULL for (i in 2:nYears){ annualised = c(annualised, (1+yearly[i]/100)^(1/i)-1) } annualised <- annualised * 100 yearly <- c(yearly, annualised) Names <- c(Names, paste(2:nYears, "yrs p.a.")) } combine <- c(monthly, yearly) names(combine) <- c("1 mth", paste(c(3,6), "mths"), Names) } # Return Value: combine } # ------------------------------------------------------------------------------ .netPerformanceCalendar <- function(nye, char.dates, P, ...) { # A function implemented by William Chen # Description: # Returns calendar performance # Arguments: # FUNCTION: # Net Performance Calendar Year: nye1 = c(nye, char.dates[length(char.dates)]) # First entry is the cumulated return at the end of first year # assume we start with 0 returns annuals <- P[char.dates == nye[1]] for (i in 1:(length(nye1)-1)){ annuals <- c(annuals, P[char.dates == nye1[i+1]] - P[char.dates == nye1[i]]) } Annual <- c(annuals, sum(annuals)) names(Annual) <- c(substr(nye,1,4), "YTD", "Total") # Return Value: Annual } # ------------------------------------------------------------------------------ .netPerformancePlot <- function(dates, char.dates, years, nye, P, base = 100) { # A function implemented by William Chen # Description: # Creates a net performance plot # Arguments: # FUNCTION: # NET PERFORMANCE PLOT: # Setup figure frame: Opar = par(oma = rep(0,4), mar = rep(0,4)) mat <- matrix(c(1,2,3), nrow = 3, ncol = 1) mat <- rbind(0, cbind(0, mat, 0)) layout(mat, widths = c(0, 1, 0), heights = c(lcm(0.3), lcm(0.8), 1, lcm(1))) # Add title: plot.new() plot.window(xlim = c(0,1), ylim = c(0,1)) rect(0,0,1,1,col = "grey50", border = NA) text(0.01,0.5, "Net Performance (rebased to 100)", font = 2, col = "white", adj = 0, cex = 1.8) # Rebased to 100 newP <- c(base, P + base) # limits: ylim.pretty <- pretty(newP) yLim = range(ylim.pretty) # extend to the end of calendar year shortCalendar <- 11 - rev(dates$mon)[1] xLim <- c(1, length(char.dates) + shortCalendar) # Create empty canvas: opar <- par(mar = c(2,5,1,4)) plot.new() plot.window(xlim = xLim, ylim = yLim, xaxs = "i", yaxs = "i") # Add bottom axes: IDX <- match(nye, char.dates) temp.d <- ifelse(dates$mon[1] != 0, dates$mon[1], 12) temp.y <- ifelse(temp.d == 12, as.numeric(years)[1]-1, as.numeric(years)[1]) labs <- c(paste(temp.d, temp.y, sep = "/"), paste(12, years, sep = "/")) if (shortCalendar !=0 ) labs = c(labs, paste(12, as.numeric(rev(years))[1] + 1, sep = "/")) axis(1, at = sort(c(xLim,IDX + 1)), labels = labs, cex.axis = 1, padj = 0.5)#, tck = -0.05) # Add left axes: yseq <- seq(min(ylim.pretty), max(ylim.pretty), by = 5) axis(2, at = yseq, las = 1, tick = FALSE, line = -0.7) abline(h = yseq, col = "grey50") # Draw portfolio performance: lines(newP, col = "red", lwd = 2) par(opar) # Add legend and extra text: plot.new() plot.window(xlim = c(0,1), ylim = c(0,1)) legend(0.015, 0.8, legend = "Portfolio", lty = "solid", lwd = 2, col = "red", bty = "n", cex = 1.1) # Return Value: par(Opar) invisible() } ################################################################################ fPortfolio/R/mathprogQP.R0000644000176200001440000001030512410257552015005 0ustar liggesusers # 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: # rsolveQP General Interface for QP solvers # .solveQP.MV.demo ############################################################################### rsolveQP <- function(objective, lower=0, upper=1, linCons, control=list(solver="quadprog", invoke=c("R", "AMPL", "NEOS"))) { # A function implemented by Diethelm Wuertz # Description: # Implements general function wrapper for QP solvers # Arguments: # objective - list(dvec=NULL, Dmat=NULL) # lower - lower box constraints # upper - upper box constraints # linCons - linear constraints, list with entries: # mat, lower, upper. # control - control list # FUNCTION: # Control: solver <- control$solver invoke <- control$invoke[1] # Solve Linear Problem: if (invoke == "R") { rfooLP <- match.fun ( paste("r", solver, "QP", sep="")) ans <- rfooLP(objective, lower, upper, linCons, control) } if (invoke == "AMPL" ) { ans <- ramplQP(objective, lower, upper, linCons, control) } if (invoke == "NEOS" ) { ans <- rneosQP(objective, lower, upper, linCons, control) } ans$solver <- paste(invoke, ans$solver) # Return Value: ans } ############################################################################### .solveQP.MV.demo <- function() { # Solve Mean-Variance Portfolio: # Load Dataset dataSet <- data("LPP2005REC", package="timeSeries", envir=environment()) LPP2005REC <- get(dataSet, envir=environment()) # Load Swiss Pension Fund Data: nAssets <- 6 data <- 100 * LPP2005REC[, 1:nAssets] # Arguments: objective <- list(dvec=rep(0, nAssets), Dmat=cov(data)) lower <- 0 upper <- 1 mat <- rbind( budget = rep(1, times=nAssets), returns = colMeans(data)) matLower <- c( budget = 1, return = mean(data)) matUpper <- matLower linCons <- list(mat, matLower, matUpper) control <- list() # R Contributed Solvers: rquadprogQP(objective, lower, upper, linCons) ripopQP(objective, lower, upper, linCons) # Default - AMPL Interface: ampl <- ramplQP(objective, lower, upper, linCons) ampl # All AMPL: for (solver in c( "cplex", "donlp2", "loqo", "lpsolve", "minos", "snopt", "ipopt", "bonmin", "couenne")) { ans <- ramplQP(objective, lower, upper, linCons, control=list(solver=solver)) print(ans) } # NEOS: # require(rneos) neos <- rneosQP(objective, lower, upper, linCons, control=list(solver="ipopt", category="nco")) neos # nco: Using Nonlinear Constrained Optimization Solver: for (solver in c( "conopt", "filter", "knitro", "lancelot", "loqo", "minos", "mosek", "pennon", "snopt")) { ans <- rneosQP(objective, lower, upper, linCons, control=list(solver=solver, category="nco")) print(ans) } # KRESTREL: kestrel <- rkestrelQP(objective, lower, upper, linCons, control=list(solver="loqo")) kestrel } ############################################################################### fPortfolio/R/mathprogNLP-donlp2.R0000644000176200001440000002177112410276126016321 0ustar liggesusers # 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: # rdonlp2NLP Rmetrics Interface for DONLP2 LP sol # donlp2NLP Convenience wrapper for DONLP2 LP so # donlp2NLPControl DONLP2 LP control parameter list # rdonlp2 Synonyme name for Rdonlp2::donlp2 function ################################################################################ rdonlp2NLP <- function( start, objective, lower=0, upper=1, linCons, funCons, control=list()) { # A function implemented by Diethelm Wuertz # Description: # Function wrapper for solver donlp2() # FUNCTION: # Update Control List: ctrl <- donlp2NLPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl N <- length(start) # Box Constraints: if(length(lower) == 1) { par.lower <- rep(lower, N) } else { par.lower <- lower } if(length(upper) == 1) { par.upper <- rep(upper, N) } else { par.upper <- upper } # Linear Constraints: if(missing(linCons)) { eqA <- ineqA <- NULL eqA.bound <- ineqA.lower <- ineqA.upper <- NULL } else { mat <- linCons[[1]] lower <- linCons[[2]] upper <- linCons[[3]] eqIndex <- which(lower == upper) ineqIndex <- which(lower != upper) if (length(eqIndex) == 0) { eqA <- NULL eqA.bound <- NULL } else { eqA <- mat[eqIndex, ] eqA.bound <- lower[eqIndex] } if (length(ineqIndex) == 0) { ineqA <- NULL ineqA.lower <- NULL ineqA.upper <- NULL } else { ineqA <- mat[ineqIndex, ] ineqA.lower <- lower[ineqIndex] ineqA.upper <- upper[ineqIndex] } } # Nonlinear Constraints: if(missing(funCons)) { eqFun <- ineqFun <- list() eqFun.bound <- ineqFun.lower <- ineqFun.upper <- NULL } else { fun <- funCons[[1]] lower <- funCons[[2]] upper <- funCons[[3]] eqIndex <- which(lower == upper) ineqIndex <- which(lower != upper) if (length(eqIndex) == 0) { eqFun <- list() eqFun.boud <- NULL } else { eqFun <- fun[eqIndex] eqFun.bound <- lower[eqIndex] } if (length(ineqIndex) == 0) { ineqFun <- list() ineqFun.lower <- NULL ineqFun.upper <- NULL } else { ineqFun <- fun[ineqIndex] ineqFun.lower <- lower[ineqIndex] ineqFun.upper <- upper[ineqIndex] } } # Optimize Portfolio: optim <- donlp2NLP( start = start, objective = objective, par.lower = par.lower, par.upper = par.upper, eqA = eqA, eqA.bound = eqA.bound, ineqA = ineqA, ineqA.lower = ineqA.lower, ineqA.upper = ineqA.upper, eqFun = eqFun, eqFun.bound = eqFun.bound, ineqFun = ineqFun, ineqFun.lower = ineqFun.lower, ineqFun.upper = ineqFun.upper, control = control) # Return Value: value = list( opt = optim, solution = optim$solution, objective = objective(optim$solution)[[1]], status = optim$status, message = optim$message, solver = "donlp2NLP") class(value) <- c("solver", "list") value } ################################################################################ donlp2NLP <- function( start, objective, par.lower = NULL, par.upper = NULL, eqA = NULL, eqA.bound = NULL, ineqA = NULL, ineqA.lower = NULL, ineqA.upper = NULL, eqFun = list(), eqFun.bound = NULL, ineqFun = list(), ineqFun.lower = NULL, ineqFun.upper = NULL, control = list()) { # A function implemented by Diethelm Wuertz # Description: # NLP wrapper for solver donlp2 # FUNCTION: # Environment: env <- .GlobalEnv # Update Control List: ctrl <- donlp2NLPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] <- control[name] control <- ctrl # Set Box Constraints: if (is.null(par.lower)) par.lower <- rep(-Inf, length(start)) if (is.null(par.upper)) par.upper <- rep(+Inf, length(start)) if (length(par.lower) == 1) par.lower <- rep(par.lower, length(start)) if (length(par.upper) == 1) par.upper <- rep(par.upper, length(start)) # Set Linear Equality and Inequality Constraints: A <- rbind(eqA, ineqA) lin.lower <- c(eqA.bound, ineqA.lower) lin.upper <- c(eqA.bound, ineqA.upper) # Set Nonlinear Equality and Inequality Constraints: if ((length(eqFun) + length(ineqFun)) == 0) { nlin <- list() nlin.lower <- rep(-Inf, length(nlin)) nlin.upper <- rep(+Inf, length(nlin)) } else { nlin <- list() if (length(eqFun) > 0) nlin = c(nlin, eqFun) if (length(ineqFun) > 0) nlin = c(nlin, ineqFun) nlin.lower <- c(eqFun.bound, ineqFun.lower) nlin.upper <- c(eqFun.bound, ineqFun.upper) } # Optimize Portfolio: optim <- rdonlp2( par = start, fn = objective, par.upper = par.upper, par.lower = par.lower, A = A, lin.upper = lin.upper, lin.lower = lin.lower, nlin = nlin, nlin.upper = nlin.upper, nlin.lower = nlin.lower, control = control, control.fun = function(lst) {return(TRUE)}, env = .GlobalEnv, name = NULL) names(optim$par) <- names(start) # Extract Weights: weights <- .checkWeights(optim$par) attr(weights, "invest") <- sum(weights) # Check Messages and Get Status: # ... unfortunately donlp2 has no status vaqriable, # so we have to analyze the messages Status <- 1 # Message <- "1234567890123456789012345" message11 <- "KT-conditions satisfied, " # no further correction computed" message12 <- "computed correction small" # , regular case" message13 <- "stepsizeselection: x almo" # st feasible, dir. deriv. very small" if (substr(optim$message, 1, 25) == message11) Status <- 0 if (substr(optim$message, 1, 25) == message12) Status <- 0 if (substr(optim$message, 1, 25) == message13) Status <- 0 # Return Value: value <- list( opt = optim, solution = optim$par, objective = objective(optim$par)[[1]], status = Status, message = optim$message, solver = "donlp2NLP") class(value) <- c("solver", "list") value } ################################################################################ rdonlp2 <- function(...) { Rdonlp2::donlp2(...) } ################################################################################ donlp2NLPControl <- function ( iterma = 4000, nstep = 20, fnscale = 1, report = FALSE, rep.freq = 1, tau0 = 1, tau = 0.1, del0 = 1, epsx = 1e-05, delmin = 0.1 * del0, epsdif = 1e-08, nreset.multiplier = 1, difftype = 3, epsfcn = 1e-16, taubnd = 1, hessian = FALSE, te0 = TRUE, te1 = FALSE, te2 = FALSE, te3 = FALSE, silent = TRUE, intakt = TRUE) { # A function implemented by Diethelm Wuertz # FUNCTION: # Control Parameters: control <- list( iterma = iterma, nstep = nstep, fnscale = fnscale, report = report, rep.freq = rep.freq, tau0 = tau0, tau = tau, del0 = del0, epsx = 1e-05, delmin = delmin, epsdif = epsdif, nreset.multiplier = nreset.multiplier, difftype = difftype, epsfcn = epsfcn, taubnd = taubnd, hessian = hessian, te0 = te0, te1 = te1, te2 = te2, te3 = te3, silent = silent, intakt = intakt) # Return Value: control } ################################################################################ fPortfolio/R/object-getUseMethods.R0000644000176200001440000003112012421225024016734 0ustar liggesusers # 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 Description. 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: # getA Defines Use Method for A # getAlpha Defines Use Method for Alpha # getConstraints Defines Use Method for Constraints # getControl Defines Use Method for Control # getCov Defines Use Method for Cov # getCovRiskBudgets Defines Use Method for CovRiskBudgets # getData Defines Use Method for Data # getEstimator Defines Use Method for Estimator # getMean Defines Use Method for Mean # getMu Defines Use Method for Mu # getNAssets Defines Use Method for NAssets # .getNames Defines Use Method for Names # getNFrontierPoints Defines Use Method for NFrontierPoints # getMessages Defines Use Method for Messages # getObjective Defines Use Method for Objective # getOptim Defines Use Method for Optim # getOptimize Defines Use Method for Optimize # getOptions Defines Use Method for Options # getPortfolio Defines Use Method for Portfolio # getParams Defines Use Method for Params # getRiskFreeRates Defines Use Method for RiskFreeRates # getSeries Defines Use Method for Series # getSigma Defines Use Method for Sigma # getSolver Defines Use Method for Solver # getSpec Defines Use Method for Spec # getStatistics Defines Use Method for Statistics # getStatus Defines Use Method for Status # getTailRisk Defines Use Method for TailRisk # getTailRiskBudgets Defines Use Method for TailRiskBudgets # getTargetReturn Defines Use Method for TargetReturn # getTargetRisk Defines Use Method for TargetRisk # getTrace Defines Use Method for Trace # getType Defines Use Method for Type # getUnits Defines Use Method for Units [Asset Names] # getWeights Defines Use Method for Weights ################################################################################ getA <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getA") } # ------------------------------------------------------------------------------ getAlpha <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getAlpha") } # ------------------------------------------------------------------------------ getConstraints <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getConstraints") } # ------------------------------------------------------------------------------ getControl <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getControl") } # ------------------------------------------------------------------------------ getCov <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getCov") } # ------------------------------------------------------------------------------ getData <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getData") } # ------------------------------------------------------------------------------ getCovRiskBudgets <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getCovRiskBudgets") } # ------------------------------------------------------------------------------ getEstimator <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getEstimator") } # ------------------------------------------------------------------------------ getMean <- function(object) { # A function implemented by Diethelm Wuertz # Return Value: UseMethod("getMean") } # ------------------------------------------------------------------------------ getMu <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getMu") } # ------------------------------------------------------------------------------ getNAssets <- function(object) { # A function implemented by Diethelm Wuertz # Return Value: UseMethod("getNAssets") } # ------------------------------------------------------------------------------ .getNames <- function(object) { # A function implemented by Diethelm Wuertz # REPLACED BY getUnits. # Return Value: UseMethod("getNames") } # ------------------------------------------------------------------------------ getNFrontierPoints <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getNFrontierPoints") } # ------------------------------------------------------------------------------ getMessages <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getMessages") } # ------------------------------------------------------------------------------ getObjective <- function(object) { # A function implemented by Diethelm Wuertz UseMethod("getObjective") } # ------------------------------------------------------------------------------ getOptim <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getOptim") } # ------------------------------------------------------------------------------ getOptimize <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: UseMethod("getOptimize") } # ------------------------------------------------------------------------------ getOptions <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getOptions") } # ------------------------------------------------------------------------------ getPortfolio <- function(object) { # A function implemented by Diethelm Wuertz # Return Value: UseMethod("getPortfolio") } # ------------------------------------------------------------------------------ getParams <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: UseMethod("getParams") } # ------------------------------------------------------------------------------ getRiskFreeRate <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getRiskFreeRate") } # ------------------------------------------------------------------------------ # DW: Take care of getSeries in package timeSeries getSeries <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getSeries") } # ------------------------------------------------------------------------------ getSigma <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getSigma") } # ------------------------------------------------------------------------------ getSolver <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getSolver") } # ------------------------------------------------------------------------------ getSpec <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getSpec") } # ------------------------------------------------------------------------------ getStatistics <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getStatistics") } # ------------------------------------------------------------------------------ getStatus <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getStatus") } # ------------------------------------------------------------------------------ getTailRisk <- function(object) { # A function implemented by Diethelm Wuertz # Return Value: UseMethod("getTailRisk") } # ------------------------------------------------------------------------------ getTailRiskBudgets <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getTailRiskBudgets") } # ------------------------------------------------------------------------------ getTargetReturn <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getTargetReturn") } # ------------------------------------------------------------------------------ getTargetRisk <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getTargetRisk") } # ------------------------------------------------------------------------------ getTrace <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getTrace") } # ------------------------------------------------------------------------------ getType <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getType") } # ------------------------------------------------------------------------------ # DW: already defined in package timeSeries # getUnits <- # function(object) # { # # A function implemented by Diethelm Wuertz # # # FUNCTION: # # # Return Value: # UseMethod("getUnits") # } # ------------------------------------------------------------------------------ # TS: already defined in package fBasics # getModel <- # function(object) # { # # A function implemented by Tobias Setz # # # FUNCTION: # # # Return Value: # UseMethod("getModel") # } # ------------------------------------------------------------------------------ getWeights <- function(object) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getWeights") } ################################################################################ fPortfolio/R/utils-amplLibrary.R0000644000176200001440000001373412323217770016351 0ustar liggesusers # 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: # .lpAssign Assigns linear programming model # .qpAssign Assigns quadratic programming model ################################################################################ .lpAssign <- function(project, c, x_L, x_U, A, b_L, b_U, solver="ipopt", trace=FALSE) { # A function written by Diethelm Wuertz # Description: # Assigns LP Model # Arguments: # project - project name # FUNCTION: # Settings: n <- length(c) m <- nrow(A) # Write AMPL Model File: amplModelOpen(project) model <- c( "param n ;", "param m ;", "param c{1..n} ;", "param x_L{1..n} ;", "param x_U{1..n} ;", "param A{1..m, 1..n} ;", "param b_L{1..m} ;", "param b_U{1..m} ;", "var x{1..n};", "minimize Objective: sum {i in 1..n} x[i]*c[i] ;", "s.t. lower {i in 1..n}: x[i] >= x_L[i] ;", "s.t. upper {i in 1..n}: x[i] <= x_U[i] ;", "s.t. linLower {j in 1..m}: sum{i in 1..n} A[j, i]*x[i] >= b_L[j] ;", "s.t. linUpper {j in 1..m}: sum{i in 1..n} A[j, i]*x[i] <= b_U[j] ;", NULL) amplModelAdd(model, project) if (trace) amplModelShow(project) # Write AMPL Data File: amplDataOpen(project) amplDataAddValue (data="n", value=n, project) amplDataAddValue (data="m", value=m, project) amplDataAddVector(data="c", vector=c, project) amplDataAddVector(data="x_L", vector=x_L, project) amplDataAddVector(data="x_U", vector=x_U, project) amplDataAddMatrix(data="A", matrix=A, project) amplDataAddVector(data="b_L", vector=b_L, project) amplDataAddVector(data="b_U", vector=b_U, project) if (trace) amplDataShow(project) # Write AMPL RUN File: amplRunOpen(project) run <- c( paste("reset ;"), paste("option solver ", solver, " ;", sep = ""), paste("model ", project, ".mod ;", sep = ""), paste("data ", project, ".dat ;", sep = ""), paste("solve ;"), paste("display x > ", project, ".txt ;", sep = ""), paste("display solve_result_num > ", project, ".txt ;", sep = ""), paste("display solve_result > ", project, ".txt ;", sep = ""), paste("display solve_message > ", project, ".txt ;", sep = ""), paste("exit ;") ) amplRunAdd(run, project) if (trace) amplRunShow(project) # Return Value: invisible() } # ----------------------------------------------------------------------------- .qpAssign <- function(project, c, F, x_L, x_U, A, b_L, b_U, solver="ipopt", trace=FALSE) { # A function written by Diethelm Wuertz # Description: # Assigns LP Model # Arguments: # project - project name # FUNCTION: # Settings: n <- length(c) m <- nrow(A) # Write AMPL Model File: amplModelOpen(project) model <- c( "param n ;", "param m ;", "param c{1..n} ;", "param F{1..n, 1..n} ;", "param x_L{1..n} ;", "param x_U{1..n} ;", "param A{1..m, 1..n} ;", "param b_L{1..m} ;", "param b_U{1..m} ;", "var x{1..n};", "minimize Risk: sum {i in 1..n} x[i]*c[i] + 0.5*sum {i in 1..n} sum{j in 1..n} x[i]*F[i,j]*x[j] ;", "s.t. lower {i in 1..n}: x[i] >= x_L[i] ;", "s.t. upper {i in 1..n}: x[i] <= x_U[i] ;", "s.t. linLower {j in 1..m}: sum{i in 1..n} A[j, i]*x[i] >= b_L[j] ;", "s.t. linUpper {j in 1..m}: sum{i in 1..n} A[j, i]*x[i] <= b_U[j] ;", NULL) amplModelAdd(model, project) if (trace) amplModelShow(project) # Write AMPL Data File: amplDataOpen(project) amplDataAddValue (data="n", value=n, project) amplDataAddValue (data="m", value=m, project) amplDataAddVector(data="c", vector=c, project) amplDataAddMatrix(data="F", matrix=F, project) amplDataAddVector(data="x_L", vector=x_L, project) amplDataAddVector(data="x_U", vector=x_U, project) amplDataAddMatrix(data="A", matrix=A, project) amplDataAddVector(data="b_L", vector=b_L, project) amplDataAddVector(data="b_U", vector=b_U, project) if (trace) amplDataShow(project) # Write AMPL RUN File: amplRunOpen(project) run <- c( paste("reset ;"), paste("option solver ", solver, " ;", sep = ""), paste("model ", project, ".mod ;", sep = ""), paste("data ", project, ".dat ;", sep = ""), paste("solve ;"), paste("display x > ", project, ".txt ;", sep = ""), paste("display solve_result_num > ", project, ".txt ;", sep = ""), paste("display solve_result > ", project, ".txt ;", sep = ""), paste("display solve_message > ", project, ".txt ;", sep = ""), paste("exit ;") ) amplRunAdd(run, project) if (trace) amplRunShow(project) # Return Value: invisible() } ################################################################################ fPortfolio/R/object-getData.R0000644000176200001440000000577312424415114015550 0ustar liggesusers # 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 Description. 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: # getData Extracts data slot # getSeries Extracts assets series data # getNAssets Extracts number of assets from data # getUnits Extracts assets names from data # FUNCTION: DESCRIPTION: # getStatistics Extracts statistics slot # getMean Extracs mean from statistics # getCov Extracs covariance Sigma from statistics # getMu Extracs mu from statistics # getSigma Extracs Sigma from statistics # getEstimator Extracts estimator from # FUNCTION: DESCRIPTION: # getTailRisk Extracts tailRisk slot ################################################################################ # fPFOLIODATA: # data = list( # series # nAssets # names) # statistics = list( # mean, # Cov, # mu, # Sigma, # estimator) # tailRisk = list() # ------------------------------------------------------------------------------t getData.fPFOLIODATA <- function(object) object@data # Extracts the @data slot from a fPFOLIODATA object getSeries.fPFOLIODATA <- function(object) object@data$series getNAssets.fPFOLIODATA <- function(object) object@data$nAssets getUnits.fPFOLIODATA <- function(x) x@data$names # ------------------------------------------------------------------------------ getStatistics.fPFOLIODATA <- function(object) object@statistics # Extracts the @statistics slot from a fPFOLIODATA object getMean.fPFOLIODATA <- function(object) object@statistics$mean getCov.fPFOLIODATA <- function(object) object@statistics$Cov getEstimator.fPFOLIODATA <- function(object) object@statistics$estimator getMu.fPFOLIODATA <- function(object) object@statistics$mu getSigma.fPFOLIODATA <- function(object) object@statistics$Sigma # ------------------------------------------------------------------------------ getTailRisk.fPFOLIODATA <- function(object) object@tailRisk # Extracts the @tailRisk slot from a fPFOLIODATA object ################################################################################ fPortfolio/R/methods-summary.R0000644000176200001440000000357612323217770016076 0ustar liggesusers # 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 Description. 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: # summary.fPORTFOLIO S3 Summary method for 'fPORTFOLIO' objects ################################################################################ summary.fPORTFOLIO <- function(object, ...) { # A function implemented by Diethelm Wuertz # Description: # Plot method for an object of class 'fPORTFOLIO' # Note: # This method can also be used for plotting graphs fitted by # the function 'garch' from the contributed R package 'tseries'. # FUNCTION: # Summary: print(object) funCalled = as.character(object@call[1]) if (funCalled == "portfolioFrontier") { weightsPlot(object) weightedReturnsPlot(object) covRiskBudgetsPlot(object) # Plot Frontier: plot(object, which = 1) } else { weightsPie(object) weightedReturnsPie(object) covRiskBudgetsPie(object) } # Return Value: invisible(object) } ################################################################################ fPortfolio/R/mathprogQP-quadprog.R0000644000176200001440000001563512323217770016641 0ustar liggesusers # 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: # rquadprogQP Rmetrics Interface for QUADPROG QP solvers # quadprogQP Convenience wrapper for QUADPROG QP solvers # quadprogQPControl QUADPROG QP control parameter list # rquadprog Synonyme name for quadprog::solveLP function ############################################################################### rquadprogQP <- function(objective, lower=0, upper=1, linCons, control=list()) { # A function implemented by Diethelm Wuertz # Description: # Implements Goldberg-Idnani Algorithm # Arguments: # objective - list(dvec=NULL, Dmat=NULL) # lower - lower box constraints # upper - upper box constraints # linCons - linear constraints, list with entries: # mat, lower, upper. # control - control list # FUNCTION: # Control List: ctrl <- quadprogQPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl # General Settings: dvec <- objective$dvec Dmat <- objective$Dmat Names <- colnames(rbind(dvec, Dmat)) N <- ncol(rbind(dvec, Dmat)) # Box Constraints: if(length(lower) == 1) { par.lower <- rep(lower, N) } else { par.lower <- lower } if(length(upper) == 1) { par.upper <- rep(upper, N) } else { par.upper <- upper } # Linear Constraints: if(missing(linCons)) { eqA <- ineqA <- NULL eqA.bound <- ineqA.lower <- ineqA.upper <- NULL } else { mat <- linCons[[1]] M <- nrow(mat) lower <- linCons[[2]] upper <- linCons[[3]] if(length(lower) == 1) lower <- rep(lower, M) if(length(upper) == 1) upper <- rep(upper, M) eqIndex <- which(lower == upper) ineqIndex <- which(lower != upper) if (length(eqIndex) == 0) { eqA <- NULL eqA.bound <- NULL } else { eqA <- mat[eqIndex, ] eqA.bound <- lower[eqIndex] } if (length(ineqIndex) == 0) { ineqA <- NULL ineqA.lower <- NULL ineqA.upper <- NULL } else { ineqA <- mat[ineqIndex, ] ineqA.lower <- lower[ineqIndex] ineqA.upper <- upper[ineqIndex] } } # Optimize Portfolio: optim <- quadprogQP( objective, par.lower, par.upper, eqA, eqA.bound, ineqA, ineqA.lower, ineqA.upper, control) # Return Value: value <- list( opt = optim, solution = optim$solution, objective = optim$objective, status = optim$status, message = optim$message, solver = "quadprog", version = optim$version) class(value) = c("solver", "list") value } ############################################################################### quadprogQP <- function( objective=list(dvec=NULL, Dmat=NULL), par.lower=NULL, par.upper=NULL, eqA=NULL, eqA.bound=NULL, ineqA=NULL, ineqA.lower=NULL, ineqA.upper=NULL, control=list()) { # A function implemented by Diethelm Wuertz # Description: # Implements Goldberg-Idnani Algorithm # FUNCTION: # Control List: ctrl <- quadprogQPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl # General Settings: dvec <- -objective$dvec Dmat <- objective$Dmat Names <- colnames(rbind(dvec, Dmat)) N <- ncol(rbind(dvec, Dmat)) # Box Constraints: if (length(par.lower) == 1) par.lower <- rep(par.lower, N) if (length(par.upper) == 1) par.upper <- rep(par.upper, N) # Constraints Settings: Amat <- eqA if (!is.null(ineqA)) Amat <- rbind(eqA, ineqA, -ineqA) Amat <- rbind(Amat, diag(N), -diag(N)) Amat <- t(Amat) bvec <- eqA.bound if (!is.null(ineqA.lower)) bvec <- c(bvec, ineqA.lower) if (!is.null(ineqA.upper)) bvec <- c(bvec, -ineqA.upper) bvec <- c(bvec, par.lower) if (!is.null(par.upper)) bvec <- c(bvec, -par.upper) if (is.null(eqA)) meq <- 0 else meq <- nrow(eqA) Amat <- Amat[, is.finite(bvec)] bvec <- bvec[is.finite(bvec)] # Optimize: elapsed <- Sys.time() optim <- quadprog::solve.QP( Dmat = Dmat, dvec = dvec, Amat = Amat, bvec = bvec, meq = meq) elapsed <- Sys.time() - elapsed # Note: # DW: if quadprog::solve.QP fails with non-zero status optim$ierr= # =1: stop("constraints are inconsistent, no solution!") # =2: stop("matrix D in quadratic function is not positive definite!") # this is ugly! # Thus: Status <- 0 Message <- "solution found" # Add: names(optim$solution) <- Names # Version: package <- packageDescription(pkg="quadprog") version <- paste(package$Package, package$Version, package$Date) # Return Value: value <- list( opt = optim, solution = optim$solution, objective = optim$value, status = Status, message = Message, solver = "quadprog", elapsed <- elapsed, version = version) class(value) = c("solver", "list") value } ############################################################################### rquadprog <- quadprog::solve.QP ############################################################################### quadprogQPControl <- function(solver="quadprog", trace=FALSE) { # A function implemented by Diethelm Wuertz # Description: # Returns control parameter list # Arguments: # trace - al logical flag, should the function be traced? # Details: # Note there are no control paramters supported in # quadprog::solve.QP # FUNCTION: # Control Parameter: control <- list(trace = trace) # Return Value: control } ############################################################################### fPortfolio/R/plot-weightsLines.R0000644000176200001440000003464612323217770016363 0ustar liggesusers # 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 Description. 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: # weightsLinePlot Plots staggered weights # weightedReturnsLinePlot Plots staggered weighted returns # covRiskBudgetsLinePlot Plots covariance risk budgets ################################################################################ weightsLinePlot <- function(object, labels = TRUE, col = NULL, title = TRUE, box = TRUE, legend = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Plots a bar chart of weights # Arguments: # object - an object of class 'fPORTFOLIO' # labels - should the graph be automatically labeled? # col - a color palette, by default the rainbow palette # title - should the graph get default title and labels? # legend - should a legend be added to the plot? # FUNCTION: # Use default color if not specified ... Title = "Weights" if (is.null(col)) col = seqPalette(getNAssets(object)+1, "Blues")[-1] if (sum(c(par()$mfrow, par()$mfcol)) == 4) CEX = 0.9 else CEX = 0.7 # Compute Weights: X = weights = getWeights(object) # Define Plot Range: ymax = max(colMaxs(weights)) ymin = min(colMins(weights)) range = ymax - ymin ymax = ymax + 0.005 * range ymin = ymin - 0.005 * range dim = dim(weights) range = dim[1] xmin = 0 xmax = range + 0.2 * range # Create Bar Plots: if (labels) { if(legend){ ts.plot(X, gpars = list(col = col, ann = FALSE, xaxt = "n"), xlim = c(xmin, xmax), ylim = c(ymin, ymax)) legendtext = names(getStatistics(object)$mu) if(is.null(legendtext)){ for(i in 1:dim[2]){legendtext[i] = paste("Asset", i, sep = " ")} } legend("topright", legend = legendtext, bty = "n", cex = CEX, fill = col) } else { ts.plot(weights, gpars = list(col = col, ann = FALSE, xaxt = "n")) } } else { ts.plot(X, ...) } # Add Tailored Labels - 6 may be a good Number ... targetRisk = getTargetRisk(object)[, 1] targetReturn = getTargetReturn(object)[, 1] nSigma = length(targetRisk) nLabels = 6 M = c(0, ( 1:(nSigma %/% nLabels) ) ) *nLabels + 1 nSignifDigits = 3 axis(3, at = M, labels = signif(targetRisk[M], nSignifDigits)) axis(1, at = M, labels = signif(targetReturn[M], nSignifDigits)) # Add Axis Labels and Title: if (title) { mtext("Target Risk", side = 3, line = 2, adj = 1, cex = CEX) mtext("Target Return", side = 1, line = 2, adj = 1, cex = CEX) mtext("Weight", side = 2, line = 2, adj = 1, cex = CEX) } # Add Weights 0 and 1 Reference Lines # lines(x = c(0, nSigma), c(1, 1), col = "grey", lty = 3) # lines(x = c(0, nSigma), c(0, 0), col = "grey", lty = 3) # Add vertical Line at minimum risk: minIndex = which.min(targetRisk) minRisk = signif(min(targetRisk), 3) abline(v = minIndex, col = "black", lty = 1, lwd = 2) # Add Info: if (title) { mtext(paste(getType(object), "|", getSolver(object), "|", "minRisk =", minRisk), side = 4, adj = 0, col = "grey", cex = 0.7) } # Add Title: if (title) { mtext(Title, adj = 0, line = 2.5, font = 2, cex = CEX+0.1) } # Complete to draw box ... if (box) box() # Return Value: invisible() } # ------------------------------------------------------------------------------ weightedReturnsLinePlot <- function(object, labels = TRUE, col = NULL, title = TRUE, box = TRUE, legend = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Plots a bar chart of weights # Arguments: # object - an object of class 'fPORTFOLIO' # labels - should the graph be automatically labeled? # col - a color palette, by default the rainbow palette # title - should the graph get default title and labels? # legend - should a legend be added to the plot? # FUNCTION: # Use default color if not specified ... Title = "Weighted Returns" if (is.null(col)) col = seqPalette(getNAssets(object)+1, "Blues")[-1] if (sum(c(par()$mfrow, par()$mfcol)) == 4) CEX = 0.9 else CEX = 0.7 # Compute Weighted Returns: weights = getWeights(object) dim = dim(weights) returns = getStatistics(object)$mu weightedReturns = NULL for(i in 1:dim[2]){ nextWeightedReturns = weights[,i]*returns[i] weightedReturns = cbind(weightedReturns, nextWeightedReturns) } colnames(weightedReturns) = colnames(weights) X = weightedReturns # Define Plot Range: ymax = max(colMaxs(X)) ymin = min(colMins(X)) range = ymax - ymin ymax = ymax + 0.005 * range ymin = ymin - 0.005 * range dim = dim(weights) range = dim[1] xmin = 0 xmax = range + 0.2 * range # Create Bar Plots: if (labels) { if(legend){ ts.plot(X, gpars = list(col = col, ann = FALSE, xaxt = "n"), xlim = c(xmin, xmax), ylim = c(ymin, ymax)) legendtext = names(getStatistics(object)$mu) if(is.null(legendtext)){ for(i in 1:dim[2]){legendtext[i] = paste("Asset", i, sep = " ")} } legend("topright", legend = legendtext, bty = "n", cex = CEX, fill = col) } else { ts.plot(weights, gpars = list(col = col, ann = FALSE, xaxt = "n")) } } else { ts.plot(X, ...) } # Add Tailored Labels - 6 may be a good Number ... targetRisk = getTargetRisk(object)[, 1] targetReturn = getTargetReturn(object)[, 1] nSigma = length(targetRisk) nLabels = 6 M = c(0, ( 1:(nSigma %/% nLabels) ) ) *nLabels + 1 nSignifDigits = 3 axis(3, at = M, labels = signif(targetRisk[M], nSignifDigits)) axis(1, at = M, labels = signif(targetReturn[M], nSignifDigits)) # Add Axis Labels and Title: if (title) { mtext("Target Risk", side = 3, line = 2, adj = 1, cex = CEX) mtext("Target Return", side = 1, line = 2, adj = 1, cex = CEX) mtext("Weight", side = 2, line = 2, adj = 1, cex = CEX) } # Add Weights 0 and 1 Reference Lines # lines(x = c(0, nSigma), c(1, 1), col = "grey", lty = 3) # lines(x = c(0, nSigma), c(0, 0), col = "grey", lty = 3) # Add vertical Line at minimum risk: minIndex = which.min(targetRisk) minRisk = signif(min(targetRisk), 3) abline(v = minIndex, col = "black", lty = 1, lwd = 2) # Add Info: if (title) { mtext(paste(getType(object), "|", getSolver(object), "|", "minRisk =", minRisk), side = 4, adj = 0, col = "grey", cex = 0.7) } # Add Title: if (title) { mtext(Title, adj = 0, line = 2.5, font = 2, cex = CEX+0.1) } # Complete to draw box ... if (box) box() # Return Value: invisible() } # ------------------------------------------------------------------------------ covRiskBudgetsLinePlot <- function(object, labels = TRUE, col = NULL, title = TRUE, box = TRUE, legend = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Plots a bar chart of weights # Arguments: # object - an object of class 'fPORTFOLIO' # labels - should the graph be automatically labeled? # col - a color palette, by default the rainbow palette # title - should the graph get default title and labels? # legend - should a legend be added to the plot? # FUNCTION: # Use default color if not specified ... Title = "Covariance Risk Budgets" if (is.null(col)) col = seqPalette(getNAssets(object)+1, "Blues")[-1] if (sum(c(par()$mfrow, par()$mfcol)) == 4) CEX = 0.9 else CEX = 0.7 # Compute Covariance Risk Budgets: X = getCovRiskBudgets(object) # Define Plot Range: ymax = max(colMaxs(X)) ymin = min(colMins(X)) range = ymax - ymin ymax = ymax + 0.005 * range ymin = ymin - 0.005 * range dim = dim(X) range = dim[1] xmin = 0 xmax = range + 0.2 * range # Create Bar Plots: if (labels) { if(legend){ ts.plot(X, gpars = list(col = col, ann = FALSE, xaxt = "n"), xlim = c(xmin, xmax), ylim = c(ymin, ymax)) legendtext = names(getStatistics(object)$mu) if(is.null(legendtext)){ for(i in 1:dim[2]){legendtext[i] = paste("Asset", i, sep = " ")} } legend("topright", legend = legendtext, bty = "n", cex = CEX, fill = col) } else { ts.plot(weights, gpars = list(col = col, ann = FALSE, xaxt = "n")) } } else { ts.plot(X, ...) } # Add Tailored Labels - 6 may be a good Number ... targetRisk = getTargetRisk(object) targetReturn = getTargetReturn(object) nSigma = length(targetRisk) nLabels = 6 M = c(0, ( 1:(nSigma %/% nLabels) ) ) *nLabels + 1 nSignifDigits = 3 axis(3, at = M, labels = signif(targetRisk[M], nSignifDigits)) axis(1, at = M, labels = signif(targetReturn[M], nSignifDigits)) # Add Axis Labels and Title: if (title) { mtext("Target Risk", side = 3, line = 2, adj = 1, cex = CEX) mtext("Target Return", side = 1, line = 2, adj = 1, cex = CEX) mtext("Weight", side = 2, line = 2, adj = 1, cex = CEX) } # Add Weights 0 and 1 Reference Lines # lines(x = c(0, nSigma), c(1, 1), col = "grey", lty = 3) # lines(x = c(0, nSigma), c(0, 0), col = "grey", lty = 3) # Add vertical Line at minimum risk: minIndex = which.min(targetRisk[, 1]) minRisk = signif(min(targetRisk[, 1]), 3) abline(v = minIndex, col = "black", lty = 1, lwd = 2) # Add Info: if (title) { mtext(paste(getType(object), "|", getSolver(object), "|", "minRisk =", minRisk), side = 4, adj = 0, col = "grey", cex = 0.7) } # Add Title: if (title) { mtext(Title, adj = 0, line = 2.5, font = 2, cex = CEX+0.1) } # Complete to draw box ... if (box) box() # Return Value: invisible() } # ------------------------------------------------------------------------------ .tailRiskBudgetsLinePlot <- function(object, labels = TRUE, col = NULL, title = TRUE, box = TRUE, legend = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Plots a bar chart of weights # Arguments: # object - an object of class 'fPORTFOLIO' # labels - should the graph be automatically labeled? # col - a color palette, by default the rainbow palette # title - should the graph get default title and labels? # legend - should a legend be added to the plot? # FUNCTION: # Use default color if not specified ... Title = "Covariance Risk Budgets" if (is.null(col)) col = seqPalette(getNAssets(object)+1, "Blues")[-1] if (sum(c(par()$mfrow, par()$mfcol)) == 4) CEX = 0.9 else CEX = 0.7 # Compute Covariance Risk Budgets: stop("Not yet implemented") tailRiskMatrix = getTailRisk(object) X = getTailRiskBudgets(object) # Define Plot Range: ymax = max(colMaxs(X)) ymin = min(colMins(X)) range = ymax - ymin ymax = ymax + 0.005 * range ymin = ymin - 0.005 * range dim = dim(weights) range = dim[1] xmin = 0 xmax = range + 0.2 * range # Create Bar Plots: if (labels) { if(legend){ ts.plot(X, gpars = list(col = col, ann = FALSE, xaxt = "n"), xlim = c(xmin, xmax), ylim = c(ymin, ymax)) legendtext = names(getStatistics(object)$mu) if(is.null(legendtext)){ for(i in 1:dim[2]){legendtext[i] = paste("Asset", i, sep = " ")} } legend("topright", legend = legendtext, bty = "n", cex = CEX, fill = col) } else { ts.plot(weights, gpars = list(col = col, ann = FALSE, xaxt = "n")) } } else { ts.plot(X, ...) } # Add Tailored Labels - 6 may be a good Number ... targetRisk = getTargetRisk(object) targetReturn = getTargetReturn(object) nSigma = length(targetRisk) nLabels = 6 M = c(0, ( 1:(nSigma %/% nLabels) ) ) *nLabels + 1 nSignifDigits = 3 axis(3, at = M, labels = signif(targetRisk[M], nSignifDigits)) axis(1, at = M, labels = signif(targetReturn[M], nSignifDigits)) # Add Axis Labels and Title: if (title) { mtext("Target Risk", side = 3, line = 2, adj = 1, cex = CEX) mtext("Target Return", side = 1, line = 2, adj = 1, cex = CEX) mtext("Weight", side = 2, line = 2, adj = 1, cex = CEX) } # Add Weights 0 and 1 Reference Lines # lines(x = c(0, nSigma), c(1, 1), col = "grey", lty = 3) # lines(x = c(0, nSigma), c(0, 0), col = "grey", lty = 3) # Add vertical Line at minimum risk: minIndex = which.min(targetRisk[, 1]) minRisk = signif(min(targetRisk[, 1]), 3) abline(v = minIndex, col = "black", lty = 1, lwd = 2) # Add Info: if (title) { mtext(paste(getType(object), "|", getSolver(object), "|", "minRisk =", minRisk), side = 4, adj = 0, col = "grey", cex = 0.7) } # Add Title: if (title) { mtext(Title, adj = 0, line = 2.5, font = 2, cex = CEX+0.1) } # Complete to draw box ... if (box) box() # Return Value: invisible() } ################################################################################ fPortfolio/R/object-portfolioConstraints.R0000644000176200001440000005663712323217770020457 0ustar liggesusers ################################################################################ # FUNCTION: DESCRIPTION: # portfolioConstraints Returns an object of class fPFOLIOCON # FUNCTION: DESCRIPTION: # minWConstraints Returns vector with min box constraints # maxWConstraints Returns vector with max box constraints # eqsumWConstraints Returns list with group equal vec/matrix constraints # minsumWConstraints Returns list with group min vec/matrix constraints # maxsumWConstraints Returns list with group max vec/matrix constraints # minBConstraints Returns vector with min cov risk budget constraints # maxBConstraints Returns vector with max cov risk budget constraints # minFConstraints Returns vector with min nonlin functions constraints # maxFConstraints Returns vector with max nonlin functions constraints # minBuyinConstraints Returns lower bound of buyin constraints # maxBuyinConstraints Returns upper bound of buyin constraints # nCardConstraints Returns number of Cardinalities # minCardConstraints Returns lower bound of Cardinalities # maxCardConstraints Returns upper bound of Cardinalities ################################################################################ portfolioConstraints <- function(data, spec=portfolioSpec(), constraints="LongOnly", ...) { # A function implemented by Diethelm Wuertz # Description: # Returns an object of class fPFOLIOCON # Arguments: # data - a timeSeries or a fPFOLIODATA object # spec - a fPFOLIOSPEC object # constraints - a constraints string # validStrings = c( # "LongOnly", "Short", # LongOnly and Short Notification # "minW", "maxW", # Box Constraints # "minsumW", "maxsumW", # left/right Sided Group Constraints # "minB", "maxB", # Covariance Risk Budgets # "listF", "minF", "maxF", # Nonlinear Functions Constraints # NEW: "minBuyin"," maxBuyin", # NEW: "nCard", "minCard", "maxCard") # Details: # This function takes the constraints strings and converts them to # constraints vectors and matrices of the following form: # 1. boxConstraints W_min <= W <= W_max # 2. groupEqConstraints A_eq W = c_eq # 3. groupMatConstraints a_vec <= A_mat W <= b_vec # 4. riskBudgetConstraints a <= RiskBudget <= b # cardinalityConstraints eps*z <= W <- delta*z, z[0,1], Sum(z)=K # These values are returned as list in four slots. # Example: # data = .lppData; spec=.mvSpec # portfolioConstraints(data, spec, "LongOnly") # constraints=c("minW[1:3]=0.1", "maxW[4:6]=0.9", "minsumW[c(2,5)]=0.2", "maxsumW[c(1,4)]=0.9") # portfolioConstraints(data, spec, constraints) # FUNCTION: # Already done ... if (class(constraints) == "fPFOLIOCON") return(constraints) # Missing target Return ... if (is.null(getTargetReturn(spec))) setTargetReturn(spec) <- NA # Handle NULL - A NULL : if (is.null(constraints)) constraints="LongOnly" # Check Vector of Valid Strings - these are strings ... validStrings = c( "LongOnly", "Short", # LongOnly and Short Notification "minW", "maxW", # Box Constraints "minsumW", "maxsumW", # left and right Sided Group Constraints "minB", "maxB", # Covariance Risk Budgets "listF", "minF", "maxF", # Nonlinear Functions Constraints "nCard", "minCard", "maxCard") if (any(constraints == "Short")) setSolver(spec) = "solveRshortExact" # usedStrings <- unique(sort(sub("\\[.*", "", constraints))) # checkStrings <- usedStrings %in% validStrings # check <- (sum(!checkStrings) == 0) # if (check) check <- "valid" else stop("Invalid Constraints String(s)") stringConstraints <- constraints # attr(stringConstraints, "control") = check # Data: Data <- portfolioData(data, spec) # Constraints: minW <- minWConstraints(Data, spec, constraints) maxW <- maxWConstraints(Data, spec, constraints) eqsumW <- eqsumWConstraints(Data, spec, constraints) minsumW <- minsumWConstraints(Data, spec, constraints) maxsumW <- maxsumWConstraints(Data, spec, constraints) minB <- minBConstraints(Data, spec, constraints) maxB <- maxBConstraints(Data, spec, constraints) listF <- listFConstraints(Data, spec, constraints) minF <- minFConstraints(Data, spec, constraints) maxF <- maxFConstraints(Data, spec, constraints) minBuyin <- minCardConstraints(Data, spec, constraints) maxBuyin <- maxCardConstraints(Data, spec, constraints) nCard <- nCardConstraints(Data, spec, constraints) minCard <- minCardConstraints(Data, spec, constraints) maxCard <- maxCardConstraints(Data, spec, constraints) if(is.null(minW)) minW = numeric() if(is.null(maxW)) maxW = numeric() if(is.null(eqsumW)) eqsumW = matrix(NA) if(is.null(minsumW)) minsumW = matrix(NA) if(is.null(maxsumW)) maxsumW = matrix(NA) if(is.null(minB)) minB = numeric() if(is.null(maxB)) maxB = numeric() if(is.null(maxsumW)) maxsumW = matrix(NA) if(is.null(minF)) minF = numeric() if(is.null(maxF)) maxF = numeric() if(is.null(minBuyin)) minBuyin = numeric() if(is.null(maxBuyin)) maxBuyin = numeric() if(is.null(nCard)) nCard = integer() if(is.null(minCard)) minCard = numeric() if(is.null(maxCard)) maxCard = numeric() # Return Value: new("fPFOLIOCON", stringConstraints=stringConstraints, minWConstraints=minW, maxWConstraints=maxW, eqsumWConstraints=eqsumW, minsumWConstraints=minsumW, maxsumWConstraints=maxsumW, minBConstraints=minB, maxBConstraints=maxB, listFConstraints=listF, minFConstraints=minF, maxFConstraints=maxF, minBuyinConstraints=minBuyin, maxBuyinConstraints=maxBuyin, nCardConstraints=nCard, minCardConstraints=minCard, maxCardConstraints=maxCard ) } ################################################################################ minWConstraints <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Returns a vector with min box constraints # Details: # Takes care of "minW" strings, i.e. lower blounds # W >= c # Arguments: # data - a timeSeries or a fPFOLIODATA object # spec - a fPFOLIOSPEC object # constraints - a constraints string # Example: # data <- as.timeSeries(data(LPP2005REC))[, 1:6] # spec <- portfolioSpec() # constraints <- c("minW[3:4]=0.1", "maxW[5:6]=0.8") # minWConstraints(data, spec, constraints) # FUNCTION: # Settings: Data <- portfolioData(data, spec) if (class(data) == "fPFOLIODATA") data <- getSeries(Data) nAssets <- getNAssets(Data) assetsNames <- getUnits(Data) # Consider LongOnly: if("LongOnly" %in% constraints) { minW <- rep(0, nAssets) names(minW) <- assetsNames return(minW) } # Consider Unlimited Short: if("Short" %in% constraints) { minW <- rep(-Inf, nAssets) names(minW) <- assetsNames return(minW) } # Extract and Compose Vectors a_vec and b_vec: minW = rep(0, nAssets) names(minW) = assetsNames if (!is.null(constraints)) { nC <- length(constraints) what <- substr(constraints, 1, 4) for (i in 1:nC) { if (what[i] == "minW") eval(parse(text = constraints[i])) } } names(minW) <- assetsNames return(minW) # Return Value: invisible() } # ------------------------------------------------------------------------------ maxWConstraints <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Returns a vector with max box constraints # Details: # Takes care of "maxW" strings, i.e. upper bounds # W >= c # Arguments: # data - a timeSeries or a fPFOLIODATA object # spec - a fPFOLIOSPEC object # constraints - a constraints string # Example: # data = as.timeSeries(data(LPP2005REC))[, 1:6] # spec=portfolioSpec() # constraints=c("minW[3:4]=0.1", "maxW[5:6]=0.8") # maxWConstraints(data, spec, constraints) # FUNCTION: # Settings: Data <- portfolioData(data, spec) if (class(data) == "fPFOLIODATA") data <- getSeries(Data) nAssets <- getNAssets(Data) assetsNames <- getUnits(Data) # Consider LongOnly: if("LongOnly" %in% constraints) { maxW <- rep(1, nAssets) names(maxW) <- assetsNames return(maxW) } # Consider Unlimited Short: if("Short" %in% constraints) { maxW <- rep(Inf, nAssets) names(maxW) = assetsNames return(maxW) } # Extract and Compose Vectors a_vec and b_vec: maxW = rep(1, nAssets) names(maxW) <- assetsNames if (!is.null(constraints)) { nC <- length(constraints) what <- substr(constraints, 1, 4) for (i in 1:nC) { if (what[i] == "maxW") eval(parse(text = constraints[i])) } } names(maxW) = assetsNames return(maxW) # Return Value: invisible() } ################################################################################ eqsumWConstraints <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Returns a list with group equal matrix and vectors constraints # Details: # Takes care of "eqsumW" strings # A_eq W = c_eq # Arguments: # data - a timeSeries or a fPFOLIODATA object # spec - a fPFOLIOSPEC object # constraints - a constraints string # Example: # data = as.timeSeries(data(LPP2005REC))[, 1:6] # spec=portfolioSpec(); setTargetReturn(spec) = mean(data) # constraints="eqsumW[1:6]=1" # eqsumWConstraints(data, spec, constraints) # eqsumWConstraints(data, spec, constraints="LongOnly") # eqsumWConstraints(data, spec, constraints=c("LongOnly","Partial")) # FUNCTION: # Get Statistics: Data <- portfolioData(data, spec) if (class(data) == "fPFOLIODATA") data <- getSeries(Data) targetReturn <- getTargetReturn(spec)[1] if (is.null(targetReturn)) { targetReturn = NA # stop("Target Return is Missing") } # Get Data: mu <- getMu(Data) nAssets <- getNAssets(Data) assetsNames <- getUnits(Data) # Target Return: Aeq <- matrix(mu, byrow = TRUE, ncol = nAssets) # Full or partial Investment? if ("partial" %in% tolower(constraints)) fullInvest = FALSE else fullInvest = TRUE # Full Investment: # - negative to handle better partial Investment in Rquadprog: if (fullInvest) Aeq <- rbind(Aeq, -rep(1, nAssets)) # Dimension Names: colnames(Aeq) <- assetsNames if (fullInvest) { rownames(Aeq) <- c("Return", "Budget") } else { rownames(Aeq) <- "Return" } # RHS Vector: if (fullInvest) { ceq <- c(Return = targetReturn, Budget = -1) } else { ceq <- c(Return = targetReturn) } # Extract and Compose Matrix and Vector: what6 = substr(constraints, 1, 6) if (!is.null(constraints)) { nC = length(constraints) for (i in 1:nC) { if (what6[i] == "eqsumW") { eqsumW = rep(0, times = nAssets) names(eqsumW) <- assetsNames eval(parse(text = constraints[i])) Aeq = rbind(Aeq, eqsumW = sign(eqsumW)) a = strsplit(constraints[i], "=")[[1]][2] ceq = c(ceq, eqsumW = as.numeric(a)) } } } eqsumW <- cbind(ceq, Aeq) # If target Return is missing: eqsumW <- na.omit(eqsumW) # Return Value: eqsumW } # ------------------------------------------------------------------------------ minsumWConstraints <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Returns a list with group matrix and vectors constraints # Arguments: # data - a timeSeries or a fPFOLIODATA object # spec - a fPFOLIOSPEC object # constraints - a constraints string$ # Details: # Takes care of "minsumW" strings # a_vec <= A_mat W # Example: # data = as.timeSeries(data(LPP2005REC))[, 1:6] # spec=portfolioSpec(); setTargetReturn(spec) = mean(data) # constraints=c("minsumW[2:3]=0.2", "minsumW[c(1,4:6)]=0.2") # minsumWConstraints(data, spec, constraints) # minsumWConstraints(data, spec) # FUNCTION: # Get Statistics: data <- portfolioData(data, spec) # Get Specifications: mu <- getMu(data) nAssets <- getNAssets(data) assetsNames <- getUnits(data) # Extrac and Compose Matrix and Vectors: what7 <- substr(constraints, 1, 7) if (!is.null(constraints)) { nC <- length(constraints) count <- 0 Amat <- NULL avec <- NULL # Partial Investment: if ("partial" %in% tolower(constraints)) { Amat <- rbind(Amat, rep(1, times = nAssets)) avec <- c(avec, 0) } for (i in 1:nC) { if (what7[i] == "minsumW") { count = count + 1 minsumW = rep(0, times = nAssets) names(minsumW) <- assetsNames eval(parse(text = constraints[i])) Amat = rbind(Amat, minsumW = sign(minsumW)) a = strsplit(constraints[i], "=")[[1]][2] avec = c(avec, as.numeric(a)) } } if (!is.null(Amat)){ colnames(Amat) = assetsNames names(avec) = rep("lower", count) } } # Return Value: cbind(avec = avec, Amat = Amat) } # ------------------------------------------------------------------------------ maxsumWConstraints <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Returns a list with group matrix and vectors constraints # Arguments: # data - a timeSeries or a fPFOLIODATA object # spec - a fPFOLIOSPEC object # constraints - a constraints string$ # Details: # Takes care of "minsumW" and "maxsumW" strings # a_vec <= A_mat W <= b_vec # Example: # data = as.timeSeries(data(LPP2005REC))[, 1:6] # spec=portfolioSpec(); setTargetReturn(spec) = mean(data) # constraints=c("maxsumW[2:3]=0.7", "maxsumW[c(1,4:6)]=0.8") # maxsumWConstraints(data, spec, constraints) # maxsumWConstraints(data, spec) # FUNCTION: # Get Statistics: data <- portfolioData(data, spec) # Get Specifications: mu <- getMu(data) nAssets <- getNAssets(data) assetsNames <- getUnits(data) # Extract and Compose Matrix and Vectors: what7 = substr(constraints, 1, 7) if (!is.null(constraints)) { nC <- length(constraints) count <- 0 Amat <- NULL avec <- NULL # Partial Investment: if ("partial" %in% tolower(constraints)) { Amat <- rbind(Amat, rep(1, times = nAssets)) avec <- c(avec, 1) } for (i in 1:nC) { if (what7[i] == "maxsumW") { count = count + 1 maxsumW = rep(0, times = nAssets) names(maxsumW) <- assetsNames eval(parse(text = constraints[i])) Amat = rbind(Amat, maxsumW = sign(maxsumW)) a = strsplit(constraints[i], "=")[[1]][2] avec = c(avec, as.numeric(a)) } } if (!is.null(Amat)) { colnames(Amat) = assetsNames names(avec) = rep("upper", count) } } # Return Value: cbind(avec = avec, Amat = Amat) } ################################################################################ minBConstraints <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Returns a list with min risk budget constraints vectors # Arguments: # constraints - a constraints string # Example: # data = as.timeSeries(data(LPP2005REC))[, 1:6] # spec=portfolioSpec() # constraints=c("minB[3:4]=0.1","maxB[1:3]=0.3","maxB[c(4,6)]=0.4") # minBConstraints(data, spec, constraints) # minBConstraints(data, spec) # FUNCTION: # Create Data Object: Data <- portfolioData(data, spec) if (class(data) == "fPFOLIODATA") data <- getSeries(Data) # Get Specifications: nAssets <- getNAssets(Data) assetsNames <- getUnits(Data) # Extract and Compose Risk Budgets: minB = rep(-Inf, nAssets) names(minB) <- assetsNames if (!is.null(constraints)) { nC = length(constraints) what = substr(constraints, 1, 4) for (i in 1:nC) { if (what[i] == "minB") eval(parse(text = constraints[i])) } } # Return Value: minB } # ------------------------------------------------------------------------------ maxBConstraints <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Returns a list with max risk budget constraints vectors # Arguments: # constraints - a constraints string # Example: # data = as.timeSeries(data(LPP2005REC))[,1:6] # spec=portfolioSpec() # constraints=c("minB[3:4]=0.1","maxB[1:3]=0.3","maxB[c(4,6)]=0.4") # maxBConstraints(data, spec, constraints) # maxBConstraints(data, spec) # FUNCTION: # Create Data Object: Data <- portfolioData(data, spec) if (class(data) == "fPFOLIODATA") data <- getSeries(Data) # Get Specifications: N <- nAssets <- getNAssets(Data) assetsNames <- getUnits(Data) # Extract and Compose Risk Budgets: maxB <- rep(1, N) names(maxB) <- assetsNames if (!is.null(constraints)) { nC = length(constraints) what = substr(constraints, 1, 4) for (i in 1:nC) { if (what[i] == "maxB") eval(parse(text = constraints[i])) } } # Return Value: maxB } ################################################################################ listFConstraints <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Nonlinear Constraints # Example: # maxdd <- function(x) max(drawdowns(x)) # listFConstraints(data <- NULL, constraints=c("minF=-0.04", "listF(maxdd)")) # FUNCTION: # Parse: nlin <- list() matched <- pmatch("listF" , constraints) if(!is.na(matched)) { constraints = paste("nlin = ", constraints[matched]) constraints = sub("listF", "list", constraints) eval(parse(text = constraints)) } # Return Value: return(nlin) } # ------------------------------------------------------------------------------ minFConstraints <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Nonlinear Constraints # Example: # minFConstraints("minF=-0.04") # FUNCTION: # Parse: minF <- NULL matched <- pmatch("minF" , constraints) if(!is.na(matched)) eval(parse(text = constraints[matched])) # Return Value: return(minF) } # ------------------------------------------------------------------------------ maxFConstraints <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Nonlinear Constraints # Example: # maxFConstraints(c("LongOnly", "maxF=0")) # FUNCTION: # Parse: maxF <- NULL matched <- pmatch("maxF" , constraints) if(!is.na(matched)) eval(parse(text = constraints[matched])) # Return Value: return(maxF) } ################################################################################ minBuyinConstraints <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Lower Buyin Constraints # Example: minBuyinConstraints(c("LongOnly", "minBuyin[1:3]=0.1") # FUNCTION: # Parse: Data <- portfolioData(data) nAssets <- getNAssets(Data) minBuyin <- rep(0, nAssets) matched <- pmatch("minBuyin", constraints) if(!is.na(matched)) eval(parse(text = constraints[matched])) names(minBuyin) <- getUnits(Data) # Return Value: return(minBuyin) } # ------------------------------------------------------------------------------ maxBuyinConstraints <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Upper Buyininality Constraints # Example: maxBuyinConstraints(c("LongOnly", "maxBuyin[5]=0.9") # FUNCTION: # Parse: Data <- portfolioData(data) nAssets <- getNAssets(Data) maxBuyin <- rep(1, nAssets) matched <- pmatch("maxBuyin", constraints) if(!is.na(matched)) eval(parse(text = constraints[matched])) names(maxBuyin) <- getUnits(Data) # Return Value: return(maxBuyin) } ################################################################################ nCardConstraints <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Cardinality Constraints # Example: ncardConstraints(c("LongOnly", "ncard=4") # FUNCTION: # Parse: Data <- portfolioData(data) nAssets <- getNAssets(Data) nCard <- nAssets matched <- pmatch("nCard", constraints) if(!is.na(matched)) eval(parse(text = constraints[matched])) # Return Value: return(nCard) } # ------------------------------------------------------------------------------ minCardConstraints <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Lower Cardinality Constraints # Example: minCardConstraints(c("LongOnly", "minCard[1:3]=0.1") # FUNCTION: # Parse: Data <- portfolioData(data) nAssets <- getNAssets(Data) minCard <- rep(0, nAssets) matched <- pmatch("minCard", constraints) if(!is.na(matched)) eval(parse(text = constraints[matched])) names(minCard) <- getUnits(Data) # Return Value: return(minCard) } # ------------------------------------------------------------------------------ maxCardConstraints <- function(data, spec=portfolioSpec(), constraints="LongOnly") { # A function implemented by Diethelm Wuertz # Description: # Upper Cardinality Constraints # Example: maxCardConstraints(c("LongOnly", "maxCard[5]=0.9") # FUNCTION: # Parse: Data <- portfolioData(data) nAssets <- getNAssets(Data) maxCard <- rep(1, nAssets) matched <- pmatch("maxCard", constraints) if(!is.na(matched)) eval(parse(text = constraints[matched])) names(maxCard) <- getUnits(Data) # Return Value: return(maxCard) } ################################################################################ fPortfolio/R/utils-amplExec.R0000644000176200001440000000554712410245120015617 0ustar liggesusers # 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: # .amplExec Executes AMPL run file for a given project # .amplExample Optimizes mean variance portfolio example ############################################################################### .amplExec <- function(project="ampl") { # A function Implemented by Diethelm Wuertz # Description: # Executes AMPL run file for a given project. # Details: # Note the following files must exist: # [project].mod - the AMPL model file # [project].dat - the AMPL data file # [project].run - the AMPL run file # FUNCTION: # Execute run file: command <- paste("ampl -t -vs", paste(project, "run", sep=".")) solve <- system(command, intern=TRUE) # Print: cat(solve, sep="\n") # Return Value: invisible(solve) } # ----------------------------------------------------------------------------- .amplExample <- function() { # A function Implemented by Diethelm Wuertz # Description: # Optimizes mean variance portfolio example. # FUNCTION: # Load Dataset dataSet <- data("LPP2005REC", package="timeSeries", envir=environment()) LPP2005REC <- get(dataSet, envir=environment()) # Portfolio Data: nAssets <- 6 data <- 100 * LPP2005REC[, 1:nAssets] # Optimization Arguments: objective <- list(dvec=rep(0, nAssets), Dmat=cov(data)) lower <- 0 upper <- 1 linCons <- list( mat = rbind( budget = rep(1, times=nAssets), returns = colMeans(data)), lower = c( budget = 1, return = mean(data)), upper = c( budget = 1, return = mean(data))) control <- list() # Default - AMPL Interface: ampl <- ramplQP(objective, lower, upper, linCons, control) # Return Value: ampl } ############################################################################### fPortfolio/R/plot-weightsSlider.R0000644000176200001440000001162212323217770016520 0ustar liggesusers # 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 Description. 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: # weightsSlider Graphical Weights Slider # .counterWeightsSlider ################################################################################ .counterWeightsSlider <- NA # ------------------------------------------------------------------------------ weightsSlider <- function(object, control = list(), ...) { # A function implemented by Rmetrics # Description: # Interactive view of Portfolio Weights # FUNCTION: # Global Variables: object <<- object nFrontierPoints <- length(getTargetRisk(object)[ ,1]) dim = dim(getWeights(object))[2] # Use default, if xlim and ylim is not specified ... mu = getStatistics(object)$mu Sigma = getStatistics(object)$Sigma yLim = range(mu) + 0.25*c(-diff(range(mu)), diff(range(mu))) # First, take care that all assets appear on the plot ... sqrtSig = sqrt(diag(Sigma)) xLimAssets = c(min(sqrtSig), max(sqrtSig))+ c(-0.4*diff(range(sqrtSig)), 0.1*diff(range(sqrtSig))) # ... second take care that the whole frontier appears on the plot: fullFrontier = frontierPoints(object) xLimFrontier = range(fullFrontier[, 1]) xLim = range(c(xLimAssets, xLimFrontier)) xLim[1] = xLim[1]-diff(xLim)/5 # Control Parameters: con <<- list( sliderResolution = 1, sliderFlag = "weights", runningPoint.col = "red", minvariance.col = "red", tangency.col = "steelblue", singleAsset.col = rainbow(dim), minvariance.pch = 19, singleAsset.pch = 19, tangency.pch = 17, runningPoint.cex = 1.5, minvariance.cex = 1, tangency.cex = 1.25, singleAsset.cex = 1, xlim = xLim, ylim = yLim ) con[(Names <- names(control))] <- control # Internal Function: refresh.code = function(...) { # Startup Counter: .counterWeightsSlider <- getRmetricsOptions(".counterWeightsSlider") + 1 setRmetricsOptions(.counterWeightsSlider = .counterWeightsSlider) if (.counterWeightsSlider < 1) return () # Sliders: N = .sliderMenu(no = 1) # Reset Frame: par(mfrow = c(2, 2)) # Plot 1 - Frontier Plot: frontier = frontierPoints(object) fPoint = frontier[N, ] frontierPlot(object, xlim = con$xlim, ylim = con$ylim, xlab = "", ylab = "", pch = 19, cex = 0.7, title = FALSE) mtext("Target Risk", side = 1, line = 2, adj = 1, cex = 0.7) mtext("Target Return", side = 2, line = 2, adj = 1, cex = 0.7) points(fPoint[1], fPoint[2], col = con$runningPoint.col, pch = 19, cex = con$runningPoint.cex) tangencyLines(object, col = con$tangency.col, pch = con$tangency.pch) tangencyPoints(object, col = con$tangency.col) singleAssetPoints(object, col = con$singleAsset.col, cex = con$singleAsset.cex, pch = con$singleAsset.pch) minvariancePoints(object, col = con$minvariance.col, cex = con$minvariancePlot.cex, pch = con$minvariance.pch) Title = paste( "Return =", signif(fPoint[2], 2), "|", "Risk = ", signif(fPoint[1], 2)) Title = "Efficient Frontier" mtext(Title, adj = 0, line = 2.5, font = 2, cex = 0.7) grid() # Plot 2 - Weights Pie: weightsPie(object, pos = N) # Plot 3 - Weights Plot: weightsPlot(object) abline(v = N, col = "black") # Plot 4 - Single Weights Plot: weightsLinePlot(object) abline(v = N, col = "black") } # Open Slider Menu: setRmetricsOptions(.counterWeightsSlider = 0) Start <- which.min(getTargetRisk(object)[ , 1]) .sliderMenu(refresh.code, title = "Weights Slider", names = c( "N"), minima = c( 1), maxima = c( nFrontierPoints), resolutions = c(con$sliderResolution), starts = c( Start)) # Return Value: invisible() } ################################################################################ fPortfolio/R/solve-RtwoAssets.R0000644000176200001440000001217512323217770016177 0ustar liggesusers # 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 Description. 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: # .solveRtwoAssets Two Assets LongOnly MV Portfolio # .cvarSolveTwoAssets Two Assets LongOnly CVaR Portfolio # .madSolveTwoAssets Two Assets LongOnly MAD Portfolio ################################################################################ .solveRtwoAssets <- function(data, spec, constraints) { # Description: # Two Assets LongOnly MV Portfolio # Details: # ... this is only thohgt for 'unlimited' LongOnly # box and group constraints are discarded here. # FUNCTION: # Solver: # print(".mvSolveTwoAssets") # Convert Data and Constraints to S4 Objects: Data = portfolioData(data, spec) data <- getSeries(Data) Constraints = portfolioConstraints(Data, spec, constraints) # Stop if the Target Return is not Defined! targetReturn = getTargetReturn(spec) stopifnot(is.numeric(targetReturn)) # Optimize Portfolio: nAssets = getNAssets(Data) # Solve the two Assets Case Analytically: mu <- getMu(Data) Sigma <- getSigma(Data) stopifnot(targetReturn >= min(mu)) stopifnot(targetReturn <= max(mu)) weights <- (targetReturn-mu[2]) / (mu[1]-mu[2]) weights <- c(weights, 1 - weights) # Output List: ans = list( solver = "MVTwoAssets", optim = NA, weights = weights, targetReturn = targetReturn, targetRisk = NA, objective = sqrt(weights %*% Sigma %*% weights), status = 0, message = NA) # Return Value: ans } # ------------------------------------------------------------------------------ .cvarSolveTwoAssets <- function(data, spec, constraints) { # Description: # Two Assets LongOnly CVaR Portfolio # Details: # ... this is only thohgt for 'unlimited' LongOnly # box and group constraints are discarded here. # FUNCTION: # Solver: # print(".cvarSolveTwoAssets") # Convert Data and Constraints to S4 Objects: Data <- portfolioData(data, spec) data <- getSeries(Data) Constraints = portfolioConstraints(Data, spec, constraints) # Stop if the Target Return is not Defined! targetReturn = getTargetReturn(spec) stopifnot(is.numeric(targetReturn)) targetAlpha = getAlpha(spec) # Optimize Portfolio: nAssets <- getNAssets(Data) # Solve the two Assets Case Analytically: mu <- getMu(Data) stopifnot(targetReturn >= min(mu)) stopifnot(targetReturn <= max(mu)) weights <- (targetReturn-mu[2]) / (mu[1]-mu[2]) weights <- c(weights, 1 - weights) optim <- list( VaR = .varRisk(data, weights, targetAlpha), CVaR = -.cvarRisk(data, weights, targetAlpha), targetAlpha = targetAlpha) ans <- list( solver = "CVaRTwoAssets", optim = optim, weights = weights, targetReturn = targetReturn, targetRisk = NA, objective = optim$CVaR, status = 0, message = NA) # Return Value: ans } # ------------------------------------------------------------------------------ .madSolveTwoAssets <- function(data, spec, constraints) { # Description: # Two Assets LongOnly MAD Portfolio # Details: # ... this is only thohgt for 'unlimited' LongOnly # box and group constraints are discarded here. # FUNCTION: # Convert Data and Constraints to S4 Objects: Data = portfolioData(data, spec) data <- getSeries(Data) Constraints <- portfolioConstraints(Data, spec, constraints) # Stop if the Target Return is not Defined! targetReturn <- getTargetReturn(spec) stopifnot(is.numeric(targetReturn)) # Optimize Portfolio: nAssets <- getNAssets(Data) # Solve the two Assets Case Analytically: mu = getMu(Data) stopifnot(targetReturn >= min(mu)) stopifnot(targetReturn <= max(mu)) weights = (targetReturn-mu[2]) / (mu[1]-mu[2]) weights = c(weights, 1 - weights) targetRisk = mean( abs( (data - colMeans(data)) %*% weights ) ) # Output List: ans = list( solver = "MADTwoAssets", optim = NA, weights = weights, targetReturn = targetReturn, targetRisk = targetRisk, objective = targetRisk, status = 0, message = NA) # Return Value: ans } ################################################################################ fPortfolio/R/mathprogLP-ampl.R0000644000176200001440000001242512323217770015735 0ustar liggesusers # 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: # ramplLP Rmetrics Interface for AMPL LP solvers # amplLP Convenience wrapper for AMPL LP solvers # amplLPControl AMPL LP control parameter list ############################################################################### ramplLP <- function(objective, lower=0, upper=1, linCons, control=list()) { # A function implemented by Diethelm Wuertz # Description: # Implements AMPL LP Interface # Arguments: # objective - vec # FUNCTION: # Control List: ctrl <- amplLPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl # Controls: solver <- control$solver project <- control$project inf <- control$inf trace <- control$trace # Objective: vec <- objective # Box Constraints: replicate <- function(x, n) if(length(x) == 1) rep(x, n) else x n <- length(vec) x_L <- replicate(lower, n) x_U <- replicate(upper, n) x_L[is.infinite(x_L)] <- inf*sign(x_L[is.infinite(x_L)]) x_U[is.infinite(x_U)] <- inf*sign(x_U[is.infinite(x_U)]) # Linear Constraints: A <- linCons[[1]] m <- nrow(A) b_L <- replicate(linCons[[2]], m) b_U <- replicate(linCons[[3]], m) b_L[is.infinite(b_L)] <- inf*sign(b_L[is.infinite(b_L)]) b_U[is.infinite(b_U)] <- inf*sign(b_U[is.infinite(b_U)]) # Optimize Portfolio: value <- amplLP(vec, x_L, x_U, A, b_L, b_U, control) # Return Value: value } # ------------------------------------------------------------------------- amplLP <- function( objective, x_L=NULL, x_U=NULL, A=NULL, b_L=NULL, b_U=NULL, control=list()) { # A function implemented by Diethelm Wuertz # Description: # Universal function wrapper for AMPL LP solvers # Arguments: # objective - vec # FUNCTION: # Control List: ctrl <- amplLPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl # Control Parameters: project <- control$project solver <- control$solver inf <- control$inf trace <- control$trace # Objective: c <- objective n <- length(vec) m <- nrow(A) # Assign LP Model: .lpAssign(project, c, x_L, x_U, A, b_L, b_U , trace=FALSE) # Run AMPL: command <- paste("ampl -t -vs", paste(project, "run", sep=".")) solve <- system(command, intern=TRUE) # Read AMPL Output File: file <- paste(project, "txt", sep = ".") out <- scan(file, what = character(0), sep="\n", quiet=TRUE) # Get Weights: Index <- (grep(";", out) - 1)[1] splits <- strsplit(paste(out[2:Index], collapse=" "), " ")[[1]] solution <- as.numeric(splits[splits != ""])[seq(2, 2*n, by=2)] Index <- as.numeric(splits[splits != ""])[seq(1, 2*n, by=2)] solution[Index] <- solution # Get Status: status <- strsplit(out[grep("solve_result", out)], split=" ") statusCode <- status[[1]][3] statusMessage <- status[[2]][3] # Get Solver Message: Index <- grep("solve_message", out):length(out) message <- out[Index] # Version: version <- system(paste(solver, "-v"), intern=TRUE) # Compose Results into a List: objective <- (c %*% solution)[[1, 1]] # Return Value: model <- capture.output(amplModelShow(project)) run <- capture.output(amplModelShow(project)) value = list( opt = list(solve=solve, model=model, run=run, out=out), solution = solution, objective = objective, status = statusCode, message = statusMessage, solver = paste("AMPL", solver), version = version) class(value) <- c("solver", "list") value } # ------------------------------------------------------------------------- amplLPControl <- function(solver="ipopt", project="ampl", inf=1e12, trace=FALSE) { # A function implemented by Diethelm Wuertz # Description: # Returns AMPL LP control parameter list # FUNCTION: # Return Value: list(solver=solver, project=project, inf=inf, trace=trace) } ############################################################################### fPortfolio/R/a-class-fPFOLIOSPEC.R0000644000176200001440000000235012323217770016057 0ustar liggesusers # 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 Description. 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: # 'fPFOLIOSPEC' S4 Portfolio Specification Class ################################################################################ setClass("fPFOLIOSPEC", representation( model = "list", portfolio = "list", optim = "list", messages = "list", ampl = "list") ) ################################################################################ fPortfolio/R/methods-show.R0000644000176200001440000002534712620132672015356 0ustar liggesusers ################################################################################ # FUNCTION: DESCRIPTION: # show.fPORTFOLIO S4 Print method for 'fPPORTFOLIO' objects # show.fPFOLIODATA S4 Print method for 'fPFOLIODATA' objects # show.fPFOLIOSPEC S4 Print method for 'fPFOLIOSPEC' objects # show.fPFOLIOCON S4 Print method for 'fPFOLIOCON' objects ################################################################################ setMethod("show", "fPORTFOLIO", function(object) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # S4 Print Method for an object of class "fPORTFOLIO" # Arguments: # object - an object of class "fPORTFOLIO" # FUNCTION: # Determine Length Out: nFrontierPoints <- NROW(matrix(getWeights(object@portfolio), ncol = getNAssets(object))) length.out <- getRmetricsOptions("length.print") # from Rmetrics Options index <- if (length.out) { unique(trunc(seq.int(from = 1, to = nFrontierPoints, length.out = length.out))) } else { seq.int(from = 1, to = NROW(nFrontierPoints)) } # Print Title: cat("\nTitle:\n ") # cat(getType(object), getTitle(object), "\n") cat(getType(object), object@title, "\n") cat(" Estimator: ", getEstimator(object), "\n") cat(" Solver: ", getSolver(object), "\n") cat(" Optimize: ", getOptimize(object), "\n") cat(" Constraints: ", getConstraintsTypes(object), "\n") if (object@spec@ampl$ampl) { cat(" AMPL Project: ", object@spec@ampl$project, "\n") cat(" AMPL Solver: ", object@spec@ampl$solver, "\n") } if (!identical(index, 1)) cat(" Portfolio Points: ", length(index), "of", nFrontierPoints, "\n") if (getType(object) == "CVaR") cat(" VaR Alpha: ", getAlpha(object), "\n") #at(" Objective: ", getObjective(object), "\n") # Assets: nAssets <- getNAssets(object) Names <- names(object@data@statistics$mu) # Print Target Weights: cat("\nPortfolio Weights:\n") table <- matrix(round(getWeights(object@portfolio), digits = 4), ncol = nAssets) colnames(table) = Names rownames(table) = 1:NROW(table) print.table(table[index, ]) # Print Covariance Risk Budgets: cat("\nCovariance Risk Budgets:\n") table = matrix(round(getCovRiskBudgets(object@portfolio), digits = 4), ncol = nAssets) colnames(table) = Names rownames(table) = 1:NROW(table) print.table(table[index, ]) # PrintCVaR Risk Budgets: # to do ... # Print Tail Risk Budgets: # to do ... # Print Target Return and Risks: # DW: Note object@targetR* is a list do not use getTargetR*() targetReturn <- matrix(getTargetReturn(object@portfolio), ncol = 2) targetRisk <- matrix(getTargetRisk(object@portfolio), ncol = 4) target <- round(cbind(targetReturn, targetRisk), digits = 4) if (class(getSeries(object)) == "logical") { cat("\nTarget Return and Risk:\n") target = target[, c(1, 3), drop = FALSE] colnames(target) = c("mean", "Cov") } else if( class(getSeries(object)) == "timeSeries") { cat("\nTarget Returns and Risks:\n") colnames(target) = c("mean", "mu", "Cov", "Sigma", "CVaR", "VaR") } rownames(target) = 1:NROW(target) # DW Only print mu and Sigma for robust estimators! if (getEstimator(object) == "covEstimator") { print.table(target[index, -c(2,4)]) } else { print.table(target[index, ]) } # Print Description: cat("\nDescription:\n ") # cat(getDescription(object), "\n") cat(object@description, "\n") # Return Value: invisible(NULL) }) # ------------------------------------------------------------------------------ setMethod("show", "fPFOLIODATA", function(object) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # S4 Print Method for an object of class "fPFOLIODATA" # Arguments: # object - an object of class "fPFOLIOSPEC" # FUNCTION: # Series: cat("\nHead/Tail Series Data:\n") if(is.null(dim(object@data$series))) { cat(" No time series data available.\n") } else { cat("\n") print(head(object@data$series, n = 3)) print(tail(object@data$series, n = 3)) } # Statistics: cat("\nStatistics:\n\n") if(is.null(dim(object@data$series))) { # Print mean and Cov only .. print(object@statistics[1:2]) } else { # Print mean, Cov, estimator, mu and Sigma ... print(object@statistics) } # Tailrisk: # NYI # Return Value: invisible(NULL) }) # ------------------------------------------------------------------------------ setMethod("show", "fPFOLIOSPEC", function(object) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # S4 Print Method for an object of class "fPFOLIOSPEC" # Arguments: # object - an object of class "fPFOLIOSPEC" # FUNCTION: # Model: cat("\nModel List:\t") cat("\n Type: ", object@model$type) cat("\n Optimize: ", object@model$optimize) cat("\n Estimator: ", object@model$estimator) if (length(object@model$tailRisk) > 0) { cat("\n Tail Risk: ", object@model$tailRisk) } # DW: # } else { # cat("\n Tail Risk: ", "list()") # } cat("\n Params: ", paste(names(unlist(object@model$params)), "=", unlist(object@model$params))) # Portfolio: cat("\n\nPortfolio List:\t") if (!is.null(object@portfolio$weights)) { cat("\n Portfolio Weights: ", object@portfolio$weights) } else { cat("\n Target Weights: ", "NULL") } if (!is.null(object@portfolio$targetReturn)) { cat("\n Target Return: ", object@portfolio$targetReturn) } else { cat("\n Target Return: ", "NULL") } if (!is.null(object@portfolio$targetRisk)) { cat("\n Target Risk: ", object@portfolio$targetRisk) } else { cat("\n Target Risk: ", "NULL") } if (!is.null(object@portfolio$riskFreeRate)) { cat("\n Risk-Free Rate: ", as.character(object@portfolio$riskFreeRate)) } if (!is.null(object@portfolio$nFrontierPoints)) { cat("\n Number of Frontier Points:", as.character(object@portfolio$nFrontierPoints)) } if (!is.na(object@portfolio$status)) { cat("\n Status: ", as.character(object@portfolio$status)) } # Optimization: cat("\n\nOptim List:\t") cat("\n Solver: ", object@optim$solver) if (!is.null(object@optim$objective)) { cat("\n Objective: ", as.character(object@optim$objective)) } else { cat("\n Objective: ", "list()" ) } if (substr(object@optim$solver, 1, 14) != "solveRquadprog") object@optim$options$meq <- NULL if (length(object@optim$options) > 0) { cat("\n Options: ", paste(names(unlist(object@optim$options)), "=", unlist(object@optim$options))) } if (length(object@optim$control) > 0) { cat("\n Control: ", as.character(object@optim$control)) } # DW # } else { # cat("\n Control: ", "list()") # } cat("\n Trace: ", object@optim$trace) # Messages: if (object@messages$messages) { cat("\n\nMessage List:\t") if (!is.null(object@messages$list)) { cat("\n List: ", object@messages$list) } else { cat("\n List: ", "NULL") } } # AMPL: if (object@ampl$ampl) { cat("\n\nAMPL List:\t") cat("\n Project: ", object@ampl$project) cat("\n Solver: ", object@ampl$solver) cat("\n Trace: ", object@ampl$trace) } cat("\n") # Return Value: invisible(NULL) }) # ------------------------------------------------------------------------------ setMethod("show", "fPFOLIOCON", function(object) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # S4 Print Method for an object of class "fPFOLIODATA" # Arguments: # object - an object of class "fPFOLIOSPEC" # FUNCTION: # Print Title: cat("\nTitle:\n ") cat("Portfolio Constraints\n") minmaxW = rbind(object@minWConstraints, object@maxWConstraints) rownames(minmaxW) = c("Lower", "Upper") if (length(minmaxW)) { cat("\nLower/Upper Bounds:\n") print(minmaxW) } eqsumW = object@eqsumWConstraints if (sum(dim(eqsumW)) > 2) { cat("\nEqual Matrix Constraints:\n") print(eqsumW) } minsumW = object@minsumWConstraints if (sum(dim(minsumW)) > 2) { cat("\nLower Matrix Constraints:\n") print(minsumW) } maxsumW = object@maxsumWConstraints if (sum(dim(maxsumW)) > 2) { cat("\nUpper Matrix Constraints:\n") print(maxsumW) } minmaxB <- rbind(object@minBConstraints, object@maxBConstraints) if (length(minmaxB) > 0 && !(all(object@minBConstraints == -Inf) && all(object@maxBConstraints == 1))) { cat("\nLower/Upper Cov Risk Budget Bounds:\n") rownames(minmaxB) = c("Lower", "Upper") print(minmaxB) } listF = object@listFConstraints minF = object@minFConstraints maxF = object@maxFConstraints if (length(listF) > 0) { cat("\nNon-Linear Function Constraints:\n") minmaxF = rbind(minF, maxF) colnames(minmaxF) = names(listF) rownames(minmaxF) = c("Lower", "Upper") print(minmaxF) } nCard = object@nCardConstraints if(nCard > 0) { minCard = object@minCardConstraints maxCard = object@maxCardConstraints minmaxCard = rbind(minCard, maxCard) #colnames(minmaxCard) = names(listF) rownames(minmaxCard) = c("Lower", "Upper") cat("\nCardinality Constraints:\n") print(minmaxCard) } # Return Value: invisible(NULL) }) ################################################################################ fPortfolio/R/solve-environment.R0000644000176200001440000000344412323217770016424 0ustar liggesusers # 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 ############################################################################### # GLOBAL SETTINGS: DESCRIPTION: # Data Defines global portfolio Data object # portfolioObjective Defines global portfolio objective function # portfolioReturn Defines global portfolio return function # portfolioRisk Defines global portfolio risk function ############################################################################### # Global Variables, do it properly ... # ----------------------------------------------------------------------------- Data <- NA # ----------------------------------------------------------------------------- portfolioObjective <- function(weights) { NA } # ----------------------------------------------------------------------------- portfolioReturn <- function(weights) { NA } # ----------------------------------------------------------------------------- portfolioRisk <- function(weights) { NA } ############################################################################### fPortfolio/R/risk-covEstimator.R0000644000176200001440000004617212410246734016363 0ustar liggesusers ################################################################################ # FUNCTION: DESCRIPTION: # covEstimator Uses sample covariance estimation # mveEstimator Uses robust estimation "cov.mve" from [MASS] # mcdEstimator Uses robust estimation "cov.mcd" from [MASS] # FUNCTION: DESCRIPTION: # lpmEstimator Returns Lower Partial Moment Estimator # slpmEstimator Returns Symmetric Lower Partial Moment Estimator # FUNCTION: DESCRIPTION: # kendallEstimator Returns Kendall's Covariance Estimator # spearmanEstimator Returns Spearman's Covariance Estimator # FUNCTION: DESCRIPTION: # covMcdEstimator Requires "covMcd" from [robustbase] # covOGKEstimator Requires "covOGK" from [robustbase] # shrinkEstimator Requires "cov.shrink" from [corpcor] # nnveEstimator Requires "cov.nnve" from [covRobust] # FUNCTION: DESCRIPTION: # .studentEstimator uses "cov.trob" from [MASS] # .baggedEstimator uses builtin from [corpcor] # .donostahEstimator uses builtin from [robust] # .bayesSteinEstimator copy from Alexios Ghalanos # .ledoitWolfEstimator uses builtin from [tawny] # .rmtEstimator uses builtin from [tawny] # FUNCTION: DESCRIPTION: # .mveEstimator2 Uses robust estimation "cov.mve" from [MASS] # .mcdEstimator2 Uses robust estimation "cov.mcd" from [MASS] # .covMcdEstimator2 Requires "covMcd" from [robustbase] # .covOGKEstimator2 Requires "covOGK" from [robustbase] # .arwEstimator2 Uses robust estimation ".cov.arw"from [mvoutlier] ################################################################################ covEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Uses sample covariance estimation # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Example: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; covEstimator(x) # FUNCTION: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: mu = colMeans(x.mat) Sigma = cov(x.mat) # Return Value: list(mu = mu, Sigma = Sigma) } # ------------------------------------------------------------------------------ mveEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Uses robust estimation "cov.mve" from [MASS] # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Example: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; mveEstimator(x) # FUNCTION: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: { mu = colMeans(x.mat) Sigma = MASS::cov.rob(x = x.mat, method = "mve")$cov # Return Value: list(mu = mu, Sigma = Sigma) } # ------------------------------------------------------------------------------ mcdEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Uses robust estimation "cov.mve" from [MASS] # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Example: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; mcdEstimator(x) # FUNCTION: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: mu = colMeans(x.mat) Sigma = MASS::cov.rob(x = x.mat, method = "mcd")$cov # Return Value: list(mu = mu, Sigma = Sigma) } ################################################################################ lpmEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns lower partial moment estimator # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Example: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; lpmEstimator(x) # FUNCTION: # Check Arguments: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: mu <- colMeans(x) if (is.null(spec)) { FUN = colMeans a = 2 } else { FUN = match.fun(spec@model$param$tau) a = spec@model$param$a } Sigma <- assetsLPM(x, tau = FUN(x), a = a)$Sigma colnames(Sigma) <- rownames(Sigma) <- names(mu) # Return Value: list(mu = mu, Sigma = Sigma) } ################################################################################ slpmEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns symmetric lower partial moment estimator # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Example: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; slpmEstimator(x) # FUNCTION: # Check Arguments: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: mu <- colMeans(x) if (is.null(spec)) { FUN = colMeans a = 2 } else { FUN = match.fun(spec@model$param$tau) a = spec@model$param$a } Sigma <- assetsSLPM(x, tau = FUN(x), a = a)$Sigma colnames(Sigma) <- rownames(Sigma) <- names(mu) # Return Value: list(mu = mu, Sigma = Sigma) } ################################################################################ kendallEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Uses Kendall's rank covariance estimation # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Example: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; covEstimator(x) # FUNCTION: # Check Arguments: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: mu = colMeans(x.mat) Sigma = cov(x.mat, method = "kendall") # Return Value: list(mu = mu, Sigma = Sigma) } # ------------------------------------------------------------------------------ spearmanEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Uses Spearman's rank covariance estimation # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Example: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; covEstimator(x) # FUNCTION: # Check Arguments: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: mu = colMeans(x.mat) Sigma = cov(x.mat, method = "spearman") # Return Value: list(mu = mu, Sigma = Sigma) } ################################################################################ covMcdEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Example: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; covMcdEstimator(x) # FUNCTION: # Check Arguments: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: mu = colMeans(x.mat) Sigma = robustbase::covMcd(x.mat, alpha = 1/2, ...)$cov # Return Value: list(mu = mu, Sigma = Sigma) } # ------------------------------------------------------------------------------ covOGKEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Example: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; covOGKEstimator(x) # FUNCTION: # Check Arguments: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: mu = colMeans(x.mat) Sigma = robustbase::covOGK(x.mat, sigmamu = robustbase::scaleTau2, ...)$cov colnames(Sigma) <- rownames(Sigma) <- names(mu) # Return Value: list(mu = mu, Sigma = Sigma) } # ------------------------------------------------------------------------------ shrinkEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Eample: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; shrinkEstimator(x) # FUNCTION: # Check Arguments: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: mu = colMeans(x.mat) Sigma = fAssets:::.cov.shrink(x = x.mat, verbose = FALSE, ...) attr(Sigma, "lambda.var") <- NULL attr(Sigma, "lambda.var.estimated") <- NULL # Return Value: list(mu = mu, Sigma = Sigma) } # ------------------------------------------------------------------------------ nnveEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Eample: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; nnveEstimator(x) # FUNCTION: # Check Arguments: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: mu = colMeans(x.mat) Sigma = fAssets:::.cov.nnve(datamat = x.mat, ...)$cov colnames(Sigma) <- rownames(Sigma) <- names(mu) # Return Value: list(mu = mu, Sigma = Sigma) } ################################################################################ .studentEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Uses mean/student-d covariance estimation # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Note: # Source from package MASS # Eample: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; .studentEstimator(x) # FUNCTION: # Check Arguments: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: robust = fAssets:::.studentMeanCov(x.mat, ...) mu = robust$center Sigma = robust$cov # Return Value: list(mu = mu, Sigma = Sigma) } # ------------------------------------------------------------------------------ .baggedEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Uses bagged mean/covariance estimation # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Note: # Source from package corpcor # Eample: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; .baggedEstimator(x) # FUNCTION: # Check Arguments: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: robust = fAssets:::.baggedMeanCov(x, ...) mu = robust$center Sigma = robust$cov # Return Value: list(mu = mu, Sigma = Sigma) } # ------------------------------------------------------------------------------ .donostahEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Description: # Uses Donostah's mean/covariance estimation # Note: # Source from package robust # Eample: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; .donostahEstimator(x) # FUNCTION: # Check Arguments: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: robust = fAssets:::.donostahMeanCov(x, ...) mu = robust$center Sigma = robust$cov # Return Value: list(mu = mu, Sigma = Sigma) } # ------------------------------------------------------------------------------ .bayesSteinEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Uses Bayes Stein mean/covariance estimation # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Note: # Source from Alexios Ghalanos # Eample: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; .bayesSteinEstimator(x) # FUNCTION: # Check Arguments: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: robust = fAssets:::.bayesSteinMeanCov(x, ...) mu = robust$center Sigma = robust$cov # Return Value: list(mu = mu, Sigma = Sigma) } # ------------------------------------------------------------------------------ .ledoitWolfEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Uses Ledoit-Wolf mean/covariance estimation # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Note: # Source from package tawny # Eample: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; .ledoitWolfEstimator(x) # FUNCTION: # Check Arguments: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: robust = fAssets:::.ledoitWolfMeanCov(x, ...) mu = robust$center Sigma = robust$cov # Return Value: list(mu = mu, Sigma = Sigma) } # ------------------------------------------------------------------------------ .rmtEstimator <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Uses Random Matrix Theory correlation estimation # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Note: # Source from package tawny # Eample: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; .rmtEstimator(x) # FUNCTION: # Check Arguments: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: robust = fAssets:::.rmtMeanCov(x, ...) mu = robust$center Sigma = robust$cov # Return Value: list(mu = mu, Sigma = Sigma) } ################################################################################ .mveEstimator2 <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Uses robust estimation "cov.mve" from [MASS] # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Example: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; mveEstimator(x) # FUNCTION: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: ans = MASS::cov.rob(x = x.mat, method = "mve") mu = ans$center Sigma = ans$cov # Return Value: list(mu = mu, Sigma = Sigma) } # ------------------------------------------------------------------------------ .mcdEstimator2 <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Uses robust estimation "cov.mve" from [MASS] # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Example: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; mcdEstimator(x) # FUNCTION: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: ans = MASS::cov.rob(x = x.mat, method = "mcd") mu = ans$center Sigma = ans$cov # Return Value: list(mu = mu, Sigma = Sigma) } ################################################################################ .covMcdEstimator2 <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Example: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; covMcdEstimator(x) # FUNCTION: # Check Arguments: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: ans = robustbase::covMcd(x.mat, alpha = 1/2, ...) mu = ans$center Sigma = ans$cov # Return Value: list(mu = mu, Sigma = Sigma) } # ------------------------------------------------------------------------------ .covOGKEstimator2 <- function(x, spec = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Arguments: # x - an object of class timeSeries # spec - a portfolio specification of class fPFOLIOSPEC # Example: # x = as.timeSeries(data(LPP2005REC))[, 1:6]; covOGKEstimator(x) # FUNCTION: # Check Arguments: stopifnot(inherits(x, "timeSeries")) # Extract Matrix: x.mat = getDataPart(x) # Estimate: ans = robustbase::covOGK(x.mat, sigmamu = robustbase::scaleTau2, ...) mu = ans$center Sigma = ans$cov colnames(Sigma) <- rownames(Sigma) <- names(mu) # Return Value: list(mu = mu, Sigma = Sigma) } # ------------------------------------------------------------------------------ .arwEstimator2 <- function (x, spec = NULL, ...) { x.mat <- as.matrix(x) N <- ncol(x) assetNames <- colnames(x) fit <- fAssets:::.cov.arw(x = x.mat, center = colMeans(x.mat), cov = cov(x) , ...) # Estimate: mu <- fit$center Sigma <- fit$cov names(mu) <- assetNames rownames(Sigma) <- colnames(Sigma) <- assetNames # Return Value: list(mu = fit$center, Sigma = fit$cov) } ################################################################################ fPortfolio/R/mathprogQP-ipop.R0000644000176200001440000001513212410301634015744 0ustar liggesusers # 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: # ripopQP Rmetrics Interface for LOQO QP solver # ipopQP Convenience wrapper for LOQO QP solver # ipopQPControl LOQO QP control parameter list # ripop Synonyme name for kernlab::ipop function ############################################################################### ripopQP <- function(objective, lower=0, upper=1, linCons, control=list()) { # A function implemented by Diethelm Wuertz # Description: # Implements Vandenberg's LOQO Algorithm # Arguments: # objective - list(dvec=NULL, Dmat=NULL) # lower - lower box constraints # upper - upper box constraints # linCons - linear constraints, list with entries: # mat, lower, upper. # control - control list # FUNCTION: # Control List: ctrl <- ipopQPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] <- control[name] control <- ctrl BIG <- control$inf # General Settings: dvec <- objective$dvec Dmat <- objective$Dmat Names <- colnames(rbind(dvec, Dmat)) N <- ncol(rbind(dvec, Dmat)) # Box Constraints: if(length(lower) == 1) { par.lower <- rep(lower, N) } else { par.lower <- lower } if(length(upper) == 1) { par.upper <- rep(upper, N) } else { par.upper <- upper } par.lower[is.infinite(par.lower)] <- BIG*sign(par.lower[is.infinite(par.lower)]) par.upper[is.infinite(par.upper)] <- BIG*sign(par.upper[is.infinite(par.upper)]) # Linear Constraints: if(missing(linCons)) { eqA <- ineqA <- NULL eqA.bound < ineqA.lower <- ineqA.upper <- NULL } else { mat <- linCons[[1]] M <- nrow(mat) lower <- linCons[[2]] upper <- linCons[[3]] if(length(lower) == 1) lower <- rep(lower, M) if(length(upper) == 1) upper <- rep(upper, M) lower[is.infinite(lower)] <- BIG*sign(lower[is.infinite(lower)]) upper[is.infinite(upper)] <- BIG*sign(upper[is.infinite(upper)]) eqIndex <- which(lower == upper) ineqIndex <- which(lower != upper) if (length(eqIndex) == 0) { eqA <- NULL eqA.bound <- NULL } else { eqA <- mat[eqIndex, ] eqA.bound <- lower[eqIndex] } if (length(ineqIndex) == 0) { ineqA <- NULL ineqA.lower <- NULL ineqA.upper <- NULL } else { ineqA <- mat[ineqIndex, ] ineqA.lower <- lower[ineqIndex] ineqA.upper <- upper[ineqIndex] } } # Optimize Portfolio: optim <- ipopQP( objective, par.lower, par.upper, eqA, eqA.bound, ineqA, ineqA.lower, ineqA.upper, control) # Return Value: value <- list( opt = optim, solution = optim$solution, objective = optim$objective, status = optim$status, message = optim$message, solver = "ipop", version = optim$version) class(value) = c("solver", "list") value } ############################################################################### ipopQP <- function( objective=list(dvec=NULL, Dmat = NULL), par.lower=NULL, par.upper=NULL, eqA=NULL, eqA.bound=NULL, ineqA=NULL, ineqA.lower=NULL, ineqA.upper=NULL, control=list()) { # A function implemented by Diethelm Wuertz # Description: # Implements Vandenberg's LOQO Algorithm # FUNCTION: # Control List: ctrl <- ipopQPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] <- control[name] control <- ctrl # General Settings: dvec <- objective$dvec Dmat <- objective$Dmat Names <- colnames(rbind(dvec, Dmat)) N <- ncol(rbind(dvec, Dmat)) # Solve: optim <- ripop( c = objective$dvec, H = objective$Dmat, A = rbind(eqA, ineqA), b = c(eqA.bound, ineqA.lower), l = par.lower, u = par.upper, r = c(eqA.bound, ineqA.upper) - c(eqA.bound, ineqA.lower), sigf = control$sigf, maxiter = control$maxiter, margin = control$margin, bound = control$bound, verb = control$verb) # Add: if (optim@how == "converged") Status <- 0 else Status <- 1 par <- optim@primal names(par) <- Names Message <- optim@how # Version: package <- packageDescription(pkg="kernlab") version <- paste(package$Package, package$Version, package$Date) # Return Value: ans <- list( opt = optim, solution = par, objective = c( dvec %*% par + 0.5 * par %*% Dmat %*% par )[[1]], status = Status, message = Message, solver = "ipop", version = version) class(ans) = c("solver", "list") ans } ############################################################################### ripop <- kernlab::ipop ############################################################################### ipopQPControl <- function( sigf=12, maxiter=400, margin=0.05, bound=10, verb=0, inf=1e12, solver="ipop", trace=FALSE) { # A function implemented by Diethelm Wuertz # Description: # Returns control parameter list # FUNCTION: # Control Parameter: control <- list( sigf = 12, maxiter = 400, margin = 0.05, bound = 10, verb = 0, inf = inf, solver = solver, trace = trace) # Return Value: control } ############################################################################### fPortfolio/R/utils-methods.R0000644000176200001440000000324712323217770015534 0ustar liggesusers # 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: # print.solver # summary.solver ############################################################################### print.solver <- function(x, ...) { # A function implemented by Diethelm Wuertz # Number of Variables: nSolution <- length(x$solution) # Print: cat("\nSolver: ", x$solver) cat("\nSolution: ", 1, ":", x$solution[1]) for (i in 2:nSolution) cat("\n ", i, ":", x$solution[i]) cat("\nObjective: ", x$objective) cat("\nStatus: ", x$status) cat("\nMessage: ", x$message) cat("\n") } # ----------------------------------------------------------------------------- .summary.solver <- function(object, ...) { # A function implemented by Diethelm Wuertz # Print: print(object[1]) } ############################################################################### fPortfolio/R/mathprogLP.R0000644000176200001440000001574712410257530015013 0ustar liggesusers # 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: # rsolveLP General function wrapper for LP solvers # .solveLP.MAD.demo MAD portfolio example # .solveLP.GLPK.demo GLPK help page example ############################################################################### rsolveLP <- function(objective, lower=0, upper=1, linCons, control=list(solver="glpk", invoke=c("R", "AMPL", "NEOS"))) { # A function implemented by Diethelm Wuertz # Description: # Rmetrics Interface for AMPL/NEOS LP solvers # Argments: # objective - numeric vector. # lwer, upper - box constraints # linCons - linear constraints: mat, lower and upper # control - control list # Control: solver <- control$solver invoke <- control$invoke[1] # Solve Linear Problem: if (invoke == "R") { rfooLP <- match.fun ( paste("r", solver, "LP", sep="")) ans <- rfooLP(objective, lower, upper, linCons, control) } if (invoke == "AMPL" ) { ans <- ramplLP(objective, lower, upper, linCons, control) } if (invoke == "NEOS" ) { ans <- rneosLP(objective, lower, upper, linCons, control) } ans$solver <- paste(invoke, ans$solver) # Return Value: ans } ############################################################################### .solveLP.MAD.demo <- function() { # Solve MAD Portfolio: # Load Dataset dataSet <- data("LPP2005REC", package="timeSeries", envir=environment()) LPP2005REC <- get(dataSet, envir=environment()) # Load Swiss Pension Fund Data: nAssets <- 6 nScenarios <- 100 data <- 100 * LPP2005REC[1:nScenarios, 1:nAssets] Mean <- colMeans(data) Data <- as.matrix(data) targetReturn <- mean(data) # Objective Function: vec <- c(weights=rep(0, nAssets), scenarios=rep(1/nScenarios, nScenarios)) # Set up Constraints Matrix: mat <- rbind( MAD.LE = cbind(Data, -diag(nScenarios)), MAD.GE = cbind(Data, +diag(nScenarios)), RETURN = t(c(Mean, rep(0, nScenarios))), BUDGET = t(c(rep(1, nAssets), rep(0, nScenarios))), X = cbind(matrix(rep(0, nAssets*nScenarios),ncol=nAssets), diag(nScenarios)), WEIGHTS = cbind(diag(nAssets), matrix(rep(0, nScenarios*nAssets), nrow=nAssets))) # Set up Right Hand Side of Constraints Equations: rhs <- c( MAD.LE = rep(0, nScenarios), MAD.GE = rep(0, nScenarios), RETURN = targetReturn, BUDGET = 1, X = rep(0, nScenarios), WEIGHTS = rep(0, nAssets)) # Set up Vector of Directions: dir <- c( MAD.LE = rep("<=", nScenarios), MAS.GE = rep(">=", nScenarios), RETURN = "==", BUDGET = "==", X = rep(">=", nScenarios), WEIGHTS = rep(">=", nAssets)) # Conversions: RHS <- rep(Inf, times=length(dir)) RHS[dir == "<="] <- rhs[dir == "<="] RHS[dir == "=="] <- rhs[dir == "=="] LHS <- rep(-Inf, times=length(dir)) LHS[dir == ">="] <- rhs[dir == ">="] LHS[dir == "=="] <- rhs[dir == "=="] # Arguments: objective <- vec lower <- 0 upper <- 1 linCons <- list(mat, LHS, RHS) control <- list() # Contributed R Solver - Original Function Calls: Rglpk::Rglpk_solve_LP(vec, mat, dir, rhs) # Contributed R Solver - Interfaced rglpkLP(objective, lower, upper, linCons) # AMPL: ramplLP(objective, lower, upper, linCons) # All AMPL: for (solver in c( "cplex", "donlp2", "gurobi", "loqo", "lpsolve", "minos", "snopt", "ipopt", "bonmin", "couenne")) { ans <- ramplLP(objective=vec, lower, upper, linCons, control=list(solver=solver)) print(ans) } # NEOS: # require(rneos) # lp: Linear Programming Solver: for (solver in c("gurobi", "mosek", "ooqp")) print(rneosLP(objective=vec, lower, upper, linCons, control=list(solver=solver, category="lp"))) # nco: Using Nonlinear Constrained Optimization Solver: for (solver in c( "conopt", "filter", "knitro", "lancelot", "loqo", "minos", "mosek", "pennon", "snopt")) print(rneosLP(objective=vec, lower, upper, linCons, control=list(solver=solver, category="nco"))) } # ----------------------------------------------------------------------------- .solveLP.GLPK.demo <- function() { # GLPK Demo from Help Rglpk Page: vec <- -c(2, 4, 3) mat <- matrix(c( 3, 2, 1, 4, 1, 3, 2, 2, 2), 3, 3) dir <- c("<=", "<=", "<=") rhs <- c(60, 40, 80) # For Testing: # mat <- rbind(mat, c(0,0,0)) # dir <- c(dir, "<=") # rhs <- c(rhs, 1000) # Arguments: objective <- vec lower <- 0 upper <- Inf linCons <- list(mat, lower=-Inf, upper=rhs) control <- list() # Contributed R Solver - Original Function Calls: Rglpk::Rglpk_solve_LP(vec, mat, dir, rhs) # Contributed R Solver - Interfaced rglpkLP(objective, lower, upper, linCons) # AMPL: ramplLP(objective, lower, upper, linCons) # All AMPL: for (solver in c( "cplex", "donlp2", "gurobi", "loqo", "lpsolve", "minos", "snopt", "ipopt", "bonmin", "couenne")) { ans <- ramplLP(objective=vec, lower, upper, linCons, control=list(solver=solver)) print(ans) } # NEOS: # require(rneos) # lp: Linear Programming Solver: for (solver in c("gurobi", "mosek", "ooqp")) print(rneosLP(objective=vec, lower, upper, linCons, control=list(solver=solver, category="lp"))) # nco: Using Nonlinear Constrained Optimization Solver: for (solver in c( "conopt", "filter", "knitro", "lancelot", "loqo", "minos", "mosek", "pennon", "snopt")) print(rneosLP(objective=vec, lower, upper, linCons, control=list(solver=solver, category="nco"))) } ############################################################################### fPortfolio/R/a-class-fPORTFOLIO.R0000644000176200001440000000246712323217770016002 0ustar liggesusers # 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 Description. 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: # 'fPORTFOLIO' S4 Portfolio Class ################################################################################ setClass("fPORTFOLIO", representation( call = "call", data = "fPFOLIODATA", spec = "fPFOLIOSPEC", constraints = "fPFOLIOCON", portfolio = "fPFOLIOVAL", title = "character", description = "character") ) ################################################################################ fPortfolio/R/a-class-fPFOLIODATA.R0000644000176200001440000000226312323217770016041 0ustar liggesusers # 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 Description. 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: # 'fPFOLIODATA' S4 Portfolio Data Class ################################################################################ setClass("fPFOLIODATA", representation( data = "list", statistics = "list", tailRisk = "list") ) ################################################################################ fPortfolio/R/risk-budgeting.R0000644000176200001440000005327212330665056015656 0ustar liggesusers # 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: # pfolioReturn Returns portfolio returns # FUNCTION: DESCRIPTION: # sampleCOV Returns sample covariance risk # normalVaR Returns normal Value at Risk # modifiedVaR Returns modified Cornish Fisher VaR # sampleVaR Returns sammple VaR from historical quantiles # FUNCTION: DESCRIPTION: # budgetsSampleCOV Covariance risk contribution and budgets # budgetsNormalVAR Normal VaR risk contribution and budgets # budgetsModifiedVAR Modified VaR risk contribution and budgets # budgetsNormalES Normal ES (CVaR) risk contribution and budgets # budgetsModifiedES Modified ES (CVaR) risk contribution and budgets # UTILITIES: DESCRIPTION: # .M34.MM Internal fast computing of M3 and M4 # .run Returns execution time information # .Ipower Internal utility function to compute M3 # .derIpower Internal utility function to compute M4 # .myVaR ... to do # DEPRECATED: DESCRIPTION: # .covarRisk Computes covariance portfolio risk # .mcr Computes marginal contribution to covariance risk # .mcrBeta Computes beta, the rescaled mcr to covariance risk # .riskContributions Computes covariance risk contributions # .riskBudgets Computes covariance risk budgets ############################################################################### sampleCOV <- function(x) { # A function implemented by Diethelm Wuertz # Description: # Returns sample covariance risk # Arguments: # x - a 'timeSeries' object # FUNCTION: # Return Value: cov(x) } # ----------------------------------------------------------------------------- normalVaR <- function(x, alpha=0.05) { # A function implemented by Diethelm Wuertz # Description: # Returns normal Value at Risk # Arguments: # x - a 'timeSeries' object # FUNCTION: # Mean and Centered 2nd Moment: x.mean <- colMeans(x) x.centered <- t(t(x) - x.mean) m2 <- colMeans(x.centered^2) # Gaussian: q <- qnorm(alpha) # Return Value: x.mean + q * sqrt(m2) } # ----------------------------------------------------------------------------- modifiedVaR <- function(x, alpha=0.05) { # A function implemented by Diethelm Wuertz # Description: # Returns modified Cornish Fisher VaR # Arguments: # x - a 'timeSeries' object # Details: # Includes Code Borrowed from Peterson and Boudt, GPL # FUNCTION: # Mean and Centered Moments: x.mean <- colMeans(x) x.centered <- t(t(x) - x.mean) m2 <- colMeans(x.centered^2) m3 <- colMeans(x.centered^3) m4 <- colMeans(x.centered^4) skew <- m3 / sqrt(m2^3) kurt <- m4 / (m2*m2) - 3 # Cornish Fisher: z <- qnorm(alpha) q <- z + (z*z-1)*skew/6 + z*(z*z-3)*kurt/24 - z*(2*z*z-5)*skew*skew/36 # Return Value: x.mean + q * sqrt(m2) } # ----------------------------------------------------------------------------- sampleVaR <- function(x, alpha=0.05) { # A function implemented by Diethelm Wuertz # Description: # Returns sammple VaR from historical quantiles # Arguments: # x - a 'timeSeries' object # FUNCTION: # Return Value: colQuantiles(x, alpha) } # ----------------------------------------------------------------------------- budgetsSampleCOV <- function(x, weights, mu=NULL, Sigma=NULL) { # A function implemented by Diethelm Wuertz # Description: # Arguments: # x - a 'timeSeries' object # Details: # Includes Code Borrowed from Peterson and Boudt, GPL # Rmetrics Re-Implementation # FUNCTION: # Risk: if(is.null(mu)) mu <- colMeans(x) if(is.null(Sigma)) Sigma <- cov(x) risk <- sqrt( t(weights) %*% Sigma %*% weights )[[1]] attr(risk, "estimator") <- substitute(FUN) # Risk Contributions: m2.pfolio <- (t(weights) %*% Sigma %*% weights)[[1]] dm2.pfolio <- as.vector(Sigma %*% weights) contribution <- dm2.pfolio/sqrt(m2.pfolio) * weights names(contribution) <- colnames(x) # Risk Budgets: budgets <- contribution/risk names(budgets) <- colnames(x) attr(budgets, "control") <- sum(budgets) # Return Value: list(riskCOV=risk, contribution=contribution, budgets=budgets) } # ----------------------------------------------------------------------------- budgetsNormalVAR <- function(x, weights, alpha=0.05, mu=NULL, Sigma=NULL) { # A function implemented by Diethelm Wuertz # Description: # Arguments: # x - a 'timeSeries' object # Details: # Includes Code Borrowed from Peterson and Boudt, GPL # FUNCTION: # Risk: if(is.null(mu)) mu <- colMeans(x) if(is.null(Sigma)) Sigma <- cov(x) risk <- -(t(weights) %*% mu + qnorm(alpha) * sqrt( t(weights) %*% Sigma %*% weights))[[1]] attr(risk, "estimator") <- substitute(FUN) attr(risk, "alpha") <- alpha # Risk Contributions: m2.pfolio <- (t(weights) %*% Sigma %*% weights) dm2.pfolio <- as.vector(Sigma %*% weights) contribution <- - (mu + qnorm(alpha)* dm2.pfolio/sqrt(m2.pfolio)) * weights names(contribution) <- colnames(x) # Risk Budgets: budgets <- contribution/risk names(budgets) <- colnames(x) attr(budgets, "sumBudgets") <- sum(budgets) # Return Value: list(riskVAR=risk, contributionVAR=contribution, budgetsVAR=budgets) } # ----------------------------------------------------------------------------- budgetsModifiedVAR <- function(x, weights, alpha=0.05, mu=NULL, Sigma=NULL, M3=NULL, M4=NULL) { # A function implemented by Diethelm Wuertz # Description: # Arguments: # x - a 'timeSeries' object # Details: # Includes code borrowed from Peterson and Boudt, GPL # FUNCTION: # Compute Moments: if(is.null(mu)) mu <- colMeans(x) if(is.null(Sigma)) Sigma <- cov(x) if(is.null(M3) || is.null(M4)) { MM <- .M34.MM(x, mu=mu) M3 <- MM$M3 M4 <- MM$M4 } # Risk: z <- qnorm(alpha) location <- t(weights) %*% mu pm2 <- t(weights) %*% Sigma %*% weights dpm2 <- as.vector(2 * Sigma %*% weights) pm3 <- weights %*% M3 %*% (weights %x% weights) dpm3 <- as.vector(3 * M3 %*% (weights %x% weights)) pm4 <- t(weights) %*% M4 %*% (weights %x% weights %x% weights) dpm4 <- as.vector(4 * M4 %*% (weights %x% weights %x% weights)) skew <- (pm3/pm2^(3/2))[[1]] exkurt <- (pm4/pm2^(2) - 3)[[1]] derskew <- (2 * (pm2^(3/2)) * dpm3 - 3 * pm3 * sqrt(pm2) * dpm2) / (2 * pm2^3) derexkurt <- ((pm2) * dpm4 - 2 * pm4 * dpm2)/(pm2^3) h <- z + (1/6) * (z^2 - 1) * skew h <- h + (1/24) * (z^3 - 3 * z) * exkurt - (1/36) * (2 * z^3 - 5 * z) * skew^2 risk <- -(location + h * sqrt(pm2)) # Risk Contribution: derGausVaR <- -as.vector(mu) - qnorm(alpha) * (0.5 * as.vector(dpm2))/sqrt(pm2) derMVaR <- derGausVaR + (0.5 * dpm2/sqrt(pm2)) * (-(1/6) * (z^2 - 1) * skew - (1/24) * (z^3 - 3 * z) * exkurt + (1/36) * (2 * z^3 - 5 * z) * skew^2) derMVaR <- derMVaR + sqrt(pm2) * (-(1/6) * (z^2 - 1) * derskew - (1/24) * (z^3 - 3 * z) * derexkurt + (1/36) * (2 * z^3 - 5 * z) * 2 * skew * derskew) contribution <- as.vector(weights) * as.vector(derMVaR) names(contribution) <- colnames(x) # Risk Budgets: budgets <- contribution/risk names(budgets) <- colnames(x) budgets attr(budgets, "sum(contribution)-risk") <- sum(contribution)-risk attr(budgets, "sum(budgets)") <- sum(budgets) # Return Value: list(modifiedVAR=risk, contribution=contribution, budgets=budgets) } # ----------------------------------------------------------------------------- budgetsNormalES <- function(x, weights, alpha=0.05, mu=NULL, Sigma=NULL) { # A function implemented by Diethelm Wuertz # Description: # x - a 'timeSeries' object # Arguments: # Details: # Includes Code Borrowed from Peterson and Boudt, GPL # FUNCTION: # Risk: if(is.null(mu)) mu <- colMeans(x) if(is.null(Sigma)) Sigma <- cov(x) location <- t(weights) %*% mu pm2 <- t(weights) %*% Sigma %*% weights dpm2 <- as.vector(2 * Sigma %*% weights) risk <- -location + dnorm(qnorm(alpha)) * sqrt(pm2)/alpha attr(risk, "estimator") <- substitute(FUN) attr(risk, "alpha") <- alpha # Contribution: derES <- -mu + (1/alpha) * dnorm(qnorm(alpha)) * (0.5 * dpm2)/sqrt(pm2) contribution <- weights * derES names(contribution) <- colnames(x) # Budgets: budgets <- contribution/risk names(budgets) <- colnames(x) attr(budgets, "sumBudgets") <- sum(budgets) # Return Value: list(normalES=risk, contribution=contribution, budgets=budgets) } # ----------------------------------------------------------------------------- budgetsModifiedES <- function(x, weights, alpha=0.05, mu=NULL, Sigma=NULL, M3=NULL, M4=NULL) { # A function implemented by Diethelm Wuertz # Description: # Arguments: # x - a 'timeSeries' object # Details: # Includes code borrowed from Peterson and Boudt, GPL # FUNCTION: # Settings: if(is.null(mu)) mu <- colMeans(x) if(is.null(Sigma)) Sigma <- cov(x) if(is.null(M3) || is.null(M4)) { MM <- .M34.MM(x, mu=mu) M3 <- MM$M3 M4 <- MM$M4 } # Risk: z <- qnorm(alpha) location <- t(weights) %*% mu pm2 <- (t(weights) %*% Sigma %*% weights)[[1]] dpm2 <- as.vector(2 * Sigma %*% weights) pm3 <- (weights %*% M3 %*% (weights %x% weights))[[1]] dpm3 <- as.vector(3 * M3 %*% (weights %x% weights)) pm4 <- (t(weights) %*% M4 %*% (weights %x% weights %x% weights))[[1]] dpm4 <- as.vector(4 * M4 %*% (weights %x% weights %x% weights)) skew <- (pm3/pm2^(3/2))[[1]] exkurt <- (pm4/pm2^(2) - 3)[[1]] derskew <- (2 * (pm2^(3/2)) * dpm3 - 3 * pm3 * sqrt(pm2) * dpm2)/(2 * pm2^3) derexkurt <- ((pm2) * dpm4 - 2 * pm4 * dpm2)/(pm2^3) h <- z + (1/6) * (z^2 - 1) * skew h <- h + (1/24) * (z^3 - 3 * z) * exkurt - (1/36) * (2 * z^3 - 5 * z) * skew^2 derh <- (1/6) * (z^2 - 1) * derskew + (1/24) * (z^3 - 3 * z) * derexkurt - (1/18) * (2 * z^3 - 5 * z) * skew * derskew E <- dnorm(h) E <- E + (1/24) * (.Ipower(4, h) - 6 * .Ipower(2, h) + 3 * dnorm(h)) * exkurt E <- E + (1/6) * (.Ipower(3, h) - 3 * .Ipower(1, h)) * skew E <- E + (1/72) * (.Ipower(6, h) - 15 * .Ipower(4, h) + 45 * .Ipower(2, h) - 15 * dnorm(h)) * (skew^2) E <- E/alpha risk <- MES <- -location + sqrt(pm2) * E # Risk Contributions: derMES <- -mu + 0.5 * (dpm2/sqrt(pm2)) * E derE <- (1/24) * (.Ipower(4, h) - 6 * .Ipower(2, h) + 3 * dnorm(h)) * derexkurt derE <- derE + (1/6) * (.Ipower(3, h) - 3 * .Ipower(1, h)) * derskew derE <- derE + (1/36) * (.Ipower(6, h) - 15 * .Ipower(4, h) + 45 * .Ipower(2, h) - 15 * dnorm(h)) * skew * derskew X <- -h * dnorm(h) + (1/24) * (.derIpower(4, h) - 6 * .derIpower(2, h) - 3 * h * dnorm(h)) * exkurt X <- X + (1/6) * (.derIpower(3, h) - 3 * .derIpower(1, h)) * skew X <- X + (1/72) * (.derIpower(6, h) - 15 * .derIpower(4, h) + 45 * .derIpower(2, h) + 15 * h * dnorm(h)) * skew^2 derE <- derE + derh * X derE <- derE/alpha derMES <- derMES + sqrt(pm2) * derE contribution <- as.vector(weights) * as.vector(derMES) names(contribution) <- colnames(x) # Risk Budgets: budgets <- contribution/risk names(budgets) <- colnames(x) attr(budgets, "sumBudgets") <- sum(budgets) # Return Value: list(modifedES=risk, contribution=contribution, budgets=budgets) } ############################################################################### .M34.MM <- function (x, mu=NULL) { # A function implemented by Diethelm Wuertz # Description: # Arguments: # x - a 'timeSeries' object # Details: # Includes Code Borrowed from Peterson and Boudt, GPL # Fast Rmetrics Implementation: n <- ncol(x) m <- nrow(x) if(is.null(mu)) mu <- colMeans(x) M3 <- matrix(rep(0, n^3), nrow=n, ncol=n^2) M4 <- matrix(rep(0, n^4), nrow=n, ncol=n^3) centret <- series(x) - matrix(rep(mu, each=m), ncol=n) for (i in c(1:m)) { cent <- centret[i, ] tcent <- t(cent) M <- (cent %*% tcent) %x% tcent M3 <- M3 + M M4 <- M4 + M %x% tcent } # Return Value: list(M3=M3/m, M4=M4/m, mu=mu) } # ----------------------------------------------------------------------------- .run <- function(FUN, times=10, mult=100, ...) { # A function implemented by Diethelm Wuertz # Description: # Arguments: # FUNCTION: # Timing: fun <- match.fun(FUN) now <- Sys.time() for (i in 1:as.integer(times)) ans <- fun(...) done <- Sys.time() time <- mult * as.numeric(done - now) # Print Timing Results: cat("Timing:\n") print(c(sec=round(time,0), times=times, mult=mult, runs=times*mult)) cat("\nResults:\n\n") # Return Value: ans } # ----------------------------------------------------------------------------- .Ipower <- function (power, h) { # Description: # Arguments: # Details: # A function borrowed from PerformanceAnalytics, GPL fullprod <- 1 if ((power%%2) == 0) { pstar <- power/2 for (j in c(1:pstar)) fullprod <- fullprod * (2 * j) I <- fullprod * dnorm(h) for (i in c(1:pstar)) { prod <- 1 for (j in c(1:i)) prod <- prod * (2 * j) I <- I + (fullprod/prod) * (h^(2 * i)) * dnorm(h) } } else { pstar <- (power - 1)/2 for (j in c(0:pstar)) { fullprod = fullprod * ((2 * j) + 1) } I <- -fullprod * pnorm(h) for (i in c(0:pstar)) { prod = 1 for (j in c(0:i)) prod = prod * ((2 * j) + 1) I <- I + (fullprod/prod) * (h^((2 * i) + 1)) * dnorm(h) } } return(I) } # ----------------------------------------------------------------------------- .derIpower <- function (power, h) { # Description: # Arguments: # Details: # A function borrowed from PerformanceAnalytics, GPL fullprod <- 1 if ((power%%2) == 0) { pstar <- power/2 for (j in c(1:pstar)) fullprod = fullprod * (2 * j) I <- -fullprod * h * dnorm(h) for (i in c(1:pstar)) { prod = 1 for (j in c(1:i)) prod = prod * (2 * j) I <- I + (fullprod/prod) * (h^(2 * i - 1)) * (2 * i - h^2) * dnorm(h) } } else { pstar = (power - 1)/2 for (j in c(0:pstar)) fullprod <- fullprod * ((2 * j) + 1) I <- -fullprod * dnorm(h) for (i in c(0:pstar)) { prod = 1 for (j in c(0:i)) prod <- prod * ((2 * j) + 1) I <- I + (fullprod/prod) * (h^(2 * i) * (2 * i + 1 - h^2)) * dnorm(h) } } return(I) } # ----------------------------------------------------------------------------- .myVaR <- function(x, alpha=0.05, method=c("normal", "modified", "sample")) { # A function implemented by Diethelm Wuertz # todo ... # Funcion Selection: fun <- match.fun(paste(match.arg(method), "VaR", sep="")) # Return Value: fun(x, alpha) } ############################################################################### # DEPRECATED - DO NOT REMOVE - REQUIRED BY PACKAGE appRmetricsHandbook .covarRisk <- function(data, weights=NULL, FUN="cov", ...) { # A function implemented by Diethelm Wuertz # Description: # Computes covariance portfolio risk # Arguments: # data - a multivariate timeSeries object of financial returns # weights - numeric vector of portfolio weights # FUN - a covariance estimator, which returns a matrix of # covariance estimates, by default the sample covariance # ... - Optional arguments passed to the function FUN # Example: # covarRisk(data) # FUNCTION: # Covariance Risk: covFun <- match.fun(FUN) COV <- covFun(data) # Portfolio Weights: N <- ncol(COV) if (is.null(weights)) weights = rep(1/N, N) names(weights) <- colnames(COV) # Covariance Portfolio Risk: covarRisk <- sqrt( t(weights) %*% COV %*% weights )[[1, 1]] # Return Value: covarRisk } # ----------------------------------------------------------------------------- .mcr <- function(data, weights=NULL, FUN="cov", ...) { # A function implemented by Diethelm Wuertz # Description # Computes marginal contribution to covariance risk # Arguments: # data - a multivariate timeSeries object of financial returns # weights - numeric vector of portfolio weights # FUN - a covariance estimator, which returns a matrix of # covariance estimates, by default the sample covariance # ... - Optional arguments passed to the function FUN # Details: # The formula are implemented according to Goldberg et al., # see also R script assetsPfolio.R # References: # Lisa Goldberg et al., Extreme Risk Management, 2009 # Scherer and Martin, Introduction to modern portfolio Optimimization # Example: # data <- assetsSim(100, 6); mcr(data) # FUNCTION: # Covariance Risk: covFun <- match.fun(FUN) COV <- covFun(data) N <- ncol(data) if (is.null(weights)) weights <- rep(1/N, N) # Marginal Contribution to Risk mcr <- (COV %*% weights)[, 1] / .covarRisk(data, weights, FUN, ...) names(mcr) <- colnames(data) # Return Value: mcr } # ----------------------------------------------------------------------------- .mcrBeta <- function(data, weights=NULL, FUN="cov", ...) { # A function implemented by Diethelm Wuertz # Description: # Computes beta, the rescaled marginal contribution to covariance risk # Arguments: # data - a multivariate timeSeries object of financial returns # weights - numeric vector of portfolio weights # FUN - a covariance estimator, which returns a matrix of # covariance estimates, by default the sample covariance # ... - Optional arguments passed to the function FUN # Example: # .mcrBeta(data) # FUNCTION: # Portfolio Beta: beta <- .mcr(data, weights, FUN = FUN, ...) / .covarRisk(data, weights, FUN = FUN, ...) # Return Value: beta } # ----------------------------------------------------------------------------- .riskContributions <- function(data, weights=NULL, FUN="cov", ...) { # A function implemented by Diethelm Wuertz # Description: # Computes covariance risk contributions # Arguments: # data - a multivariate timeSeries object of financial returns # weights - numeric vector of portfolio weights # FUN - a covariance estimator, which returns a matrix of # covariance estimates, by default the sample covariance # ... - Optional arguments passed to the function FUN # Example: # .riskContributions(data) # FUNCTION: # Risk Contributions: if (is.null(weights)) { N <- ncol(data) weights <- rep(1/N, times = N) } riskContributions <- weights * .mcr(data, weights, FUN, ...) # Return Value: riskContributions } # ----------------------------------------------------------------------------- .riskBudgets <- function(data, weights=NULL, FUN="cov", ...) { # A function implemented by Diethelm Wuertz # Description: # Computes covariance risk budgets # Arguments: # data - a multivariate timeSeries object of financial returns # weights - numeric vector of portfolio weights # FUN - a covariance estimator, which returns a matrix of # covariance estimates, by default the sample covariance # ... - Optional arguments passed to the function FUN # Example: # data <- 100*LPP2005.RET[, 1:6]; .riskBudgets(data) # FUNCTION: # Risk Budgets: riskBudgets <- .riskContributions(data, weights, FUN, ...) / .covarRisk(data, weights, FUN, ...) # Return Value: riskBudgets } ############################################################################### fPortfolio/R/mathprogLP-neos.R0000644000176200001440000001663412410250032015737 0ustar liggesusers # 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: # rneoslLP Rmetrics Interface for AMPL/NEOS LP solvers # neoslLP Convenience wrapper for AMPL/NEOS LP solvers # neoslLPControl AMPL/NEOS LP control parameter list ############################################################################### rneosLP <- function(objective, lower=0, upper=1, linCons, control=list()) { # A function implemented by Diethelm Wuertz # Description: # Implements AMPL LP Interface # Arguments: # objective - vec # FUNCTION: # Control List: ctrl <- neosLPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl # Controls: solver <- control$solver category <- control$category project <- control$project inf <- control$inf trace <- control$trace # Objective: vec <- objective # Box Constraints: replicate <- function(x, n) if(length(x) == 1) rep(x, n) else x n <- length(vec) x_L <- replicate(lower, n) x_U <- replicate(upper, n) x_L[is.infinite(x_L)] <- inf*sign(x_L[is.infinite(x_L)]) x_U[is.infinite(x_U)] <- inf*sign(x_U[is.infinite(x_U)]) # Linear Constraints: A <- linCons[[1]] m <- nrow(A) b_L <- replicate(linCons[[2]], m) b_U <- replicate(linCons[[3]], m) b_L[is.infinite(b_L)] <- inf*sign(b_L[is.infinite(b_L)]) b_U[is.infinite(b_U)] <- inf*sign(b_U[is.infinite(b_U)]) # Optimize Portfolio: value <- neosLP(vec, x_L, x_U, A, b_L, b_U, control) # Return Value: value } # ------------------------------------------------------------------------- neosLP <- function( objective, x_L=NULL, x_U=NULL, A=NULL, b_L=NULL, b_U=NULL, control=list()) { # A function implemented by Diethelm Wuertz # Description: # Universal function wrapper for AMPL LP solvers # Arguments: # objective - vec # FUNCTION: # Control List: ctrl <- neosLPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl # Control Parameters: solver <- control$solver category <- control$category project <- control$project inf <- control$inf trace <- control$trace # Objective: c <- objective n <- length(vec) m <- nrow(A) # Write AMPL Model File: amplModelOpen(project) model <- c( "param n ;", "param m ;", "param c{1..n} ;", "param x_L{1..n} ;", "param x_U{1..n} ;", "param A{1..m, 1..n} ;", "param b_L{1..m} ;", "param b_U{1..m} ;", "var x{1..n};", "minimize Objective: sum {i in 1..n} x[i]*c[i] ;", "s.t. lower {i in 1..n}: x[i] >= x_L[i] ;", "s.t. upper {i in 1..n}: x[i] <= x_U[i] ;", "s.t. linLower {j in 1..m}: sum{i in 1..n} A[j, i]*x[i] >= b_L[j] ;", "s.t. linUpper {j in 1..m}: sum{i in 1..n} A[j, i]*x[i] <= b_U[j] ;", NULL) amplModelAdd(model, project) if (trace) amplModelShow(project) # Write AMPL Data File: amplDataOpen(project) amplDataAddValue (data="n", value=n, project) amplDataAddValue (data="m", value=m, project) amplDataAddVector(data="c", vector=c, project) amplDataAddVector(data="x_L", vector=x_L, project) amplDataAddVector(data="x_U", vector=x_U, project) amplDataAddMatrix(data="A", matrix=A, project) amplDataAddVector(data="b_L", vector=b_L, project) amplDataAddVector(data="b_U", vector=b_U, project) if (trace) amplDataShow(project) # Write AMPL/NEOS RUN File: amplRunOpen(project) run <- c( "solve ;", "display x;", "display solve_result_num;", "display solve_result;", "display solve_message;", "exit ;") amplRunAdd(run, project) if (trace) amplRunShow(project) # Get AMPL Files: model <- paste(readLines("ampl.mod"), sep = " ", collapse ="\n") data <- paste(readLines("ampl.dat"), sep = " ", collapse ="\n") run <- paste(readLines("ampl.run"), sep = " ", collapse ="\n") # Setup NEOS and AMPL Specifications: amplSpec <- list(model=model, data=data, commands=run, comments="NEOS") solverTemplate <- rneos::NgetSolverTemplate(category=category, solvername=solver, inputMethod="AMPL") xmls <- rneos::CreateXmlString(neosxml=solverTemplate, cdatalist=amplSpec) # Submit and Fetch NEOS Job: submittedJob <- rneos::NsubmitJob(xmlstring=xmls, user="rneos", interface="", id=0) ans <- rneos::NgetFinalResults(obj=submittedJob, convert=TRUE) out <- strsplit(ans@ans, split="\n")[[1]] # Get Weights: Index <- (grep("x .*. :=", out)+1):( grep("^;$", out)-1) Out <- out[Index] splits <- strsplit(paste(Out, collapse=" "), " ")[[1]] solution <- as.numeric(splits[splits != ""])[seq(2, 2*n, by=2)] Index <- as.numeric(splits[splits != ""])[seq(1, 2*n, by=2)] solution[Index] <- solution # Get Status: status <- strsplit(out[grep("solve_result", out)], split=" ") statusCode <- status[[1]][3] statusMessage <- status[[2]][3] # Get Solver Message: Index <- grep("solve_message", out):length(out) message <- out[Index] # Neos Job Version: version <- out[1] # Compute Obective Function Value: objval <- (c %*% solution)[[1, 1]] # Return Value: model <- capture.output(amplModelShow(project)) run <- capture.output(amplModelShow(project)) value <- list( opt = list(solve=solve, model=model, run=run, out=out), solution = solution, objective = objval, status = statusCode, message = statusMessage, solver = paste("AMPL", solver), version = version) class(value) <- c("solver", "list") value } # ------------------------------------------------------------------------- neosLPControl <- function(solver="ipopt", category="lp", project="neos", inf=1e12, trace=FALSE) { # A function implemented by Diethelm Wuertz # Description: # Returns control parameter list # FUNCTION: # Return Value: list(solver=solver, category=category, project=project, inf=inf, trace=trace) } ############################################################################### fPortfolio/R/mathprogNLP.R0000644000176200001440000000442213202336220015107 0ustar liggesusers # 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: # .solveNLP.demo Mean-variance portfolio demo solved by NLP ################################################################################ .solveNLP.demo <- function() { # Solve Mean-Variance Portfolio: # Load Dataset dataSet <- data("LPP2005REC", package="timeSeries", envir=environment()) LPP2005REC <- get(dataSet, envir=environment()) # Load Swiss Pension Fund Data: nAssets <- 6 data <- 100 * LPP2005REC[, 1:nAssets] mu <- colMeans(data) Sigma <- cov(data) # Arguments: start <- rep(1, nAssets)/nAssets objective <- function(x) { 0.5 * (x %*% Sigma %*% x)[[1]] } lower <- rep(0, nAssets) upper <- rep(1, nAssets) mat <- rbind( budget = rep(1, times=nAssets), returns = colMeans(data)) matLower <- c( budget = 1, return = mean(data)) matUpper <- matLower linCons <- list(mat, matLower, matUpper) control <- list() # donlp2 Solver: # require(Rdonlp2) ans <- rdonlp2NLP(start, objective, lower, upper, linCons) ans # solnp Solver: # require(Rsolnp) ans <- rsolnpNLP(start, objective, lower, upper, linCons) ans # nlminb2 Solver: # require(Rnlminb2) ans <- rnlminb2NLP(start, objective, lower, upper, linCons) ans } ################################################################################ fPortfolio/R/solve-Rquadprog.R0000644000176200001440000001326612323217770016027 0ustar liggesusers # 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 Description. 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: # solveRquadprog Portfolio interface to solver Rquadprog # .rquadprogArguments Returns arguments for solver # .rquadprog Wrapper to solver function ################################################################################ solveRquadprog <- function(data, spec, constraints) { # A function implemented by Diethelm Wuertz # Description: # Portfolio interface to solver Rquadprog # FUNCTION: # Transform Data: Data <- portfolioData(data, spec) data <- getSeries(Data) nAssets <- getNAssets(Data) # Compile Arguments for Solver: args <- .rquadprogArguments(Data, spec, constraints) # Solve Multiassets Portfolio: ans <- .rquadprog( Dmat = args$Dmat, dvec = args$dvec, Amat = args$Amat, bvec = args$bvec, meq = args$meq) # Save Arguments: ans$optim$args <- args # class: class(ans) = c("solver", "list") # Return Value: ans } ################################################################################ .rquadprogArguments <- function(data, spec, constraints) { # A function implemented by Diethelm Wuertz # Description: # Returns quadprog conform arguments for the solver # FUNCTION: # Data and Constraints as S4 Objects: Data <- portfolioData(data, spec) data <- getSeries(Data) Sigma <- getSigma(Data) nAssets <- getNAssets(Data) # Set up A_mat of Constraints: eqsumW <- eqsumWConstraints(Data, spec, constraints) minsumW <- minsumWConstraints(Data, spec, constraints) maxsumW <- maxsumWConstraints(Data, spec, constraints) Amat = rbind(eqsumW[, -1], diag(nAssets), -diag(nAssets)) if(!is.null(minsumW)) Amat = rbind(Amat, minsumW[, -1]) if(!is.null(maxsumW)) Amat = rbind(Amat, -maxsumW[, -1]) # Set up Vector A_mat >= bvec of Constraints: minW <- minWConstraints(Data, spec, constraints) maxW <- maxWConstraints(Data, spec, constraints) bvec <- c(eqsumW[, 1], minW, -maxW) if(!is.null(minsumW)) bvec = c(bvec, minsumW[, 1]) if(!is.null(maxsumW)) bvec = c(bvec, -maxsumW[, 1]) # Part (meq=1) or Full (meq=2) Investment, the Default ? meq <- nrow(eqsumW) # Directions: dir <- c( rep("==", times = meq), rep(">=", times = length(bvec) - meq)) # Return Value: list( Dmat = Sigma, dvec = rep(0, nAssets), Amat = t(Amat), bvec = bvec, meq = meq, dir = dir) } ################################################################################ .rquadprog <- function(Dmat, dvec, Amat, bvec, meq) { # A function implemented by Diethelm Wuertz # Description: # Goldfarb and Idnani's quadprog solver function # Note: # Requires to load contributed R package quadprog from which we use # the Fortran subroutine of the quadratic solver. # Package: quadprog # Title: Functions to solve Quadratic Programming Problems. # Author: S original by Berwin A. Turlach # R port by Andreas Weingessel # Maintainer: Andreas Weingessel # Description: This package contains routines and documentation for # solving quadratic programming problems. # License: GPL-2 # Value of slove.QP(): # solution - vector containing the solution of the quadratic # programming problem. # value - scalar, the value of the quadratic function at the # solution # unconstrained.solution - vector containing the unconstrained # minimizer of the quadratic function. # iterations - vector of length 2, the first component contains # the number of iterations the algorithm needed, the second # indicates how often constraints became inactive after # becoming active first. vector with the indices of the # active constraints at the solution. # FUNCTION: # Optimize: optim <- try(quadprog::solve.QP(Dmat, dvec, Amat, bvec, meq), silent = TRUE) if (inherits(optim, "try-error")) { weights <- rep(0, length(dvec)) optim <- list() status <- 1 } else { # Set Tiny Weights to Zero: weights <- .checkWeights(optim$solution) attr(weights, "invest") = sum(weights) status <- 0 } # Compose Output List: ans <- list( type = "MV", solver = "solveRquadprog", optim = optim, weights = weights, targetReturn = bvec[1], targetRisk = sqrt(weights %*% Dmat %*% weights)[[1, 1]], objective = sqrt(weights %*% Dmat %*% weights)[[1, 1]], status = status, message = NA) # Return Value: ans } ################################################################################ fPortfolio/R/utils-specs.R0000644000176200001440000000745012323217770015206 0ustar liggesusers # 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: #################################################################################################### # Arguments: # start objective lower upper linCons funCons amplCons control ... # =0 =1 =list() # class() list() list() list() list() # # LP Solver # glpkLP default . numeric x x yes . . glpkLPControl . # symphonyLP . . numeric x x yes . . symphonyLPControl . # amplLP . . numeric x x yes . . amplLPControl . # # QP Solver # quadprogQP default . list x x yes . . quadprogQPControl . # ipoptQP . . list x x yes . . ipoptQPControl . # amplQP . . list x x yes . . amplQPControl . # # NLP Solver # solnpNLP default yes function x x yes yes . solnpNLPControl . # donlp2NLP . yes function x x yes yes . donlp2NLPControl . # nlminb2NLP . yes function x x yes yes . nlminb2NLPControl . # amplNLP . length character x x . . yes amplNLPControl yes # # AMPL Solver tested: ipopt, donlp2, mosek, ... #################################################################################################### # Value: # # value <- list( # call, control, dots, # opt, # solution, objective, status, message, solver, # class(value) <- c("solver", "list") #################################################################################################### # Methods: # print.solver <- function(x, ...) x # summary.solver <- function(x, ...) x # getSolution <- function(x) x$solution # getObjective <- function(x) x$objective # getStatus <- function(x) x$status # getMessage <- function(x) x$message #################################################################################################### fPortfolio/R/utils-NLPgeneral.R0000644000176200001440000004536212410244446016061 0ustar liggesusers # 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: # require(Rdonlp2) # require(Rsolnp) # require(Rnlminb2) # FUNCTION: # .powellTestNLP # .wright4TestNLP # .boxTestNLP # .wright9TestNLP # .alkylationTestNLP # .entropyTestNLP # .rosensuzukiTestNLP # .sharperatioTestNLP # .rachevratioTestNLP # .boxmarkowitzTestNLP ################################################################################ .powellTestNLP <- function() { # A function implemented by Diethelm Wuertz # FUNCTION: start <- c(-2, 2, 2, -1, -1) fun <- function(x) { exp(x[1]*x[2]*x[3]*x[4]*x[5]) } eqFun <- list( function(x) x[1]*x[1]+x[2]*x[2]+x[3]*x[3]+x[4]*x[4]+x[5]*x[5], function(x) x[2]*x[3]-5*x[4]*x[5], function(x) x[1]*x[1]*x[1]+x[2]*x[2]*x[2]) eqFun.bound <- c(10, 0, -1) ans.donlp = donlp2NLP(start, fun, eqFun = eqFun, eqFun.bound = eqFun.bound) ans.solnp = solnpNLP(start, fun, eqFun = eqFun, eqFun.bound = eqFun.bound) ans.nlminb = nlminb2NLP(start, fun, eqFun = eqFun, eqFun.bound = eqFun.bound) result.par = round(rbind( ans.donlp$solution, ans.solnp$solution, ans.nlminb$solution), 3) result.fun = c( fun(ans.donlp$solution), fun(ans.solnp$solution), fun(ans.nlminb$solution)) cbind(result.par, result.fun) } # ------------------------------------------------------------------------------ .wright4TestNLP <- function() { # A function implemented by Diethelm Wuertz # nlminb2 does not converge # FUNCTION: start <- c(1, 1, 1, 1, 1) fun <- function(x){ (x[1]-1)^2+(x[1]-x[2])^2+(x[2]-x[3])^3+(x[3]-x[4])^4+(x[4]-x[5])^4} eqFun = list( function(x) x[1]+x[2]*x[2]+x[3]*x[3]*x[3], function(x) x[2]-x[3]*x[3]+x[4], function(x) x[1]*x[5] ) eqFun.bound = c(2+3*sqrt(2), -2+2*sqrt(2), 2) ans.donlp = donlp2NLP(start, fun, eqFun = eqFun, eqFun.bound = eqFun.bound) ans.solnp = solnpNLP(start, fun, eqFun = eqFun, eqFun.bound = eqFun.bound) ans.nlminb = nlminb2NLP(start, fun, eqFun = eqFun, eqFun.bound = eqFun.bound) result.par = round(rbind( ans.donlp$solution, ans.solnp$solution, ans.nlminb$solution), 3) result.fun = c( fun(ans.donlp$solution), fun(ans.solnp$solution), fun(ans.nlminb$solution)) cbind(result.par, result.fun) } # ------------------------------------------------------------------------------ .boxTestNLP <- function() { # A function implemented by Diethelm Wuertz # FUNCTION: start <- c(1.1, 1.1, 9) fun <- function(x) { -x[1]*x[2]*x[3] } par.lower = rep(1, 3) par.upper = rep(10, 3) eqFun <- list( function(x) 4*x[1]*x[2]+2*x[2]*x[3]+2*x[3]*x[1] ) eqFun.bound = 100 ans.donlp = donlp2NLP(start, fun, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound) ans.solnp = solnpNLP(start, fun, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound) ans.nlminb = nlminb2NLP(start, fun, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound) result.par = round(rbind( ans.donlp$solution, ans.solnp$solution, ans.nlminb$solution), 3) result.fun = c( fun(ans.donlp$solution), fun(ans.solnp$solution), fun(ans.nlminb$solution)) cbind(result.par, result.fun) } # ------------------------------------------------------------------------------ .wright9TestNLP <- function() { # A function implemented by Diethelm Wuertz # FUNCTION: start <- c(1, 1, 1, 1, 1) fun <- function(x){ 10*x[1]*x[4]-6*x[3]*x[2]*x[2]+x[2]*(x[1]*x[1]*x[1])+ 9*sin(x[5]-x[3])+x[5]^4*x[4]*x[4]*x[2]*x[2]*x[2] } ineqFun <- list( function(x) x[1]*x[1]+x[2]*x[2]+x[3]*x[3]+x[4]*x[4]+x[5]*x[5], function(x) x[1]*x[1]*x[3]-x[4]*x[5], function(x) x[2]*x[2]*x[4]+10*x[1]*x[5]) ineqFun.lower = c(-100, -2, 5) ineqFun.upper = c( 20, 100, 100) ans.donlp = donlp2NLP(start, fun, ineqFun = ineqFun, ineqFun.lower = ineqFun.lower, ineqFun.upper = ineqFun.upper) ans.solnp = solnpNLP(start, fun, ineqFun = ineqFun, ineqFun.lower = ineqFun.lower, ineqFun.upper = ineqFun.upper) ans.nlminb = nlminb2NLP(start, fun, ineqFun = ineqFun, ineqFun.lower = ineqFun.lower, ineqFun.upper = ineqFun.upper) result.par = round(rbind( ans.donlp$solution, ans.solnp$solution, ans.nlminb$solution), 3) result.fun = c( fun(ans.donlp$solution), fun(ans.solnp$solution), fun(ans.nlminb$solution)) cbind(result.par, result.fun) } # ------------------------------------------------------------------------------ .alkylationTestNLP <- function() { # A function implemented by Diethelm Wuertz # solnp does not converge # FUNCTION: start <- c(17.45, 12, 110, 30.5, 19.74, 89.2, 92.8, 8, 3.6, 145.2) fun <- function(x) { -0.63*x[4]*x[7]+50.4*x[1]+3.5*x[2]+x[3]+33.6*x[5] } par.lower <- c( 0, 0, 0, 10, 0, 85, 10, 3, 1, 145) par.upper <- c(20, 16, 120, 50, 20, 93, 95,12, 4, 162) eqFun <- list( function(x) 98*x[3]-0.1*x[4]*x[6]*x[9]-x[3]*x[6], function(x) 1000*x[2]+100*x[5]-100*x[1]*x[8], function(x) 122*x[4]-100*x[1]-100*x[5]) eqFun.bound = c(0, 0, 0) ineqFun <- list( function(x) (1.12*x[1]+0.13167*x[1]*x[8]-0.00667*x[1]*x[8]*x[8])/x[4], function(x) (1.098*x[8]-0.038*x[8]*x[8]+0.325*x[6]+57.25)/x[7], function(x) (-0.222*x[10]+35.82)/x[9], function(x) (3*x[7]-133)/x[10]) ineqFun.lower = c( 0.99, 0.99, 0.9, 0.99) ineqFun.upper = c(100/99, 100/99, 10/9, 100/99) ans.donlp = donlp2NLP(start, fun, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound, ineqFun = ineqFun, ineqFun.lower = ineqFun.lower, ineqFun.upper = ineqFun.upper) ans.solnp = solnpNLP(start, fun, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound, ineqFun = ineqFun, ineqFun.lower = ineqFun.lower, ineqFun.upper = ineqFun.upper) ans.nlminb = nlminb2NLP(start, fun, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound, ineqFun = ineqFun, ineqFun.lower = ineqFun.lower, ineqFun.upper = ineqFun.upper) result.par = round(rbind( ans.donlp$solution, ans.solnp$solution, ans.nlminb$solution), 3) result.fun = c( fun(ans.donlp$solution), fun(ans.solnp$solution), fun(ans.nlminb$solution)) cbind(result.par, result.fun) } # ------------------------------------------------------------------------------ .entropyTestNLP <- function() { # A function implemented by Diethelm Wuertz # FUNCTION: set.seed(1953) start <- runif(10, 0, 1) fun <- function(x) { m = length(x) f = -sum(log(x)) vnorm = sum((x-1)^2)^(1/2) f - log(vnorm + 0.1) } par.lower <- rep(0, 10) eqFun <- list( function(x) sum(x) ) eqFun.bound <- 10 ans.donlp = donlp2NLP(start, fun, par.lower = par.lower, eqFun = eqFun, eqFun.bound = eqFun.bound) ans.solnp = solnpNLP(start, fun, par.lower = par.lower, eqFun = eqFun, eqFun.bound = eqFun.bound) ans.nlminb = nlminb2NLP(start, fun, par.lower = par.lower, eqFun = eqFun, eqFun.bound = eqFun.bound) result.par = round(rbind( ans.donlp$solution, ans.solnp$solution, ans.nlminb$solution), 3) result.fun = c( fun(ans.donlp$solution), fun(ans.solnp$solution), fun(ans.nlminb$solution)) cbind(result.par, result.fun) } # ------------------------------------------------------------------------------ .rosensuzukiTestNLP <- function() { # A function implemented by Diethelm Wuertz # FUNCTION: start <- c(1, 1, 1, 1) fun <- function(x) x[1]*x[1]+x[2]*x[2]+2*x[3]*x[3]+x[4]*x[4]-5*x[1]-5*x[2]-21*x[3]+7*x[4] ineqFun <- list( function(x) 8-x[1]*x[1]-x[2]*x[2]-x[3]*x[3]-x[4]*x[4]-x[1]+x[2]-x[3]+x[4], function(x) 10-x[1]*x[1]-2*x[2]*x[2]-x[3]*x[3]-2*x[4]*x[4]+x[1]+x[4], function(x) 5-2*x[1]*x[1]-x[2]*x[2]-x[3]*x[3]-2*x[1]+x[2]+x[4] ) ineqFun.lower <- rep( 0, 3) ineqFun.upper <- rep(10, 3) ans.donlp = donlp2NLP(start, fun, ineqFun = ineqFun, ineqFun.lower = ineqFun.lower, ineqFun.upper = ineqFun.upper) ans.solnp = solnpNLP(start, fun, ineqFun = ineqFun, ineqFun.lower = ineqFun.lower, ineqFun.upper = ineqFun.upper) ans.nlminb = nlminb2NLP(start, fun, ineqFun = ineqFun, ineqFun.lower = ineqFun.lower, ineqFun.upper = ineqFun.upper) result.par = round(rbind( ans.donlp$solution, ans.solnp$solution, ans.nlminb$solution), 3) result.fun = c( fun(ans.donlp$solution), fun(ans.solnp$solution), fun(ans.nlminb$solution)) cbind(result.par, result.fun) } #------------------------------------------------------------------------------- .sharperatioTestNLP <- function() { # A function implemented by Diethelm Wuertz # FUNCTION: dataSet <- data("LPP2005REC", package="timeSeries", envir=environment()) LPP2005REC <- get(dataSet, envir=environment()) ret <- as.matrix(LPP2005REC[,2:7]) Mean <- colMeans(ret) Cov <- cov(ret) start <- rep(1/6, times = 6) fun <- function(x) { return = (Mean %*% x)[[1]] risk = sqrt ( (t(x) %*% Cov %*% x)[[1]] ) -return/risk } par.lower <- rep(0, 6) par.upper <- rep(1, 6) eqFun <- list( function(x) sum(x) ) eqFun.bound = 1 ans.donlp <- donlp2NLP(start, fun, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound ) ans.solnp <- solnpNLP(start, fun, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound) ans.nlminb <- Rnlminb2::nlminb2NLP(start, fun, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound) result.par = round(rbind( ans.donlp$solution, ans.solnp$solution, ans.nlminb$solution), 3) result.fun = c( fun(ans.donlp$solution), fun(ans.solnp$solution), fun(ans.nlminb$solution)) cbind(result.par, result.fun) result.par <- 100*round(rbind( ans.donlp$solution, ans.solnp$solution, ans.nlminb$solution), 4) result.fun <- c( fun(ans.donlp$solution), fun(ans.solnp$solution), fun(ans.nlminb$solution)) cbind(result.par, result.fun) } # ------------------------------------------------------------------------------ .rachevratioTestNLP <- function() { # A function implemented by Diethelm Wuertz # Note: # sonlp2 and nlminb do not converge! # FUNCTION: dataSet <- data("LPP2005REC", package="timeSeries", envir=environment()) LPP2005REC <- get(dataSet, envir=environment()) ret = as.matrix(LPP2005REC[, 2:7]) Mean = colMeans(ret) Cov = cov(ret) set.seed(1953) r = runif(6) start <- r/sum(r) start <- rep(1/6, times = 6) .VaR <- function(x) { quantile(x, probs = 0.05, type = 1) } .CVaR <- function(x) { VaR = .VaR(x) VaR - 0.5 * mean(((VaR-ret) + abs(VaR-ret))) / 0.05 } fun <- function(x) { port = as.vector(ret %*% x) ans = (-.CVaR(-port) / .CVaR(port))[[1]] ans} par.lower = rep(0, 6) par.upper = rep(1, 6) eqFun <- list( function(x) sum(x) ) eqFun.bound = 1 ans.donlp = donlp2NLP(start, fun, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound) ans.solnp = solnpNLP(start, fun, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound) ans.nlminb = nlminb2NLP(start, fun, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound) result.par = 100*round(rbind( ans.donlp$solution, ans.solnp$solution, ans.nlminb$solution), 4) result.fun = c( fun(ans.donlp$solution), fun(ans.solnp$solution), fun(ans.nlminb$solution)) cbind(result.par, result.fun) } #------------------------------------------------------------------------------- .boxmarkowitzTestNLP <- function() { # A function implemented by Diethelm Wuertz # FUNCTION: dataSet <- data("LPP2005REC", package="timeSeries", envir=environment()) LPP2005REC <- get(dataSet, envir=environment()) ret <- 100 * as.matrix(LPP2005REC[, 2:7]) Mean <- colMeans(ret) Cov <- cov(ret) targetReturn <- mean(Mean) start <- rep(1/6, times = 6) objective <- function(x) { risk <- (t(x) %*% Cov %*% x)[[1]] risk } fun <- objective par.lower <- rep(0, 6) par.upper <- rep(1, 6) eqFun <- list( function(x) sum(x), function(x) (Mean %*% x)[[1]] ) eqFun.bound = c(1, targetReturn) ans.donlp = donlp2NLP(start, objective, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound) ans.solnp = solnpNLP(start, objective, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound) ans.nlminb = nlminb2NLP(start, objective, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound) result.par <- 100*round(rbind( ans.donlp$solution, ans.solnp$solution, ans.nlminb$solution), 4) result.fun <- c( fun(ans.donlp$solution), fun(ans.solnp$solution), fun(ans.nlminb$solution)) cbind(result.par, result.fun) } #------------------------------------------------------------------------------- .groupmarkowitzTestNLP <- function() { # A function implemented by Diethelm Wuertz # FUNCTION: dataSet <- data("LPP2005REC", package="timeSeries", envir=environment()) LPP2005REC <- get(dataSet, envir=environment()) ret <- 100 * as.matrix(LPP2005REC[, 2:7]) Mean <- colMeans(ret) Cov <- cov(ret) targetReturn <- mean(Mean) start <- rep(1/6, times = 6) start[1]+start[4] start[2]+start[5]+start[6] # Must be feasible for nlminb !!! start2 <- c(0, 0, 0.3, 0.3, 0, 0.4) start2 <- start/sum(start2) sum(start2) start2[1]+start2[4] start2[2]+start2[5]+start2[6] fun <- function(x) { risk = (t(x) %*% Cov %*% x)[[1]] risk } par.lower <- rep(0, 6) par.upper <- rep(1, 6) eqFun <- list( function(x) sum(x), function(x) (Mean %*% x)[[1]] ) eqFun.bound = c(1, targetReturn) ineqFun <- list( function(x) x[1]+x[4], function(x) x[2]+x[5]+x[6]) ineqFun.lower <- c( 0.3, 0.0) ineqFun.upper <- c( 1.0, 0.6) ans.donlp = donlp2NLP(start, fun, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound, ineqFun = ineqFun, ineqFun.lower = ineqFun.lower, ineqFun.upper = ineqFun.upper) ans.solnp = solnpNLP(start, fun, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound, ineqFun = ineqFun, ineqFun.lower = ineqFun.lower, ineqFun.upper = ineqFun.upper) ans.nlminb = nlminb2NLP(start, fun, par.lower = par.lower, par.upper = par.upper, eqFun = eqFun, eqFun.bound = eqFun.bound, ineqFun = ineqFun, ineqFun.lower = ineqFun.lower, ineqFun.upper = ineqFun.upper) result.par = 100*round(rbind( ans.donlp$solution, ans.solnp$solution, ans.nlminb$solution), 4) result.fun = c( fun(ans.donlp$solution), fun(ans.solnp$solution), fun(ans.nlminb$solution)) cbind(result.par, result.fun) } ################################################################################ fPortfolio/R/solve-Rdonlp2.R0000644000176200001440000001614612505272204015376 0ustar liggesusers # 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 Description. 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: # solveRdonlp2 Portfolio interface to solver Rdonlp2 # .rdonlp2Arguments Returns arguments for solver ################################################################################ solveRdonlp2 <- function(data, spec, constraints) { # Description: # Portfolio interface to solver Rdonlp2 # Arguments; # data - an object of class timeSeries # spec - an object of class fPFOLIOSPEC # constraints - an object of class character # Example: # # FUNCTION: # Settings: Data <- portfolioData(data, spec) nAssets <- getNAssets(Data) mu <- getMu(Data) Sigma <- getSigma(Data) # Compose Arguments for Solver: args <- .rdonlp2Arguments(data, spec, constraints) # Solve Multiassets Portfolio: ans <- Rdonlp2::donlp2( par = args$par, fn = args$fn, par.lower = args$par.lower, par.upper = args$par.upper, A = args$A, lin.lower = args$lin.lower, lin.upper = args$lin.upper, nlin = args$nlin, nlin.lower = args$nlin.lower, nlin.upper = args$nlin.upper, control = Rdonlp2::donlp2Control(), control.fun = function(lst) {return(TRUE)}, env = .GlobalEnv, name = NULL) returnFun <- match.fun(getObjective(spec)[2]) ans$targetReturn <- returnFun(ans$par) riskFun <- match.fun(getObjective(spec)[3]) ans$targetRisk <- riskFun(ans$par) ans$ans <- ans ans$solver <- "solveRdonlp2" ans$objective <- args$fn(ans$par) names(ans$par) <- names(start) ans$weights <- .checkWeights(ans$par) ans$solution <- ans$weights attr(ans$weights, "invest") <- sum(ans$weights) ans$status <- 1 message11 <- "KT-conditions satisfied, " message12 <- "computed correction small" message13 <- "stepsizeselection: x almo" if (substr(ans$message, 1, 25) == message11) ans$status <- 0 if (substr(ans$message, 1, 25) == message12) ans$status <- 0 if (substr(ans$message, 1, 25) == message13) ans$status <- 0 # Return Value: class(ans) <- c("solver", "list") ans } # ------------------------------------------------------------------------------ .rdonlp2Arguments <- function(data, spec, constraints) { # Description: # Create Arguments for Rdonlp2 # Details: # min: fn(x) # subject to: # par.lower <= x <= par.upper # lin.lower <= A %*% x <= lin.upper # nlin.lower <= nlin(x) <= nlin.upper # FUNCTION: DEBUG = FALSE # Settings: Data <- portfolioData(data) nAssets <- getNAssets(Data) mu <- getMu(Data) Sigma <- getSigma(Data) fn <- match.fun(getObjective(spec)[1]) # Box Constrains: par.lower <- minWConstraints(data, spec, constraints) par.upper <- maxWConstraints(data, spec, constraints) if(DEBUG) print(rbind(par.lower, par.upper)) # Linear / Group Constraints: # ... targetReturn may be not defined,then set it to NA if (is.null(getTargetReturn(spec))) setTargetReturn(spec) <- NA # ... has in the first line the return constraint, if NA then ignore it eqsumW <- eqsumWConstraints(data, spec, constraints) if (is.na(eqsumW[1, 1])) eqsumW = eqsumW[-1, , drop= FALSE] Aeqsum <- eqsumW[, -1] aeqsum <- eqsumW[, 1] minsumW <- minsumWConstraints(data, spec, constraints) if (is.null(minsumW)) { Aminsum <- aminsum <- NULL } else { Aminsum <- minsumW[, -1] aminsum <- minsumW[, 1] } maxsumW <- maxsumWConstraints(data, spec, constraints) if (is.null(maxsumW)) { Amaxsum <- amaxsum <- NULL } else { Amaxsum <- maxsumW[, -1] amaxsum <- maxsumW[, 1] } A <- rbind(Aeqsum, Aminsum, Amaxsum) lin.lower <- c(aeqsum, aminsum, rep(-Inf, length(amaxsum))) lin.upper <- c(aeqsum, rep(Inf, length(aminsum)), amaxsum) if(DEBUG) print(cbind(lin.lower, A, lin.upper)) # Nonlinear Constraints - Here Covariance Risk Budgets: nlin <- list() nlin.lower <- NULL nlin.upper <- NULL # Check Constraints Strings for Risk Budgets: # Example: constraints = c("minB[2:3]=0.1", "maxB[3:5]=0.9") validStrings <- c("minB", "maxB") usedStrings <- unique(sort(sub("\\[.*", "", constraints))) checkStrings <- sum(usedStrings %in% validStrings) includeRiskBudgeting <- as.logical(checkStrings) if (DEBUG) print(includeRiskBudgeting) if (includeRiskBudgeting) { # Compose Non-Linear (Cov Risk Budget) Constraints Functions: nlcon <- function(x) { B1 <- as.vector(x %*% Sigma %*% x) B2 <- as.vector(x * Sigma %*% x) B <- B2/B1 B } if(DEBUG) print(nlcon) # Compose non-linear functions now for each asset ... for (I in 1:nAssets) eval( parse(text = paste( "nlcon", I, " = function(x) { nlcon(x)[", I, "] }", sep = "")) ) nlinFunctions <- paste("nlcon", 1:nAssets, sep = "", collapse = ",") nlinFunctions <- paste("list(", nlinFunctions, ")") nlin <- eval( parse(text = nlinFunctions) ) if(DEBUG) print(nlin) # ... and finally Compose Constraints Vectors: nlin.lower <- minBConstraints(data, spec, constraints) nlin.upper <- maxBConstraints(data, spec, constraints) if(DEBUG) print(rbind(nlin.lower, nlin.upper)) } # General non-lin Portfolio Constraints: # ... todo: currently overwrites previous selection nlin <- listFConstraints(data, spec, constraints) if(DEBUG) print(nlin) nlin.lower <- minFConstraints(data, spec, constraints) nlin.upper <- maxFConstraints(data, spec, constraints) if(DEBUG) print(cbind(nlin.lower, nlin.upper)) # Return Value: list( par = rep(1/nAssets, nAssets), fn = fn, par.lower = par.lower, par.upper = par.upper, A = A, lin.lower = lin.lower, lin.upper = lin.upper, nlin = nlin, nlin.lower = nlin.lower, nlin.upper = nlin.upper) } ################################################################################ fPortfolio/R/solve-RshortExact.R0000644000176200001440000001154212323217770016324 0ustar liggesusers # 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 Description. 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: # solveRshortExact Portfolio interface to solver RshortExact # .rshortExactArguments Returns arguments for solver # .rshortExact Wrapper to solver function ################################################################################ solveRshortExact <- function(data, spec, constraints) { # A function implemented by Diethelm Wuertz # Description: # Portfolio interface to solver RshortExact # Details: # If getTargetReturn() is specified we minimze the risk, # if getTargetRisk() is pecified we maximize the risk. # FUNCTION: # Convert Data and Constraints to S4 Objects: Data <- portfolioData(data, spec) data <- getSeries(Data) Sigma <- getSigma(Data) Constraints <- portfolioConstraints(Data, spec, constraints) # Stop if the Target Return is not Defined! optimize <- getOptimize(spec) targetReturn <- getTargetReturn(spec) targetRisk <- getTargetRisk(spec) # Get '.rshortexact' conform arguments: args <- .rshortExactArguments(Data, spec, Constraints) # Solve Portfolio: ans <- .rshortExact( optimize = optimize, C0 = args$C0, a = args$a, b = args$b, c = args$c, d = args$d, Sigma = Sigma, invSigma = args$invSigma, mu = args$mu, targetReturn, targetRisk) # Return Value: class(ans) <- c("solver", "list") ans } # ------------------------------------------------------------------------------ .rshortExactArguments <- function(data, spec, constraints) { # A function implemented by Diethelm Wuertz # Description: # Returns 'shortexact' conform arguments for the solver # FUNCTION: # Data as S4 Objects: Data <- portfolioData(data, spec) data <- getSeries(Data) # Get Specifications: mu <- getMu(Data) Sigma <- getSigma(Data) weights <- getWeights(spec) targetReturn <- getTargetReturn(spec) targetRisk <- getTargetRisk(spec) # Parameter Settings: C0 <- 1 one <- rep(1, times = length(mu)) invSigma <- solve(Sigma) a <- as.numeric(mu %*% invSigma %*% mu) b <- as.numeric(mu %*% invSigma %*% one) c <- as.numeric(one %*% invSigma %*% one) d <- as.numeric(a*c - b^2) # Return Value: list(C0 = C0, a = a, b = b, c = c, d = d, mu = mu, invSigma = invSigma) } ################################################################################ .rshortExact <- function(optimize, C0, a, b, c, d, Sigma, invSigma, mu, targetReturn, targetRisk) { # A function implemented by Diethelm Wuertz # Description: # Analytical 'shortexact' solver function # FUNCTION: # Optimize: if (!is.null(targetReturn)) { if (optimize == "minRisk") { # Compute Target Risk: objective <- targetRisk <- sqrt((c*targetReturn^2 - 2*b*C0*targetReturn + a*C0^2) / d) } else if (optimize == "maxReturn") { # Compute Target Return: aq <- c bq <- -2*b*C0 cq <- a*C0^2 - d*targetRisk^2 objective <- targetReturn <- (-bq + sqrt(bq^2 - 4*aq*cq)) / (2*aq) } } # Compute Weights: if (is.null(targetReturn)) { # global minimum Variance Portfolio: optimize <- "minvariancePortfolio" one <- rep(1, times=length(mu)) weights <- as.vector(invSigma %*% one) / ( one %*% invSigma %*% one ) objective <- t(weights) %*% Sigma %*% weights } else { weights <- as.vector(invSigma %*% ((a-b*mu)*C0 + (c*mu-b)*targetReturn )/d) } weights <- .checkWeights(weights) # Return Value: list( type = "MV", solver = "solveRshortExact", optim = NA, solution = weights, weights = weights, targetReturn = targetReturn, targetRisk = targetRisk, objective = objective, status = 0, message = optimize) } ################################################################################ fPortfolio/R/risk-surfaceRisk.R0000644000176200001440000003424512323217770016164 0ustar liggesusers # 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: # markowitzHull Hull for a long-only Markowitz portfolio # feasibleGrid Square grid on top of the feasible set # bestDiversification Diversified portfolios on top of the feasible set # riskSurface Risk values on top of the feasible set # surfacePlot Risk Suface Plot for a Markowitz portfolio # FUNCTION: DESCRIPTION: # .scaledColors Quantile color scaling ################################################################################ markowitzHull <- function (data, nFrontierPoints=50) { # Description: # Returns the Hull for a long-only Markowitz portfolio # Arguments: # data - an object of class 'timeSeries' # Example: # hull <- markowitzHull(100*LPP2005.RET[, 1:6], nFrontierPoints=11) # plot(hull[[1]], type="n"); polygon(hull[[1]], col="grey") # FUNCTION: # Check: stopifnot(is.timeSeries(data)) # Compute Frontier and Minimum Variance Locus: Spec <- portfolioSpec() setNFrontierPoints(Spec) <- nFrontierPoints frontier <- portfolioFrontier(data, spec=Spec) Risks <- risks <- frontierPoints(frontier)[, 1] Returns <- frontierPoints(frontier)[, 2] # Compute Maximum Variance Locus - Pairwise Assets Approach: N <- ncol(data) for (i in 1:(N - 1)) for (j in (i + 1):N) { Data <- data[, c(i, j)] ans <- portfolioFrontier(Data, spec=Spec) coord <- frontierPoints(ans) nextFrontier <- approx(coord[, 2], coord[, 1], xout = Returns)$y naIndex <- which(is.na(nextFrontier)) nextFrontier[naIndex] <- Risks[naIndex] risks <- rbind(risks, nextFrontier) } # Hull: targetReturn <- Returns minTargetRisk <- Risks maxTargetRisk <- colMaxs(risks) hull <- cbind( targetReturn = Returns, minTargetRisk = Risks, maxTargetRisk = colMaxs(risks)) # Polygon: polygon <- cbind( c(minTargetRisk, rev(maxTargetRisk)[-1]), c(targetReturn, rev(targetReturn)[-1]) ) rownames(polygon) <- 1:nrow(polygon) colnames(polygon) <- c("targetRisk", "targetReturn") # Return Value: ans <- polygon attr(ans, "data") <- data attr(ans, "hull") <- hull attr(ans, "frontier") <- frontier invisible(ans) } # ----------------------------------------------------------------------------- feasibleGrid <- function(hull, trace=FALSE) { # Description: # Returns best diversified portfolios on top of the feasible Set # Arguments: # hull - an object as returned from the function markowitzHull # trace - a logical, should the function be traced ? # Example: # hull <- markowitzHull(100*LPP2005.RET[, 1:6], nFrontierPoints=21) # grid <- feasibleGrid(hull, TRUE) # FUNCTION: # Data: polygon <- hull data <- attr(hull, "data") hull <- attr(hull, "hull") # Trace Hull: if (trace) { plot(polygon) box(col="white") polygon(polygon, col="grey") grid() } # Settings: minRisks <- as.vector(hull[, 2]) maxRisks <- as.vector(hull[, 3]) minRisk <- min(minRisks) maxRisk <- max(maxRisks) targetRisks <- seq(minRisk, maxRisk, length = length(minRisks)) targetReturns <- as.vector(hull[, 1]) N <- length(targetReturns) # Get Weights on Grid: Grid <- matrix(NA, ncol=N, nrow=N) offset <- diff(range(targetRisks[1:2]))/2 for (i in 1:N) { targetReturn <- targetReturns[i] for (j in 1:N) { targetRisk <- targetRisks[j] + offset if (targetRisk >= minRisks[i] && targetRisk <= maxRisks[i]) { Grid[j, i] <- 1 if (trace) points(targetRisk, targetReturn, pch=19) } } } # Return Value: ans <- list(x=targetRisks, y=targetReturns, z=Grid) attr(ans, "data") <- data attr(ans, "polygon") <- polygon attr(ans, "hull") <- hull class(ans) <- c("feasibleGrid", "list") invisible(ans) } # ----------------------------------------------------------------------------- bestDiversification <- function(grid, FUN="var", trace=FALSE) { # Description: # Returns best diversified portfolios on top of the feasible Set # Arguments: # data - an object of class 'timeSeries' # grid - an object of class 'feasibleGrid' # as returned by the function feasibleGid() # FUN - the divesification function, a function with # with the weights as its first argument # trace - a logical, should the function be traced ? # Example: # data <- 100*LPP2005.RET[, 1:6] # hull <- makowitzHull(data, nFrontierPoints=21) # grid <- feasibleGrid(hull, trace=TRUE) # diversification <- bestDiversification(grid, FUN=var) # FUNCTION: # Data: data <- attr(grid, "data") polygon <- attr(grid, "polygon") # Settings: targetRisks <- grid$x targetReturns <- grid$y Grid <- grid$z N <- length(targetRisks) objectiveFun <- match.fun(FUN) nAssets <- ncol(data) MEAN <- colMeans(data) COV <- cov(data) # Trace: if(trace) { image(grid, col="lightgrey") box(col="white") grid() } # Get Weights on Grid: Weights <- Coord <- NULL Objective <- NA * Grid Start <- rep(1/nAssets, times = nAssets) for (i in 1:N) { targetReturn <- targetReturns[i] for (j in 1:N) { targetRisk <- targetRisks[j] if (!is.na(Grid[j,i])) { ans <- donlp2NLP( start = Start, objective <- objectiveFun, par.lower = rep(0, times = nAssets), par.upper = rep(1, times = nAssets), eqA = rbind(rep(1, times = nAssets), MEAN), eqA.bound = c(1, targetReturn), eqFun = list(function(x) sqrt(t(x) %*% COV %*% x)), eqFun.bound = targetRisk) Weights <- rbind(Weights, ans$solution) Objective[j,i] <- objectiveFun(ans$solution) Coord <- rbind(Coord, c(j,i)) if(trace) { points(targetRisk, targetReturn, pch=19, cex=0.7) } } } } # Return Value: ans <- list(x=targetRisks, y=targetReturns, z=Objective) attr(ans, "data") <- data attr(ans, "polygon") <- polygon attr(ans, "weights") <- cbind(Coord, Weights) class(ans) <- c("bestDiversification", "list") invisible(ans) } # ----------------------------------------------------------------------------- riskSurface <- function(diversification, FUN=NULL, ...) { # Description: # Returns a risk values on top of the feasible set # Arguments: # diversification - an object of class class 'bestDiversification' # as returned by the function bestDiversification() # FUN - risk surface function having arguments # FUN(data, weights, ...) # ... - optional arguments passed to FUN # Example: # data <- 100*LPP2005.RET[, 1:6] # hull <- markowitzHull(data, nFrontierPoints=21) # grid <- feasibleGrid(hull, TRUE) # diversification <- bestDiversification(grid) # surface <- riskSurface(diversification) # FUNCTION: # Data and Weighs: data <- attr(diversification, "data") weights <- attr(diversification, "weights") polygon <- attr(diversification, "polygon") # Risk Function: if (is.null(FUN)) FUN <- function(data, weights, ...) var(weights) fun <- match.fun(FUN) # Grid: Coord <- attr(diversification, "weights")[, 1:2] Weights <- attr(diversification, "weights")[, -(1:2)] N <- nrow(Coord) x <- diversification$x y <- diversification$y z <- diversification$z # Risk Surface: Value <- NA * z for (k in 1:N) { Value[Coord[k, 1], Coord[k, 2]] <- fun(data, Weights[k, ], ...) } # Return Value: ans <- list(x=x, y=y, z=Value) attr(ans, "data") <- data attr(ans, "weights") <- weights attr(ans, "polygon") <- polygon class(ans) <- c("riskSurface", "list") ans } ############################################################################### surfacePlot <- function(surface, type=c("image", "filled.contour"), nlevels=11, palette=topo.colors, addContour=TRUE, addGrid=TRUE, addHull=TRUE, addAssets=TRUE, ...) { # Description: # Arguments: # surface - an object of class 'riskSurface' as # returned by the function riskSurface() # type - a character string denoting the plot type, # by default "image, alternatively "filledContour" # nlevels - integer, the number of countour levels # palette - color palette function # addCountour - a logical flag, should contour lines be added ? # addCountour - a logical flag, should contour lines be added ? # addGrid - a logical flag, should grid lines be added ? # addAssets - a logical flag, should assets points be added ? # ... - optional arguments passed to the function title() # Example: # data <- 100*LPP2005.RET[, 1:6] # hull <- markowitzHull(data) # grid <- feasibleGrid(hull, trace=TRUE) # diversification <- bestDiversification(grid, trace=TRUE) # surface <- riskSurface(diversification) # surfacePlot(surface) # surfacePlot(surface, type="f"); # title("Weights Diversification", xlab="Risk", ylab="Return") # FUNCTION: # Surface Points; x <- surface$x y <- surface$y z <- surface$z # Quantile Levels: colors <- .scaledColors(surface, palette=palette, nlevels=nlevels) levels <- colors$levels palette <- colors$palette # Contour overlayed Image Ranges: yOffset <- 0.025*diff(range(y)) yLim <- c(min(y)-yOffset, max(y)+yOffset) xOffset <- 0.1*diff(range(x)) xLim <- c(min(x)-xOffset/4, max(x)+xOffset) # Select Type: type <- match.arg(type) if (type == "image") { image(x, y, z, xlim=xLim, ylim=yLim, xlab="", ylab="", col=palette) box(col="white") } else if (type == "filled.contour") { image(x, y, z, xlim=xLim, ylim=yLim, xlab="", ylab="", col="white") # DW # .Internal(filledcontour()) no longer works on 3.0. # .Internal(filledcontour( # as.double(x), as.double(y), z, # as.double(levels), col = palette)) # Use instead: graphics::.filled.contour( x = as.double(x), y = as.double(y), z = z, levels = as.double(levels), col = palette) box(col="white") } # Add Contour Lines: if(addContour) contour(x, y, z, add=TRUE, levels=signif(levels, 3)) # Add Hull: if(addHull) { hull <- attr(surface, "polygon") lines(hull, lwd=2, col="darkgreen") } # Add Grid: if(addGrid) grid() # Add Optional Lables: title(...) # Add Legend: cs <- cumsum(levels) css <- ( cs - min(cs) ) / diff(range(cs)) css <- 0.95 * css + 0.025 cy <- min(y) + css * diff(range(y)) cx <- rep(xLim[2]-0.1 * xOffset, length(cy)) lines(cx, cy, lwd=3) for (i in 1:(nlevels-1)) lines(c(cx[i], cx[i+1]), c(cy[i], cy[i+1]), lwd=3, col=palette[i]) for (i in 1:nlevels) points(cx[i], cy[i], pch=16, cex=1.1, col="black") textOffset <- c(-0.0005, 0.0005, 0.0008, 0.0008, rep(0, 7)) text(cx, cy+textOffset, as.character(signif(levels, 2)), pos=2, cex=0.8) # Add Assets: if (addAssets) { frontier <- portfolioFrontier(data) pointCex <- 2.5 textCex <- 0.5 xy <- minvariancePoints(frontier, auto=FALSE, pch=19, cex=pointCex, col = "red") text(xy[, 1], xy[, 2], "MVP", font=2, col="white", cex=textCex) xy <- tangencyPoints(frontier, auto=FALSE, pch=19, cex=pointCex, col="orange") text(xy[, 1], xy[, 2], "TGP", font=2, col="white", cex=textCex) xy <- equalWeightsPoints(frontier, auto=FALSE, pch=19, cex=pointCex, col="brown") text(xy[, 1], xy[, 2], "EWP", font=2, col="white", cex=textCex) xy <- singleAssetPoints(frontier, auto=FALSE, pch=19, cex=pointCex, col="black", lwd=2) text(xy[, 1], xy[, 2], rownames(xy), font=2, col="white", cex=textCex) } # Return Value: invisible(list(surface=surface, levels=levels)) } # ------------------------------------------------------------------------------ .scaledColors <- function(surface, palette=topo.colors, nlevels=11) { # Description: # scales a color palette # Arguments: # surface - a list with x,y positions and z values # palette - color palette function # bin - quantile bin width of contour levels # FUNCTION: # Extract Surface Risk Values: Z <- as.vector(surface$z) # Scale by Equidistant Quantiles: levels <- quantile(Z, probs=seq(from=0, to=1, length=nlevels), na.rm=TRUE) # Compose Color Palette: palette <- palette(nlevels-1) # Return Value: list(palette=palette, levels=levels) } ############################################################################### fPortfolio/R/backtest-setBacktestSpec.R0000644000176200001440000001424512323217770017620 0ustar liggesusers # 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 Description. 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: # setWindowsFun<- Sets name of rolling windows function # setWindowsParams<- Sets additional parameters to windows function # setWindowsHorizon<- Sets horizon of the rolling window # FUNCTION: DESCRIPTION: # setStrategyFun<- Sets name of portfolio strategy function # setStrategyParams<- Sets additional parameters to strategy function # FUNCTION: DESCRIPTION: # setSmootherFun<- Sets name of weights smoothing function # setSmootherParams<- Sets additional parameters to smoother function # setSmootherLambda<- Sets lambda for EMA smoothing # setSmootherDoubleSmoothing<- Sets double ema setting, logical # setSmootherInitialWeights<- Sets initial weights of the portfolio # setSmootherSkip<- Sets number of months to skip starting ################################################################################ "setWindowsFun<-" <- function(backtest, value) { # A function implemented by William Chen # Description: # Sets name of rolling windows function # Arguments: # FUNCTION: # Set Value: backtest@windows$windows <- value # Return Value: backtest } # ------------------------------------------------------------------------------ "setWindowsParams<-" <- function(backtest, value) { # A function implemented by William Chen # Description: # Sets additional parameters to windows function # Arguments: # FUNCTION: # Set Value: backtest@windows$params <- value # Return Value: backtest } # ------------------------------------------------------------------------------ "setWindowsHorizon<-" <- function(backtest, value) { # A function implemented by William Chen # Description: # Sets horizon of the rolling window # Arguments: # FUNCTION: # Set Value: backtest@windows$params$horizon <- value # Return Value: backtest } # ------------------------------------------------------------------------------ "setStrategyFun<-" <- function(backtest, value) { # A function implemented by William Chen # Description: # Sets portfolio strategy function # Arguments: # FUNCTION: # Set Value: backtest@strategy$strategy <- value # Return Value: backtest } # ------------------------------------------------------------------------------ "setStrategyParams<-" <- function(backtest, value) { # A function implemented by William Chen # Description: # Sets additional parameters to strategy function # Arguments: # FUNCTION: # Set Value: backtest@strategy$params <- value # Return Value: backtest } # ------------------------------------------------------------------------------ "setSmootherFun<-" <- function(backtest, value) { # A function implemented by William Chen # Description: # Sets name of weights smoothing function # Arguments: # FUNCTION: # Set Value: backtest@smoother$smoother <- value # Return Value: backtest } # ------------------------------------------------------------------------------ "setSmootherParams<-" <- function(backtest, value) { # A function implemented by William Chen # Description: # Sets additional parameters to smoother function # Arguments: # FUNCTION: # Set Value: backtest@smoother$params <- value # Return Value: backtest } # ------------------------------------------------------------------------------ "setSmootherLambda<-" <- function(backtest, value) { # A function implemented by William Chen # Description: # Sets lambda parameter for EMA smoothing # Arguments: # FUNCTION: # Set Value: backtest@smoother$params$lambda <- value # Return Value: backtest } # ------------------------------------------------------------------------------ "setSmootherDoubleSmoothing<-" <- function(backtest, value) { # A function implemented by William Chen # Description: # Sets double EMA setting, TRUE or FALSE, a logical # Arguments: # FUNCTION: # Set Value: backtest@smoother$params$doubleSmoothing <- value # Return Value: backtest } # ------------------------------------------------------------------------------ "setSmootherInitialWeights<-" <- function(backtest, value) { # A function implemented by William Chen # Description: # Sets initial weights of the portfolio # Arguments: # FUNCTION: # Set Value: backtest@smoother$params$initialWeights <- value # Return Value: backtest } # ------------------------------------------------------------------------------ "setSmootherSkip<-" <- function(backtest, value) { # A function implemented by William Chen # Description: # Sets number of months to skip starting values # Arguments: # FUNCTION: # Set Value: backtest@smoother$params$skip <- value # Return Value: backtest } ################################################################################ fPortfolio/R/mathprogQP-kestrel.R0000644000176200001440000001455212323217770016465 0ustar liggesusers # 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: # rkestrelQP Rmetrics Interface for AMPL/KESTREL QP solvers # kestrelQP Convenience wrapper for AMPL/KESTREL QP solvers # kestrelQPControl Control parameter list ############################################################################### rkestrelQP <- function(objective, lower=0, upper=1, linCons, control=list()) { # A function implemented by Diethelm Wuertz # Description: # Rmetrics Interface for AMPL QP solvers # Arguments: # objective - list(dvec=NULL, Dmat = NULL) # FUNCTION: # Control List: ctrl <- kestrelQPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl # Controls: project <- control$project solver <- control$solver inf <- control$inf trace <- control$trace # General Settings: dvec <- objective$dvec Dmat <- objective$Dmat obj <- rbind(dvec, Dmat) # Box Constraints: replicate <- function(x, n) if(length(x) == 1) rep(x, n) else x n <- ncol(obj) x_L <- replicate(lower, n) x_U <- replicate(upper, n) x_L[is.infinite(x_L)] <- inf*sign(x_L[is.infinite(x_L)]) x_U[is.infinite(x_U)] <- inf*sign(x_U[is.infinite(x_U)]) # Linear Constraints: A <- linCons[[1]] m <- nrow(A) b_L <- replicate(linCons[[2]], m) b_U <- replicate(linCons[[3]], m) b_L[is.infinite(b_L)] <- inf*sign(b_L[is.infinite(b_L)]) b_U[is.infinite(b_U)] <- inf*sign(b_U[is.infinite(b_U)]) # Optimize Portfolio: value <- kestrelQP(objective, x_L, x_U, A, b_L, b_U, control) # Return Value: value } ############################################################################### kestrelQP <- function( objective=list(dvec=NULL, Dmat=NULL), x_L=NULL, x_U=NULL, A=NULL, b_L=NULL, b_U=NULL, control=list(), ...) { # A function implemented by Diethelm Wuertz # Description: # Convenience wrapper for AMPL QP solvers # Arguments: # objective - list(dvec=NULL, Dmat = NULL) # FUNCTION: # Control List: ctrl <- kestrelQPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl # Control Parameters: project <- control$project solver <- control$solver inf <- control$inf trace <- control$trace # Solver Settings: c <- objective$dvec F <- objective$Dmat obj <- rbind(c, F) n <- ncol(obj) m <- nrow(A) # Assign QP Model: .qpAssign(project, c, F, x_L, x_U, A, b_L, b_U, trace=FALSE) # Write AMPL RUN File: amplRunOpen(project) run <- c( paste("reset ;"), paste("option solver kestrel;"), paste("option kestrel_options 'solver=", solver, "' ;", sep=""), paste("model ", project, ".mod ;", sep = ""), paste("data ", project, ".dat ;", sep = ""), paste("solve ;"), paste("display x > ", project, ".txt ;", sep = ""), paste("display solve_result_num > ", project, ".txt ;", sep = ""), paste("display solve_result > ", project, ".txt ;", sep = ""), paste("display solve_message > ", project, ".txt ;", sep = ""), paste("exit ;") ) amplRunAdd(run, project) if (trace) amplRunShow(project) # Run AMPL: command <- paste("ampl -t -vs", paste(project, "run", sep=".")) solve <- system(command, intern=TRUE) # Read AMPL Output File: file <- paste(project, "txt", sep = ".") out <- scan(file, what = character(0), sep="\n", quiet=TRUE) # Get Weights: Index <- (grep(";", out) - 1)[1] splits <- strsplit(paste(out[2:Index], collapse=" "), " ")[[1]] solution <- as.numeric(splits[splits != ""])[seq(2, 2*n, by=2)] Index <- as.numeric(splits[splits != ""])[seq(1, 2*n, by=2)] solution[Index] <- solution # Get Status: status <- strsplit(out[grep("solve_result", out)], split=" ") statusCode <- status[[1]][3] statusMessage <- status[[2]][3] # Get Solver Message: Index <- grep("solve_message", out):length(out) message <- out[Index] # Version: version <- system(paste(solver, "-v"), intern=TRUE) # Compose Results into a List: objective <- (c %*% solution + 0.5 * solution %*% F %*% solution)[[1, 1]] # Return Value: model <- capture.output(amplModelShow(project)) run <- capture.output(amplRunShow(project)) value = list( opt = list(solve=solve, model=model, run=run, out=out), solution = solution, objective = objective, status = statusCode, message = statusMessage, solver = paste("AMPL", solver), version = version) class(value) <- c("solver", "list") value } # ----------------------------------------------------------------------------- kestrelQPControl <- function(solver="loqo", project="kestrel", inf=1e12, trace=FALSE) { # A function implemented by Diethelm Wuertz # Description: # Returns AMPL/KESTREL QP control parameter list # FUNCTION: # Control Parameter: control <- list( solver=solver, project=project, inf=inf, trace=trace) # Return Value: control } ############################################################################### fPortfolio/R/mathprogNLP-nlminb2.R0000644000176200001440000002155012410277312016455 0ustar liggesusers # 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: # rnlminb2NLP Rmetrics Interface for NLMINB2 LP solvers # nlminb2NLP Convenience wrapper for NLMINB2 LP solvers # nlminb2Control NLMINB2 LP control parameter list # rnlminb2 Synonyme name for Rnlminb2::nlminb2 function ################################################################################ rnlminb2NLP <- function(start, objective, lower=0, upper=1, linCons, funCons, control=list()) { # A function implemented by Diethelm Wuertz # Description: # Function wrapper for solver nlminb2() # FUNCTION: # Update Control List: ctrl <- nlminb2NLPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl BIG <- 1e6 N <- length(start) # Box Constraints: if(length(lower) == 1) { par.lower <- rep(lower, N) } else { par.lower <- lower } if(length(upper) == 1) { par.upper <- rep(upper, N) } else { par.upper <- upper } par.lower[is.infinite(par.lower)] <- BIG*sign(par.lower[is.infinite(par.lower)]) par.upper[is.infinite(par.upper)] <- BIG*sign(par.upper[is.infinite(par.upper)]) # Linear Constraints: if(missing(linCons)) { eqA <- ineqA <- NULL eqA.bound <- ineqA.lower <- ineqA.upper <- NULL } else { mat <- linCons[[1]] lower <- linCons[[2]] upper <- linCons[[3]] if(length(lower) == 1) { lower <- rep(lower, N) } else { lower <- lower } if(length(upper) == 1) { upper <- rep(upper, N) } else { upper <- upper } lower[is.infinite(lower)] <- BIG*sign(lower[is.infinite(lower)]) upper[is.infinite(upper)] <- BIG*sign(upper[is.infinite(upper)]) eqIndex <- which(lower == upper) ineqIndex <- which(lower != upper) if (length(eqIndex) == 0) { eqA <- NULL eqA.bound <- NULL } else { eqA <- mat[eqIndex, ] eqA.bound <- lower[eqIndex] } if (length(ineqIndex) == 0) { ineqA <- NULL ineqA.lower <- NULL ineqA.upper <- NULL } else { ineqA <- mat[ineqIndex, ] ineqA.lower <- lower[ineqIndex] ineqA.upper <- upper[ineqIndex] } } # Nonlinear Constraints: if(missing(funCons)) { eqFun <- ineqFun <- list() eqFun.bound <- ineqFun.lower <- ineqFun.upper <- NULL } else { fun <- funCons[[1]] lower <- funCons[[2]] upper <- funCons[[3]] eqIndex <- which(lower == upper) ineqIndex <- which(lower != upper) if (length(eqIndex) == 0) { eqFun <- list() eqFun.boud <- NULL } else { eqFun <- fun[eqIndex] eqFun.bound <- lower[eqIndex] } if (length(ineqIndex) == 0) { ineqFun <- list() ineqFun.lower <- NULL ineqFun.upper <- NULL } else { ineqFun <- fun[ineqIndex] ineqFun.lower <- lower[ineqIndex] ineqFun.upper <- upper[ineqIndex] } } # Optimize Portfolio: optim <- nlminb2NLP( start = start, objective = objective, par.lower = par.lower, par.upper = par.upper, eqA = eqA, eqA.bound = eqA.bound, ineqA = ineqA, ineqA.lower = ineqA.lower, ineqA.upper = ineqA.upper, eqFun = eqFun, eqFun.bound = eqFun.bound, ineqFun = ineqFun, ineqFun.lower = ineqFun.lower, ineqFun.upper = ineqFun.upper, control = control) # Return Value: value <- list( opt = optim, solution = optim$solution, objective = objective(optim$solution), status = optim$status, message = optim$message, solver = "nlminb2NLP") class(value) <- c("solver", "list") value } ############################################################################### nlminb2NLP <- function( start, objective, par.lower = NULL, par.upper = NULL, eqA = NULL, eqA.bound = NULL, ineqA = NULL, ineqA.lower = NULL, ineqA.upper = NULL, eqFun = list(), eqFun.bound = NULL, ineqFun = list(), ineqFun.lower = NULL, ineqFun.upper = NULL, control = list()) { # A function implemented by Diethelm Wuertz # Description: # Function wrapper for solver nlminb2() # FUNCTION: # Environment: env <- .GlobalEnv # Update Control List: ctrl <- nlminb2NLPControl() if (length(control) > 0) for (name in names(control)) ctrl[name] = control[name] control <- ctrl N <- length(start) # Set Box Constraints: if (is.null(par.lower)) par.lower <- -Inf if (is.null(par.upper)) par.upper <- +Inf if (length(par.lower) == 1) par.lower <- rep(par.lower, N) if (length(par.upper) == 1) par.upper <- rep(par.upper, N) # Set Linear and Function Equality Constraints: if (!is.null(eqA) || length(eqFun) > 0) { eqfun <- function(x) { ans <- NULL if(!is.null(eqA)) { ans <- c(ans, eqA %*% x - eqA.bound) } if (length(eqFun) > 0) for (i in 1:length(eqFun)) ans <- c(ans, eqFun[[i]](x) - eqFun.bound[i]) return(as.double(eval(ans, env))) } } else { eqfun <- NULL } # Set Linear and Function Inequality Constraints: if (!is.null(ineqA) || length(ineqFun) > 0) { leqfun <- function(x) { ans <- NULL if(!is.null(ineqA)) ans <- c(ans, +ineqA %*% x - ineqA.upper) if(!is.null(ineqA)) ans <- c(ans, -ineqA %*% x + ineqA.lower) if (length(ineqFun) > 0) for (i in 1:length(ineqFun)) ans <- c(ans, +ineqFun[[i]](x) - ineqFun.upper[i]) if (length(ineqFun) > 0) for (i in 1:length(ineqFun)) ans <- c(ans, -ineqFun[[i]](x) + ineqFun.lower[i]) return(as.double(eval(ans, env))) } } else { leqfun <- NULL } # Optimize Portfolio: optim <- rnlminb2( start = start, objective = objective, eqFun = eqfun, leqFun = leqfun, lower = par.lower, upper = par.upper, gradient = NULL, hessian = NULL, control = control, env = env) names(optim$par) <- names(start) # Return Value: value <- list( opt = optim, solution = optim$par, objective = objective(optim$par)[[1]], convergence = optim$convergence, message = optim$message, solver = "nlminb2NLP") class(value) <- c("solver", "list") # Return Value: value } ################################################################################ rnlminb2 <- function(...) { Rnlminb2::nlminb2(...) } ################################################################################ nlminb2NLPControl <- function(eval.max = 500, iter.max = 400, trace = 0, abs.tol = 1e-20, rel.tol = 1e-10, x.tol = 1.5e-08, step.min = 2.2e-14, scale = 1, R = 1, beta.tol = 1e-20) #, step.beta = 20) { # A function implemented by Diethelm Wuertz # FUNCTION: # Control Parameters: ans <- list(eval.max = eval.max, iter.max = iter.max, trace = trace, abs.tol = abs.tol, rel.tol = rel.tol, x.tol = x.tol, step.min = step.min, scale = scale, R = R, beta.tol = beta.tol) #, step.beta = step.beta) # Return Value: ans } ############################################################################### fPortfolio/R/portfolio-efficientFrontier.R0000644000176200001440000002675312323217770020422 0ustar liggesusers ################################################################################ # FUNCTION: DESCRIPTION: # portfolioFrontier Returns the efficient frontier of a portfolio # DEPRECATED: # .portfolioFrontier old/alt Version ################################################################################ portfolioFrontier <- function(data, spec = portfolioSpec(), constraints = "LongOnly", include.mvl = TRUE, title = NULL, description = NULL) { # A function implemented by Rmetrics # Description: # Computes the efficient frontier of a portfolio # Arguments: # data - a rectangular object of assets # spec - an object of class 'fPFOLIOSPEC' # constraints - a character vector or NULL # include.mvl - a logical flag, should the minimum variance # locus be added to the plot? # Example: # data = as.timeSeries(data(LPP2005REC))[, 1:6] # spec = portfolioSpec() # constraints = c("minW[3:4]=0.1", "maxW[5:6]=0.8", "minsumW[1:3]=0.2", "maxsumW[c(2,4)]=0.8") # portfolioFrontier(data, spec, constraints) # FUNCTION: DEBUG <- TRUE # Match Spec Versus Constraints? .checkSpecVsConstraints(spec, constraints) # Transform Data and Constraints: Data <- portfolioData(data, spec) # Optimize in N Points the Portfolios along the frontier: nFrontierPoints = getNFrontierPoints(spec) # The Target Return - get problems in the first and last point for # long only portfolios, just move a little bit aside ... mu <- getMu(Data) targetReturns <- seq(min(mu), max(mu), length = nFrontierPoints) eps <- .Machine$double.eps^0.5 targetReturns[1] = targetReturns[1]*(1+eps) targetReturns[nFrontierPoints] = targetReturns[nFrontierPoints]*(1-eps) # How to Go Along the Frontier ? # The Idea is to start from the minvariance portfolio and to explore # the efficient frontier and the minimum variance locus starting from # this point ... # Then we stop when the status flag fails ... # Compute minvariancePortfolio: mvPortfolio <- minvariancePortfolio(Data, spec, constraints) mvReturn <- getTargetReturn(mvPortfolio@portfolio)["mean"] minIndex <- which.min(abs(mvReturn-targetReturns)) # Upper Frontier Part: Status <- 0 IDX <- minIndex weights <- targetReturn <- targetRisk <- covRiskBudgets <- maxDD <- NULL while (Status == 0 & IDX <= nFrontierPoints) { # Add Target Return to Specification: setTargetReturn(spec) = targetReturns[IDX] # Optimize Efficient Portfolio: ans = try(efficientPortfolio(Data, spec, constraints), silent = TRUE) if (class(ans) == "try-error") { Status = 1 } else { portfolio = ans Status = getStatus(portfolio) } if (Status == 0) { Weights = getWeights(portfolio) weights = rbind(weights, Weights) targetReturn = rbind(targetReturn, getTargetReturn(portfolio@portfolio)) targetRisk = rbind(targetRisk, getTargetRisk(portfolio@portfolio)) covRiskBudgets = rbind(covRiskBudgets, getCovRiskBudgets(portfolio@portfolio)) ### maxDD = rbind(maxDD, ### min(drawdowns(pfolioReturn(data/100, as.vector(Weights)))) ) } IDX = IDX + 1 } # Lower Min Variance Locus: if (include.mvl) { if (minIndex > 1) { weights2 = targetReturn2 = targetRisk2 = covRiskBudgets2 = maxDD2 = NULL Status = 0 IDX = minIndex - 1 while (Status == 0 & IDX > 0) { # Add Target Return to Specification: setTargetReturn(spec) = targetReturns[IDX] # Optimize Efficient Portfolio: ans = try(efficientPortfolio(Data, spec, constraints), silent = TRUE) if (class(ans) == "try-error") { Status = 1 } else { portfolio = ans Status = getStatus(portfolio) } if (Status == 0) { Weights2 = getWeights(portfolio) weights2 = rbind(Weights2, weights2) targetReturn2 = rbind(getTargetReturn(portfolio@portfolio), targetReturn2) targetRisk2 = rbind(getTargetRisk(portfolio@portfolio), targetRisk2) covRiskBudgets2 = rbind(getCovRiskBudgets(portfolio@portfolio), covRiskBudgets2) ### maxDD2 = rbind(maxDD2, min(drawdowns( ### pfolioReturn(data/100, as.vector(Weights2)))) ) } IDX = IDX - 1 } weights = rbind(weights2, weights) targetReturn = rbind(targetReturn2, targetReturn) targetRisk = rbind(targetRisk2, targetRisk) covRiskBudgets = rbind(covRiskBudgets2, covRiskBudgets) ### maxDD = rbind(maxDD2, maxDD) } } colnames(weights) <- names(getMu(Data)) rownames(weights) <- NULL rownames(covRiskBudgets) <- NULL rownames(targetReturn) <- NULL rownames(targetRisk) <- NULL # Check: Did we find points on the frontier? if (is.null(weights)) { portfolio <- mvPortfolio ### portfolio@portfolio$maxDD = min(drawdowns( ### pfolioReturn(data/100, as.vector(getWeights(mvPortfolio))))) return(portfolio) } # Reset Target Return: setTargetReturn(spec) <- NULL # Call: portfolio@call <- match.call() # Compose Portfolio: portfolio@portfolio <- new("fPFOLIOVAL", portfolio = list( weights = weights, covRiskBudgets = covRiskBudgets, targetReturn = targetReturn, targetRisk = targetRisk, targetAlpha = getAlpha(spec), minriskPortfolio = mvPortfolio, status = 0)) ### portfolio@portfolio$maxDD = maxDD # Update Title portfolio@title = "Portfolio Frontier" # Return Value: portfolio } ################################################################################ # DEPRECATED .portfolioFrontier <- function(data, spec = portfolioSpec(), constraints = "LongOnly", include.mvl = TRUE, title = NULL, description = NULL) { # A function implemented by Rmetrics # Description: # Computes the efficient frontier of a portfolio # Arguments: # data - a rectangular object of assets # spec - an object of class 'fPFOLIOSPEC' # constraints - a character vector or NULL # Example: # data = as.timeSeries(data(LPP2005REC))[, 1:6] # spec = portfolioSpec() # constraints = c("minW[3:4]=0.1", "maxW[5:6]=0.8", "minsumW[1:3]=0.2", "maxsumW[c(2,4)]=0.8") # portfolioFrontier(data, spec, constraints) # FUNCTION: DEBUG = TRUE # Match Spec Versus Constraints? .checkSpecVsConstraints(spec, constraints) # Transform Data and Constraints: Data = portfolioData(data, spec) data <- getSeries(Data) # Optimize in N Points the Portfolios along the frontier: nFrontierPoints = getNFrontierPoints(spec) # The Target Return - get problems in the first and last point for # long only portfolios, just move a little bit aside ... mu = getMu(Data) targetReturns <- seq(min(mu), max(mu), length = nFrontierPoints) eps = .Machine$double.eps^0.5 targetReturns[1] = targetReturns[1]*(1+eps) targetReturns[nFrontierPoints] = targetReturns[nFrontierPoints]*(1-eps) # How to Go Along the Frontier ? # The Idea is to start from the minvariance portfolio and to explore # the efficient frontier and the minimum variance locus starting from # this point ... # Then we stop when the status flag fails ... # Compute minvariancePortfolio: mvPortfolio = minvariancePortfolio(Data, spec, constraints) mvReturn = getTargetReturn(mvPortfolio)[, "mean"] minIndex = which.min(abs(mvReturn-targetReturns)) # Upper Frontier Part: Status = 0 IDX = minIndex weights = targetReturn = targetRisk = covRiskBudgets = maxDD = NULL while (Status == 0 & IDX <= nFrontierPoints) { # Add Target Return to Specification: setTargetReturn(spec) = targetReturns[IDX] # Optimize Efficient Portfolio: ans = try(efficientPortfolio(Data, spec, constraints), silent = TRUE) if (class(ans) == "try-error") { Status = 1 } else { portfolio = ans Status = getStatus(portfolio) } if (Status == 0) { Weights = getWeights(portfolio) weights = rbind(weights, Weights) targetReturn = rbind(targetReturn, getTargetReturn(portfolio)) targetRisk = rbind(targetRisk, getTargetRisk(portfolio)) covRiskBudgets = rbind(covRiskBudgets, getCovRiskBudgets(portfolio)) maxDD = rbind(maxDD, min(drawdowns(pfolioReturn(data/100, as.vector(Weights)))) ) } IDX = IDX + 1 } # Lower Min Variance Locus: if (include.mvl) { if (minIndex > 1) { weights2 = targetReturn2 = targetRisk2 = covRiskBudgets2 = maxDD2 = NULL Status = 0 IDX = minIndex - 1 while (Status == 0 & IDX > 0) { # Add Target Return to Specification: setTargetReturn(spec) = targetReturns[IDX] # Optimize Efficient Portfolio: ans = try(efficientPortfolio(Data, spec, constraints), silent = TRUE) if (class(ans) == "try-error") { Status = 1 } else { portfolio = ans Status = getStatus(portfolio) } if (Status == 0) { Weights2 = getWeights(portfolio) weights2 = rbind(Weights2, weights2) targetReturn2 = rbind(getTargetReturn(portfolio), targetReturn2) targetRisk2 = rbind(getTargetRisk(portfolio), targetRisk2) covRiskBudgets2 = rbind(getCovRiskBudgets(portfolio), covRiskBudgets2) maxDD2 = rbind(maxDD2, min(drawdowns( pfolioReturn(data/100, as.vector(Weights2)))) ) } IDX = IDX - 1 } weights = rbind(weights2, weights) targetReturn = rbind(targetReturn2, targetReturn) targetRisk = rbind(targetRisk2, targetRisk) covRiskBudgets = rbind(covRiskBudgets2, covRiskBudgets) maxDD = rbind(maxDD2, maxDD) } } # Check: Did we find points on the frontier? if (is.null(weights)) { portfolio = mvPortfolio portfolio@portfolio$maxDD = min(drawdowns( pfolioReturn(data/100, as.vector(getWeights(mvPortfolio))))) return(portfolio) } # Reset Target Return: setTargetReturn(spec) <- NULL # Compose Frontier: portfolio@call = match.call() portfolio@portfolio$weights = weights portfolio@portfolio$targetReturn = targetReturn portfolio@portfolio$targetRisk = targetRisk portfolio@portfolio$covRiskBudgets = covRiskBudgets portfolio@portfolio$maxDD = maxDD portfolio@portfolio$status = 0 portfolio@portfolio$minriskPortfolio = mvPortfolio portfolio@title = "Portfolio Frontier" # Return Value: portfolio } ############################################################################### fPortfolio/R/backtest-getMethods.R0000644000176200001440000001537512323217770016641 0ustar liggesusers # 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: # getWindows Extracts windows information # getWindowsFun Extracts windows function # getWindowsParams Extracts windows function parameters # getWindowsHorizon Extracts windows Horizon # FUNCTION: DESCRIPTION: # getStrategy Extracts strategy information # getStrategyFun Extracts strategy function # getStrategyParams Extracts strategy function parameters # FUNCTION: DESCRIPTION: # getSmoother Extracts smoother information # getSmootherFun Extracts smoother function # getSmootherParams Extracts smoother function parameters # getSmootherLambda Extracts decay parameter # getSmootherDoubleSmoothing Extracts double smoothing flag # getSmootherInitialWeights Extracts initial weights # getSmootherSkip Extracs skip smoothing flag # FUNCTION: DESCRIPTION: # getMessages Extracts messages ################################################################################ getWindows <- function(object) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Arguments: # FUNCTION: # Return Value: UseMethod("getWindows") } # ------------------------------------------------------------------------------ getWindowsFun <- function(object) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Arguments: # FUNCTION: # Return Value: UseMethod("getWindowsFun") } # ------------------------------------------------------------------------------ getWindowsParams <- function(object) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Arguments: # FUNCTION: # Return Value: UseMethod("getWindowsParams") } # ------------------------------------------------------------------------------ getWindowsHorizon <- function(object) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Arguments: # FUNCTION: # Return Value: UseMethod("getWindowsHorizon") } # ------------------------------------------------------------------------------ getSmoother <- function(object) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Arguments: # FUNCTION: # Return Value: UseMethod("getSmoother") } # ------------------------------------------------------------------------------ getSmootherFun <- function(object) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Arguments: # FUNCTION: # Return Value: UseMethod("getSmootherFun") } # ------------------------------------------------------------------------------ getSmootherParams <- function(object) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Arguments: # FUNCTION: # Return Value: UseMethod("getSmootherParams") } # ------------------------------------------------------------------------------ getSmootherLambda <- function(object) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Arguments: # FUNCTION: # Return Value: UseMethod("getSmootherLambda") } # ------------------------------------------------------------------------------ getSmootherDoubleSmoothing <- function(object) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Arguments: # FUNCTION: # Return Value: UseMethod("getSmootherDoubleSmoothing") } # ------------------------------------------------------------------------------ getSmootherInitialWeights <- function(object) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Arguments: # FUNCTION: # Return Value: UseMethod("getSmootherInitialWeights") } # ------------------------------------------------------------------------------ getSmootherSkip <- function(object) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Arguments: # FUNCTION: # Return Value: UseMethod("getSmootherSkip") } # ------------------------------------------------------------------------------ getStrategy <- function(object) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Arguments: # FUNCTION: # Return Value: UseMethod("getStrategy") } # ------------------------------------------------------------------------------ getStrategyFun <- function(object) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Arguments: # FUNCTION: UseMethod("getStrategyFun") } # ------------------------------------------------------------------------------ getStrategyParams <- function(object) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Arguments: # FUNCTION: # Return Value: UseMethod("getStrategyParams") } # ------------------------------------------------------------------------------ if(FALSE) { # Already defined in fPortfolio getMessages <- function(object) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Arguments: # FUNCTION: # Return Value: UseMethod("getMessages") } } ################################################################################ fPortfolio/R/monitor-indicators.R0000644000176200001440000001737512323217770016566 0ustar liggesusers # 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: # .emaIndicator Exponential moving average indicator # .macdIndicator MACD Indicator # .drawdownsIndicator Maximum drawdowns Indicator # FUNCTION: DESCRIPTION: # .rebalancingStats Rebalancing statistics ############################################################################### .emaIndicator <- function(series, lambda) { # A function implemented by Diethelm Wuertz # Description: # Exponential moving average indicator # FUNCTION: # EMA: x <- rep(mean(series[1:10,]), times=nrow(series)) for (i in 2:nrow(series)) x[i] <- (1-lambda)*series[i] + lambda*x[i-1] x <- as.timeSeries(data=x, charvec=time(series), units=colnames(series)) # Return Value: x } # ----------------------------------------------------------------------------- .macdIndicator <- function(index, spar=0.5, lambda=c(0.80, 0.85, 0.90), trace = TRUE, doplot=TRUE) { # A function implemented by Diethelm Wuertz # Description: # MACD price/index indicator # FUNCTION: # Series: rets <- returns(index) Index <- log(index)[-1, ] # Turning Points: tps <- turnsAnalytics(index=index, spar=spar, main = "MACD Analytics", trace=TRUE, doplot=FALSE) ablines <- tps$ablines # MACD Analytics: ema1 <- .emaIndicator(Index, lambda=lambda[1]) ema2 <- .emaIndicator(Index, lambda=lambda[2]) macd <- ema1 - ema2 signal <- .emaIndicator(macd, lambda[3]) histogram <- macd - signal # Indicator: indicator <- sign(histogram) rebalancing <- .rebalancingStats(index, indicator, trace=trace) # Plot Turning Points: if(doplot) { turnsAnalytics(index=index, spar=spar, main="MACD Index Indicator", trace=FALSE, doplot=doplot) tradePositions <- as.vector(indicator) tradeForecasts <- c(0, tradePositions[-length(tradePositions)]) outSample <- Index[1] + log(cumulated(rets*tradeForecasts)) Ups <- Index[as.vector(indicator) == 1, ] if(nrow(Ups) > 0) points(Ups, pch=19, cex=0.33, col="green") Downs <- Index[as.vector(indicator) == 0, ] if(nrow(Downs) > 0) points(Downs, pch=19, cex=0.33, col="blue") lines(outSample, col="magenta") box(col="white") box(bty="l") } # Plot Indicator: if(doplot) { plot(macd, col="green", ylab=paste("MACD", colnames(index))) abline(v=ablines, lty=3, lwd=2, col="grey") lines(histogram, type="h", col="black") lines(macd, col="red") mtext(paste("lambda: ", lambda[1], lambda[2], lambda[2], sep=" "), adj=0, side=4, cex=0.7, col="darkgrey") box(col="white") box(bty="l") } # Return Value: invisible(list(index=index, macd=macd, histogram=histogram, rebalancing=rebalancing)) } # ----------------------------------------------------------------------------- .drawdownsIndicator <- function(index, spar=0.5, lambda=c(0.80, 0.85, 0.10), trace=TRUE, doplot=TRUE) { # A function implemented by Diethelm Wuertz # Description: # Drawdown analytics # Arguments: # index - an index or price S4 'timeSeries' object # FUNCTION: # Series: rets <- returns(index) Index <- log(index)[-1, ] # Turning Points: tps <- turnsAnalytics(index=index, spar=spar, main = "MACD Drawdown Analytics", trace=TRUE, doplot=FALSE) ablines <- tps$ablines # Returns and Drawdowns: dd <- drawdowns(rets) # Long/Short Drawdowns EMA: mdd1 <- .emaIndicator(dd, lambda[1]) mdd2 <- .emaIndicator(dd, lambda[2]) # MACD/Signal/Histogram Line: macd <- mdd1 - mdd2 signal <- .emaIndicator(macd, lambda[3]) histogram <- macd - signal # Indicator: indicator <- rets series(indicator) <- 1-sign(as.integer(macd < 0 & histogram < 0 )) rebalancing <- .rebalancingStats(index, indicator, trace=trace) # Plot Turning Points: if(doplot) { tps <- turnsAnalytics(index=index, spar=spar, main="MACD Drawdown Indicator", trace=FALSE, doplot=doplot) tradePositions <- as.vector(indicator) tradeForecasts <- c(0, tradePositions[-length(tradePositions)]) outSample <- Index[1] + log(cumulated(rets*tradeForecasts)) Ups <- Index[as.vector(indicator) == 1,] if(nrow(Ups) > 0) points(Ups, pch=19, cex=0.33, col="green") Downs <- Index[as.vector(indicator) == 0, ] if(nrow(Downs) > 0) points(Downs, pch=19, cex=0.33, col="blue") lines(outSample, col="magenta") box(col="white") box(bty="l") } # Plot Indicator: if(doplot) { plot(mdd1, ylim=c(min(dd), max(macd)), ylab=colnames(index)) positions <- tps$positions ablines <- tps$ablines abline(v=ablines, lty=1, lwd=2, col="lightgrey") Time <- time(indicator) Time <- Time[!as.logical(indicator)] abline(v=Time, lty=3, lwd=2, col="steelblue") lines(mdd1, col="black") lines(mdd2, col="red") lines(max(abs(macd))*histogram/max(abs(histogram)), type="h", col="orange") lines(max(abs(macd))*histogram/max(abs(histogram)), type="l", col="orange") abline(h=0, col="grey") mtext(paste("lambda: ", lambda[1], lambda[2], lambda[2], sep=" "), adj=0, side=4, cex=0.7, col="darkgrey") box(col="white") box(bty="l") } # Return Value: invisible(list(indicator=indicator, index=index, returns=rets, drawdowns=dd, macd=macd, signal=signal, histogram=histogram, rebalancing=rebalancing)) } ############################################################################### .rebalancingStats <- function(index, indicator, trace=TRUE) { # A function implemented by Diethelm Wuertz # Description: # Simple rebalancing statistics # Arguments: # index - an index or price S4 'timeSeries' object # FUNCTION: # Returns: rets <- returns(index) # Rebalancing: tradePositions <- as.vector(indicator) tradeForecasts <- c(0, tradePositions[-length(tradePositions)]) rebalancing <- c( max=sum(abs(rets)), insample=sum(rets*tradePositions), forecasts=sum(rets*tradeForecasts), rets=sum(rets)) # Trace: if (trace) { cat("Rebalancing:\n") print(rebalancing) } # Return Value: invisible(rebalancing) } ############################################################################### fPortfolio/R/solve-Rsocp.R0000644000176200001440000001461512410474512015144 0ustar liggesusers # 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 Description. 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: # solveRsocp Portfolio interface to solver Rsocp # .rsocpArguments Returns arguments for solver # .rsocp Wrapper to solver function # .rsocpControl Returns default controls for solver ################################################################################ solveRsocp <- function(data, spec, constraints) { # Description: # Portfolio interface to solver Rsocp # Example: # ans = solveRquadprog(.lppData, .mvSpec, "LongOnly")[-3] # .mvSpec2 = .mvSpec; setTargetRisk(.mvSpec2) = ans$targetRisk # solveRsocp(.lppData, .mvSpec2, "LongOnly")[-3]; ans # efficientortfolio # FUNCTION: # Transform Data and Constraints: Data = portfolioData(data, spec) # Trace: trace <- getTrace(spec) if(trace) cat("\nPortfolio Optimiziation:\n Using Rsocp ...\n\n") # Get Specifications: nAssets = getNAssets(Data) # Create '.rsocp' conform arguments: args <- .rsocpArguments(data, spec, constraints) # Optimize: ans <- .rsocp( f = args$f, A = args$A, b = args$b, C = args$C, d = args$d, N = args$N, targetRisk = args$targetRisk, mu = args$mu, Scale = args$Scale) # Return Value: class(ans) = c("solver", "list") ans } ################################################################################ .rsocpArguments <- function(data, spec, constraints) { # Description: # Returns socp conform arguments for the solver # Example: # .rsocpArguments(data, spec, constraints) # FUNCTION: # Settings: Data = portfolioData(data, spec) nAssets = getNAssets(Data) Scale = 1.0e6 * sd(as.vector(data)) mu = getMu(Data) / Scale Sigma = getSigma(Data) / Scale^2 targetRisk = getTargetRisk(spec) / Scale # Objective Function: f <- -mu # Constraints: eqsumW = eqsumWConstraints(data, spec, constraints) # C - Cone Constraints: C1 <- rep(0, nAssets) # xCx C2 <- eqsumW[2, -1] # sum(x) C3 <- rbind(diag(nAssets), -diag(nAssets) ) # x[i]>0 # d - Cone Constraints: d1 <- targetRisk # xCx = risk d2 <- eqsumW[2, 1] # sum(x) <= 1 d3 <- c(rep(0, nAssets), rep(-1, nAssets)) # x[i] > 0 # A - Cone Constraints: A1 <- Rsocp::.SqrtMatrix(Sigma) A2 <- matrix(0, ncol = nAssets) A3 <- matrix(0, nrow = nrow(C3), ncol = nAssets) # b - Cone Constraints: b1 <- rep(0, nAssets) # xCx b2 <- 0 # sum(x) b3 <- rep(0, nrow(C3)) # x[i]>0 # N - Cone Constraints: N1 <- nAssets # dim(C) N2 <- 1 # Full Investment N3 <- rep(1, nrow(C3)) # Long # Combine Constraints for SOCP: A <- rbind(A1, A2, A3) b <- c(b1, b2, b3) C <- rbind(C1, C2, C3) d <- c(d1, -d2, -d3) N <- c(N1, N2, N3) # Return Value: list(f = f, A = A, b = b, C = C, d = d, N = N, targetRisk = targetRisk * Scale, mu = mu * Scale, Scale = Scale) } ################################################################################ .rsocp <- function(f, A, b, C, d, N, x = NULL, z = NULL, w = NULL, targetRisk, mu = mu, Scale = Scale, control = .rsocpControl()) { # Description: # SOCP solver function for portfolios # Details: # Package: fPortfolio # Title: An R extenstion library to use SOCP from R. # Version: 0.1 as of 2008-31-01 # Author: Yohan Chalabi and Diethelm Wuertz # Description: Second-order cone programming solver # written by M. Lobo, L. Vandenberghe, and S. Boyd. # R.socp is a wrapper library to use it from R. # License: R.socp - GPL # FUNCTION # Solve Portfolio: optim <- Rsocp::socp(f, A, b, C, d, N, x, z, w, control) # Extract Weights: weights = .checkWeights(optim$x) attr(weights, "invest") = sum(weights) # Prepare Output List: ans <- list( type = "MV", solver = "solveRsocp", optim = optim, weights = weights, targetReturn = (weights %*% mu)[[1]], targetRisk = targetRisk, objective = (weights %*% mu)[[1]], status = as.integer(!optim$convergence), message = optim$message) # Return Value: ans } ################################################################################ .rsocpControl <- function(abs.tol = 1.0e-18, rel.tol = 1.0e-16, target = 0, max.iter = 1000, Nu = 10, out.mode = 0, BigM.K = 2, BigM.iter = 5) { # Description: # Control list for portfolio SOCP optimization # FUNCTION: # Return Value: list( abs.tol = abs.tol, rel.tol = rel.tol, target = target, max.iter = max.iter, Nu = Nu, out.mode = out.mode, BigM.K = BigM.K, BigM.iter = BigM.iter) } ################################################################################ fPortfolio/R/zzz.R0000644000176200001440000000501613202336751013562 0ustar liggesusers # 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 ################################################################################ .onAttach <- function(libname, pkgname) { # do whatever needs to be done when the package is loaded # some people use it to bombard users with # messages using # packageStartupMessage( "\n" ) # packageStartupMessage( "Rmetrics Package fPortfolio" ) # packageStartupMessage( "Portfolio Optimization" ) # packageStartupMessage( "Copyright (C) 2005-2014 Rmetrics Association Zurich" ) # packageStartupMessage( "Educational Software for Financial Engineering and Computational Science" ) # packageStartupMessage( "Rmetrics is free software and comes with ABSOLUTELY NO WARRANTY." ) # packageStartupMessage( "https://www.rmetrics.org --- Mail to: info@rmetrics.org" ) } ############################################################################### .onLoad <- function(libname, pkgname) { if(!is.numeric(timeDate::getRmetricsOptions("length.print"))) timeDate::setRmetricsOptions(length.print = 5) timeDate::setRmetricsOptions(.x.save = NA) eval(attach <- function(what) base::attach(what, warn.conflicts=FALSE), envir=.GlobalEnv) } # Startup Mesage and Desription: # MSG <- if(getRversion() >= "2.5") packageStartupMessage else message # dsc <- packageDescription(pkg) # if(interactive() || getOption("verbose")) { # title <- paste(strsplit(dsc$Title, split = "-")[1:2]) # MSG(paste( # "\nPackage ", pkg, " (", dsc$Version, ") loaded.\n", # dsc$Title, "\n", # dsc$Copyright, ", ", dsc$License, "\n", # dsc$Author, "\n", # dsc$URL, "\n", sep="")) # } ############################################################################### fPortfolio/R/backtest-Plots.R0000644000176200001440000005217012330665056015633 0ustar liggesusers # 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: # backtestPlot Creates a summary of backtesting plots # backtestAssetsPlot Plots assets used in a portfolio backtest # backtestWeightsPlot Plots recommended weights from a backtest # backtestRebalancePlot Plots rebalanced weights of a backtest # backtestPortfolioPlot Plots benchmark and portfolio series # backtestDrawdownPlot Plots the drawdown of the portfolio backtest # backtestReportPlot Prints backtest report ################################################################################ backtestPlot <- function(object, which = "all", labels = TRUE, legend = TRUE, at = NULL, format = NULL, cex=0.6, font=1, family="mono") { # A function implemented by Diethelm Wuertz and William Chen # Description: # Creates a summary of backtesting plots # Arguments: # object - a list as returned by the function portfolioSmoothing() # which - which plots should be displayed # labels - a logical flag, should automated labels added to the plot # FUNCTION: # Frame: if (any(which == "all")) par(mfrow = c(3, 2), mar = c(1.5, 4, 5, 2), oma = c(5, 1, 0, 1)) # Plot: if(any(which == "1") || which == "all") backtestAssetsPlot (object, labels, legend, at, format) if(any(which == "2") || which == "all") backtestWeightsPlot (object, labels, legend, at, format) if(any(which == "3") || which == "all") backtestRebalancePlot (object, labels, legend, at, format) if(any(which == "4") || which == "all") backtestPortfolioPlot(object, labels, legend, at, format) if(any(which == "5") || which == "all") backtestDrawdownPlot(object, labels, legend, at, format) if(any(which == "6" )|| which == "all") backtestReportPlot(object, cex=cex, font=font, family=family) # Return Value: invisible() } # ------------------------------------------------------------------------------ # Plot 1: backtestAssetsPlot <- function(object, labels=TRUE, legend=TRUE, at=NULL, format=NULL) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Plots assets used in a portfolio backtest # Arguments: # object - a list as returned by the function portfolioSmoothing() # labels - a logical flag, should automated labels added to the plot # FUNCTION: # Settings: data <- object$data benchmark <- object$benchmarkName assets <- object$assetsNames # Time Axis: if (is.null(at)) at <- paste(unique(atoms(time(data))[,1]), "12-31", sep="-") if (is.null(format)) Format <- "%b/%y" else Format <- format # Labels ? if (labels) { main <- "Index Series" xlab <- "" ylab <- "Cumulated log Returns" } else { main <- "" xlab <- "" ylab <- "" } # Series: X <- data[, benchmark] # ylim - Plot Range: nAssets <- length(assets) MAX <- -1.0e99 for (i in 1:nAssets) MAX = max(c(MAX, cumsum(data[, assets[i]])) ) MAX <- max(MAX, cumsum(data[, benchmark])) MIN <- 1.0e99 for (i in 1:nAssets) MIN <- min(MIN, cumsum(data[, assets[i]])) MIN <- min(MIN, cumsum(data[, benchmark])) rangeY <- c(MIN, MAX) # xlim - Plot Range: xlim <- range(time(colCumsums(data[, benchmark]))) shift <- round(0.20 *as.integer(diff(xlim)), 0) * 24 * 60 * 60 rangeX <- c(round(xlim[1]-shift), xlim[2]) Days <- 1:as.integer(diff(xlim)) Time <- as.character(xlim[1] + Days*24*60*60) range.tS <- timeSeries(data = matrix(rep(0, length(Time))), as.character(Time)) # Limits: xlim <- rangeX ylim <- rangeY # Plot: plot(X, type = "n", xaxt = "n", at = at, format = Format, xlim = xlim, ylim = ylim, main = "", xlab = "", ylab = "") grid(NA, ny = NULL) abline(v = as.POSIXct(at), lty = 3, col = "brown") # Add Lines: lines(colCumsums(data[, benchmark]), col = "black") lines(colCumsums(data[, benchmark]), col = "black") for (i in 1:nAssets) lines( colCumsums(data[, assets[i]]), col = i+1) # Asset Names: Benchmark <- abbreviate(benchmark, 4) Assets <- abbreviate(assets, 4) assetsList <- c(Benchmark, Assets) assetsTitle <- paste(Benchmark, " ~ ", paste( Assets, collapse = " - ", sep = ""), sep="") # Add Title: if (labels) { title(main = main, xlab = xlab, ylab = ylab) } # Add Legend and Subtitle: if (legend) { mtext(assetsTitle, line = 0.5, cex = 0.7) legend("topleft", legend = assetsList, bty = "n", text.col = 1:(nAssets+1), cex = 0.8) } # Return Value: invisible() } # ------------------------------------------------------------------------------ # Plot 2: backtestWeightsPlot <- function(object, labels=TRUE, legend=TRUE, at=NULL, format=NULL) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Plots recommended weights from a portfolio backtest # Arguments: # object - a list as returned by the function portfolioSmoothing() # labels - a logical flag, should automated labels added to the plot # FUNCTION: # Settings: data <- object$data weights <- object$smoothWeights assets <- object$assetsNames benchmark <- object$benchmarkName horizon <- getWindowsHorizon(object$backtest) smoothing <- getSmootherLambda(object$backtest) startup <- "1m" horizonLength = as.numeric(substr(horizon, 1, nchar(horizon)-1)) horizonUnit = substr(horizon, nchar(horizon), nchar(horizon)) stopifnot(horizonUnit == "m") # Time Axis: if (is.null(at)) at <- paste(unique(atoms(time(data))[,1]), "12-31", sep="-") if (is.null(format)) Format <- "%b/%y" else Format <- format # Labels ? if (labels) { main <- "Weights Recommendation" xlab <- "" ylab <- "Asset Weights %" } else { main <- "" xlab <- "" ylab <- "" } # Series: X <- data[, benchmark] nAssets <- length(assets) naWeights <- matrix(rep(NA, times=horizonLength*nAssets), ncol=nAssets) # Lmits: xlim <- range(data) ylim <- c(0, 100) # Plot: plot(X, type = "n", xaxt = "n", las = 2, at = at, format = Format, xlim = xlim, ylim = ylim, main = "", xlab = "", ylab = "") grid(NA, ny = NULL) abline(v = as.POSIXct(at), lty = 3, col = "brown") # Add Lines: lines(X, col = "black") tS <- 100 * timeSeries(weights) for (i in 1:nAssets) lines(tS[, i], col = i+1) # Asset Names: Benchmark <- abbreviate(benchmark, 4) Assets <- abbreviate(assets, 4) assetsList <- c(Benchmark, Assets) assetsTitle <- paste(Benchmark, " ~ ", paste(Assets, collapse = " - ", sep = ""), sep="") # Add Title: if (labels) { title(main = main, xlab = xlab, ylab = ylab) text <- paste( "Horizon = ", horizon, "| Smoothing:", smoothing, "| Startup:", startup, "| Shift 1m") mtext(text, line = 0.5, cex = 0.7) } # Add Legend: if (legend) { legend("topleft", legend = assetsList, bty = "n", text.col = 1:(nAssets+1), cex = 0.8) } # Return Value: invisible() } # ------------------------------------------------------------------------------ # Plot 3: backtestRebalancePlot <- function(object, labels=TRUE, legend=TRUE, at=NULL, format=NULL) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Plots rebalanced weights of a backtest # Arguments: # object - a list as returned by the function portfolioSmoothing() # labels - a logical flag, should automated labels added to the plot # FUNCTION: # Settings: data <- object$data weights <- object$smoothWeights assets <- object$assetsNames benchmark <- object$benchmarkName horizon <- getWindowsHorizon(object$backtest) smoothing <- getSmootherLambda(object$backtest) startup <- "1m" horizonLength <- as.numeric(substr(horizon, 1, nchar(horizon)-1)) horizonUnit <- substr(horizon, nchar(horizon), nchar(horizon)) stopifnot(horizonUnit == "m") horizon <- horizonLength # Time Axis: if (is.null(at)) at <- paste(unique(atoms(time(data))[,1]), "12-31", sep="-") if (is.null(format)) Format <- "%b/%y" else Format <- format # Labels ? if (labels) { main <- "Weights Rebalance" xlab <- "" ylab <- "Weights Changes %" } else { main <- "" xlab <- "" ylab <- "" } # Series: X <- data[, benchmark] nAssets <- length(assets) naWeights <- matrix(rep(NA, times = horizon * nAssets), ncol = nAssets) naWeights <- rbind(naWeights, rep(NA, times = nAssets)) diffWeights <- rbind(naWeights, diff(weights)) absSum <- function(x) { sum(abs(x)) } diffWeights <- apply(diffWeights, 1, FUN = absSum) diffWeights <- cbind(diffWeights, rbind(naWeights, diff(weights))) tS <- 100 * timeSeries(diffWeights[-seq(horizon + 1),], charvec = rownames(diffWeights)[-seq(horizon + 1)]) # Limits: xlim <- range(time(data)) ylim <- range(tS) # Plot: plot(X, type = "n", xaxt = "n", las = 2, at = at, format = Format, xlim = xlim, ylim = ylim, main = "", xlab = "", ylab = "") grid(NA, ny = NULL) abline(v = as.POSIXct(at), lty = 3, col = "brown") abline(h=0, col="darkgrey") # Add Lines: # lines(X) lines(tS[, 1], type = "h", lwd = 1, col = "darkgrey") for (i in 2:NCOL(tS)) lines(tS[, i], col = i) # Asset Names: Benchmark <- abbreviate(benchmark, 4) Assets <- abbreviate(assets, 4) assetsList <- c(Benchmark, Assets) assetsTitle <- paste(Benchmark, " ~ ", paste(Assets, collapse = " - ", sep = ""), sep="") # Add Title: if (labels) { title(main = main, xlab = xlab, ylab = ylab) text <- paste( "Horizon = ", horizon, "| Smoothing:", smoothing, "| Startup:", startup, "| Shift 1m") mtext(text, line = 0.5, cex = 0.7) # mText = paste("Start:", rownames(object$smoothWeights)[1]) # mtext(mText, side = 4, line = 0, adj = 0, col = "darkgrey", cex = 0.65) } # Add Legend: if (legend) { legend("topleft", legend = assetsList, bty = "n", text.col = 1:(nAssets+1), cex = 0.8) } # Return Value: invisible() } # ------------------------------------------------------------------------------ # Plot 4: backtestPortfolioPlot <- function(object, labels=TRUE, legend=TRUE, at=NULL, format=NULL) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Plots daily, benchmark and portfolio series of a portfolio backtest # Arguments: # object - a list as returned by the function portfolioSmoothing() # labels - a logical flag, should automated labels added to the plot # FUNCTION: # Settings: data <- object$data portfolioReturns <- object$portfolioReturns benchmarkReturns <- object$benchmarkReturns assets <- object$assetsNames benchmark <- object$benchmarkName horizon <- getWindowsHorizon(object$backtest) smoothing <- getSmootherLambda(object$backtest) startup <- "1m" offsetReturn <- object$offsetReturn # Time Axis: if (is.null(at)) at <- paste(unique(atoms(time(data))[,1]), "12-31", sep="-") if (is.null(format)) Format <- "%b/%y" else Format <- format # Labels ? if (labels) { main <- "Portfolio vs Benchmark" xlab <- "" ylab <- "Cumulated log Returns" } else { main <- "" xlab <- "" ylab <- "" } # Series: X <- data[, benchmark] # Cumulated Return Series: cumX <- colCumsums(X) cumP <- portfolioReturns + offsetReturn cumB <- benchmarkReturns + offsetReturn offsetTS <- timeSeries(offsetReturn, charvec = names(offsetReturn), units = "offsetReturn") cumP <- rbind(offsetTS, cumP) cumB <- rbind(offsetTS, cumB) MAX <- max(as.vector(series(cumP)), as.vector(series(cumB)), as.vector(series(cumX))) MIN <- min(as.vector(series(cumP)), as.vector(series(cumB)), as.vector(series(cumX))) # Limits: xlim <- c(as.POSIXct(start(X)), as.POSIXct(end(X))) ylim <- c(MIN, MAX) # Plot: plot(X, type = "n", xaxt = "n", at = at, format = Format, xlim = xlim, ylim = ylim, main = "", xlab = "", ylab = "") grid(NA, ny = NULL) abline(v = as.POSIXct(at), lty = 3, col = "brown") abline(h=0, col="darkgrey") # Add Lines: lines(cumX, col = "black") lines(cumP-cumB, type = "h", col = "grey") lines(cumP, col = "red", lwd = 2) lines(cumB, col = "blue", lwd = 2) # Asset Names: Benchmark <- abbreviate(benchmark, 4) Assets <- abbreviate(assets, 4) assetsList <- c(Benchmark, Assets) assetsTitle <- paste(Benchmark, " ~ ", paste(Assets, collapse = " - ", sep = ""), sep="") nAssets <- length(assetsList) # Add Title: if (labels) { title(main = main, xlab = xlab, ylab = ylab) text <- paste( "Horizon = ", horizon, "| Smoothing:", smoothing, "| Startup:", startup, "| Shift 1m") mtext(text, line = 0.5, cex = 0.7) # mText <- Type = getType(object$spec) # Estimator <- getEstimator(object$spec) # if (Type == "MV") mText = paste(mText, "|", Estimator) # mtext(mText, side = 4, line = 0, adj = 0, col = "darkgrey", cex = 0.7) } # Add Legend: if (legend) { legend("topleft", legend = assetsList, bty = "n", text.col = 1:(nAssets+1), cex = 0.8) } # Return Value: invisible() } # ------------------------------------------------------------------------------ # Plot 5: backtestDrawdownPlot <- function(object, labels=TRUE, legend=TRUE, at=NULL, format=NULL) { # A function implemented by Diethelm Wuertz and William Chen # Description: # Creates Backtest Portfolio Plot # Arguments: # object - a list as returned by the function portfolioSmoothing() # labels - a logical flag, should automated labels added to the plot # FUNCTION: # Settings: data <- object$data assets <- object$assetsNames benchmark <- object$benchmarkName horizon <- getWindowsHorizon(object$backtest) smoothing <- getSmootherLambda(object$backtest) startup <- getSmootherInitialWeights(object$backtest) weights <- as.timeSeries(object$smoothWeights) # Align Data: Data <- .align.timeSeries(data)/100 # Time Axis: if (is.null(at)) at <- paste(unique(atoms(time(data))[,1]), "12-31", sep="-") if (is.null(format)) Format <- "%b/%y" else Format <- format # Labels ? if (labels) { main <- "Portfolio vs Benchmark" xlab <- "" ylab <- "Drawdown" } else { main <- "" xlab <- "" ylab <- "" } # Extract the Time Stamps: tS <- time(Data) tW <- time(weights) # Problem when rebalance day lands on a Weekend - # need to change the date to the nearest Monday if (any(isWeekend(tW))){ weekend.tW <- tW[isWeekend(tW)] # WC: check timeNdayOnOrAfter function, the nday = 2 is a Monday!??? tW <- sort(c(tW[!isWeekend(tW)], timeNdayOnOrAfter(weekend.tW, 2))) # replace old times with new times time(weights) <- tW } # Extract the Updated Revalance Dates: Dates <- time(weights) # Subsetting the Data: data <- window(Data, start(weights), end(weights)) # Check whether we have data past the last balance date # i.e. last balance date won't take place if we don't have the return series if (end(data) < end(weights)){ n <- length(Dates)-1 } else {n = length(Dates) Dates <- c(Dates, end(data)) } # Calculate the portfolio returns for the given weights: # assume we start investing the new weights on the rebalance date pf <- NULL a <- NULL for (i in 1:n){ temp <- window(data, Dates[i], Dates[i+1])[,assets] nr <- nrow(temp) if (i != n) temp = temp[-nr,] a <- c(a, nrow(temp)) pf <- c(pf, pfolioReturn(temp, as.numeric(weights[i,]))) } # Drawdown Plot Settings: stopifnot(length(pf) == length(rownames(data))) pf <- timeSeries(pf, charvec = rownames(data)) pf.DD <- drawdowns(pf) benchmark.DD <- drawdowns(data[,benchmark]) # Series: X <- Data[, benchmark] # Limits: xlim <- c(as.POSIXct(start(X)), as.POSIXct(end(X))) ylim <- range(c(pf.DD, benchmark.DD)) # Plot: plot(X, type = "n", xaxt = "n", at = at, format = Format, xlim = xlim, ylim = ylim, main = "", xlab = "", ylab = "") grid(NA, ny = NULL) abline(v = as.POSIXct(at), lty = 3, col = "brown") # Add Lines: lines(benchmark.DD, col = "blue", lwd = 2) lines(pf.DD, col = "red", lwd = 2) # Asset Names: Benchmark <- abbreviate(benchmark, 4) Assets <- abbreviate(assets, 4) assetsList <- c(Benchmark, Assets) assetsTitle <- paste(Benchmark, " ~ ", paste(Assets, collapse = " - ", sep = ""), sep="") # Add Title: if (labels) { title(main = main, xlab = xlab, ylab = ylab) text <- paste("(Max)", "Portfolio DD =", round(min(pf.DD),2), "|", "Benchmark DD =", round(min(benchmark.DD),2)) mtext(text, line = 0.5, cex = 0.7) } # Add Legend: if (legend) { legend("bottomleft", legend = c("Benchmark", "Portfolio"), bty = "n", text.col = c("blue", "red"), cex = 0.8) } # Return Value: invisible() } # ------------------------------------------------------------------------------ # Plot 6 - Report: backtestReportPlot <- function(object, cex=0.6, font=1, family="mono") { # A function implemented by Diethelm Wuertz and William Chen # Description: # Prints backtest report as graphical plot # Arguments: # object - a list as returned by the function portfolioSmoothing() # FUNCTION: # Settings: CEX <- cex # Start Plot: plot.new() plot.window(xlim = c(0, 1), ylim = c(0, 1)) # Vertical Adjustment: z <- -2 TEXT <- paste("Strategy:", getStrategyFun(object$backtest)) mtext(TEXT, side = 3, line = z + 3, adj = 0, font=2, family="sans", cex=CEX) TEXT <- capture.output(round(object$stats, 2)) mtext(TEXT[1], side = 3, line = z + +2, adj = 0, font=font, family="mono", cex=CEX) mtext(TEXT[2], side = 3, line = z + +1, adj = 0, font=font, family="mono", cex=CEX) mtext(TEXT[3], side = 3, line = z + +0, adj = 0, font=font, family="mono", cex=CEX) mtext(TEXT[4], side = 3, line = z + -1, adj = 0, font=font, family="mono", cex=CEX) mtext(TEXT[5], side = 3, line = z + -2, adj = 0, font=font, family="mono", cex=CEX) TEXT <- capture.output(object$spec)[c(2,3,4,5,8)] mtext("Portfolio Specification:", side = 3, line = z + -4, adj = 0, font=2, family="sans", cex=CEX) if (length(grep("CVaR",TEXT[2]))!=0) TEXT[2] = gsub("CVaR", paste("CVaR |", getAlpha(object$spec)), TEXT[2]) mtext(TEXT[2], side = 3, line = z + -5, adj = 0, font=font, family=family, cex=CEX) mtext(TEXT[3], side = 3, line = z + -6, adj = 0, font=font, family=family, cex=CEX) mtext(TEXT[4], side = 3, line = z + -7, adj = 0, font=font, family=family, cex=CEX) #text(TEXT[5], side = 3, line = z + -8, adj = 0, font=font, family=family, cex=CEX) TEXT <- capture.output(object$constraints)[1] mtext("Constraints:", side = 3, line = z + -9, adj = 0, font=2, family="sans", cex=CEX) TEXT <- substr(TEXT[1], 4, 99) mtext(TEXT, side = 3, line = z + -10, adj = 0, font=font, family=family, cex=CEX) # Return Value: invisible() } ################################################################################ fPortfolio/R/object-getPortfolio.R0000644000176200001440000002350712424415120016644 0ustar liggesusers # 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 Description. 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: # getData Extracts data slot # getSeries Extracts assets series data # getNAssets Extracts number of assets from data # getUnits Extracts assets names from data # getStatistics Extracts statistics slot # getMean Extracs mean from statistics # getCov Extracs covariance Sigma from statistics # getMu Extracs mu from statistics # getSigma Extracs Sigma from statistics # getEstimator Extracts estimator from # getTailRisk Extracts tailRisk slot # FUNCTION: DESCRIPTION: # getSpec Extracs specification Slot # getType Extracts type of portfolio # getOptimize Extracts what to optimize of portfolio # getEstimator Extracts mean-covariance estimator # getParams Extracts optional parameter list # getAlpha Extracts target VaR-alpha specification # getA Extracts quadratic LPM exponent specification # getPortfolio Extract portfolio slot # getWeights Extracts weights from a portfolio object # getTargetReturn Extracts target return from specification # getTargetRisk Extracts target riks from specification # getRiskFreeRate Extracts risk free rate from specification # getNFrontierPoints Extracts number of frontier points # getStatus Extracts portfolio status information # getOptim Extract optim slot # getSolver Extracts solver from specification # getObjective Extracts objective # getOptions Extracts optimization options # getControl Extracts solver control options # getTrace Extracts solver's trace flag # FUNCTION: DESCRIPTION: # getConstraints Extracts weight constraints # FUNCTION: DESCRIPTION: # getCovRiskBudgets Extracts covariance risk budgets # getTailRiskBudgets Extracts tail risk budgets ################################################################################ # Extract from data slot of an object of class fPORTFOLIO: getData.fPORTFOLIO <- function(object) object@data getSeries.fPORTFOLIO <- function(object) object@data@data$series getNAssets.fPORTFOLIO <- function(object) object@data@data$nAssets getUnits.fPORTFOLIO <- function(x) x@data@data$names getStatistics.fPORTFOLIO <- function(object) object@data@statistics getMean.fPORTFOLIO <- function(object) object@data@statistics$mean getCov.fPORTFOLIO <- function(object) object@data@statistics$Cov getEstimator.fPORTFOLIO <- function(object) object@data@statistics$estimator getMu.fPORTFOLIO <- function(object) object@data@statistics$mu getSigma.fPORTFOLIO <- function(object) object@data@statistics$Sigma # ------------------------------------------------------------------------------ # Extract from spec slot of an object of class fPORTFOLIO: getSpec.fPORTFOLIO <- function(object) object@spec getModel.fPORTFOLIO <- function(object) object@spec@model getType.fPORTFOLIO <- function(object) object@spec@model$type getOptimize.fPORTFOLIO <- function(object) object@spec@model$optimize getEstimator.fPORTFOLIO <- function(object) object@spec@model$estimator getTailRisk.fPORTFOLIO <- function(object) object@spec@model$tailRisk getParams.fPORTFOLIO <- function(object) object@spec@model$params getAlpha.fPORTFOLIO <- function(object) object@spec@model$params$alpha getA.fPORTFOLIO <- function(object) object@spec@model$params$a # DW object@spec renamed to object@portfolio getPortfolio.fPORTFOLIO <- function(object) object@portfolio@portfolio getWeights.fPORTFOLIO <- function(object) object@portfolio@portfolio$weights getTargetReturn.fPORTFOLIO <- function(object) object@portfolio@portfolio$targetReturn getTargetRisk.fPORTFOLIO <- function(object) object@portfolio@portfolio$targetRisk getRiskFreeRate.fPORTFOLIO <- function(object) object@spec@portfolio$riskFreeRate getNFrontierPoints.fPORTFOLIO <- function(object) object@spec@portfolio$nFrontierPoints getStatus.fPORTFOLIO <- function(object) object@spec@portfolio$status getOptim.fPORTFOLIO <- function(object) object@spec@optim getSolver.fPORTFOLIO <- function(object) object@spec@optim$solver getObjective.fPORTFOLIO <- function(object) object@spec@optim$objective getOptions.fPORTFOLIO <- function(object) object@spec@optim$options getControl.fPORTFOLIO <- function(object) object@spec@optim$control getTrace.fPORTFOLIO <- function(object) object@spec@optim$trace getCovRiskBudgets.fPORTFOLIO <- function(object) object@portfolio@portfolio$covRiskBudgets # ------------------------------------------------------------------------------ # Extract from constraints slot of an object of class fPORTFOLIO: getConstraints.fPORTFOLIO <- function(object) object@constraints@stringConstraints getConstraintsTypes <- function(object) { Constraints = getConstraints(object) Types = NULL if(!is.na(pmatch("LongOnly", Constraints))) Types = c(Types, "LongOnly") if(!is.na(pmatch("Short", Constraints))) Types = c(Types, "Short") if(!is.na(pmatch("minW", Constraints))) Types = c(Types, "minW") if(!is.na(pmatch("maxW", Constraints))) Types = c(Types, "maxW") if(!is.na(pmatch("minsumW", Constraints))) Types = c(Types, "minsumW") if(!is.na(pmatch("maxsumW", Constraints))) Types = c(Types, "maxsumW") if(!is.na(pmatch("minB", Constraints))) Types = c(Types, "minB") if(!is.na(pmatch("maxB", Constraints))) Types = c(Types, "maxB") Types } ################################################################################ .getCovRiskBudgets.fPORTFOLIO <- function (object) { # A function implemented by Rmetrics # Description: # Extracts risk budgets from a portfolio object # FUNCTION: # Covariance Risk Budgets: weights = object@portfolio$weights ans = NA Sigma = object@data$data@statistics$Sigma if (is.null(dim(weights))) { # Single Portfolio ... ans1 = as.vector(weights %*% Sigma %*% weights) ans2 = as.vector(weights * Sigma %*% weights) ans = round(ans2/ans1, digits = 4) names(ans) = names(weights) } else { # Frontier ... Names = colnames(weights) ans = NULL for (i in 1:(dim(weights)[1])) { ans1 = as.vector(weights[i, ] %*% Sigma %*% weights[i, ]) ans2 = as.vector(weights[i, ] * Sigma %*% weights[i, ]) ans = rbind(ans, ans2/ans1) } colnames(ans) = Names } # Return Value: ans } # ------------------------------------------------------------------------------ getTailRiskBudgets.fPORTFOLIO <- function (object) { # A function implemented by Rmetrics # Description: # Extracts tail risk budgets from a portfolio object # Arguments: # object - an object of S4 class fPORTFOLIO as returned by the # functions *Portfolio(). # FUNCTION: # Check if available: Lambda = object@spec@model$tailRisk$lower if (is.null(Lambda)) return(NA) # Tail Risk Budgets: weights = getWeights(object) ans = NA if (is.null(dim(weights))) { ans1 = as.vector(weights %*% Lambda %*% weights) ans2 = as.vector(weights * Lambda %*% weights) ans1 = 1 ans = round(ans2/ans1, digits = 4) names(ans) = names(weights) } else { Names = colnames(weights) ans = NULL for (i in 1:(dim(weights)[1])) { ans1 = as.vector(weights[i, ] %*% Lambda %*% weights[i, ]) ans2 = as.vector(weights[i, ] * Lambda %*% weights[i, ]) ans1 = 1 ans = rbind(ans, ans2/ans1) } colnames(ans) = Names } # Return Value: ans } ################################################################################ fPortfolio/R/solve-RglpkVAR.R0000644000176200001440000001602612323217770015510 0ustar liggesusers # 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 Description. 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: # solveRglpk.CVAR Portfolio interface to solver Rglpk # .cvarRglpkArguments Returns CVAR arguments for solver # FUNCTION: DESCRIPTION: # .rglpk.CVAR Wrapper to solver function ################################################################################ solveRglpk.CVAR <- function(data, spec, constraints) { # A function implemented by Diethelm Wuertz # Description: # Portfolio interface to solver Rglpk # FUNCTION: # Settings: Data <- portfolioData(data, spec) data <- getSeries(Data) nAssets <- getNAssets(Data) type <- getType(spec) # Compile Arguments for Solver: args <- .cvarRglpkArguments(Data, spec, constraints) # Solve Multiassets Portfolio: ans <- .rglpk.CVAR( obj = args$obj, mat = args$mat, dir = args$dir, rhs = args$rhs, types = args$types, max = args$max, bounds = args$bounds, verbose = args$verbose, nScenarios = args$nScenarios, nAssets = args$nAssets, targetReturn = args$targetReturn, Alpha = args$Alpha, Type = args$Type) ans$solver <- "solveRglpk.CVAR" # Return Value: class(ans) = c("solver", "list") ans } ################################################################################ .cvarRglpkArguments <- function(data, spec, constraints) { # A function implemented by Diethelm Wuertz # Description: # Returns glpk conform CVaR arguments for the solver # Details: # max/min: obj %*% x # subject to: # mat %*% x ?= rhs # dir = "?=" # upper/lower bounds # # .Rglpk_solve_LP(obj, mat, dir, rhs, types = NULL, max = FALSE, # bounds = NULL, verbose = FALSE) # FUNCTION: # Settings: Data <- portfolioData(data, spec) data <- getSeries(Data) nAssets <- ncol(data) nScenarios <- nrow(data) targetReturn <- getTargetReturn(spec) Alpha <- getAlpha(spec) Type <- getType(spec) # Objective Function: objNames <- c("VaR", paste("e", 1:nScenarios, sep = ""), colnames(data)) obj <- c(1, -rep(1/(Alpha*nScenarios), nScenarios), rep(0, nAssets)) names(obj) <- objNames # The A_equal Equation Constraints: A_eq %*% x == a_eq eqsumW <- eqsumWConstraints(Data, spec, constraints) Aeq <- cbind( matrix(0, ncol=1+nScenarios, nrow=nrow(eqsumW)), matrix(eqsumW[, -1], ncol=nAssets) ) aeq <- eqsumW[, 1] deq <- rep("==", nrow(eqsumW)) # The VaR Equation Constraints: # (-1 + diag + Returns) %*% (VaR, es, W) >= 0 Avar <- cbind( matrix(rep(-1, nScenarios), ncol = 1), diag(nScenarios), getDataPart(getSeries(Data)) ) avar <- rep(0, nrow(Avar)) dvar <- rep(">=", nrow(Avar)) # The e_s > = 0 Equation Constraints: Aes <- cbind( matrix(rep(0, nScenarios), ncol = 1), diag(nScenarios), matrix(0, nrow = nScenarios, ncol = nAssets) ) aes <- rep(0, nrow(Aes)) des <- rep(">=", nrow(Aes)) # Group Constraints: A W >= a minsumW <- minsumWConstraints(Data, spec, constraints) if (is.null(minsumW)){ Aminsum <- aminsum <- dminsum <- NULL } else { Aminsum <- cbind( matrix(0, nrow = nrow(minsumW), ncol = 1+nScenarios), minsumW[, -1, drop = FALSE] ) aminsum <- minsumW[, 1] dminsum <- rep(">=", nrow(minsumW)) } # Group Constraints: A W <= b maxsumW <- maxsumWConstraints(Data, spec, constraints) if (is.null(maxsumW)){ Amaxsum <- amaxsum <- dmaxsum <- NULL } else { Amaxsum <- cbind( matrix(0, nrow = nrow(maxsumW), ncol = 1+nScenarios), maxsumW[, -1, drop = FALSE] ) amaxsum <- maxsumW[, 1] dmaxsum <- rep("<=", nrow(maxsumW)) } # Putting all together: mat <- rbind(Aeq, Avar, Aes, Aminsum, Amaxsum) rhs <- c(aeq, avar, aes, aminsum, amaxsum) dir <- c(deq, dvar, des, dminsum, dmaxsum) # Box Constraints: Upper and Lower Bounds as listn required ... minW <- minWConstraints(Data, spec, constraints) maxW <- maxWConstraints(Data, spec, constraints) nInd <- 1:(1+nScenarios+nAssets) bounds <- list( lower = list(ind = nInd, val = c(rep(-Inf, 1+nScenarios), minW)), upper = list(ind = nInd, val = c(rep( Inf, 1+nScenarios), maxW)) ) # What variable Types, All Continuous: types <- NULL # Should I minimize or maximize ? max <- TRUE # Return Value: list( obj = obj, mat = mat, dir = dir, rhs = rhs, types = types, max = max, bounds = bounds, verbose = FALSE, nScenarios = nScenarios, nAssets = nAssets, targetReturn = targetReturn, Alpha = Alpha, Type = Type) } ################################################################################ .rglpk.CVAR <- function(obj, mat, dir, rhs, types, max, bounds, verbose, nScenarios, nAssets, targetReturn, Alpha, Type) { # A function implemented by Diethelm Wuertz # Description: # Rglpk CVAR Solver # FUNCTION: # Solve - use Rglpk_solve_LP: optim <- Rglpk::Rglpk_solve_LP( obj = obj, mat = mat, dir = dir, rhs = rhs, types = types, max = max, bounds = bounds, verbose = verbose) # Extract Weights: weights <- .checkWeights(rev(rev(optim$solution)[1:nAssets])) attr(weights, "invest") = sum(weights) # Result: ans <- list( type = Type, solver = "Rglpk.CVAR", optim = optim, weights = weights, solution = weights, targetReturn = targetReturn, targetRisk = -optim$optimum, objective = -optim$optimum, status = optim$status[[1]], message = "NA") # Return Value: ans } ################################################################################ fPortfolio/R/plot-weightsPies.R0000644000176200001440000003252312422702546016201 0ustar liggesusers # 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 Description. 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: # weightsPie Plots a pie of portfolio weights # weightedReturnsPie Plots a pie of weighted means # covRiskBudgetsPie Plots a pie of covariance risk budgets # tailRiskBudgetsPie Plots a pie of copulae tail risk budgets ################################################################################ weightsPie <- function(object, pos = NULL, labels = TRUE, col = NULL, box = TRUE, legend = TRUE, radius = 0.8, ...) { # A function implemented by Diethelm Wuertz and Oliver Greshake # Description: # Plots a Pie Chart of Weigths # Arguments: # object - an object of class 'fPORTFOLIO'. # pos - a numeric value, determining the position on the efficient # frontier plotting the pie, by default NULL, i.e. expecting # an object having only one set of weights like the tangency # portfolio. # box - a logical value, determining whether a frame (box) should # be plotted around the pie, by default TRUE. # col - a color palette, by default the rainbow palette. # legend - a logical value, determining whether a legend with # the names of the assets should be plotted, by default TRUE. # Example: # weightsPie(tangencyPortfolio(dutchPortfolioData(), portfolioSpec())) # title(main = "Tangency Portfolio Weights") # FUNCTION: # Default Settings: Title <- "Weights" if (is.null(col)) col <- seqPalette(getNAssets(object), "Blues") if (sum(c(par()$mfrow, par()$mfcol)) == 4) CEX = 0.9 else CEX = 0.7 # Get Weights: if (is.null(pos)) { Weights <- getWeights(object@portfolio) } else { Weights <- getWeights(object@portfolio)[pos, ] } X <- Weights # Check for Negative Pie Segments: nX <- getNAssets(object) Sign <- rep("+", nX) Sign[(1:nX)[X < 0]] <- "-" absX <- abs(X) Index <- (1:nX)[X > 0] # Take care of labels, they are also used by the function pie(): if (!is.logical(labels)) { Names <- pieLabels <- labels labels <- FALSE } else { Names <- pieLabels <- object@data@data$names } # Pie Chart: col <- col[Index] legendAssets <- Names[Index] Labels <- paste(Names, Sign) Labels = Labels[X > 0] Y <- X[X > 0] # Plot: if (labels) { pie(Y, labels = Labels, col = col, radius = radius, cex = CEX) } else { pie(Y, labels = pieLabels, col = col, radius = radius, ...) } # Add Title: if (labels) mtext(Title, adj = 0, line = 2.5, font = 2, cex = CEX+0.1) # Add Info: if (labels) { mtext(paste(getType(object), "|", getSolver(object)), side = 4, adj = 0, col = "grey", cex = 0.7) } # Add Legend: if (legend) { legend("topleft", legend = legendAssets, bty = "n", cex = CEX, fill = col) legendY <- as.character(round(100*Y, digits = 1)) legendY <- paste(Sign[Index], legendY, sep = "") legendY <- paste(legendY, "%") legend("topright", legend = legendY, bty = "n", cex = CEX, fill = col) } # Add Box: if (box) box() # Return Value: invisible(Y) } # ------------------------------------------------------------------------------ weightedReturnsPie <- function(object, pos = NULL, labels = TRUE, col = NULL, box = TRUE, legend = TRUE, radius = 0.8, ...) { # A function implemented by Diethelm Wuertz and Oliver Greshake # Description: # Adds a pie plot of the weights # Arguments: # object - an object of class 'fPORTFOLIO'. # pos - a numeric value, determining the position on the efficient # frontier plotting the pie, by default NULL, i.e. expecting # an object having only one set of weights like the tangency # portfolio. # box - a logical value, determining whether a frame (box) should # be plotted around the pie, by default TRUE. # col - a color palette, by default the rainbow palette. # legend - a logical value, determining whether a legend with # the names of the assets should be plotted, by default TRUE. # Example: # attributesPie(tangencyPortfolio(dutchPortfolioData(), portfolioSpec())) # title(main = "Tangency Portfolio Weights") # FUNCTION: # Default Settings: Title <- "Weighted Returns" if (is.null(col)) col <- seqPalette(getNAssets(object), "Blues") if (sum(c(par()$mfrow, par()$mfcol)) == 4) CEX = 0.9 else CEX = 0.7 # Get Weights: if (is.null(pos)) { Weights <- getWeights(object@portfolio) } else { Weights <- getWeights(object@portfolio)[pos, ] } Returns = getStatistics(object)$mu X <- Weights * Returns # Check for Negative Pie Segments: nX <- getNAssets(object) Sign <- rep("+", nX) Sign[(1:nX)[X < 0]] <- "-" absX <- abs(X) Index <- (1:nX)[X > 0] # Take care of labels, they are also used by the function pie(): if (!is.logical(labels)) { Names <- pieLabels <- labels labels <- FALSE } else { Names <- pieLabels <- object@data@data$names } # Pie Chart: col <- col[Index] legendAssets <- Names[Index] Labels <- paste(Names, Sign) Labels <- Labels[X > 0] Y <- X[X > 0] # Plot: if (labels) { pie(Y, labels = Labels, col = col, radius = radius, cex = CEX) } else { pie(Y, labels = pieLabels, col = col, radius = radius, ...) } # Add Title: if (labels) mtext(Title, adj = 0, line = 2.5, font = 2, cex = CEX+0.1) # Add Info: if (labels) { mtext(paste(getType(object), "|", getSolver(object)), side = 4, adj = 0, col = "grey", cex = 0.7) } # Add Legend: if (legend) { legend("topleft", legend = legendAssets, bty = "n", cex = CEX, fill = col) legendY = as.character(round(100*Y, digits = 1)) legendY = paste(Sign[Index], legendY, sep = "") legendY = paste(legendY, "%") legend("topright", legend = legendY, bty = "n", cex = CEX, fill = col) } # Add Box: if (box) box() # Return Value: invisible(Y) } # ------------------------------------------------------------------------------ covRiskBudgetsPie <- function(object, pos = NULL, labels = TRUE, col = NULL, box = TRUE, legend = TRUE, radius = 0.8, ...) { # A function implemented by Diethelm Wuertz and Oliver Greshake # Arguments: # object - an object of class 'fPORTFOLIO'. # pos - a numeric value, determining the position on the efficient # frontier plotting the pie, by default NULL, i.e. expecting # an object having only one set of weights like the tangency # portfolio. # box - a logical value, determining whether a frame (box) should # be plotted around the pie, by default TRUE. # col - a color palette, by default the rainbow palette. # legend - a logical value, determining whether a legend with # the names of the assets should be plotted, by default TRUE. # Description: # Plots a Pie Chart of Risk Budgets # Arguments: # object - an object of class 'fPORTFOLIO' # col - a color palette, by default the rainbow palette # Example: # riskBudgetsPie(tangencyPortfolio(dutchPortfolioData(), portfolioSpec())) # title(main = "Tangency Portfolio Weights") # FUNCTION: # Default Settings: Title = "Covariance Risk Budgets" if (is.null(col)) col <- seqPalette(getNAssets(object), "Blues") if (sum(c(par()$mfrow, par()$mfcol)) == 4) CEX <- 0.9 else CEX <- 0.7 # Get Cov Risk Budgets: if (is.null(pos)) { X <- getCovRiskBudgets(object@portfolio) } else { X <- getCovRiskBudgets(object@portfolio)[pos, ] } # Check for Negative Pie Segments: nX <- getNAssets(object) Sign <- rep("+", nX) Sign[(1:nX)[X < 0]] <- "-" absX <- abs(X) Index <- (1:nX)[X > 0] # Take care of labels, they are also used by the function pie(): if (!is.logical(labels)) { Names <- pieLabels <- labels labels <- FALSE } else { Names <- pieLabels <- object@data@data$names } # Legend Labels: col <- col[Index] legendAssets <- Names[Index] Labels <- paste(Names, Sign) Labels <- Labels[X > 0] Y <- X[X > 0] # Plot: if (labels) { pie(Y, labels = Labels, col = col, radius = radius, cex = CEX) } else { pie(Y, labels = pieLabels, col = col, radius = radius, ...) } # Add Title: if (labels) mtext(Title, adj = 0, line = 2.5, font = 2, cex = CEX+0.1) # Add Info: if (labels) { mtext(paste(getType(object), "|", getSolver(object)), side = 4, adj = 0, col = "grey", cex = 0.7) } # Add Legend: if (legend) { legend("topleft", legend = legendAssets, bty = "n", cex = CEX, fill = col) legendY <- as.character(round(100*Y, digits = 1)) legendY <- paste(Sign[Index], legendY, sep = "") legendY <- paste(legendY, "%") legend("topright", legend = legendY, bty = "n", cex = CEX, fill = col) } # Add Box: if (box) box() # Return Value: invisible(Y) } # ------------------------------------------------------------------------------ tailRiskBudgetsPie <- function(object, pos = NULL, labels = TRUE, col = NULL, box = TRUE, legend = TRUE, radius = 0.8, ...) { ### todo: take care of @portfolio slot ... # A function implemented by Diethelm Wuertz and Oliver Greshake # Arguments: # object - an object of class 'fPORTFOLIO'. # pos - a numeric value, determining the position on the efficient # frontier plotting the pie, by default NULL, i.e. expecting # an object having only one set of weights like the tangency # portfolio. # box - a logical value, determining whether a frame (box) should # be plotted around the pie, by default TRUE. # col - a color palette, by default the rainbow palette. # legend - a logical value, determining whether a legend with # the names of the assets should be plotted, by default TRUE. # Description: # Plots a Pie Chart of Tail Risk Budgets # Arguments: # object - an object of class 'fPORTFOLIO' # col - a color palette, by default the rainbow palette # Example: # riskBudgetsPie(tangencyPortfolio(dutchPortfolioData(), portfolioSpec())) # title(main = "Tangency Portfolio Weights") # FUNCTION: # Default Settings: Title <- "Tail Risk Budgets" if (is.null(col)) col <- seqPalette(getNAssets(object), "Blues") if (sum(c(par()$mfrow, par()$mfcol)) == 4) CEX <- 0.9 else CEX <- 0.7 # Extracting weights position, if specified if(!is.null(pos)){ object = object object@portfolio$weights = getWeights(object@portfolio)[pos, ] } # Check: stop("Not yet implemented") tailRiskMatrix = getTailRisk(object) X <- getCovRiskBudgets(object) # Check for Negative Pie Segments: nX <- getNAssets(object) Sign <- rep("+", nX) Sign[(1:nX)[X < 0]] <- "-" absX <- abs(X) Index <- (1:nX)[X > 0] # Take care of labels, they are also used by the function pie(): if (!is.logical(labels)) { Names <- pieLabels <- labels labels <- FALSE } else { Names <- pieLabels <- object@data@data$names } # Legend Labels: col <- col[Index] legendAssets <- Names[Index] Labels <- paste(Names, Sign) Labels <- Labels[X > 0] Y <- X[X > 0] # Plot: if (labels) { pie(Y, labels = Labels, col = col, radius = radius, cex = CEX) } else { pie(Y, labels = pieLabels, col = col, radius = radius, ...) } # Add Title: if (labels) mtext(Title, adj = 0, line = 2.5, font = 2, cex = CEX+0.1) # Add Info: if (labels) { mtext(paste(getType(object), "|", getSolver(object)), side = 4, adj = 0, col = "grey", cex = 0.7) } # Add Legend: if (legend) { legend("topleft", legend = legendAssets, bty = "n", cex = CEX, fill = col) legendY = as.character(round(100*Y, digits = 1)) legendY = paste(Sign[Index], legendY, sep = "") legendY = paste(legendY, "%") legend("topright", legend = legendY, bty = "n", cex = CEX, fill = col) } # Add Box: if (box) box() # Return Value: invisible(Y) } ################################################################################ fPortfolio/R/00RmetricsPortfolio-package.R0000644000176200001440000000206012323217770020142 0ustar liggesusers # 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 Description. 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 # Copyrights (C) # for Rmetrics: # 1999-2011 - Diethelm Wuertz, GPL # 2007-2011 - Rmetrics Association, GPL # Diethelm Wuertz # for code accessed (or partly included) from other sources: # see copyright and license descriptions ################################################################################ fPortfolio/MD50000644000176200001440000002223113203404463012704 0ustar liggesusers84e94ae8a4e32c30936996f9f0cef576 *ChangeLog 8d0707a2291550aad8c5b35d53ac71d4 *DESCRIPTION c045c3292c2769af9e17c8535cf01b40 *NAMESPACE 9c61ea20343e8315109a8c6047bb8866 *R/00RmetricsPortfolio-package.R 6861674434ab48aaa7269a75d6f6c912 *R/a-class-fPFOLIOBACKTEST.R 80a747f51860402e2e5588831c5bf406 *R/a-class-fPFOLIOCON.R 1fe90749dd54ea433cf28e8d05ee9ecb *R/a-class-fPFOLIODATA.R 217e08a8e3c1d786cf184678180addb7 *R/a-class-fPFOLIOSPEC.R f51bcd4a59433c22181b285425dd6b49 *R/a-class-fPFOLIOVAL.R 26600b6f229cae5def77e8f37d9ec2a7 *R/a-class-fPORTFOLIO.R 86e28e1a826e7ff5596ec3eb88c08d91 *R/backtest-Plots.R fafdb0e0647ba7670f83ac721dd882fc *R/backtest-defaultFunctions.R 2995cdae6303b6c967fab0901fffc78a *R/backtest-getBacktestSpec.R 7b362fa49fe5147cd8a8b508dacddbf8 *R/backtest-getMethods.R 26f480ff3d38f6471400e70958a90c9d *R/backtest-methodsShow.R 31eb51e1db80e42c539c6926620176d1 *R/backtest-netPerformance.R efb22c517f58a7c035742c38d9a36940 *R/backtest-pfolioBacktestSpec.R 5b49c2f6e2e37558c00a6e5e86e28b31 *R/backtest-pfolioBacktesting.R 929abaa9286261495c2f5cfe2f93fc2f *R/backtest-rollingStats.R 8eca1ef71a54b00d563a56635e6d8b84 *R/backtest-setBacktestSpec.R bebbba59f7fb1ea0b015aa86731eeb39 *R/frontier-getPoints.R ab51aaffa694f4f61d53b0cf020b5da8 *R/frontier-portfolioPlots.R 0c204869c95341a86a2f9a634c3a05bb *R/frontier-weightPlots.R 12da752939eaf2aad6c4025c97e12f18 *R/mathprogLP-ampl.R 02bcd48cafdc16bfea96dfbccbdf0195 *R/mathprogLP-glpk.R cdf8bf7e85786ae2a36cbdae098753c5 *R/mathprogLP-neos.R 1b8e3d0145709b556260d19c11a291c5 *R/mathprogLP-symphony.R fdd5a777f1e76fdee002a8d4aa020493 *R/mathprogLP.R 4428e534ff8c53da0fba84bb22f4213f *R/mathprogNLP-ampl.R be7f8d410b2967e5080069e89b2b3343 *R/mathprogNLP-donlp2.R 22461097a1bbf8860ff9e001307830ce *R/mathprogNLP-nlminb2.R 163951e5af04a0f23a8d5296bfdf69bb *R/mathprogNLP-solnp.R 8e8b410b008799f7cca382c874b69ac0 *R/mathprogNLP.R bd42c6082a0f05a2beb1958bfab836ba *R/mathprogQP-ampl.R 1e3471c95a8bb7c5949de1469b52ad3e *R/mathprogQP-ipop.R d353b2e6375377e596b31dfe61b23104 *R/mathprogQP-kestrel.R 5e14b69fced80eaecc086c53e01ca8ef *R/mathprogQP-neos.R 0257d6a35b52cc4bc9b6b0399c75fe66 *R/mathprogQP-quadprog.R 9177cb5c5f4a5d5e06482d465f3b5677 *R/mathprogQP.R 8c559056911428893b70d9d12b07089b *R/methods-mathprog.R 8368a5d4d5e77b328c842bb36fdbaba3 *R/methods-plot.R f729fe56a411603a3f3a2714e8383d56 *R/methods-show.R 749a323db19bfe4cae10fc1727d06f1a *R/methods-summary.R de25c1eaa2f5f9b0e3bbc30f90d314be *R/monitor-indicators.R e8ed773f017fe1f4602726d72358c85d *R/monitor-stability.R b674387d5606178afb6623527d0c87b3 *R/object-getData.R 2752da6015144a4701a51c8a91ad4aa2 *R/object-getPortfolio.R ba4b9d8a140e4ffdafe6653528833c4d *R/object-getPortfolioVal.R cf5fa493a8521ecfcf2a736c076bebad *R/object-getSpec.R 80d1e9dd9cb59786a803cc0284b5b7ad *R/object-getUseMethods.R 3f06ddd58d065b784b7e3ee38967cc55 *R/object-portfolioConstraints.R e07080e8276aed3a72121cec4f9a07af *R/object-portfolioData.R 0e6af119d9a9bda8c0302be6c4cddcb6 *R/object-portfolioSpec.R 4c8694c99a3c7a9f0348c2a9fb2a241d *R/object-setSpec.R b3c00ece0c3bea0e950c563fa15eaea2 *R/plot-vaniniFig.R 2816d5409df473091a3126c24ca55145 *R/plot-weightsLines.R 8a7362f95d75d86de9251f99f42250ad *R/plot-weightsPies.R d37a7325b0123ad253d4d6881f071559 *R/plot-weightsPlots.R c83b26cd69b6adde4f23d2da34047887 *R/plot-weightsSlider.R 4ca48732f888a29777f356a5ecc8256b *R/portfolio-efficientFrontier.R 760d0e43bc1ea0e0e3754069d1926780 *R/portfolio-efficientPfolio.R bd2ad7d2136f7da491ae64e2cdbda3d5 *R/portfolio-feasiblePfolio.R 4ca83d7b214c3826ff6b4c09dcdbd852 *R/portfolio-riskPfolio.R 46a83e737d99e7e5bd84af5ce7c08192 *R/portfolio-rollingPfolio.R 3ab6aa74ee174cbe753eb858410232a9 *R/risk-budgeting.R 63dc17c6e14016c69a206babbd7d3869 *R/risk-covEstimator.R 381f99e393a11577ccbe7d279486143c *R/risk-pfolioMeasures.R b53df020921f9816a5f0de25c2c68f18 *R/risk-surfaceRisk.R 1f66b7bae522ee57658524c5449224d8 *R/risk-tailBudgets.R 9c39859563c928ef4ac367130d52d8fe *R/risk-ternaryMap.R 460497d2d16d2d9e53a4c964d67a3844 *R/solve-Rampl.R f6399901056b542dbf818249bb7c46cd *R/solve-Rdonlp2.R 449bca3f005111eb259c289a1279e556 *R/solve-RglpkMAD.R c810977fd7fe9434936b125eee39f2e6 *R/solve-RglpkVAR.R fa3fa0e752edc54e2400a1264e94b6a1 *R/solve-Ripop.R 6a6e50e72ef5b00a9dbc25981b7a2eb4 *R/solve-Rquadprog.R 7b8fa9e8fc7fa501993df546ad2ac083 *R/solve-RquadprogCLA.R 7c7f0eb6154e69e8fec3f490f9b4ac6a *R/solve-RshortExact.R 957c7ac2395ec633ccb1d3853b9ce3dd *R/solve-Rsocp.R ac68b9d18d143730cf5a7aa2814356e9 *R/solve-Rsolnp.R a14dd59f26f02d9ecc2259f694c03083 *R/solve-RtwoAssets.R 5ffa1a117cc651bd95d05b11d245c67b *R/solve-environment.R cb8e34e01ca59ff177182f558f370671 *R/utils-NLPgeneral.R 74cd15a5dc9285f24230c0c5065aae69 *R/utils-amplExec.R 81883f759ddd79f294f62b692aa6aba5 *R/utils-amplExtractors.R 6d6a1948fdf053e94055cddfdafad11f *R/utils-amplInterface.R 1dddd167af0e234308ca233a4a9640f4 *R/utils-amplLibrary.R 37757850b5e7f57851a86974bf2a41b4 *R/utils-exampleData.R ea143f9154560dd70050bbc2a60326ab *R/utils-methods.R e93dd92f5dbe044868304d1319a0ed93 *R/utils-specs.R 53208dc3190d0a1c729f80ce8767dea9 *R/zzz.R 624342bcb232ecd30748f650c9d108b1 *data/ECON85.csv 91f6ea4ee14073dbe9a9eb231ec45214 *data/ECON85LONG.csv 84e46cd7f37a1ef23e2af3cec871175f *data/GCCINDEX.RET.rda 8c6803194ef5189087e883921f2122b1 *data/GCCINDEX.rda 3ac068e79b54d09dcb53eb1a6c2bf3fd *data/LPP2005.RET.rda 783fc278d29df7431641c7fe49b347fa *data/LPP2005.rda e5df0bc935b5876d741b1729c09d8d35 *data/SMALLCAP.RET.rda 628c78d617f384a953b146f985606978 *data/SMALLCAP.rda 6d017e6cc90b719255abe93ffd6f0db9 *data/SPISECTOR.RET.rda daa5ee6da2199aacb68864b8804348a8 *data/SPISECTOR.rda efee963c851f28e80ef51fae93ef0080 *data/SWX.RET.rda bf608e3349ddb4296165536ee5006bfd *data/SWX.rda d41d8cd98f00b204e9800998ecf8427e *inst/LICENSE_AMPL fe0cf809f11102c42dd811ff01c479e1 *inst/LICENSE_DONLP2 4a01a472db7fb700bd56c34b4c206375 *inst/LICENSE_GLPK f47716c075ed103781e2a77a0ede2477 *inst/LICENSE_QUADPROG ee15c3afc720f0b9f24f6196cdf5e3b8 *inst/LICENSE_SOCP fb62e6486baa854b494dbdc570262dd0 *inst/LICENSE_SOLNP bdb660a470a12c8332b05451868092f6 *inst/ReferenceCard.txt 445ae4c3417aa210e78a7cd3783db23c *inst/obsolete/zzz.Deprecated.R 8aa7b8e28557f52d9142b7ffcc710c42 *man/00fPortfolio-package.Rd 8068833535e7a78e2b56b37d738c9a10 *man/a-class-fPFOLIOBACKTEST.Rd 4630021f7d22f8343efb110ab9413224 *man/a-class-fPFOLIOCON.Rd 0146be7c56345243b568c06ed733cf34 *man/a-class-fPFOLIODATA.Rd b40cb881570942259ddcf5bcd0f6a03f *man/a-class-fPFOLIOSPEC.Rd c24a6d13bf34dff1fb5d01af4c71e473 *man/a-class-fPFOLIOVAL.Rd efff73ab6b138a3f34eacb823006c780 *man/a-class-fPORTFOLIO.Rd a2869ead43a6b3aeb85afa215867e91c *man/backtest-constructors.Rd f78270a190366e34d1a2d203f44469dc *man/backtest-extractors.Rd ebb9d61e97ace5d58b1d5fc06885a6de *man/backtest-functions.Rd 2a8a0ae0d1d0a4261414d61f46ed8f23 *man/backtest-getMethods.Rd 9fd641a6e8d4dad5137d25dc185ed66d *man/backtest-performance.Rd 87260a1f4021790d162888155dd2f852 *man/backtest-plots.Rd b743f80919381d17ea6cd52da1f44f73 *man/backtest-portfolios.Rd 3bfeea745a6eae129733d191711fd216 *man/backtest-specification.Rd 245559ad1b21a149b3e8d4134b52c459 *man/backtest-statisitics.Rd a937d3ec59b03e219f642da354818e93 *man/data-sets.Rd 2ab2d2bdfbe8b02bd399526a624455c9 *man/frontier-Plot.Rd 80190551c20f2f85713bc16904445a2c *man/frontier-PlotControl.Rd 1faf2fa7c3382ea7946c02ca7a5e4efd *man/frontier-Points.Rd 9feba53b7379bd0da2e5ffca5deb18de *man/mathprog-LP.Rd 97bca7fdfbec66b46f2675904dd4d8c2 *man/mathprog-NLP.Rd 16101ab5b26ddd6b4ac8c2478089d04c *man/mathprog-QP.Rd 71b648e90743c71d4f4d6d4d6888aaac *man/methods-plot.Rd d9b58bfcea01dcada88d9e915213a030 *man/methods-show.Rd be398146a051f2a342be788268eed0e0 *man/methods-summary.Rd c4daa0c54c65686d68262bc1b65f8396 *man/monitor-stability.Rd 66b32c4f92815ab8b0f489d7d279d281 *man/portfolio-Constraints.Rd 12dc225f41fd9beb58162b6dd8eb9a7c *man/portfolio-Data.Rd b0f8d94f96d3b470aa8f1d126d58fa45 *man/portfolio-Frontier.Rd 187a66070d0d8e0f03c169b6128c478e *man/portfolio-Rolling.Rd 983435404984e16cb6ccea506b42e48a *man/portfolio-covEstimator.Rd c7031be11b9febe458169d3fd65abb2b *man/portfolio-efficientPfolio.Rd be3fc69ac15412bf9d9d330fe53a1191 *man/portfolio-feasiblePfolio.Rd 4e0a5597b63da586dd3261a11d1531c2 *man/portfolio-getData.Rd d7c8c6271f708d43d36a19ef786b15ef *man/portfolio-getDefault.Rd aa2d15a0dfc62cf11ff729d3cfcccd25 *man/portfolio-getPortfolio.Rd dd865180d9ec78f73d60750258cbf1a0 *man/portfolio-getSpec.Rd 25397871d135713996abcb4a397855db *man/portfolio-getVal.Rd 589dcec5f66f04b214d03fec6fed306d *man/portfolio-pfolioRisk.Rd f3e52157e95c2b3904c535388f906bc5 *man/portfolio-portfolioSpec.Rd ae191a5b5dc3db2e2a6e84bbd8a4a6ef *man/portfolio-riskPfolio.Rd 7d6ab136392d6a25f11911b6b29fe34d *man/portfolio-setSpec.Rd 3364c894fba153f2a2053cb9e8f69c5c *man/risk-budgeting.Rd a054ee1b376736078ebcbf230a5664ac *man/risk-surfaceRisk.Rd e1d61f177c1aeb2cab0016e4c9d7d527 *man/risk-ternaryMap.Rd 1cb09c273225056e632bdda650989074 *man/solve-environment.Rd 865662e941bf529a6b1b759ea3b124a6 *man/solver-ampl.Rd ad861acd5ea8fb26675b724a53ae548c *man/solver-rfamily.Rd e0aac0b928d21c629cb2f2f52405e380 *man/utils-methods.Rd 2792ccc821cba4e52d2da0bc6fbf64d1 *man/weights-Slider.Rd 0eec377bb64237d1c1d6b9249c3e72e5 *man/weights-barPlots.Rd 3600dafd0e40154b8b71954f3d3c1890 *man/weights-linePlots.Rd 61c96ba4ffbe3879bdf134069fdde82d *man/weights-piePlots.Rd fPortfolio/DESCRIPTION0000644000176200001440000000161013203404463014100 0ustar liggesusersPackage: fPortfolio Title: Rmetrics - Portfolio Selection and Optimization Date: 2017-11-12 Version: 3042.83 Author: Diethelm Wuertz [aut], Tobias Setz [cre], Yohan Chalabi [ctb], William Chen [ctb] Maintainer: Tobias Setz Description: Provides a collection of functions to optimize portfolios and to analyze them from different points of view. Depends: R (>= 2.15.1), timeDate, timeSeries, fBasics, fAssets Imports: fCopulae, robustbase, MASS, Rglpk, slam, Rsolnp, quadprog, kernlab, rneos, methods, grDevices, graphics, stats, utils Suggests: Rsocp, Rnlminb2, Rdonlp2, Rsymphony, dplR, bcp, fGarch, mvoutlier Additional_repositories: http://r-forge.r-project.org/ LazyData: yes License: GPL (>= 2) URL: https://www.rmetrics.org NeedsCompilation: no Packaged: 2017-11-16 17:28:41 UTC; Tobias Setz Repository: CRAN Date/Publication: 2017-11-16 21:54:59 UTC fPortfolio/ChangeLog0000644000176200001440000003104213202401303014133 0ustar liggesusers ChangeLog Package fPortfolio 2015-05-13 wuertz * New function pfolioCVaRoptim added. Computes CVaR along mean-CVaR optimization approach. 2014-09-30 tsetz * Final version compatible to books and other packages. 2014-09-22 tsetz * ChangeLog, DESCRIPTION: Updated ChangeLog and DESCRIPTION files after submission to CRAN. 2014-03-26 wuertz * fPortfolioBacktest Package functions from r-forge embedded 2011-02-10 chalabi * DESCRIPTION: updated DESC file * inst/doc/PortfolioOptimizationSample.pdf: removed pdf file because new version can be found on the website 2011-02-01 chalabi * R/efficientPortfolio.R, inst/unitTests/runit.minriskPortfolio.R: Modified returned value of targetRiskFun when the target return is not feasible with the given constraints. 2010-10-26 chalabi * NAMESPACE: updated NAMESPACE 2010-07-23 chalabi * inst/DocCopying.pdf: removed DocCopying.pdf license is already specified in DESCRIPTION file * DESCRIPTION: moved Rglp and quadprog in Imports DESCR file 2010-04-22 chalabi * DESCRIPTION: updated DESC file * inst/CITATION: updated CITATION file 2010-04-16 chalabi * ChangeLog, DESCRIPTION: DESC and Changelog * R/solveRquadprog.R: set weights to NA when there is no solution 2010-04-13 chalabi * R/solveRquadprog.R: updated for latest version of quadprog 2010-04-12 chalabi * CITATION, DESCRIPTION, inst/CITATION: updated CITATION file * R/solveRquadprog.R: Using solve.QP rather than calling directly Fortran routine in quadprog pkg. 2009-09-30 chalabi * inst/doc, inst/doc/PortfolioOptimizationSample.pdf: added pdf files in inst/doc * DESCRIPTION: updated version number + link to ebooks 2009-09-28 chalabi * DESCRIPTION: updated version number * ChangeLog, DESCRIPTION: updated DESCR and ChangeLog 2009-09-24 stefan7th * R/efficientPortfolio.R: committed all minor local changes * NAMESPACE: new NAMESPACE structure which should ease maintenance of packages. 2009-06-25 chalabi * DESCRIPTION, NAMESPACE: Merge branch 'devel-timeSeries' Conflicts: pkg/timeSeries/R/base-Extract.R pkg/timeSeries/R/timeSeries.R 2009-05-26 wuertz * inst/PortfolioOptimizationSample.pdf: 2009-05-08 chalabi * DESCRIPTION, NAMESPACE, R/builtin-Rglpk.R, R/covEstimator.R, R/solveRglpk.R, R/zzz.R, src: reverted Rglpk C files * man/frontierPlot.Rd, man/getPortfolio.Rd, man/getSpec.Rd, man/getVal.Rd: updated manual pages 2009-05-07 wuertz * R/solveRquadprog.R: printing of warning removed, we have to find for this a practicle solution ... 2009-05-06 wuertz * R/solveRquadprog.R: prints now warning when solver Rquadprog does not end with status 0, but still continues operations ... * R/frontierPlot.R: new argument added return = c("mean", "mu") to function tailoredFrontierPlot(), not checked for the ebook. * CITATION: CITATION file added, eBook Portfilio Optimization * R/frontierPlot.R: bug fixed in plot routines, only happened when risk free rate was > 0 2009-04-29 wuertz * R/covEstimator.R: rmt estimator added * NAMESPACE: NAMESPACE all functions exported * DESCRIPTION: DESSCRIPTION modified * R/builtin-Rglpk.R, R/solveRglpk.R, R/solveRsymphony.R, R/zzz.R: Rglpk builtin added * man/solveRsymphony.Rd: symphony deleted * src, src/Rglpk.h, src/Rglpk_initialize.c, src/Rglpk_read_file.c, src/Rglpk_solve.c, src/glpapi.h, src/glpapi01.c, src/glpapi02.c, src/glpapi03.c, src/glpapi04.c, src/glpapi05.c, src/glpapi06.c, src/glpapi07.c, src/glpapi08.c, src/glpapi09.c, src/glpapi10.c, src/glpapi11.c, src/glpapi12.c, src/glpapi13.c, src/glpapi14.c, src/glpapi15.c, src/glpapi16.c, src/glpapi17.c, src/glpapi18.c, src/glpapi19.c, src/glpapi20.c, src/glpapi21.c, src/glpavl.c, src/glpavl.h, src/glpbfd.c, src/glpbfd.h, src/glpbfx.c, src/glpbfx.h, src/glpcpx.c, src/glpcpx.h, src/glpdmp.c, src/glpdmp.h, src/glpdmx.c, src/glpfhv.c, src/glpfhv.h, src/glpgmp.c, src/glpgmp.h, src/glphbm.c, src/glphbm.h, src/glpini.h, src/glpini01.c, src/glpini02.c, src/glpios.h, src/glpios01.c, src/glpios02.c, src/glpios03.c, src/glpios04.c, src/glpios05.c, src/glpios06.c, src/glpios07.c, src/glpios08.c, src/glpios09.c, src/glpios10.c, src/glpipm.c, src/glpipm.h, src/glpipp.h, src/glpipp01.c, src/glpipp02.c, src/glpk.h, src/glplib.h, src/glplib01.c, src/glplib02.c, src/glplib03.c, src/glplib04.c, src/glplib05.c, src/glplib06.c, src/glplib07.c, src/glplib08.c, src/glplib09.c, src/glplib10.c, src/glplib11.c, src/glplib12.c, src/glplpf.c, src/glplpf.h, src/glplpp.h, src/glplpp01.c, src/glplpp02.c, src/glplpx01.c, src/glplpx02.c, src/glplpx03.c, src/glplpx04.c, src/glplpx05.c, src/glpluf.c, src/glpluf.h, src/glplux.c, src/glplux.h, src/glpmat.c, src/glpmat.h, src/glpmpl.h, src/glpmpl01.c, src/glpmpl02.c, src/glpmpl03.c, src/glpmpl04.c, src/glpmpl05.c, src/glpmpl06.c, src/glpmps.h, src/glpmps01.c, src/glpmps02.c, src/glpnet.h, src/glpnet01.c, src/glpnet02.c, src/glpnet03.c, src/glpnet04.c, src/glpnet05.c, src/glpnet06.c, src/glpnet07.c, src/glpqmd.c, src/glpqmd.h, src/glprgr.c, src/glprgr.h, src/glprng.h, src/glprng01.c, src/glprng02.c, src/glpscf.c, src/glpscf.h, src/glpscg.c, src/glpscg.h, src/glpscl.c, src/glpscl.h, src/glpsds.c, src/glpspm.c, src/glpspm.h, src/glpspx.h, src/glpspx01.c, src/glpspx02.c, src/glpsql.c, src/glpsql.h, src/glpssx.h, src/glpssx01.c, src/glpssx02.c, src/glpstd.h, src/glptsp.c, src/glptsp.h: Rglpk C files * R/solveRglpk.R, R/solveRquadprog.R, R/solveRshortExact.R, R/solveRsymphony.R: small solver updates * R/covEstimator.R: more cov estimators added, student, bagged, bayesStein and ledoitWolf, currently for internal use only 2009-04-19 chalabi * DESCRIPTION: added explicit version number in Depends field for key packages 2009-04-17 wuertz * R/solveRglpk.R: Problems with Rglpk solver now solved. * R/portfolioSpec.R: New internal function .checkSpec() introduced. Stops execution when we have specified a linear solver forgot that we have still a quadratic programming problem. Not yet all cases to be checked are already implemented. * R/methods-show.R: A bug introduced when printing option introduced for n (=5) lines, has been removed. * R/efficientPortfolio.R: The compution of the portfolio now stops and returns an error if the minrisk and/or maxratio portfolios do not exist. 2009-04-04 chalabi * NAMESPACE, R/covEstimator.R, R/efficientPortfolio.R, R/feasiblePortfolio.R, R/portfolioConstraints.R, R/portfolioData.R, R/portfolioFrontier.R, R/portfolioRisk.R, R/solveRglpk.R, R/solveRquadprog.R, R/solveRshortExact.R, R/solveRsymphony.R, R/solveTwoAssets.R: improved speed of some key functions 2009-04-03 chalabi * R/methods-show.R, R/zzz.R: added 'length.print' in Rmetrics global envir. It is used in show method. 2009-04-03 wuertz * R/methods-show.R: prepared for subset printing 2009-04-02 chalabi * DESCRIPTION: more explicit depends and suggests field in DESC file. * DESCRIPTION: updated DESC file 2009-03-31 chalabi * DESCRIPTION: update R version to 2.7.0 in DESC file because Rglpk depends (>= 2.7.0) 2009-03-13 chalabi * R/getDefault.R: removed already present method getModel 2009-02-10 wuertz * R/getPortfolioVal.R: getPortfolioVal committed * man/dataSets.Rd: empty \details removed * man/00fPortfolio-package.Rd, man/class-fPFOLIOCON.Rd, man/class-fPFOLIOSPEC.Rd, man/class-fPFOLIOVAL.Rd, man/covEstimator.Rd, man/dataSets.Rd, man/efficientPortfolio.Rd, man/feasiblePortfolio.Rd, man/frontierPlot.Rd, man/frontierPoints.Rd, man/getData.Rd, man/getDefault.Rd, man/getPortfolio.Rd, man/getSpec.Rd, man/portfolioConstraints.Rd, man/portfolioFrontier.Rd, man/portfolioRisk.Rd, man/portfolioSpec.Rd, man/weightsLinePlot.Rd, man/weightsPie.Rd, man/weightsPlot.Rd: man pages improved 2009-02-09 wuertz * R/getPortfolio.R, inst/unitTests/runit.weightsPie.R, man/getDefault.Rd, man/setSpec.Rd, man/solveRglpk.Rd, man/solveRquadprog.Rd, man/solveRshortExact.Rd, man/solveRsymphony.Rd, man/weightsPlot.Rd, man/weightsSlider.Rd: more docu minor modifications * NAMESPACE, R/efficientPortfolio.R, R/feasiblePortfolio.R, R/frontierPlot.R, R/getData.R, R/getPortfolio.R, R/methods-show.R, R/portfolioConstraints.R, R/portfolioData.R, R/portfolioFrontier.R, R/portfolioRisk.R, R/portfolioSpec.R, R/weightsPie.R, man/00fPortfolio-package.Rd, man/class-fPFOLIOCON.Rd, man/class-fPFOLIODATA.Rd, man/class-fPFOLIOSPEC.Rd, man/class-fPORTFOLIO.Rd, man/covEstimator.Rd, man/efficientPortfolio.Rd, man/feasiblePortfolio.Rd, man/frontierPlot.Rd, man/frontierPlotControl.Rd, man/frontierPoints.Rd, man/getData.Rd, man/getDefault.Rd, man/getPortfolio.Rd, man/getSpec.Rd, man/methods-plot.Rd, man/methods-show.Rd, man/methods-summary.Rd, man/portfolioConstraints.Rd, man/portfolioData.Rd, man/portfolioFrontier.Rd, man/portfolioRisk.Rd, man/portfolioRolling.Rd, man/portfolioSpec.Rd, man/setSpec.Rd, man/solveRglpk.Rd, man/solveRquadprog.Rd, man/solveRshortExact.Rd, man/solveRsymphony.Rd, man/weightsLinePlot.Rd, man/weightsPie.Rd, man/weightsPlot.Rd, man/weightsSlider.Rd: working on help pages, also some script files and code reorganized 2009-02-04 chalabi * R/portfolioConstraints.R: 2009-02-03 chalabi * man/solveRsymphony.Rd: fixed man pages Rsymphony with new Rdparse 2009-02-02 chalabi * DESCRIPTION, NAMESPACE, R/solveRsymphony.R, man/solveRsymphony.Rd: added Rsymphony to fPortfolio 2009-01-30 wuertz * R/class-fPFOLIOVAL.R: new class for portffolio values on the frontier * NAMESPACE, R/class-fPORTFOLIO.R, R/feasiblePortfolio.R, R/frontierPlot.R, R/frontierPoints.R, R/getPortfolio.R, R/methods-show.R, R/portfolioFrontier.R, R/weightsPlot.R, man/weightsPie.Rd: many small but significant changes * R/getPortfolio.R, R/methods-show.R: get / set functions checked, print function for the free risk rate fixed 2009-01-29 wuertz * R/getData.R, R/getDefault.R, R/getPortfolio.R, R/getSpec.R, R/methods-show.R, R/portfolioSpec.R, man/getSpec.Rd, man/portfolioSpec.Rd: not yet implemented set and get functions added 2009-01-28 chalabi * R/frontierPlot.R: changed tailoredFrontierPlot to avoid warnings 2009-01-26 chalabi * data/GCCINDEX.RET.rda, data/GCCINDEX.rda, data/LPP2005.RET.rda, data/LPP2005.rda, data/SMALLCAP.RET.rda, data/SMALLCAP.rda, data/SPISECTOR.RET.rda, data/SPISECTOR.rda, data/SWX.RET.rda, data/SWX.rda: removed user name in documetation slot of timeSeries data 2009-01-26 wuertz * R/class-fPORTFOLIO.R, R/feasiblePortfolio.R, R/frontierPlot.R, R/getPortfolio.R, man/portfolioSpec.Rd: fPORTFOLIO class representation modified for the slots data, spec, and constraints 2009-01-25 wuertz * R/methods-show.R: * R/methods-show.R: print function extended to non-linear constraints * R/methods-show.R, R/portfolioData.R: rownames colnames added * R/methods-show.R: names added to print function * R/methods-show.R: print function extended 2009-01-24 wuertz * R/methods-show.R, R/portfolioSpec.R: print functions for portfolio spec improved * R/efficientPortfolio.R: Comment added * R/efficientPortfolio.R, man/efficientPortfolio.Rd: example modified 2009-01-23 wuertz * R/setSpec.R: some checks added * R/portfolioConstraints.R: missing target return specified to NA * R/methods-show.R: rownames added to print method 2009-01-20 chalabi * data/GCCINDEX.RET.rda, data/GCCINDEX.rda, data/LPP2005.RET.rda, data/LPP2005.rda, data/SMALLCAP.RET.rda, data/SMALLCAP.rda, data/SPISECTOR.RET.rda, data/SPISECTOR.rda, data/SWX.RET.rda, data/SWX.rda: datasets as they used to be generated in old zzz.R file 2009-01-20 wuertz * data/GCCINDEX.RET.rda, data/GCCINDEX.rda, data/LPP2005.RET.rda, data/SPISECTOR.rda, data/SWX.RET.rda, data/SWX.rda: I put for the moment the data back to fPortfolio, still missing are SPISECTOR.RET and LPP2005. so we have not to build and load every time the whole bundle, when we have a small error in the packages. And the person who uses fPortfolio standalone has also the data. we should build the bundle at the very end identical with the packages in CRAN/R-forge. 2009-01-16 chalabi * data/SMALLCAP.RET.rda: added timeSeries data * NAMESPACE, R/zzz.R, data/GCCINDEX.DF.CSV, data/LPP2005.RET.DF.CSV, data/SMALLCAP.RET.DF.CSV, data/SPISECTOR.DF.CSV, data/SWX.DF.CSV, man/00fPortfolio-package.Rd, man/solveRglpk.Rd, man/solveRquadprog.Rd, man/solveRshortExact.Rd: fixed warning with new Rd parser and changes data set form csv to timeSeries format 2009-01-12 wuertz * R/efficientPortfolio.R: title modified fPortfolio/man/0000755000176200001440000000000013201353173013146 5ustar liggesusersfPortfolio/man/methods-show.Rd0000644000176200001440000000077012323217772016072 0ustar liggesusers\name{methods-show} \alias{show-methods} \alias{show,fPORTFOLIO-method} \title{Portfolio Print Methods} \description{ show-methods. } \usage{ \S4method{show}{fPORTFOLIO}(object) } \arguments{ \item{object}{ an S4 object of class \code{fPORTFOLIO}. } } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/portfolio-pfolioRisk.Rd0000644000176200001440000000152212323217772017601 0ustar liggesusers\name{portfolio-pfolioRisk} \alias{pfolioRisk} \alias{covRisk} \alias{varRisk} \alias{cvarRisk} \title{portfolioRisk} \description{ Computes covariance and CVaR portfolio risk. } \usage{ covRisk(data, weights) varRisk(data, weights, alpha = 0.05) cvarRisk(data, weights, alpha = 0.05) } \arguments{ \item{data}{ a multivariate time series described by an S4 object of class \code{timeSeries}. } \item{weights}{ a numeric vector of weights. } \item{alpha}{ a numeric value, the confidence level, by default \code{alpha=0.05}, i.e. 5\%. } } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/solve-environment.Rd0000644000176200001440000000133512323217772017141 0ustar liggesusers\name{solve-environment} \alias{Data} \alias{portfolioObjective} \alias{portfolioReturn} \alias{portfolioRisk} \title{Nonlinear Objective Presettings} \description{ Prests variables for Data, portfolioObjective, portfolioReturn, and portfolioRisk in the case of NL math programming of portfolios. } \usage{ Data portfolioObjective(weights) portfolioReturn(weights) portfolioRisk(weights) } \arguments{ \item{weights}{ a vector of portfolio weights } } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{optim} fPortfolio/man/weights-Slider.Rd0000644000176200001440000001602712323217772016345 0ustar liggesusers\name{weights-Slider} \alias{weightsSlider} \title{Portfolio Weights Slider} \description{ Interactive portfolio weights plot. } \usage{ weightsSlider(object, control = list(), \dots) } \arguments{ \item{control}{ a list, defining the plotting parameters. The list modifies amongst others the color, e.g. \code{minvariance.col}, type of point, e.g. \code{tangency.pch}, or the dimension of the point, e.g. \code{cml.cex}, see Notes for a complete list of control parameters. } \item{object}{ an S4 object of class \code{fPORTFOLIO}. } \item{\dots}{ optional arguments to be passed. } } \details{ The slider has illustrative objectives. The function expects an S4 object of class \code{fPORTFOLIO}. The weights slider gives an overview of the weights on the efficient frontier. Three weight plots \code{weightsPlot}, \code{piePlot} and the not stacked weights and a frontier plot with the single assets, the tangency portfolio and a legend are provided. In the two weights plots the vertical line indicates the current portfolio and a dotted one indicates the minimum variance portfolio. The number in the pie plot stands for the asset and the sign shows whether this asset is short or long. In all plots colors represent the same asset. } \value{ Creates interactive plots. } \section{Control Parameters}{ In the following all elements of argument control from functions \code{plot}, \code{weightsSlider}, \code{frontierSlider} are listed. \describe{ \item{sliderResolution}{ a numeric, determining the numbers of slider points, by default nFrontierPoints/10. } \item{sliderFlag}{ a character string, denoting the slidertype, by default "frontier" for \code{frontierSlider} and "weights" for \code{weightsSlider}. } \item{sharpeRatio.col}{ a character string, defining color of the Sharpe ratio plot, by default "black". } \item{minvariance.col}{ a character string, defining color of the minimum variance portfolio, by default "red". } \item{tangency.col}{ a character string, defining color of the tangency portfolio, by default "steelblue". } \item{cml.col}{ a character string, defining color of the market portfolio and the capital market line, by default "green". } \item{equalWeights.col}{ a character string, defining the color of the equal weights portfolio, by default "blue". } \item{runningPoint.col}{ a character string, defining color of the point indicating the current portfolio, by default "red". } \item{singleAsset.col}{ a character string vector, defining color of the single asset portfolios. The vector must have length the number of assets, by default \code{rainbow}. } \item{twoAssets.col}{ a character string, defining color of the two assets efficient frontier, by default "grey". } \item{monteCarlo.col}{ a character string, defining color of the Monte Carlo portfolios, by default "black". } \item{minvariance.pch}{ a number, defining symbol used for the minimum variance portfolio. See \code{\link{points}} for description. Default symbol is 17. } \item{tangency.pch}{ a number, defining symbol used for the tangency portfolio. See \code{\link{points}} for description. Default symbol is 17. } \item{cml.pch}{ a number, defining symbol used for the market portfolio. See \code{\link{points}} for description. Default symbol is 17. } \item{equalWeights.pch}{ a number, defining symbol used for the equal weights portfolio. See \code{\link{points}} for description. Default symbol is 15. } \item{singleAsset.pch}{ a number, defining symbol used for the single asset portfolios. See \code{\link{points}} for description. Default symbol is 18. } \item{sharpeRatio.cex}{ a number, determining size (percentage) of the Sharpe ratio plot, by default 0.1. } \item{minvariance.cex}{ a number, determining size (percentage) of the minimum variance portfolio symbol, by default 1. } \item{tangency.cex}{ a number, determining size (percentage) of the tangency portfolio symbol, by default 1.25. } \item{cml.cex}{ a number, determining size (percentage) of the market portfolio symbol, by default 1.25. } \item{equalWeights.cex}{ a number, determining size (percentage) of the equal weights portfolio symbol, by default 0.8. } \item{runningPoint.cex}{ a number, determining size (percentage) of the point indicating the current portfolio equal weights portfolio symbol, by default 0.8. } \item{singleAsset.cex}{ a number, determining size (percentage) of the singel asset portfolio symbols, by default 0.8. } \item{twoAssets.cex}{ a number, determining size (percentage) of the two assets efficient frontier plot, by default 0.01. } \item{monteCarlo.cex}{ a number, determining size (percentage) of the Monte Carol portfolio symbols, by default 0.01. } \item{monteCarlo.cex}{ a number, determining size (percentage) of the Monte Carol portfolio symbols, by default 0.01. } \item{mcSteps}{ a number, determining number of Monte Carol portfolio, by default 5000. } \item{pieR}{ a vector, containing factors for shrinking and stretching the x- and y-axis, by default NULL, i.e. c(1, 1) is used. Default pie size is 1/15 of the plot range. } \item{piePos}{ a number, determining the weight on the efficient frontier, which is illustrated by the pie. Default is tangency portfolio } \item{pieOffset}{ a vector, containing the pie's x- and y-axis offset from the efficient frontier. Default is NULL, i.e. the pie is set one default radius left of the efficient frontier. } \item{xlim}{ a vector, containing x-axis plot limits of the efficient frontier. Default setting is maximum of frontier range or single assets portfolios. } \item{ylim}{ a vector, containing y-axis plot limits of the efficient frontier. Default setting is maximum of frontier range or single assets portfolios. } } } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/mathprog-NLP.Rd0000644000176200001440000001122312323217772015714 0ustar liggesusers\name{mathprog-NLP} \alias{rdonlp2NLP} \alias{donlp2NLP} \alias{donlp2NLPControl} \alias{rdonlp2} \alias{rsolnpNLP} \alias{solnpNLP} \alias{solnpNLPControl} \alias{rsolnp} \alias{rnlminb2NLP} \alias{nlminb2NLP} \alias{nlminb2NLPControl} \alias{rnlminb2} \alias{ramplNLP} \alias{amplNLP} \alias{amplNLPControl} \title{Mathematical Non-Linear Programming} \description{ Mathematical Non-Linear Programming. } \usage{ rdonlp2NLP(start, objective, lower=0, upper=1, linCons, funCons, control=list()) donlp2NLP(start, objective, par.lower=NULL, par.upper=NULL, eqA=NULL, eqA.bound=NULL, ineqA=NULL, ineqA.lower=NULL, ineqA.upper=NULL, eqFun=list(), eqFun.bound=NULL, ineqFun=list(), ineqFun.lower=NULL, ineqFun.upper=NULL, control=list()) donlp2NLPControl( iterma=4000, nstep=20, fnscale=1, report=FALSE, rep.freq=1, tau0=1, tau=0.1, del0=1, epsx=1e-05, delmin=0.1 * del0, epsdif=1e-08, nreset.multiplier=1, difftype=3, epsfcn=1e-16, taubnd=1, hessian=FALSE, te0=TRUE, te1=FALSE, te2=FALSE, te3=FALSE, silent=TRUE, intakt=TRUE) rdonlp2 rsolnpNLP(start, objective, lower=0, upper=1, linCons, funCons, control=list()) solnpNLP(start, objective, par.lower=NULL, par.upper=NULL, eqA=NULL, eqA.bound=NULL, ineqA=NULL, ineqA.lower=NULL, ineqA.upper=NULL, eqFun=list(), eqFun.bound=NULL, ineqFun=list(), ineqFun.lower=NULL, ineqFun.upper=NULL, control=list()) solnpNLPControl( rho=1, outer.iter=400, inner.iter=800, delta=1e-07, tol=1e-08, trace=0) rsolnp rnlminb2NLP(start, objective, lower=0, upper=1, linCons, funCons, control=list()) nlminb2NLP(start, objective, par.lower=NULL, par.upper=NULL, eqA=NULL, eqA.bound=NULL, ineqA=NULL, ineqA.lower=NULL, ineqA.upper=NULL, eqFun=list(), eqFun.bound=NULL, ineqFun=list(), ineqFun.lower=NULL, ineqFun.upper=NULL, control=list()) nlminb2NLPControl( eval.max=500, iter.max=400, trace=0, abs.tol=1e-20, rel.tol=1e-10, x.tol=1.5e-08, step.min=2.2e-14, scale=1, R=1, beta.tol=1e-20) rnlminb2 ramplNLP(start, objective, lower=0, upper=1, amplCons, control=list(), ...) amplNLP() amplNLPControl( solver="minos", project="ampl", trace=FALSE) } \arguments{ \item{start}{ a numeric vector, the start values. } \item{objective}{ a function object, the function to be optimized. } \item{lower, upper}{ lower and upper bounds. } \item{linCons}{ list of linear constraints: mat, lower, upper. } \item{funCons}{ list of function constraints. } \item{amplCons}{ AMPL constraints. } \item{control}{ control list. } \item{\dots}{ optional arguments to be passed. } \item{par.lower, par.upper}{...} \item{eqA}{...} \item{eqA.bound}{...} \item{ineqA}{...} \item{ineqA.lower,ineqA.upper}{...} \item{eqFun}{...} \item{eqFun.bound}{...} \item{ineqFun}{...} \item{ineqFun.lower,ineqFun.upper}{...} %\item{x_L,x_U}{...} %\item{A}{...} %\item{b_L,b_U}{...} %\item{solver}{...} %\item{category}{...} %\item{project}{...} %\item{inf}{...} %\item{trace}{...} \item{iterma}{4000} \item{nstep}{20} \item{fnscale}{1} \item{report}{FALSE} \item{rep.freq}{1} \item{tau0}{1} \item{tau}{0.1} \item{del0}{1} \item{epsx}{1e-5} \item{delmin}{0.1 * del0} \item{epsdif}{1e-8} \item{nreset.multiplier}{1} \item{difftype}{3} \item{epsfcn}{1e-16} \item{taubnd}{1} \item{hessian}{FALSE} \item{te0}{TRUE} \item{te1}{FALSE} \item{te2}{FALSE} \item{te3}{FALSE} \item{silent}{TRUE} \item{intakt}{TRUE} \item{rho}{1} \item{outer.iter}{400} \item{inner.iter}{800} \item{delta}{1.0e-7} \item{tol}{1.0e-8} %\item{trace}{0} \item{eval.max}{500} \item{iter.max}{400} \item{trace}{0} \item{abs.tol}{1e-20} \item{rel.tol}{1e-10} \item{x.tol}{1.5e-08} \item{step.min}{2.2e-14} \item{scale}{1} \item{R}{1} \item{beta.tol}{1e-20} \item{solver}{solver name} \item{project}{project name} } \value{ a list of class \code{solver} with the following named ebtries: \code{opt}, \code{solution}, \code{objective}, \code{status}, \code{message}, \code{solver}, \code{version}. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/portfolio-feasiblePfolio.Rd0000644000176200001440000000360312323217772020405 0ustar liggesusers\name{portfolio-feasiblePortfolio} \alias{feasiblePortfolio} \title{Feasible Portfolios} \description{ Returns properties of a feasible portfolio. } \usage{ feasiblePortfolio(data, spec = portfolioSpec(), constraints = "LongOnly") } \arguments{ \item{constraints}{ a character string vector, containing the constraints of the form\cr \code{"minW[asset]=percentage"} for box constraints resp. \cr \code{"maxsumW[assets]=percentage"} for sector constraints. } \item{data}{ a multivariate time series described by an S4 object of class \code{timeSeries}. If your timeSerie is not a \code{timeSeries} object, consult the generic function \code{as.timeSeries} to convert your time series. } \item{spec}{ an S4 object of class \code{fPFOLIOSPEC} as returned by the function \code{portfolioSpec}. } } \details{ A feasible portfolio is a portfolio with given weights which lies inside the feasible region of portfolios. The function requires three arguments: \code{data}, \code{spec} (specifications), and \code{constraints}, see above. Be sure that the specification structure \code{"spec"} has defined a weights vector which is different from \code{"NULL"}. To assign values to the weights in the specification structure, use the function \code{setWeights}. The \code{feasiblePortfolio} function returns the properties of the feasible portfolio as an S4 object of class \code{fPORTFOLIO}. } \value{ \code{feasiblePortfolio} function returns an S4 object of class \code{"fPORTFOLIO"}. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/frontier-Plot.Rd0000644000176200001440000001345312323217772016217 0ustar liggesusers\name{frontier-plot} \alias{frontierPlot} \alias{minvariancePoints} \alias{cmlPoints} \alias{cmlLines} \alias{tangencyPoints} \alias{tangencyLines} \alias{equalWeightsPoints} \alias{singleAssetPoints} \alias{twoAssetsLines} \alias{sharpeRatioLines} \alias{monteCarloPoints} \alias{tailoredFrontierPlot} \title{Efficient Frontier Plot} \description{ Plots the efficient frontier of an optimized portfolio and allows to add points and lines from specif portfolios } \usage{ frontierPlot(object, frontier = c("both", "lower", "upper"), col = c("black", "grey"), add = FALSE, labels = TRUE, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, title = TRUE, \dots) minvariancePoints(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, \dots) cmlPoints(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, \dots) cmlLines(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, \dots) tangencyPoints(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, \dots) tangencyLines(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, \dots) equalWeightsPoints(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, \dots) singleAssetPoints(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, \dots) twoAssetsLines(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, \dots) sharpeRatioLines(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, \dots) monteCarloPoints(object, mcSteps = 5000, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE, \dots) tailoredFrontierPlot(object, return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), mText = NULL, col = NULL, xlim = NULL, ylim = NULL, twoAssets = FALSE, sharpeRatio = TRUE, title = TRUE, \dots) } \arguments{ \item{object}{ an S4 object of class \code{fPORTFOLIO}, containing slots call, data, specification, constraints, portfolio, title, description. } \item{frontier}{ a character string, determining which part of the frontier should be extracted. \code{"both"} stands for the full hyperbola, \code{"lower"} for all points below the minimum variance return and \code{"upper"} for the actual efficient frontier, by default "both". } \item{col}{ a character string vector, setting the color. For \code{frontierPlot} it is a two dimensional a vector; first entry is the upper part of the frontier,\cr second entry the lower, by default "black" and "grey".\cr For the other functions the argument defines the color representation, by default sets the default color is the rainbow palette. } \item{add}{ a logical value, determining whether the frontier should be added to an existing plot, by default FALSE. } \item{return}{ a character string denoting which type of return should be plotted. Allowed values for the return are either \code{"mean"}, or \code{"mu"}. } \item{risk}{ a character string denoting which type of risk should be plotted. Allowed values for the risk measure are either \code{"cov"}, \code{"sigma"}, \code{"VaR"}, or \code{"CVaR"}. } \item{auto}{ a logical flag denoting if the type of return and risk to be plotted should be selected automatically, by default TRUE. } \item{labels}{ a logical flag, should the plot be automatically labeled and decorated? By default \code{TRUE}. } \item{title}{ a logical flag, should the plot obtain a default main title and x- and y-labels? By default \code{TRUE}. } \item{mcSteps}{ an integer value, the number of Monte Carlo steps. } \item{xlim, ylim}{ two numeric vectors with two elelemts , the plot range. If set to NULL the values for the plot ranges are determined automatically. } \item{mText}{ a character string, representing a marginal text string. If set to NULL the value is taken from the title of the input frontier argument. } \item{twoAssets}{ a logical flag, if TRUE, then the two assets frontier lines will be drawn. } \item{sharpeRatio}{ a logical flag, if TRUE, then the Sharpe ratio will be added to the plot. } \item{\dots}{ optional arguments to be passed. } } \details{ \tabular{ll}{ \code{frontierPlot} \tab Plots efficient frontier, \cr \code{minvariancePoints} \tab Adds minimum variance point, \cr \code{cmlPoints} \tab Adds market portfolio, \cr \code{cmlLines} \tab Adds capital market Line, \cr \code{tangencyPoints} \tab Adds tangency portfolio point, \cr \code{tangencyLines} \tab Adds tangency line, \cr \code{equalWeightsPoints} \tab Adds point of equal weights portfolio, \cr \code{singleAssetPoints} \tab Adds points of single asset portfolios, \cr \code{twoAssetsLines} \tab Adds EF for all combinations of two assets, \cr \code{sharpeRatioLines} \tab Adds Sharpe ratio line, \cr \code{monteCarloPoints} \tab Adds randomly produced feasible portfolios, \cr \code{tailoredFrontierPlot} \tab an example for a tailored plot. } } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/portfolio-getSpec.Rd0000644000176200001440000000645112323217772017060 0ustar liggesusers\name{portfolio-getSpec} %%\alias{getSpec} %%conflicts with getDefault \alias{getModel.fPFOLIOSPEC} \alias{getType.fPFOLIOSPEC} \alias{getOptimize.fPFOLIOSPEC} \alias{getEstimator.fPFOLIOSPEC} \alias{getTailRisk.fPFOLIOSPEC} \alias{getParams.fPFOLIOSPEC} \alias{getAlpha.fPFOLIOSPEC} \alias{getA.fPFOLIOSPEC} \alias{getA} \alias{getMessages} \alias{getPortfolio.fPFOLIOSPEC} \alias{getWeights.fPFOLIOSPEC} \alias{getTargetReturn.fPFOLIOSPEC} \alias{getTargetRisk.fPFOLIOSPEC} \alias{getRiskFreeRate.fPFOLIOSPEC} \alias{getNFrontierPoints.fPFOLIOSPEC} \alias{getStatus.fPFOLIOSPEC} \alias{getOptim.fPFOLIOSPEC} \alias{getSolver.fPFOLIOSPEC} \alias{getObjective.fPFOLIOSPEC} \alias{getOptions.fPFOLIOSPEC} \alias{getControl.fPFOLIOSPEC} \alias{getTrace.fPFOLIOSPEC} \alias{getMessages.fPFOLIOSPEC} \title{Portfolio Specification Extractor Functions} \description{ Extracts information from an object of class fPFOLIOSPEC. } \usage{ \method{getModel}{fPFOLIOSPEC}(object) \method{getType}{fPFOLIOSPEC}(object) \method{getOptimize}{fPFOLIOSPEC}(object) \method{getEstimator}{fPFOLIOSPEC}(object) \method{getTailRisk}{fPFOLIOSPEC}(object) \method{getParams}{fPFOLIOSPEC}(object) \method{getPortfolio}{fPFOLIOSPEC}(object) \method{getWeights}{fPFOLIOSPEC}(object) \method{getTargetReturn}{fPFOLIOSPEC}(object) \method{getTargetRisk}{fPFOLIOSPEC}(object) \method{getAlpha}{fPFOLIOSPEC}(object) \method{getRiskFreeRate}{fPFOLIOSPEC}(object) \method{getNFrontierPoints}{fPFOLIOSPEC}(object) \method{getStatus}{fPFOLIOSPEC}(object) \method{getOptim}{fPFOLIOSPEC}(object) \method{getSolver}{fPFOLIOSPEC}(object) \method{getObjective}{fPFOLIOSPEC}(object) \method{getOptions}{fPFOLIOSPEC}(object) \method{getControl}{fPFOLIOSPEC}(object) \method{getTrace}{fPFOLIOSPEC}(object) \method{getMessages}{fPFOLIOSPEC}(object) } \arguments{ \item{object}{ an object of class \code{fPFOLIOSPEC}. } } \details{ \tabular{ll}{ \code{getType} \tab Extracts portfolio type from specification, \cr \code{getOptimize} \tab Extracts what to optimize from specification, \cr \code{getEstimator} \tab Extracts type of covariance estimator, \cr \code{getTailRisk} \tab Extracts list of tail dependency risk matrixes, \cr \code{getParams} \tab Extracts parameters from specification, \cr \code{getWeights} \tab Extracts weights from a portfolio object, \cr \code{getTargetReturn} \tab Extracts target return from specification, \cr \code{getTargetRisk} \tab Extracts target riks from specification, \cr \code{getAlpha} \tab Extracts target VaR-alpha specification, \cr \code{getRiskFreeRate} \tab Extracts risk free rate from specification, \cr \code{getNFrontierPoints} \tab Extracts number of frontier points, \cr \code{getStatus} \tab Extracts the status of optimization, \cr \code{getSolver} \tab Extracts solver from specification, \cr \code{getobjective} \tab Extracts name of objective function, \cr \code{getTrace} \tab Extracts solver's trace flag. } } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/methods-summary.Rd0000644000176200001440000000051312323217772016602 0ustar liggesusers\name{methods-summary} \alias{summary-methods} \title{summary-methods} \description{ summary-methods. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/portfolio-Rolling.Rd0000644000176200001440000000773412323217772017101 0ustar liggesusers\name{portfolio-rollingPortfolios} \alias{portfolioRolling} \alias{rollingPortfolio} \alias{rollingWindows} \alias{rollingCmlPortfolio} \alias{rollingTangencyPortfolio} \alias{rollingMinvariancePortfolio} \alias{rollingPortfolioFrontier} \title{Rolling Portfolio} \description{ A collection and description of functions allowing to roll a portfolio optimization over time. The functions are: \tabular{ll}{ \code{rollingWindows} \tab Returns a list of rolling window frames, \cr \code{rollingCmlPortfolio} \tab Rolls a CML portfolio, \cr \code{rollingTangencyPortfolio} \tab Rolls a tangency portfolio, \cr \code{rollingMinvariancePortfolio} \tab Rolls a minimum risk portfolio, \cr \code{rollingPortfolioFrontier} \tab returns an efficient portfolio} } \usage{ rollingWindows(x, period = "12m", by = "1m") rollingCmlPortfolio(data, spec, constraints, from, to, action = NULL, title = NULL, description = NULL, \dots) rollingTangencyPortfolio(data, spec, constraints, from, to, action = NULL, title = NULL, description = NULL, \dots) rollingMinvariancePortfolio(data, spec, constraints, from, to, action = NULL, title = NULL, description = NULL, \dots) rollingPortfolioFrontier(data, spec, constraints, from, to, action = NULL, title = NULL, description = NULL, \dots) } \arguments{ \item{action}{ a character string naming a user defined function. This function is optionally applied after each rolling step. } \item{by}{ a character string, by default \code{"1m"}, which denotes 1 month. The shift by which the portfolio is rolled. } \item{constraints}{ a character string vector, containing the constraints of the form\cr \code{"minW[asset]=percentage"} for box constraints resp. \cr \code{"maxsumW[assets]=percentage"} for sector constraints. } \item{data}{ a list, having a statistics named list, having named entries 'mu' and 'Sigma', containing the information of the statistics. } \item{description}{ a character string, allowing for a brief project description, by default NULL, i.e. Date and User. } \item{from, to}{ a vector of S4 \code{timeDate} objects which denote the starting and ending dates for the investigation. } \item{period}{ a character string, by default \code{"12m"}, which denotes 12 months. The period over which the portfolio is rolled. } \item{spec}{ an S4 object of class \code{fPFOLIOSPEC}. } \item{title}{ a character string, containing the title for the object, by default NULL. } \item{x}{ an S4 object of class \code{timeSeries} from which the rolling window frames will be created. The length of these frames is given by the argument \code{period} and they are shifted by the value specified by the argument \code{by}. } \item{\dots}{ optional arguments to be passed.\cr } } \details{ \bold{RollingWindows:} The function \code{rollingWindows} constructs from a 'timeSeries' object windows frames of given length \code{period} and shift \code{by}. ... \cr \bold{Rolling Portfolios:} \cr\cr The functions \code{rolling*Portfolio} ... \cr \bold{Rolling Frontier:} \cr\cr The function \code{rollingPortfolioFrontier} ... } \value{ \code{rollingwindows()}\cr returns ... \cr \code{rollingCmlPortfolio}\cr \code{rollingTangencyPortfolio}\cr \code{rollingMinvariancePortfolio}\cr return ... \cr \code{rollingPortfolioFrontier}\cr returns ... \cr } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/a-class-fPFOLIOSPEC.Rd0000644000176200001440000000723412323217772016605 0ustar liggesusers\name{fPFOLIOSPEC} \alias{fPFOLIOSPEC} \alias{class-fPFOLIOSPEC} \alias{fPFOLIOSPEC-class} \alias{show,fPFOLIOSPEC-method} \title{Specification of Portfolios} \description{ Specifies portfolios. } \usage{ \S4method{show}{fPFOLIOSPEC}(object) } \arguments{ \item{object}{ an S4 object of class \code{fPFOLIOSPEC}. } } \details{ \bold{Portfolio Specifcation Structure:} \cr\cr The S4 class \code{fPFOLIOSPEC} specifies the portfolio. The slots are:\cr \describe{ \item{@call}{ a call, returning the matched function call. } \item{@model}{ a list, setting the \code{type} of portfolio to be optimized, and the mean/covariance \code{estimator} to be applied: \cr \code{type=c("MV","CVaR")} a character string denoting the type of portfolio, the implemented types are the Mean-Variance Markowitz Portfolio, \code{"MV"}, and the Mean-CVaR Portfolio, \code{"CVaR"}. \cr \code{estimator=c("mean","cov")} a vector of two character strings, the first denoting the mean estimator, and the second the covariance estimator. Additional meaningful selections include robust covariance estimators, e.g. \code{c("mean","mcd")}, or \code{c("mean","shrink")}. \cr \code{tailRisk=list()} a list of optional tail risk information, currently not used.\cr \code{params=list()} a list of optional model parameters, currently not used. } \item{@portfolio}{ a list, settings portfolio parameters including predefined weights, target return, risk free rate, number of frontier points: \cr \code{weights=NULL} a numeric vector specifying the portfolio weights. \cr \code{targetReturn=NULL} a numeric value specifying the target return. The default value sets the target return. \cr \code{targetRisk=NULL} a numeric value specifying the target risk.\cr \code{targetAlpha=NULL} a numeric value specifying the target alpha confidence level for CVaR portfolio optimization. The default value sets the target return. \cr \code{riskFreeRate=0} a numeric value specifying the risk free rate. \cr \code{nFrontierPoints=50} a numeric value determining the number of points on the efficient frontier. } \item{@solver}{ a list, setting the type of solver to be used for portfolio optimization: \cr \code{type=c("quadprog", "Rdonlp2", "lpSolve")} a character string specifying the name of the solver to be used.\cr \code{trace=FALSE} a logical flag, should the optimization be traced? } \item{@title}{ a title string, with a default project title. } \item{@description}{ a character string, with a default project description. } } } \value{ \code{portfolioSpec}\cr \cr returns an S4 object of class \code{"fPFOLIOSPEC"}. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/portfolio-getDefault.Rd0000644000176200001440000000401112421240244017525 0ustar liggesusers\name{portfolio-getDefault} \alias{getDefault} \alias{getConstraints} \alias{getControl} \alias{getCov} \alias{getCovRiskBudgets} \alias{getData} \alias{getEstimator} \alias{getMean} \alias{getMu} \alias{getUnits} \alias{getModel} \alias{getNAssets} \alias{getNFrontierPoints} \alias{getObjective} \alias{getOptim} \alias{getOptions} \alias{getOptimize} \alias{getPortfolio} \alias{getParams} \alias{getRiskFreeRate} \alias{getSeries} \alias{getSigma} \alias{getSolver} \alias{getSpec} \alias{getStatistics} \alias{getStatus} \alias{getAlpha} \alias{getTailRisk} \alias{getTailRiskBudgets} \alias{getTargetReturn} \alias{getTargetRisk} \alias{getTrace} \alias{getType} \alias{getWeights} \title{Extractor Functions} \description{ Extractor functions to get information from objects of class fPFOLIODATA, fPFOLIOSPEC, fPFOLIODATA, fPFOLIOVAL, and fPORTFOLIO. } \usage{ getConstraints(object) getControl(object) getCov(object) getCovRiskBudgets(object) getData(object) getEstimator(object) getMean(object) getMu(object) getNAssets(object) getNFrontierPoints(object) getObjective(object) getOptim(object) getOptions(object) getOptimize(object) getPortfolio(object) getParams(object) getRiskFreeRate(object) getSeries(object) getSigma(object) getSolver(object) getSpec(object) getStatistics(object) getStatus(object) getAlpha(object) getTailRisk(object) getTailRiskBudgets(object) getTargetReturn(object) getTargetRisk(object) getTrace(object) getType(object) getWeights(object) } \arguments{ \item{object}{ an object of class \code{fPFOLIODATA}, \code{fPFOLIOSPEC} or \code{fPORTFOLIO}. } \item{\dots}{ optional arguments to be passed.\cr } } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/portfolio-setSpec.Rd0000644000176200001440000000721312323217772017071 0ustar liggesusers\name{portfolio-setSpec} \alias{setSpec} \alias{setType<-} \alias{setOptimize<-} \alias{setEstimator<-} \alias{setTailRisk<-} \alias{setParams<-} \alias{setAlpha<-} \alias{setWeights<-} \alias{setTargetReturn<-} \alias{setTargetRisk<-} \alias{setRiskFreeRate<-} \alias{setNFrontierPoints<-} \alias{setStatus<-} \alias{setSolver<-} \alias{setObjective<-} \alias{setTrace<-} %\alias{maxReturn} %\alias{minRisk} \title{Settings for Specifications of Portfolios} \description{ Functions to set specifications for a portfolio. } \usage{ setType(spec) <- value setOptimize(spec) <- value setEstimator(spec) <- value setTailRisk(spec) <- value setParams(spec, name) <- value setAlpha(spec) <- value setWeights(spec) <- value setTargetReturn(spec) <- value setTargetRisk(spec) <- value setRiskFreeRate(spec) <- value setNFrontierPoints(spec) <- value setStatus(spec) <- value setSolver(spec) <- value setObjective(spec) <- value setTrace(spec) <- value %maxReturn(x, mu) %minRisk(x, Sigma) } \arguments{ \item{spec}{ an S4 object of class \code{fPFOLIOSPEC}, the specification to be modified, by default the default of the function \code{portfolioSpec()}. } \item{name}{ a character string, the name of the value to be set. } \item{value}{ a value for that component of \code{spec} to be set. } } \details{ \tabular{ll}{ \code{setType} \tab Sets type of portfolio optimization, \cr \code{setOptimize} \tab Sets what to optimize, min risk or max return, \cr \code{setEstimator} \tab Sets names of mean and covariance estimators, \cr \code{setParams} \tab Sets optional model parameters, \cr \code{setWeights} \tab Sets weights vector, \cr \code{setTargetReturn} \tab Sets target return value, \cr \code{setTargetRisk} \tab Sets target risk value, \cr \code{setTargetAlpha} \tab Sets CVaR target alpha value, \cr \code{setRiskFreeRate} \tab Sets risk-free rate value, \cr \code{setNFrontierPoints} \tab Sets number of frontier points, \cr \code{setStatus} \tab Sets status value, \cr \code{setSolver} \tab Sets the type of solver to be used, \cr \code{setObjective} \tab Sets objective function name to be used, \cr \code{setTrace} \tab Sets the logical trace flag. } %\code{maxReturn} \tab Defines the default maximum return function, \cr %\code{minRisk} \tab Defines the default minimum risk function. } } \value{ \code{setType}\cr \code{setOptimize}\cr \code{setEstimator}\cr \code{setParam}\cr \cr \emph{Model Settings:} just modify the model settings including the portfolio type, the mean/covariance estimator, and optional parameters of an existing portfolio structure. \cr \code{setWeights}\cr \code{setTargetReturn}\cr \code{setTargetRisk}\cr \code{setTargetAlpha}\cr \code{setRiskFreeRate}\cr \code{setNFrontierPoints}\cr \code{setStatus}\cr \cr \emph{Portfolio Settings:} just modify the portfolio settings including predefined weights, the target return, the risk free rate, the number of frontier points, and the return and risk range of an existing portfolio structure. \cr \code{setSolver}\cr \code{setObjective}\cr \code{setTrace}\cr \cr \emph{Optim Settings:} just modifies the solver setting, i.e. the type of solver to be used for portfolio optimization. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/frontier-Points.Rd0000644000176200001440000000344212323217772016552 0ustar liggesusers\name{frontier-points} \alias{frontierPoints} \title{Get Frontier Points} \description{ Extracts the risk and return coordinates of the efficient frontier. } \usage{ frontierPoints(object, frontier = c("both", "lower", "upper"), return = c("mean", "mu"), risk = c("Cov", "Sigma", "CVaR", "VaR"), auto = TRUE) } \arguments{ \item{object}{ an object of class \code{fPORTFOLIO}. } \item{frontier}{ a character string denoting which part of the efficient portfolio should be extractacted. } \item{return}{ character strings denoting which return measure should be plotted. Allowed values for the return are either \code{"mean"}, or \code{"mu"}. } \item{risk}{ character strings denoting which risk measure should be plotted. Allowed values for the risk measure are either \code{"cov"}, \code{"sigma"}, \code{"VaR"}, or \code{"CVaR"}. } \item{auto}{ a logical flag. If \code{auto} is \code{TRUE}, the default setting, then the risk willbe identified automatically from the object. } } \details{ The automated risk detection, \code{auto=TRUE} takes the following decision: \preformatted{ if (auto) { Type = getType(object) Estimator = getEstimator(object) if (Type == "MV") risk = "cov" if (Type == "MV" & Estimator != "covEstimator") risk = "sigma" if (Type == "QLPM") risk = "sigma" if (Type == "CVaR") risk = "CVaR" } } } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/risk-budgeting.Rd0000644000176200001440000000225412330665056016366 0ustar liggesusers\name{risk-budgeting} %\alias{pfolioReturn} \alias{sampleCOV} \alias{normalVaR} \alias{modifiedVaR} \alias{sampleVaR} \alias{budgetsSampleCOV} \alias{budgetsNormalVAR} \alias{budgetsModifiedVAR} \alias{budgetsNormalES} \alias{budgetsModifiedES} \title{Risk Budgeting} \description{ Functions for risk budgeting. } \usage{ %pfolioReturn(x, weights, geometric=TRUE) sampleCOV(x) normalVaR(x, alpha=0.05) modifiedVaR(x, alpha=0.05) sampleVaR(x, alpha=0.05) budgetsSampleCOV(x, weights, mu=NULL, Sigma=NULL) budgetsNormalVAR(x, weights, alpha=0.05, mu=NULL, Sigma=NULL) budgetsModifiedVAR(x, weights, alpha=0.05, mu=NULL, Sigma=NULL, M3=NULL, M4=NULL) budgetsNormalES(x, weights, alpha=0.05, mu=NULL, Sigma=NULL) budgetsModifiedES(x, weights, alpha=0.05, mu=NULL, Sigma=NULL, M3=NULL, M4=NULL) } \arguments{ \item{x}{x} \item{weights}{weights} \item{alpha}{alpha} \item{mu,Sigma}{mean and covariance} \item{M3, M4}{M3 and M4} } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/solver-rfamily.Rd0000644000176200001440000000346412323217772016427 0ustar liggesusers\name{solver-family} \alias{solveRglpk.CVAR} \alias{solveRglpk.MAD} \alias{solveRampl.CVAR} \alias{solveRshortExact} \alias{solveRquadprog} \alias{solveRquadprog.CLA} \alias{solveRipop} \alias{solveRampl.MV} \alias{solveRsocp} \alias{solveRdonlp2} \alias{solveRsolnp} \title{LP, QP, and NLP Programming Solvers} \description{ Rmetrics solver interface. } \usage{ solveRglpk.CVAR(data, spec, constraints) solveRglpk.MAD(data, spec, constraints) solveRampl.CVAR(data, spec, constraints) solveRshortExact(data, spec, constraints) solveRquadprog(data, spec, constraints) solveRquadprog.CLA(data, spec, constraints) solveRipop(data, spec, constraints) solveRampl.MV(data, spec, constraints) solveRsocp(data, spec, constraints) solveRdonlp2(data, spec, constraints) solveRsolnp(data, spec, constraints) } \arguments{ \item{data}{ a time series or a named list, containing either a series of returns or named entries 'mu' and 'Sigma' being mean and covariance matrix. } \item{spec}{ an S4 object of class \code{fPFOLIOSPEC} as returned by the function \code{portfolioSpec}. } \item{constraints}{ a character string vector, containing the constraints of the form\cr \code{"minW[asset]=percentage"} for box constraints resp. \cr \code{"maxsumW[assets]=percentage"} for sector constraints. } } \value{ a list with the following named ebtries: \code{solver}, \code{optim}, \code{weights}, \code{targetReturn}, \code{targetRisk}, \code{objective}, \code{status}, \code{message}. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/backtest-plots.Rd0000644000176200001440000000717012330665056016411 0ustar liggesusers\name{backtest-plots} \alias{backtestPlot} \alias{backtestAssetsPlot} \alias{backtestWeightsPlot} \alias{backtestRebalancePlot} \alias{backtestPortfolioPlot} \alias{backtestDrawdownPlot} \alias{backtestReportPlot} \title{Portfolio backtesting plots} \description{ Creates and displays plots of cumulative assets returns, of portfolio weights, of rebalanced weights, of drawdowns and of a report summary for backtesting. } \usage{ % We should add a generic plot function for objects of class smoothed % portfolios. DW % backtestPlot(object, which="all", labels=TRUE, legend=TRUE, at=NULL, format=NULL, cex=0.6, font=1, family="mono") backtestAssetsPlot(object, labels=TRUE, legend=TRUE, at=NULL, format=NULL) backtestWeightsPlot(object, labels=TRUE, legend=TRUE, at=NULL, format=NULL) backtestRebalancePlot(object, labels=TRUE, legend=TRUE, at=NULL, format=NULL) backtestPortfolioPlot(object, labels=TRUE, legend=TRUE, at=NULL, format=NULL) backtestDrawdownPlot(object, labels=TRUE, legend=TRUE, at=NULL, format=NULL) backtestReportPlot(object, cex=0.6, font=1, family="mono") } \arguments{ \item{object}{ a list, returned from running the function \code{portfolioSmoothing}. } \item{which}{ an integer or string value. If the argument is an integer then it specifies which backtest plot should be displayed. If the argument take the character value \code{all}, which is the default, then all 6 available backtest plots will be displayed. } \item{labels}{ a logical flag, determining if the graph should be labeled automatically. This is the default case \code{labels=TRUE}. If set to \code{FALSE} then the graph will be displayed undecorated and the user can it decorate by himself. } \item{legend}{ a logical flag, determining if to the graph a legend should be added. This is the default case \code{labels=TRUE}. If set to \code{FALSE} then the graph will be displayed undecorated and the user can it decorate by himself. } \item{at}{ if NULL the time-axis ticks will be selected automatically. If \code{at} is a vector of \code{timeData} character formatted dates then the axis ticks ar taken from this vector. } \item{format}{ if NULL the time-axis ticks are labeled automatically. If \code{format} is a POSIX format string, tthen the label formats are taken from this string. } \item{cex, font, family}{ font size, font and font family specification for the report. } } \details{ These backtest plot summarises the results obtained from portfolio backtesting. The function \code{backtestAssetsPlot} displays the set of possible assets to construct a portfolio. The function \code{backtestWeightsPlot} displays the recommended weights for investment. The function \code{backtestRebalancePlot} displays the weight changes over time for individual assets and for the portfolio. The function \code{backtestPortfolioPlot} displays the daily, benchmark and portfolio series of a portfolio backtest. The function \code{backtestDrawdownPlot} displays the daily drawdowns for the benchmark and the portfolio. The function \code{backtestReportPlot} summarises the results from a portfolio backtest. } \references{ W\"urtz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/portfolio-portfolioSpec.Rd0000644000176200001440000003361213202334772020312 0ustar liggesusers\name{portfolio-portfolioSpec} \alias{portfolioSpec} \title{Specification of Portfolios} \description{ Specifies a portfolio from scratch. } \usage{ portfolioSpec( model = list( type = "MV", optimize = "minRisk", estimator = "covEstimator", tailRisk = list(), params = list(alpha = 0.05)), portfolio = list( weights = NULL, targetReturn = NULL, targetRisk = NULL, riskFreeRate = 0, nFrontierPoints = 50, status = NA), optim = list( solver = "solveRquadprog", objective = c("portfolioObjective", "portfolioReturn", "portfolioRisk"), options = list(meq = 2), control = list(), trace = FALSE), messages = list( messages = FALSE, note = ""), ampl = list( ampl = FALSE, project = "ampl", solver = "ipopt", protocol = FALSE, trace = FALSE) ) } \arguments{ \item{model}{ a list, containing different arguments: type, estimator, params. See these arguments for further explanation. } \item{portfolio}{ a list, containing different arguments: weights, targetReturn, riskFreeRate, nFrontierPoints. See these arguments for further explanation. } \item{optim}{ a list with four entries, a character string \code{solver} denoting the type of the solver to be used, a \code{params} list to pass further arguments to the objective function to optimize, a \code{control} list for all control settings of the solver, and a logical flag, \code{trace} denoting if the optimization should be traced. } \item{messages}{ a list, for optional messages. } \item{ampl}{ a list, controls settings for the R/AMPL interface. } } \details{ To optimize a portfolio of assets we first have to specify it. All settings which specify a portfolio of assets are respresented by a S4 class named \code{fPFOLIOSPEC}. \preformatted{ setClass("fPFOLIOSPEC", representation( model = "list", portfolio = "list", optim = "list") ) } An object of class \code{fPFOLIOSPEC} has three slots, named \code{@model}, \code{@portfolio}, and \code{@optim}. The first slot \code{@model} holds the model information, the second slot \code{@portfolio} the portfolio information, and the last slot \code{@optim} the information about the solver used for optimization. The default settings are as follows: \preformatted{ model = list( type = "MV", optimize = "minRisk", estimator = "covEstimator", tailRisk = list(), params = list(alpha = 0.05, a = 2)), portfolio = list( weights = NULL, targetReturn = NULL, targetRisk = NULL, riskFreeRate = 0, nFrontierPoints = 50, status = NA), optim = list( solver = "solveRquadprog", objective = NULL, parames = list(), control = list(meq = 2), trace = FALSE) } \bold{Model Slot:} \emph{Type of Model:}\cr The list entry \code{type} from the \code{@model} slot describes the type of the desired portfolio. The current implementation supports three types of portfolios. This may be a Markowitz mean -- variance portfolio named \code{"MV"}, a mean -- lower partial moment portfolio named \code{"LPM"}, or a mean -- CVaR condititional value-at-risk portfolio named \code{"CVaR"}. One can use the function \code{getType} to retrieve the current setting and the function \code{setType} to modify this selection. \emph{What to optimize?}\cr The list entry \code{optimize} from the \code{@model} slot describes what should be optimized. Two choices are psssible. Either \preformatted{ \code{"minRisk"} } which minimizes the risk if the target returns is given, or \preformatted{ \code{"maxReturn"} } which maximizes the return if the target risk is given. One can use the function \code{getOptimize} to retrieve the current setting and the function \code{setOptimize} to modify this selection. \emph{How to estimate mean and covariance?}\cr The list entry \code{estimator} from the \code{@model} slot requests for a string that denotes the function name of the covariance estimator which should be used for the estimation of risk. In Markowitz' mean-variance portfolio model, \code{type="MV"}, the default function \preformatted{ \code{"covEstimator"} } is used which computes the standard column means of the multivariate assets data series and the standard covariance matrix. Alternative robust estimators include \preformatted{ \code{"covMcdEstimator"} \code{"covOGKEstimator"} \code{"mveEstimator"} \code{"nnveEstimator"} \code{"mcdEstimator"} } In addition a shrinkage covariance estimator named \preformatted{ \code{"shrinkEstimator"}, } and a bagged covariance estimator named \preformatted{ \code{"baggedEstimator"} } are also available. Note, the experienced user can add his own function to estimate in any alternative way the mean and the covariance of the multivariate assets data series. In this case (s)he has to write a function, e.g. named \preformatted{ \code{myEstimator=function(x,spec=NULL,...)} } where \code{x} is a multivariate time series, \code{spec} optionally the portfolio specification, if rquired, and \code{...} additional arguments passed to the users code. Note, \code{myEstimator} must a return a named list, with at least the following two entries \code{\$mu} and \code{\$Sigma}, which represent estimators for the mean and covariance, respectively. In the case of the Mean -- Lower-Partial-Moment portfolio, \code{type="LPM"} we make use of the equivalence to Markowitz' mean-variance portfolio with a modified covariance estimator, i.e. \preformatted{ \code{"lpmEstimator"}, } Note, in this case the setting of \code{type="LPM"} changes the covariance estimator function name from any selection previously made to the function automatically to \code{"lpmEstimator"} which returns the LPM mean and covariance estimates. One can use the function \code{getEstimator} to retrieve the current setting and the function \code{setEstimator} to modify this selection. \emph{Tail Risk List:}\cr The list entry \code{tailRisk} from the \code{@model} slot is an empty list. It can be used to add tail risk budget constrains to the optimization. In this case a square matrix of the size of the number of assets is expected as list entry, which contains bivariate tail risk measures, i.e. the tail dependence coefficients estaimated via a copulae approach. Use the function \code{setType} to modify this selection. The list entry \code{parameters} from the \code{@model} slot is a list with additional parameters used in different situations. It can be ebhanced by the user if needed. By default it contains the exponent \code{a=2}, the parameter needed for "LPM" portfolio optimization, and it contains the \code{targetAlpha=0.05}, the confidence level for "CVaR" portfolio optimization. Use the function \code{setParams} to modify this selection. \bold{Portfolio Slot:} The values \code{weights}, \code{targetReturn}, and \code{targetRisk} from the \code{portfolio} slot have to be considered in common. By default all three are set to \code{NULL}. If this is the case, then it is assumed that an equal weight portfolio should be calculated. If only one of the three values is different from \code{NULL} then the following procedure will be startet. If the weights are specified then it is assumed that a feasible portfolio should be considered. If the target return is fixed then it is assumed that the efficient portfolio with the minimal risk will be considered. And finally if the risk is fixed, then the return should be maximized. Use the functions \code{setWeights}, \code{setTargetReturn}, and \code{setTargetRisk} to modify this selection.Note, the change in of the three functions will influence the settings of the other two. The \code{riskFreeRate=0} is also stored in the \code{portfolio} slot. Its value defaults to zero. It can be changed by the user. Use the function \code{setRiskFreeRate} to modify this selection. The number of frontier points reqauired by the calculation of the \code{portfolioFrontier} is obtained from the value of \code{nFrontierPoints=50} hold in the \code{portfolio} slot. Its value defaults to 50. It can be changed by the user. Use the function \code{setNFrontierPoints} to modify this selection. The final \code{status} of portfolio optimization is returned and stored in the \code{portfolio} slot. Before optimization the value is unset to \code{NA}, after optimization a value of \code{status=0} means a successful termination. For other values we recommend to inspect the help page of the selected solver, the name of the solver can be returned by the function \code{getSolver}. Use the function \code{setSolver} to reset the value to \code{NA} if it should be required. \bold{Optim Slot:} The name of the default solver used for optimization can be retrieved calling the function \code{getSolver}. The default value for the value \code{solver} in the specification is set to \code{NULL} which means that the best solver availalbe will be autoselected and used. Before optimization the user can change the setting to another solver. Be aware, that a possible personal change will be overwritten by the function \code{setType}, so call \code{setSolver} after setting the type of the portfolio. The logical flag \code{trace} in the slot \code{optim} allows to trace optionally the portfolio optimization process. By default this will not be the case since the default value is \code{trace=FALSE}. Use the fanction \code{setTrace} to modify the selection. \bold{Retrieving and Modifying Specification Settings:} Information about the current portfolio specification can be retrieved by \code{"get"} functions. These include: \tabular{ll}{ \code{getType} \tab Extracts portfolio type from specification, \cr \code{getOptimize} \tab Extracts what to optimize from specification, \cr \code{getEstimator} \tab Extracts type of covariance estimator, \cr \code{getTailRisk} \tab Extracts list of tail dependency risk matrixes, \cr \code{getParams} \tab Extracts parameters from specification, \cr \code{getWeights} \tab Extracts weights from a portfolio object, \cr \code{getTargetReturn} \tab Extracts target return from specification, \cr \code{getTargetRisk} \tab Extracts target riks from specification, \cr \code{getAlpha} \tab Extracts target VaR-alpha specification, \cr \code{getRiskFreeRate} \tab Extracts risk free rate from specification, \cr \code{getNFrontierPoints} \tab Extracts number of frontier points, \cr \code{getStatus} \tab Extracts the status of optimization, \cr \code{getSolver} \tab Extracts solver from specification, \cr \code{getTrace} \tab Extracts solver's trace flag. } For details we refer to \code{link{getSpec}}. To modify the setting from a portfolio specification use the \code{"set"} functions: \tabular{ll}{ \code{setType} \tab Sets type of portfolio optimization, \cr \code{setOptimize} \tab Sets what to optimize, min risk or max return, \cr \code{setEstimator} \tab Sets names of mean and covariance estimators, \cr \code{setParams} \tab Sets optional model parameters, \cr \code{setWeights} \tab Sets weights vector, \cr \code{setTargetReturn} \tab Sets target return value, \cr \code{setTargetRisk} \tab Sets target risk value, \cr \code{setTargetAlpha} \tab Sets CVaR target alpha value, \cr \code{setRiskFreeRate} \tab Sets risk-free rate value, \cr \code{setNFrontierPoints} \tab Sets number of frontier points, \cr \code{setStatus} \tab Sets status value, \cr \code{setSolver} \tab Sets the type of solver to be used, \cr \code{setTrace} \tab Sets the logical trace flag. } For details we refer to \code{link{setSpec}}. \bold{Printing Specification Settings:} There is a generic print function to print information from specification. What is printed depends on the values of the settings. For example \code{print(portfolioSpec())} returns the type of portfolio, the name of the covariance estimator, the portfolios risk free rate, and the desired solver. } \value{ \code{portfolioSpec}\cr \cr returns an S4 object of class \code{"fPFOLIOSPEC"}. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/risk-surfaceRisk.Rd0000644000176200001440000000241012323217772016671 0ustar liggesusers\name{risk-surfaceRisk} \alias{markowitzHull} \alias{feasibleGrid} \alias{bestDiversification} \alias{riskSurface} \alias{surfacePlot} \title{Surface Risk Analytics} \description{ Functions for surface risk analytics. } \usage{ markowitzHull(data, nFrontierPoints=50) feasibleGrid(hull, trace=FALSE) bestDiversification(grid, FUN="var", trace=FALSE) riskSurface(diversification, FUN=NULL, \dots) surfacePlot(surface, type=c("image", "filled.contour"), nlevels=11, palette=topo.colors, addContour=TRUE, addGrid=TRUE, addHull=TRUE, addAssets=TRUE, \dots) } \arguments{ \item{data}{data} \item{hull}{hull} \item{surface}{surface} \item{diversification}{diversification} \item{FUN}{FUN} \item{grid}{grid} \item{nFrontierPoints}{nFrontierPoints} \item{trace}{trace} \item{type}{type} \item{nlevels}{nlevels} \item{palette}{palette} \item{addContour}{addContour} \item{addGrid}{addGrid} \item{addHull}{addHull} \item{addAssets}{addAssets} \item{\dots}{optional arguments} } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/methods-plot.Rd0000644000176200001440000000047712323217772016074 0ustar liggesusers\name{methods-plot} \alias{plot-methods} \title{plot-methods} \description{ plot-methods. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/monitor-stability.Rd0000644000176200001440000000431012323217772017134 0ustar liggesusers\name{monitor-stability} \alias{stabilityAnalytics} \alias{turnsAnalytics} \alias{drawdownsAnalytics} \alias{garchAnalytics} \alias{riskmetricsAnalytics} \alias{bcpAnalytics} \alias{pcoutAnalytics} \alias{addRainbow} \alias{waveletSpectrum} \alias{parAnalytics} \title{Monitoring Stability} \description{ Functions for time series aggregation, converting a time series from a daily to a monthly or weekly base. } \usage{ stabilityAnalytics(index, method=c("turns", "drawdowns", "garch", "riskmetrics", "bcp", "pcout"), \dots) turnsAnalytics(index, spar=0.5, main=NULL, trace=TRUE, doplot=TRUE, at=pretty(index), format="\%m/\%y") drawdownsAnalytics(index, spar=0.5, main=NULL, trace=TRUE, doplot=TRUE, at=pretty(index), format="\%m/\%y") garchAnalytics(index, spar = 0.5, main=NULL, trace=TRUE, doplot=TRUE, at=pretty(index), format="\%m/\%y") riskmetricsAnalytics(index, spar=0.5, lambda=0.9, main=NULL, trace=TRUE, doplot=TRUE, at=pretty(index), format="\%m/\%y") bcpAnalytics(index, spar=0.5, FUN=returns, method=c("prob", "mean", "var"), main=NULL, trace=TRUE, doplot=TRUE, at=pretty(index), format="\%m/\%y") pcoutAnalytics(index, spar=0.5, main=NULL, trace=TRUE, doplot=TRUE, at=pretty(index), format="\%m/\%y", strong=TRUE, k=2, cs=0.25, outbound=0.25) addRainbow(analytics, palette=rainbow, a=0.3, b=0.8, K=100) waveletSpectrum(index, spar=0.5, main=NULL, trace=TRUE, doplot=TRUE, at=pretty(index), format="\%m/\%y") parAnalytics() } \arguments{ \item{index}{an object of class 'timeSeries'} \item{method}{name of selected analytics} \item{analytics}{analytics object} \item{\dots}{optional arguments} \item{spar}{0.5} \item{main}{""} \item{trace}{TRUE} \item{doplot}{TRUE} \item{at}{pretty()} \item{format}{"\%m/\%y"} \item{lambda}{riskmetricsAnalytics} \item{bcp}{bcpAnalytics} \item{FUN,strong,k,cs,outbound}{pcoutAnalytics} \item{palette,a,b,K}{addRainbow} } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/backtest-constructors.Rd0000644000176200001440000000533112323217772020015 0ustar liggesusers\name{backtest-constructors} \alias{setBacktest} \alias{setWindowsFun<-} \alias{setWindowsParams<-} \alias{setWindowsHorizon<-} \alias{setStrategyFun<-} \alias{setStrategyParams<-} \alias{setSmootherFun<-} \alias{setSmootherParams<-} \alias{setSmootherLambda<-} \alias{setSmootherDoubleSmoothing<-} \alias{setSmootherInitialWeights<-} \alias{setSmootherSkip<-} \title{Specification of backtesting portfolios} \description{ Functions to set specifications for portfolio backtesting. \cr The functions are: \tabular{ll}{ \code{setWindowsFun} \tab Sets Windows function, \cr \code{setWindowsParams} \tab Sets additional parameters for rolling windows function, \cr \code{setWindowsHorizon} \tab Sets Windows horizon, \cr \code{setStrategyFun} \tab Sets the portfolio Strategy function, \cr \code{setStrategyParams} \tab Sets additional parameters for Strategy function, \cr \code{setSmootherFun} \tab Sets the Smoother function, \cr \code{setSmootherParams} \tab Sets additional parameters for Smoother function, \cr \code{setSmootherLambda} \tab Sets the smoothing parameter Lambda, \cr \code{setSmootherDoubleSmoothing} \tab Sets setting for double smoothing, \cr \code{setSmootherInitialWeights} \tab Sets the initial weights to used in the smoothing, \cr \code{setSmootherSkip} \tab Sets the number of skipped months. } } \usage{ setWindowsFun(backtest) <- value setWindowsParams(backtest) <- value setWindowsHorizon(backtest) <- value setStrategyFun(backtest) <- value setStrategyParams(backtest) <- value setSmootherFun(backtest) <- value setSmootherParams(backtest) <- value setSmootherLambda(backtest) <- value setSmootherDoubleSmoothing(backtest) <- value setSmootherInitialWeights(backtest) <- value setSmootherSkip(backtest) <- value } \arguments{ \item{backtest}{ an S4 object of class \code{fPFOLIOBACKTEST}, the specification to be modified, by default the default of the function \code{portfolioBacktest()}. } \item{value}{ a value for that component of \code{backtest} to be set. Note for setting Params value is a list. } } \details{ The function \code{portfolioBacktest()} allows to set the values for the specification structure from scratch. To modify individual settings one can use the set functions. } \references{ W\"urtz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/risk-ternaryMap.Rd0000644000176200001440000000166712323217772016547 0ustar liggesusers\name{risk-ternaryMap} \alias{ternaryMap} \alias{ternaryFrontier} \alias{riskMap} \alias{maxddMap} \alias{ternaryWeights} \alias{ternaryCoord} \alias{ternaryPoints} \title{Creates and Plots a Ternary Map} \description{ Functions for craeting and plotting ternary maps. } \usage{ ternaryMap(data, FUN=NULL, ..., locator=FALSE, N=41, palette=topo.colors, nlevels=11) ternaryFrontier(data, locator=FALSE) riskMap(data, weights) maxddMap(data, weights) ternaryWeights(n=21) ternaryCoord(weights) ternaryPoints(weights, \dots) } \arguments{ \item{data}{data} \item{weights}{weights} \item{FUN, locator, N, palette, nlevels}{ternaryMap} \item{n}{n} \item{\dots}{optional arguments} } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/backtest-extractors.Rd0000644000176200001440000000631712323217772017450 0ustar liggesusers\name{backtest-extractors} \alias{getWindows.fPFOLIOBACKTEST} \alias{getWindowsFun.fPFOLIOBACKTEST} \alias{getWindowsParams.fPFOLIOBACKTEST} \alias{getWindowsHorizon.fPFOLIOBACKTEST} \alias{getStrategy.fPFOLIOBACKTEST} \alias{getStrategyFun.fPFOLIOBACKTEST} \alias{getStrategyParams.fPFOLIOBACKTEST} \alias{getSmoother.fPFOLIOBACKTEST} \alias{getSmootherFun.fPFOLIOBACKTEST} \alias{getSmootherParams.fPFOLIOBACKTEST} \alias{getSmootherLambda.fPFOLIOBACKTEST} \alias{getSmootherDoubleSmoothing.fPFOLIOBACKTEST} \alias{getSmootherInitialWeights.fPFOLIOBACKTEST} \alias{getSmootherSkip.fPFOLIOBACKTEST} \alias{getMessages.fPFOLIOBACKTEST} \title{Portfolio backtest specification extractors} \description{ Extracts information from an object of class fPFOLIOBACKTEST. \cr The functions are: \tabular{ll}{ \code{getWindows} \tab Extract windows slot, \cr \code{getWindowsFun} \tab extract windows function, \cr \code{getWindowsParams} \tab extract a list of windows specific parameters, \cr \code{getWindowsHorizon} \tab extract windows horizon, \cr \code{getStrategy} \tab extract strategy slot, \cr \code{getStrategyFun} \tab extract the portfolio strategy function, \cr \code{getStrategyParams} \tab extract a list of portfolio strategy specific parameters, \cr \code{getSmoother} \tab extract the smoother slot, \cr \code{getSmootherFun} \tab Extract the Ssoother function, \cr \code{getSmootherParams} \tab extract a list of Smoothing specific parameters, \cr \code{getSmootherLambda} \tab extract the smoothing parameter Lambda, \cr \code{getSmootherDoubleSmoothing} \tab extract setting for double smoothing, \cr \code{getSmootherInitialWeights} \tab extract the initial weights to used in the smoothing, \cr \code{getSmootherSkip} \tab extract the number of skipped months, \cr \code{getMessages} \tab extract the message slot.} } \usage{ \method{getWindows}{fPFOLIOBACKTEST}(object) \method{getWindowsFun}{fPFOLIOBACKTEST}(object) \method{getWindowsParams}{fPFOLIOBACKTEST}(object) \method{getWindowsHorizon}{fPFOLIOBACKTEST}(object) \method{getStrategy}{fPFOLIOBACKTEST}(object) \method{getStrategyFun}{fPFOLIOBACKTEST}(object) \method{getStrategyParams}{fPFOLIOBACKTEST}(object) \method{getSmoother}{fPFOLIOBACKTEST}(object) \method{getSmootherFun}{fPFOLIOBACKTEST}(object) \method{getSmootherParams}{fPFOLIOBACKTEST}(object) \method{getSmootherLambda}{fPFOLIOBACKTEST}(object) \method{getSmootherDoubleSmoothing}{fPFOLIOBACKTEST}(object) \method{getSmootherInitialWeights}{fPFOLIOBACKTEST}(object) \method{getSmootherSkip}{fPFOLIOBACKTEST}(object) \method{getMessages}{fPFOLIOBACKTEST}(object) } \arguments{ \item{object}{ an object of class \code{fPFOLIOBACKTEST} as returned by function \code{portfolioBacktest}. } } \references{ W\"urtz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/a-class-fPFOLIOCON.Rd0000644000176200001440000000122512323217772016464 0ustar liggesusers\name{fPFOLIOCON} \alias{fPFOLIOCON} \alias{class-fPFOLIOCON} \alias{fPFOLIOCON-class} \alias{show,fPFOLIOCON-method} \title{Portfolio Constraints Handling} \description{ Creates a fPFOLIOCON object from string constraints. } \usage{ \S4method{show}{fPFOLIOCON}(object) } \arguments{ \item{object}{ an object of class \code{fPFOLIOCON} as returned by the function \code{portfolioData}. } } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/utils-methods.Rd0000644000176200001440000000075012323217772016250 0ustar liggesusers\name{utils-methods} \alias{print.solver} \title{Print Method for Solvers} \description{ S3 print method for mathematical programming solvers. } \usage{ \method{print}{solver}(x, \dots) } \arguments{ \item{x}{x} \item{\dots}{optional arguments} } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/backtest-getMethods.Rd0000644000176200001440000000322212323217772017345 0ustar liggesusers\name{backtest-getMethods} \alias{getWindows} \alias{getWindowsFun} \alias{getWindowsParams} \alias{getWindowsHorizon} \alias{getStrategy} \alias{getStrategyFun} \alias{getStrategyParams} \alias{getSmoother} \alias{getSmootherFun} \alias{getSmootherParams} \alias{getSmootherLambda} \alias{getSmootherDoubleSmoothing} \alias{getSmootherInitialWeights} \alias{getSmootherSkip} %\alias{getMessages} Already defined in fPortfolio \title{Portfolio Backtest Extractors} \description{ Extractor functions to get information from objects of class fPFOLIOBACKTEST. } \arguments{ \item{object}{ an object of class \code{fPFOLIOBACKTEST} as returned by function \code{portfolioBacktest}. } } \references{ W\"urtz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \examples{ ## portfolioBacktest Specification - backtestSpec = portfolioBacktest() backtestSpec ## Extract Windows Information - getWindows(backtestSpec) getWindowsFun(backtestSpec) getWindowsParams(backtestSpec) getWindowsHorizon(backtestSpec) ## Extract Strategy Information - getStrategy(backtestSpec) getStrategyFun(backtestSpec) getStrategyParams(backtestSpec) ## Extract Smoother Information - getSmoother(backtestSpec) getSmootherFun(backtestSpec) getSmootherParams(backtestSpec) getSmootherLambda(backtestSpec) getSmootherDoubleSmoothing(backtestSpec) getSmootherInitialWeights(backtestSpec) getSmootherSkip(backtestSpec) } \keyword{models} fPortfolio/man/a-class-fPFOLIOVAL.Rd0000644000176200001440000000113412323217772016466 0ustar liggesusers\name{fPFOLIOVAL} \alias{fPFOLIOVAL} \alias{class-fPFOLIOVAL} \alias{fPFOLIOVAL-class} \alias{show,fPFOLIOVAL-method} \title{Values of Portfolio Frontiers} \description{ Specifies portfolio Optimized Values. } \usage{ \S4method{show}{fPFOLIOVAL}(object) } \arguments{ \item{object}{ an S4 object of class \code{fPFOLIOVAL}. } } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/portfolio-getVal.Rd0000644000176200001440000000224112323217772016701 0ustar liggesusers\name{portfolio-getVal} \alias{getAlpha.fPFOLIOVAL} \alias{getCovRiskBudgets.fPFOLIOVAL} \alias{getNFrontierPoints.fPFOLIOVAL} \alias{getPortfolio.fPFOLIOVAL} \alias{getRiskFreeRate.fPFOLIOVAL} \alias{getStatus.fPFOLIOVAL} \alias{getTargetReturn.fPFOLIOVAL} \alias{getTargetRisk.fPFOLIOVAL} \alias{getWeights.fPFOLIOVAL} \title{PortfolioVal Extractor Functions} \description{ Extracts information from an object of class fPFOLIOVAL. } \usage{ \method{getAlpha}{fPFOLIOVAL}(object) \method{getCovRiskBudgets}{fPFOLIOVAL}(object) \method{getNFrontierPoints}{fPFOLIOVAL}(object) \method{getPortfolio}{fPFOLIOVAL}(object) \method{getRiskFreeRate}{fPFOLIOVAL}(object) \method{getStatus}{fPFOLIOVAL}(object) \method{getTargetReturn}{fPFOLIOVAL}(object) \method{getTargetRisk}{fPFOLIOVAL}(object) \method{getWeights}{fPFOLIOVAL}(object) } \arguments{ \item{object}{ an object of class \code{fPFOLIODATA}. } } % \details{ % } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/weights-barPlots.Rd0000644000176200001440000000714712323217772016714 0ustar liggesusers\name{weightsPlot} \alias{weightsPlot} \alias{weightedReturnsPlot} \alias{covRiskBudgetsPlot} \alias{tailRiskBudgetsPlot} \alias{riskBudgetsPlot} \title{Portfolio Weights Bar Plots} \description{ Displays plots of weights, investments, covariance and tail risk budgets. } \usage{ weightsPlot(object, labels = TRUE, col = NULL, title = TRUE, box = TRUE, legend = TRUE, ...) weightedReturnsPlot(object, labels = TRUE, col = NULL, title = TRUE, box = TRUE, legend = TRUE, ...) covRiskBudgetsPlot(object, labels = TRUE, col = NULL, title = TRUE, box = TRUE, legend = TRUE, ...) tailRiskBudgetsPlot(object, labels = TRUE, col = NULL, title = TRUE, box = TRUE, legend = TRUE, ...) riskBudgetsPlot(object, FUN=c("budgetsNormalVAR","budgetsNormalES", "budgetsModifiedVAR","budgetsModifiedES", "budgetsSampleCOV"), labels = TRUE, col = NULL, title = TRUE, mtext = TRUE, box = TRUE, legend = TRUE, ...) } \arguments{ \item{object}{ an S4 object of class \code{fPORTFOLIO}, as returned by one of the portfolio functions, e.g. \code{efficientPortfolio} or \code{portfolioFrontier}. } \item{labels}{ a logical flag, determining if the the graph should be labeled automatically, which is the default case \code{labels=TRUE}. If set to \code{FALSE} then the graph will be displayed undecorated and the user can it decorate by himself. } \item{col}{ a character string vector, defined from a color palette. The default setting uses the "Blues" \code{seqPalette} palette. } \item{title}{ a logical flag. Should automatically a title and axis labels be added to the plot. } \item{box}{ a logical flag, determining whether a boxed frame should be plotted around the pie, by default the value is set to \code{TRUE}. } \item{legend}{ a logical value, determining if the the graph should be labeled automatically, shich is the default case \code{labels=TRUE}. If set to \code{FALSE} then the graph will be displayed undecorated and the user can it decorate by himself. Evenmore, if \code{labels} takes the value of a string vector, then the names of the assets from the porftolio \code{object} will be ignored, and the labels will be taken from the specified string vector. } \item{\dots}{ additional arguments passed to the function \code{barplot}. Only active if \code{labels=FALSE}. } \item{FUN}{FUN} \item{mtext}{mtext} } \details{ These barplots plots allow for different views on the results obtained from a feasible or an optimized portfolio. The function \code{weightsPlot} displays the weights composition along the frontier of a portfolio. The function \code{weightedReturnsPlot} displays the investment composition, i.e. the weighted returns along the frontier of a portfolio. The function \code{covRiskBudgetsPlot} displays the covariance risk budgets composition along the frontier of a portfolio. The function \code{tailRiskBudgetsPlot} displays the copulae tail risk budgets composition along the frontier of a portfolio. Note, this is only possible if in the portfolio specificsation a copulae tail risk is defined. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/backtest-specification.Rd0000644000176200001440000000263112323217772020065 0ustar liggesusers\name{backtest-specification} \alias{portfolioBacktest} \title{Specification of portfolio backtesting} \description{ Specifies how the portfolio backtesting is performed. } \usage{ portfolioBacktest( windows = list( windows = "equidistWindows", params = list(horizon = "12m")), strategy = list( strategy = "tangencyStrategy", params = list()), smoother = list( smoother = "emaSmoother", params = list(doubleSmoothing = TRUE, lambda = "3m", skip = 0, initialWeights = NULL)), messages = list()) } \arguments{ \item{windows}{ a list, containing different arguments: windows, params (horizon). } \item{strategy}{ a list, containing different arguments: strategy, params. } \item{smoother}{ a list, containing different arguments: smoother, params. (doubleSmoothing, lambda, skip, initialWeights). } \item{messages}{ a list containing the backtesting messages. } } \value{ returns an S4 object of class \code{"fPFOLIOBACKTEST"}. } \references{ W\"urtz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/backtest-portfolios.Rd0000644000176200001440000000314612323217772017447 0ustar liggesusers\name{backtest-portfolio} \alias{portfolioBacktesting} \alias{portfolioSmoothing} \title{Portfolio backtesting} \description{ Tests a portfolio by a rolling backtest. } \usage{ portfolioBacktesting(formula, data, spec = portfolioSpec(), constraints = "LongOnly", backtest = portfolioBacktest(), trace = TRUE) portfolioSmoothing(object, backtest, trace = TRUE) } \arguments{ \item{formula}{ a formula describing the benchmark and assets used for backtesting in the form \code{backtest ~ assetA + ... + assetZ}. Here, \code{backtest} and \code{asset*} are column names of the \code{data} set. } \item{data}{ an object of class \code{timeSeries}. } \item{spec}{ an S4 object of class \code{fPFOLIOSPEC} as returned by the function \code{portfolioSpec}. } \item{constraints}{ a character string value or vector defining the constraints, for details we refer to \code{portfolioConstraints}. } \item{backtest}{ an S4 object of class \code{fPFOLIOBACKTEST} as returned by the function \code{portfolioBacktest}. } \item{object}{ a list as returned by the function \code{portfolioBacktesting}. } \item{trace}{ a logical flag, by default TRUE. Should the backtersting be traced? } } \references{ W\"urtz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/data-sets.Rd0000644000176200001440000000157312323217772015340 0ustar liggesusers\name{data-sets} \alias{dataSets} \alias{GCCINDEX.DF} \alias{SPISECTOR.DF} \alias{SWX.DF} \alias{LPP2005.RET.DF} \alias{SMALLCAP.RET.DF} \alias{GCCINDEX} \alias{SPISECTOR} \alias{SWX} \alias{LPP2005} \alias{SMALLCAP} \alias{GCCINDEX.RET} \alias{SPISECTOR.RET} \alias{SWX.RET} \alias{LPP2005.RET} \alias{SMALLCAP.RET} \alias{ECON85} \alias{ECON85LONG} \title{Assets Data Sets} \description{ Example data sets for portfolio optimization. } \usage{ ECON85 ECON85LONG GCCINDEX SPISECTOR SWX LPP2005 SMALLCAP GCCINDEX.RET SPISECTOR.RET SWX.RET LPP2005.RET SMALLCAP.RET } %\details{ %} \value{ an object of class \code{"timeSeries"}. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{datasets} fPortfolio/man/a-class-fPFOLIOBACKTEST.Rd0000644000176200001440000000342612323217772017252 0ustar liggesusers\name{fPFOLIOBACKTEST} \alias{fPFOLIOBACKTEST} \alias{class-fPFOLIOBACKTEST} \alias{fPFOLIOBACKTEST-class} \alias{show,fPFOLIOBACKTEST-method} \title{Portfolio backtesting specifications} \description{ Specifies portfolio backtesting objects. } \usage{ \S4method{show}{fPFOLIOBACKTEST}(object) } \arguments{ \item{object}{ an S4 object of class \code{fPFOLIOBACKTEST}. } } \details{ \bold{Portfolio Backtest Specification:} \cr\cr The S4 class \code{fPFOLIOBACKTEST} specifies portfolio backtesting. The slots are:\cr \describe{ \item{@windows}{ a list, setting the \code{windows} function that defines the rolling windows, and the set of window specific parameters \code{params}. E.g The window horizon is set as a parameter \code{horizon = "24m"} } \item{@strategy}{ a list, setting the portfolio \code{strategy} to implement during the backtest, and any strategy specific parameters are found in \code{params}. } \item{@smoother}{ a list, specifying the smoothing style, given as a \code{smoother} function, and any smoother specific parameters are stored in the list \code{params}. } \item{@messages}{ a list, any messages collected during the backtest} } } \value{ \code{portfolioBacktest} returns an S4 object of class \code{"fPFOLIOBACKTEST"}. } \references{ W\"urtz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/portfolio-Data.Rd0000644000176200001440000000051312323217772016330 0ustar liggesusers\name{portfolio-dataSets} \alias{portfolioData2} \title{portfolioData2} \description{ portfolioData2. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/mathprog-QP.Rd0000644000176200001440000000644112323217772015611 0ustar liggesusers\name{mathprog-QP} \alias{rsolveQP} \alias{rquadprogQP} \alias{quadprogQP} \alias{quadprogQPControl} \alias{rquadprog} \alias{ripopQP} \alias{ipopQP} \alias{ipopQPControl} \alias{ramplQP} \alias{amplQP} \alias{amplQPControl} \alias{rkestrelQP} \alias{kestrelQP} \alias{rneosQP} \alias{neosQP} \alias{kestrelQPControl} \alias{neosQPControl} \title{Mathematical Linear Programming} \description{ Mathematical Quadratic Programming. } \usage{ rsolveQP(objective, lower=0, upper=1, linCons, control=list(solver="quadprog", invoke=c("R", "AMPL", "NEOS"))) rquadprogQP(objective, lower=0, upper=1, linCons, control=list()) quadprogQP(objective=list(dvec=NULL, Dmat=NULL), par.lower=NULL, par.upper=NULL, eqA=NULL, eqA.bound=NULL, ineqA=NULL, ineqA.lower=NULL, ineqA.upper=NULL, control=list()) quadprogQPControl(solver="quadprog", trace=FALSE) rquadprog ripopQP(objective, lower=0, upper=1, linCons, control=list()) ipopQP(objective=list(dvec=NULL, Dmat = NULL), par.lower=NULL, par.upper=NULL, eqA=NULL, eqA.bound=NULL, ineqA=NULL, ineqA.lower=NULL, ineqA.upper=NULL, control=list()) ipopQPControl( sigf=12, maxiter=400, margin=0.05, bound=10, verb=0, inf=1e12, solver="ipop", trace=FALSE) ripop ramplQP(objective, lower=0, upper=1, linCons, control=list()) amplQP(objective=list(dvec=NULL, Dmat=NULL), x_L=NULL, x_U=NULL, A=NULL, b_L=NULL, b_U=NULL, control=list(), \dots) amplQPControl(solver="ipopt", project="ampl", inf=1e12, trace = FALSE) rkestrelQP(objective, lower=0, upper=1, linCons, control=list()) kestrelQP(objective=list(dvec=NULL, Dmat=NULL), x_L=NULL, x_U=NULL, A=NULL, b_L=NULL, b_U=NULL, control=list(), \dots) kestrelQPControl(solver="loqo", project="kestrel", inf=1e12, trace = FALSE) rneosQP(objective, lower=0, upper=1, linCons, control=list()) neosQP(objective=list(dvec=NULL, Dmat=NULL), x_L=NULL, x_U=NULL, A=NULL, b_L=NULL, b_U=NULL, control=list(), \dots) neosQPControl(solver="ipopt", category="nco", project="neos", inf=1e12, trace=FALSE) } \arguments{ \item{objective}{ ... } \item{lower, upper}{ lower and upper bounds. } \item{linCons}{ list of linear constraints: mat, lower, upper. } \item{control}{ control list. } \item{\dots}{ optional arguments to be passed. } \item{par.lower, par.upper}{...} \item{eqA}{...} \item{eqA.bound}{...} \item{ineqA}{...} \item{ineqA.lower,ineqA.upper}{...} \item{x_L,x_U}{...} \item{A}{...} \item{b_L,b_U}{...} \item{solver}{...} \item{category}{...} \item{project}{...} \item{inf}{...} \item{trace}{...} \item{sigf}{...} \item{maxiter}{...} \item{margin}{...} \item{bound}{...} \item{verb}{...} } \value{ a list of class \code{solver} with the following named ebtries: \code{opt}, \code{solution}, \code{objective}, \code{status}, \code{message}, \code{solver}, \code{version}. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/portfolio-covEstimator.Rd0000644000176200001440000000642412323217772020145 0ustar liggesusers\name{portfolio-covEstimator} \alias{covEstimator} \alias{mveEstimator} \alias{mcdEstimator} \alias{lpmEstimator} \alias{slpmEstimator} \alias{kendallEstimator} \alias{spearmanEstimator} \alias{covMcdEstimator} \alias{covOGKEstimator} \alias{shrinkEstimator} \alias{nnveEstimator} \title{Covariance Estimators} \description{ Functions to estimate and robustify the sample mean and covariance of rectangular objects. } \usage{ covEstimator(x, spec = NULL, \dots) mveEstimator(x, spec = NULL, \dots) mcdEstimator(x, spec = NULL, \dots) lpmEstimator(x, spec = NULL, \dots) slpmEstimator(x, spec = NULL, \dots) kendallEstimator(x, spec = NULL, \dots) spearmanEstimator(x, spec = NULL, \dots) covMcdEstimator(x, spec = NULL, \dots) covOGKEstimator(x, spec = NULL, \dots) shrinkEstimator(x, spec = NULL, \dots) nnveEstimator(x, spec = NULL, \dots) } \arguments{ \item{x}{ an object of class \code{timeSeries}. } \item{spec}{ unused, may be used to pass information from the portfolio specification object to the mean and covariance estimator function. } \item{\dots}{ optional arguments to be passed to the underlying estimators. } } \value{ the functions return a list with two entries named \code{mu} and \code{Sigma}. The first denotes the vector of column means, and the second the covariance matrix. Note, that the output of this function can be used as data input for the portfolio functions to compute the efficient frontier. } \details{ The functions are underlying the following algorithms:\cr \code{covEstimator} uses standard covariance estimation,\cr \code{mveEstimator} uses the function "cov.mve" from the MASS package,\cr \code{mcdEstimator} uses the function "cov.mcd" from the MASS package,\cr \code{lpmEstimator} returns lower partial moment estimator,\cr \code{kendallEstimator} returns Kendall's rank estimator,\cr \code{spearmanEstimator} returns Spearman's rankestimator,\cr \code{covMcdEstimator} requires "covMcd" from package robustbase,\cr \code{covOGKEstimator} requires "covOGK" from package robustbase,\cr \code{nnveEstimator} uses builtin from package covRobust,\cr \code{shrinkEstimator} uses builtin from package corpcor. } \references{ Breiman L. (1996); \emph{Bagging Predictors}, Machine Learning 24, 123--140. Ledoit O., Wolf. M. (2003); \emph{ImprovedEestimation of the Covariance Matrix of Stock Returns with an Application to Portfolio Selection}, Journal of Empirical Finance 10, 503--621. Schaefer J., Strimmer K. (2005); \emph{A Shrinkage Approach to Large-Scale Covariance Estimation and Implications for Functional Genomics}, Statist. Appl. Genet. Mol. Biol. 4, 32. Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \author{ ... for R's \code{MASS} package, \cr ... for R's \code{robustbase} package, \cr ... for R's \code{covRobust} package, \cr Juliane Schaefer and Korbinian Strimmer for R's \code{corpcor} package, \cr Diethelm Wuertz for this Rmetrics port. } \keyword{models} fPortfolio/man/weights-piePlots.Rd0000644000176200001440000000677212323217772016730 0ustar liggesusers\name{weights-piePlot} \alias{weightsPie} \alias{weightedReturnsPie} \alias{covRiskBudgetsPie} \alias{tailRiskBudgetsPie} \title{Portfolio Pie Plots} \description{ Displays pie plots of weights, weighted Returns, covariance and tail risk budgets for a portfolio. } \usage{ weightsPie(object, pos = NULL, labels = TRUE, col = NULL, box = TRUE, legend = TRUE, radius = 0.8, \dots) weightedReturnsPie(object, pos = NULL, labels = TRUE, col = NULL, box = TRUE, legend = TRUE, radius = 0.8, \dots) covRiskBudgetsPie(object, pos = NULL, labels = TRUE, col = NULL, box = TRUE, legend = TRUE, radius = 0.8, \dots) tailRiskBudgetsPie(object, pos = NULL, labels = TRUE, col = NULL, box = TRUE, legend = TRUE, radius = 0.8, \dots) } \arguments{ \item{object}{ an S4 object of class \code{fPORTFOLIO}, as returned by one of the portfolio functions, e.g. \code{efficientPortfolio} or \code{portfolioFrontier}. } \item{pos}{ NULL or an integer value. If NULL it is assumend that we consider a single portfolio like for example a tengency portfolio. However, if the \code{object} describes a whole frontier then \code{pos} has to be the number of that point from the frontier which we want to display. The frontier points are numbered from one up to the value give by the number of frontier points, which can be retrieved by calling \code{getNFrontierPoints}. } \item{labels}{ a logical flag, determining if the graph should be labeled automatically, which is the default case \code{labels=TRUE}. If set to \code{FALSE} then the graph will be displayed undecorated and the user can it decorate by himself. Evenmore, if \code{labels} takes the value of a string vector, then the names of the assets from the porftolio \code{object} will be ignored, and the labels will be taken from the specified string vector. } \item{col}{ a character string vector, defined from a color palette. The default setting uses the "Blues" \code{seqPalette} palette. } \item{box}{ a logical flag, determining whether a boxed frame should be plotted around the pie, by default the value is set to \code{TRUE}. } \item{legend}{ a logical flag, determining if a legend should be added to the plot. The default setting shows the legend. } \item{radius}{ a numeric value, determining the radius of the pie. The default value is 0.8. } \item{\dots}{ arguments to be passed. } } \details{ The pie plots allow for different views on the results obtained from a feasible or an optimized portfolio. The function \code{weightsPie} displays the weights composition of a portfolio. The function \code{weightedReturnsPie} displays the investment, i.e. the weighted returns of a portfolio. The function \code{covRiskBudgetsPie} displays the covariance risk budgets of a portfolio. The function \code{taikRiskBudgetsPie} displays the copulae tail risk budgets of a portfolio. Note, this is only possible if in the portfolio specificsation a copulae tail risk is defined. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/portfolio-Constraints.Rd0000644000176200001440000001322312323217772017770 0ustar liggesusers\name{portfolio-constraints} \alias{portfolioConstraints} \alias{minWConstraints} \alias{maxWConstraints} \alias{eqsumWConstraints} \alias{minsumWConstraints} \alias{maxsumWConstraints} \alias{minBConstraints} \alias{maxBConstraints} \alias{listFConstraints} \alias{minFConstraints} \alias{maxFConstraints} \alias{minBuyinConstraints} \alias{maxBuyinConstraints} \alias{nCardConstraints} \alias{minCardConstraints} \alias{maxCardConstraints} \title{Portfolio Constraints} \description{ Computes portfolio constraints given constraints strings. } \usage{ portfolioConstraints(data, spec=portfolioSpec(), constraints="LongOnly", \dots) minWConstraints(data, spec=portfolioSpec(), constraints="LongOnly") maxWConstraints(data, spec=portfolioSpec(), constraints="LongOnly") eqsumWConstraints(data, spec=portfolioSpec(), constraints="LongOnly") minsumWConstraints(data, spec=portfolioSpec(), constraints="LongOnly") maxsumWConstraints(data, spec=portfolioSpec(), constraints="LongOnly") minBConstraints(data, spec=portfolioSpec(), constraints="LongOnly") maxBConstraints(data, spec=portfolioSpec(), constraints="LongOnly") listFConstraints(data, spec=portfolioSpec(), constraints="LongOnly") minFConstraints(data, spec=portfolioSpec(), constraints="LongOnly") maxFConstraints(data, spec=portfolioSpec(), constraints="LongOnly") minBuyinConstraints(data, spec=portfolioSpec(), constraints="LongOnly") maxBuyinConstraints(data, spec=portfolioSpec(), constraints="LongOnly") nCardConstraints(data, spec=portfolioSpec(), constraints="LongOnly") minCardConstraints(data, spec=portfolioSpec(), constraints="LongOnly") maxCardConstraints(data, spec=portfolioSpec(), constraints="LongOnly") } \arguments{ \item{constraints}{ a character value or character vector, containing the constraint strings. Setting constraints is described in the details section } \item{data}{ a list, having a statistics named list, having named entries 'mu' and 'Sigma', containing the information of the statistics\cr } \item{spec}{ an S4 object of class \code{fPFOLIOSPEC} as returned by the function \code{portfolioSpec}. } \item{\dots}{ arguments passed to the function \code{.setRdonlp2Constraints}. For internal use only. } } \details{ \bold{How to define constraints?} \cr\cr Constraints are defined by a character string or a vector of character strings. \emph{Summary Constraints: NULL, "LongOnly", "Short"} There are three special cases, the settings \code{constraints=NULL}, \code{constraints="Short"}, and \code{constraints="LongOnly"}. Note, that these three constraint settings are not allowed to be combined with more general constraint definitions. \code{NULL}: This selection defines the default value and is equivalent to the \code{"LongOnly"} case, see below. \code{"Short"}: This selection defines the case of unlimited short selling. i.e. each weight may range between \code{-Inf} and \code{Inf}. Consequently, there are no group constraints. Risk budget constraints are not included in the portfolio optimization. \code{"LongOnly"}: This selection is the same as the default setting. Each weight may range between \code{0} ans \code{1}. No group constraints and risk budget constraints will be included in the portfolio optimization. \emph{Lower and Upper Bounds: minW and maxW} \emph{Group Constraints: eqsumW, minsumW and maxsumW} Lower and upper bounded portfolios may be specified by a vector of character strings which describe executable code, setting values to to vectors \code{minW}, \code{maxW}, \code{minsumW}, and \code{maxsumW}. The individual string elements of the vector have the following form: \describe{ \item{box constraints}{ \code{"minW[Asset(s)]=Value(s)"}, and/or \cr \code{"maxW[Asset(s)]=Value(s)"}. } \item{sector constraints}{ \code{"minsumW[Asset(s)]=Value(s)"}, and/or \cr \code{"maxsumW[Asset(s)]=Value(s)"}. } } \code{Asset(s)} is an index of one or more assets, and \code{value} a numeric value or vector assigning the desired value. Note, if the \code{values} range between zero and one, then we have a long only portfolio allowing for box and group constraints of the weights. If the values are set to negative values, and values larger than one, then (constrained) short selling will be allowed. \emph{Risk Budget Constrained Portfolios:} By default, risk budgets are not included in the portfolio optimization. Covariance risk budgets have to be added explicitely, and have the following form: \describe{ \item{box constraints}{ \code{"minB[Asset(s)]=Value(s)"}, and/or \cr \code{"minB[Asset(s)]=Value(s)"}. } } Again, \code{Asset(s)} is an index of one or more assets, and \code{value} a numeric value or vector with numbers ranging between zero and one, assigning the desired risk budgets. Note, risk budget constraints will enforce diversification at the expense of return generation. The resulting portfolios will thus lie below the unconstrained efficient frontier. \emph{Non-Linear Constraints: listF, minF, maxF} } \value{ an object of class S4. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/portfolio-getPortfolio.Rd0000644000176200001440000001062112424415406020131 0ustar liggesusers\name{portfolio-getPortfolio} \alias{getData.fPORTFOLIO} \alias{getSeries.fPORTFOLIO} \alias{getNAssets.fPORTFOLIO} \alias{getUnits.fPORTFOLIO} \alias{getStatistics.fPORTFOLIO} \alias{getMean.fPORTFOLIO} \alias{getCov.fPORTFOLIO} \alias{getMu.fPORTFOLIO} \alias{getSigma.fPORTFOLIO} \alias{getEstimator.fPORTFOLIO} \alias{getSpec.fPORTFOLIO} \alias{getModel.fPORTFOLIO} \alias{getType.fPORTFOLIO} \alias{getOptimize.fPORTFOLIO} \alias{getEstimator.fPORTFOLIO} \alias{getTailRisk.fPORTFOLIO} \alias{getParams.fPORTFOLIO} \alias{getOptim.fPORTFOLIO} \alias{getSolver.fPORTFOLIO} \alias{getTrace.fPORTFOLIO} \alias{getConstraints.fPORTFOLIO} \alias{getConstraintsTypes} \alias{getPortfolio.fPORTFOLIO} \alias{getWeights.fPORTFOLIO} \alias{getTargetReturn.fPORTFOLIO} \alias{getTargetRisk.fPORTFOLIO} \alias{getAlpha.fPORTFOLIO} \alias{getRiskFreeRate.fPORTFOLIO} \alias{getNFrontierPoints.fPORTFOLIO} \alias{getStatus.fPORTFOLIO} \alias{getCovRiskBudgets.fPORTFOLIO} \alias{getTailRiskBudgets.fPORTFOLIO} \alias{getA.fPORTFOLIO} \alias{getControl.fPORTFOLIO} \alias{getObjective.fPORTFOLIO} \alias{getOptions.fPORTFOLIO} \title{Portfolio Class Extractors} \description{ A collection and description of functions allowing to get information about an object of class fPORTFOLIO. \cr The functions are: \tabular{ll}{ \code{getData} \tab Extracts ..., \cr \code{getSeries} \tab Extracts ..., \cr \code{getStatistics} \tab Extracts ..., \cr \code{getNAssets} \tab Extracts ..., \cr \code{getSpec} \tab Extracts ..., \cr \code{getType} \tab Extracts ..., \cr \code{getEstimator} \tab Extracts ..., \cr \code{getParams} \tab Extracts ..., \cr \code{getSolver} \tab Extracts ..., \cr \code{getTrace} \tab Extracts ..., \cr \code{getConstraints} \tab Extracts ..., \cr \code{getPortfolio} \tab Extracts ..., \cr \code{getWeights} \tab Extracts ..., \cr \code{getTargetReturn} \tab Extracts ..., \cr \code{getTargetRisk} \tab Extracts ..., \cr \code{getAlpha} \tab Extracts ..., \cr \code{getRiskFreeRate} \tab Extracts ..., \cr \code{getNFrontierPoints} \tab Extracts ..., \cr \code{getStatus} \tab Extracts ..., \cr \code{getCovRiskBudgets} \tab Extracts ..., \cr \code{getTailRiskBudgets} \tab Extracts ... . } } \usage{ \method{getData}{fPORTFOLIO}(object) \method{getSeries}{fPORTFOLIO}(object) \method{getNAssets}{fPORTFOLIO}(object) \method{getUnits}{fPORTFOLIO}(x) \method{getStatistics}{fPORTFOLIO}(object) \method{getMean}{fPORTFOLIO}(object) \method{getCov}{fPORTFOLIO}(object) \method{getMu}{fPORTFOLIO}(object) \method{getSigma}{fPORTFOLIO}(object) \method{getEstimator}{fPORTFOLIO}(object) \method{getSpec}{fPORTFOLIO}(object) \method{getModel}{fPORTFOLIO}(object) \method{getType}{fPORTFOLIO}(object) \method{getOptimize}{fPORTFOLIO}(object) \method{getEstimator}{fPORTFOLIO}(object) \method{getTailRisk}{fPORTFOLIO}(object) \method{getParams}{fPORTFOLIO}(object) \method{getOptim}{fPORTFOLIO}(object) \method{getSolver}{fPORTFOLIO}(object) \method{getTrace}{fPORTFOLIO}(object) \method{getConstraints}{fPORTFOLIO}(object) \method{getPortfolio}{fPORTFOLIO}(object) \method{getWeights}{fPORTFOLIO}(object) \method{getTargetReturn}{fPORTFOLIO}(object) \method{getTargetRisk}{fPORTFOLIO}(object) \method{getAlpha}{fPORTFOLIO}(object) \method{getRiskFreeRate}{fPORTFOLIO}(object) \method{getNFrontierPoints}{fPORTFOLIO}(object) \method{getStatus}{fPORTFOLIO}(object) \method{getCovRiskBudgets}{fPORTFOLIO}(object) \method{getTailRiskBudgets}{fPORTFOLIO}(object) \method{getA}{fPORTFOLIO}(object) \method{getControl}{fPORTFOLIO}(object) \method{getObjective}{fPORTFOLIO}(object) \method{getOptions}{fPORTFOLIO}(object) } \arguments{ \item{object}{ an object of class \code{fPORTFOLIO}, containing slots call, data, specification, constraints, portfolio, title, description. } \item{x}{ an object of class \code{fPORTFOLIO}, containing slots call, data, specification, constraints, portfolio, title, description. } } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/backtest-statisitics.Rd0000644000176200001440000000311112323217772017602 0ustar liggesusers\name{backtestStats} \alias{backtestStats} \alias{rollingSigma} \alias{rollingVaR} \alias{rollingCVaR} \alias{rollingDaR} \alias{rollingCDaR} \alias{rollingRiskBudgets} \title{Rolling portfolio backtesting statistics} \description{ Computes rolling statistics for backtest analysis } \usage{ backtestStats(object, FUN = "rollingSigma", \dots) rollingSigma(object) rollingVaR(object) rollingCVaR(object) rollingDaR(object) rollingCDaR(object) } \arguments{ \item{object}{ a list, returned from running the function \code{portfolioSmoothing}. } \item{FUN}{ a character string, specifying the name of the rolling statistics function. } \item{\dots}{ optional argument to be passed to the rolling statistics function \code{FUN}. } } \details{ The function \code{rollingSigma} calculates the portfolio risk, Sigma, over time. The function \code{rollingVaR} calculates a rolling Value at Risk. The function \code{rollingCVaR} calculates a rolling Conditional Value at Risk. The function \code{rollingDaR} calculates a rolling Drawdowns at Risk. The function \code{rollingCDaR} calculates a rolling Conditional Drawdowns at Risk. %The function \code{rollingRiskBudgets} calculates a rolling Risk %Budget of the portfolio. } \references{ W\"urtz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/solver-ampl.Rd0000644000176200001440000000303112323217772015703 0ustar liggesusers\name{solver-ampl} \alias{amplModelOpen} \alias{amplModelAdd} \alias{amplModelShow} \alias{amplDataOpen} \alias{amplDataAdd} \alias{amplDataAddValue} \alias{amplDataAddVector} \alias{amplDataAddMatrix} \alias{amplDataSemicolon} \alias{amplDataShow} \alias{amplRunOpen} \alias{amplRunAdd} \alias{amplRunShow} \alias{amplOutShow} \title{AMPL Interface} \description{ R/AMPL Interface functions. } \usage{ amplModelOpen(project) amplModelAdd(model, project) amplModelShow(project) amplDataOpen(project) amplDataAdd(name, data, type, project) amplDataAddValue(data, value, project) amplDataAddVector(data, vector, project) amplDataAddMatrix(data, matrix, project) amplDataSemicolon(project) amplDataShow(project) amplRunOpen(project) amplRunAdd(run, project) amplRunShow(project) amplOutShow(project) } \arguments{ \item{project}{ a character string, the AMPL project name. } \item{model}{...} \item{data}{...} \item{run}{...} \item{type}{...} \item{name}{...} \item{value}{...} \item{vector}{...} \item{matrix}{...} } \value{ returns AMPL files. } \author{ Diethelm Wuertz. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{optim} fPortfolio/man/portfolio-getData.Rd0000644000176200001440000000401412424415362017025 0ustar liggesusers\name{portfolio-getData} %%\alias{getData} %% \alias{getData.fPFOLIODATA} \alias{getSeries.fPFOLIODATA} \alias{getNAssets.fPFOLIODATA} \alias{getUnits.fPFOLIODATA} \alias{getStatistics.fPFOLIODATA} \alias{getMean.fPFOLIODATA} \alias{getCov.fPFOLIODATA} \alias{getMu.fPFOLIODATA} \alias{getSigma.fPFOLIODATA} \alias{getEstimator.fPFOLIODATA} \alias{getTailRisk.fPFOLIODATA} \title{Portfolio Data Extractor Functions} \description{ Extracts information from an object of class fPFOLIODATA. } \usage{ \method{getData}{fPFOLIODATA}(object) \method{getSeries}{fPFOLIODATA}(object) \method{getNAssets}{fPFOLIODATA}(object) \method{getUnits}{fPFOLIODATA}(x) \method{getStatistics}{fPFOLIODATA}(object) \method{getMean}{fPFOLIODATA}(object) \method{getCov}{fPFOLIODATA}(object) \method{getMu}{fPFOLIODATA}(object) \method{getSigma}{fPFOLIODATA}(object) \method{getEstimator}{fPFOLIODATA}(object) \method{getTailRisk}{fPFOLIODATA}(object) } \arguments{ \item{object}{ an object of class \code{fPFOLIODATA}. } \item{x}{ an object of class \code{fPFOLIODATA}. } } \details{ \tabular{ll}{ \code{getData} \tab Extracts data slot, \cr \code{getSeries} \tab Extracts assets series, \cr \code{getNAssets} \tab Extracts number of assets, \cr \code{getUnits} \tab Extracts names of assets, \cr \code{getStatistics} \tab Extracts statistics slot, \cr \code{getMean} \tab Extracs mean vector, \cr \code{getCov} \tab Extracs covariance matrix, \cr \code{getMu} \tab Extracs mu vector, \cr \code{getSigma} \tab Extracs Sigma matrix, \cr \code{getEstimator} \tab Extracs Sigma matrix, \cr \code{getTailRisk} \tab Extracts tail risk slot. } } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/portfolio-Frontier.Rd0000644000176200001440000000462012323217772017252 0ustar liggesusers\name{portfolio-portfolioFrontier} \alias{portfolioFrontier} \title{Efficient Portfolio Frontier} \description{ Compoutes the efficient portfolio frontier. } \usage{ portfolioFrontier(data, spec = portfolioSpec(), constraints = "LongOnly", include.mvl = TRUE, title = NULL, description = NULL) } \arguments{ \item{constraints}{ a character string vector, containing the constraints of the form\cr \code{"minW[asset]=percentage"} for box constraints resp. \cr \code{"maxsumW[assets]=percentage"} for sector constraints. } \item{data}{ a multivariate time series described by an S4 object of class \code{timeSeries}. If your timeSerie is not a \code{timeSeries} object, consult the generic function \code{as.timeSeries} to convert your time series. } \item{description}{ a character string which allows for a brief description. } \item{include.mvl}{ a logical flag, should the minimum variance locus be added to the plot? } \item{spec}{ an S4 object of class \code{fPFOLIOSPEC} as returned by the function \code{portfolioSpec}. } \item{title}{ a character string which allows for a project title. } } \details{ \bold{Portfolio Frontier:} \cr\cr The function \code{portfolioFrontier} calculates the whole efficient frontier. The portfolio information consists of five arguments: data, specifications, constraints, title and description. The range of the frontier is determined from the range of the asset returns, and the number of equidistant points in the returns, is calculated from the number of frontier points hold in the specifrication structure. To extract or to modify the number of frontier points use the functions \code{getNFrontierPoints} and \code{setNFrontierPoints}. The \code{frontierPortfolio} function returns the properties of the the efficient frontier as an S4 object of class \code{fPORTFOLIO}. } \value{ \code{portfolioFrontier} function returns an S4 object of class \code{"fPORTFOLIO"}. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/weights-linePlots.Rd0000644000176200001440000000655312323217772017077 0ustar liggesusers\name{weights-linePlot} \alias{weightsLinePlot} \alias{weightedReturnsLinePlot} \alias{covRiskBudgetsLinePlot} %\alias{tailRiskBudgetsLinePlot} \title{Portfolio Weights Line Plots} \description{ Displays line plots of weights, weighted returns, covariance and tail risk budgets. } \usage{ weightsLinePlot(object, labels = TRUE, col = NULL, title = TRUE, box = TRUE, legend = TRUE, ...) weightedReturnsLinePlot(object, labels = TRUE, col = NULL, title = TRUE, box = TRUE, legend = TRUE, ...) covRiskBudgetsLinePlot(object, labels = TRUE, col = NULL, title = TRUE, box = TRUE, legend = TRUE, ...) % NYI %tailRiskBudgetsLinePlot(object, labels = TRUE, col = NULL, title = TRUE, % box = TRUE, legend = TRUE, ...) } \arguments{ \item{object}{ an S4 object of class \code{fPORTFOLIO}, as returned by one of the portfolio functions, e.g. \code{efficientPortfolio} or \code{portfolioFrontier}. } \item{labels}{ a logical flag, determining if the the graph should be labeled automatically, which is the default case \code{labels=TRUE}. If set to \code{FALSE} then the graph will be displayed undecorated and the user can it decorate by himself. } \item{col}{ a character string vector, defined from a color palette. The default setting uses the "Blues" \code{seqPalette} palette. } \item{title}{ a logical flag. Should automatically a title and axis labels be added to the plot. } \item{box}{ a logical flag, determining whether a boxed frame should be plotted around the pie, by default the value is set to \code{TRUE}. } \item{legend}{ a logical value, determining if the the graph should be labeled automatically, shich is the default case \code{labels=TRUE}. If set to \code{FALSE} then the graph will be displayed undecorated and the user can it decorate by himself. Evenmore, if \code{labels} takes the value of a string vector, then the names of the assets from the porftolio \code{object} will be ignored, and the labels will be taken from the specified string vector. } \item{\dots}{ additional arguments passed to the function \code{barplot}. Only active if \code{labels=FALSE}. } } \details{ These line plots allow for different views on the results obtained from a feasible or an optimized portfolio. The function \code{weightsPlot} displays the weights composition along the frontier of a portfolio. The function \code{weightedReturnsPlot} displays the investment composition, i.e. the weighted returns along the frontier of a portfolio. The function \code{covRiskBudgetsPlot} displays the covariance risk budgets composition along the frontier of a portfolio. % NYI %The function \code{tailRiskBudgetsPlot} displays the copulae tail %risk budgets composition along the frontier of a portfolio. Note, %this is only possible if in the portfolio specification a copulae %tail risk is defined. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/frontier-PlotControl.Rd0000644000176200001440000000445412323217772017561 0ustar liggesusers\name{frontier-plotControl} \alias{frontierPlotControl} \title{Frontier Plot Control List} \description{ Allows to modify plot settings for the frontier plot. } \usage{ frontierPlotControl( # Colors: sharpeRatio.col = "blue", minvariance.col = "red", tangency.col = "steelblue", cml.col = "green", equalWeights.col = "blue", singleAsset.col = "topo.colors", twoAssets.col = "grey", monteCarlo.col = "black", # Point Sizes: minvariance.cex = 1.25, tangency.cex = 1.25, cml.cex = 1.25, equalWeights.cex = 1.25, singleAsset.cex = 1.25, twoAssets.cex = 0.01, monteCarlo.cex = 0.01, sharpeRatio.cex = 0.1, # Limits: xlim = NULL, ylim = NULL, # MC Steps: mcSteps = 5000, # Pie Settings: pieR = NULL, piePos = NULL, pieOffset = NULL) } \arguments{ \item{sharpeRatio.col}{Color setting.} \item{minvariance.col}{Color setting.} \item{tangency.col}{Color setting.} \item{cml.col}{Color setting.} \item{equalWeights.col}{Color setting.} \item{singleAsset.col}{Color setting.} \item{twoAssets.col}{Color setting.} \item{monteCarlo.col}{Color setting.} \item{minvariance.cex}{Font point size setting.} \item{tangency.cex}{Font point size setting.} \item{cml.cex}{Font point size setting.} \item{equalWeights.cex}{Font point size setting.} \item{singleAsset.cex}{Font point size setting.} \item{twoAssets.cex}{Font point size setting.} \item{monteCarlo.cex}{Font point size setting.} \item{sharpeRatio.cex}{Font point size setting.} \item{xlim}{x-axis limit setting.} \item{ylim}{y-axis limit setting.} \item{mcSteps}{Numer of Monte Carlo steps.} \item{pieR}{Pie radius setting.} \item{piePos}{Pie position coordinates setting.} \item{pieOffset}{Pie offset coordinates setting.} } %\details{} \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/a-class-fPORTFOLIO.Rd0000644000176200001440000002376612323217772016527 0ustar liggesusers\name{fPORTFOLIO} \alias{fPORTFOLIO} \alias{class-fPORTFOLIO} \alias{fPORTFOLIO-class} \alias{plot.fPORTFOLIO} \alias{summary.fPORTFOLIO} \title{Portfolio Class} \description{ A collection and description of functions allowing to gain information about optimal portfolios. Generally, optimization is done via three arguments, data, specification of the portfolio, and constraints, while function portfolioFrontier has two additional arguments for title and description. } \usage{ \method{plot}{fPORTFOLIO}(x, which = "ask", control = list(), \dots) \method{summary}{fPORTFOLIO}(object, \dots) } \arguments{ \item{control}{ a list, defining the plotting parameters. The list modifies amongst others the color, e.g. \code{minvariance.col}, type of point, e.g. \code{tangency.pch}, or the dimension of the point, e.g. \code{cml.cex}, see Notes for a complete list of control parameters. } \item{which}{ which of the plots should be displayed? \code{which} can be either a character string, \code{"all"} (displays all plots) or \code{"ask"} (interactively asks which one to display), or a vector of integer values displaying the corresponding plot. Default value is \code{"ask"}. } \item{object, x}{ an S4 object of class \code{fPORTFOLIO}. } \item{\dots}{ optional arguments to be passed.\cr } } \details{ \bold{Portfolio Class:} \cr\cr This S4 class contains all information about the portfolio. Basically these are risk measure, mean and covariance estimation, target return, risk free rate, number of frontier points, ranges for calculation, see the "Value" section for a detailed description of the slots. } \value{ \code{portfolioFrontier()}\cr returns an S4 object of class \code{"fPORTFOLIO"}, with the following slots: \item{@call}{ a call, returning the matched function call. } \item{@data}{ a list with two named elements, \code{series} holding the time series data if available, otherwise NA, and \code{statistics}, itself a named list with two named elements \code{mu} and \code{Sigma} holding the vector of means and the matrix of covariances. } \item{@description}{ a character string, allowing for a brief project description. } \item{@portfolio}{ a list, containing parameter specifications for the portfolio:\cr \code{weights} a numeric vector specifying the portfolio weights,\cr \code{targetReturn} a numeric value specifying the target return,\cr \code{targetRisk} a numeric value specifying the target risk,\cr \code{targetMean} a numeric value specifying the target return determinated with function mean(),\cr \code{targetStdev} a numeric value specifying the target risk in standart deviation as risk measure. } \item{@specification}{ a list with one named element \code{spec} which represents an object of class \code{fPFOLIOSPEC}, including all information about the portfolio specifications, see \code{PortfolioSpec} for further details. } \item{@title}{ a title string. } \code{feasiblePortfolio}\cr \code{cmlPortfolio}\cr \code{tangencyPortfolio}\cr \code{minvariancePortfolio}\cr \code{efficientPortfolio}\cr return an S4 object of class \code{fPORTFOLIO} having information only about one portfolio. } \section{Control Parameters}{ In the following all elements of argument control from functions \code{plot}, \code{weightsSlider}, \code{frontierSlider} are listed. \describe{ \item{sliderResolution}{ [weightsSlider, frontierSlider] - a numeric, determining the numbers of slider points, by default nFrontierPoints/10. } \item{sliderFlag}{ [weightsSlider, frontierSlider] - a character string, denoting the slidertype, by default "frontier" for \code{frontierSlider} and "weights" for \code{weightsSlider}. } \item{sharpeRatio.col}{ [plot, frontierSlider] - a character string, defining color of the Sharpe ratio plot, by default "black". } \item{minvariance.col}{ a character string, defining color of the minimum variance portfolio, by default "red". } \item{tangency.col}{ a character string, defining color of the tangency portfolio, by default "steelblue". } \item{cml.col}{ [plot, frontierSlider] - a character string, defining color of the market portfolio and the capital market line, by default "green". } \item{equalWeights.col}{ [plot, frontierSlider] - a character string, defining the color of the equal weights portfolio, by default "blue". } \item{runningPoint.col}{ [weightsSlider] - a character string, defining color of the point indicating the current portfolio, by default "red". } \item{singleAsset.col}{ a character string vector, defining color of the single asset portfolios. The vector must have length the number of assets, by default \code{rainbow}. } \item{twoAssets.col}{ [plot, frontierSlider] - a character string, defining color of the two assets efficient frontier, by default "grey". } \item{monteCarlo.col}{ [plot, frontierSlider] - a character string, defining color of the Monte Carlo portfolios, by default "black". } \item{minvariance.pch}{ a number, defining symbol used for the minimum variance portfolio. See \code{\link{points}} for description. Default symbol is 17. } \item{tangency.pch}{ a number, defining symbol used for the tangency portfolio. See \code{\link{points}} for description. Default symbol is 17. } \item{cml.pch}{ [plot, frontierSlider] - a number, defining symbol used for the market portfolio. See \code{\link{points}} for description. Default symbol is 17. } \item{equalWeights.pch}{ [plot, frontierSlider] - a number, defining symbol used for the equal weights portfolio. See \code{\link{points}} for description. Default symbol is 15. } \item{singleAsset.pch}{ a number, defining symbol used for the single asset portfolios. See \code{\link{points}} for description. Default symbol is 18. } \item{sharpeRatio.cex}{ [plot, frontierSlider] - a number, determining size (percentage) of the Sharpe ratio plot, by default 0.1. } \item{minvariance.cex}{ a number, determining size (percentage) of the minimum variance portfolio symbol, by default 1. } \item{tangency.cex}{ a number, determining size (percentage) of the tangency portfolio symbol, by default 1.25. } \item{cml.cex}{ [plot, frontierSlider] - a number, determining size (percentage) of the market portfolio symbol, by default 1.25. } \item{equalWeights.cex}{ [plot, frontierSlider] - a number, determining size (percentage) of the equal weights portfolio symbol, by default 0.8. } \item{runningPoint.cex}{ [weightsSlider] - a number, determining size (percentage) of the point indicating the current portfolio equal weights portfolio symbol, by default 0.8. } \item{singleAsset.cex}{ a number, determining size (percentage) of the singel asset portfolio symbols, by default 0.8. } \item{twoAssets.cex}{ [plot, frontierSlider] - a number, determining size (percentage) of the two assets efficient frontier plot, by default 0.01. } \item{monteCarlo.cex}{ [plot, frontierSlider] - a number, determining size (percentage) of the Monte Carol portfolio symbols, by default 0.01. } \item{monteCarlo.cex}{ [plot, frontierSlider] - a number, determining size (percentage) of the Monte Carol portfolio symbols, by default 0.01. } \item{mcSteps}{ [plot] - a number, determining number of Monte Carol portfolio, by default 5000. } \item{pieR}{ [plot, frontierSlider] - a vector, containing factors for shrinking and stretching the x- and y-axis, by default NULL, i.e. c(1, 1) is used. Default pie size is 1/15 of the plot range. } \item{piePos}{ [plot, frontierSlider] - a number, determining the weight on the efficient frontier, which is illustrated by the pie. Default is tangency portfolio } \item{pieOffset}{ [plot, frontierSlider] - a vector, containing the pie's x- and y-axis offset from the efficient frontier. Default is NULL, i.e. the pie is set one default radius left of the efficient frontier. } \item{xlim}{ [weightsSlider, frontierSlider] - a vector, containing x-axis plot limits of the efficient frontier. Default setting is maximum of frontier range or single assets portfolios. } \item{ylim}{ [weightsSlider, frontierSlider] - a vector, containing y-axis plot limits of the efficient frontier. Default setting is maximum of frontier range or single assets portfolios. } } % end describe } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/00fPortfolio-package.Rd0000644000176200001440000000161513203340725017315 0ustar liggesusers\name{fPortfolio-package} \alias{fPortfolio} \docType{package} \title{Portfolio Design, Optimization and Backtesting} \description{ The Rmetrics "fPortfolio" package is a very powerful collection of functions to optimize portfolios and to analyze them from different points of view. } \details{ \tabular{ll}{ Package: \tab fPortfolio\cr Type: \tab Package\cr Date: \tab 2011\cr License: \tab GPL Version 2 or later\cr Copyright: \tab (c) 1999-2011 Diethelm Wuertz and Rmetrics Association\cr URL: \tab \url{http://www.rmetrics.org} } } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/mathprog-LP.Rd0000644000176200001440000000505412323217772015603 0ustar liggesusers\name{mathprog-LP} \alias{rsolveLP} \alias{rglpkLP} \alias{glpkLP} \alias{glpkLPControl} \alias{rsymphonyLP} \alias{symphonyLP} \alias{symphonyLPControl} \alias{ramplLP} \alias{amplLP} \alias{amplLPControl} \alias{rneosLP} \alias{neosLP} \alias{neosLPControl} \title{Mathematical Linear Programming} \description{ Mathematical Linear Programming. } \usage{ rsolveLP(objective, lower=0, upper=1, linCons, control=list(solver="glpk", invoke=c("R", "AMPL", "NEOS"))) rglpkLP(objective, lower=0, upper=1, linCons, control=list()) glpkLP glpkLPControl(solver = "glpk", project="r", trace=FALSE) rsymphonyLP(objective, lower=0, upper=1, linCons, control=list()) symphonyLP symphonyLPControl(solver="symphony", project="r", trace=FALSE) ramplLP(objective, lower = 0, upper = 1, linCons, control=list()) amplLP(objective, x_L=NULL, x_U=NULL, A=NULL, b_L=NULL, b_U=NULL, control=list()) amplLPControl(solver="ipopt", project="ampl", inf=1e12, trace=FALSE) rneosLP(objective, lower = 0, upper = 1, linCons, control=list()) neosLP(objective, x_L=NULL, x_U=NULL, A=NULL, b_L=NULL, b_U=NULL, control=list()) neosLPControl(solver="ipopt", category="lp", project="neos", inf=1e12, trace=FALSE) } \arguments{ \item{objective}{ a numeric vector. } \item{lower, upper}{ lower and upper bounds. } \item{linCons}{ list of linear constraints: mat, lower, upper. } \item{control}{ control list. } \item{x_L, x_U}{ lower and upper box bounds. } \item{A}{ linear constraints matrix. } \item{b_L, b_U}{ lower and upper linear constraints bounds. } \item{solver}{ a character string, the solver name. } \item{category}{ a character string, the NEOS category name. } \item{project}{ a character string, the AMPL project name. } \item{inf}{ a numeric value, the maximum value used for bounds. } \item{trace}{ a logical flag, if TRUE the optimization will be traced. } } \value{ a list of class \code{solver} with the following named ebtries: \code{opt}, \code{solution}, \code{objective}, \code{status}, \code{message}, \code{solver}, \code{version}. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/backtest-functions.Rd0000644000176200001440000000573312323217772017263 0ustar liggesusers\name{backtest-functions} \alias{equidistWindows} \alias{tangencyStrategy} \alias{emaSmoother} \title{User defined functions to perform portfolio backtesting} \description{ Default windows, strategy and smoothing functions used for portfolio backtesting. } \usage{ equidistWindows(data, backtest = portfolioBacktest()) tangencyStrategy(data, spec = portfolioSpec(), constraints = "LongOnly", backtest = portfolioBacktest()) emaSmoother(weights, spec, backtest) } \arguments{ \item{data}{ a multivariate time series described by an S4 object of class \code{timeSeries}. If your timeSerie is not a \code{timeSeries} object, consult the generic function \code{as.timeSeries} to convert your time series. } \item{backtest}{ an S4 object of class \code{fPFOLIOBACKTEST} as returned by the function \code{portfolioBacktest}. } \item{spec}{ an S4 object of class \code{fPFOLIOSPEC} as returned by the function \code{portfolioSpec}. } \item{constraints}{ a character string vector, containing the constraints of the form\cr \code{"minW[asset]=percentage"} for box constraints resp. \cr \code{"maxsumW[assets]=percentage"} for sector constraints. } \item{weights}{ a numeric vector, containing the portfolio weights of an asset } } \details{ \bold{equidistWindows:}\cr Defines equal distant rolling windows. The function requires two arguments: \code{data} and \code{backtest}, see above. To assign the horizon value to the backtest specification structure, use the function \code{setWindowsHorizon}. \bold{tangencyStrategy:}\cr A pre-defined tangency portfolio strategy. The function requires four arguments: \code{data}, \code{spec}, \code{constraints} and \code{backtest}, see above. \bold{emaSmoother:}\cr A pre-defined weights smoother (EMA) for portfolio backtesting. The function requires three arguments: \code{weights}, \code{spec} and \code{backtest}, see above. To assign initial starting weights, smoothing parameter (lambda) or whether to perform double smoothing to the backtest specification structure, use the functions \code{setSmootherInitialWeights}, \code{setSmootherLambda} and \code{setSmootherDoubleSmoothing}, respectively. } \value{ \code{equidistWindows}\cr function returns the "from" and "to" dates of the rolling window in a list form. \code{tangencyStrategy}\cr function returns a S4 object of class \code{"fPORTFOLIO"}. \code{emaSmoother}\cr function returns a numeric vector of smoothed weights. } \references{ W\"urtz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/backtest-performance.Rd0000644000176200001440000000165612323217772017554 0ustar liggesusers\name{backtest-performance} \alias{netPerformance} \title{Portfolio backtesting net performance} \description{ Displays plot of rebased portfolio performance and summary statistics. } \usage{ netPerformance(object, format = "\%Y-\%m-\%d") } \arguments{ \item{object}{ a list, returned from running the function \code{portfolioSmoothing}. } \item{format}{ a character string of the date format used } } \value{ A plot of rebased portfolio returns and tables summarising portfolio performance over time. } \note{ This function will become obsolete by functions provided in the upcoming \code{fPortfolioPerformance} package. } \references{ W\"urtz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/portfolio-efficientPfolio.Rd0000644000176200001440000000556512323217772020600 0ustar liggesusers\name{portfolio-efficientPortfolio} \alias{efficientPortfolio} \alias{maxratioPortfolio} \alias{tangencyPortfolio} \alias{minriskPortfolio} \alias{minvariancePortfolio} \alias{maxreturnPortfolio} \title{Efficient Portfolios} \description{ Returns efficient portfolios. } \usage{ efficientPortfolio(data, spec = portfolioSpec(), constraints = "LongOnly") maxratioPortfolio(data, spec = portfolioSpec(), constraints = "LongOnly") tangencyPortfolio(data, spec = portfolioSpec(), constraints = "LongOnly") minriskPortfolio(data, spec = portfolioSpec(), constraints = "LongOnly") minvariancePortfolio(data, spec = portfolioSpec(), constraints = "LongOnly") maxreturnPortfolio(data, spec = portfolioSpec(), constraints = "LongOnly") } \arguments{ \item{constraints}{ a character string vector, containing the constraints of the form\cr \code{"minW[asset]=percentage"} for box constraints resp. \cr \code{"maxsumW[assets]=percentage"} for sector constraints. } \item{data}{ a multivariate time series described by an S4 object of class \code{timeSeries}. If your timeSerie is not a \code{timeSeries} object, consult the generic function \code{as.timeSeries} to convert your time series. } \item{spec}{ an S4 object of class \code{fPFOLIOSPEC} as returned by the function \code{portfolioSpec}. } } \details{ \bold{Efficient Portfolio:} An efficient portfolio is a portfolio which lies on the efficient frontier. The \code{efficientPortfolio} function returns the properties of the efficient portfolio as an S4 object of class \code{fPORTFOLIO}. \bold{Minumum Risk or Tangency Portfolio:} The function \code{tangencyPortfolio} returns the portfolio with the highest return/risk ratio on the efficient frontier. For the Markowitz portfolio this is the same as the Sharpe ratio. To find this point on the frontier the return/risk ratio calculated from the target return and target risk returned by the function \code{efficientPortfolio}. \bold{Global minimum risk or Minimum Variance Portfolio:} The function \code{minvariancePortfolio} returns the portfolio with the minimal risk on the efficient frontier. To find the minimal risk point the target risk returned by the function \code{efficientPortfolio} is minimized. \bold{Maximum Return Portfolio:} The function \code{maxreturnPortfolio} returns the portfolio with the maximal return for a fixed target risk. } \value{ returns an S4 object of class \code{"fPORTFOLIO"}. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models} fPortfolio/man/portfolio-riskPfolio.Rd0000644000176200001440000001415312620132672017600 0ustar liggesusers\name{portfolio-riskPfolio} \alias{riskPfolio} \alias{pfolioVaR} \alias{pfolioCVaR} \alias{pfolioCVaRplus} \alias{lambdaCVaR} \alias{pfolioCVaRoptim} \alias{pfolioMaxLoss} \alias{pfolioReturn} \alias{pfolioTargetReturn} \alias{pfolioTargetRisk} \alias{pfolioSigma} \alias{pfolioHist} \title{Risk and Related Measures for Portfolios} \description{ Computes Value-at-Risk and related measures for a portfolio of assets. The functions are: \tabular{ll}{ \code{pfolioVaR} \tab computes Value-at-Risk for a portfolio of assets, \cr \code{pfolioCVaRplus} \tab computes Value-at-Risk+ for a portfolio of assets, \cr \code{pfolioCVaR} \tab computes Conditional Value-at-Risk for a PF of assets, \cr \code{lambdaCVaR} \tab computes CVaR's atomic split value lambda, \cr \code{pfolioCVaRoptim} \tab computes Conditional VaR from mean-CVaR optimization, \cr \code{pfolioMaxLoss} \tab computes Maximum Loss for a portfolio of assets, \cr \code{pfolioReturn} \tab computes return values of a portfolio, \cr \code{pfolioTargetReturn} \tab computes the target return of a portfolio, \cr \code{pfolioTargetRisk} \tab computes the target risk of a portfolio, \cr \code{pfolioHist} \tab plots a histogram of the returns of a portfolio. } } \usage{ pfolioVaR(x, weights = NULL, alpha = 0.05) pfolioCVaRplus(x, weights = NULL, alpha = 0.05) pfolioCVaR(x, weights = NULL, alpha = 0.05) lambdaCVaR(n, alpha = 0.05) pfolioCVaRoptim(x, weights = NULL, alpha = 0.05) pfolioMaxLoss(x, weights = NULL) pfolioReturn(x, weights = NULL, geometric = FALSE) pfolioTargetReturn(x, weights = NULL) pfolioTargetRisk(x, weights = NULL) pfolioHist(x, weights = NULL, alpha = 0.05, range = NULL, details = TRUE, \dots) } \arguments{ \item{x}{ a 'timeSeries' object, data frame or any other rectangular object which can be expressed as a matrix. The first dimension is the number of observations, we call it \code{n}, and the second is the number of assets in the data set, we call it \code{dim}. } \item{weights}{ usually a numeric vector which has the length of the number of assets. The weights measures the normalized weights of the individual assets. By default \code{NULL}, then an equally weighted set of assets is assumed. } \item{geometric}{ a logical flag, should geometric returns be used, by default FALSE } \item{alpha}{ a numeric value, the confidence interval, by default 0.05. } \item{details}{ a logical value, should details be printed? } \item{n}{ the number of observation from which the CVaR's atomic split value \code{lambda=1-floor(alpha*n)/(alpha*n)} will be evaluated. } \item{range}{ a numeric vector of two elements limiting the plot range of the histogram. This is quite useful if one likes to compare several plots on the same scale. If \code{range=NULL}, the default value, then the range will be selected automatically. } \item{\dots}{ optional arguments to be passet to the function \code{hist}. } } \details{ The percentile measures of loss (or reward) are defined in the following way: Let \eqn{f(x ,y)} be a loss functions depending upon a decision vector \eqn{x = (x_1, ..., x_n )} and a random vector \eqn{y = (y_1, ..., y_m)}, then \emph{pfolioVaR} is the alpha-percentile of the loss distribution, a smallest value such that the probability that losses exceed or are equal to this value is greater or equal to alpha. \emph{pfolioCVaRplus} or "CVaR+" or the "upper CVaR" are the expected losses strictly exceeding VaR. This is also also called "Mean Excess Loss" and "Expected Shortfall". \emph{pfolioCVaR} is a weighted average of VaR and CVaRplus defined as \eqn{CVaR = lambda*VaR + (1-lambda)} CVaRplus, for \eqn{0 <= lambda <= 1}. Note, CVaR is convex, but VaR and CVaRplus may be non-convex. The following inequalities are valid: \eqn{VaR <= CVaR <= CVaRplus}. } \value{ \code{pfolioVaR} \cr returns the value of risk, VaR, for a portfolio of assets, a numeric value. \cr \code{pfolioCVaRplus} \cr returns the conditional value of risk plus, CVaRplus, for a portfolio of assets, a numeric value. \cr \code{pfolioCVaR} \cr returns the conditional value of risk, CVaR, for a portfolio of assets, a numeric value. \cr \code{lambdaCVaR} \cr returns CVaR's atomic split value \code{lambda}, a numeric value. \cr \code{pfolioMaxLoss} \cr returns the maximum loss value of the portfolio, a numeric value. \cr \code{pfolioReturn} \cr returns the total portfolio return computed from the set of assets \code{x}, a numeric vector. \cr \code{pfolioTargetReturn} \cr returns the total return or target return computed from the set of assets \code{x} and weights \code{weights}, a numeric value. \cr \code{pfolioTargetRisk} \cr returns the total risk (Sigma) or target risk computed from the set of assets \code{x} and \code{weights} via the formual \code{sqrt(weights \%*\% cov(x) \%*\% weights)}, a numeric value. \cr \code{pfolioHist} \cr plots a histogram of portfolio returns and adds the values for the VaR (blue), for the CVaRplus (red), and for the maximum loss (green) to the histogram plot. The function invisibly returns a list with the following elements: VaR, VaRplus, maxLoss, mean, and sd. If \code{details} is \code{TRUE}, then the result is printed. } \references{ Uryasev S. (2000); \emph{Conditional Value-at-Risk (CVaR): Algorithms and Applications}, Risk Management and Financial Engineering Lab, University of Florida Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{math} fPortfolio/man/a-class-fPFOLIODATA.Rd0000644000176200001440000000565012323217772016564 0ustar liggesusers\name{fPFOLIODATA} \alias{fPFOLIODATA} \alias{class-fPFOLIODATA} \alias{fPFOLIODATA-class} \alias{show,fPFOLIODATA-method} \alias{portfolioData} \title{Portfolio Data Handling} \description{ Creates a fPFOLIODATA object with data set and statistical measures. } \usage{ portfolioData(data, spec = portfolioSpec()) \S4method{show}{fPFOLIODATA}(object) } \arguments{ \item{data}{ [portfolioStatistics] - \cr a time series or a named list, containing either a series of returns or named entries 'mu' and 'Sigma' being mean and covariance matrix. } \item{object}{ [show] - \cr an object of class \code{fPFOLIODATA} as returned by the function \code{portfolioData}. } \item{spec}{ an S4 object of class \code{fPFOLIOSPEC}, the specification to be modified, by default the default of the function \code{portfolioSpec()}. } } \details{ \bold{Dutch Portfolio Data Set:} \cr\cr This data represents seven stocks from the Dutch AEX index, Netherlands blue chips. The data is a list of the covariance matrix and the return means and is based on daily returns over a period from January 1990 till end of October 2003. Companies representing the data are Elsevier, Fortis, Getronics, Heineken, Philips, Shell and Unilever. \cr \bold{US Portfolio Data Set:} \cr\cr The data inherits eight assets being indexes, commodities and bonds. The data is a time series of yearly returns from December 1973 till December 1994. Assets are TBills3m, LongBonds, SP500, Wilshire5000, NASDAQComp, LehmanBonds, EAFE, Gold. \cr \bold{Simulated Mean-Cov Data Set:} \cr\cr This data is taken from chapter 1.3.2 in Scherer, M., Martin, R.D. (2005); \emph{Introduction To Modern Portfolio Optimization with NuOPT, S-PLUS and S+Bayes}, Springer, Berlin. It is a list of covariance matrix and the return means of imaginary assets. It is an example set for learning about optimization. \cr \bold{World Index Returns Data Set:} \cr\cr This data set is contributed by D. Locher (2007); It is a timeSeries object of four world index return data sets including Asia, Eastern Europe, Far East and Latin America. } \value{ \code{portfolioStatistics}\cr returns a named list of estimated mean \code{$mu} and covariance \code{$Sigma} statistics, from a multivariate time series of assets. \cr \code{portfolioData}\cr returns a named list of the time series \code{$series} and the portfolio \code{$statistics} as returned by the function \code{portfolioStatistics}. } \references{ Wuertz, D., Chalabi, Y., Chen W., Ellis A. (2009); \emph{Portfolio Optimization with R/Rmetrics}, Rmetrics eBook, Rmetrics Association and Finance Online, Zurich. } \keyword{models}