performance/0000755000176200001440000000000013620350016012547 5ustar liggesusersperformance/NAMESPACE0000644000176200001440000002423313620212654013777 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(as.data.frame,check_outliers) S3method(as.numeric,check_outliers) S3method(check_autocorrelation,default) S3method(check_collinearity,MixMod) S3method(check_collinearity,default) S3method(check_collinearity,glmmTMB) S3method(check_collinearity,hurdle) S3method(check_collinearity,zerocount) S3method(check_collinearity,zeroinfl) S3method(check_convergence,default) S3method(check_convergence,merMod) S3method(check_distribution,default) S3method(check_distribution,numeric) S3method(check_heteroscedasticity,default) S3method(check_homogeneity,default) S3method(check_model,default) S3method(check_normality,default) S3method(check_outliers,data.frame) S3method(check_outliers,default) S3method(check_outliers,glmmTMB) S3method(check_outliers,numeric) S3method(check_overdispersion,fixest) S3method(check_overdispersion,glm) S3method(check_overdispersion,glmmTMB) S3method(check_overdispersion,glmx) S3method(check_overdispersion,merMod) S3method(check_overdispersion,negbin) S3method(check_singularity,MixMod) S3method(check_singularity,clmm) S3method(check_singularity,cpglmm) S3method(check_singularity,default) S3method(check_singularity,glmmTMB) S3method(check_singularity,glmmadmb) S3method(check_singularity,lme) S3method(check_singularity,merMod) S3method(check_singularity,rlmerMod) S3method(cronbachs_alpha,data.frame) S3method(cronbachs_alpha,parameters_pca) S3method(icc,brmsfit) S3method(icc,default) S3method(logLik,cpglm) S3method(logLik,iv_robust) S3method(logLik,ivreg) S3method(logLik,plm) S3method(model_performance,DirichletRegModel) S3method(model_performance,MixMod) S3method(model_performance,betareg) S3method(model_performance,brmsfit) S3method(model_performance,censReg) S3method(model_performance,clm) S3method(model_performance,clm2) S3method(model_performance,coxph) S3method(model_performance,felm) S3method(model_performance,fixest) S3method(model_performance,flexsurvreg) S3method(model_performance,glm) S3method(model_performance,glmmTMB) S3method(model_performance,glmmadmb) S3method(model_performance,glmx) S3method(model_performance,hurdle) S3method(model_performance,iv_robust) S3method(model_performance,ivreg) S3method(model_performance,lavaan) S3method(model_performance,lm) S3method(model_performance,lme) S3method(model_performance,merMod) S3method(model_performance,mixed) S3method(model_performance,mixor) S3method(model_performance,mlogit) S3method(model_performance,multinom) S3method(model_performance,plm) S3method(model_performance,polr) S3method(model_performance,rlmerMod) S3method(model_performance,stanreg) S3method(model_performance,survreg) S3method(model_performance,svyglm) S3method(model_performance,truncreg) S3method(model_performance,vglm) S3method(performance_aicc,default) S3method(performance_aicc,vglm) S3method(performance_logloss,brmsfit) S3method(performance_logloss,default) S3method(performance_lrt,default) S3method(plot,check_collinearity) S3method(plot,check_distribution) S3method(plot,check_distribution_numeric) S3method(plot,check_heteroscedasticity) S3method(plot,check_homogeneity) S3method(plot,check_normality) S3method(plot,check_outliers) S3method(plot,compare_performance) S3method(plot,performance_roc) S3method(print,binned_residuals) S3method(print,check_collinearity) S3method(print,check_distribution) S3method(print,check_distribution_numeric) S3method(print,check_itemscale) S3method(print,check_model) S3method(print,check_outliers) S3method(print,check_overdisp) S3method(print,check_zi) S3method(print,compare_performance) S3method(print,icc) S3method(print,icc_decomposed) S3method(print,item_difficulty) S3method(print,looic) S3method(print,perf_pca) S3method(print,perf_pca_rotate) S3method(print,performance_accuracy) S3method(print,performance_hosmer) S3method(print,performance_lrt) S3method(print,performance_model) S3method(print,performance_pcp) S3method(print,performance_roc) S3method(print,performance_score) S3method(print,r2_bayes) S3method(print,r2_generic) S3method(print,r2_nakagawa) S3method(r2,BBreg) S3method(r2,DirichletRegModel) S3method(r2,MixMod) S3method(r2,betareg) S3method(r2,bigglm) S3method(r2,biglm) S3method(r2,bracl) S3method(r2,brmsfit) S3method(r2,brmultinom) S3method(r2,censReg) S3method(r2,clm) S3method(r2,clm2) S3method(r2,clmm) S3method(r2,complmrob) S3method(r2,coxph) S3method(r2,cpglm) S3method(r2,cpglmm) S3method(r2,crch) S3method(r2,default) S3method(r2,feis) S3method(r2,felm) S3method(r2,fixest) S3method(r2,glm) S3method(r2,glmmTMB) S3method(r2,glmmadmb) S3method(r2,glmx) S3method(r2,hurdle) S3method(r2,iv_robust) S3method(r2,ivreg) S3method(r2,lm) S3method(r2,lme) S3method(r2,lmrob) S3method(r2,mclogit) S3method(r2,merMod) S3method(r2,mixed) S3method(r2,mlogit) S3method(r2,mmclogit) S3method(r2,multinom) S3method(r2,plm) S3method(r2,polr) S3method(r2,rlmerMod) S3method(r2,stanreg) S3method(r2,survreg) S3method(r2,svyglm) S3method(r2,truncreg) S3method(r2,vgam) S3method(r2,vglm) S3method(r2,wbm) S3method(r2,zeroinfl) S3method(r2,zerotrunc) S3method(r2_coxsnell,BBreg) S3method(r2_coxsnell,DirichletRegModel) S3method(r2_coxsnell,censReg) S3method(r2_coxsnell,clm) S3method(r2_coxsnell,clm2) S3method(r2_coxsnell,coxph) S3method(r2_coxsnell,cpglm) S3method(r2_coxsnell,crch) S3method(r2_coxsnell,glm) S3method(r2_coxsnell,glmx) S3method(r2_coxsnell,mclogit) S3method(r2_coxsnell,multinom) S3method(r2_coxsnell,polr) S3method(r2_coxsnell,survreg) S3method(r2_coxsnell,truncreg) S3method(r2_efron,default) S3method(r2_mcfadden,bracl) S3method(r2_mcfadden,brmultinom) S3method(r2_mcfadden,censReg) S3method(r2_mcfadden,clm) S3method(r2_mcfadden,clm2) S3method(r2_mcfadden,cpglm) S3method(r2_mcfadden,glm) S3method(r2_mcfadden,glmx) S3method(r2_mcfadden,mclogit) S3method(r2_mcfadden,mlogit) S3method(r2_mcfadden,multinom) S3method(r2_mcfadden,polr) S3method(r2_mcfadden,truncreg) S3method(r2_mcfadden,vglm) S3method(r2_mckelvey,default) S3method(r2_nagelkerke,BBreg) S3method(r2_nagelkerke,DirichletRegModel) S3method(r2_nagelkerke,bracl) S3method(r2_nagelkerke,brmultinom) S3method(r2_nagelkerke,censReg) S3method(r2_nagelkerke,clm) S3method(r2_nagelkerke,clm2) S3method(r2_nagelkerke,coxph) S3method(r2_nagelkerke,cpglm) S3method(r2_nagelkerke,crch) S3method(r2_nagelkerke,glm) S3method(r2_nagelkerke,glmx) S3method(r2_nagelkerke,mclogit) S3method(r2_nagelkerke,multinom) S3method(r2_nagelkerke,polr) S3method(r2_nagelkerke,survreg) S3method(r2_nagelkerke,truncreg) S3method(residuals,iv_robust) export(binned_residuals) export(check_autocorrelation) export(check_collinearity) export(check_convergence) export(check_distribution) export(check_heteroscedasticity) export(check_homogeneity) export(check_itemscale) export(check_model) export(check_normality) export(check_outliers) export(check_overdispersion) export(check_singularity) export(check_zeroinflation) export(compare_performance) export(cronbachs_alpha) export(icc) export(item_difficulty) export(item_intercor) export(item_reliability) export(item_split_half) export(looic) export(model_performance) export(mse) export(performance) export(performance_accuracy) export(performance_aic) export(performance_aicc) export(performance_hosmer) export(performance_logloss) export(performance_lrt) export(performance_mse) export(performance_pcp) export(performance_rmse) export(performance_roc) export(performance_rse) export(performance_score) export(r2) export(r2_bayes) export(r2_coxsnell) export(r2_efron) export(r2_kullback) export(r2_loo) export(r2_mcfadden) export(r2_mckelvey) export(r2_nagelkerke) export(r2_nakagawa) export(r2_tjur) export(r2_xu) export(r2_zeroinflated) export(rmse) importFrom(bayestestR,area_under_curve) importFrom(bayestestR,bayesfactor_models) importFrom(bayestestR,ci) importFrom(bayestestR,estimate_density) importFrom(bayestestR,hdi) importFrom(bayestestR,map_estimate) importFrom(insight,all_models_equal) importFrom(insight,clean_names) importFrom(insight,find_algorithm) importFrom(insight,find_formula) importFrom(insight,find_parameters) importFrom(insight,find_predictors) importFrom(insight,find_response) importFrom(insight,format_table) importFrom(insight,get_data) importFrom(insight,get_predictors) importFrom(insight,get_response) importFrom(insight,get_varcov) importFrom(insight,get_variance) importFrom(insight,get_variance_residual) importFrom(insight,has_intercept) importFrom(insight,is_model) importFrom(insight,is_model_supported) importFrom(insight,is_multivariate) importFrom(insight,model_info) importFrom(insight,n_obs) importFrom(insight,print_color) importFrom(stats,AIC) importFrom(stats,BIC) importFrom(stats,IQR) importFrom(stats,anova) importFrom(stats,as.formula) importFrom(stats,bartlett.test) importFrom(stats,binomial) importFrom(stats,coef) importFrom(stats,complete.cases) importFrom(stats,cooks.distance) importFrom(stats,cor) importFrom(stats,cov) importFrom(stats,cov2cor) importFrom(stats,dbinom) importFrom(stats,density) importFrom(stats,df.residual) importFrom(stats,dnbinom) importFrom(stats,dpois) importFrom(stats,family) importFrom(stats,fitted) importFrom(stats,fligner.test) importFrom(stats,formula) importFrom(stats,glm) importFrom(stats,lm) importFrom(stats,logLik) importFrom(stats,mad) importFrom(stats,mahalanobis) importFrom(stats,median) importFrom(stats,model.frame) importFrom(stats,model.matrix) importFrom(stats,na.omit) importFrom(stats,nobs) importFrom(stats,pchisq) importFrom(stats,pf) importFrom(stats,pnbinom) importFrom(stats,ppoints) importFrom(stats,ppois) importFrom(stats,predict) importFrom(stats,predict.glm) importFrom(stats,qchisq) importFrom(stats,qf) importFrom(stats,qnorm) importFrom(stats,quantile) importFrom(stats,reshape) importFrom(stats,residuals) importFrom(stats,rstandard) importFrom(stats,rstudent) importFrom(stats,sd) importFrom(stats,setNames) importFrom(stats,shapiro.test) importFrom(stats,terms) importFrom(stats,update) importFrom(stats,var) importFrom(stats,vcov) importFrom(stats,weights) importFrom(stats,xtabs) importFrom(utils,packageVersion) performance/README.md0000644000176200001440000003025613620205622014036 0ustar liggesusers # performance [![CRAN](http://www.r-pkg.org/badges/version/performance)](https://cran.r-project.org/package=performance) [![Build Status](https://travis-ci.org/easystats/performance.svg?branch=master)](https://travis-ci.org/easystats/performance) [![downloads](http://cranlogs.r-pkg.org/badges/performance)](https://cran.r-project.org/package=performance) ***Test if your model is a good model\!*** The primary goal of the **performance** package is to provide utilities for computing **indices of model quality** and **goodness of fit**. This includes measures like r-squared (R2), root mean squared error (RMSE) or intraclass correlation coefficient (ICC) , but also functions to check (mixed) models for overdispersion, zero-inflation, convergence or singularity. ## Installation Run the following: ``` r install.packages("performance") ``` ``` r library("performance") ``` # Examples [![Documentation](https://img.shields.io/badge/documentation-performance-orange.svg?colorB=E91E63)](https://easystats.github.io/performance/) [![Features](https://img.shields.io/badge/features-performance-orange.svg?colorB=2196F3)](https://easystats.github.io/performance/reference/index.html) [![Blog](https://img.shields.io/badge/blog-easystats-orange.svg?colorB=FF9800)](https://easystats.github.io/blog/posts/) ## Assessing model quality ### R-squared **performance** has a generic `r2()` function, which computes the r-squared for many different models, including mixed effects and Bayesian regression models. `r2()` returns a list containing values related to the “most appropriate” r-squared for the given model. ``` r model <- lm(mpg ~ wt + cyl, data = mtcars) r2(model) #> # R2 for Linear Regression #> #> R2: 0.830 #> adj. R2: 0.819 model <- glm(am ~ wt + cyl, data = mtcars, family = binomial) r2(model) #> $R2_Tjur #> Tjur's R2 #> 0.7051 library(MASS) data(housing) model <- polr(Sat ~ Infl + Type + Cont, weights = Freq, data = housing) r2(model) #> $R2_Nagelkerke #> Nagelkerke's R2 #> 0.1084 ``` The different r-squared measures can also be accessed directly via functions like `r2_bayes()`, `r2_coxsnell()` or `r2_nagelkerke()` (see a full list of functions [here](https://easystats.github.io/performance/reference/index.html)). For mixed models, the *conditional* and *marginal* r-squared are returned. The *marginal r-squared* considers only the variance of the fixed effects and indicates how much of the model’s variance is explained by the fixed effects part only. The *conditional r-squared* takes both the fixed and random effects into account and indicates how much of the model’s variance is explained by the “complete” model. For frequentist mixed models, `r2()` (resp. `r2_nakagawa()`) computes the *mean* random effect variances, thus `r2()` is also appropriate for mixed models with more complex random effects structures, like random slopes or nested random effects (Johnson 2014; Nakagawa, Johnson, and Schielzeth 2017). ``` r library(rstanarm) model <- stan_glmer(Petal.Length ~ Petal.Width + (1 | Species), data = iris, cores = 4) r2(model) #> # Bayesian R2 with Standard Error #> #> Conditional R2: 0.953 [0.006] #> Marginal R2: 0.825 [0.042] library(lme4) model <- lmer(Reaction ~ Days + (1 + Days | Subject), data = sleepstudy) r2(model) #> # R2 for Mixed Models #> #> Conditional R2: 0.799 #> Marginal R2: 0.279 ``` ### Intraclass Correlation Coefficient (ICC) Similar to r-squared, the ICC provides information on the explained variance and can be interpreted as “the proportion of the variance explained by the grouping structure in the population” (Hox 2010). `icc()` calculates the ICC for various mixed model objects, including `stanreg` models. ``` r library(lme4) model <- lmer(Reaction ~ Days + (1 + Days | Subject), data = sleepstudy) icc(model) #> # Intraclass Correlation Coefficient #> #> Adjusted ICC: 0.722 #> Conditional ICC: 0.521 ``` For models of class `brmsfit`, an ICC based on variance decomposition is returned (for details, see the [documentation](https://easystats.github.io/performance/reference/icc.html)). ``` r library(brms) set.seed(123) model <- brm(mpg ~ wt + (1 | cyl) + (1 + wt | gear), data = mtcars) ``` ``` r icc(model) #> # Random Effect Variances and ICC #> #> Conditioned on: all random effects #> #> ## Variance Ratio (comparable to ICC) #> Ratio: 0.39 CI 95%: [-0.55 0.78] #> #> ## Variances of Posterior Predicted Distribution #> Conditioned on fixed effects: 22.69 CI 95%: [ 8.42 58.44] #> Conditioned on rand. effects: 37.71 CI 95%: [25.06 55.58] #> #> ## Difference in Variances #> Difference: 14.29 CI 95%: [-19.67 35.40] ``` ## Model diagnostics ### Check for overdispersion Overdispersion occurs when the observed variance in the data is higher than the expected variance from the model assumption (for Poisson, variance roughly equals the mean of an outcome). `check_overdispersion()` checks if a count model (including mixed models) is overdispersed or not. ``` r library(glmmTMB) data(Salamanders) model <- glm(count ~ spp + mined, family = poisson, data = Salamanders) check_overdispersion(model) #> # Overdispersion test #> #> dispersion ratio = 2.946 #> Pearson's Chi-Squared = 1873.710 #> p-value = < 0.001 #> Overdispersion detected. ``` Overdispersion can be fixed by either modelling the dispersion parameter (not possible with all packages), or by choosing a different distributional family \[like Quasi-Poisson, or negative binomial, see (Gelman and Hill 2007). ### Check for zero-inflation Zero-inflation (in (Quasi-)Poisson models) is indicated when the amount of observed zeros is larger than the amount of predicted zeros, so the model is *underfitting* zeros. In such cases, it is recommended to use negative binomial or zero-inflated models. Use `check_zeroinflation()` to check if zero-inflation is present in the fitted model. ``` r model <- glm(count ~ spp + mined, family = poisson, data = Salamanders) check_zeroinflation(model) #> # Check for zero-inflation #> #> Observed zeros: 387 #> Predicted zeros: 298 #> Ratio: 0.77 #> Model is underfitting zeros (probable zero-inflation). ``` ### Check for singular model fits A “singular” model fit means that some dimensions of the variance-covariance matrix have been estimated as exactly zero. This often occurs for mixed models with overly complex random effects structures. `check_singularity()` checks mixed models (of class `lme`, `merMod`, `glmmTMB` or `MixMod`) for singularity, and returns `TRUE` if the model fit is singular. ``` r library(lme4) data(sleepstudy) # prepare data set.seed(123) sleepstudy$mygrp <- sample(1:5, size = 180, replace = TRUE) sleepstudy$mysubgrp <- NA for (i in 1:5) { filter_group <- sleepstudy$mygrp == i sleepstudy$mysubgrp[filter_group] <- sample(1:30, size = sum(filter_group), replace = TRUE) } # fit strange model model <- lmer(Reaction ~ Days + (1 | mygrp/mysubgrp) + (1 | Subject), data = sleepstudy) check_singularity(model) #> [1] TRUE ``` Remedies to cure issues with singular fits can be found [here](https://easystats.github.io/performance/reference/check_singularity.html). ## Comprehensive model check **performance** provides many functions to check model assumptions, like `check_collinearity()`, `check_normality()` or `check_heteroscedasticity()`. To get a comprehensive check, use `check_model()`. ``` r model <- lm(mpg ~ wt * cyl + gear, data = mtcars) check_model(model) ``` ![](man/figures/unnamed-chunk-13-1.png) ## Model performance summaries `model_performance()` computes indices of model performance for regression models. Depending on the model object, typical indices might be r-squared, AIC, BIC, RMSE, ICC or LOOIC. ### Linear model ``` r m1 <- lm(mpg ~ wt + cyl, data = mtcars) model_performance(m1) ``` | AIC | BIC | R2 | R2\_adjusted | RMSE | | --: | ----: | ---: | -----------: | ---: | | 156 | 161.9 | 0.83 | 0.82 | 2.44 | ### Logistic regression ``` r m2 <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") model_performance(m2) ``` | AIC | BIC | R2\_Tjur | RMSE | LOGLOSS | SCORE\_LOG | SCORE\_SPHERICAL | PCP | | ---: | ---: | -------: | ---: | ------: | ---------: | ---------------: | ---: | | 31.3 | 35.7 | 0.48 | 0.89 | 0.4 | \-14.9 | 0.09 | 0.74 | ### Linear mixed model ``` r library(lme4) m3 <- lmer(Reaction ~ Days + (1 + Days | Subject), data = sleepstudy) model_performance(m3) ``` | AIC | BIC | R2\_conditional | R2\_marginal | ICC | RMSE | | ---: | ---: | --------------: | -----------: | ---: | ----: | | 1756 | 1775 | 0.8 | 0.28 | 0.72 | 23.44 | ### Comparing different models ``` r counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) outcome <- gl(3, 1, 9) treatment <- gl(3, 3) m4 <- glm(counts ~ outcome + treatment, family = poisson()) compare_performance(m1, m2, m3, m4) #> # Comparison of Model Performance Indices #> #> Model | Type | AIC | BIC | RMSE | SCORE_LOG | SCORE_SPHERICAL | R2 | R2_adjusted | R2_Tjur | LOGLOSS | PCP | R2_conditional | R2_marginal | ICC | R2_Nagelkerke #> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- #> m1 | lm | 156.01 | 161.87 | 2.44 | | | 0.83 | 0.82 | | | | | | | #> m2 | glm | 31.30 | 35.70 | 0.89 | -14.90 | 0.10 | | | 0.48 | 0.40 | 0.74 | | | | #> m3 | lmerMod | 1755.63 | 1774.79 | 23.44 | | | | | | | | 0.80 | 0.28 | 0.72 | #> m4 | glm | 56.76 | 57.75 | 0.76 | -2.60 | 0.32 | | | | | | | | | 0.66 ``` ### Comparing different models, ordered by model performance ``` r compare_performance(m1, m2, m3, m4, rank = TRUE) #> # Comparison of Model Performance Indices #> #> Model | Type | AIC | BIC | RMSE | Performance_Score #> --------------------------------------------------------------- #> m2 | glm | 31.30 | 35.70 | 0.89 | 99.80% #> m4 | glm | 56.76 | 57.75 | 0.76 | 99.09% #> m1 | lm | 156.01 | 161.87 | 2.44 | 92.69% #> m3 | lmerMod | 1755.63 | 1774.79 | 23.44 | 0.00% #> #> Model m2 (of class glm) performed best with an overall performance score of 99.80%. ``` ``` r plot(compare_performance(m1, m2, m3, m4, rank = TRUE)) ``` ![](man/figures/unnamed-chunk-22-1.png) # References
Gelman, Andrew, and Jennifer Hill. 2007. *Data Analysis Using Regression and Multilevel/Hierarchical Models*. Analytical Methods for Social Research. Cambridge ; New York: Cambridge University Press.
Hox, J. J. 2010. *Multilevel Analysis: Techniques and Applications*. 2nd ed. Quantitative Methodology Series. New York: Routledge.
Johnson, Paul C. D. 2014. “Extension of Nakagawa & Schielzeth’s R2 GLMM to Random Slopes Models.” Edited by Robert B. O’Hara. *Methods in Ecology and Evolution* 5 (9): 944–46. .
Nakagawa, Shinichi, Paul C. D. Johnson, and Holger Schielzeth. 2017. “The Coefficient of Determination R2 and Intra-Class Correlation Coefficient from Generalized Linear Mixed-Effects Models Revisited and Expanded.” *Journal of the Royal Society Interface* 14 (134): 20170213. .
performance/man/0000755000176200001440000000000013620205622013324 5ustar liggesusersperformance/man/item_reliability.Rd0000644000176200001440000000325213565530445017160 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/item_reliability.R \name{item_reliability} \alias{item_reliability} \title{Reliability Test for Items or Scales} \usage{ item_reliability(x, standardize = FALSE, digits = 3) } \arguments{ \item{x}{A matrix or a data frame.} \item{standardize}{Logical, if \code{TRUE}, the data frame's vectors will be standardized. Recommended when the variables have different measures / scales.} \item{digits}{Amount of digits for returned values.} } \value{ A data frame with the corrected item-total correlations (\emph{item discrimination}, column \code{item_discrimination}) and Cronbach's Alpha (if item deleted, column \code{alpha_if_deleted}) for each item of the scale, or \code{NULL} if data frame had too less columns. } \description{ Compute various measures of internal consistencies for tests or item-scales of questionnaires. } \details{ This function calculates the item discriminations (corrected item-total correlations for each item of \code{x} with the remaining items) and the Cronbach's alpha for each item, if it was deleted from the scale. The absolute value of the item discrimination indices should be above 0.1. An index between 0.1 and 0.3 is considered as "fair", while an index above 0.3 (or below -0.3) is "good". Items with low discrimination indices are often ambiguously worded and should be examined. Items with negative indices should be examined to determine why a negative value was obtained (e.g. reversed answer categories regarding positive and negative poles). } \examples{ data(mtcars) x <- mtcars[, c("cyl", "gear", "carb", "hp")] item_reliability(x) } performance/man/model_performance.lavaan.Rd0000644000176200001440000001056413611777057020563 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model_performance.lavaan.R \name{model_performance.lavaan} \alias{model_performance.lavaan} \title{Performance of lavaan SEM / CFA Models} \usage{ \method{model_performance}{lavaan}(model, metrics = "all", ...) } \arguments{ \item{model}{A \code{lavaan} model.} \item{metrics}{Can be \code{"all"} or a character vector of metrics to be computed (some of \code{c("Chisq", "Chisq_DoF", "Chisq_p", "Baseline", "Baseline_DoF", "Baseline_p", "CFI", "TLI", "NNFI", "RFI", "NFI", "PNFI", "IFI", "RNI", "Loglikelihood", "AIC", "BIC", "BIC_adjusted", "RMSEA", "SMRM")}).} \item{...}{Arguments passed to or from other methods.} } \value{ A data frame (with one row) and one column per "index" (see \code{metrics}). } \description{ Compute indices of model performance for SEM or CFA models from the \code{lavaan} package. } \details{ \subsection{Indices of fit}{ \itemize{ \item \strong{Chisq}: The model Chi-squared assesses overall fit and the discrepancy between the sample and fitted covariance matrices. Its p-value should be > .05 (i.e., the hypothesis of a perfect fit cannot be rejected). However, it is quite sensitive to sample size. \item \strong{GFI/AGFI}: The (Adjusted) Goodness of Fit is the proportion of variance accounted for by the estimated population covariance. Analogous to R2. The GFI and the AGFI should be > .95 and > .90, respectively. \item \strong{NFI/NNFI/TLI}: The (Non) Normed Fit Index. An NFI of 0.95, indicates the model of interest improves the fit by 95\% relative to the null model. The NNFI (also called the Tucker Lewis index; TLI) is preferable for smaller samples. They should be > .90 (Byrne, 1994) or > .95 (Schumacker & Lomax, 2004). \item \strong{CFI}: The Comparative Fit Index is a revised form of NFI. Not very sensitive to sample size (Fan, Thompson, & Wang, 1999). Compares the fit of a target model to the fit of an independent, or null, model. It should be > .90. \item \strong{RMSEA}: The Root Mean Square Error of Approximation is a parsimony-adjusted index. Values closer to 0 represent a good fit. It should be < .08 or < .05. The p-value printed with it tests the hypothesis that RMSEA is less than or equal to .05 (a cutoff sometimes used for good fit), and thus should be not significant. \item \strong{RMR/SRMR}: the (Standardized) Root Mean Square Residual represents the square-root of the difference between the residuals of the sample covariance matrix and the hypothesized model. As the RMR can be sometimes hard to interpret, better to use SRMR. Should be < .08. \item \strong{RFI}: the Relative Fit Index, also known as RHO1, is not guaranteed to vary from 0 to 1. However, RFI close to 1 indicates a good fit. \item \strong{IFI}: the Incremental Fit Index (IFI) adjusts the Normed Fit Index (NFI) for sample size and degrees of freedom (Bollen's, 1989). Over 0.90 is a good fit, but the index can exceed 1. \item \strong{PNFI}: the Parsimony-Adjusted Measures Index. There is no commonly agreed-upon cutoff value for an acceptable model for this index. Should be > 0.50. } See the documentation for \code{\link[lavaan]{fitmeasures}}. } \subsection{What to report}{ Kline (2015) suggests that at a minimum the following indices should be reported: The model \strong{chi-square}, the \strong{RMSEA}, the \strong{CFI} and the \strong{SRMR}. } } \examples{ # Confirmatory Factor Analysis (CFA) --------- if (require("lavaan")) { structure <- " visual =~ x1 + x2 + x3 textual =~ x4 + x5 + x6 speed =~ x7 + x8 + x9 " model <- lavaan::cfa(structure, data = HolzingerSwineford1939) model_performance(model) } } \references{ \itemize{ \item Byrne, B. M. (1994). Structural equation modeling with EQS and EQS/Windows. Thousand Oaks, CA: Sage Publications. \item Tucker, L. R., \& Lewis, C. (1973). The reliability coefficient for maximum likelihood factor analysis. Psychometrika, 38, 1-10. \item Schumacker, R. E., \& Lomax, R. G. (2004). A beginner's guide to structural equation modeling, Second edition. Mahwah, NJ: Lawrence Erlbaum Associates. \item Fan, X., B. Thompson, \& L. Wang (1999). Effects of sample size, estimation method, and model specification on structural equation modeling fit indexes. Structural Equation Modeling, 6, 56-83. \item Kline, R. B. (2015). Principles and practice of structural equation modeling. Guilford publications. } } performance/man/r2_tjur.Rd0000644000176200001440000000164513565530445015224 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_tjur.R \name{r2_tjur} \alias{r2_tjur} \title{Tjur's R2 - coefficient of determination (D)} \usage{ r2_tjur(model) } \arguments{ \item{model}{Binomial Model.} } \value{ A named vector with the R2 value. } \description{ This method calculates the Coefficient of Discrimination \code{D} (also known as Tjur's R2; \cite{Tjur, 2009}) for generalized linear (mixed) models for binary outcomes. It is an alternative to other pseudo-R2 values like Nagelkerke's R2 or Cox-Snell R2. The Coefficient of Discrimination \code{D} can be read like any other (pseudo-)R2 value. } \examples{ model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") r2_tjur(model) } \references{ Tjur, T. (2009). Coefficients of determination in logistic regression models - A new proposal: The coefficient of discrimination. The American Statistician, 63(4), 366-372. } performance/man/r2_bayes.Rd0000644000176200001440000000370713611777057015350 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_bayes.R \name{r2_bayes} \alias{r2_bayes} \title{Bayesian R2} \usage{ r2_bayes(model, robust = TRUE, ci = 0.89) } \arguments{ \item{model}{A Bayesian regression model.} \item{robust}{Logical, if \code{TRUE}, the median instead of mean is used to calculate the central tendency of the variances.} \item{ci}{Value or vector of probability of the CI (between 0 and 1) to be estimated.} } \value{ A list with the Bayesian R2 value. For mixed models, a list with the Bayesian R2 value and the marginal Bayesian R2 value. The standard errors and credible intervals for the R2 values are saved as attributes. } \description{ Compute R2 for Bayesian models. For mixed models (including a random part), it additionally computes the R2 related to the fixed effects only (marginal R2). } \details{ \code{r2_bayes()} returns an "unadjusted" R2 value. See \code{\link{r2_loo}} to calculate a LOO-adjusted R2, which comes conceptionally closer to an adjusted R2 measure. \cr \cr For mixed models, the conditional and marginal R2 are returned. The marginal R2 considers only the variance of the fixed effects, while the conditional R2 takes both the fixed and random effects into account. } \examples{ library(performance) if (require("rstanarm")) { model <- stan_glm(mpg ~ wt + cyl, data = mtcars, chains = 1, iter = 500, refresh = 0) r2_bayes(model) model <- stan_lmer( Petal.Length ~ Petal.Width + (1 | Species), data = iris, chains = 1, iter = 500, refresh = 0 ) r2_bayes(model) } \dontrun{ if (require("brms")) { model <- brms::brm(mpg ~ wt + cyl, data = mtcars) r2_bayes(model) model <- brms::brm(Petal.Length ~ Petal.Width + (1 | Species), data = iris) r2_bayes(model) } } } \references{ Gelman, A., Goodrich, B., Gabry, J., & Vehtari, A. (2018). R-squared for Bayesian regression models. The American Statistician, 1–6. \doi{10.1080/00031305.2018.1549100} } performance/man/check_singularity.Rd0000644000176200001440000000622113611777057017343 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_singularity.R \name{check_singularity} \alias{check_singularity} \title{Check mixed models for boundary fits} \usage{ check_singularity(x, tolerance = 1e-05, ...) } \arguments{ \item{x}{A mixed model.} \item{tolerance}{Indicates up to which value the convergence result is accepted. The larger \code{tolerance} is, the stricter the test will be.} \item{...}{Currently not used.} } \value{ \code{TRUE} if the model fit is singular. } \description{ Check mixed models for boundary fits. } \details{ If a model is "singular", this means that some dimensions of the variance-covariance matrix have been estimated as exactly zero. This often occurs for mixed models with complex random effects structures. \cr \cr \dQuote{While singular models are statistically well defined (it is theoretically sensible for the true maximum likelihood estimate to correspond to a singular fit), there are real concerns that (1) singular fits correspond to overfitted models that may have poor power; (2) chances of numerical problems and mis-convergence are higher for singular models (e.g. it may be computationally difficult to compute profile confidence intervals for such models); (3) standard inferential procedures such as Wald statistics and likelihood ratio tests may be inappropriate.} (\cite{lme4 Reference Manual}) \cr \cr There is no gold-standard about how to deal with singularity and which random-effects specification to choose. Beside using fully Bayesian methods (with informative priors), proposals in a frequentist framework are: \itemize{ \item avoid fitting overly complex models, such that the variance-covariance matrices can be estimated precisely enough (\cite{Matuschek et al. 2017}) \item use some form of model selection to choose a model that balances predictive accuracy and overfitting/type I error (\cite{Bates et al. 2015}, \cite{Matuschek et al. 2017}) \item \dQuote{keep it maximal}, i.e. fit the most complex model consistent with the experimental design, removing only terms required to allow a non-singular fit (\cite{Barr et al. 2013}) } } \examples{ if (require("lme4")) { data(sleepstudy) set.seed(123) sleepstudy$mygrp <- sample(1:5, size = 180, replace = TRUE) sleepstudy$mysubgrp <- NA for (i in 1:5) { filter_group <- sleepstudy$mygrp == i sleepstudy$mysubgrp[filter_group] <- sample(1:30, size = sum(filter_group), replace = TRUE) } model <- lmer( Reaction ~ Days + (1 | mygrp / mysubgrp) + (1 | Subject), data = sleepstudy ) check_singularity(model) } } \references{ \itemize{ \item Bates D, Kliegl R, Vasishth S, Baayen H. Parsimonious Mixed Models. arXiv:1506.04967, June 2015. \item Barr DJ, Levy R, Scheepers C, Tily HJ. Random effects structure for confirmatory hypothesis testing: Keep it maximal. Journal of Memory and Language, 68(3):255-278, April 2013. \item Matuschek H, Kliegl R, Vasishth S, Baayen H, Bates D. Balancing type I error and power in linear mixed models. Journal of Memory and Language, 94:305-315, 2017. \item lme4 Reference Manual, \url{https://cran.r-project.org/package=lme4} } } performance/man/performance_pcp.Rd0000644000176200001440000000471613571155404016775 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_pcp.R \name{performance_pcp} \alias{performance_pcp} \title{Percentage of Correct Predictions} \usage{ performance_pcp(model, ci = 0.95, method = "Herron", verbose = TRUE) } \arguments{ \item{model}{Model with binary outcome.} \item{ci}{The level of the confidence interval.} \item{method}{Name of the method to calculate the PCP (see 'Details'). Default is \code{"Herron"}. May be abbreviated.} \item{verbose}{Toggle off warnings.} } \value{ A list with several elements: the percentage of correct predictions of the full and the null model, their confidence intervals, as well as the chi-squared and p-value from the Likelihood-Ratio-Test between the full and null model. } \description{ Percentage of correct predictions (PCP) for models with binary outcome. } \details{ \code{method = "Gelman-Hill"} (or \code{"gelman_hill"}) computes the PCP based on the proposal from \cite{Gelman and Hill 2017, 99}, which is defined as the proportion of cases for which the deterministic prediction is wrong, i.e. the proportion where the predicted probability is above 0.5, although y=0 (and vice versa) (see also \cite{Herron 1999, 90}). \cr \cr \code{method = "Herron"} (or \code{"herron"}) computes a modified version of the PCP (\cite{Herron 1999, 90-92}), which is the sum of predicted probabilities, where y=1, plus the sum of 1 - predicted probabilities, where y=0, divided by the number of observations. This approach is said to be more accurate. \cr \cr The PCP ranges from 0 to 1, where values closer to 1 mean that the model predicts the outcome better than models with an PCP closer to 0. In general, the PCP should be above 0.5 (i.e. 50\%), the closer to one, the better. Furthermore, the PCP of the full model should be considerably above the null model's PCP. \cr \cr The likelihood-ratio test indicates whether the model has a significantly better fit than the null-model (in such cases, p < 0.05). } \examples{ data(mtcars) m <- glm(formula = vs ~ hp + wt, family = binomial, data = mtcars) performance_pcp(m) performance_pcp(m, method = "Gelman-Hill") } \references{ \itemize{ \item Herron, M. (1999). Postestimation Uncertainty in Limited Dependent Variable Models. Political Analysis, 8, 83–98. \item Gelman, A., & Hill, J. (2007). Data analysis using regression and multilevel/hierarchical models. Cambridge; New York: Cambridge University Press, 99 } } performance/man/check_homogeneity.Rd0000644000176200001440000000262113620211155017276 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_homogeneity.R \name{check_homogeneity} \alias{check_homogeneity} \title{Check model for homogeneity of variances} \usage{ check_homogeneity(x, method = c("bartlett", "fligner", "auto"), ...) } \arguments{ \item{x}{A linear model or an ANOVA object.} \item{method}{Name of the method (underlying test) that should be performed to check the homogeneity of variances. May either be \code{"bartlett"} for the Bartlett test (assuming normal distributed samples or groups), \code{"fligner"} for the Fligner-Killeen test (rank-based, non-parametric test), or \code{"auto"}. In the latter case, Bartlett test is used if the model response is normal distributed, else Fligner-Killeen test is used.} \item{...}{Currently not used.} } \value{ Invisibly returns the p-value of the test statistics. A p-value < 0.05 indicates a significant difference in the variance between the groups. } \description{ Check model for homogeneity of variances between groups described by independent variables in a model. } \note{ There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. } \examples{ model <- lm(len ~ supp + dose, data = ToothGrowth) check_homogeneity(model) # plot results result <- check_homogeneity(model) plot(result) } performance/man/check_normality.Rd0000644000176200001440000000232413620211155016765 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_normality.R \name{check_normality} \alias{check_normality} \title{Check model for (non-)normality of residuals.} \usage{ check_normality(x, ...) } \arguments{ \item{x}{A model object.} \item{...}{Currently not used.} } \value{ Invisibly returns the p-value of the test statistics. A p-value < 0.05 indicates a significant deviation from normal distribution } \description{ Check model for (non-)normality of residuals. } \details{ \code{check_normality()} calls \code{\link[stats]{shapiro.test}} and checks the standardized residuals for normal distribution. Note that this formal test almost always yields significant results for the distribution of residuals and visual inspection (e.g. Q-Q plots) are preferable. } \note{ There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. } \examples{ m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) check_normality(m) # plot results x <- check_normality(m) plot(x) \dontrun{ # QQ-plot plot(check_normality(m), type = "qq") # PP-plot plot(check_normality(m), type = "pp") } } performance/man/check_collinearity.Rd0000644000176200001440000000506113620211155017446 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_collinearity.R \name{check_collinearity} \alias{check_collinearity} \alias{check_collinearity.glmmTMB} \title{Check for multicollinearity of model terms} \usage{ check_collinearity(x, ...) \method{check_collinearity}{glmmTMB}( x, component = c("all", "conditional", "count", "zi", "zero_inflated"), ... ) } \arguments{ \item{x}{A model object (that should at least respond to \code{vcov()}, and if possible, also to \code{model.matrix()} - however, it also should work without \code{model.matrix()}).} \item{...}{Currently not used.} \item{component}{For models with zero-inflation component, multicollinearity can be checked for the conditional model (count component, \code{component = "conditional"} or \code{component = "count"}), zero-inflation component (\code{component = "zero_inflated"} or \code{component = "zi"}) or both components (\code{component = "all"}). Following model-classes are currently supported: \code{hurdle}, \code{zeroinfl}, \code{zerocount}, \code{MixMod} and \code{glmmTMB}.} } \value{ A data frame with three columns: The name of the model term, the variance inflation factor and the factor by which the standard error is increased due to possible correlation with other terms. } \description{ \code{check_collinearity()} checks regression models for multicollinearity by calculating the variance inflation factor (VIF). } \details{ The variance inflation factor is a measure to analyze the magnitude of multicollinearity of model terms. A VIF less than 5 indicates a low correlation of that predictor with other predictors. A value between 5 and 10 indicates a moderate correlation, while VIF values larger than 10 are a sign for high, not tolerable correlation of model predictors. The \emph{Increased SE} column in the output indicates how much larger the standard error is due to the correlation with other predictors. \cr \cr An informative blog post about collinearity can be found \href{https://janhove.github.io/analysis/2019/09/11/collinearity}{here}. } \note{ There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. } \examples{ m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) check_collinearity(m) # plot results x <- check_collinearity(m) plot(x) } \references{ James, G., Witten, D., Hastie, T., & Tibshirani, R. (Hrsg.). (2013). An introduction to statistical learning: with applications in R. New York: Springer. } performance/man/performance_mse.Rd0000644000176200001440000000162013616504501016762 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_mse.R \name{performance_mse} \alias{performance_mse} \alias{mse} \title{Mean Square Error of Linear Models} \usage{ performance_mse(model, verbose = TRUE) mse(model, verbose = TRUE) } \arguments{ \item{model}{A model.} \item{verbose}{Toggle off warnings.} } \value{ Numeric, the mean square error of \code{model}. } \description{ Compute mean square error of linear models. } \details{ The mean square error is the mean of the sum of squared residuals, i.e. it measures the average of the squares of the errors. Less technically speaking, the mean square error can be considered as the variance of the residuals, i.e. the variation in the outcome the model doesn't explain. Lower values (closer to zero) indicate better fit. } \examples{ data(mtcars) m <- lm(mpg ~ hp + gear, data = mtcars) performance_mse(m) } performance/man/compare_performance.Rd0000644000176200001440000000640613620211155017626 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/compare_performance.R \name{compare_performance} \alias{compare_performance} \title{Compare performance of different models} \usage{ compare_performance(..., metrics = "all", rank = FALSE, verbose = TRUE) } \arguments{ \item{...}{Multiple model objects (also of different classes).} \item{metrics}{Can be \code{"all"}, \code{"common"} or a character vector of metrics to be computed. See related \link[=model_performance]{documentation} of object's class for details.} \item{rank}{Logical, if \code{TRUE}, models are ranked according to "best overall model performance". See 'Details'.} \item{verbose}{Toggle off warnings.} } \value{ A data frame (with one row per model) and one column per "index" (see \code{metrics}). } \description{ \code{compare_performance()} computes indices of model performance for different models at once and hence allows comparison of indices across models. } \details{ \subsection{Bayes factor for Model Comparison}{ If all models were fit from the same data, \code{compare_performance()} returns an additional column named \code{BF}, which shows the Bayes factor (see \code{\link[bayestestR]{bayesfactor_models}}) for each model against the denominator model. The \emph{first} model is used as denominator model, and its Bayes factor is set to \code{NA} to indicate the reference model. } \subsection{Ranking Models}{ When \code{rank = TRUE}, a new column \code{Performance_Score} is returned. This score ranges from 0\% to 100\%, higher values indicating better model performance. Calculation is based on normalizing all indices (i.e. rescaling them to a range from 0 to 1), and taking the mean value of all indices for each model. This is a rather quick heuristic, but might be helpful as exploratory index. \cr \cr In particular when models are of different types (e.g. mixed models, classical linear models, logistic regression, ...), not all indices will be computed for each model. In case where an index can't be calculated for a specific model type, this model gets an \code{NA} value. All indices that have any \code{NA}s are excluded from calculating the performance score. \cr \cr There is a \code{plot()}-method for \code{compare_performance()}, which creates a "spiderweb" plot, where the different indices are normalized and larger values indicate better model performance. Hence, points closer to the center indicate worse fit indices (see \href{https://easystats.github.io/see/articles/performance.html}{online-documentation} for more details). } } \note{ There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. } \examples{ if (require("lme4")) { m1 <- lm(mpg ~ wt + cyl, data = mtcars) m2 <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") m3 <- lmer(Petal.Length ~ Sepal.Length + (1 | Species), data = iris) compare_performance(m1, m2, m3) } data(iris) lm1 <- lm(Sepal.Length ~ Species, data = iris) lm2 <- lm(Sepal.Length ~ Species + Petal.Length, data = iris) lm3 <- lm(Sepal.Length ~ Species * Petal.Length, data = iris) compare_performance(lm1, lm2, lm3) compare_performance(lm1, lm2, lm3, rank = TRUE) } performance/man/performance_score.Rd0000644000176200001440000000404313616504501017313 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_score.R \name{performance_score} \alias{performance_score} \title{Proper Scoring Rules} \usage{ performance_score(model, verbose = TRUE) } \arguments{ \item{model}{Model with binary or count outcome.} \item{verbose}{Toggle off warnings.} } \value{ A list with three elements, the logarithmic, quadratic/Brier and spherical score. } \description{ Calculates the logarithmic, quadratic/Brier and spherical score from a model with binary or count outcome. } \details{ Proper scoring rules can be used to evaluate the quality of model predictions and model fit. \code{performance_score()} calculates the logarithmic, quadratic/Brier and spherical scoring rules. The spherical rule takes values in the interval \code{[0, 1]}, with values closer to 1 indicating a more accurate model, and the logarithmic rule in the interval \code{[-Inf, 0]}, with values closer to 0 indicating a more accurate model. \cr \cr For \code{stan_lmer()} and \code{stan_glmer()} models, the predicted values are based on \code{posterior_predict()}, instead of \code{predict()}. Thus, results may differ more than expected from their non-Bayesian counterparts in \pkg{lme4}. } \note{ Code is partially based on \href{https://drizopoulos.github.io/GLMMadaptive/reference/scoring_rules.html}{GLMMadaptive::scoring_rules()}. } \examples{ ## Dobson (1990) Page 93: Randomized Controlled Trial : counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) outcome <- gl(3, 1, 9) treatment <- gl(3, 3) model <- glm(counts ~ outcome + treatment, family = poisson()) performance_score(model) \dontrun{ if (require("glmmTMB")) { data(Salamanders) model <- glmmTMB( count ~ spp + mined + (1 | site), zi = ~ spp + mined, family = nbinom2(), data = Salamanders ) performance_score(model) } } } \references{ Carvalho, A. (2016). An overview of applications of proper scoring rules. Decision Analysis 13, 223–242. \doi{10.1287/deca.2016.0337} } \seealso{ \code{\link[=performance_logloss]{performance_logloss()}} } performance/man/item_split_half.Rd0000644000176200001440000000243513565530445016776 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/item_split_half.R \name{item_split_half} \alias{item_split_half} \title{Split-Half Reliability} \usage{ item_split_half(x, digits = 3) } \arguments{ \item{x}{A matrix or a data frame.} \item{digits}{Amount of digits for returned values.} } \value{ A list with two elements: the split-half reliability \code{splithalf} and the Spearman-Brown corrected split-half reliability \code{spearmanbrown}. } \description{ Compute various measures of internal consistencies for tests or item-scales of questionnaires. } \details{ This function calculates the split-half reliability for items in \code{x}, including the Spearman-Brown adjustment. Splitting is done by selecting odd versus even columns in \code{x}. A value closer to 1 indicates greater internal consistency. } \examples{ data(mtcars) x <- mtcars[, c("cyl", "gear", "carb", "hp")] item_split_half(x) } \references{ Spearman C. 1910. Correlation calculated from faulty data. British Journal of Psychology (3): 271-295. \doi{10.1111/j.2044-8295.1910.tb00206.x} \cr \cr Brown W. 1910. Some experimental results in the correlation of mental abilities. British Journal of Psychology (3): 296-322. \doi{10.1111/j.2044-8295.1910.tb00207.x} } performance/man/r2_xu.Rd0000644000176200001440000000143313565530445014667 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_xu.R \name{r2_xu} \alias{r2_xu} \title{Xu' R2 (Omega-squared)} \usage{ r2_xu(model) } \arguments{ \item{model}{A linear (mixed) model.} } \value{ The R2 value. } \description{ Calculates Xu' Omega-squared value, a simple R2 equivalent for linear mixed models. } \details{ \code{r2_xu()} is a crude measure for the explained variance from linear (mixed) effects models, which is originally denoted as \ifelse{html}{\out{Ω2}}{\eqn{\Omega^2}}. } \examples{ model <- lm(Sepal.Length ~ Petal.Length + Species, data = iris) r2_xu(model) } \references{ Xu, R. (2003). Measuring explained variation in linear mixed effects models. Statistics in Medicine, 22(22), 3527–3541. \doi{10.1002/sim.1572} } performance/man/classify_distribution.Rd0000644000176200001440000000072313620212654020234 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_distribution.R \docType{data} \name{classify_distribution} \alias{classify_distribution} \title{Machine learning model trained to classify distributions} \format{An object of class \code{randomForest.formula} (inherits from \code{randomForest}) of length 8.} \usage{ classify_distribution } \description{ Mean accuracy and Kappa of 0.86 and 0.85, repsectively. } \keyword{datasets} performance/man/item_intercor.Rd0000644000176200001440000000353113565530445016474 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/item_intercor.R \name{item_intercor} \alias{item_intercor} \title{Mean Inter-Item-Correlation} \usage{ item_intercor(x, method = c("pearson", "spearman", "kendall")) } \arguments{ \item{x}{A matrix as returned by the \code{\link{cor}}-function, or a data frame with items (e.g. from a test or questionnaire).} \item{method}{Correlation computation method. May be one of \code{"spearman"} (default), \code{"pearson"} or \code{"kendall"}. You may use initial letter only.} } \value{ The mean inter-item-correlation value for \code{x}. } \description{ Compute various measures of internal consistencies for tests or item-scales of questionnaires. } \details{ This function calculates a mean inter-item-correlation, i.e. a correlation matrix of \code{x} will be computed (unless \code{x} is already a matrix as returned by the \code{cor()}-function) and the mean of the sum of all item's correlation values is returned. Requires either a data frame or a computed \code{cor()}-object. \cr \cr \dQuote{Ideally, the average inter-item correlation for a set of items should be between .20 and .40, suggesting that while the items are reasonably homogenous, they do contain sufficiently unique variance so as to not be isomorphic with each other. When values are lower than .20, then the items may not be representative of the same content domain. If values are higher than .40, the items may be only capturing a small bandwidth of the construct.} \cite{(Piedmont 2014)} } \examples{ data(mtcars) x <- mtcars[, c("cyl", "gear", "carb", "hp")] item_intercor(x) } \references{ Piedmont RL. 2014. Inter-item Correlations. In: Michalos AC (eds) Encyclopedia of Quality of Life and Well-Being Research. Dordrecht: Springer, 3303-3304. \doi{10.1007/978-94-007-0753-5_1493} } performance/man/r2_mcfadden.Rd0000644000176200001440000000166713611777057016011 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_mcfadden.R \name{r2_mcfadden} \alias{r2_mcfadden} \title{McFadden's R2} \usage{ r2_mcfadden(model) } \arguments{ \item{model}{Generalized linear or multinomial logit (\code{mlogit}) model.} } \value{ For most models, a list with McFadden's R2 and adjusted McFadden's R2 value. For some models, only McFadden's R2 is available. } \description{ Calculates McFadden's pseudo R2. } \examples{ if (require("mlogit")) { data("Fishing", package = "mlogit") Fish <- mlogit.data(Fishing, varying = c(2:9), shape = "wide", choice = "mode") model <- mlogit(mode ~ price + catch, data = Fish) r2_mcfadden(model) } } \references{ \itemize{ \item McFadden, D. (1987). Regression-based specification tests for the multinomial logit model. Journal of econometrics, 34(1-2), 63-82. \item McFadden, D. (1973). Conditional logit analysis of qualitative choice behavior. } } performance/man/model_performance.merMod.Rd0000644000176200001440000000241613611777057020541 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model_performance.mixed.R \name{model_performance.merMod} \alias{model_performance.merMod} \title{Performance of Mixed Models} \usage{ \method{model_performance}{merMod}(model, metrics = "all", verbose = TRUE, ...) } \arguments{ \item{model}{A mixed effects model.} \item{metrics}{Can be \code{"all"}, \code{"common"} or a character vector of metrics to be computed (some of \code{c("AIC", "BIC", "R2", "ICC", "RMSE", "LOGLOSS", "SCORE")}). \code{"common"} will compute AIC, BIC, R2, ICC and RMSE.} \item{verbose}{Toggle off warnings.} \item{...}{Arguments passed to or from other methods.} } \value{ A data frame (with one row) and one column per "index" (see \code{metrics}). } \description{ Compute indices of model performance for mixed models. } \details{ This method returns the \emph{adjusted ICC} only, as this is typically of interest when judging the variance attributed to the random effects part of the model (see also \code{\link{icc}}). \cr \cr Furthermore, see 'Details' in \code{\link{model_performance.lm}} for more details on returned indices. } \examples{ if (require("lme4")) { model <- lmer(Petal.Length ~ Sepal.Length + (1 | Species), data = iris) model_performance(model) } } performance/man/check_convergence.Rd0000644000176200001440000000263113611777057017270 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_convergence.R \name{check_convergence} \alias{check_convergence} \title{Convergence test for mixed effects models} \usage{ check_convergence(x, tolerance = 0.001, ...) } \arguments{ \item{x}{A \code{merMod}-object.} \item{tolerance}{Indicates up to which value the convergence result is accepted. The smaller \code{tolerance} is, the stricter the test will be.} \item{...}{Currently not used.} } \value{ \code{TRUE} if convergence is fine and \code{FALSE} if convergence is suspicious. Additionally, the convergence value is returned as attribute. } \description{ \code{check_convergence()} provides an alternative convergence test for \code{\link[lme4]{merMod}}-objects. } \details{ \code{check_convergence()} provides an alternative convergence test for \code{\link[lme4]{merMod}}-objects, as discussed \href{https://github.com/lme4/lme4/issues/120}{here} and suggested by Ben Bolker in \href{https://github.com/lme4/lme4/issues/120#issuecomment-39920269}{this comment}. Further details can be found in \code{\link[lme4]{convergence}}. } \examples{ if (require("lme4")) { data(cbpp) set.seed(1) cbpp$x <- rnorm(nrow(cbpp)) cbpp$x2 <- runif(nrow(cbpp)) model <- glmer( cbind(incidence, size - incidence) ~ period + x + x2 + (1 + x | herd), data = cbpp, family = binomial() ) check_convergence(model) } } performance/man/performance_accuracy.Rd0000644000176200001440000000341713565530445020007 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_accuracy.R \name{performance_accuracy} \alias{performance_accuracy} \title{Accuracy of predictions from model fit} \usage{ performance_accuracy(model, method = c("cv", "boot"), k = 5, n = 1000) } \arguments{ \item{model}{Fitted model object of class \code{lm} or \code{glm}, the latter being a logistic regression model (binary response).} \item{method}{Character string, indicating whether crossvalidation (\code{method = "cv"}) or bootstrapping (\code{method = "boot"}) is used to compute the accuracy values.} \item{k}{The number of folds for the kfold-crossvalidation.} \item{n}{Number of bootstrap-samples.} } \value{ A list with three values: The \code{Accuracy} of the model predictions, i.e. the proportion of accurately predicted values from the model, its standard error, \code{SE}, and the \code{Method} used to compute the accuracy. } \description{ This function calculates the predictive accuracy of linear or logistic regression models. } \details{ For linar models, the accuracy is the correlation coefficient between the actual and the predicted value of the outcome. For logistic regression models, the accuracy corresponds to the AUC-value, calculated with the \code{\link[bayestestR]{auc}}-function. \cr \cr The accuracy is the mean value of multiple correlation resp. AUC-values, which are either computed with crossvalidation or nonparametric bootstrapping (see argument \code{method}). The standard error is the standard deviation of the computed correlation resp. AUC-values. } \examples{ model <- lm(mpg ~ wt + cyl, data = mtcars) performance_accuracy(model) model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") performance_accuracy(model) } performance/man/check_model.Rd0000644000176200001440000000323713611777057016075 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_model.R \name{check_model} \alias{check_model} \alias{check_model.default} \title{Visual check of model assumptions} \usage{ check_model(x, ...) \method{check_model}{default}(x, dot_size = 2, line_size = 0.8, panel = TRUE, check = "all", ...) } \arguments{ \item{x}{A model object.} \item{...}{Currently not used.} \item{dot_size}{Size of dot-geoms.} \item{line_size}{Size of line-geoms.} \item{panel}{Logical, if \code{TRUE}, plots are arranged as panels; else, single plots for each diagnostic are returned.} \item{check}{Character vector, indicating which checks for should be performed and plotted. May be one or more of \code{"all", "vif", "qq", "normality", "ncv", "homogeneity", "outliers", "reqq"}. \code{"reqq"} is a QQ-plot for random effects and only available for mixed models. \code{"ncv"} checks for non-constant variance, i.e. for heteroscedasticity. By default, all possible checks are performed and plotted.} } \value{ The data frame that is used for plotting. } \description{ Visual check of model various assumptions (normality of residuals, normality of random effects, heteroscedasticity, homogeneity of variance, multicollinearity). } \note{ This function just prepares the data for plotting. To create the plots, \CRANpkg{see} needs to be installed. } \examples{ \dontrun{ m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) check_model(m) if (require("lme4")) { m <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy) check_model(m, panel = FALSE) } if (require("rstanarm")) { m <- stan_glm(mpg ~ wt + gear, data = mtcars, chains = 2, iter = 200) check_model(m) } } } performance/man/model_performance.stanreg.Rd0000644000176200001440000000450413611777057020761 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model_performance.bayesian.R \name{model_performance.stanreg} \alias{model_performance.stanreg} \title{Performance of Bayesian Models} \usage{ \method{model_performance}{stanreg}(model, metrics = "all", verbose = TRUE, ...) } \arguments{ \item{model}{Object of class \code{stanreg} or \code{brmsfit}.} \item{metrics}{Can be \code{"all"}, \code{"common"} or a character vector of metrics to be computed (some of \code{c("LOOIC", "WAIC", "R2", "R2_adj", "RMSE", "LOGLOSS", "SCORE")}). \code{"common"} will compute LOOIC, WAIC, R2 and RMSE.} \item{verbose}{Toggle off warnings.} \item{...}{Arguments passed to or from other methods.} } \value{ A data frame (with one row) and one column per "index" (see \code{metrics}). } \description{ Compute indices of model performance for (general) linear models. } \details{ Depending on \code{model}, following indices are computed: \itemize{ \item{\strong{ELPD}} {expected log predictive density, see \code{\link{looic}}} \item{\strong{LOOIC}} {leave-one-out cross-validation (LOO) information criterion, see \code{\link{looic}}} \item{\strong{WAIC}} {widely applicable information criterion, see \code{loo::waic}} \item{\strong{R2}} {r-squared value, see \code{\link{r2}}} \item{\strong{R2_LOO_adjusted}} {adjusted r-squared, see \code{\link{r2}}} \item{\strong{RMSE}} {root mean squared error, see \code{\link{performance_rmse}}} \item{\strong{LOGLOSS}} {Log-loss, see \code{\link{performance_logloss}}} \item{\strong{SCORE_LOG}} {score of logarithmic proper scoring rule, see \code{\link{performance_score}}} \item{\strong{SCORE_SPHERICAL}} {score of spherical proper scoring rule, see \code{\link{performance_score}}} \item{\strong{PCP}} {percentage of correct predictions, see \code{\link{performance_pcp}}} } } \examples{ if (require("rstanarm")) { model <- stan_glm(mpg ~ wt + cyl, data = mtcars, chains = 1, iter = 500, refresh = 0) model_performance(model) model <- stan_glmer( mpg ~ wt + cyl + (1 | gear), data = mtcars, chains = 1, iter = 500, refresh = 0 ) model_performance(model) } } \references{ Gelman, A., Goodrich, B., Gabry, J., & Vehtari, A. (2018). R-squared for Bayesian regression models. The American Statistician, The American Statistician, 1-6. } \seealso{ \link{r2_bayes} } performance/man/r2_loo.Rd0000644000176200001440000000123613611777057015031 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_loo.R \name{r2_loo} \alias{r2_loo} \title{LOO-adjusted R2} \usage{ r2_loo(model) } \arguments{ \item{model}{A Bayesian regression model.} } \value{ The LOO-adjusted R2 for \code{model}, as numeric value. } \description{ Compute LOO-adjusted R2. } \details{ Unlike \code{\link{r2_bayes}}, which returns an "unadjusted" R2 value, \code{r2_loo()} calculates a LOO-adjusted R2, which comes conceptionally closer to an "adjusted" R2 measure. } \examples{ if (require("rstanarm")) { model <- stan_glm(mpg ~ wt + cyl, data = mtcars, chains = 1, iter = 500, refresh = 0) r2_loo(model) } } performance/man/check_overdispersion.Rd0000644000176200001440000000517613616504501020037 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_overdispersion.R \name{check_overdispersion} \alias{check_overdispersion} \title{Check overdispersion of GL(M)M's} \usage{ check_overdispersion(x, ...) } \arguments{ \item{x}{Fitted model of class \code{merMod}, \code{glmmTMB}, \code{glm}, or \code{glm.nb} (package \pkg{MASS}).} \item{...}{Currently not used.} } \value{ A list with results from the overdispersion test, like chi-squared statistics, p-value or dispersion ratio. } \description{ \code{check_overdispersion()} checks generalized linear (mixed) models for overdispersion. } \details{ Overdispersion occurs when the observed variance is higher than the variance of a theoretical model. For Poisson models, variance increases with the mean, thus, variance usually (roughly) equals the mean value. If the variance is much higher, the data are "overdispersed". \subsection{Interpretation of the Dispersion Ratio}{ If the dispersion ratio is close to one, a Poisson model fits well to the data. Dispersion ratios larger than one indicate overdispersion, thus a negative binomial model or similar might fit better to the data. A p-value < .05 indicates overdispersion. } \subsection{Overdispersion in Poisson Models}{ For Poisson models, the overdispersion test is based on the code from \cite{Gelman and Hill (2007), page 115}. } \subsection{Overdispersion in Mixed Models}{ For \code{merMod}- and \code{glmmTMB}-objects, \code{check_overdispersion()} is based on the code in the \href{http://bbolker.github.io/mixedmodels-misc/glmmFAQ.html}{GLMM FAQ}, section \emph{How can I deal with overdispersion in GLMMs?}. Note that this function only returns an \emph{approximate} estimate of an overdispersion parameter, and is probably inaccurate for zero-inflated mixed models (fitted with \code{glmmTMB}). } \subsection{How to fix Overdispersion}{ Overdispersion can be fixed by either modeling the dispersion parameter, or by choosing a different distributional family (like Quasi-Poisson, or negative binomial, see \cite{Gelman and Hill (2007), pages 115-116}). } } \examples{ if (require("glmmTMB")) { data(Salamanders) m <- glm(count ~ spp + mined, family = poisson, data = Salamanders) check_overdispersion(m) m <- glmmTMB( count ~ mined + spp + (1 | site), family = poisson, data = Salamanders ) check_overdispersion(m) } } \references{ \itemize{ \item Bolker B et al. (2017): \href{http://bbolker.github.io/mixedmodels-misc/glmmFAQ.html}{GLMM FAQ.} \item Gelman, A., & Hill, J. (2007). Data analysis using regression and multilevel/hierarchical models. Cambridge; New York: Cambridge University Press. } } performance/man/model_performance.Rd0000644000176200001440000000220413611777377017317 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model_performance.R \name{model_performance} \alias{model_performance} \alias{performance} \title{Model Performance} \usage{ model_performance(model, ...) performance(model, ...) } \arguments{ \item{model}{Statistical model.} \item{...}{Arguments passed to or from other methods, resp. for \code{compare_performance()}, one or multiple model objects (also of different classes).} } \value{ A data frame (with one row) and one column per "index" (see \code{metrics}). } \description{ See the documentation for your object's class: \itemize{ \item \link[=model_performance.lm]{Frequentist Regressions} \item \link[=model_performance.merMod]{Mixed models} \item \link[=model_performance.stanreg]{Bayesian models} \item \link[=model_performance.lavaan]{CFA / SEM lavaan models} } } \examples{ model <- lm(mpg ~ wt + cyl, data = mtcars) model_performance(model) model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") model_performance(model) } \seealso{ \code{\link[=compare_performance]{compare_performance()}} to compare performance of many different models. } performance/man/performance_hosmer.Rd0000644000176200001440000000210613565530445017504 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_hosmer.R \name{performance_hosmer} \alias{performance_hosmer} \title{Hosmer-Lemeshow goodness-of-fit test} \usage{ performance_hosmer(model, n_bins = 10) } \arguments{ \item{model}{A \code{glm}-object with binomial-family.} \item{n_bins}{Numeric, the number of bins to divide the data.} } \value{ An object of class \code{hoslem_test} with following values: \code{chisq}, the Hosmer-Lemeshow chi-squared statistic; \code{df}, degrees of freedom and \code{p.value} the p-value for the goodness-of-fit test. } \description{ Check model quality of logistic regression models. } \details{ A well-fitting model shows \emph{no} significant difference between the model and the observed data, i.e. the reported p-value should be greater than 0.05. } \examples{ model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") performance_hosmer(model) } \references{ Hosmer, D. W., & Lemeshow, S. (2000). Applied Logistic Regression. Hoboken, NJ, USA: John Wiley & Sons, Inc. \doi{10.1002/0471722146} } performance/man/looic.Rd0000644000176200001440000000117213611777057014741 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/looic.R \name{looic} \alias{looic} \title{LOO-related Indices for Bayesian regressions.} \usage{ looic(model) } \arguments{ \item{model}{A Bayesian regression model.} } \value{ A list with four elements, the ELPD, LOOIC and their standard errors. } \description{ Compute LOOIC (leave-one-out cross-validation (LOO) information criterion) and ELPD (expected log predictive density) for Bayesian regressions. } \examples{ if (require("rstanarm")) { model <- stan_glm(mpg ~ wt + cyl, data = mtcars, chains = 1, iter = 500, refresh = 0) looic(model) } } performance/man/check_itemscale.Rd0000644000176200001440000000460013620212404016712 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_itemscale.R \name{check_itemscale} \alias{check_itemscale} \title{Describe Properties of Item Scales} \usage{ check_itemscale(x) } \arguments{ \item{x}{An object of class \code{parameters_pca}, as returned by \code{\link[parameters]{principal_components}}.} } \value{ A list of data frames, with related measures of internal consistencies of each subscale. } \description{ Compute various measures of internal consistencies applied to (sub)scales, which items were extracted using \code{\link[parameters]{principal_components}}. } \details{ \code{check_itemscale()} calculates various measures of internal consistencies, such as Cronbach's alpha, item difficulty or discrimination etc. on subscales which were built from several items. Subscales are retrieved from the results of \code{\link[parameters]{principal_components}}, i.e. based on how many components were extracted from the PCA, \code{check_itemscale()} retrieves those variables that belong to a component and calculates the above mentioned measures. } \note{ \itemize{ \item \emph{Item difficulty} should range between 0.2 and 0.8. Ideal value is \code{p+(1-p)/2} (which mostly is between 0.5 and 0.8). See \code{\link{item_difficulty}} for details. \item For \emph{item discrimination}, acceptable values are 0.20 or higher; the closer to 1.00 the better. See \code{\link{item_reliability}} for more details. \item In case the total \emph{Cronbach's alpha} value is below the acceptable cut-off of 0.7 (mostly if an index has few items), the \emph{mean inter-item-correlation} is an alternative measure to indicate acceptability. Satisfactory range lies between 0.2 and 0.4. See also \code{\link{item_intercor}}. } } \examples{ # data generation from '?prcomp', slightly modified C <- chol(S <- toeplitz(.9^(0:15))) set.seed(17) X <- matrix(rnorm(16000), 100, 16) Z <- X \%*\% C if (require("parameters")) { pca <- principal_components(as.data.frame(Z), rotation = "varimax", n = 3) pca check_itemscale(pca) } } \references{ \itemize{ \item Briggs SR, Cheek JM (1986) The role of factor analysis in the development and evaluation of personality scales. Journal of Personality, 54(1), 106-148. doi: 10.1111/j.1467-6494.1986.tb00391.x \item Trochim WMK (2008) Types of Reliability. (\href{http://www.socialresearchmethods.net/kb/reltypes.php}{web}) } } performance/man/item_difficulty.Rd0000644000176200001440000000216713616504501017004 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/item_difficulty.R \name{item_difficulty} \alias{item_difficulty} \title{Difficulty of Questionnaire Items} \usage{ item_difficulty(x) } \arguments{ \item{x}{Depending on the function, \code{x} may be a \code{matrix} as returned by the \code{\link{cor}}-function, or a data frame with items (e.g. from a test or questionnaire).} } \value{ A data frame with three columns: The name(s) of the item(s), the item difficulties for each item, and the ideal item difficulty. } \description{ Compute various measures of internal consistencies for tests or item-scales of questionnaires. } \details{ This function calculates the item difficulty, which should range between 0.2 and 0.8. Lower values are a signal for more difficult items, while higher values close to one are a sign for easier items. The ideal value for item difficulty is \code{p + (1 - p) / 2}, where \code{p = 1 / max(x)}. In most cases, the ideal item difficulty lies between 0.5 and 0.8. } \examples{ data(mtcars) x <- mtcars[, c("cyl", "gear", "carb", "hp")] item_difficulty(x) } performance/man/performance_rse.Rd0000644000176200001440000000114613565530445017003 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_rse.R \name{performance_rse} \alias{performance_rse} \title{Residual Standard Error for Linear Models} \usage{ performance_rse(model) } \arguments{ \item{model}{A model.} } \value{ Numeric, the residual standard error of \code{model}. } \description{ Compute residual standard error of linear models. } \details{ The residual standard error is the square root of the residual sum of squares divided by the residual degrees of freedom. } \examples{ data(mtcars) m <- lm(mpg ~ hp + gear, data = mtcars) performance_rse(m) } performance/man/check_zeroinflation.Rd0000644000176200001440000000247213616504501017643 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_zeroinflation.R \name{check_zeroinflation} \alias{check_zeroinflation} \title{Check for zero-inflation in count models} \usage{ check_zeroinflation(x, tolerance = 0.05) } \arguments{ \item{x}{Fitted model of class \code{merMod}, \code{glmmTMB}, \code{glm}, or \code{glm.nb} (package \pkg{MASS}).} \item{tolerance}{The tolerance for the ratio of observed and predicted zeros to considered as over- or underfitting zeros. A ratio between 1 +/- \code{tolerance} is considered as OK, while a ratio beyond or below this threshold would indicate over- or underfitting.} } \value{ A list with information about the amount of predicted and observed zeros in the outcome, as well as the ratio between these two values. } \description{ \code{check_zeroinflation()} checks whether count models are over- or underfitting zeros in the outcome. } \details{ If the amount of observed zeros is larger than the amount of predicted zeros, the model is underfitting zeros, which indicates a zero-inflation in the data. In such cases, it is recommended to use negative binomial or zero-inflated models. } \examples{ if (require("glmmTMB")) { data(Salamanders) m <- glm(count ~ spp + mined, family = poisson, data = Salamanders) check_zeroinflation(m) } } performance/man/performance_aicc.Rd0000644000176200001440000000231313610307766017105 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_aicc.R \name{performance_aicc} \alias{performance_aicc} \alias{performance_aic} \title{Compute AIC and second order AIC} \usage{ performance_aicc(x, ...) performance_aic(x, ...) } \arguments{ \item{x}{A model object.} \item{...}{Currently not used.} } \value{ Numeric, the AIC or AICc value. } \description{ Compute the second-order Akaike's information criterion (AICc). The second-order (or small sample) is a AIC with a correction for small sample sizes. \code{performance_aic()} is a small wrapper that returns the AIC. It is a generic function that also works for some models that don't have a AIC method (like Tweedie models). } \examples{ m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) AIC(m) performance_aicc(m) } \references{ \itemize{ \item Akaike, H. (1973) Information theory as an extension of the maximum likelihood principle. In: Second International Symposium on Information Theory, pp. 267–281. Petrov, B.N., Csaki, F., Eds, Akademiai Kiado, Budapest. \item Hurvich, C. M., Tsai, C.-L. (1991) Bias of the corrected AIC criterion for underfitted regression and time series models. Biometrika 78, 499–509. } } performance/man/figures/0000755000176200001440000000000013620205622014770 5ustar liggesusersperformance/man/figures/logo.png0000644000176200001440000007524313620205622016451 0ustar liggesusersPNG  IHDR,[oZ sRGBgAMA a pHYsodz8IDATx^`TG׆xI5h[ZJm ;uww-^Zww !!;{l6{7d~e;s9gP R!OX`I4#$خJ%S~POxYU %0GB[*oiRQ#wb+BsCpםp: 2C{ŘڐV%g>F"zEqkZGeg#2$7OFJ{<#ꉮsTdȔcˑz+.`ʏV%)XӄX׊Cm飢*7:_5$MmtA) DsE; I:H(U؎9)ȕ4kmv`ːZ|"Nc{=4̅.( Ƀ0y,"(Q 2LH\Wţ6+ۤHHRoG \F/\^ߨ0dA7*ͧbV`%fG{bkT:ܻVc٘( .M-j&!a,(/+%c0D;͝BN3j޾Yqt`g}Q<: *] ߲4E ]ڰ"P+aBRoEqhȶ;-ñiHŠ(x'4ײ ϰ)%q70!L?Ci7Ia 2#|^6>لA*'HP+HS[x:R\Ciq=| ½K VBi;ȗ0:8P(J`Th$_fB׆ue_c2j{R84^4[Bp빺n3S.(`Zi8Iڰ&f fGV5Z.'[2ܽya_W K19/~0tS1fѕڍK VB =5|4!mԆV?FďCݣl'zj'ޞ tG^!"4Q@`JHcD\bzTԆu^+N[-3&GI!A*82%Ns IowŠLz~*_0YLho|- 5TFEF/ ]QKg:f6q;K/n[F y!]{uGD=R /E/.ޡ +t@ ,Ӥ* a dwMTc=vi>=c!:!^F􋪛>('N33!QꝭrY*ܽ :4X #_&h#"Ax8Sz֪}'jiBa~S<![[+M:M4N6 J?k;{c [ bN4aEX3lЪV"#ATYw@ē}06%"̿%~pg[,ru6(joDU4 V$OPNШzjúr~~k5^[] D|7oKFtg WJqZnQ!L/u8Կ;Mt>^ (;(Cj),⦸ lNP ⛘8mAB `ύa֤Hv+Lnc P,9y<)P4EĨ"X^MrI!KQgOzI[Ã~Qˎ%Y>S%u?75bN(+UJUk6/4$/椚0%BP57^v~d\ ݼNT2BsCJ[yg|d@*ͧ [,(b:Iqvi4'tLtj.|L1)tWG p7*)O]/^6+La-*= pKMi&6[SWJP$_|RZEOÄK5N5oBmTW( w֡AX1F_y8Խu0sV؅Z*F!&YV(} =" K6!OȊhC*`JR_#,!]7w8*TGZFb⒣OCdH/f#AR-+b:2L "˾KJtN~nڠBQVו~.#s~I7vˌ4E0*^,D`udJ C OaO_[OFia "q묣J%bnL.-4'}1fy0{rF Ð!65"R $9nW%B`1LaMjúr xp9u>(S{_,.|7*G2*Z̰%4PsvݶVv]@L6Kͧ7j5Mŭ߱ɘ\am*Z)EVn0,͇6$]-A-aj"nqhH:ʋvbkTwEPn>!M'~>cjAGP ,Vl{QN(? G[tE!xԶ:c7C/;aӠXBta[!!iN6JoVay{U:4Vh6;P@_L n>AdNc"XƉHnt>߰܄MIQ1זqi>b-WӄF.W]`-ŜX ^qzGt֤Z^YLA Eek|}~nPmT?S('!&|M``^M&>FmXWw:/?Ne54Ft'UՐAG/h ,O][puT_I;ͪ w4*GqkQww6/bEm1sM04(kf'ZxzxkuW_ݸ1UܵBq|1I?G@A5ς}1vux"cND մaݠfL9U6Q(J4a@Y-"Ӱh?#d0P[júrUlmDP8Ro{ j67dr=~ߌ7пeZ턐z[hUO'3>޲K.Q4 '0дFRp%бbb@]Z(zL =#"3t_OzX4,C؍%N`՗]=b#KeRBOD4.sC"2oS 7uӆumܽ ݧ( hLi]L|0 %&f)^fx!Cii=r ÔJ0 t9n>%!]HI`Ĕ+>$; u{Vt"DfOOmPHP־WKHIrLL+O Ka<Ձ'BhjF Cȓ#]o|<XS-^f_Ӥ͔4GfR(ji}ߪ67b$ǭb:M_ O,+7ˎ "`|Ҵ8#^P|X+13LyZH>݋I`*F0gsFKْLo7x'XN3 ].ka՗mNz@S(D]Oe9.8EOZA q )vCEIfٝf8ӈwR(/l,[eP4/cKBiFENlvqZd]]{B#L};U'D#dR{7.mS5\7n߮^G184MU( x'"ݍ3%GWLK1mPQݠb: *JM:ڈ.rbewNPT=حfB&&؝f2S( v>C;|tXLP(:U/sN#4+BP5/( 2P$) x'o\O)4ڄ_HE[F%uF M`XI|}GKY(DHt)kaL}l Rk# O`P3B_A -˜a@_h#uѽ+a#w57׿ҥ"[vhIv<,fv94*SfP|=\;B_ QMo'Cؑ| 36 {i ѵF'oڽ`ܢ<4gA]*9DԂ4lڎ%i+{}:ư;N1meNwSe<`b3OiϬL?M[+{/RS#ĉ?U͑/s-yؓ33{QMf}-#k/3 w4N>iG%9.RpdiW0Z߉w%4CiG_7smx3Uˑ#?cSQh)|^Rȼxmf 1šQCgqb.>; oex9+9=c7qd}y>Ԃڨ:H;V O1ac.otQ\*)b=lܪ\ JD {݌=VXa5dIѭRy ؟}Թȭ"x{1 .'?݉ڒ2 HaE뉰"|JSN`wdhϬ.7k|LaCAQW0Ѕ"-;n]쑰"lj-C" Bb& ŠߞWc >l@V/1qSTXPHM,ry"5v j#r.3P;vˆ{ܢlQkX6i()V`)Qnޅ?$R^|NĻӫѲ8!\6hH_'I-jUzYNx3 ߇KfDwEa:VTmM_P(~ouFHbO.ɻͩՊX+C*h,(4IgI0G-sOq'ΙbGM)5j\G`e(aZfOV؛s@jziͿ<"Q!r29k'85ᮭm iAiTMP=5fSd:'v$,qm(u<OK&-˅淫kgϢa|Cskpw>׎";94CX .M&es<dž-(sNX37Un\|q$tP<o ,nw9MAǕuǝXq.J[&vgpo֎xM;mB&mwj5$l-@yL!ցOZl7/Z=9޼mKPvxcF"3~> }60qǓXfG?SbMCqpR`R(R;>M|NWPR %O7K$ ߷nxm O8O8 fqNK f66rba N(m[Ȝ_)'R -hO[q%&֞)O .w<._\`t^D5L(Ub#\x pI; kAeoVo(o(MW[=;ܣR۠k}plpq=}*oH:l\P5 sqq3,R?<.N#y]4?#?[?Gs9E6%7%i 4&H U9Z'K D1O9on:c:Z˧䆖M1_N%`3Jh8[OZ.TdRlF}m {S ^F0s 8)#?.,解/djqPskT2l}UJ(0q4 Si'EDotXܺ &;̒sed:+T6g/&{;[a}c3cy'ewpVհ;Lf0#饽Rx|ڑgDM;EFVhV&Ǻhp<䪺%3yG%yzƔ_@pǹ’D 5KSr]3u,Ckd= o.C YQ14eU;Bc5ܣj:|:Ɛ:J aH[eVMW&Վ9vLkP5@;2(~y\ X1*$Q6be &&$M+ $qW|yY+?/K{R!owvdIV;8&ɳ"E]Ί6W,|zs O³,\_lԧRdӉ7Gϵf"yUNZ=bBC5􍃬q!=nY._tI;*M.nlGEYKέ F|WڑȞm,P6UM {Xʄ}1C(UOR0~b? Ý/p1 .`p˯}P~}\qpXZk_2퉦ܼ&3N. a)Fh<I8PۏD;? ^QuI&7@BB֯_ hl2_>_t)z) _%̵qC˵#PO2;,Y"mG͓žj_ժ]WQ 4,GjL¤bA7{af۵kW\uURfӤ ܦwMȵ^[JX -ZPja +j;CюʦVZ҇7sL߿/<;JgA~вeK]-f};Ȼ2=J`)$%UZھ.ұn#--MFAMcݺuD0`dy]gwb7l1޽{h Ç?&Ѷb-س1d`VY:転`zWϏ_l)5jZpFݡʛԦɡ0΅oǗ_~)>ӦMCÆ [oU`_7a+( ]:ŵ㝤o _8+>%NgϖVll,>2wmޟܝڑg(8s?5oErJ\wuhܸ1F ?/ʆT}9Dȸdwg^͚۷3xԱrqԢ7믿^Լ~Gt]mwrԲA ,k۳D{gg=P֭[ck3 ݝN|#Qd+9gЌ&ts!:]]vZ?˂AU~ 4EjPu]駟w-J`)p"G& ACzu x eEA9lg `7N<?/5Gr9}oyy9Ȱ|V wK`r2yXy;hHOf!̓+Ru ۯ4ODTg 믥ָ`wyrwĉqҰ!ӽS0zWL^~e 8so> fWS8JKmNd?҇tb*uw25g2{%wiF{ {&/(()^<|an1}=Բj߾@x#j$oa`6n xr")5 Kpv9LSʒf2H]E;cQ2eXRlu84i1J40sӦMR1 MG}T:]zUz+7 w cF_Vvv[ o&WtUv܈upx;hC ,E)X&d wD[namLږw&vhvC/S0j7p222$iLLet૩z,@ap3f?ύlsR8S =*K:9;OG.[F^sGgFmLTT;?}C=ǂ@ar:V/.c[*R'#cKN f["g-v sxICbbD]e׏}&`J7Ǝu]j/^[~c !5 5HXZv Y{ґw\Zi8q.&j= YYd~VuwE ̛.]tF{S\y6T pG=h_F=SS%FXnVȍ 8]NXlX_ezU~kX'3Bchpy Dˏc틝ƙFRވ viVRCΙ-)S 4@;"d!y9Tvӈ(4h$? ײ-"!L!<B &AO_wڑ%pS+quڑPQϴV)׺>,h^FNBf'[mSlFq^xeA>^#]LkY&&2UNM!1hx7Ծte_)Ƕ'VBϝ5Az",'w w䴹n/}[|rtۣPd9gZ_ >fk" v ۩xNh0tbr MS .Qd Qq~ɀRo0Mhh[_S(ߺXWGWq.:}>yvf5ؒ]7r\6_KAre0;d]9K;f"5+GaE2S3ᡥ(\y/ŠP@m"B];-EQz\t'1oVwK둺N1Ns |V$kw:{ 6I5tl+7߁7|%W!w,#C ]/*Bc፤VÆY]^՛:M~mOB~]6B!<}}xOvQ^!j뾖9o(HI~M` })?2~;<2W_ڼg]M7_  X rw,,6mIrW ٖ l GC"@;]SvY U~Z[V@kZղ 3qݎ%}oQ9iGC!vfqw1ڑs6c& J`#5NDëU ))ĎbG&}P5?uujnxBTΫ/} %t?Gߠ9X{,wh:ҹLeG o=ڳp\Xt,qzIX Voƅͳ=J윐d&')2❈lr[[N~J.Nۇk̳DpGbT׉j#7y]܅(ҙuqmpƺYyX1O~k#No8UV"&MLkׅtmaᾏb l\,;V]76LX"W0߫^[_@ڪb75خ5!OkF|ڨ֪ ܎_(~Sx>|!q5DG Gd}%خ5y2%t)_IN-{uX{B,>܈4y_Ŀdj`Z w NKsI=~< [d䖶ye{(̷=Fh 4. %F7UhYn৖fdMDs(pVu77X!+4;Q̑!V$s!(rmu7,‰?ܧ9ʕQ4 +F/Ctz6(zM,M@5za,ϑ;reb|7&&O2J-Pw7{ o&4|%ſo|s9pS|^d'm8(.x8(NOyZY{2w/"='$ki^&\m'w`%F#}L} Jӱ9Qc.fë[ޘ&Q1da✝ךԓecZƢ+Ksx[TyFrxגy,KL:8 LD[] :݅cXpyW&A! wIŧ/BQ[9>W,:a!RC!^XQf#T^ G6Oqͤό/OPOZDaZ&y9A56GzE.MZ@YELJh&7K7Pغcz*dm(3H]H9brK5aߨI#tu@z%[`ZLWр/D5QhrqB:%7#DFD@өh  Mث4) <)MV #~^ N&7- œ|JvH/sIδw3tu+5nMI 㺚@ jO[u{?"͒`G0jHԫ[OZ | kN!\䭄ȝ^0cU nnUoYٹ.>~Ma*5~sY=Pwd@uon-k #{߂#?qCͮގR#`k:Zj)"]\|XF"xj!`>e#Ƿ*zJ QկWÆM7ߌdي_DB@fQi2jVݪqKS֓ ^BKaG:xqR;4 _ -NrY1OYΖ[΅#/YfoBˮZu$Ŧ4tE,~˼3ik4c#3bg_"X66/ѡ'b1ple?Iǎ?""yOo~'ي׉L3Cg3kLwʂ7tk v'w'of-,nX^1z0\`06OZ&޷?/eacv'pweRnϺVAS~@t>! C cO<.حGw[=ޕN6mD_رh۴#06QB8}Hu`\]Fx% ( , t'մ|C.̉;9 j )N,k2T ↛n {#q39q]}mw2|W@i UKS rwOYO@oaHoj ,Wa~Ӧ˰ѕR ɝ'BQP6lY2&&\-YY3v,ݏ 1֭Y/>B'yHDDDHߏ`e;60@!tatFm.;?͞S;5Doa^yFl d=&>B{bdn'n{(}(4 |eذaڳ1c,Np=T_ﴣb֩4;@hGœPw96Yָ4a_B荀iIM'xfhbiRXy: p,0OF~j <,YoڳqJtE$ `vkZbñ0:P)zכMgͤP6:_ @c0e\K l~pn}".7 2g -mtu1D9EVޤzדFji>!_ vXLdb}٦eviH:_޿쌞vLп~=Cr]2"ҹ"%]KJ.C L1.A67,Ģhy#F,OtˬAfb+z 2oW6T$rss>pac3qo3Yfo)-h7tOx#ҷ&&]$ {n}|_At!^~ۛdᷞ?:IsIkoBڳ|2k}QlZ%LY3Olv>nS_6B&3 Әdof!/($S<) Y}}"OL:H,ņ9ůs~՞ZsUkr-Xj@k.yA%}}6s6<~ƌ޴ SX!>wh-sOJ ͂ /v[;ǟd㚫~M\2ؔq[,`T7O`-}0dk/|*)HKgT& 3[8Iv/݁MTX3ОS#>?#čWYrK& s$5,Zh"G~[2CX]l=!w+/2wgŪe9X7`.Zz+B.%i[/&ow]Gizl9d8zp Y~Eb1sLKMKER$lߺ]걮R4if< A?Q7VV2DC0M4ٗɺ,X?wȮ-ezXhgŲSd$?x?^y@";'.~-~B/&T,o8Rw!-lpg *l'PP=x Spű0X`6Rj#8#bҲ|oU %y]kAEX)7ekd>! Į#F߱Ym`ݍdCѪ%/~ "x wMC˖Bvy$vvf6[뗌`sDHbBP dޡb4?VeiOh߾=>sKU4~GNJc/HXSˎ/oZ *Ġ/5F ./NMXFktm+eITfvTu8| 7x5jk|'xGpPVm\62YL } + iUG֮r;}e ĖW=O9YQ0n5+nfV` vI'NA\ ٞ %C'݇eC $Yv8>>-"kF"FH7s ]o6-Qm_0aEse'vOf1Ma,Eʢ(X $ښp(R}ڑ(x]y},F1pd"5@{~Q) Y]980S{kό!h4,ݺθClI@X*y1=%a( }= GDV^/l$L3b[u;9ݾ=[֘Z59E17@;RApG@3Wb?V!l >'+ilo'V>BEb}IVՋ5 VɳT0LւT]pE88K$%;b }it]+$84& Q ˯Q.O{yTMQn!LU|FhN=k!w3Mg c]%^D>q,PrXtƉChvw4LsxB$:}?/QLaiVZǝ1u@S(IZbQ?=/V;#kVPZw"./ ?u 5P/Xlhj_Mzx>/ _ba[e{]o )3;Y{3J+"+uY;;M*?kR3fl7ݻ'BH.NؕQڑ>VUl^s'-G~k)UAh*xG>vĴa zݢϴ'#P SK]BB@S*B"T`ٛG_,€Jb#v+،c8@ P:RbgP ݧKUo_!Q%fvkG@jP Z׳&# i,u|@0h{{'-wE`jRM{P, pz50iZ["~:=,GP=%W 5Ô*ɳU)@C*4X;OkϬp^%eX(GU 4]j¬S(E@f\Α,확~!YwU$j=S(G@0bߘ"0pwىڑB8E+i$#畯Pr”o|s[|BQ.D`2vȲ$:> aBtsxFRV(ʃ,V'H6 t3oV\aBjrk[Za34n& D`Uk="E(Y[X(OEt5 GlOwS8r' +iu*q7vdh2jW:m #*8Ť5v`£~UVгŽ$U]7A\o%0K8IJ d_$`TNkvZ'Dѵ-_(OX5ю{Z7KSu!kוe>+ ,'u*#/C^iZ!Tc,T:kP#X4رĂaӫg+U?xhNvԽq]""5E1%-E+FomBƶ2ŭQgXVXB^;R( ,:s[>.nV`GcXw"zuNۋcg`?_(|2(U\vFXR7^ >?E Z .s4֜ġwakѕAx ?Iw* oC E v2 }E;V^NF}@չpzt.jW&U[) Pj|ck9hs@{;k`=vqCmwtXb`5i9R3Q0yAE'> (U CJ^eUÏv'.s7uQ`1YcEdBZAyhY!y.+Qa7 Bq&lG`uS͘JXsB)?/Wƽ9 eG#6ڠBtC끘T?N]`H_[uCȻ|eOtE☦8^|q}s$e,Z= ׾__iG`f{Vѫvnʍz%IF`Z闉[B tޮ08ؾd#U9>t+Jʡ=~^ĴE7ŹN88Xae' r|gFIt Q<% O=7:ܶK.&}]zœDFsQ9ݼ:|>\#ܕ8 ,s]loDh9'Ǹ3S)_C:(7ů (< :x74mOV~PxD;ڡ K) 4R2߭ڑ"9ضjc䫽xcm7"$}0jPJlc9Sc~hN&_rR>0k $7קzhUcQT $34jLTe.&5k !F Y)f98 \ yZH[?v(0e-3 Na+O<87]~BF2J=7yף&j00ΈЩk{I fZm)ަ:Oi׬\v*E ,E"}"˛Iu$,h^9U{wN̬2='8&S{B 2™vE4UFus 0!TNVgd_e>冢?aa#J8-'<Ul*VVU8tFjVŠ0HWB'>S’W$5)Uz;j'ʊ Q׶d:&fوu'Mi>D{>*-E/|6[BpyMe#@v.暅%?Ԃ4^ª ~[_Y%Ax$Tk*VfNs0S0_ `ו8}ƌÿ7b7%ej/>nvbB== ?65MP/kiUd"6ɞG; %i,I${-DԎ_{!Ŋr,ij\;\4_(נ2W(8c`7_4 9s8f\:GvCR`'2h+r@x!gA +'>2i#%-B+h67B>u^k:JS}tbzXl~s6\LFSh)uZ> 'Ta-ד笖5c;,(Lnv~|MZy^)>'^uT_u>g[ ds&4& ?/w▏Tu. Ԏ]Q 4%ѴWfjNiGz ޏ92fW(),Zce:M.(Ky^ܷ:b.>Ň$ IY;t7ܽ kL.,K FV~r^(dłW.Dqh]˳#beܒ&6[|u|Oޑi3~^0#pw KrDwZW\-XUJ \{`uG#⌐PC֏'yrd״Ǯ`A|Z;BS@ǘ'gP1Vdh@'Ʈm}|4Xv3V-Ě*xcn[X2X#)KvXi5 V$%BV GmԾ@ Ff^ո,p5to3OQ`:͝ eO D>d˒0>Jka)Pwˀ6: o$(]6_\d FeQS( ٵ{'3N%i5TYTJhvm쎈zVS;bcpqu#pt1 VrpEc|aFKk_R 窋0>IFB DE3 CǷ'g0Gx K0D|-Z?M>u"rGBg,E&<;~ƍ? К3%!ꉑeƤ/w.CJc֍S[<8j,\\GB!˩ؠN ֱF|ΡOasߓ!gڠБ#T˽{ܘZae)4_-[ RH**&"tLd4/,}sĺjsb12w7C4we)݅7'/5BGqN4NǩZ)d9,,UqE"Ĕ0L3X1Hߘ";xK+| Ǧ#dCmqXF@Zԓ}?4ƛZ^*0S>rz(h~_?!<켬=lvngj^3O(GaFjF ] C>*#ZBH劅E?K:3 cjLװȏ(Ģ+7aSfۓ#+=+;#Pqɳ|?jKp'vL) {X86&AU~yRO *A#4LK1Oӕ̚kI$eq26NX"ۓ8 Z?#[tOC!Ф9NwlkXI)5‘Va+}PgaۅpOodu&$B5 r,ϊL֕cҷbU Xai6eyxm]GVFV{p{vP9/)T E#]i$(]Ð4Mz"q4mTa:[tE0C?ƮWkGV0#YJFQaϺCh14erKK_ Z`X"U ƈ{:yJxF܌""JFk(J~[]Yn_(*%L[s };bO՝X2Ft!Q|8ka݈΋Dds[\} ep`?LQhv?5a%'}0܊ Hа왂)!v%OܦgF&GIM%ΥB LgVڪZέ'wUV_QҗOvEɟ- 7 H,\m30G ͪAnKx7R3 PN`X?Ē}J|+~Nӎ.(uNsi+ettc)6-q]j΅4߇$s`m>\f|BXyo;:(jJLz`tl|Pa v)-tQ`)|׊),ڽ Fvta1Ep` aԫIKֿЦ,&XV2! #KT *So&lGC+ v̚@-}R\iU4Z:ABMlŠTrYYaو$.2yVݎߌbzX`_RJ?"xń/DՆ3B/aPׁJ!lq ^m!ѯ-uG4ҞSRVf Ӱ41+E?1Ye E]qyMX6cܱ>s PS\NKDm\qڑoiqMQmv,>X]lzI}w(\zoC ?4 F%avmRQ.e)!~[] \AlncL&w!bfg{zw WLXz+SG?y.ӌHRSȿq( O(Wdͩ=B/ `T6̈!JpMdFo'# L_Dcj*7WbfX^wKė]̍ǂ7˷犪+vBV4˾,{cL aeZŗ_KjL̺96A0*Buu0>A/53LlhÇ`J/% ,E D|J }{ziu[CmU'L02t@xcM\* /X9@ޓBK/ݽEEX1rޱFTTBsq7VFS_?a(fNJ…U>VE ,;`V+Mt\{Ic05X6v; "R/3:o %{~:PV`y-mor3_mi#D51$Y<,وDXen>y8(LD<&5mp&tO('pkF+O3BP1H|ɴ*Q axNaUk4m^Nژ"@(UNXy\$իⰕuT_N[zVov7zR zV[(UNL4{WT mrY}bcR#i'0?U-rD a%2qQtw0矫7៫6ʐ C>膘TiyO_ݢ +%Ř+E,cKkeK3q཰ Plu"Ƽuw%l,;}1zI"P+k \mYq:/{ìqcJ?VvWSHШ^ ~4[S J`1kML?.}.7 %2<͇4~g}tqYB>iÊ C ҄W) Hɓ[K/نyt4wz Π4.~a-ӆAXLK0ڰ4li> 7Ւe_n6$9@`9d&E*bVݪ 3LCC3U86Xoȇtc 0<#٩FQAPs`z2^0HVwڀs;#"KtO5T:MD ngBR'ůwʑ;e Mht7I"Z1iÊ XkOaZLrT6;k`䫽re=)Y"iL!+NSQS>Q |3"eԨ{pT۴aE%A JRL!.;bXk}v~w% #P]y-V$.ui">v%'&a} 00Xvib9(XGe[5:X '/l$XB"mUra%G *\|ꏈe -[L& M`JFPf΂AzUb,Ōfbhh?'&߸鵲03!&%aJmHQPjbZi,2 ЪZP4/bIuQb(UaR*>!u48i1YICK՝+G\& p-L'pR; +(J`)ΰSۙ`~S]狉qtYUI0vv((h*ېKf#A\X ʰOG$1pz {e) OڰBq%.Y Q&׊{FQ,sC`7 ckc E)Rxb͌4@4!boPpX V; geq:3)B:=s  W4 QK5(3"$my.&_7f!aԆ PK30q3N<\AxFV(B ,_δ3`yOLڰ#z`V2U:gR|B bJ=-qLhUzu^~oRR̉ i!ꆠ^oxEIj(IENDB`performance/man/figures/unnamed-chunk-13-1.png0000644000176200001440000034273113620205622020624 0ustar liggesusersPNG  IHDR Y8PLTE:f:::f:ffff'`,>P::::f:::::::f:ff:f:f:::MMMMMnMMMnnMnMnMMff:f:f::ffff:fffffffffffffnMMnMnnMnnMnnnnnnnnnnnnn֎MMMnnMnnMnȎȎ:ff:ff:fې۶֕֕nMMnȫnȫ֫ȫȫȫff::f۶ې۶9+ȎMȎnȫnȫȫȫȎȫ֫֫֫ې:ېf۶f۶۶۶ې۶n䫎ȎȫL<֫fȎ֫ې۶. pHYs.#.#x?v IDATxo՝hS8RjxSfEeBz{>y=}Άe#u@` @` @` @` @` @` @` @` @` @`B.Xq02|+vo~?uQ\Ԇ^ث;;,n쳿nnsKwZӶ@ ~w.IY~ 4ö\?qc7e;y o$x-+jƕo'EyB/m]qBod:Fȍ]W[詫E]$?1c8$7?t`X?PgTwB߾[ԯnjuzCeГWM{6pYW^?l7~=BR~V_ro?{bg~ }U@ @^׎0;T ܪ~g,բ.g }~KFuMZVB:0纫uW_JʝL賒m{v^>7$Jԯج=]>Ɋ(Y[KuE].ϞF: :>6?{5ƀBzi8q +I&_1T=3l"nTz:w9Ћ`U }>F#>0h3sٮ7W 7`Bߨ9!t8rfΤwNSsij3 @ i㟧M*;΄Z5/ *!YQuz:w9geھӵTN !Ņ'i_?ښ|f=3'蓭.z: }j~ư,gKUUՅ>nkܨ/4I j m75%zs]ͺU~ UyGL*~ȰGhbgu}iôxZَE3`B7m@S]֪[8\iuS-Ko56 _ꯝ-BU!g-D qfX_t#5 =P1;oM }$U C }П|I F?W̅JjMU]ckڞS}5+o9mZ-*~7'oibV7;wf+Vԅ]1;j:k\֗=j\^7}jRH?P߱h[~X?(aY }SQDI[UBkPBoJCiэ۬Ŋ=BvU9ޮ;ilk y{:ZJ(cv?XN7ߪGZv꾮q`(.f{*f{p?7sZQ7}xh+}g/W+;Ejw=2"Y sSްI!v C }vΠb:exM?_u~ ^!W{?;4P4|SoMͮ_W[/l7)϶}lBo;fWCbyڶ|WY_ ON7z}૘V]jM%_oW>YN#tvt1D胫Ekㄾa+|Ty7޹^,tC L^ñ:nT3UN3&zy֊ѭ"?.m/Z]jP[}qmjkybͼ`RB-V]Ѳ@W+c6B!4்jԊzT3K)*@qVZk.g5J1Z9|nQբU]ɯ֗1W)B\.xz[ g 10={! 9oT3RNt_q?NxZ1[m-]#z_Z{ud-K5cܯ̓զzYjՋtBo;fgÅ!3_#0N%J4W̖ZcN "κ1HEg |%o'?.ZM;f OqC M^:oT3V~ẃBX/zW]Z푏KECYύqC+cv?X9~c y r}p஘͵Vj.TQ-]ucЇUG }5hAU6s-S{MX+ ~i2*CQ;^׷KVn66(0Q52B!8KҊ~976-ݕvBo^N udD.}냕*{ab#{ z^ u>Bqݨ\guфy?nJl<5Ʌ^o`j0]E++ȴO>_Ǐ͔ֆqC*cv?T .!}=nZJjc_[ߨgF(!բ]1O/eۯ_cjӳFe>3ů1;͓5*ܘ/֠rIe}v/*z 'g|ytݹ5 B -P=; ƺ1PCEwMVԘJ]^7WE2@ QMZ#A7*qV>Hjn`P|3&]nL*յ,UGz }!'v6ފzM 0 Un*WZhBڽp6֍BR-K,*nAs {_K9yDhQZk5l#iJp<`}H>B/gp>[I/Pe盶M_xVW_([7uυgj Q7 }@H&Bvl&WOn-Խ>0=k!xnT:ZBX'ƀ:WyN$C/)t'RP_^q㓍g=n7лP^X;X׳¿A{u3Qz˴vFxZ1GMZۮ~ wu .# j\֬C/y(P~WOZ,#e yR2.}'oBC>ZPlOF/@ٗyև@HzBݨ [zzЮcCoH ݪ?%-QnMo3F>7:5UݣXO WE }2z0B_tibЧm;`WwzUz/K/|k[nY Q{r|=(G\,֏ĥ*xz1[:PZ>ּ _'_cHaBT=nBW!Bo=fw CUoÅdN&TnCO jPw֍Bݥ(%fWsh/Wg.lCo!g-D\73MIQj]\7Wbk;ABo=fbRl>|޴g;FUsx+fV n zo{yrs;psUS[5f!g/FzfXgu4fo;pI@л>kpB3v;.'K'K?)'ɵ?an/k>(y[iY~)j_S )}Cf*yt;'zvQފB;BÅ_-:KUnKmB*g!(DH73BY^%E }MKJ|O_;Yo\n_T+̴}4r'C*)tz1;SB[ƗAGϖ=n mRSފB;]Z7 ZtЋؕ__VKڭ~C MQ֑:oT3Y&G76 ߣ_m"ABX3slN:kqm,{o[1Q{7~Һ:v_7ex\6E_\󭫲|'O*5ڂ]+^C }^q<0}9>MQs*f TwCoBߵZtZյV+VY7셨Q Wf]ޞUbfxnR\9؅Wʁ,O0 LB_E᫘IKmKhEW }Q緺m7L3nueR70Fe=\7jSOԝy̎-Q֋!hrQ'Uq5UVnvSmAmj/;J_0TUPԚ+.=aګc;fW{ Ch*voԗPgֱ[]=;>LBjT$BߥzgբB;|9|!g-,sUĕJ~o WpH_abP7S?Y=rcm1>t&꟬^.mk^PW5vk^ i[!_(V\DU(׎11`\ؿ{[/rn?1ތB*m2RgL#jPw֍VYf7Yq;[^_am w 14=k!nTgF-85_OU%,V +I||{zÕ?mm68aZU?/,y7ՕX~ɶWM *>?u }yjeg?\\?BKQFGL$лFEV}Q~ӼeNhu#CӳF:3o-ٹ7fĠ*aub`/zE,XW<BIn[CUvIC6U..kzL&L*>;>,Kq',ʷzA~s3;۟Yz^+f2ÅQ7:d-Z4>Jn\wW|y-rmYO[n"0=k!Z8oT3UɎQl%U%,> -+{S:67[uM@ؿRlZd+_ |2uQAl` J@/}=3ǿ?u E@ `1=i8XϋE~P-:G-`mGbnd[utZtB҃(!u5^N)A}9m^6ZHCh7ZtBRRN(Q{ՅBT@AJ1(=L,}Ӂj=HI1a6n\|(R4ZtBRrD|tCTnVf7U,pj=̚3=n=R=̚ύBo=7=̛|F@/RCfNaJeg]p|zT'3g@ tz1z9!7Ϡ'=0Bs 7ֆ!X1fixkE2$! A!d 9snn s!@ lhl{?;76_=—66~WOo1d5:e<>%(wgVp0 s!@ jBqk]xbuk2B_B@ s!@ BްwQ׼"Z!tB?G@ |)BvS=yMErC~ 2H5+;C!``@B!!;[1Lyqis? 3B?G@qH{gp7^uq'B A!d ȨK^ D^37uAvōfJ_mW>iX73uOծx),[^=˟X=ٰTOFM7s y9>-ܸJ_ku[荟;AЛy0m s!2gBi\rb<\YiZ Jox?nhl׼fѢl5OL`nyrM \CКk{wg˺K1hzJeW#xzퟙ/AC2 s!Շ^(Wȕ.zRx+.mm'47-0-H߰ r{4Y.2*ɨ)]zQ5_I-Bo*S`~ 2_/f!T`;4 ԭLj~9]Xt7\,{ }mvT_fa,^Mbٻ1ϖ]Cy2@[ H*Q[9B@@ {}o2~%ie{ⴅބK(*Zs2r]k{\ Ӏj?wp \ӖUߧmB5X#A ]+~RC%T>V^c4J& 5'T69 M>i歷] 9 ' IDAT/?}fW׫hiW j }3 I&2l @B!!]e[3E7!p }CuAhKa| [_e%VmHfr522GTzW~{ }{+! ڄ>nkB?G@4ax&T26K57+mo>ow&7~-ʦ"MLHF.J]˲zKy{LmB5X#A ,m ѴtY>nqYl{(Bn э6ouzʨٲːcoe$(mscWC AWKN ";ڨvrه(ܞU1{ B+!ǰJSzK6J s!^!V8RB9Xj|s^vUkg>m }6.MD aAB_%W>Cޗ`7B?GBj5#uj W= HA}%y:*}mBxC!͇b7266>ymC }`~ +jG@(R+ A#T-daQn*x bl@QnnXvp 8a_aܘܗ`7`- xZHFbqۉS>3rJ"M3z=t)V-ơ68Wϛk6CoΨ>̧a^=}-?s]ǡoo%$p, xZHF>wQ@[+̂Z9}f:-E2Ob6 `^3Zvp Bmݘb[%.![9RySdnJko 7z[V74߷uG7ZBvh-?/]m6 => j[wwFq CٺJHf}I0\C s!^!V8R:pb}nG[3UIjӭtcf}Y^k^_ y额%T֛nϨec(f*2k $N.0h'B5X#A !Ǒ:5ЉPJ_,n=<2kPiT&W`kB?GBj5#uj Q1> eLJGsLtβLewl؄3;ۛnv>P/*SwoFmCmmζЛKbMja[&E[9RyS%ۮI7\YW|U,{PKW5 }޶ڇ,eqwޫ dV mhݖQg.}ǠUzKbO ~4coŗ`'n @BBHqN Lo7Zdo ʧ*z7% :o|߮sdm7YW]څc ʶ+ޗeV/CalݛѧtC} R+ -%qwޑeܮ̝`7m @BBHqN 4&ZSXz#A !Ǒ:5Bym]D@BBHqN !# l,[W7/9RyS\\͔uzɦzy = T AxZN~bf쉝hAxZN~b7,Ő#Ry{ 8^=Rw 'c}L[7. k~ SBHq?j'WFԥ/++N'/ #A !Ǒ:5A=pB?GBj5#uj[uq\ xZHb?u!#A !Ǒ:5Ї,ק.@ s!^!V8R>7 AW<ԩ>H8AW<ԩ>.7z~ +jG@.#A !Ǒ:59 6@BBHqN :O"}V s!^!V8RB@`~ +jG@(f ~ +jG@(FlbB?GBj5#uj m AW<ԩsB?GBj5#uj\ xZH0 s!^!V8RAW<ԩsB?GBj5#uj`r{8bCi@4 G9RyS^?+8T@ȑHr#A !Ǒ:5r9Ҁ=@BBHqN Jw.==A* Hrarܱ|9RySHpX1Į r9Ұ>9PB?GBj5#uj [K7 r9Ұ.9 9~ +jG@(35C* HraMrܱc( xZHC^B4 G$G=AW<ԩ@*/ oSJ]u9Ҁi縣A~+~ +jG@ @h@4 G cI!^!V8Rr#&f@h@4 G96}>荵+~ +jG@ }X9n B@рi@4@DŽ BBHqN "Gi4 *8T@ȑHZzCBBHqN "GY\ʱC 8T@ȑHZ'Y;8A !Ǒ:5l_,nSzP r9Ұ9YRySd%{޻wyi %* HrarB?KBj5#uj +y} 9Ҁic[ǛX}N_ի/lABBHqN t`=5@;+8T@ȑH :?п-m>?^>Y!S!^!V8R:RoJ!%* HryC+q_#ګc^B?uBj5#uj3_?t3oBP!G# sZB_B?uBj5#uj`@* Hrw]))'Zc|]&ŬCN/N ~ +jG+8T@ȑHy˞5w4W˟ϟ#[AW<ԩ)Wp# ȑ9@oz^[ZZFB?uBj5#uj=sB`"{Ci@41П={.(__B?uBj5#ujkS?$BP!G# sL(G̍o:A !Ǒ:5Br9:tB/{Ә=_.wKABBHqN x@/FԶ^B4 GxXمrgbs7~-O xZHp{o}N`֎B'՘wYBP!G# sL&g5Ts&yKAW<ԩQ%u r9<}%R^nq[*Ry{ F6q 4}9Ҁi`c*.?QX!V=V8U/ݣtu '8r9=ǡ}!ٔ;b6)=)Hq?A<0 Y}%'N7z9Ҁi:bHʷ&z=)Hq?n H}LMS? # ȑuq@w }})[-%!AW<ԩ(ݲXٮէL;M:r9Ұ&93BzXb xZHw}/aa5':nW/<^B4 Gbvn1>ưKU=GBj5#uj VrZ{mBCi@4E켓cb5!^!V8R9S m;l$лP!G# ,s4B/W BcӜgB?uBj5#uj wKNW]qX#z 9Ҁi`UGFe\7$})g +jG@(y(M0`q`vB/5s/Ij,$BBHqN rh7{9Sl߻%LYi7_NTc&1'Bj5#uj l`|V]ׁn ʹK@kIˏ,KwѣIŚĜ@W<ԩ@dⳎ6c;ѿBX?BO-uwVJ6˔l^C!!^!V8RܽПt<-P!G# ̱TuӰc?&(֜l!S!^!V8RܽB/|B_B4 GIӃ dk-Gn !^!V8R)=L,>?y} 9ҀiPVW K(U*j/}B?}Bj5#uj rJ7G}+ 2z 9ҀiHcB4y=AW<ԩ`y_J M߁w< A* Hra;|@|\rBBBHqN Sxٙ~W7tas r90^|/BipBBHqN t`[kSl,* r90|"z"8RySlE+:&+8T@ȑHà9MГ xZH-лP!G# C8\BOvpBj5#uj`T@;B4 Gsm.'Y;8A !Ǒ:50*np# ȑ} bГ xZH/Xp|}@* Hr*@W:/`b! xZHD6΍=h7z 9Ҁic::?ЏvpBj5#uj hSKqof?z 9Ҁic7=lv5zm5p8k!^!V8RHau}o.$zj{ {+8T@ȑHCl]M^$͵!c xZHZű[gLVZa2_\{2z8TA@* Hr!"(7|- Aɀ xZHZ:w P??O \lVBY\}v)?z 9Ҁicw {K.AW<ԩ)a9a~ܛWYM)DWp# ȑ+=~` s!^!V8Rs,w[?|-o{$?سПQ]5: ^B4 GrPyZ%~ +jG2>o tt)p臤 @* Hrc$ЏM~ +jG$YgzLiB/ˬ Pe+8T@ȑH)n"}>E69RySl=3䃱xMI+8T@ȑHC#ǁLx굻B%B?GBj5#ujB57;d22{+8T@ȑHC&Y2BDŽY;8A !Ǒ:5[e.|ҩ.~ޛ=oɖٵ ]B(vx_y.7SJ]u9%;li0o+~ +jGԬmT/^,z5Үf=b[zmU9U0R #wZo5o#~!#<;npi`.zk!!cI!^!V8RzxzoF/:3Ư+Ԇ^#x%Bu\g?ăzbra9-}]RpҸ@W<ԩ͎TWJ^_>oV>aCmɄko~ zŴȑ8.oHcR πЏ ' xZHZn'Tݏ=hflw~UgmU)<렳7) 0OwHȚe!J?VB Up# 1çҩ{=xDmH21Y;:A !Ǒ:\曙lٳD-7kfػXvjή?`3 x yyGo*@* HrLN26ai@W<ԩlfn IIt5_>*vU~Kg' _h@GhynQ3T?^B4 4"&yB?&9kSRyS ۿn.s*{mkƘ^-ԝ8|w r9`51y? ?k'BBHqN/hZXYmX'4 rMz r9~; :p!^!V8RIu7k{3=0فh-CXH r9ZmAb7 =!ADŽ?8A !Ǒ:5з'O*)7~w=0C1M ^B4 6͛4zp!^!V8R# z7pB?<z 9Ҁu"!݁O xZHZ{u.;P}AnB_I$mz 9ҀMd<RySk.Y">l >/T轥!I!Bj5q2In\crVQ_[an^c՗_ N3Qo?󯎯|@Di@4/61XB?u)^!V8whs.误~T-kW[rFqf0ן-}mݷﻶ ( ȑ苕]B߱C<~T8i` SBHq?QD_73{*QΤ|;rEKvќ~WB_lڲ0C }{]4ѷ ~ 4 GzHL. :B?fipBBHqN-#olk6o~l%^ as}o Tr[jhnZL&3_yq>ras|Wk|)}yЏ pBj5#uj9tj֪Nk`E[f(VXF3{P!G5G:7 Ey]Hp!^!V8RhZiR}BߜvwK|s&V쏌.Jŷ1\>}* Hú.k7t>!3B?&AW<ԩk6uwB zZmYs^{k*caȚ٨Cljy } 8T@ȑ5ʑ2FU#A !Ǒ:Zh>|}_eGRٯc' n{n:Sn=}|- 3з<} ap# #wq@ s!^!V8Rf1VQ*_ }6Bto Ciߺ0yC9889RySBwo} х+;rzrqt&22q s!^!V8R<~ >VBw>rgt&IqD s!^!V8R<__B 9.DZM^owL.DZ xZH^nJ !p# rrPo'jSI xZH>x-pwm;j'+~ +jGԀ=-wx/Їb]!s!^!V8R<@7^&tXBBBHqN x0OBZҩLC kWAW<ԩɄb'N ȑIhy4Uw'_;?b'#~ +jGԀ}J8T@ȑr^#Ʈ1_ ~ +jGԀ}J8T@ȑ9z{1!@BBHqN xu8T@ȑ98ǘo.B?GBj5#uj>%* HC)\@.U7.ZAW<ԩp# r$h|"AB?GBj5#uj>%* Hø9yG#릅|#A !Ǒ:5aCn9]}* Hh9o|| #A !Ǒ:5}* H9 s!^!V8RCiqVSVv@BBHqN LCicOwz| (}AW<ԩ)Wp# 9Ziґ#\ao~ +jG+8T@ȑnh/,9*}}AW<ԩ)Wp# rtyO.vw1G9RySSBP!Gr&߱~|#A !Ǒ:50E rc }`G^|#A !Ǒ:qoRWp# #[嵾MT96Ci8=@BBHqNM@'^B4sa|Y;BO~L8\RyS Wp# {|m *W +jG~@* Hc6y5iW +jG~@* 'DY')x(vBˇ zkܷa[B?uBj5#ujBߍ7{Wޡ' ^Bjf!dEA"aBGBr_7-@BBHqNM@;#{n;<~8uJV@˰c_ s, + 4cT=jLLZ }:6zAW<ԩ }7d7}3=^aj3AK asI Gߪ /Zzן qMG?,4n0Bj5#ujB¹J~ތ{nBӐN[M}D]K{l9V'-}eϿSgt:A !Ǒ:53gj~XY<P!n|bw)Wث,6p>zp ɕ/ kABBHqNM@ˬSٻHGCkx~GƮ,YHtgk?w ABBHqNM@=:zo'l+8T@Q;]6 ekut8i& ] X,~ +jGd]{lz 9x>Ӏ 9^#N6RURySz7^~̿k@P!GB?I/HTln`5oZ:A !Ǒ:5ws0oq@P!G^>ߞ)vB󑆉 /E^fS~ @Ej5q N ]C}B$' GI=>Fv 4$*= z}J=cZܽ7+HN{{ѻF4$*'xMR 7M-jG]A'^AřsT]7M>JIGhCHLj5q B 9f9j&1۞zg GG̈zBR xZH z9#/BP-ǖ /^P G?R;~@W<ԩ +8T@Ю뺦g&ǁABR{5XBR xZHлzgg-+8T@kEuY76;Ɩ7fs (%>lB xZHл9 Wp9GSoƐMdcXݺuqLПF;&ZBj5#ujBf _[.>_+8T@kc;i=tFD軕qrL rM֪#5O xZHZx䖕^{ώ}X|݇_ϭtwJan+8T@kcW}gIA3ŖcSN6/Y3ɃRyS ˮ)h{fj 0` % FՋܟrp=n^8>XLn4"]>y8aB?a bpBBHqNM (6襼7%OǍ,`kN&4n4p(o*uO9z,r  xZHN{F5W}kVjh|"4% 9'Oͻ,rH/Tp8k!^!V8R&ze[]%Sq'ǙEbOi"qipWB2zxWp%8iwB?uBj5#ujb8߬:g̍XyJ\8Y.CNAl?b~*BPM0ǖ|֟5("_0[|B?&AW<ԩA֤]zk5~1i6&3EbKr[t-Ϻ6Gh胱 xZHN6̢{3o}|k oYt-Ӹ!q!;]]-+aAW<ԩAf:~ם`Fd# z0Q.oyi"0~ +jG-.IzՋ^w{; E>3~Ч>$0V9RySfZ l#_2uJ:t~S  d9vjP: H%4 G9RySr:ۨ7r;TzzOMw?u Q0p㧡sfm|L~L8RySCM$ͻcݰqRoa+8z*99H-.qPG|$9z xZH}X_FM$,zСCϼ_& SwJ>6_lk-ڝЏ vpBj5#ujb8ܡ\4Kcrߝ4t4*+ƫeK6yJ*:JI8@ s!^!V8R&zD_}󅵫Ks?t)WN۷ogW}Ӱ^1Vg զ^⛫zrw 9z xZHPTo=z-yV!կgT#5+Ʃmm|=-B)/9Nq>=@BBHqNM )j.&&īlVF=n8~aUޭkN6@rK3Q*N_ .obumz8AW<ԩA^|P sYg뵟z`~y] %zP_ ϱm޶C]"=[s|$9z xZHVx{𢡊 sP99VC/P~p{MV}w~q'ôR!+`Rz׃e޼zkz8AW<ԩ r__*nB=}>,XlX}pP~G1qB_v#=d#~ +jG>|҂=@BBHqNM@9kBuދ^1Dyjw zɰ|#5~ +jG>蚚Пh}b m9Ǵ^vA.>(*򙞏 G9RyS03蚚6D'zO7|6%e~CE>B?GBj5#ujBFk?WW@>_fx׎|#=~ +jG> }  -a"Hr#A !Ǒ:5C;܌ yD!&_owr#A !Ǒ:5#G*ŎBaS{7P|B?GBj5#ujBf1De%1 qd5ɓd,@ s!^!V8R& 5Y}%Ky++ k|ηW>߫Ulpx>r#A !Ǒ:5$kK? `4ӽSD."8~ +jG>~qJ߸g(B |~38T3<9z xZH#-E?Dz}BX$]>pgx>r#A !Ǒ:5Ёc{ p :%+HM̈́|k·NJL ra+~ +jG@A}I؃|6?1πҀiЏ ' xZHƹGVGnmeʳv ( ȑpҸ@W<ԩ?~!)+:pl`7HD? 4 G cI!^!V8RUtBok'__lW*5<= %c =28ZN 1zE5 }kԄ~ (ҀiЏ ' pW<ݻ.zСgg[^A+/h`oE~'"JrB?&4n0)^!?uQ Oj׮G+6 }+_vc"AxKS{EB>R/^H]ƫ}Dbf9&9Ҁ=9{i R& B_J B?0K}k(\>crLr9z xKS:5D k :_[ (Ǥ GAW4S@ _\~@* mʼmcZ# ~ +^ԩ } CH~@h;\>c}rL r9z xKS:5$4A#yOOy;kcb# ~0 %),'kqÓSyV~_z?-.9NHr#BodI@ IZ)~jQWjaݻ{|?@4 G9(F A O)_{Y ;N-&1q IDAT+r9zF!7$ $\x-bx*y?(LQ ["R-:oPd98e# ~0 %),'kqã=j>Bv߾ރ+~%r4Vyj/#r9zF!7$ $\x-bxty`O>T[z'kۅ^[|sp7C4 G9(F A OMޕB>ʹmBZcA]>c9Vp!GaB#KRXN… .7?)C4(ۻ&O̱r9zF!7$ $\x-bxk_װط.e{X;l*Or9zF!7$ $\x-bxt>*ߕзz0=p!GaB#KRXN… 2B'A.z|)CGCp7C4 G9(F A O{Db퇤9 } Џs0(# ~0 %),'!ٞt_zaC9Qm3BOLag)\>?Ah@4 G9(F{כ6?fUVBw섾Ǜ;؄xǔ9Ҁ=@YB]o8""oj<Hr#BodI@ Kwue݅>kO (8͐# ~0 %),g$^&*eyf@BO~BZ[ovF!7$ %zSnsbR]yFJSGB?GȒ >B/\6oJ1֮9(F\cn;lO߲r[a"Eߪ,kWaB#KRXП_myؿݣJ߿X/5ٻ&nHc lP`kχ(ym@[&!xHr#BodI@ uZ\?օްw+; }˂#oD׸ED8tz9Ҁ=@Yr]^?+ćߟ _u+_-oްw"m/z4p[Ϗ8H P4 GaB#KRX1elj^vF>{._El(w-}˟?v 0Hr#BodI@ ˙ ި=yχͷs &?=wq 0Hr#BodI@ ˙ =|hM+k6\>C- 9Ҁ=@YrBϯ~6ri'z#"?gp!P4 GaB#KRXT譣LSŇW!=|N6zBO+JΡ@рi@B?zhU1?&_/l+BYrB~B1DY7}$=]>C- 9Ҁ=XOiҕd7-BYrB)B`7\>C- 9Ҁ=؄GiGǼ.~0 %),(>7U&B/;޼9Ү\_2m'T0Hr`?Wzdes=~0 %),g)U/upGGd(`';x0Hr`Y&){g~r:BodI@ Y }B71l?b~*B?uȒszɦ/-yW{5_FpBzГP,ja ȑ!DO}U:-(odI@ Kzo6a夫ǟæ>v=T6y SQ, Ha9 ^ C!;vԍn4 G# у]a~RrB?uȒp8Q&  a)i@4 Gg>ƋR᫧bB?uȒp89޽ C }C ;v7~# ȑ&Y4_lʁ*"gb!Q, Ha9 ^lXp# ȑ"MQ\?zt_}aB#KRXąFBǍHr9zIK|#.dV B?}ZJ#A K=dB臃C-i@4 Gf(?izЧVHzhpt?H’BP #G# уY϶|t#k7UH#A K>C-i@4 Gf?biO"G RXPX G# CgW/|m 6!SåHF|.0&zZ9Ҁi@3F:.]E4s9:.Gr}%(Lʆz(V=zc]!7azH#A K>,>;" zc]!7azH#A K>k&J7;O,Uqx(C-i@4 GzJH"G RX@/{їBlȾϿSz!jaHr9zSBpt?H’&o*ŢxNցQQC 8ȑHr$p*R %ܢ7 vߝa3 0r9Ҁ=@)!o8\i$Har+Y4?kqػ~X BP #G# FåHF|. 9}ml7Wp# ȑBO I|#UH#A K>9HJ-d> 2zZ9Ҁi@ 7.]E4s9>;T; 0r9Ҁ=@)!o8\i$Har4|-zZ9Ҁi@ 7.]E4s9N:,+8ȑHr$p*R %51}Î!Or9Ҁ=@)!o8\i$Har$mC-i@4 GzJH"G RXf '߱Or9Ҁ=@)!o8\i$Har-[M ?uC^F4 G=%$KW#),\@VBp빇WF)yOr9Ҁ=@)!o8\i$Har_Wk?X,bWzZ9Ҁi@ 7.]E4s9[K7 0r9Ҁ= %ZE"yԣ!Oe$G RXR0@ l DW@h@4 G mRH$=z4 Cz6[۽phC  ȑHMjQ~hB9|ekJ@(# ȑ}*Iϣ  % K9Ҁi@P,%$KW#),\G{ˍC?.7 G# FåHF|.#зV^?΢o|7~"# ȑBAu~߳ RrV'ٓ(a:9:ZD"UEWgS'0 *!u }ܑŽ-ZUW^Vn-#ZJ`.v>?U|goLL7s8tKH{B s8@ve>߼kmȬt1ICq 8"1 CC s8@vG_ʳ+Lj9:@ł@q@L"= CC s8@>D?sLXT1*ғ(B?4pj>3C忇xB_@Ł@q@L"= CC s8` |C7^B̡ c1B(ݒ?Ҟ©%3m_@$J|# )9;^MCgB}L7А©sIFR85` 1 CC s8>&Q~hH|ɮN2pIFR85^@R9S @c%@臆Np` 1 CC s8B0wDo!S9;d~o1`> 1 CC s8@o5M pIFR85B(B?4pj>hȦտ7sIFR85tܼkF#}L7А©'77B(B?4pj>` @c%@臆Npsz$J|# ):)7=\@c%@臆NpG7r0Do!S9@Cv. }L7А©Gd1yn[ 0Do!S9 V3ngşm7Ufg7~ h8Mf>G7/e9񇔗}L7А©] OBkҺMTmB#їWWa$IFR85B7n B{(8,uW_#3#)0!i#B(B?4pj>~!_%?@y o_l~d߸ ԇDIFR85`J~[)$[i_:, ~㤷=H#ΠŔ#ѓ/*#B(B?4pj>(TmE?HtETXJǚ0Ɗ1G~9}L7А©#\(}vG>&84ȹ*}zL9=el-G>&Q~hH|г£S7aA_o,9+v%| *鏞H׸gNDo!S9 (?T^7IvVT/^a7kS0`ȑŗ&#B(B?4pj>d W_}eL\BmPǤ9L@2Qc_?_! )lT>bvJm?i *-#t!('ٟEE? }A臆NpD@lZ=6nE}:zqf6鏽ͽB+>u!S9֗n̞ {`Gz幜0}هjX1PuǞlM}W} CC s81'7{-Yr@$^IzHI1}GOwzB:А©kL6 3n# }>@vC/gȾg;Q"9{RM\)~6B+><iO0"p~s-?|hVŋ?b~\_>G4"nϿB0$nS=LS +/ؤBz IDAT|vQ/Lݲebi ZlFQ;3.Eݞaj3IH{79 nQ961C('J G?Y+Ys(W}6 aꏴ'qCi C@G(NFBPn"ꀚ яNG?w{Bͼ'qC#IfB`8^yL݆'7xKE,ՋV*GOJCɃaj3IH{79tF@ l%Ͽʄ{aL"= kͼ'qC#IfB~7İ =SE\Nm20r?vڿz@Q\'B0fޓ!L$n3M!|b; $Y5,z|cn]GO> WOf< _|7gC)#˝T_*{ hs?zvn3sۊ8;1H$HxTq(lp +B!!=;_b=i,}F>]}zmȨW_gK9;1H$hf?,\0UDBXB!7;̦]6n(#| XSDۺ1G'gj!?uQl`YB!a9Z^}|͛+YSC1EDW:&Ƅ9=]arJM!!Zpc>?9Ѻme|S%)B-鏞 !ic fE9"&p ?a~|, v,"ZGw~/9vcˑ!);> OBXB!3(I?6Wz,z'nϿBSVCIyVM's0W}Šra9*Com' ؿK?w{B:"BXc2F{C3`& !!`g[+z_!C+B!5F1ve =B0'uaE9ƮNX9-ϿBSVCk|Q:V owxB:"BXgVT {T|MOBXB!3|>Fa?7'̄ 4ΞϸLqM,\@ QN pSed BQz jr߼So2@0'zHA4 W+ar<>< 7XWwUw)~'mx/;ҝߩ.oN$?@B 31=A֑ǩ;#XG^۽)g$Bd7oDXK=yo!S3XOω3_<{c{2:=p6Hysw#/)A֖o^zeBZ5w2w,$+gشp?cEC=h@`_ơJP}3;u't'9P '3{d;xZzp_)᭭ }Nr@5_P~Ѓ3 O٭5@6#5gtAWx Np@<;際ySn͚߬ (֬? &a>i?>D\E_rzS.o_);mBl}ǛE<sOy>x7^rc2' %3WXps5Ϡ׍ğf+M1l.[f^M˸CʮaMaY +<z'8PQO *LT.Q\@P\O/jWazyom PpWAv4'7r7mzQ=rzSjaBܳuia5>O'_孏}ȯǕ.u;) Z( 컵o>SzWJ#-$TQa* /Ь[aX=dv(i[N7f!O͟Y i ypfйS O<}/~X^osb sF?>V"Q@h^>ZIE3K.SҬH Waߓk}; 6^mSn3),1m~XПjV-m5`I"_.u3[8ݒ/cG\/)S!=wr-IѬ3{TᶁMڼ 5Boܜ1N7gfnX,ǔTSxJ~Ogk?&8B0mQ2ylKY|2س_<~; $\}UJfUm^ղc 9cZBoɢ5FǞRXnRr{/_ﵓky@w#Ͼﳓky@<|^?Z%$y͡/m|FVhN>K͛ F=w%79~B_Iexe^-z}oU, >; GvYvQu.?dAEoomezuzr05[ar<2^W_\C>ϖT\ɵBod}m݅>'+jsK[A6/~0=?AYc(β^xx]30aA"w$߇ZxBC)dz_9ﱓky@<|}ak>7ͰU=)[zwa$͚;W!QCn-/,<ss`,W'JO4o$O܇^|yqE܏-[+Em`(; K)G*ڱ * )Uk?)uZk[>r~d#asBoBo_cB/'d{Ͷ&ÓbGf ol"2l.|; K -7?(.l^EޔRY{KA.f;]gQ݋[d^m+=stc'@h t;vjX{*R{w L5wͼQrTZ_rJ]iwȶk:[c~,Xs/ի__SS)4Oo5B_-WjMv_|n5P/f)9+{UmNָX88 S^jnqGu- oes퓆ImqsczŻ_޼9[Zw͐At,4OLXb'Oyf~*du[= ިjJ/);)ͭY"+K)O߼ƯMx|.u)azQp8i;7o}QzliiwȸkRb>bYЯ~zv'׷eqYieg{Y|p쫇g FK\h/[RܒwR2 a;gůp{$I|ߑ|RIV-L9SBԯi6u]IBoڜ5-3Źfq_`9,[Wؕ[>rDžyJ1&c~O>!Ket۝,UsZ]}OⶓЯЏ]34{PqbNaR.z\M,|Y lNaRS跗:ӏx'@_{DeC ä/Wt2#LrEBۙ&Ի&f(b݄hkmI>h=e X7/cx`Ao/A&.>Zn ̕( b݄ݵ{}+Nj*{Cг bX7X=Af B0cz` 31=Af B0cz` 31=Af B0cz` 31=Af B0cz` 31=Af B0cz` 31=m{~ݗ;sޘ+?ڻ¹/"wz¾[Q<1K~ 2eōJ"&TϢYz#ԯ A# ^ӻ6MKquj-U͌K-M%}OYۋ3̄|ϡ/1>{e2oג~bsG#V)0Ua`mA|8R63zS{?l%8@eBߚ3Џ1WBuZ)U3!k BߍTitY [9%gХQo!~b:^Tϫ4'?yX,:ڄ~bBOMg[#6w4gWA~2guDsIp{BV<zEw2ϩiB}8@fBB?\W i8} ` L%Y嬗л+'aBa~2kX4}'S 4;?w>5-WX`9^pB?\IYq|X4}' }J?KOM z30{tkL۱{_}GJ\B7_6[A8 /?Jٻ?.>,+scznpzku+uXӿ-BJg-bBelEW7mq讯ЛO,ɬ4gՒSSjhF?yu"d+yެu5 / }Q:{7j.Qx416v‘{YPOoZZzswo.\m叄HYdXѵj{>y{ M W=#džR^36U ק,B3>W0udJ ɧHQϽMxCe\J#9ϮPz_~@~g*p_}B\Riw G:ZO󗛠NmRa\M\1=c#` \q lG֗Ӛ&+ v4/imyK荧[KjɈgUMSCNMRf?ax/.^*DAli,Ay0cu튏.oU}/[:nFۓ{n %ٛ߼W~1SWXN` {7 }kRTc S7[)۽'Յo怔B6z;gnL[*sR }^Jg-bBeh]$M >M;(~,>BoMF}tLPճB੩|C3̟CO05B_5*.$?0N/jJ9V\M Sf 1) B] 5kW*wQ+ u }CSMW[['?~׊Q yh8n[4R>:лgnLA6׫a. ʹtيP[aIcBO_ t둚TճBvg#-Ժ>= IDATZ:oIRNXݷꮂc8ĊWJB%bpze%{8S4TV#oLkKZ4wL,kY,u^RER,(&ڿz֖w|vj&*59G>VT-+Ѱ "ő+i%^8Կ8} +Wn֠ԋH*M܄^2դ] (PFХ&czF8fX:eU*t"f)TdImO^B?R %OMRm0?MZT֠N2_ 3f!B/ 4G ϻ }):oeF^P3\#w=^f l?K2._qzn*s)zkr,uB%Jg/b*»*rx̭zv~h!樮S!Ԥ`}3LCo06iQ^گv[,t+Kz+Ʊudd*ZB_Jm7 +^\T{}^yf,ƾI@ivMg>[BoNb5˱Za* Q5T:{Q*T!7:Mh>Bo82J !&+0}ۤEzyZob^cw.H?G_ '_w(Bq9 &yLZl}gzF\5e~ŨًXPUgӄiP]X4Ԥȴz70~>B/(گV4nYéz),=X_ػ!'B]z%Rzvs⠺|]U}#MNl SzFt f9X. əJg/b+K2'HZ&&4#2q~$#=NMaR^Bυc c9B_ُ#} SB*ƿʣ B>!5X5Wso_Z,SBo)TYN< %?>5IgK3zG_W3# c9B_;;0X//_+l*5З-vsfufݪO5=c#` zmY@mЊBp@mx 響C#gl,H >ש^%#//sC]UWJ+Q<4o:%=c#` b\]`;^Rlt"f+TVDz Sn[2ByjjЌv̡ }~a,Iy0c+uc}>/?W_JOF\x{%mwQ^)NS(#'lW( Ƃft"f-TVt\}DE7[k2BwjomUCC}^^؅$XW-7Y- }9q@Osz1Z:glLA[kc{MYpS*S+"in_i"𶕆ӭ`M_NMJfxa?G-m+Ȣ盎Bcc=>[KCo?&ۊK6k}XNޑ}`ZOkRii&o0S-Ou11XZ?ꊭYPQ >Mb %5{ !&U͍Ͱa?K[n_y \X7}Ulwpoз7+.yv[fzM~ i{tZjMQM={3KC0BoYη6Hs׿T:[*s+::rh%c}T{ u059G%[I҄S+>L׋ K;e]xUs䎈eDj;6[^(_U!{ݟ|~Pl?Y9hclryeOӫ ;=s#` \R޲KY(jY=* *=[VWlEV:ZQyMl/4BoIZ{ }C3̟CO0~B_t(Hf,My0uOp }3S_Dr.m:A,FEs{}\~^UN~#%WOؐ\36E-5Y軪,*C1k2Bz)&Ta}^L_PWK zύzԹɫ , _)W0З]B)Q ˗ߑ!-4B0NBoYBo{pAPi͕Rl +R߾ӄ:>ЛS%OOMbsG^톛Z_%_j^ ~%嬾+Ԛ)F GxY S}نzωcW+NF[v4IxL=7<5=c#` ܄X0j)FZҢo}/W&}n廭}ߴ{l=WVOpt}7uB 3~ T`1-N%MR.y ~*c*4qIX>w_<ų3Z/|a_{nBoHBW r;lSbQ֣ ܔ#~mSoϖA}X tޔ,xڝCF󡻼k\ LJ]QjVx}n'A K184%@G:}zKZGhv,kϋPȲ>(ty+s*WwCm}N;S9N(daBWտOltw?DzpTǞП7xЌK[]lElQi#]7Kw v#7rCws^v h{'eؚ`zꦨY;#ya-#Wº *Fյ"#JY2bc}BX+[TJ|>y3s лKoV]jZ e,LC#MvIuTGoRL%WB/fZ^֤솮VI7qHֈq7bxq|P{vxyOm(.~oќM{DGweٗoAgopj W!#ya-#Wº  kE)y[!^%Ao(-1t KVpV֯K10$(Bs1 .N(seiBԝVќ?mY-^J}~`\ݼ*֤=U h[]TlzɖazF,/3]ŅV."j7tzoW_!v̕Ϯi)قgT2n8r* iTXm+ /_>W[ L9z Ɣ|YVl\tW%X S&IP紣z68̖ }CzQU\BO_B4PoKO07Y&ja1Fi#"o݈<4>ozi!^C'4r6΀KNP zZxsm(.'HiI9d03p UX_ҨVW %+CPa; 9V4Kq|鄞A{Wx$u1 }{Pfz }", }sX굏խZ;'-fۈt#hHמ]L>ozy!뾙'֊;*⟜#rՖ&fXi:憭\Hj[ }[Z? ȥ֛W(mB]Lyu)ϏFzQO'>tqӎI52[/+oR\^'(lR'VˋTдFY~FL.-^^H-&k? bk>ai>ً?_VBHS̩q`fʻ~}WV5yնBQ<uL9İBӒ}*BIZ-چuI1x~4Nw~=C!H(з e,_ ml׈:x"îB~Y 1em6b;(ET;ݵ'mn},BNZ)azt=b.Nm<,gKwU+p~$\e}7QaP*Du"vW-pha4ݼ^U鞦-:ϏF A2 J'O2_/s1@{ OеZFL;%m3iЫ `'w'gfЋMVV_nB/f3#9!#Wں/Fյ"mӗZp ȡ%*yZ,LS %scѯKz~N +2XoI }i(mpB/Kz.7RpI`N7WzU/(ѴZFLմkOLnl&WjRז ޱZMU?QH\3n:r%}$*WiA߮D-1дf-bI2k%8is =|{]P!P҄kةUMG56Su1mqsS }[m9w'+&:!_X n:re}*aBD-%P,: +F[*> D|[}>tqB,M뛐(O(#V?z=Nl&^YH`)@o#9_KV9e0/li>C*WX]+\zm%rz }%Q\ }[!#O2O& 4Z6?=AqԶsut]̡?P'k'+ (_o%&ğC_TM,La+.s+a kF[Śz}%rhau }g!J,bݕ{}9On ̡9xΡ2O&7⩽.yoݤ\r(boԉEvmĴz }3߶R^q{19/75(V>Mi>_ [y7i꾞 +ܴ,p*CK +TO4\+^XhؿhX3HƤ{JBZӎsB'zj}˓C{.N/'m=FNY>FLۮo` OԬX#BG2۶ UݒszSPޥ>gwsCFsVMGipQ?ͭ+m7T"Vqa(L;[|fuI{~4N>!gyo}%^2_%GoN+=|A# olK9vV?F4 mAܠKb 5֭TK|W( HEMMWVqbC7Aa2X}oHj[!. PEmB($ }2eF C 4C_Ihr; ='$fP]2y)׽R>aZהut Ն 14TnݥEMlIX^\H^Foѷ2!G} QG ky7B}'V'-o\Tj/Bؖϸ1K|鄞Ao$B~qzN(e1BwwsUJX(5[dWhflߟ :?u Ն 14T.zF,/©/vVھ7v rkV[ʤ4BS* ky7B4*{RU"Z"%]7gץ\>_tB W6tqӎsB-szIE6[כ—V%W녺{zpIa/{BmooPqyKiҰnIB/,Tw>SFkN^}./\^|f%-&+k_ِm}Z/Kauf07T* iTXm+r\j @{aw7U-R$wB$+ش.%vzg \>IBN;B e,LQ ŖmB{۫FH3?|x@5[赭6.݈bN KZ/T7 IDAT6Y&{CtUj7鲾y _ި }Ӥ`gF3ZMH mgLZěټRWi^agKUDxy;%Jyka]j >uB >M:t[4uӎsB+=W5U[&^;#]/5og~W J^jboܞ_߶Ҽˢk v йf{R+T}zFo &+_ztf0/}e*GM} VwK&@{agKU\4UՒnەV kH' bz?IiK9̔}_JewP֟~{WB}犏H[>Mܓ}I&}Fz7~rzMm7bhڸoDЛ6yYnM ,OA<+n(ozg\7(Y{[Jii^;Y/ܑm9J_N_au(oϞϿ*zs1l/ B!^@=@"ֳ ` 31=Af B0cz` 31=Af B0cz` 3132z[.S ay@X5)4;CM"/ cHayhXЧ+ 0zOp< , kR{E_2?O?pOO<$Bay@X5)}"/ cBUq ߱u>K" , ѰzrlKP$PzH<> #.Ez!)bi ok-_u_ay@XՏ_v51I3Ԥ+H*JoBUٕڿ?v]rǀ< ,˃DO.kbfgIW$P| /&>=/#W峯]/tX(KayhX8)51I3Ԥ+H'.}-Pa3o 䯖XkԽs >< , 7zBkbfgIW$N| juC/Y%3p%3p_}-OIC/HL7mI>1^,5+3` 7Ic֤Va51I3Ԥ+H*>،StrdK"+X2SN}+b51I3Ԥ+H,NO ;KzKEFcNaN?&K"GXC꼇#D , +|񚘤jRG~a_Yv'K=:M̔?$B95;;J ѰzgŻ54^4;CM"/ AsR}[oܿ(j޽ Aab[|X)AX$V!ya1{xML 5#0By7_y>5; ҧVRՇmzxML 5#0/'T [7闔AI;1u+1˃DC1K ;d&&iv{E_WWil]R'FyY5J: , XL=^g0^4;CM"/ @+.j7VlK >oO9 , |^񚘤jRG~a_ ּGwk{`+^ BNa=Fj a O>7I&^x| cЇjXrR aŗȜca51I3Ԥ+ >ЇfX_ k4zI a>^x|5 #ЇdXSۼB a>^x| :} ABzH<> $DR%5h|*jOBzH<> @=AI#֣aPTY\@SG~a_'}8)uk&?ӳ< Ч+ 0zOpVϏ"xZOBzH<> @=AÙ<,,(ZOBzH<> @=*d9j^SUb2ꑙg͊aM]A10/ gFy_nvʿAupzзA蝍]nH 0zOp& k  m }p ޞA %?mDז)EZuNszзAze#iNP 0zO(6 ^ nXY&ſ*a. 7A|a LE# }D/hswzz5z> 4 g>A#| һRO:FiWE%T%E L~ϑRzY\@0R?Ϗ@=AÙ&,sw_Y;޸oNW>?'_GL_'}8~@?~FJ}8Yo;,xwj BЇQe"/ >)~B?約ѯ,R&zeWM#H_'}8խ}~p?zkceH==2s3 5=BFG#0zOp=~ }pzzedlM>@/<~iBEa$qTYH FotzeYf'Eл }>8,${Ї3nX>( ͗>ѯK==2ئ$M6Vint#apTHDz^1ϧ_G#0zOp Y~^,Dn)q|%qTHE#ϻY9(,H>$zωf i G~a_{?Î-t Ϸ>?(k6||N1@=_5 i 3G~a_m׼)Y/~'a]~_餾>K&h BL0x|Doy썢~ {| qg?үiayk,'ٜܼOWH<> Xow[yNПB`|# 鼏G6@ٳzBXA y'0ʘj 7r~OJ6%~B|+=oRЃ)#vsrW%MŗzLJ:=+P!Tx|}t0Rje?t˃o?>!9>k>}0`ʰn)#}=[1ä Òx|we>~a-9& dsn4E|W}e.#8} ϧjpn ;-,G婕޷GfBfTYivDCàЗϸ3kͪ`ʏŭGp.f6Ї3XX=o!>azC#jD?fu>[Z 6.p ';צЏlL*wsЯ^{zuQ錃gj=jFBZdF3$B/s+3NrE荏R^a9>Uz|燑IqzhVGo Cx|}t0Rﯝ;Yv>桗[=e%B(1RQzPp.郢HЌJgI<>. ty=)7;YϾ7 >M}~6s+0"}HĎ0RH`*KwyvzB^bt. '~XޗöTxد}ӡļ][,5[ЃD EbGQg8`"uWw^MozSEDÉV/.P3g4)8 =H4?{HձfTY0 t4mz92{嶕} il'zX>^Y )=#w@͏4ςq4h+?_5wP:[,UOC찼t^7٦`B?=+0 vS跍>~njJTL3$+$ߨ^x~t0U7|TqsoبϙA!rX>f_bjJC9 =H#,3c{ c>;gjڐx|#U9&_EL.|]7o~!z5 iBNܰB|^b6JY)(=iuT7CaWYiv1zEK2x~FB/Z캞5szDX?k5?xc^?gU) l1H3 +$I<4* G|a+XִS}MkJx%φ0փЇ1,U&,Zc{FaAa |Gi o1>_zF +䫆O<4* G|a$+k>./M5?3 ҧb73Fc/>y˲>ћzִ$jdfW~R92&iv>$* G|a$.fЗ_>R }ݨ<'ZX>m/q/5)Ѓ/ٿs1I3 +.,/F_I MGG-=ri*NrQa'VXQu~ > gMgVVW9}> a3*cfgAHᨲx~FB_Y+'8nG#),GwlS|?X{ϚjЃj4>/&fnAFЌʘj{}%qTHk"Fz4JaA aX}97ݷ Q4;C B)U6 13yAፖn~oV+~?K D m}$YS=)hc|^UQ4;C B߉)U6񅑬п~ǡC7)Evs@É{gQz5szBXDr\͍ПmFCfT$Pw*gHW5EݻBN|SHcƭg$Z㛙9$3*cfgX;]O⨲0u~_'}8ay宑Ї;szDX59߼戣Q*]\ IDAT4;C Bo cVBҷBNpX>=:VBj=kT0 2߼+G{>+6"秎$* I<rn̟{H 9^B^:nB>=k<0 e5?f= gtz B?,FrBu ><}YpM胦{F9 =H#*(/~^ǧ|{8̬} #zz Bn:B0JٳF2zC +tc9S c:?u|_ }~I| DzFݳFQzCR ONHOB?0FBz].}g'$,<_BW{Ѓtʨ77orzz =}t /II:pNVQ^=kp0 Ͱv&Bfh0~A$B BNla6|}xQ=k`0 Ѱ&+Oco/]&|gЇ;,gY=5)}^rSUS񅑮' BN߰>A[轕rЃDÚ_KnL gXF<_B!=k80 Ѱ&/{wYnD&cOS?&񅑚|G:b=H |(6YC)=IXG^$8,$ #55=_j epeX:g8+}h9 =H"00/Cn:nBgX.>?B/*0"szu`&9=9G0 /Ԅ>yp:gL!UzC߾k> }iB BoXϭO$_=i jFs^# @=p]Zؚb)&c_+`>6^R6 YODw'F>z|UG|a xAtosYcxFaAaV'777fӆ/`׈/3|+Ӆ/ 0FO[:0?)>a}~ Gu>nϊ$jMi ]=i<~778E;>t>#zNg1zC k97}XR ZA|a8lD[:kv>Yޜ]ͬ@qkY1F9 =H4,a$$4 # w B6-Bz&q#}+ЇqB[YFaAaSnxDyRl_eʣe?~wkoKFx໣>װyފP0 Ѱ 4;CM_wpzn{|K($5ߕ/ |_Ȟ82MBcX}N?P 4zC +͔4;Cd9-S ܮ*]M%Y*Ϝrg_f;D3Aq K!'ϗ ]J@=+h*=IGd1*vV4;CM+yހΡ%LkB|z'EЇq i~Ѓ$*m{|Ϗ;}I% ǧo _u }~cv7XT%}w#e0 B_l|$z^H!Qm~.zޛ4_WX6>?GV^FaAaM BzX X$_6r|2}i̡%D>uNC9 =H4IAS~,/o_9_[ߴrU #>a5>?#^a FaAaM Bzi B?ǷWnQyy>l~ԏEñe} kP0 Ѱ&OWZkt Ҏo2_=X_x`=''|H B-ǶRX*szhXЧ+o\CbDЯvqs;ˡ3ު7> }}84:?NΜ~8w4zC6}PMyP6'D~Θ:Du ~ {l]( Ò}8&ysX#NJaBOI(0]$F,?_wf{KZݝx_1}" 'Xu@i'ٸ^;a̫TwZGģa ]FaAae>/ߌDf&o~AL_g_Ygccͻ.>VM}8yەЃ$ʞ7̗^sb{YL 5I AǫkV'z_SEZ+[yVZV/{-ȧl[%JAz/\Z;zV03m&f1I3$+,~S:,>Ǟ?w{l$]S7`-G@ k%>avzszBX,P&f1I3Ԥ+l_6VO b&6bIƬHS:03u/*kfznW1æt-#R$F k 2OC)5c5?P":cl[|(6>1Vzk>m겚_VxT ާMrfY䙄65}#^iX!f??hAO01ÿlm%(E4Nֽ}6k^3aEIy>UouY1ΑNY}2kQ4$u6dCBaGeYuєqzt %kօ-lFX&1d,]zH: sYZTKr|ޓjs7[+/|TO裖Da9l?{dT : 1Fɚ>8ppW` ;ji(Kv֬ADP3٘l -iBa޹)Mdgՠ.k^57A|8j t-i(Fe:К5r&1el H/J'MWD7Q /<ٻ?qA裱t>@X5qi(e:К52&1%I#$S{fc7k%)Ej~B]&*IZ~_xvʃ7xhBMQS J; e pBk@"6>٘l -I7ņstgm0{ŹEID7~9N#(l6pK!Oo9 %LW.yww-OY6bnᓘВ"YL]{]L379~tP yEix)_P/|Mhׯcϼ 1x}GMtJo? +LR^spDm6t1ZR,qUkFnld ~_=X lb>@X&w{e:m{pu #';|:GDHQZ<Ua'݌By5 ꣍QyUz'fm*"ccL># }B|Qi+#_( o ~.zޏ)NQS ,;VwEp"jV]~Np> W=YN Ʉ~VҼM~X?(zGϚl>@X.,J; LQ84 u ޛ:m,LB'gd E?t9뚋R!+GW*BVM_l:&AXnz#oa1yQ5Dr7}Z1\V!1П!Ybc:g-I^CQJx5 gXm>P~]л j<aќ>tx#* fst6%:nх~.QL'Qۑ_̮)PW_+V;W^b vly5 *}4,b2jVUһ}br1~&~1zQn֣~" 6,R, Vפ7mujd^$,cʃB*" UOt7ŎC DQRX65zdgy5ŠbO~ HY]u#%*B:Zt.Hj(":cMG}GMb_PzW 5uW:nC_ ZBznxKqFx`|_\fig:脾87Q *̫vܴV.ڏc#fF3xN{6 }]JoQ݋>@X ٟY˼ Yac u }y|j~S:6:l_AFѷBrWO Ks' J KyzMd5m{`; v S>/=>_~t~`~:Vcq󛘀7]~)/ܵS\.D}GMXۭ"YR_nɎÛ_qɯ#0aYrKG[.8j @0_y#Bm;A'1 O@68200>"(w ?VDYʓ;ծQ2n;dJ?i8jօyq?N܍BA!H猀 l{}GMt~pDԬzLo_'ܓԛbzLCBnRN)VfCe^DԬ#WZlW }YfchAsV9Mw5#BR}j1U:jVҏpȼ YJ~RvGrV9\ w7zmz=ocg8|GM +M?˲h IDAT Y^kpR$igCYDx~v Vz݇z_['^Im]kgΎvfVGVzQ5=zu~E'o*#<>!gmI|SD_~_Xˮ2)8j@JXiJ2/"jVV @CYAx~[ }]w{3<jeYJV3q+nԏh2/"jUUSh=B?}S8<o[ fpݩ0[$~8j@zXkQzQ5誨+BܘnEqVy߶ķ5B_w[ymVllfIVCJQN/"*fUEH;kl -khY*#<>gmM|EM7~17[!quGM֤J/"*fmސZoVil2qVV7z\k%9d>$0Y5)樓yawӯ4 5rW}eV1v?DU>G|yHz簚ЗDB̵L횐s İCo2{e^$Ԭg7VlЏ?RXx|"*#< }cc`Mˆ }\{k26Q'cSr9}˼ Yג_hhp~=ZFmHCʃ/Bt豕?>0#mMg_(VȫËnЇ5eLQS F :w(̫UU؎>I9ϏFzyϏ(^BBLdS w}$M6#<a%0uXfG}˼ Y oZ_OT]6B֬Vfchk>KOYiB_(o؋do6B9?IVӇe(Q#od^֬ D=|wdJ2CKTu^#<6M.cH~Ջs7o H',A/pR Gq`;jW?Szg٬p%E}tFQ.^-}E6p }Η6'6U_2絩gLy1&cV11cqu^||iėGB{lee冭Y@y =#қD}nTWJC~wLάc"\ bǴ]yay_ }.BiWm?w;gB NTO*o%$'"m5+W1}=H3öǗK 7^a)/Oy'BBn`z kO-֬'*nWYDfchAj- ;|zGMڙ GM(V@e^֬ 7~3b?PѬuۅ>gV1Z<@˔$914ϸ))[Ћy5 JdXy(Zv#mN\vѿѸ-i=ϚxLd6>&2a~c-o6QIV>Ra︟ 5<a%P8,˼ Y'l\/fkf%^ϗbKi>R:!lGM\X٢YGo_X|k#b-v*kF4Cb? {yeGM؜"5MɚU;V/%baVⵁA~[݉^?i,#8p7Et^v VQ(Ynmks&Zx'z}JcnS_Bk+s$_H.5 czuʕ %kV%TKϜܦyt9*ZZEݏC<0,Y7H+/oM~{T#U31uaB/7 KZp+ ӗz9B ߟ?ܦ>>*yV1΋O A賠Hk1B'] V~ňj9B_wNjMάc"\ 0Be~(̼0J{`oYD`Ty_ėBHa8(촫$ I闤x YD`Ty_ėBHI|IcUJ`a+ aʃ <D }Df]e fsq8kBQA~Y_}"Eu|I`UJ`aM(^=FeA|y _]aJ br# ZǨ ,/> }J RZ? |@1>O?pJ`b }z4b.WTrnZkh+ uq:+m[9RJ7A=Be1m|_kCS|ڕa%@X LV#}z4Odj4ڕa%@X LV=`H~ h_gORYK'B?W] VaZd>=Be'2OzJ V{#y_}}" W +JX[XIRA>Q~- +JXoX}}n>+J腅#U&屙Bo~?\J la1=BQ@~Y_)ďDA +BQA~Y_(w|(#K"] VBǨ ,/ ӇU=펏D,Џڕa%@X }z*˂=Be1b|/iu <UZFAG"\ cv%@X V}!̓-FYa6Ouvs#K.1@ +BA~YOcFdsD y_}&ݬ}$b >+J(1 p%@H ,F'2zmЛ:>dBڕa%@X ls~sD y_}(jv#KVTq;p"g<7pL+Be1N|Ϗg8:j -7HĒ=l0ӎi;r8&•!̓@@zc[O ~nW4_c 9 }aK8&•!̓@@eBOc͏ +a ޮk8&2CV!<>c)vXv2a%@X VBīAznl -[/>Mzc6D,YCX Vа'6빁c"1Ho#<Ɗo" K@f#+J@hXX=y}Ld6Bx|BǦ }LG#Y]8BOc͏ +a /gKa)﹁c"1Ho#1۽RD,@ǀ +a xNe~5J @Z'zm᪊aXrЏa%@X VBzW[^Öђ=XkDB_wѨO?%1 +J@hX?Wa˯=XKTB_W_WG"Dǀ +as1Z _ėGזՍڀG\/k{3UIsȪZ8A Z'zw5\zG/@$^u'<7\XKtB,[?|Yt[IKQ|XKtBXzd~K[?yYtHR|XKB[uqB#'Y 08ϴ3D=N@`.s ` 31=Af B0cz` 3fB?ēƗ\fX\sӉh/4%4x(VÇ@7'O,B=>_4/W[_5^^{_wYs.;^hR 4(V' ='O$B#>_,*V__-N+CAAA5<7BjI@?_zN8)W|4H 4y -tہ_kˇ"t" M& > ='OB3>_k \[O;,鎯ڗ"ny[5䶿yn:&& |,JzN(\) gQ!^}д_yyHsb`nnY=h_<7BjIAas,DO18/Zܗ)\Z諘)U?Qc[ԏn_P8M'ФФXDU8pq_UY2oB_iislzJS DT+pR&3/9'OBneBk,f-Cc;vo>\ D T +pR}=lN8)Wq?.2oBiwU틛`" MM 5ϼS(N!iR4L7m\DWM5 LIc(^hRhR~(VtNC9y*DOЌHP 59 }Gχ~5)6?7gvOND{I١IXA]9y"Χ!tu\7GP7g7dv[nʿ9N;o`Dхgm!|BWi~i),ƃ,`w7d sӉh/4)+4+ ='B48,,Dw|>귎%iIk}=禃&bAtIG)DOuƱ>KG?WmU i uRyn:0hRa(V¸)'q>%q_ O}&pN9픯9q hRPooN0Z!|JWi~QӃ1K}Տ֟lll}1.|V67& ,'Q8q_u+?QZê|bhDmnRVhRCXA99y)PűPlgKªgj `, Mj+eE IDATW8Rq_$ˮx,&Yϖ;[y"VugpD{&e&5 Ac)DO8/UPe߬ދ7 yF HN;?QFMj+zNBMHZ4 7jƫڽ| O}~~LND{IuФbXAM9y"ΧXl"R~h.f,ߌJliaWmr{Ȭ=@LND{IФXAM9y"ΧH"̽߳Lѭ}]|5ѼoTU ^hRKhR P HI< Sh~ԿoRUY?Į9_$Dr3B7go4X ~?mit,԰ynBCJb!b9yp"Χ"yUh9/68.e-hs]²]X MM* 0gY8bpGD3wƃ57y -3mӯwo!jò]X MM*M[q>]PU\_\oVCV-~O}GHmX MM*xCcOa|bq7wjz` 31=Af B0cz` 31=Af B0cz` 31=Af B0cz` 31=l8gwMg;'V~bUX]7jx Æcxr z5-'7āÌAañ_ 2-BF";Æ~ BFJ] B3 )o=W}5l ӫVznzplݸ@FÆcԿ~`M!Aañ^ r;`tz0=l8KcN7?[~#Om5}W׫_ FzWV;KBNп@7s­J]}Neˏ._Ks{_Ϗu+.p Z7 x~U78ؖw|CG9Ww/M}Wsߵ  'bكZMn?j̽*qBo1ZHл/U۝jK6Z%5yZv#:6 d {jBUSϏ>Q}BxÆc+)o灇^R?t.mmT#וR<B__?s8Un l#B,PNߕj܉Aa1/N=vVzۍRzvRm]Qu-HAa_ a˗\s8Z(zz/m_ l#yB./V=j~\5 X.ڠfljk?D/_?-= l#qBRg=Wp^oTs  ~)'Sy&{,}R}vɏj+Qj[_fMPk06)?^͏.n۔1dL5w_ /=~zp;TUkgW/SP=o-O2U}E qW[Z1{cH/.eB?~~:F튕4S&ձ׎FS6Iy09+ Lgvw^.le1wT+ɩrXUe4#T觨πqgGc&d}D=u^y4]iqU{-&Hk7νS~L#{_Yׅ[`M:6ĺI]@1nk HVE~Mз7ߛ9@oҖY`<0ۯbMJD?Ux $-lQeiBnrvB j엄W2=x 3`BoރQkvX6e+3Gg!B? s´=xl?<`m<_Oerۗzf%zqj ?Z?Xg3?hK/_^vxuqdy:\i93o]sξ{;JFGѿE\X}-;q/C{9jtCc)Ku]N]\3%C'ZzVe}(P+ -JJ蟻jld-{KPqMS#=0%(S+S/UkXGGwIr)|\);wO[̎#Us}Gg{v7?ҽn|y[g~&Վ(%ڨ([w*hN'96qY77~IOW-MSz^>ZKDj(oRa=zTS S?/F]@ߧI+z{v۬Fz`6H']>^xHƾtWOVmWԹKgv|=!6Ƹi孺Y|Y c2DvgrD5_aQ?zBk{X7h͊aLsv[kj5r3EzJDjtU9B~1 T芧yKL-3}{cE/|5s0#9BϽҽ]ܾOz:ԧ|4>Ǐ#?˹?=k`BBoTq~\>+{ΘzumΝrJ~ F=G U&bٔ!va(A U3W3r3EV]/E#ЅvVe*DW<ߗVNm34˜{c+_Z#=0#z]{ѷ'_Z d_Aױ2j9TK[\+Z\t^{*{s 99y0!ͤeyc=QTn+Y03#ʑ<'?3.Sg٨(, Ub۔j?U 5mʋb~.:E]>/eG#^ *DW<DKeL/?{v cTwcw9oǵcSp9}Qs:ϭ˭p^ѹ+ngj[WC\}"}㟲7ҩZq6,!ZzK̗Ag#eս;|E2s~}R}CM sC%ΔN>nX;(J ySO^U!ixLe^}e(޹ cqә9>;X/Gb2͙jq6+ C]|Nj7[I_rN unh;$G{1:/?KJ՟FFG+Q;^_䠽t^}Cݞ2 yOlCF3|q9H+|~JfDakzY5H^U!ino:w7u]ot xlbƼ-K?}0EUw֮U+UûS.s_zs̍'DD}S9cMo[Mfۨ(s EKf<ߐe9]Us)|^+I'0gz1rW؊9JeG`3z/ycpw\kt lЛ#Jo'rwço"s"e\Yؔ1}B߿5u0!Wg!Dke^'#cZCo~:v~ݘxj X7= G+/r^:x!u z>S=Z (kB:Ћ"YzΔa>QyV XwWv~oc׾{gF:`D6X۪!u[ioc \#aF9x 6mc?e/GԂFL6^NZOx8(ȝ[ )D=@ѳܤSϙv@'mE ЋQ*(M;_]_N;F,G߯F:`L6Dꔳ^ҮA͞k9+z4 $(ژ ?zӑB]RO'bt)7y7?h};w\{ފe|_t]m+WHs3zEc܄O$wU~(  eJ|ZwzEY#0& ''2NG }`>nlJ̱AB{1_rŎ$nGU<D9};F#Lv5z0cP;{3^mQϫnqoSC fg(o/z16үlU<5[2@},B~_z3X lЇo oC<9]{&ļb{odޢЂBA9 kmGzz% oBaBS5}Wa4t\2m$fo'q3Oz=_l{S1 H4`L6I3g;9 j̍.Do B_ȵM\pL)۽Ƽ)?p5Ӈ(ӛދD =7Pg`a^/{O5 C\^ SiijvIOrm:xfc~A\st &G IDAT lHαB[j[˳{JiBߨ@&F?@6џHO :b͗"z1/n]%+/r^\wHgd#"tn8xAr1b Ϥw^Hv7Zmo c/2էHȦډS o676.#I~cӷ_^q?_֩&z*DH zc꾰nEtz?4בSZw+Y-B"bTXSR{K3bl= }n Oޘ ("BUţv珨_B zW}}I1;{"9_VzD)&B[Gޥ'-'*QW;xה˒ nۗ7-`"Y?oB/|cƴ;nhOz[hU殍zBwn zs2{|'_Wj 9i+WOmED5+ߠmáeb;bB *DWз:ku:FQϤW2}'BhG ]^U!Yƥgn/Նܫߦ-735HF }\jP۾ubޱ~ZF軮/`_Ψ!oW*&²8odVx%?{_;@6ܽM7mĦ?]mkgΣ_v.(V 9پ7dH0z`9SF\n,%}L/ձT[>޹7b ^dM]{}Wǯt}coy5s0c0 H9ZX<}]}MPc3NFܣsh<cq|QRQpt!_B qfI<~z0w*GlB?0 }L.)9F@03kf*(0tЧCtT'# Gb܅G-O(_Wg9223e(nH->TDTLP >s/ F,'s휆 (B}m7~ JO+n'pw׏;3E׷zOkWГ<G; $=Af B0cz` 31=Af B0cz@Ics}``@Ha( YWF=/!!0dW8ʟq˝mv5o8k;;?{+I+AXis۷7Q^A^W4|4J& }#0 R2 CFazGXk7 !z…>z}) !0EwdB!\MYQ2 +Q>qEL=BBct|B_B CFa( BpTF[cz=:@ @Ha( AL_ BBX}) !0B_+%Q蟻m{/\ 74wՍnKm{]{/Y>m͎nNroskk/}W) U}8z}wΕĵ4KFNpCWܽ}<ΐc!z_j[cQ2 #K/ݽ/NC6B_LZl,| _k۹ڷf_fNڧKlh^;ی0Xmbos>Uܽ풗*nR='>-Y }u^{mŐv*o(䖡c{gvL WVQ/!!0dF?]<1nXkU/$J;.~U9([ (#櫵}[كה֬]pO\+T}߿ }֪|G,j_CWvEIn>޹޾zfmiz[0"}) !0Rv-:"4z[U_m2T_Z Ch:{Îm/P 3xe)b6쫑m/};i7WէEWYu_=qjnPt }Vp\u1$}5KѮ֩}t[F!wЇVq -GSQB68nzWS"Ʊ4B'V_zoj ւB_-OuƞYg~hYjϴ?NVX2GBؼE&vvc]z i_MCwt[UH-;U*Cmp4QA @Ha(  ov:wus륷 }% md+lH3h~-8Waގ^[M{Q^kd_7ٖT{[eIDZ;6oIs=uK!~餷no-BL[)m8  0d” _[׵aj߲d}BoRyfGz?V{Pkk!Ū BE_B]!+]>Eg˯]z28aqZCWc~cIo:lxZGjz6M`\R2 CFa گ*o}~wG1Clg~Ջ!zc9)ֽ0OݍvLZ9gOu;\ c%]nݼ}Je/s;֥Ő&etbq }8mj[Q2 SXyF4o]K'OQcwv;r6BBohqFU/s4w{'?!}vWV}$J#09}0dFosC'g9Pߟt [荽}X׭/~GTĞ8Vh]Hwj[j-| }C̎P`*iczX2 CFazзwGr~Eiߏ뱴O3֛-m{agSWr)ֲBcMͻ9C2M`͘)e8>uĉzyi = @Q2 #Z/zbfBcns}ʔ]p\[_ }涽P 3GX72eݱy7ǫ,ߙk];9Жa7o~/0.`DghsWb T(  #k! :t}}?uzHlM_菴"=t2J[p\ 'ZBdW挧vQP̞Wmw }Puؿ'lTFKL|ح0d*Bj  CFa(ߓwsfJkb GvU/RsmqKǽ}D9ׯiCzh݋?js)g=qP-i?v]B_#ncHjx=qе} }K#ncHj<1Ik?OX?_M([M`T ba( ,'vKI'W}iO>yF8_^NIjX ZWf}DYVsɛB߸_c}{Υ_Z-g2x{5m\Z=uGdvMܞ8V|-]w }r$u1$}57NZp}դ/^qõMm)0&[nf CFa(Lb߼P{{!c>o<}cտW\wF.ql6%?^ĂRpA\9}};8Vcwl)ZXCW~az=f׾]m&nK[%E]M`D ba( )=͉]/XǾ~5)7fv[-;DZ~ل[n'VZYK]0Lvq[t/.OS }Rz;1bw(בNZHz:||𥭒$0}0d”jх~ߕb[ 4FmN9s^S6[p[[K؅~oj.ۄK{{q}z&W>wU:mWX⻮h"cn7H԰CW~餵TwþELzgS X2 CFaJ <]p6 ' ">A"G|w>;5!DFa(/ܿΑB cBOa"qBzS^s!0BZ^ ~!1!\'H08O!"[(/$2 CFad} Ƌoݽn]ϓBO"E|DԫzS^s!022T ' ">AqċR/u5kB"0do@O"E|"*7YukB"0dFTcrN0&DEEh/",ipJ?Z/(/$2 CFad}5~zţ&_HW8=1a.1̾P^z9ه#X iP藣;<]G_0 MƇ/ Ao>'q,BFwU'"E|}>[@<ݲ+ŗ?w5%B}[/<6M Ba.-BPgJßë~cKn-(/$2 CFa֕QЗ_Hk-/(/$2 CFa$ 7X~!1!\'(I6V87$5Gy!Q2 #G_s`vF[xo,Bx˜a.%.}F DFa(ڞTO[-B cBOPMzᰃ q:a?f 5Gy!Q2 #E϶Vyְg B cBOP@rj<2|5cm"z򚣼C IDAT( "?pUcl_:{oc*ƄsKXcP|++cl\E 9 Q!BtW>׎u[Bx˜a.DW}Oj/>uћ@^s!0B~qbw'9_HA"G|@ 9 Q_H#,B_yQ^Hd”Ok.7F B cBOa1kB"0dxGc~w #1!\'H}5Gy!Q2 SZc&yӁ/$0&D0/(/$2 CFa ?Y>W_>#?~!1!\'H}5Gy!Q2 Sت}wC/~)Ƅs #>b DFa(Li_\xyD-}]ci9Ƅs #>b DFa(Lq_,\jw._kyb,Bx˜a.$|GX 򚣼(  $6Nq_H#,B_yQ^Hdˆ坯:vn;aL0 a>#,B_yQ^Hd6=ӏ_/$0&D0/(/$2 CFaV2#}Ƅs #>b DFa($_rt_H#,B_yQ^Hd" ' ">A"G|@ 9 Q_HE/(/$2 CFa~!1!\'8}FE/(/$2 CFa~~;y DClY" Dj^T( d՚RA]uE]$V R=AL(QNZ ("* s?g?8yn ss Ƣ>#V*">Q_Hd$CF2}B_h`l0 "d WB"#2A+BcCOpjfiBWr”c}ɐ9R>DxWa2 b2d$CF2}B_t~"4a*'8rR-a @dHd &ϮD "d @dHd (e7"LxWa2)6Q_Hd$CF2[a0zND "d WB"#2A+}m)6U >Q_Hd$CF2}B_=RaZ'ǣ `BDF2d$3BW}O-}myT { ~GV}6B}SDWD-QXQ_Hd$CF2zs{_x2tbB;(qmks,'8M1KyxmqӮ?_|9á:ՕHd{KW7+._sjB_^~o B_pSks,'HhSSB}/$2!#-BWЛe7lJwmks,'H̵3ٌ>Q_Hd$CF2Jj?usa =|B9|3f}@_c>A"Ga'->R WB"#2Q"f_:KI4oCkz/}4 a<#9wMm2^ WB"#2Q"77F-_Z}%Ϣ?W.Z BBP10%$xF8.+G}! ra-r7f^^zk3O`1$݉0$xF#ɐ7|eDJ;5B߼EB_t(D:KB}D{'@_9 dHFWYf?[6 fU W,B"#2*PLC>)6]M*+}! LQЗ6~I?O'iVB}Ţ/$2!#2 )vheQ *;' ]l-CXD( dHfe+WKTm[H?nyn5`l0 a<#乔EDF2d$DO޾nM(gm>?зξ ƆcQ ƣ8ϊECau+G}! (r3RZ3nDVHi}gBcCOPXQ_Hd$CF2J<_kK!y@ zw-]06DBsp$VM.#C:Hd_J p# }y;?^l} } 6.a[F8; WB"#2Q#G_XN99o?B_?B_h`lN-P`|_߹'*q+G}! &m!6/}/r[[`lpC?1P`hÈ|ߙ'\]OrɐVJЗ?B_h`lpMO3P&0F;5}Hdv_yCd>w-]06Df~B?ɇZ}&fDd WB"#2}?n]rB_h`lpE_5P3)]^t<#ԀC#ɐLZ?zxG[BovKBcC+f#CE7.B=1WHd }yT9^} .lD8tۼ"TYb@DF2d$B8sSMN&B?s>WwADF2d$W ƆO'M?+^7{_$} Hd v2y$xT;."\BCva /a?e{Ň<~>Q_Hd$CF2M,}!}@qM^ޕGDlFp%ֺ%Dz#)WB"#2A+zѝξ ƆW~ɼ^Ⱦ9ПغE9ݢ8gf\ WB"#2A+Mo!5=`Bo5EB/?ZbI99Orɐ B_1зO;."\QZ5EB4%+e3-~f7}>Q_Hd$CF2}PB߆o! `J+BͿo8!w̧iƠ}Hdt ?>)6xa>Z@qyUҫ0AT,OB_9 dHFߩ/dv] _>xaR0b!*"kŒ^k=llaܸ# WB"#2Q#G=X*xa,)^ysQz'<Oum`& v B}/$2!#-BY} 2^&f#p_VϖX?tvO\ 8[dIo3{9={j XR}G_G9Wӗ_" BG߽<۽;4 E@L-2T"Tj#<9F巄h) g,xf>wcS#%޳"eJ%yDZFRLw./88p̏G" Bo<˜S5 }a,KPҫb7{5,;}~+G}! LQПw34BcC/U"*{ }"K6Q_Hd$CF2:޴{מּZ7/"eKʼ!u*_sj&X7%}/Hd}f~)'i8S/"eyCfFHp͝VC9]p [Vuz%+G}! hz3.l's]aHd"L8 %"T#pz;K-QD+G}! hDڋ0bw$3&ct#T#a6 96sV WB"#2!frf B?9a0rʎDaKPҫQ{iKߘ}Hdt}9._if漙rOIP1#dw\#T#Y̋5nV~XбOrɐ?Y/]9y9}mP #|#T#0 ߍ1'Orɐ7aQ_ƔϊE苰bKja'"L &#ԡ#2̧볏n4j+՗ WB"#2Q"/O|^M{8}o3Bu;}4ǔyCjWafʛ_F]m8W~xB}/$2!#-B_=Bb|`-oP I~v!´&80ҫN_b} <6[b$+G}! hjM9 [ٷ@XD%8;ajWaHN;|)夛 7}Hd}eG|NI1 l'u~+"̖mcv"´-4hfO?eKle9 7M?0>'!#2#?.j~{dX_wy$B u13TzB_OY#h탳/0Nf&ŷrM"&CF2d$IN͒ސx@*;b6;a:L觻U O"&CF2d$Uf_K}|9 }/936ZcJr"Ldy }\D @dHdu۔HFٷ*);ۍS9biVfDm]۷ d WB"#2Q"[˙-y{c%-#j -Q|X'pw(5>d WB"#2Q"GB_6׹9}x1wF &fw&>d WB"#2A+Fܤ~b->=a f@G >Q_Hd$CF2}hB~b$Nw"BӅ>;77bg WB"#2".es; ]WtX T":=B}/$2!#%Bŝ&}7:nNGͱTPG4j=믰OLPp>Q_Hd$CF2Z8#8nsUKb3}6Ǣ5AUw8׶;ռOrɐZ/?6Bp9}zGX$s0 2/ǫok+G}! 輩i=q3tJ"{3}6›J7PFYoGQ/ fyS}>B}/$2!#B༭8^:^߉Qo՗鸀Zv__cNPK2#g6r5G>)3CSDF2d$X's3oH}#t^= 3XTPz5+ƭ6“֝Qf&"WB"#2Q.ٮCh{~OV }/ 9 "0fj#@DF2d$XMBߠikbcI~IǤͱԦFؗb%vk2gXQ_Hd$CF2Ɣ$zCzGEvL|vF0ZZ#t5"WB"#2+z)6V-1!ks, j"dF#*ɐ?VY,2tRKk"hGU/$2!#%B_.gM o~ҏ^=W H9|NgAkcA|V"WB"#2Q-[OG߆K'a~ eZ'LUna9rɐfa }fٟG(BKb%Add{ADF2d$E[ u^WLe.>U|]sn^rR&S+ ػ1Hd}r5ݨ?X &$pj"='z#,Ok\v>Q_Hd$CF2}z7HR.xµG8wD{#ᐧEq7)|d3$+G}!   gTw$ӭ; t^{xE8ۺW ?Orɐ B_Fz}M H:ݪ#AGh;;#,gז2{Q/Á'@_9 dHIKƐz}M H8ۊ#CUGX1bOm_/Nv?liTE]ր)2!#2r6 !=0|i=j#EGb"$[>䟋'!#2I+jo?~7oo)71X~)Žjj#0n.~A IDATqG > ɐLZw? #?lM~?nw۷3X~3APa'3:#z0}12!#`3-rmU?X*XGmWLy{&bDF2d$k76s~'`l]@"ϾEh3~j#)GL}Hd 5bf{?ݻ||BrEqv|uۛ>߮{'m軴~c.}OE{k&>Q_Hd$CF2j|p.65p3~k礛7mg_mSw軀,TE:I"M3dTՂOLp%B}/$2!#-Bo- wbӬG7?kޤkC[ϾMYw軀,E>a#F0r8~X{d9BC'@_9 dHFЛޚ/o^jƠ&#}(i~ԯabEwYis|OPO>>9ZZf'@_9 dHF9O 5C~k~)7$Q_Hd$CF2:9= g{4;׶q/ 즖PDE aE(K[OWa9j"KSBu0$2!#Bo&ր{\Z77; i?a; }lvxcmnB" >KiOrɐjO䑛 [^>^)7?͋iv=]8{Alm͓/O@b}! L<~M!-e-wq}=@wЗ `ͮ˶Ym-n&s'SLHd(`k$f ?蠎A(?gFAimok+~0}:$ dHf/'Y>R_ެr)g-%}{>c`f:].gm! p` T,/$2!#2{TGgoY,D[b^~s-v^7zDT "L洞&Tl[ a!P!BK}Tx++BcHd$CF2Z~$˯;Bn=l {bY uNOTOe#‰$ٶv'ؠ,B>WVƐHd7+XVum7ϞBKTdnѭJrp6$ٶH#]^Y̡>*c1$2!#5B_޼ o`)k0`w#ZODGUAӶ9u>6>XNyBm1$2!#=B<:_sl\im/ ?w?UA9]u>6Ʉ>x^[ЇO<}ƐHd4 nz3y 3%W;&#l-QYշ~D~BS9u>6EZ<"4jsnZ#;4}ƐHd }Got96/{vSKG8]G3HPam1d/3-)ϬgSЧ@[9j dH&s7~^ o*7؛}IXGk=:5#$ٶ6®BIWOrTɐLB_J⿿u3^ށc߀V]T Nt= l4q'^M+5̞?}o1=Bu0$2!#B[cuqveC̺6?)kJн#Uf $Po }M.}/%JGQ}*@CE!->l/!;}Hd ˿[~rR~ʹ?WBofϗ}K`, Ѯa~'RfݧtDV "t`? qG.ADF2d$*7CC }RA#]O| jh}JI- B74F`@DF2d$W EY ={?J}q= dE *hG{ q1@DF2d$W Ųz!" 58_>AͶ Tj"D'@_9 dH@u1tA‰\"Au>4ۂP)S# B}/$2!#/=洓-~hC} mA4E.o\lYq}ͳ}Hd4 S3b +m A vOY "g#􊪳B_9 dHFynZ"ONxB_$`:J" l] zO kA_9 dHFпwn/_X/kvqZ.R?G TlꔶDCb  XB"#2"'k?-TQ_Hd$CF2Jg?fؔuy#!H|)h;Eأ7f PGfS"kEERwy&ֶ'@_9 dHFW\Z}/MopHR!ža$kEE K0B`D8>^62/ WB"#2Q"7VbGS΢G 5LԇGػC#.H9RE qQ3j"I63=yu+G}! ra-r7fAQUԇ}`1cÎU}*l-tFX/vۏ\ݭ}Hdt^SY|9Ѧxdbb/~bOK޲&`fBiQan'Orɐ} B?9#CϞiIԷHoDE{FѪ/BͶFzoF9_{+W~" wE dHFo#3N1ִ9[~F.V}*l-FX72[d>/gK]u>z O+Z_Hd$CF2ʄLxOV7KmQ]b ]" D$hfBq5O+q'0Ytz7cH]ِ^))D_v8ȱFkI8G+I?O\肳\-Qyy>ly{dE Bo" zàH "Dy7>Z渜iaox2lC,Wwo_ZϸyڂKME9ż[a׽~ÑF(hԧvY}"q USJ)}޹onltl/,1#_N67x^۝S̻#"SvS\!BN緷s=6bɐT B_M/KOB_d%%]~D8uY}*l-GFvp$転DF2d$EFx3~o 7}InB_GSAxPam>]5\rUzm}]B"#2Q#G_XN9Y,.|8>A ɐ B_9J{>d)G<}4eV ϔs9 ̐|m͡Y> ɐ2?s_wl/GT)59ȯ;qNE Tm6f ǵgg )@dHd4 }r%.5N@U$&_COـGpdy>ys¿%BDLdHF߾T{Ywk 7/#r#ꡇE}|"tUhM~jqs}]B"#2Q#-ϊ-{q=@ MFâ>AUSa|!G#)wE dHFЗxT k=*/4^06FCWaV }q_o'@/$2!#-BbF97&{B_h`lr0 ¼"7IO+Z_Hd$CF2Jx|9f-O6D/\#F}0wO+Z_Hd$CF2Jd9u&$f# &{C>AU[>h}! (z#O/jB2xdayh' _'@/$2!#Bo{|U_B_V *lG} m"W wEOR9qF̺! }A苑G' 7Tl[d!FO+WH@ zJ>pPf"1 >h^F_!ͺ#LINbzݒ]pZ'H8"K転z}4: DЗϑ*؄t.-yؽF}D+Bހ'@+YQ :|TDFKj=@ 8]pz'H8# > h^F_!ͺQ"fzM9D#,55݊!ˉX P G蓠FeҬ(%B_ǛYkr BoZ:&';a'Hx"転z}4: DWC'?[ k>I@苎DuLNv+OE# wE#2 iu/o]f#%}4 a<go}]BuFۗ ͷ)^M!±>6Eٶ:™=B}W4B/f]G(s}=JcQ?[F8dž6yG8oGFeҬ(UBo{w'[f B_ ,5YD8F"Tl[dᬍO+WH@ }"bb?xV_ m## wE#2 iurS#B?#z A[}*l-pF'@+YQ ꡱ#<)0;6G8_GFeҬ(BQ~Х]b#*C@l[@5z>h^F_!ͺ w^_,umU,)iQ=z:FgQ]e?xW_ m]C M}TXh^F_!ͺI/prK~JЧ@+YQ ɅvYR{gI,g1+{X:D郞2ф~=W_ m݈p>Ч@+YQ tإzZ쇞68}.(G2>}ͶŎD8GGSFeҬ(BZ%?_=#)jx~ŰW~+i?|p!B?P_ m]p>Ч@+YQ d3OYg>@pCD2z{Al[a WBuXj3Ki |à ψ["- ь`΄"Tl[a WBuXo=[=>6Foge=>}Ͷ B}+YQ itVߙ!S93(YQ #dlHBo7kU&χWh~u"tSoe&B?b*0A}Q">s<u^7K/>tqv_;ly|./Bl~<ړAG}Q">s<uI{mj^fP̧{?|}+s)vdUF}Q">s<uO_rn顩Ś_};}4cT/B6JM W|gQ @ }6&m_NF_c0&OrDeҬ(mBiMyko7ܯoF_c0&OrDeҬ(mB.{H}W_DoY =qaX/B"G}@z}4: $/Tz3pۄOdE ]Zj- W,Bu2UFy%c?^ #=ڛuӥB}ł+YQ SeP_DKK>WH@(W+VzKK>WH@(n6v]06D0&#S;:N$B/;ݸC ]2n=з0 a<#LBɑD"2L ]2~oE{kJ%f (Y@OQa2L$~'AeRwGKlZ/r"E}Dgr$; B/+H8Boͱ3U D0&HBw"z^&uW.zFYzTs>@OQa2L$~'AeRwq 駷y5 +%}{Ƣ>A"'04`RL$~'AeRwq }4f>WsKpSl;UQ an0!}&GJ 2tɌ$J⿿~\ҵ1B߂z"h'HD#LBɑD"2L ]2c ?ٽ+W W)"F}Da0}&GJ 2tɌ%$-8kvԫF>A"gr$; B/+HhB_NYpAJa4$xw@39PH^IKfA"gr$; B/+H B싨W)"F}D7@39PH^IKOEԫF>A"gr$; B/+H B싨W)"F}Dgr$; B/+H B싨W)"F}DBHBw"z^&uW.>QRD0v@39PH^IKOEԫF>A"'(t`BL$~'AeRwAӟ}*EѨO 0M'># ߉Dez]Adg_DJa4$xG ># ߉Dez]Adg_Da,$xG؋o?~7HBw"z^&uW.>D0`ogr$; B/+HL +N" X'H񨏰 BɑD"2L ]2}~B{Ƣ>A"G}9>HBw"z^&uW.>D0v/;wo{mgs$; B/+H B"E}D;cf˳_glgs$; B/+H sӟ}@OQaWym|?ؤ@9PH^IKUnҟ}@O"Lp1n&&B͑D"2L ]2}/^0 a<{^6)l$~'AeRwAӟ}*EѨOi0mؗ 3f9[&B͑D"2L ]2}/^0 a<S076tBɑD"2L ]2}/^0 a<&x-L;J*vHB2'bw$xv 3I2&@gO D0ovC?~z}J L$'s"vHBg`0$l D{@OFh7W_3,[!N慳Iv 駷yn-o""h'H"z$< ;%޳"E}D/B~v^_*NB!#2*˹c!>dFC"Oi..L{f $2!#"5! dHd 5w~z9 ϡvT*"F8O,"²M }IdH&xp.>XsQwB%*5D FkBR ɐ7>Xc8bxj=jM ƆcQ 0[b {M > $CF2d$DO_ۚ/o^{g]j/"E}D ?g=6)$ ɐ?r ǟL9D/"E}DOKY|[^I'dHdts4~{Έ ƆcQ a~:_͠YBiVܾ5`O!ɐ z| /4^06D0!tFܯV I $2!#/4^06D0v \y^Q I $2!#=B5̡g͔`l0 a<#쎹u~<&M ɐ7sn5V^o ƆcQ ƣ>d}=!M $2!#B_rc ћK#R L6W1z&MRgΆTzk._j = =@jW|+_m^j s&3 gC*=) /O~I zp&l$ujlF%/g_~=c cȇ)[H@>8QI7FaR?7/5t[ Z/zzOoݺg0B %w?z?wm],|]P$v =@B?_Y{+̡PohS$ k7*Ρ?i NS7wϹcnn w hAě&$^/~URV})=?4_Wo~fr!U؅/LW~2UI@Mf|\bF0SHGlќ6&4Hn&\)8ܮ} j:&@<Ruvu0=(zP21Bj?RϩJlck2M.w|7]2k?-~[/??}mQE?ZYM ZGB9ܼ^n*!ULX/\LFgE/*xP9ØO!u;r̦ .c1YЛK-O|x.7/-xlnV9n I}Ƙ׿77&p SdFˇ%R0SH6od6uTxt GWߖn.V_?Ơav}0ov_!UN)[(UI@Mf|\!c>H3:[$Зn6oOsb]|ZKnX̦m<R}c=I*$ @&3>Pg;R#5ci೩#YL ތvs'l̢[ļn1uWuHk>Sh(U؃MMFgEPgxdc>H SG>c1]ms3*s(o193O~$r)3~P^oR1TUI@Mf}C%3R#5\ORG6L Fc l<)3`fy_ߞգ:YCp>#4 ool # гɌ|3C2r1Bt)# ^Ar 1ڈ|MmH=GYc׮dvZ<mfvUؙm #гɌ|3C2r1BrlhCO 9|O84z.?bP̝UYhDHvz?, # гɌzsC2r1BrO 5fy}W530Y{czei!U؝eTz0>:K<$#w)Gj ϧ6"7Si_7o7Br`># ;s?W87}uxPF0SHLцLޞBMжks(p\ I#BϨWTa$}uxrX1B ?R9;\G }X{ =VNC㦇SV" 1K9RpSluxrX1B ?ƾuAMe+'ި?f ƢIk;(0娨71PV # гɌ?^=a| )H95[GBA,Uθϰ)˓bG\6X|2[P,_HxT:KG9,ØO!8uA^θ ȗAcW[Yd|= -pVYQ8ݓֵxĻ#ftt [Y5,~`$ o e Pm|ްXhTa$z6Qa:Ks9ØO!qvm#/.닦`~a nʞU(4o" 1YƤ # гɌ:ԙ_rF0SHG35~A}5b5O*g4\15=8◹ݥjC`@gTa86znUI@Mf}ȡ31B <"35~A }/,cp3O]Mv<`ېxu⺲LrsX?pϕ/՞BFgE/*/Rؑ:f̨VLA }sK}rR^TYro~e,46{Z{W~NpJa:?okHl2C31B ;RъA }Qk?x?aBVy~v~BZ*jlL]/6p7ZTa$d<襐C | )bsa3:Zb[Mm{v/>AhfGo,_)vϤ# iքR0gMd<腐ċB1B k̨*ڄ~älLū3$f{$Ҍ*5H=@ d B1=@ d B1=@ d B1=@ d B1=@ d B1=@ d B1=@ d B1=@ on^X,.Y]dߝgϻw8 W;kMΞv֏}&V? 'Bn߄FC {/wPcޣ< O^&`n_j/񷃀ƼWgBy&.-6j`zQ]5ܗ2ioʍy d`"JyP?_ 8O,A!= B3Q&͗#z:B @!Oz9t7zqGݣ C SJ=q0vo ޥ۟zHBy2ss#8L|<椏z{Å޷W|^ CO޴{{ۭ'vIbK]{y)8-G{j߂CIY5{f'M_m[跚rjO߫pˎFch~o5@x⿻_n^{VП\Zrpb^ hIK_mw6Nt[#s}|s<6U3+r }I/yxZ޷W=| 1! -Q٫{~Rwk7//ݻXjlVg*~joCD nFu)7G) o6ba7 ّm۵_lZRwﲙ ٝS(ld@!Objc/ɉL.yx\Boޮ6\i^kzmQ jȑBj𛛗ɦ|CŖݻoRCogw6Na5xTǝXDž96Ov[=dJm7Śt3vS7Gkٛrߛzvz^5;@IX5)wYχe3Eh!޷w6Na)OCW]u/zùkܒo[6oWI;G77 Yz^5nx<7C@XSZKҗr¤'nB}zg*m_Gr7Uo +Bojz͜OjK4h 8ܼVo`7 n{ Fg?Yh֒a}T{y'V*-r%N˦O_{AB߫g?# UKIt }PKöĖݻl՜zNAA!O;~en]jIF}Igiߒ /WnkK]nsm=)C# By'B+o㽚kwBY,ǃq?uWY?)uyK]j8[) g/=I}jE[{ 뵈{e!>3@9Td5*l]63nbyHut!` 'qBbѣ?T^'w_K7oY՝j;_^ wʦ մ~j`jɦu7A-w)?b]CO꓁Z=B)/6-z>k쑛 oZ'xHڞB G9'b(igޥջ?v-;k_譮` C -S5jkO ~2z 4.m_kVB荎jݫP_ Za'63[p껋O옣֒n.w͉u6-_+_uCǘ[=JЗm铟T+v)}&C }5Mcmfk}x.[Y,~ [k۫Y62zwb}~Ҙ6%j|ꝍSh}5n5=IЯԹ6 7ֵf?_s=d4Ê۫Ac9jOҜtҒ:w6NM=B[0{zȓ@n9奭oa~{/\$WIDATv) }+刺߂C }qzMk0/MK޲;{fngлFN˵MxkT<{+/~ zw׽߼W [0{F]/b]]?ޒZB_|yCoyܝBЛw._zT|R)>77=@ d B1=@ d B1=@ d B1=@ d B1=@ d B1=@ d B1=@ d B14pzIENDB`performance/man/figures/unnamed-chunk-22-1.png0000644000176200001440000014642013620205622020621 0ustar liggesusersPNG  IHDR Y8PLTE:f:::f:fff 33333P33Z33k333Pk3P3ZZ3Z3Z3k3::::::::::f:ff:f:f::@@@AAdAAAddAdAdAP33PkPkPZ33Z3ZZZ3ZZZZZZZZZZZdAAdAddAdddddddddddff:f::ff:fffffffffffk33kk|33Z3ZZ P3kP̆AAdAddAdĆĆ:ff:fffې۶̝̠Z3ZZdAddAddĦĦP̶ff::f۶ې۶3ZZĆAĆdĦĦ|̝k̵̵̝ې:ېf۶f۶۶۶Zd⦆ĆĦyovmfĆې۶AQ# pHYs.#.#x?v IDATx=}%NllKJ`b7nQ4nQ4 _ TⶡIEbhq-JBܟP[`+P6vqy|uf93sCgΝy{'b==L@=L@=L@=L@=L@=L@=L@=L@=L@=L@=LГ7?=PAOVy}pQ>˓oѿ݊柸~+煉{@J#Տ=q?./; 7z%OǗyar'o?sy&AdMe?[.hQrkO/tzh'/[Fs_zgY&q&d ztpnn~c̯D/|V z2y^A/U<^>+%psdS۷_'ߺm~ɷGzOg>so]-\?~Ngqם{!KqrꊛzW16iT?jYoC c'WO~+W4'.]Z?~sN篺q~~w?gI~?|`hF^;wwYZU]OtV&Y_qsܗڸ?wݏР.>zG. U䰞poxg O_zwJ7:wo_d/(R^x+oJaA|0+yG[7Ǿ:ΞtqW4'ͻW_\xw|juq[:߸K7~|ꓛ-m[ |rX&?xs%m/|JS^\ʰ_{K{ 6FY]¾[6x]ݗp{3xI zrxېCp]7嶝&6: 6w c7#B{7yWWe^$oVuoזrMo9;0מЋvOVaL_ M^~z.'c]gG׎*l}Wv3lb wz,/lFrm1KW2$WC= ?noިoW`fmsze4'!&?_W&nc)Ugb䲟BA!( CsDž,[Ã{P^q kMk|ب?=%Oo80 0$;[5IoYu} KknW:~ cBrv\'  a@П+}ѧ/_e@oxWG^bw^{ 57+n:Y-`LП W/$4KO4@ГÀܜ+}͎ w,wO= u>9߫#+;?$:^{3_{glFs_{쓠?\'  ɡskr|z2V~>+j?h}#>)K]z})Âv[pk/~nwsc7õ.“ 0r},;OW߫?|{ijj{/9V pt}[{gh:zS애t~R.+Vf dq.w!o~쓿{/̿+O\}e {Sk/FA?A};GO4@ГwŮmߖG1-y~!)۾S'?60>{~F䱎ӢZw&NY&F}o!jN{wvw3F<<.eho9\q kp/^U ={u\' 'ɤ;؝p}ゾq3ݤ[i@ПdJk#W24׃WWt|vMnO ]_w^~~LօvT{q>mksm C% ~I?_E^8,ʈե -rIޣm~E߾{WDgC$ۏOn߳ 䲙}a'?st}O /?iP=AO6E֮;\Fc־}Ai':ex.7//xD_[߮[{A|6ou-ۯ^~v|N.%o[-գO}'?wGٸzʈ d?<@k?);yG?S=' &A$e"f]=ޫ AE)NH/r_!#\[9zGr =At-r&=fi z`Ggx>W& %Alh/ϱ-ʟʾFHE[aM<@Jh2liɕHOC뚋M`A49zh[KAu}S{ @&ZJL 1V Aj!ʋF| #A< .|սv zhUUS ״.7Tb zhSTiVZ\+zhQT}Vu3Рڲ{ek[YzhNUTu^Qj׵6Иzި PѪCC[*V'Oո%*Y zhITaޫMRJFC;ʯ5ʦ_zhFTUfR6*}3ЈNA-HCnJtVul0A (jҥJ;|=ԯ(byYob0#A+J/8 ߒ`>Vf ?MQGCJL37kcAWgݺ`>U\<\b7rqZ@vfօ `FTVY%+r5ZzQQSd[V^`f#B%eOyQY~IcxҰrEͫTM:.9z(VЂ\})tX3PYz?A2lG2i 9(=)b< TG@~ 0[OےAا;rPx6&pFkeGn1x#MCYJԉZɏ7"=%\ :2  /A%)cE  +AVMC% 'A(K`IC)bJcYXICbIx#p{Ed$B)\D=#`PHa-ڈ$i,z(@* lk4l=Ib!I" A XFXv@CDCpqr$T[%H2ZThqF„H<0BC`Q2$RQ@Mqd!!( ((L}'82U d(dz*F~1Jf 2 ==% @j" @aBEٓ  1AȎ(F M1Fxb4!;TQ%!cT%Nc) z&Dn c@Jb !ABZ!HBFAPWA$#!a T-.a z#BdDE@*P*YD  AQCCHCCEYS`w[~izaWe]n!!b9t A,˗MZ|[UxUѮw>>PA4E,- zXAgXW=,lٜ3EpA29 K^@=,$D_&aI"%+<,Kz9%]^zX̂az1&r zXtS,. zXƂ[+`4AXZxdb׆PAK,p_wŪASE0yn]k(-U r,z07(z=lZ0=OqiVzD\0eJ# zFg%/g'=P AO˅=P A9 ,3 j|_v-0+AC8"W@= ଟ@Up[~9%hyj 6Zp~2)0Ϡႌ'DpOz 'Ep}r͖ct>1~gJ'=XXF/rpsOb,GO9P6AWc|RmbaZ|\XM5muSX(thqOJ,W{O,Eo@=\i 聂 zLϧX֠ɢ/x@=\d.Ұ%_b zH'VVJ%gDZJ 5P*A{ `y (|K&=B;-XfFEIyyOmQ+ZfVf'<=f*<3}p7ݭlF#On z8Hԋ(sHE7@q=}Mju=PAϛ ױY-ײF z8@Q聲z8w?xhiv"3dw[?զ聒z8'V@A=<ם@Wur=㜺sS@9=n;ΫYW@1=t+4uU;Ij^7~}Eႛ)*s$(ac ǫy~* \tAÞ ǫve@=xv#U'8,%=V zcZpLS=ld ޱM8Ypg{7 M7Յ TkYյ[ha;GǦ~d9+m9qGlr9"afu>iпvzz~?Qo W=z6A3'W§;mloԖ0 jJ*c3? #kc_|?MNg':W_/v{z0uͯv4kz#PmW;ɾ_Ma*')iЯσ:wz~<{KU)RjڍҬɳyO?ח~K6KE7 ջ6s>;+ω:W'&q6+\85 iGJ"ԛn?{:~S9 Uw^'x7zAߟ$Ԡ*]*YVѾ`E^\oaAߙ;7AOnzܬuiZO jʥcqMn8;Aʹ;j}?L?ۿ^]s˫m_7t3?O=FOw+ېFm|-m=}z]sa{տg0N 5!z{cd9:~}c㒫k=;:!—>|t)߽f}.1_<џ+UKS_DQ>uz|]Wӷ=_ &)Olm{ ?|/XO xq? qzA')٠:|}>'/~G uKMw$j{V{bw@S3}l݉p抛Noʯ_[':zEϓI-=kѽpO' =0pwv޺ 57+nm_>j׾t{N'V*Xec%Ǖ_pm?/聑=)v~vi{抛~ۗk7վyjR ~Q=VmN )\.7X>wlY.uǫ*J":UvZ͛?m+=߶Af{|+3餠ceB}l:l>۶dK#~}<4nknW~ϋIuQA_KV^6q^9V1hNw-{w8KSZJAf{|"*iptz7?gbp )qs}4x57~vnn*72+IWTMY WK J/>:9+\X!)q.|7ۛIlN;NظP,Pþ6ezƯ^|p웷>4{7>|0F z wv?fw~zJ[r_9>蓬R(E {5ގr{vvS:|>=pp'Ay |ϝ=__Q9*苯=ϬjF+N~j? ׾-N z w;t~{mΔ\ڷnKn8̬=nn/}*=h4;w_O>:is1AafSA\Q v+:l]wѱ;Xv?r@e=mt^ޚrqU]o]J.=Mz[{ˏ*U7P1(4yP@c=M~'IIE)|QmT9e+~Zf$iɸos ?N>MAOCFˮc>LL8MAOC&>떞RTpAbgz1xעO(}G}|cT@;=xru..[zFQwś"isqɧ#3^?Bu>(fsjrN.[xBQwkLJ;<CӊΌ/-[v@QwȋzAOr.( NЧ>(zAO="_)=p~CK=pzy΅ AS,+a <A\!] 臞{=\!s'F.`|$lA=5A2M/2F9R`CGyGlC%eXCS3h JSej5}|s*Dm\/w4ENSlRE){t3Qǵ~+z`n=v.9߃G(v5"ost2AojO)FNQ\(v쟞 <G=U-}aͧL.kY'f'YqMcQy\3l+z`n􇢏4røܑn-+;t z*6I}3/9Kb9N'w;3E;/@rݿ}Gl.kS)M/@ .N+z`^jet3<;EJLϟL z`^juB=ص૧A:AY z5)`X AOb/@/9 zEHSg إHo$Ԍ?KKb,=>Ϊ-G> k~J8Aq_"F*]nglRsNFکu^54m~2AOf|}Dxz͕^[+KN7EGSb(VB=/zW&|9*/52ۣ-=- hx7.3=pJ L92C-0g`.}Ԙ| AODIB5ӱ75ٞA)=pJSE| ]3;H#[c֗qOЛf"=?pIXT#;BQwJ`& -1A0}g{![|c5Uytc;b92ET(noߺb2dilK_\:I [&lqI'=Yh~}Ih3K{.|G=Yh~b/C(ɱ/;U}rr#z:M_zH%C@(bOW=Yl7E󢛗}-W{Rv9Y:MЏy_쵆H&iFݙTݛ*ϫB|Gpf QwIRw&W9nY92)zOS A?p>F\}Gś,{&s=YǾ/zMLnD3x%~ɜ_ZwĎ? _= Cn]y(&ISofVKp DA ztOQDSoΠ֍s7Ed'A?}b\ܹpj-TSMl=.i}r4GT&LrDvYd@=U 0A?uv_ ?Q-:*7cW˵$eȐ%*z`KS ؁q;QlL5v2jܒVFLS<=?z;03n4ʤyԸ1C؟DElzjb){^@Ur'NЇm*%H+W/vxm\?W3 oN~NXT$Ŏ(s?4'B/>#nNXaO@=3vԪ+ jۮ^'$-+P0AO ""/v.d)?êH4lUa=ϐ9I_E Ek@SW<䙢 `Qsqk"-+b2 z*Sw}IU)HY&M9z*|++S} B,]2Ery@y= S&XcTO/& 8b/1b7+x͊}RvcM~?P&AO}ҫ+r (yٿ|c)}xMy#nELw-+w9rEb)k#O|zvCIG.t^,q>8ɺzJU֤&ْ^Weν&#]YL nJC#TE']t0Ize3yqI!RTe'L'9^f&c'K?Qz Uք)-?|ufeg9}j[WOI+I[A}S@B9ErTŶ2>yƳqʭe@B=m-w|E:ea/R]p#M2Up\y|r/~Q8@ܬ?9 )S5E_ڕzZ/Jβ{k8AOj3E33\J+卫w޿ύ=e8b>s .*=_ ;K&8 9[EIDOʏJy&{#0AO*9f@NVzv9'^W2?,JSJNC/͕%zgƻ桚 AOj9)o@ez'9(ퟨt||'3* 9A_ XDLh ,зyƜ?&k: ߀)yH̼SG h2=%7֕s7=qN2.A'k:+No_t3#O..=ߐO= Ei=j:bX-l/_>^pP1 X@unM/3=|[!q'k;?O=^^.i{~X=l $[PAOyj;/GAoY `vTS$KcgT|s9~ՆzS?v/#‟Ƈ=NSN}.Y0ToϨcO6&_Q=ũoo]d ,1=ߢG n< or.AzST.B~`c 9qao085"O_]X=B·6*}rꊛw zAS*O|4YdcvF :kwѷYA#zJS給.YnuYhc ן =m=?Na=t"l?fi"Xĕ>J_nYVG!q~L.AOi*=흝Qm,^c8xʍJl~uOn?n~8ο==!k_/xq(04M.K>JsN?+^Dkn>_|չbf Tۏ+̛v0tk8t+(0Ncϻ)7qDN|lfknWݢ[]{'CЯWO:~(0Nl\J7qfOIGv&ܬ+9O|yuUuwJ3۟g_|a/~;DTg铋n6-Oz-R!>qIGr«6AYuູfwALվAZ/&A^2gz S9(G%}xc} ZwoA}InmN[o+ !iWʼxKhV߹}ow;?q|(,UObM]tRo6V^._b^pP/*w>!֟_' ,_x}лljzRe>܂8 n} ʏnl{抛CO,~g^/yP&AOY*sAnF=uIЇpC&Wﮟ9n9j?:o}7rGSx[W{>KÙ?kq,jz~ ;A_]yW9WVKpjgo[&S:AOQLџ E- F}哠;A_ ᚛M?Od_YHS/2/a[*1RՇ]գj ogE+_ 5kP(AOQWfԇ]㞏{ʵy>w?g|pMџ PEM-8owko/{N~a/xrj_~Я|Gv?%9E+j{$o;+n owl7_{g7EO=%IW<\*NUZS+n#\!71&}.g/LC=%ib{S|+VS'xM:V Fq=\s'žWg^|?·^J )Igέ+#Oi=k5 bMзr:/WtOxW~`'Em~_s4%z>DS6v?}*TVwMMn%BV:Aj}c~]:W+]C'_'|gvJ$)I#hE. yr?֩ĞO}ee MͧڧwUY]LyW_\}G:_9\rzGO׾.J )H+'[S!Bܩ3vIiqV n8&oe}(g^9/?Y z &)H3.}ʭNNBEN7t+ݹ^u{w&7_ wLSvu评[H^We} o ]({ 2Z]_SPݥ>oYC O_2u.2鯏8:AAn<G߽y_}SOO{5 CxHJAO9Е矏>E+JE+on6ƺܚo($%)G;sWZ7H]n7tR3\t3$ڊ1]LeuM#9 %AO99ӭPz~X|F8!g$ aոyMW̅ zť뱅~_d ":`<kq{>Ofp'[H W5fh[VOk $$)F3~(/4؂Fjz8q[|n޲2t6sRnla;2"Vj1A- nA_?€=h(쀄=hAc>MEO Сt=ehw:PS*m bs~e'|7 Ҏ-+zϜ}Cݺ2]שEK?C-&Cn+; AOZ9ÝZn6LZzϿ4no7/0ca@T2r;;8$N9Z_c%?3oQ\zHGSF.*=?0S -u 㙘wӏ/8pR- KSFNpe>Ce.Jz>jm?vܭ_v>OLjz>zc'K<,, ,AOZŘϕgْϹ2~q󏟠/@0uYQHFSFoYKklEٞӞ9A_`R- JSFNoᢛ׺gSߖ<B.+!zЖfòQߓ<[Omi=$#)Bkg_~>{%˪.JNs~3AJNC""qz:ŧYҾӮ 9?WO/Xಒ OI-=E?Kk:{>zex0c}My-\3q̬瓭<9<͕:A_`T=%h7E7srz{>ͺ͖7S/)`زRmnM-:E?c!_5|1gq^pzcd=%hvsdKNZwg=39'>,vQ'!)A'Ả|Ot9?gЏ/hвRmnl)y8{u/h̲RM܆\{U<=[k9{&_D1AC2ke̓ې-v"<%?iHwȭz=")@UFE7KUm'B9)낛E41!!AOBSU؋DXοwsJLC"qj6eQ%PϏZe.>zE;A_`e%&!AO8 "Svmkhg}|5JG=Az ĩm})3yh6Ww)s}D=h6x` \tx'kҥuv7J/rO{~} D=h~~n/A]a3z>3n#'6lG6EŵD(׹Z9R=(7u-*Z zHD_{qʝ}>D޼UKtՕك qo|7O5b=}H0'&Nlc6}*^Quf76HmeI&+9$̹ Ǯal?|꿚<&J_'Qw>Lt- rV;PgڅLrHqYi-ߔȠ{D=5qb}.\9k*_\1f\VZ W~wns\~f$良+yg&T^$V̚GP[VNyͧޒAAh}'Nl#5}6<۫8s"w|5DŽٖbAO:6W]_|3!Olc5}8|4q>GOPϰ%zG\8-7~Fw#~tЯ~s =AOxMLTMSp18ڇ?C&9(̵27DZ{z7??KߵjKׂ3 OWћgf8|S!aI!fQs>SpLJ*uЯK7]_ׯ\ _u7Ą=pZb^q& S?G '^‘/K~~=\ tA{}'Nk5E7Q qKeY-{K$Z[VN~͢#_/]M?.z.ѿ/ϫw%WS]!o/a+0/AOx-֦kn7K1貄ؤ\ n&‘/SMYʺJƾ/wu~!9zkvW睢]2S .C G&x37AOt-&|ѧ/\JYdL=A_a!R^q^~9a?DImgމoؘס壯O4A_ٕx3,+A&+Aqn 9zk6u\/ɇ=_q!R WA?l@^Z8MWŖP|8ʧ_ nye±ڠwJ&艮Ak>x$WĥmUO&;.d^VJDImrOT|Փ /}DžJڠw sD6We݈gFJҟ[+6NЇ]Ah_zSX$艮WIYn]<ώ;ӒeCE%4W{>ﶕM]紻rxC^+|iϧ{`h4}԰K13AOp-qe}_lBu' >iWy-^e%4ozkvrNчk7鯮Y앾{py.OGA Aߟzk*O܇/K)ۍ>}G|J(jЯy Ay'Ni+bUXK .}GlJ(jЯ;12迲 'Niw+}:%©>}G\J(j||~Yzk.S}:5%u J9A_!ײ kf+n'Ni+bUs)w--+Ӽ3i:=s_qf' S74E9{I䵽kl{>}+8 _7_=3)-LN1mX~ҏYz#6k0~q~5Eݷ,,@\2E8 ekI?r4EgАcY Ǧި7Oe~A֕pd|)G^C;A_!R yiWOA'Ҍ+}MeXjOwLY&>6dXV:~D}'Oh>]G. C+1'9ZN~2޲2k0~)3q KV -ոҿ/0,-'7JNڭ[Vy W/tЯnT?f5 fZ'Ohn~.,_x <܄=64pPAOlВ +b’^iCؕ?H`u=BK7Sq(/#e3sMpHt=$"艭ZO4E_[v~8;¸7id3LWpHt=$"艭Za\w,xGܵb3LpV -G')ʪt AW/ܔ*-+ת?8D]EAzbrXIo]YU]FL36~ds\p!* zHD['J9E_S^XHUL5p+wGgউCU" IDAT'砘'}G Y>l8It$QV؁4A!:)zBktv\7}=Mxsa40y#L7qt@ Z8e {/ G蓏a5hbg&QHAZ JuM-I8pKmǯٛ낛6!$:@Ъ?=W)Jp"Z,]ɳ7}G(!AOh՟2 +}$̒ދ}k1oCU'Og9f"ѹ5_j>}(!AOh՟β=E_v_w+=|CU'?'1˰C/ G6{ϯ>ۺvʵ!WQC"4 a?,$7!&QC"Ȫ?=d y6wg[/m"D=UL/ w>񡙠zD&'Fg7p`3O7q|DVl%ϸ/'goq=?{w+v&v6H_ڼD)CE a;$5/ vMg[s(/nt;H$VΪU53wRkT9cB=~2[)},7|ۿՂ>wzʕz"dRh]nɝw œ~5z>w-+WF8>D|"艬Ju9O_2mI{~C(a!z?Fs.~>wc">GA Dlغ ;÷_4_Ҁ>w𺠯69 zX'Of%u߈>hXN/ǩaLJ"艬ce5[[~g6q=,DY'Dz˺~jHG귬\) zX'OfM7ikp Aoz=[x閕>- ">EA DgEԉ%g}oa 7C ">EA DV_?YVu~_Ş-WĮ p['{U?<凇ܯX_>'Ofu>f V:|}o;) OIՀ~Dħ$Շ'3)&Aǃ+~5\KY'˺sjG_ץ+b}ZJ_SDxpAOd/M7AcAT4&pfWeOEwYtf__&pAOd+u#1XqYA?7'Uݞ=EY' ˺mD4[aH_Qy@{8/ko)6|ey?u+w֯o8s'Of5}Ai+Qp@?"S,?:__?Vw\YxNMoWoQПk)GY'˺iD4.tџҟYA_@?"S\:W])Wi񷿺S?|o2~xw'o>u6|Օ_S'Of5-E4Dџө_~ϬC ">A ;wo~o~6'La}?7~W}F7#艬ceݲ&h ]ֹN3=+ ">A?C/fOe~wyz?=Y #l-XTyA9[OL9|UO%fo}~頟UOu,@Y'A?D8R=!b (5v3׬ }:|2=~2{GZ #?lĶbL{lvL;]lz?=#d-X좿p'&dbnqON\*7I'DM#艬ce]=Ղ\ ?k }G8@D|%~&'{~jOޯOA?Nz"dXkYWߺ2W syDs&=+ ">AS=?W?'ǂR=~2{k7ݤj_F=+ ">A~6?ys~П}S.-MY'z˺rD=~|зbWOQ^zWлo%z"d cw,kɠe"qDħ,Wӧv zDⲮ'jf^o@~@?"Sla?S y{m1AOd[}l~f^yIJ G8@D|?:w.AOdk.o;ـ>7C ">6A?կ>m+)FY'fM~^W_xob[V<@t l8Xj޿;/(EY'Ǫ˺fDk+|o}OEЯj˜a6~3/% z"dvD8?6&Fp3"Slf\;l^n^sMaQ<E<4 #,-Xǥ ǰGAxЯ~C6?=o^{?,,IY'˚?O҂-Y1# ">AQOqvF݌2U AOh.Ek0 `Y!})67s0_?c,I_M7A[}_▕+ ">ŰA9/7׿֠ㆂ= zΏ/}5FЏp91LF5r= n ={㖕+ ">ŸA^?_qo5AOh~i3G)bsE"nI=fDħ7W#CMgzJ&6sD":RзYqa[V pOC~)~U7ިq+# M/BODW$ uu7ЧЏpjxѷ߻k@7# M/nޭ+3`egFт|\8"Sۉq~LAOh~y6$ 0\)F'~oƍƆ& 3џV=4)/wom3߼tpVEZAtD9TS6 tELJ1vC"} 3Fk+Hn8>D|/s= ǯN}Fq|=,D/bƭ+`>w0Ԁ~C(a!}3n]>81?͖js^!!zBlh]|ПP|) zX'fuqD[,Anѿz~Cȧ(a!z?=6S#=䦛à_ӞǰLJ޷ zX'Og͖u=ΌtAЏpx=,DZf˺t=mD*.tza#>E`8Z֥M7Q{bПZY+b8<}"=ղ.ݺ2t#Ar_>-+W8<}"= b蛧q}}W9A"AOl#:3[.1xn8<|h MЗs7}w>DS)n=FE8 w>Ɔ)W& x]l>VGSAv_SB^;!sAOlKŶibdGxNx1!zbE]ѷi7Dз]^脘1zb|$诳fEeGOQB=u>k EߺE Axu^Bn) zX'gu֕oR %{#נ_"޲reÇvzb|z]F7(nB>'Џpt=,D[t8)B">b^SxZ@A 2^"Xw9 c>Sb޲g"艭c%#~2[/,3ŀZ=,D[ x]lbNAo@Q[V>6 +%a)?_Wbc$뉠o ΄nO'a!?_W}M%{#X=ř?AOlˈF;AgMfB} =,D['Jx Ѻ-8=9? zX'Oh֕֕AԱK {ʕi=,D['ʷ&H(̑IKB=F|VA?W+bC|'AOpB,lrD6xG֐=9yMO͂_{__/>'߼˜zȇG~goyz~y'h!69kDQ2IFA>7N^upk?0*AOp6qaD裄#1>S8 urύ\.AH28X>0c.{6!>S85 -^^{ ~\% nSZuM[#}51>85 {t?oGޅ_8L>ޭA % nSZuMlykD?hoz^П0ѯEЯ7ܼlWNl~Q<|ا/o֠_qIw= pJ [#%?8 Pn| pkvF.RA|AzSۇ'NiQeD#=A}O~S2_{?ݡj\?Ǐïo~gWz|釿?ykF~ί?'ӏ?L(+|WdNGtЯB˟|ksSʧ-m^P*&O?7~9Gs}7>??(6d7oy_^#q zNuEXmM7a5BcYJ/6ͻ{t~_~b*=?ܬvnп{xom3i'vVzea*? a:W"Wo拫S 5>ސ7Yufp~}j̶ğ+syW?Y_ԺeKR_xי{F7D79-Ž6ݼ?Pq};4BA"=HwA׿n}{{nַ;yIzYڻ?!zf]F73.?mc_߽;Ͷw7׼lhH{7g?3pϿr7s3,AOt#¬krDQ}ӎ6W$z */P}h6݉sޕ^_rwm7Akq,~MD7I-κG&VGGAe@oc_߻v(>I? 8%m7&~~D?2AOt#ԢxDa"noc|p+^ql0__8؄>kcmxq B/; z7'NjvPoF>DZ)?0ǾA+FՇ]*3A?SAsf/?D7I-q[Í=Q}O߾}%~rA]=7o;v_`3~߿z}{F8;S^N랛wnnsnB/9E(TG[6 m 7>|F8bSO랛7 AOx#B-̈ a@!|-k{lNbg?t*ܼ.7.eCH ;-z=Q}ޞ!| c:}g<w/=7;nNއuC/% oZqЇ+9z7}}ޮ!| ~}_my8mK==\ɽ?<5'O{7q}/7i-vFo3}M7Ϳx?hC݇=m|m?Ow~~:$_\?n f\8E[EM75{>>'oGfj/~wO,lwA㋫7o秃~׃^~W0G?ۿ7ci-y-?>g>Vχm,r_Λ|wq34AO|C Qc;P}kDkpl@ꃷ1q/plt_ &o[7;Gp1{q 'o[?J1oԶ#~zWmq ?J[|Je zne}#8>wcji}8AO|m#zE?>pM}݋EUae5 ,Nw{1e IDAT[W}}mu#[&>A.6M?}P'1l 刾E6{ĀzO݋1{~u,yGKxY'AlWrD q}A<& AzpezEe|= n"~^ rC h AO|",ۈQ{>׀> =A ķb"l؏/K;Mn=,EГ +{|G-_WAt@C6AOR= rn|#E_+y rAOB,߈A zĀP =AK$0ȹ-_'W_.fϟph%a!*6i7눾vaj{>-+# F9 zX'AU1WS)_K7,FГ g+۽.v[W[lWFĭ r#`[пO8V2~,`@L F9]Z}"|}8<`) F9]Z}r|[V+Qy;ӂ۵~'QnueSGSEߺ$UZ_(tϧee8G> -MB=)r~mOE_$<qx#Ia[ԥWK*_%vgЇsAO .-%Wp c~܆9 zX'Q3ӈRW{ހ~Q=,FГ(KK:SuBOsaw#a3\ܥ](EyZ"|[V>Fr{?F9]Zb?Q5?kr{AOGFM7zyer{AOÜ-Fs]ZzrwD_:K?vtElGA $1ʈ>Ҳ޺rl~=t@6nEB=IrӛnR˖q4=6nEB=I s\)%7|ee0GA$19._a<.{>>mݣzpUl])5|'eec0ǺA d1* 8̻c&yr[AOÜ"-P&/MnYc6̡nEB=Y sŮ("!^/†9ԭzX'rQOsז֕ϖ#޲2t.{D{~~͹_鱾|J,9E^[M7-GΧ"6lZ۠_%W~A^4}ٯ][8~,=Н;́nmпy8O~6 ?\Z49E^c#/PrހatkMㇳA~A.4k{dDl:/@yz>>r玳pe+gDڠ4zXDym]\\=/0r>-+CyZà_s*k~7]=is|zzHyoY6qnaп{tK~uЯ~Ù]=iWё+lp_:E,3]+?<|뿻KtпoKUS'qt׶uk?['"6lų~_[/V^7v~j/>;|;^6~/ Ez#m~"+h >lܳA tпkt_UAO"mE}o͘s{V"Wso>zHՌ̿ՇDOj$1Q~W}|w{zTyb}άVBsB3ӫD놚Ad}>?t_{9p+AO. {^n]wͿ)m'ee@gEJmdп۽u;_3|}ɠU_~=7!IdU=kDrG`;oY51E<۟mTЯfSff2/~՗N0'qNv'k]ukfS| 7?QAM6?SA7I'DDOD:م^ZWn5ZD٤wny*~o?N:s$AO"ݢ9ֺѯ]W5}9m/^ߤν#O\`fFO| zd2.^t:_2j>?[,^~ɴ޽\o.|՝vd2GƋuM~%} ~9½9A{!]Aユ#d]=֕G;/R9'؟p/cG7)6#d}צ8ɧ~pwvPeeO8 _ey{m1AO*B/E.[~& I&kūA{Q쌻zR'qF:tw]b~G[Vt|_{}VR'Nx~q;~ÀoYԼ)vW=nT+b+oYc5ƍA0gn_K2/^ p] nbWl ߹eɛ{~o2IƋ!GG ܷ 5VO;_}+$eS^x5ugɯ 5W3J݌2M\ 2_Jǎ];aOyEl@ 7az{/=?c,IГ@ث{eD?PЗ4Ҵb#ln_vP'V:^>>'jcA7'ܨ{P'Nz牯\;L'eeHǶA^?_qo5AO2#+#>熛n Ոy?Ν )IГLbb 6< >r+;;7WujǿK9l1>?N#ٶjxѷ߻k@7#f^y5~O:aȶ97~LAO6˟/e-Ov+rЯAO:cgз?_4Ԝbz }]@Ao@_PG"gYVm|]lA蟣qzYdFяuP!a!|fE/G}'qz|y[ WĦ3%a!-1+;n:zEtwee`4AOBtAހvz2}}[ lD h#[zb;z2G6t=4 (@ГQ} #Nюg@h9Cy]AwM`3AOJ/pcM7} ΀=)vWMjAo@_7=9 v G}/P':e3?nI` iV*٘w]}n|tFAORpcM7}W&6$5_S= KP!Ij`0nDg1ܡ (AГT}!F}Iɀ"=Y 7׊F]}7 @!j`6lDw'pC3܁ (BГpH&m1pc=2=i w"LčM7o'0軸"6GfP':Al觊u.O?0!IkV<jD_wqElp!kSa%n 58 o,!kOW# [=_72=y/$X@E[_yAa@!;&Xަo] 6{ހ~Qv $6_Wgh۞Gр}!€B=8F?&X[wrz O4YY)zqj5ѿwDW߾xElOʈG0 AOfF菊u.Ӡ?yA(z`1 T'Q?yB=AOf#3q`N7nz^/gāP'ψpDXu!]q/kyP'5Am#~@ր A,GГZSbsb54Uu=q/kȃP'ω)jgDS }L)>"=-}KqRLWu.à?lAz  yJ6_[XM7}7A"InȳbEoM7+bKX'1:*'u.?y->:Hb=ɕ8-?/X䫽{w;})X'AwXqѷ=o@1'@1<1XhDGo!}QY{>GÀX'1>{Qѷ.ٻu=)[2A,KГݨg$\;wW]6oCzԘc/F/Eͦ`G%:7hЧ:uީ?y z`asF#F=fzdkG#z=o@8z`iF=;&YdD?[}Ju#ψ>M7}Y>'b#PsxDNzANQ 7>"P,~U]΀à7_ܰ+ AO=AfYԈ>Fqgз^r==X|ekS#'}7LiV`ܑWu[wz 0ǸG+ AO=EY䦛>w|}5XAO=GYnR 7~YN=]$fF lkcP$}d@c0@Q> >qwtkg#PE";y2BOݺr[98m} s}X<QYM7)8kO}Q#=XLgXI~_z 9L-@N^<ʳ#m2WcMG)(AO/F'*#|q1zހR@Qn|LKd@o PCO+S.e<Q@Yn}LKn3i [aQ@Q~,nKtL9*糼Ӑ>2z>-+3 5ѳJdX^.v[-x<|]gn2G?8 zzRh夙i=l2,r;p ? (MӕO;kD$,qH 聢=]} hs=.јrpg] =]Aι.vۢ9vW.Jefș;O0OW7(NӗGV;mmY1%4AOg?q&Zb4K;X]W&z7@q ? K#M ;Z 7 TtƩ3r^{:Nc&M\sgο.v'OsEM\= n]O|D5$8AOoJ钝=,Lm+NNՕ:$-@j%Z5^Jv.k-+󼽟9" zcDiWܺrF6n1'_~T 鏁X^f/Y lr;6xT -];/[k s}}@ %Z-#ZUeM:Чycr4jtȈ>ӝnj,-+_5zzol}}zB#A+B,-+Ӽ7=PK1yM7S_~kizC%Akr_|A!Ss^h3=#kv_ @%>ѯd97kKhug?,oDӧ"gtg4sDm.W߲2ͻyQE)#4 taD?wv]7AT$闢G}զ%n~6=k@O5 z%_$ɀ%7Epw=灺==3ʌx.ˬ7-+ssz.AOʜSVS@D#/Yn tBӵb#|'.[Ś~ZroYm{qM5#=Ppt0/K>kK~El7bPo~##gKRQo:pz@u lE_hD0)~{@)ޱ=Ps~+C?; [Kzeoz@:E z:'wdj#gdޮS=Pw~G*xr8YץMtx}7$=4 靠ߕ jn1s;_WR߲2[utOȰ-թTG[+b3S'yAOhDl/I}El hAӿ2¬gnD<2KO@ѧ{ Aį}$7_zc Іgβ{R[Wޥaߟ9zF4/|1tsYO7<ÑhD3})׈>`"VyT/!;&=F_z}Ϲ"nShy_AiDϦT#xAi@{Z792@31:)=FؐjD8 胿-r 쀢_NO{ElwY1@;Az(z;%t-޲2{, zFt{(x=% IDAT%ч z=_ВgηS}z _=pڑgD5s c/qxHJ3IoYx ДgfhBWu9o T\=q]eMy\ 4&)ڄ%dMyElw -@c8NRIF!>ӆ9X=#)xM|\S9F>>;pn*@UM S9F>р>o9APJCSo࢚.`#8A񖕁}8 z;)nS]uez>j}'露UaMsʸYR=q]촸]`D%^}7m|@8N [V F>͆P=)uLVGA>߀>{n> ApLNZWm>ˀ>;'@o鮈~ g<=%haueOwʠﶫ"B3'ᓂ6V}O2^g@|D!]vG AψOYG>džk9QzFdvZҚ.(#Ai@x Z#@!zZ֊}HAb@=v5qzTr\Boi Z'Ë& зlnYu z AϘω\Gq>>@$A)s"FW}tʈo[y AϠJ}y'x#ua>x{>@mQџ޺q'eewՍ X=Rk#(A~@=u+=#VSgW附.mЧ"6fG'/Pg\F 6 4 v=g\E]%X}8rzfE",u->-+a gdEm}c=ņX{*ݼD@}_b}[VzǀH34EY4oS>Cw@D=9wrvu5cb}[Vz!I36gBY}OqEl 聐=S3DJŶn"y灘=+w)c"mx]l0Y@'']}78&yy,eEn)x6 Wy,J3!#rBhuZ[Wз X 7@lV5[M7 >>cqzNÊJft]l|El=5EiD.mi(B zX+}ݼk}oJwE@x>gwwn}}DEU/ЀZV[WVWz%OR8QoYM~㣗zl`$^/RN좯؍^נ =*~4\[5c޲לwTrQ빻eEѷ Hz={p`(l Y}͠xʖolU~D].b"ߜ/eCߤeGuesJ={p`0v?wzoVu!6 pWv@"v9ߪQم.Apu;zU,IYѷW `z= z,~&}aD_?# }=Swhx<<}5Nd^[WV H?|G$mw_z7sQF!T 0W@68ߧv5Wn|F$HyzD_% yz8VZ}9_9KT'a[ozAX={x`L&8/bvMp!rz %ASJu8+nj} 9$a>VMG僾) zf"j`}ŠofHJô*NՊ݈x_~m:=? &E*=xiD_K}+ba^I6A8/F6tS-\;Py z8Ÿn96a7ueo8g<G:-#ZA_}@?T z86%f#A얕c弿2p_TBl6u7 zHMu~|-#E_4lkc*p_XPlu]lɠorEp9_s8 T&,EhM6`@vΪtT_. }9=WL<^?K6#A_^T.A(}P,}[V=\ (ՎMF€~М@=\Rl@O=_rI_yD_4 3As89^;IߋPwD_ K^߅U zMWLmї 7=E|%s K/m<Aˀ;7U]<\؆|z\/xE1#UNR`rAp~Gk $*Z{2∾X/4WN]h/tE-/X<)AWM\FeV zoJֈ~ɠ{@k4=tK }3Wj}i@@=Vܖ_zD`sJ5V͞ zoknֹuevÍ@=pEܬfqÍH]p}tb [5֫!F>.mA?s@Bp+E纶ƈ~j@YGp+r8۝׫u?t9V}/=LчrrߺrwJ1-=OB4S[~DtПЋT{|Gv=AtTů]&/]+ozdtH_"VBCpZ WoDl_з~]S7@+C;[Wz@pEᦛO/땭x또F!N!ݢbA3]-虯GghLý}|G#g A]ۣ78=M75-(A8m<0AwS7[WN{G[ѿ)ŕ*%Д)ntsPQ#ww{7_<0A \<x֯]>z%(.{]˙7#a>^lG ݥl)SmY#a!+BF\fEC( QD!a)>#kMv\=,Fw<0$A˩xtswEc9'RhDHps ? AKR]y]lfAzEU<+땹.wE<0.A˪yWW+2_ V"aa^X~boz(zXXW(q]Ao@'=M}hF[V.AzX\󽺸NAo}| zX^s-]Ao2*|܀=[֕+b=[|͝Ao@= 衐}qo]yS/ QC)MBCi̲)Pk-A閕_<3A(.fzbjl޺wE|^ z(GqDu|6=Ԧ9De^{Gߨ[G LCI>%GW+b%z`wgAom|z(~ hY.ڠ>>S=>bZ֕W+bpHCi#6y8"衸= A.[֕=|&z(O؈Ơ7AȐ_nYy$IjhQJ䒥F 7)8ACZ$n]yMps3!S=ԡFZ+7 8IC%M@̦[ހ:>>gzEij̈~~ȇAՈxW8KC=m AĈ~vлeM|n.P2 ҈~N znnSpI8 l:m Ej 7AC]%Gl>.szLs~^_χ`Ar#+ހ~&=TS/YA!=׶Tʡ{7 znC$$衁f V&ݹ檠f+zhq}wgUڽM}>=4Ѯ˄F >Ff-_z+4|hI zha;Ȗ#wz==<\ˎ{bp3[˷OfZv9pϦKAol>Ni|ٸcD?; FsLjB$%% #Ao@=4$d̮G܀}A[HNCcBFɬ]tsopsZO"Yu٠oB =Aə n.\л" 5A(zEs~VПp7A M7$[{HNC&Fsހ~R7=A1._?颿0?nYy^w]AAĘU77m96ܜ-,FCM7ކ o?pFhnџ z3ٚ/`9i"Š7?| I}i5vÈDП]|KJ[m]*ހ~_wX,IC,abgڹzt_Q>+%!a \f2ma MVџznB犰e z'BpHFOkXB4Gj٠7 b QiOoXGeTwݭ+XǨ[tsz~_wQe,NCTAc̤jQp';(2'!(ǪfD: 02 Wd]3? za;QP4H,ɠ7 =DB,~jDgA ђ~+O= g%Ez.P|(*f?mY ^2=(GBeZi znOAE*PVtЏ; R=$> V4wD P"eIb+iuA?>؛#R C2 Vm̻uNПп}ЇHk(HC$Z2o6p#ZF>Voe̺.v"p.}^JG^ p˛5xX(KC&"%^-nΈ8|[@YR)'3} 1!PdJȞ[Ќ[W@h(MC6j%b-򦛗}Ȝ (LC: 뤿|]sЏ&rGZ@q ,!nGA?ȆK(NCF%h~c cc~2Sp [ywTA?>7:*Tv [zwxʧh@rQz*rS\fG\@  0qf#k. AmwŎ&75*Z،]W4@vaUz-pN\.}oe !xt>w1^蜉sw8 8*=䗡B/q9# wWPY8b{ ߶CCwW8<򈾫 7)aPNOxΥi@~zEJ\.}oS%T" 'Uw2OJDZ=t$C)#gG=/|oR,A]I9}'Fot-) PTczD"S|oHeT#7Yb'UBtɾY P l!xbtgl߄<+FC%O}}1{A=ThrjD? z> ,bЧ\(-'F;A>KkzTTK#mgpޗmzVɑE?{>|,݂Я|͖!6}}xZ%T#g#y4?==#е8WڅT#(flyncw/@-BV_^<@-~^[%_>@-Ɛ=E^}:%3D(:ȣ8z42ݯPqtQHApD烼2 IT"a$TaxBE߸# iT"a,ݔQV~Rn}뗡n@%OMl5Y5{/PtLU[5 vO @%[3 ܉/=!M[rwk=>' = vGE_Ghnߒ zUYr~E|Wz!tJ0t /}G(KȨ3m|+%zj)$alcԹN/֗ OA杢KI#+@.t~W[z z`- wp_F}auO/_6~m [?冼 u욢WW,H*oD% [+y,LU'}Z^@ 8ㅚ AS^2MPH3xC#i l./EK% z$6#=ps(Ng鱋6yT 4^SuE,4oJ=06;ë2;A#NnHsi^>.A̧Ԧx9x&kc^Au$!+ &=p-ٶmЊn vx#ZM܆)AJ=[=AEЍzNGݨO|o<@i7{0r Gv#聅 yC>!A z`1XOwo2@dX҈7s 5^ L ~=́zFQ(Ot=P8M?[ $v|c IDAT2@I#`Oo@~((yu腠 |Vj ATqv:ntHZ=>O@E]bwO@=PU{z&}}o zkFOqzⱗ7`4h LC@Kt@ͥʼNJ}.s8 AĐ726 #glZi =as&=@GNf]Oɟ܎vWw7(|苠s6oᣠ_kЯ[_7| tL}dqЯFAaHC?z@~oMK$Qvrl%O'_&vܼ8$̍MRO^;AnisWy=0u;Կ_ŧrv~O<u7'˻?'6c@e`ߌO^#LO|:;s$<z ַ<`W?3_z r?V zL߇GAuP8׷ӛz=AGa?|ɗX~_AE0,ApDo؝d~$.M{n~k3"=sܬ`*(I\pYf? ?v?؆ L߶Am~?Y߱ހ=A:ӏCF_?vP`ѿދOP`2O|ǃ_oyL?I=oyr _ `'y?u ԟ[u =$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=$& 1A zHL@b=u@ vBƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄƄ*!ɪIENDB`performance/man/performance_roc.Rd0000644000176200001440000000332013565530445016771 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_roc.R \name{performance_roc} \alias{performance_roc} \title{Simple ROC curve} \usage{ performance_roc(x, ..., predictions, new_data) } \arguments{ \item{x}{A numeric vector, representing the outcome (0/1), or a model with binomial outcome.} \item{...}{One or more models with binomial outcome. In this case, \code{new_data} is ignored.} \item{predictions}{If \code{x} is numeric, a numeric vector of same length as \code{x}, representing the actual predicted values.} \item{new_data}{If \code{x} is a model, a data frame that is passed to \code{predict()} as \code{newdata}-argument. If \code{NULL}, the ROC for the full model is calculated.} } \value{ A data frame with three columns, the x/y-coordinate pairs for the ROC curve (\code{Sensivity} and \code{Specifity}), and a column with the model name. } \description{ This function calculates a simple ROC curves of x/y coordinates based on response and predictions of a binomial model. } \examples{ library(bayestestR) data(iris) set.seed(123) iris$y <- rbinom(nrow(iris), size = 1, .3) folds <- sample(nrow(iris), size = nrow(iris) / 8, replace = FALSE) test_data <- iris[folds, ] train_data <- iris[-folds, ] model <- glm(y ~ Sepal.Length + Sepal.Width, data = train_data, family = "binomial") performance_roc(model, new_data = test_data) roc <- performance_roc(model, new_data = test_data) area_under_curve(roc$Sensivity, roc$Specifity) m1 <- glm(y ~ Sepal.Length + Sepal.Width, data = iris, family = "binomial") m2 <- glm(y ~ Sepal.Length + Petal.Width, data = iris, family = "binomial") m3 <- glm(y ~ Sepal.Length + Species, data = iris, family = "binomial") performance_roc(m1, m2, m3) } performance/man/r2_nakagawa.Rd0000644000176200001440000000360113611777057016010 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_nakagawa.R \name{r2_nakagawa} \alias{r2_nakagawa} \title{Nakagawa's R2 for mixed models} \usage{ r2_nakagawa(model) } \arguments{ \item{model}{A mixed effects model.} } \value{ A list with the conditional and marginal R2 values. } \description{ Compute the marginal and conditional r-squared value for mixed effects models with complex random effects structures. } \details{ Marginal and conditional r-squared values for mixed models are calculated based on \cite{Nakagawa et al. 2017}. For more details on the computation of the variances, see \code{\link[insight]{get_variance}}. \cr \cr The marginal r-squared considers only the variance of the fixed effects, while the conditional r-squared takes both the fixed and random effects into account. The random effect variances are actually the mean random effect variances, thus the r-squared value is also appropriate for mixed models with random slopes or nested random effects (see \cite{Johnson 2014}). } \examples{ if (require("lme4")) { model <- lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) r2_nakagawa(model) } } \references{ \itemize{ \item Johnson, P. C. D. (2014). Extension of Nakagawa & Schielzeth’s R2 GLMM to random slopes models. Methods in Ecology and Evolution, 5(9), 944–946. \doi{10.1111/2041-210X.12225} \item Nakagawa, S., & Schielzeth, H. (2013). A general and simple method for obtaining R2 from generalized linear mixed-effects models. Methods in Ecology and Evolution, 4(2), 133–142. \doi{10.1111/j.2041-210x.2012.00261.x} \item Nakagawa, S., Johnson, P. C. D., & Schielzeth, H. (2017). The coefficient of determination R2 and intra-class correlation coefficient from generalized linear mixed-effects models revisited and expanded. Journal of The Royal Society Interface, 14(134), 20170213. \doi{10.1098/rsif.2017.0213} } } performance/man/check_heteroscedasticity.Rd0000644000176200001440000000156213620211155020651 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_heteroscedasticity.R \name{check_heteroscedasticity} \alias{check_heteroscedasticity} \title{Check model for (non-)constant error variance} \usage{ check_heteroscedasticity(x, ...) } \arguments{ \item{x}{A model object.} \item{...}{Currently not used.} } \value{ Invisibly returns the p-value of the test statistics. A p-value < 0.05 indicates a non-constant variance (heteroskedasticity). } \description{ Check model for (non-)constant error variance. } \note{ There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. } \examples{ m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) check_heteroscedasticity(m) # plot results x <- check_heteroscedasticity(m) plot(x) } performance/man/icc.Rd0000644000176200001440000001451413616504501014361 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/icc.R \name{icc} \alias{icc} \alias{icc.brmsfit} \title{Intraclass Correlation Coefficient (ICC)} \usage{ icc(model, ...) \method{icc}{brmsfit}(model, re.form = NULL, robust = TRUE, ci = 0.95, ...) } \arguments{ \item{model}{A (Bayesian) mixed effects model.} \item{...}{Currently not used.} \item{re.form}{Formula containing group-level effects to be considered in the prediction. If \code{NULL} (default), include all group-level effects. Else, for instance for nested models, name a specific group-level effect to calculate the variance decomposition for this group-level.} \item{robust}{Logical, if \code{TRUE}, the median instead of mean is used to calculate the central tendency of the variances.} \item{ci}{The Credible Interval level.} } \value{ A list with two values, the adjusted and conditional ICC. For models of class \code{brmsfit}, a list with two values, the decomposed ICC as well as the credible intervals for this ICC. } \description{ This function calculates the intraclass-correlation coefficient (ICC) - sometimes also called \emph{variance partition coefficient} (VPC) - for mixed effects models. The ICC can be calculated for all models supported by \code{\link[insight]{get_variance}}. For models fitted with the \pkg{brms}-package, a variance decomposition based on the posterior predictive distribution is calculated (see 'Details'). } \details{ \subsection{Interpretation}{ The ICC can be interpreted as \dQuote{the proportion of the variance explained by the grouping structure in the population}. This index goes from 0, if the grouping conveys no information, to 1, if all observations in a group are identical (Gelman \& Hill, 2007, p. 258). In other word, the ICC \dQuote{can also be interpreted as the expected correlation between two randomly drawn units that are in the same group} \cite{(Hox 2010: 15)}, although this definition might not apply to mixed models with more complex random effects structures. } \subsection{Calculation}{ The ICC is calculated by dividing the random effect variance, \ifelse{html}{\out{σ2i}}{\eqn{\sigma^2_i}}, by the total variance, i.e. the sum of the random effect variance and the residual variance, \ifelse{html}{\out{σ2ε}}{\eqn{\sigma^2_\epsilon}}. } \subsection{Adjusted and conditional ICC}{ \code{icc()} calculates an adjusted and conditional ICC, which both take all sources of uncertainty (i.e. of \emph{all random effects}) into account. While the \emph{adjusted ICC} only relates to the random effects, the \emph{conditional ICC} also takes the fixed effects variances into account (see \cite{Nakagawa et al. 2017}). Typically, the \emph{adjusted} ICC is of interest when the analysis of random effects is of interest. \code{icc()} returns a meaningful ICC also for more complex random effects structures, like models with random slopes or nested design (more than two levels) and is applicable for models with other distributions than Gaussian. For more details on the computation of the variances, see \code{\link[insight]{get_variance}}. } \subsection{ICC for unconditional and conditional models}{ Usually, the ICC is calculated for the null model ("unconditional model"). However, according to \cite{Raudenbush and Bryk (2002)} or \cite{Rabe-Hesketh and Skrondal (2012)} it is also feasible to compute the ICC for full models with covariates ("conditional models") and compare how much, e.g., a level-2 variable explains the portion of variation in the grouping structure (random intercept). } \subsection{ICC for specific group-levels}{ The proportion of variance for specific levels related to each other (e.g., similarity of level-1-units within level-2-units or level-2-units within level-3-units) must be calculated manually. Use \code{\link[insight]{get_variance}} to get the random intercept variances (between-group-variances) and residual variance of the model, and calculate the ICC for the various level correlations. \cr \cr For example, for the ICC between level 1 and 2: \cr \code{sum(insight::get_variance_intercept(model)) /} \cr \code{ (sum(insight::get_variance_intercept(model)) + insight::get_variance_residual(model))} \cr \cr For for the ICC between level 2 and 3: \cr \code{insight::get_variance_intercept(model)[2] /} \cr \code{ sum(insight::get_variance_intercept(model))} } \subsection{ICC for brms-models}{ If \code{model} is of class \code{brmsfit}, \code{icc()} calculates a variance decomposition based on the posterior predictive distribution. In this case, first, the draws from the posterior predictive distribution \emph{not conditioned} on group-level terms (\code{posterior_predict(..., re.form = NA)}) are calculated as well as draws from this distribution \emph{conditioned} on \emph{all random effects} (by default, unless specified else in \code{re.form}) are taken. Then, second, the variances for each of these draws are calculated. The "ICC" is then the ratio between these two variances. This is the recommended way to analyse random-effect-variances for non-Gaussian models. It is then possible to compare variances across models, also by specifying different group-level terms via the \code{re.form}-argument. \cr \cr Sometimes, when the variance of the posterior predictive distribution is very large, the variance ratio in the output makes no sense, e.g. because it is negative. In such cases, it might help to use \code{robust = TRUE}. } } \examples{ if (require("lme4")) { model <- lme4::lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) icc(model) } } \references{ \itemize{ \item Hox, J. J. (2010). Multilevel analysis: techniques and applications (2nd ed). New York: Routledge. \item Nakagawa, S., Johnson, P. C. D., & Schielzeth, H. (2017). The coefficient of determination R2 and intra-class correlation coefficient from generalized linear mixed-effects models revisited and expanded. Journal of The Royal Society Interface, 14(134), 20170213. \doi{10.1098/rsif.2017.0213} \item Rabe-Hesketh, S., & Skrondal, A. (2012). Multilevel and longitudinal modeling using Stata (3rd ed). College Station, Tex: Stata Press Publication. \item Raudenbush, S. W., & Bryk, A. S. (2002). Hierarchical linear models: applications and data analysis methods (2nd ed). Thousand Oaks: Sage Publications. } } performance/man/binned_residuals.Rd0000644000176200001440000000521613565530445017145 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/binned_residuals.R \name{binned_residuals} \alias{binned_residuals} \title{Binned residuals for logistic regression} \usage{ binned_residuals(model, term = NULL, n_bins = NULL, ...) } \arguments{ \item{model}{A \code{glm}-object with binomial-family.} \item{term}{Name of independent variable from \code{x}. If not \code{NULL}, average residuals for the categories of \code{term} are plotted; else, average residuals for the estimated probabilities of the response are plotted.} \item{n_bins}{Numeric, the number of bins to divide the data. If \code{n_bins = NULL}, the square root of the number of observations is taken.} \item{...}{Further argument like \code{size} (for point-size) or \code{color} (for point-colors).} } \value{ A data frame representing the data that is mapped to the plot, which is automatically plotted. In case all residuals are inside the error bounds, points are black. If some of the residuals are outside the error bounds (indicates by the grey-shaded area), blue points indicate residuals that are OK, while red points indicate model under- or overfitting for the related range of estimated probabilities. } \description{ Check model quality of logistic regression models. } \details{ Binned residual plots are achieved by \dQuote{dividing the data into categories (bins) based on their fitted values, and then plotting the average residual versus the average fitted value for each bin.} \cite{(Gelman, Hill 2007: 97)}. If the model were true, one would expect about 95\% of the residuals to fall inside the error bounds. \cr \cr If \code{term} is not \code{NULL}, one can compare the residuals in relation to a specific model predictor. This may be helpful to check if a term would fit better when transformed, e.g. a rising and falling pattern of residuals along the x-axis (the pattern is indicated by a green line) is a signal to consider taking the logarithm of the predictor (cf. Gelman and Hill 2007, pp. 97ff). } \note{ Since \code{binned_residuals()} returns a data frame, the default action for the result is \emph{printing}. However, the `print()`-method for \code{binned_residuals()} actually creates a plot. For further modifications of the plot, use `print()` and add ggplot-layers to the return values, e.g \code{plot(binned_residuals(model)) + see::scale_color_pizza()}. } \examples{ model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") binned_residuals(model) } \references{ Gelman, A., & Hill, J. (2007). Data analysis using regression and multilevel/hierarchical models. Cambridge; New York: Cambridge University Press. } performance/man/r2_kullback.Rd0000644000176200001440000000137613565530445016031 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_kl.R \name{r2_kullback} \alias{r2_kullback} \title{Kullback-Leibler R2} \usage{ r2_kullback(model, adjust = TRUE) } \arguments{ \item{model}{A generalized linear model.} \item{adjust}{Logical, if \code{TRUE} (the default), the adjusted R2 value is returned.} } \value{ A named vector with the R2 value. } \description{ Calculates the Kullback-Leibler-divergence-based R2 for generalized linear models. } \examples{ model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") r2_kullback(model) } \references{ Cameron, A. C. and Windmeijer, A. G. (1997) An R-squared measure of goodness of fit for some common nonlinear regression models. Journal of Econometrics, 77: 329-342. } performance/man/r2_nagelkerke.Rd0000644000176200001440000000116613565530445016346 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_nagelkerke.R \name{r2_nagelkerke} \alias{r2_nagelkerke} \title{Nagelkerke's R2} \usage{ r2_nagelkerke(model) } \arguments{ \item{model}{A generalized linear model, including cumulative links resp. multinomial models.} } \value{ A named vector with the R2 value. } \description{ Calculate Nagelkerke's pseudo-R2. } \examples{ model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") r2_nagelkerke(model) } \references{ Nagelkerke, N. J. (1991). A note on a general definition of the coefficient of determination. Biometrika, 78(3), 691-692. } performance/man/check_autocorrelation.Rd0000644000176200001440000000203713565530445020200 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_autocorrelation.R \name{check_autocorrelation} \alias{check_autocorrelation} \alias{check_autocorrelation.default} \title{Check model for independence of residuals.} \usage{ check_autocorrelation(x, ...) \method{check_autocorrelation}{default}(x, nsim = 1000, ...) } \arguments{ \item{x}{A model object.} \item{...}{Currently not used.} \item{nsim}{Number of simulations for the Durbin-Watson-Test.} } \value{ Invisibly returns the p-value of the test statistics. A p-value < 0.05 indicates autocorrelated residuals. } \description{ Check model for independence of residuals, i.e. for autocorrelation of error terms. } \details{ Performs a Durbin-Watson-Test to check for autocorrelated residuals. In case of autocorrelation, robust standard errors return more accurate results for the estimates, or maybe a mixed model with error term for the cluster groups should be used. } \examples{ m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) check_autocorrelation(m) } performance/man/check_distribution.Rd0000644000176200001440000000455113620211155017472 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_distribution.R \name{check_distribution} \alias{check_distribution} \title{Classify the distribution of a model-family using machine learning} \usage{ check_distribution(model) } \arguments{ \item{model}{Typically, a model (that should response to \code{residuals()}). May also be a numeric vector.} } \description{ Choosing the right distributional family for regression models is essential to get more accurate estimates and standard errors. This function may help to check a models' distributional family and see if the model-family probably should be reconsidered. Since it is difficult to exactly predict the correct model family, consider this function as somewhat experimental. } \details{ This function uses an internal random forest model to classify the distribution from a model-family. Currently, following distributions are trained (i.e. results of \code{check_distribution()} may be one of the following): \code{"bernoulli"}, \code{"beta"}, \code{"beta-binomial"}, \code{"binomial"}, \code{"chi"}, \code{"exponential"}, \code{"F"}, \code{"gamma"}, \code{"lognormal"}, \code{"normal"}, \code{"negative binomial"}, \code{"negative binomial (zero-inflated)"}, \code{"pareto"}, \code{"poisson"}, \code{"poisson (zero-inflated)"}, \code{"uniform"} and \code{"weibull"}. \cr \cr Note the similarity between certain distributions according to shape, skewness, etc. Thus, the predicted distribution may not be perfectly representing the distributional family of the underlying fitted model, or the response value. \cr \cr There is a \code{plot()} method, which shows the probabilities of all predicted distributions, however, only if the probability is greater than zero. } \note{ This function is somewhat experimental and might be improved in future releases. The final decision on the model-family should also be based on theoretical aspects and other information about the data and the model. \cr \cr There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. } \examples{ if (require("lme4")) { library(lme4) library(parameters) data(sleepstudy) model <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy) check_distribution(model) plot(check_distribution(model)) } } performance/man/r2_coxsnell.Rd0000644000176200001440000000273113565530445016064 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_coxsnell.R \name{r2_coxsnell} \alias{r2_coxsnell} \title{Cox & Snell's R2} \usage{ r2_coxsnell(model) } \arguments{ \item{model}{Model with binary outcome.} } \value{ A named vector with the R2 value. } \description{ Calculates the pseudo-R2 value based on the proposal from \cite{Cox & Snell (1989)}. } \details{ This index was proposed by \cite{Cox & Snell (1989, pp. 208-9)} and, apparently independently, by \cite{Magee (1990)}; but had been suggested earlier for binary response models by \cite{Maddala (1983)}. However, this index achieves a maximum of less than 1 for discrete models (i.e. models whose likelihood is a product of probabilities) which have a maximum of 1, instead of densities, which can become infinite \cite{(Nagelkerke, 1991)}. } \examples{ model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") r2_coxsnell(model) } \references{ \itemize{ \item Cox, D. R., Snell, E. J. (1989). Analysis of binary data (Vol. 32). Monographs on Statistics and Applied Probability. \item Magee, L. (1990). R 2 measures based on Wald and likelihood ratio joint significance tests. The American Statistician, 44(3), 250-253. \item Maddala, G. S. (1986). Limited-dependent and qualitative variables in econometrics (No. 3). Cambridge university press. \item Nagelkerke, N. J. (1991). A note on a general definition of the coefficient of determination. Biometrika, 78(3), 691-692. } } performance/man/performance_lrt.Rd0000644000176200001440000000174713616504501017011 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_lrt.R \name{performance_lrt} \alias{performance_lrt} \title{Likelihood-Ratio-Test for Model Comparison} \usage{ performance_lrt(...) } \arguments{ \item{...}{Multiple model objects, which should respond to \code{anova()}.} } \value{ A data frame, based on the results from \code{anova()}. } \description{ Compute Likelihood-Ratio-Test for model comparison. } \details{ This only makes statistical sense if the models are nested. It is conventional to list the models from smallest to largest, but this is up to the user. The output shows the tests of the models against one another in the order specified. } \examples{ m1 <- lm(mpg ~ wt + cyl, data = mtcars) m2 <- lm(mpg ~ wt + cyl + gear, data = mtcars) m3 <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) performance_lrt(m1, m2, m3) } \seealso{ \code{\link[=compare_performance]{compare_performance()}} to compare performance of many different models. } performance/man/r2.Rd0000644000176200001440000000255613611777057014166 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2.R \name{r2} \alias{r2} \title{Compute the model's R2} \usage{ r2(model, ...) } \arguments{ \item{model}{A statistical model.} \item{...}{Currently not used.} } \value{ Returns a list containing values related to the most appropriate R2 for the given model. See the list below: \itemize{ \item Logistic models: \link[=r2_tjur]{Tjur's R2} \item General linear models: \link[=r2_nagelkerke]{Nagelkerke's R2} \item Multinomial Logit: \link[=r2_mcfadden]{McFadden's R2} \item Models with zero-inflation: \link[=r2_zeroinflated]{R2 for zero-inflated models} \item Mixed models: \link[=r2_nakagawa]{Nakagawa's R2} \item Bayesian models: \link[=r2_bayes]{R2 bayes} } } \description{ Calculate the R2 value for different model objects. Depending on the model, R2, pseudo-R2 or marginal / adjusted R2 values are returned. } \examples{ model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") r2(model) if (require("lme4")) { model <- lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) r2(model) } } \seealso{ \code{\link{r2_bayes}}, \code{\link{r2_coxsnell}}, \code{\link{r2_kullback}}, \code{\link{r2_loo}}, \code{\link{r2_mcfadden}}, \code{\link{r2_nagelkerke}}, \code{\link{r2_nakagawa}}, \code{\link{r2_tjur}}, \code{\link{r2_xu}} and \code{\link{r2_zeroinflated}}. } performance/man/check_outliers.Rd0000644000176200001440000003122313620211155016615 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_outliers.R \name{check_outliers} \alias{check_outliers} \alias{check_outliers.default} \alias{check_outliers.numeric} \alias{check_outliers.data.frame} \title{Outliers detection (check for influential observations)} \usage{ check_outliers(x, ...) \method{check_outliers}{default}(x, method = c("cook", "pareto"), threshold = NULL, ...) \method{check_outliers}{numeric}(x, method = "zscore", threshold = NULL, ...) \method{check_outliers}{data.frame}(x, method = "mahalanobis", threshold = NULL, ...) } \arguments{ \item{x}{A model or a data.frame object.} \item{...}{When \code{method = "ics"}, further arguments in \code{...} are passed down to \code{ICSOutlier::ics.outlier()}.} \item{method}{The outlier detection method(s). Can be "all" or some of c("cook", "pareto", "zscore", "iqr", "mahalanobis", "robust", "mcd", "ics", "optics", "iforest", "lof").} \item{threshold}{A list containing the threshold values for each method (e.g. \code{list('mahalanobis' = 7, 'cook' = 1)}), above which an observation is considered as outlier. If \code{NULL}, default values will be used (see 'Details').} } \value{ Check (message) on whether outliers were detected or not, as well as a data frame (with the original data that was used to fit the model), including information on the distance measure and whether or not an observation is considered as outlier. } \description{ Checks for and locates influential observations (i.e., "outliers") via several distance and/or clustering methods. If several methods are selected, the returned "Outlier" vector will be a composite outlier score, made of the average of the binary (0 or 1) results of each method. It represents the probability of each observation of being classified as an outlier by at least one method. The decision rule used by default is to classify as outliers observations which composite outlier score is superior or equal to 0.5 (i.e., that were classified as outliers by at least half of the methods). See the \strong{Details} section below for a description of the methods. } \details{ Outliers can be defined as particularly influential observations. Most methods rely on the computation of some distance metric, and the observations greater than a certain threshold are considered outliers. Importantly, outliers detection methods are meant to provide information to the researcher, rather than being an automatized procedure which mindless application is a substitute for thinking. An \strong{example sentence} for reporting the usage of the composite method could be: \emph{"Based on a composite outlier score (see the 'check_outliers' function in the 'performance' R package; Lüdecke et al., 2019) obtained via the joint application of multiple outliers detection algorithms (Z-scores, Iglewicz, 1993; Interquartile range (IQR); Mahalanobis distance, Cabana, 2019; Robust Mahalanobis distance, Gnanadesikan & Kettenring, 1972; Minimum Covariance Determinant, Leys et al., 2018; Invariant Coordinate Selection, Archimbaud et al., 2018; OPTICS, Ankerst et al., 1999; Isolation Forest, Liu et al. 2008; and Local Outlier Factor, Breunig et al., 2000), we excluded n participants that were classified as outliers by at least half of the methods used."} \subsection{Model-specific methods}{ \itemize{ \item \strong{Cook's Distance}: Among outlier detection methods, Cook's distance and leverage are less common than the basic Mahalanobis distance, but still used. Cook's distance estimates the variations in regression coefficients after removing each observation, one by one (Cook, 1977). Since Cook's distance is in the metric of an F distribution with p and n-p degrees of freedom, the median point of the quantile distribution can be used as a cut-off (Bollen, 1985). A common approximation or heuristic is to use 4 divided by the numbers of observations, which usually corresponds to a lower threshold (i.e., more outliers are detected). This only works for Frequentist models. For Bayesian models, see \code{pareto}. \item \strong{Pareto}: The reliability and approximate convergence of Bayesian models can be assessed using the estimates for the shape parameter k of the generalized Pareto distribution. If the estimated tail shape parameter k exceeds 0.5, the user should be warned, although in practice the authors of the \code{loo} package observed good performance for values of k up to 0.7 (the default threshold used by \code{performance}). }} \subsection{Univariate methods}{ \itemize{ \item \strong{Z-scores}: The Z-score, or standard score, is a way of describing a data point as deviance from a central value, in terms of standard deviations from the mean or, as it is here the case by default (Iglewicz, 1993), in terms of Median Absolute Deviation (MAD) from the median (which are robust measures of dispersion and centrality). The default threshold to classify outliers is 1.959, corresponding to the 2.5\% most extreme observations (assuming the data is normally distributed). Importantly, the Z-score method is univariate: it is computed column by column. If a data.frame is passed, then the maximum distance is kept for each observations. Thus, all observations that are extreme for at least one variable will be detected. However, this method is not suited for high dimensional data (with many columns), returning too liberal results (detecting many outliers). \item \strong{IQR}: Using the IQR (interquartile range) is a robust method developed by John Tukey, which often appears in box-and-whisker plots (e.g., in \code{geom_boxplot}). The interquartile range is the range between the first and the third quartiles. Tukey considered as outliers any data point that fell outside of either 1.5 times (the default threshold) the IQR below the first or above the third quartile. Similar to the Z-score method, this is a univariate method for outliers detection, returning outliers detected for at least one column, and might thus not be suited to high dimensional data. }} \subsection{Multivariate methods}{ \itemize{ \item \strong{Mahalanobis Distance}: Mahalanobis distance (Mahalanobis, 1930) is often used for multivariate outliers detection as this distance takes into account the shape of the observations. The default \code{threshold} is often arbitrarily set to some deviation (in terms of SD or MAD) from the mean (or median) of the Mahalanobis distance. However, as the Mahalanobis distance can be approximated by a Chi squared distribution (Rousseeuw & Van Zomeren, 1990), we can use the alpha quantile of the chi-square distribution with k degrees of freedom (k being the number of columns). By default, the alpha threshold is set to 0.025 (corresponding to the 2.5\% most extreme observations; Cabana, 2019). This criterion is a natural extension of the median plus or minus a coefficient times the MAD method (Leys et al., 2013). \item \strong{Robust Mahalanobis Distance}: A robust version of Mahalanobis distance using an Orthogonalized Gnanadesikan-Kettenring pairwise estimator (Gnanadesikan \& Kettenring, 1972). Requires the \pkg{bigutilsr} package. \item \strong{Minimum Covariance Determinant (MCD)}: Another robust version of Mahalanobis. Leys et al. (2018) argue that Mahalanobis Distance is not a robust way to determine outliers, as it uses the means and covariances of all the data – including the outliers – to determine individual difference scores. Minimum Covariance Determinant calculates the mean and covariance matrix based on the most central subset of the data (by default, 66\%), before computing the Mahalanobis Distance. This is deemed to be a more robust method of identifying and removing outliers than regular Mahalanobis distance. \item \strong{Invariant Coordinate Selection (ICS)}: The outlier are detected using ICS, which by default uses an alpha threshold of 0.025 (corresponding to the 2.5\% most extreme observations) as a cut-off value for outliers classification. Refer to the help-file of \code{ICSOutlier::ics.outlier()} to get more details about this procedure. Note that \code{method = "ics"} requires both \pkg{ICS} and \pkg{ICSOutlier} to be installed, and that it takes some time to compute the results. \item \strong{OPTICS}: The Ordering Points To Identify the Clustering Structure (OPTICS) algorithm (Ankerst et al., 1999) is using similar concepts to DBSCAN (an unsupervised clustering technique that can be used for outliers detection). The threshold argument is passed as \code{minPts}, which corresponds to the minimum size of a cluster. By default, this size is set at 2 times the number of columns (Sander et al., 1998). Compared to the others techniques, that will always detect several outliers (as these are usually defined as a percentage of extreme values), this algorithm functions in a different manner and won't always detect outliers. Note that \code{method = "optics"} requires the \pkg{dbscan} package to be installed, and that it takes some time to compute the results. \item \strong{Isolation Forest}: The outliers are detected using the anomaly score of an isolation forest (a class of random forest). The default threshold of 0.025 will classify as outliers the observations located at \code{qnorm(1-0.025) * MAD)} (a robust equivalent of SD) of the median (roughly corresponding to the 2.5\% most extreme observations). Requires the \pkg{solitude} package. \item \strong{Local Outlier Factor}: Based on a K nearest neighbours algorithm, LOF compares the local density of an point to the local densities of its neighbors instead of computing a distance from the center (Breunig et al., 2000). Points that have a substantially lower density than their neighbors are considered outliers. A LOF score of approximately 1 indicates that density around the point is comparable to its neighbors. Scores significantly larger than 1 indicate outliers. The default threshold of 0.025 will classify as outliers the observations located at \code{qnorm(1-0.025) * SD)} of the log-transformed LOF distance. Requires the \pkg{dbscan} package. }} \subsection{Threshold specification}{ Default thresholds are currently specified as follows: \code{ list( zscore = stats::qnorm(p = 1 - 0.025), iqr = 1.5, cook = stats::qf(0.5, ncol(x), nrow(x) - ncol(x)), pareto = 0.7, mahalanobis = stats::qchisq(p = 1 - 0.025, df = ncol(x)), robust = stats::qchisq(p = 1 - 0.025, df = ncol(x)), mcd = stats::qchisq(p = 1 - 0.025, df = ncol(x)), ics = 0.025, optics = 2 * ncol(x), iforest = 0.025, lof = 0.025 ) }} } \note{ There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. } \examples{ # Univariate check_outliers(mtcars$mpg) # Multivariate # select only mpg and disp (continuous) mt1 <- mtcars[, c(1, 3, 4)] # create some fake outliers and attach outliers to main df mt2 <- rbind(mt1, data.frame(mpg = c(37, 40), disp = c(300, 400), hp = c(110, 120))) # fit model with outliers model <- lm(disp ~ mpg + hp, data = mt2) check_outliers(model) # plot(check_outliers(model)) check_outliers(model, method = c("mahalabonis", "mcd")) \dontrun{ # This one takes some seconds to finish... check_outliers(model, method = "ics") # For dataframes check_outliers(mtcars) check_outliers(mtcars, method = "all") } } \references{ \itemize{ \item Archimbaud, A., Nordhausen, K., \& Ruiz-Gazen, A. (2018). ICS for multivariate outlier detection with application to quality control. Computational Statistics & Data Analysis, 128, 184–199. \doi{10.1016/j.csda.2018.06.011} \item Gnanadesikan, R., \& Kettenring, J. R. (1972). Robust estimates, residuals, and outlier detection with multiresponse data. Biometrics, 81-124. \item Bollen, K. A., & Jackman, R. W. (1985). Regression diagnostics: An expository treatment of outliers and influential cases. Sociological Methods & Research, 13(4), 510-542. \item Cabana, E., Lillo, R. E., \& Laniado, H. (2019). Multivariate outlier detection based on a robust Mahalanobis distance with shrinkage estimators. arXiv preprint arXiv:1904.02596. \item Cook, R. D. (1977). Detection of influential observation in linear regression. Technometrics, 19(1), 15-18. \item Iglewicz, B., & Hoaglin, D. C. (1993). How to detect and handle outliers (Vol. 16). Asq Press. \item Leys, C., Klein, O., Dominicy, Y., \& Ley, C. (2018). Detecting multivariate outliers: Use a robust variant of Mahalanobis distance. Journal of Experimental Social Psychology, 74, 150-156. \item Liu, F. T., Ting, K. M., & Zhou, Z. H. (2008, December). Isolation forest. In 2008 Eighth IEEE International Conference on Data Mining (pp. 413-422). IEEE. \item Rousseeuw, P. J., \& Van Zomeren, B. C. (1990). Unmasking multivariate outliers and leverage points. Journal of the American Statistical association, 85(411), 633-639. } } performance/man/performance_logloss.Rd0000644000176200001440000000200713571160015017656 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_logloss.R \name{performance_logloss} \alias{performance_logloss} \title{Log Loss} \usage{ performance_logloss(model, verbose = TRUE, ...) } \arguments{ \item{model}{Model with binary outcome.} \item{verbose}{Toggle off warnings.} \item{...}{Currently not used.} } \value{ Numeric, the log loss of \code{model}. } \description{ Compute the log loss for models with binary outcome. } \details{ Logistic regression models predict the probability of an outcome of being a "success" or "failure" (or 1 and 0 etc.). \code{performance_logloss()} evaluates how good or bad the predicted probabilities are. High values indicate bad predictions, while low values indicate good predictions. The lower the log-loss, the better the model predicts the outcome. } \examples{ data(mtcars) m <- glm(formula = vs ~ hp + wt, family = binomial, data = mtcars) performance_logloss(m) } \seealso{ \code{\link[=performance_score]{performance_score()}} } performance/man/r2_efron.Rd0000644000176200001440000000205413616504501015333 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_efron.R \name{r2_efron} \alias{r2_efron} \title{Efron's R2} \usage{ r2_efron(model) } \arguments{ \item{model}{Generalized linear model.} } \value{ The R2 value. } \description{ Calculates Efron's pseudo R2. } \details{ Efron's R2 is calculated by taking the sum of the squared model residuals, divided by the total variability in the dependent variable. This R2 equals the squared correlation between the predicted values and actual values, however, note that model residuals from generalized linear models are not generally comparable to those of OLS. } \examples{ ## Dobson (1990) Page 93: Randomized Controlled Trial: counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) # outcome <- gl(3, 1, 9) treatment <- gl(3, 3) model <- glm(counts ~ outcome + treatment, family = poisson()) r2_efron(model) } \references{ \itemize{ \item Efron, B. (1978). Regression and ANOVA with zero-one data: Measures of residual variation. Journal of the American Statistical Association, 73, 113-121. } } performance/man/model_performance.lm.Rd0000644000176200001440000000362713610307577017726 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model_performance.lm.R \name{model_performance.lm} \alias{model_performance.lm} \alias{model_performance.glm} \title{Performance of Regression Models} \usage{ \method{model_performance}{lm}(model, metrics = "all", verbose = TRUE, ...) \method{model_performance}{glm}(model, metrics = "all", verbose = TRUE, ...) } \arguments{ \item{model}{A model.} \item{metrics}{Can be \code{"all"}, \code{"common"} or a character vector of metrics to be computed (some of \code{c("AIC", "BIC", "R2", "RMSE", "LOGLOSS", "PCP", "SCORE")}). \code{"common"} will compute AIC, BIC, R2 and RMSE.} \item{verbose}{Toggle off warnings.} \item{...}{Arguments passed to or from other methods.} } \value{ A data frame (with one row) and one column per "index" (see \code{metrics}). } \description{ Compute indices of model performance for regression models. } \details{ Depending on \code{model}, following indices are computed: \itemize{ \item{\strong{AIC}} {Akaike's Information Criterion, see \code{\link[stats]{AIC}}} \item{\strong{BIC}} {Bayesian Information Criterion, see \code{\link[stats]{BIC}}} \item{\strong{R2}} {r-squared value, see \code{\link{r2}}} \item{\strong{R2_adj}} {adjusted r-squared, see \code{\link{r2}}} \item{\strong{RMSE}} {root mean squared error, see \code{\link{performance_rmse}}} \item{\strong{LOGLOSS}} {Log-loss, see \code{\link{performance_logloss}}} \item{\strong{SCORE_LOG}} {score of logarithmic proper scoring rule, see \code{\link{performance_score}}} \item{\strong{SCORE_SPHERICAL}} {score of spherical proper scoring rule, see \code{\link{performance_score}}} \item{\strong{PCP}} {percentage of correct predictions, see \code{\link{performance_pcp}}} } } \examples{ model <- lm(mpg ~ wt + cyl, data = mtcars) model_performance(model) model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") model_performance(model) } performance/man/r2_mckelvey.Rd0000644000176200001440000000237613565530445016061 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_mckelvey.R \name{r2_mckelvey} \alias{r2_mckelvey} \title{McKelvey & Zavoinas R2} \usage{ r2_mckelvey(model) } \arguments{ \item{model}{Generalized linear model.} } \value{ The R2 value. } \description{ Calculates McKelvey & Zavoinas pseudo R2. } \details{ McKelvey & Zavoinas R2 is based on the explained variance, where the variance of the predicted response is divided by the sum of the variance of the predicted response and residual variance. For binomial models, the residual variance is either \code{pi^2/3} for logit-link and 1 for probit-link. For poisson-models, the residual variance is based on log-normal approximation, similar to the \emph{distribution-specific variance} as described in \code{\link[insight]{get_variance}}. } \examples{ ## Dobson (1990) Page 93: Randomized Controlled Trial: counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) # outcome <- gl(3, 1, 9) treatment <- gl(3, 3) model <- glm(counts ~ outcome + treatment, family = poisson()) r2_mckelvey(model) } \references{ \itemize{ \item McKelvey, R., Zavoina, W. (1975), "A Statistical Model for the Analysis of Ordinal Level Dependent Variables", Journal of Mathematical Sociology 4, S. 103–120. } } performance/man/r2_zeroinflated.Rd0000644000176200001440000000221413616504501016706 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_zeroinflated.R \name{r2_zeroinflated} \alias{r2_zeroinflated} \title{R2 for models with zero-inflation} \usage{ r2_zeroinflated(model, method = c("default", "correlation")) } \arguments{ \item{model}{A model.} \item{method}{Indicates the method to calculate R2. See 'Details'. May be abbreviated.} } \value{ For the default-method, a list with the R2 and adjusted R2 values. For \code{method = "correlation"}, a named numeric vector with the correlation-based R2 value. } \description{ Calculates R2 for models with zero-inflation component, including mixed effects models. } \details{ The default-method calculates an R2 value based on the residual variance divided by the total variance. For \code{method = "correlation"}, R2 is a correlation-based measure, which is rather crude. It simply computes the squared correlation between the model's actual and predicted response. } \examples{ \donttest{ if (require("pscl")) { data(bioChemists) model <- zeroinfl( art ~ fem + mar + kid5 + ment | kid5 + phd, data = bioChemists ) r2_zeroinflated(model) } } } performance/man/cronbachs_alpha.Rd0000644000176200001440000000206313616504501016726 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cronbachs_alpha.R \name{cronbachs_alpha} \alias{cronbachs_alpha} \title{Cronbach's Alpha for Items or Scales} \usage{ cronbachs_alpha(x) } \arguments{ \item{x}{A matrix or a data frame.} } \value{ The Cronbach's Alpha value for \code{x}. } \description{ Compute various measures of internal consistencies for tests or item-scales of questionnaires. } \details{ The Cronbach's Alpha value for \code{x}. A value closer to 1 indicates greater internal consistency, where usually following rule of thumb is applied to interpret the results: \ifelse{html}{\out{α}}{\eqn{\alpha}{alpha}} < 0.5 is unacceptable, 0.5 < \ifelse{html}{\out{α}}{\eqn{\alpha}{alpha}} < 0.6 is poor, 0.6 < \ifelse{html}{\out{α}}{\eqn{\alpha}{alpha}} < 0.7 is questionable, 0.7 < \ifelse{html}{\out{α}}{\eqn{\alpha}{alpha}} < 0.8 is acceptable, and everything > 0.8 is good or excellent. } \examples{ data(mtcars) x <- mtcars[, c("cyl", "gear", "carb", "hp")] cronbachs_alpha(x) } performance/man/performance_rmse.Rd0000644000176200001440000000252513611777057017166 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_rmse.R \name{performance_rmse} \alias{performance_rmse} \alias{rmse} \title{Root Mean Squared Error} \usage{ performance_rmse(model, normalized = FALSE, verbose = TRUE) rmse(model, normalized = FALSE, verbose = TRUE) } \arguments{ \item{model}{A model.} \item{normalized}{Logical, use \code{TRUE} if normalized rmse should be returned.} \item{verbose}{Toggle off warnings.} } \value{ Numeric, the root mean squared error. } \description{ Compute root mean squared error for (mixed effects) models, including Bayesian regression models. } \details{ The RMSE is the square root of the variance of the residuals and indicates the absolute fit of the model to the data (difference between observed data to model's predicted values). It can be interpreted as the standard deviation of the unexplained variance, and is in the same units as the response variable. Lower values indicate better model fit. \cr \cr The normalized RMSE is the proportion of the RMSE related to the range of the response variable. Hence, lower values indicate less residual variance. } \examples{ if (require("nlme")) { m <- lme(distance ~ age, data = Orthodont) # RMSE performance_rmse(m, normalized = FALSE) # normalized RMSE performance_rmse(m, normalized = TRUE) } } performance/DESCRIPTION0000644000176200001440000000412013620350016014252 0ustar liggesusersPackage: performance Type: Package Title: Assessment of Regression Models Performance Version: 0.4.4 Authors@R: c( person("Daniel", "Lüdecke", role = c("aut", "cre"), email = "d.luedecke@uke.de", comment = c(ORCID = "0000-0002-8895-3206")), person("Dominique", "Makowski", email = "dom.makowski@gmail.com", role = c("aut", "ctb"), comment = c(ORCID = "0000-0001-5375-9967")), person("Philip", "Waggoner", email = "philip.waggoner@gmail.com", role = c("aut", "ctb"), comment = c(ORCID = "0000-0002-7825-7573")) ) Maintainer: Daniel Lüdecke Description: Utilities for computing measures to assess model quality, which are not directly provided by R's 'base' or 'stats' packages. These include e.g. measures like r-squared, intraclass correlation coefficient (Nakagawa, Johnson & Schielzeth (2017) ), root mean squared error or functions to check models for overdispersion, singularity or zero-inflation and more. Functions apply to a large variety of regression models, including generalized linear models, mixed effects models and Bayesian models. URL: https://easystats.github.io/performance/ BugReports: https://github.com/easystats/performance/issues Depends: R (>= 3.2) Imports: insight (>= 0.8.1), bayestestR (>= 0.5.0), stats, utils Suggests: AER, betareg, bigutilsr, brms, covr, cplm, dbscan, fixest, glmmTMB, ICS, ICSOutlier, lavaan, lme4, loo, Matrix, MASS, mlogit, nlme, ordinal, parallel, parameters (>= 0.5.0), pscl, psych, randomForest, rmarkdown, rstanarm, rstantools, see (>= 0.4.0), survival, solitude, testthat, tweedie, VGAM, spelling License: GPL-3 Encoding: UTF-8 LazyData: true RoxygenNote: 7.0.2 Language: en-US NeedsCompilation: no Packaged: 2020-02-10 08:35:16 UTC; mail Author: Daniel Lüdecke [aut, cre] (), Dominique Makowski [aut, ctb] (), Philip Waggoner [aut, ctb] () Repository: CRAN Date/Publication: 2020-02-10 21:50:06 UTC performance/build/0000755000176200001440000000000013620212702013645 5ustar liggesusersperformance/build/partial.rdb0000644000176200001440000007667313620212702016015 0ustar liggesuserswGX,>'@R|H@ 7 @HHIf'2KY!Mktxw=3gg짝z|iw=q#oVE2 GUQwJT܈{#ƍ7ߛJҩҩv _ۓJm$vR 阞ENDALEş6ȡgE Ų"&].KzEtQ'Ն-K%H&RJU_~$P>hfX&9BmNjkUjyYMej>c6nydXgJF^Eje_I*;;fܸ%B|xc<ϑ|>n/ 8rZ+ò#GRj`+ x i),MLL@<[*A-& M5g 49,\!LuHHPLIj>*◐R4]GEmmobQ`bG5ԫU _p=_G~Խ,ϣD?u߻uނHKxs3֨ed؆.[>#o{)[>!>m*;/!>;lp~vݢIu1HEt`v/b6޹df9mYWh(54G"l,yE܃iUݼI^tK"}P6 *0u<5 Be5>#+U/(tV6[x@|7 R,MovFJWFme)1E`]*W1|,UnW5)ʉENOӾGk>MTnG1cXBzH}ai&C]G9ħlp6 ܖy{9 cyJ .ry2k8d$m`xr_h\6{r"{~V+ҟOL}?Z'HIt?y!;$GOJrfdljb -?  ˱UB>ḛvMP,3'U9xi9a\ d.r"5/E@Oc5?Cq#\gc}fEEIJnsXh Rf$E*& ?dnETNao>j M n#0Ӆ$c<,qϒgA|Az !#\Uȋ^߁fc_u?z=ѩOяWFA;[t9 j?GF (i2u><ԶcnC G)_V=j۵K* Vj8ɼKǐhL.^0~Uڨ9xV!f+fyߪg˃á Ź`|2GLhg*j: tJxF#u8#FT8Ew?A` mX Fb[uIXAy<_(Q/b iNw }Fx;rAfs\q sҧ:1 A;_AetWEhv2.~ nvesZTӈ!^5T:uS{ERu Q6{jHp^xJ/)5SĤK_Z#SY: Kˇ|ǮEG~r-S;ւ>3YAL 2~[5iLMAhJ~g8Ta2s,d L#Ʋ!o՗-I )]3-PQZXj̺ b35)Mt2ȑ{Ϸ$?r"} erhsdNVy٨Gs)m)mZ9ߵV}LҲ*C`~̍,Ym)G{fձV9j9d.}Vl-0]0tx;rP6,:+t .Q ؀yp ^  - #/k yUk:`H6 Uv^N*[% rAL[a dOn"\iE3HQNZT"2L;H3PnNg6[Q~hQ @Rõ$g>3㍚j@jѶ9xCE`+Z+^!kuULjڣI>s\ss+2]S6;cs5ZCr昛wyAKj%b9~[:cX9甫,W WaОEEe2O %n95)R#TآmCj;`ŋkr7 Z|R \wmt@T38(Rs[HNX@}[_2գpVʂӊ/,jym$4r苪UöEku krI *Sd521ZÍ2ykk[† mױɚ۞ SS,R? ,rXB/sтqHC+j{椦7!#Uȅ\3gqk$~ɨ2#O#ceK &;eq a =~l_M 8Đ#MwϠ+B5p4.; ۤw+<'Bݳ wbH*ՃU-At OR>%Jx2ɰcdxnDg;E-7BP5d"FHoE73E=+lIC;! MGH)%[[S Wxt ((~;t7"ٓ+Xe6Z?vOcJJ.z3HK9끍W9GzUٹ ]v] kMwQ;h:,{#{Q|Y忌x|l_b`Q&9ЕCӚ߆Q0 t/pY=ev 1r̽jzefJ`_nK8 -&8;ӹƓ RC̲pnFT%3G mtBM5֎9f{?8\s&rCk tgYn:f_W-G. m{bζuA]t2m4]-;!Ŗf y,8pKA=7cY 1G>,Қ ؁Y7c{6k#/cv` + #~Ղו,*,ZeF4ad 5ǣzT3\b[ }t=[[p.A;c>4`mFvb]gP,} !} ؃x] -lq͓EB2npM lHiЩp-9Q߸+vLcA:u ҏG* $?MM?n eLI `ۈokD-#-7N1jvJffsHKcHZw"G^Z5p(|b57kyz^(-}HUTUڶ5)5aijHmVAq DYH}ċt+#W&t$`h2җ 'ɿ #N"=,l'SWM"{c_w`BG {P}Qdm\KZ]r64bgevaZ"'R F7EGuX$`i7uڮ0׳O}MM v35 Q[jd+^1!ĽKezlJ!1[OeN2qفpYctKu f%`n\_O2paw<]D%$ ^0n#9 -A < ErFnnlێ;I]'f7B',vOHi WΩ!!sA㎗o}43a 3;uIfoWNtVQlǯQІfG Xꫦ1W5y,KYVEF@cŠ/ҫ jHj(\C&ot!fHS3R5!~H>%x? i6[P?@TvcFҺa2C]?4`Mf;Tvd.c]4Md>|w}g>  A<.P>A|W%~Ï`gl@ [5y0yR !<2~F/)bpe]xj.rx kںO Ofd(K^c1<v C?l .!,5LAFMbjttZrʢM*`ssگn[G.8aݶ(l^B@Zj[Aq/"~@43n:C05AGZCS&^{ix9xm_Ai}'>uq ն68GQo4$hV=AGu؄kS^>~ ikXtj׻UvBgG򎏆Om:g ޖ i> thU/F`hfMd?C3Hg=@'y(4A}5J]\;e^&$<"EkhlfW%~Yht->@']D\ 3##j+NtV TZiy,EZJѤY]}++(~;ҫ-Ŕ?A'A0PS;UojVaeowSa&QlHca~#vP2 OD[rP0<|*nM RB=,;B=JwW s_"'}H)s9G|NX \ rrnA9_)#Aه9RȌXg?f-WV9B?/,hxʇ"8pJ#`NlP;?\5x\Fe)M[~mT m˴>+7+])p6+@rvY NѴk6'AO" Yo3izMC9Жoп<fvax ǚ'"hFF{1)3w4ˣ8AL$Hr2r\;Fˮc9_.%eIسe#6ay 맽ؚ S%\o 6c)O^s$0_Gue6?($^k0rqEG:lr`st[d҇:6 CǑVOr19^ ׳ :6["5ɽjciU'(?͡Z<=Ksq{0j3M!:B5ovUvvC|$9?LS[ӜT?Bԑ LC?PF#3zŒQ⺻P>e| .CNF멓ŊQxO a$P\;LS MQr3>ttor_TJq"?K7c:2[Z4W1!Εe?,p]۟^(>]+n?hy724q<4q~R~xd$i@yxsa~fvAB-7> }/Zu,mnd:[۱nh)&UTi;i$xtm#wա?vzn^xU nqշ˞i<+F쫂6K]#kۛ$?m#tb\%6/޺[F fX¾^}M7lZꪶC@3ϫ۳dGb`Z(]M?pVw) KkJoh*Qv }wB\/*%R%.ؽf~0aVa(?r+O[n ͑ll%s Y&1*Ztf!`UNd% yBn?DZꀴ\#6im]Iۄ}@.dL/ȗp`2sz׮ū.rϓ;ng0}Y0 s15KG&G?_ /:'?GV]:Tsm:PY=b5Y>2268>  KՎ@tJB?AD~@fu-GRmԻC>3ڐ9;eؽ gV1)Љ a~3d ߇.Df|fKccƦMVYZ! CEmX6+;F*m>#O!pMo3Km86Ut?ƶP]ʌV$9l r+2?~4%(W_mcUk/n_*xk1XRaK;^ڿD,޾.yo9NҊZL#-XͿcC+qwvox!I=KE/x2ҡ,6.Jic= wiHs.YEcldKt>'2^ZD,[-G%\+2ŸWol| vaA,u+KoҺ(*o%vkV_[Lhpou;a'ռOx6~TJ.􋩚-hT4!e65a[f@9&_s =1ݪy0shTrOެ65LճEg5О-|%|n$6ΆPj3l^zjarq|KWї+zGءί~k> KWYHq8:.w6!j.Ibs#PSjr!qnmŪ4.g^bVg* mŏb g0zTeoK5$RW2rqX={2N_$q:5FzXE_c<B%>1U>@vؒ \淎&BVX~r]muGsi c!=qۣzvA&*)Xc% ACk<IRއ#yC_I2/XHn Xs"E#eB@s 5FזuSΆu)LZ{ߧ`'s-an"Y^'|}tFI%hA8 >y?n_:Þ 7ڸP{_ֵP|YV&vA?9'җOl&PB< Az CF{nC܋΋aSƾ΋F݈{jRk[nC܇\C(!>ƎeX rى<ȅ;2rSrp&d3I2 Y\Y Odfg\BAE Ė q έ"E!>rv([T>% %D>`#).00D=ڋLCZjnegSG %>ZIE\T3`+{r+-<#]25!1{Hlؾ6ro%i>#Th;j vv['ӿ:C2׍uӷ 'KsH\o?LҚ`1t^2&!}y 0pC|:F/@m'X*0"7fkwuE#ALշx鳝(pO8mT;j ȍ͒*7ަUm3UϭV!&ʮ́KMxɷ.mC( %ϪP,vP8OV cQSK$n`ΉZkIH8,$ܢANbhu)sH)W .Th Èif-J?|&Sd0QC\o!V(*t n)mWH =Z^^G53pԇxҭa&Lx Sƙ|t66F&3\ #=pY0YmtSXã(jbWraS N]Ɓ2]: F@wi#`5/fUm8܇8@ 0&~p7)n({?V;KՓ#مWݦ3Ķ L7f?$V,27;gwu+Ѫ'o"}S*L]᮫ C @;B6p_FH @t&rtEjz*U.bdʹmQ| HWf50[)Z,Z(gP_C5me*K7Os6PeBW(5voJ ֌PIwRP?)"ZWQא\2 ش 2ُTq7Hj|0H|or"H݇Lؕ1K<[HPN߀U8!Y^W+]G/oHp=Cu a{O}P Ruө媰ᛏ"#=~K CAZq7YPi0D;5xildڨ_}HKRFؗV+dzO؂%f.]Vz뉪|p9e'k;Lrֳa;4a摋Yas50VE75oћMQ76Q|TAIooMlFgEM(aְH71 g`angyņԢh۾mdpqBPqHTmLTꙷb`H*7իi)ɪK׹+[&l㕶D<}}Rw,3s' d,ws4,ntfO OB|nHMN"܌)3LLr۲$#<`WG%:!ZA:C"FPy)slQ@E&ާe3X3M ؋86L<)e{=c!Uǂ{%.#a>[bz-;0ÝX#HkشA(~C|4-z3 OoSo#ε+(n ҷ%Ήv((6[]-| vni^i$ϡC ,$.Z#iCD͍Xp_rGNQ,:B!LF~TxieZC!>@9No} V80֋2R{Ōb6Nqخ֖~)Z,H쀆(zQЀWyݛ#Tӽ Ec&BUaxi]Z6xӯV}soY@/tB`(cFդ{' ԧ!7U0.&KuDv_B밴ᱥ^F|i}6^e4-խomۈV7n1p᪴@HWLr今4/ %KXm!*HX2]Fnp F$HŤt:oH t>Rn.aJ;mVՆ%l+FzqնPb R'FW((<sPLjO~yCD:i,<]:sإ6YϽ2ǽY#+r6ri9ry5ȱY~;!S26q?Rq&FECMz;R$:x3Cg>,h뉚( ь%3<|bz? Qn (s}6J5rհU'>Ul&Hw w҈PK%z]h!RxX}X+~`@OJ#2H>x#l88[XzJJPbo8cR4}k!v%( \?ϲ5/Dp.Ra %!i3XHsw2>(B|<` QhS4gjЈ:zaO,Hwpv~cY=Yےui/⑔b ߼?CqiHKM'PT=BJ.};a1# (~;]ڰҤh-ㆯ0U g<"Nj5`W+w!>rGnQ0]IjN2~/.}P߹䶻F/^x[ NQ-r/1e?%ѤE+> ^FΉ'޹Ž8Tdh!"a{ -SZxǝdocmO Ԙŧ{4:<"5nċHK%m(.AZ*I[2 29Mg .[Ve!͆ԕp ˬppg7]Ypk%)kCK<@B)Gj%̂h1``1Ӱx )Z/n m Q^g #`V ;ԙͲob} oK1j}|:Rj/kHK%cfU l r oH↖ 7k![2!Q@he rbeL80Vٲi--9GàT~#7VyuDldv,-K ?hJU6CP)I|oQW4p}oMĻHKE~U@1{?DgP(q3``8>(AN`{'02*۪7 ?fY7䘏h7çSEGf{J߾T O#@zGw`'t "UO-7`5WFХ<aWaotZTtPeGQq"DOpO{נ_-gژ步'(5%CIwQ$wJRl҈\4g7$wC|:ӉˈSHOuAiQ'B=B2"ufdE/vw~/] O:jPW8ħӪW䰣{vp0/eߘ>j*`im# AYב~sv)~Kꝫ^$Gޗ"=K#F!R[6!>BPb5EꌂZ'9ħӢMLX{8:f;)k&Q/q(fRRQi".<6B9.6})rGõ R^D]%Ψ[`(oĥw -( be}}Hv"DP`=!H&{!9:+pB2(?8 }qu8$n*i)<ކ&c+2x i$wIrVˡ0ԗvH@ϑ3 -H6Oa [._#Ի tܵSQncH؛4q#T>HˈyvOP3|>G<37t+ N TAB_R'=CM $nx0`Y7B-a >8\(n ‚E !>+'qYFԿrR(|C|iKۉxi% EQRul,2$}vDA }+=Dekw~wq.P"#)aW;F\ch C~d7N;g 0|CZ-sg6Ь Ū1jՌnM F;nN&8 dcoO]@'M]H+㛢&b.Vq*6Aq琖r7(Xz)j-Z%<ۨvlt oPAl0]LDzj5@>By90s$ N*tDbVH3?Zx6K>EA?}H0ӛx2fŰLg5(Tj?N2#",L?#E#0hlyHV:@lӄy<ŒxXcl-vō秺:FXƈ `*;Txdtz6a{֔;,'F܅.V( =p6Ov`Qic}ReW<,!Yz\#_rdlj [oPď^CGayt{[. ȑ<[r|ɑy2'7bdfPʑۡZ\2G8)ʊED'u.Ll9av0hr ϰq)Y$嘆F>eƤ_b"y3UYA/]ZBNW|.ό9*2<:2&} Ր!M~LSK2އ_9?0V+U.~Yຶ?==P|=)VHF#SCovy^LxƒnĔ4X t~[5h5dfOGsi$x4)Aşo]ou(l׫ժw&l쀖G񧴖w3~)}5A1_j z$?[jXA?W:{ɧfNO{4OVb/YW3/roYhyմb[\b oh~cqB[ ߒ^(48xJV:}vvxI Ŧ0~!wΑƷzpau9Fh] WyWأ[t@U.yψ{WOQ1"Ի)iTPJN# zhcW\XΡm}K8W&H=*´"g eF~ +>ݎK,U73Oyk<z웞?T6,{hRA{.ۆBPF''C 8651yiܘ5CӃp ~3d +Px ]{/7L]^'|}tFI%f>(2>}0?~q Ϣk#iGJw;7F=~]?k^zqln:̩Ka7pf_UhnM~{>X{D~ _'IGYqz5k.buC롽og-^Ѽ 2!>r6 I M/ܗFzXqG8Gp $A'Uwy(Z8e; G:/((|n#HKPl 2L$.56&Q C|4IԼi8l}Uѝ(~5);DC\şI9N]cѣ,WzryW )d+tN@I&U(UjT*^Shߝ]uJvPæRRe@9G^cD7D8[M2CFY!@x#{*D΢K|bm(xjC}e~͆bsHOh,6!@%޽op갭hF.# =>X1BG*DLAN*8;ټ`%PX{ k""Ba6c D(?qw ox ~& nҐy͓ycn1smW>7~S]so^z!{zBlڋxC꾟d0 GV8opr4ҧIhO͸yҹ *BZF0y9}Ԗ2DfqiB<ʿ82Kn,F8tG  !#okIڂQB3+G-vB/(,[|ԯ6ۯz&7+o@(~SmkO$"$^;0 ;= ~2 86߿T4gUDkQxzVC8aSd\a"oXCV\Xy(L+H_Q)XDtw DO!}S0ϡ^2q ^A<>If6>u$#<h;#AF8tM_Jb@܇>eyd ɓa{Q\Hpq i966[2F| :#qīH_U\}wE8+0r w)7äIjHH ƈvfĨ Ox p9iul<>1-Z#Tdy>|w{/SHO{@qCHO+oϠYO l8Pb;j>JOH> @܅.ՁLp(}A v#EZ}- $qؔms yibhjh9b=̞i<3=/f6f s G N3{#2-X2m'𭘋qL}&#'>yOrڷJ2*E.9ӡ4HW?xzLϔI͢xS y?ĸ!Oa݆KGLs;ՊCM :t-ؖygQj\Yj]n˹D~mRZgScʌ;h 79d* ,ɘE?Kn:V̢e1Nհ`{֊G=xjF"On^3 `,V2NCtiKCyeT<4uyrpj|×''OI?Ch:Js\sї(ۺUZ?5WS{zJ,HOv\| 6I:Ab[-x{54/nJziX/ۈ-0}!ύQD[Iy3C|$E ОSY6ucHYV'WȘZ˳HKZHlRPivÖ6Ꭴ:[율l"`3z|$- wֻӪ şNfTحTxW8 ƥK fnGdEEuKբ|-e4q+?!>jTgK3Pͱa쀯d7zb[~F k.1me:ha1;;c"z i2gdLXY%`O74v`(Mo*Kr'7I>6(2E"<kNX:86:%l]E ^x{W.xiqyegAw#>@MR^T~&(>͡|Té(Jad8הYТV=(.8Ў ".خ \2"qmVuHd:®z)c u)OEja8h3J إOs6]YC}6YK6Zi`:S㬹8kI_ڰ&ޜg@ZFZGHw;ZUeUhx!y2252' D6s1] 6g_"w*졿^(N2ci2zydptjB8jteEM!mo$ԍZ<<<:|)dZEk ot4rwdN62jӭۻEt?v"AfL6AR6I:AF;DZߜ\lh xlϓD^O$!\LnBeb?[l`x|%S'w‘?%&9nJOH@KUuȴA\B| i)fBG8Go2kݲIӳXxMн7a ?]!Ri8SFG8|Zo!-粜j?BG2ckG89,õ粬粸GuqÏvq1'$V #W[O&yS)?N{"y?Nn񈭢!i~/Fg~_< uwۏWGSmxհCn:foO<,9G]O `ER~$T~/RO1C|S~i;SE͢~~Rr}}j0!s9kxbSq/i0&U{T8G8;ƶCT/#  vrP@Dş颯KF( )ԭwZs6=l%wn1}]\c* r'z5 l+IbN P~HR*f_gnѴsyl9jdX-9UtE#SʳIr*A٥[2sؔJ\'ڇ>b3D^>WhW⃎_FZY_͡!VeSEV-X3:*!{I-^L.@E5,^d&2mVӮȳaS5V95CLۆ 0/Jo&#C6%޹d+b_AA/#-Jn-hr͢$(f2¦REyT@d 6 SH()rVC|$Լ(, 8Q|fz.ǮG o)fjT0N&aKF)LQ\;ubY:7٣8[;e n [ nK0܋8Fb q#Ht^Q4iR }@Jy䮮&qWVȚ9tEux?%np>y/p+Eu 6ky#'* 3Ķ|JI$FjI(zt^Yx~qMµLO@F+heQ"TӲ-k!>rmjqQYB'!}M$ø--& )SDJQB:u6Hu#-NN ne.!. -578P;y֡!SZ0J\%ay*f؍1N¹bkFAmdׇ92h8?)+R_@qO#-z?9=Rփx u _$N !=Q(TaO2 zt 7HM!=M|88Ȱ?o#}M#!.M PĘ |L፽4꟰M (VnD}IUWkA;8ħsmm# y͡ƎL>Ɗ4ybC CgGh>Aq.hEpaH*8AXSIBo "= M @v ۟M{Hec2&W9ceyqƺ[5ƒPGEZݠn Q T3NcL,7.D&߱TyPH i ߋؗڐYND).:eo ;TC|[,u<,öץms(*@u6v\GU EO݊[*]W;tQ4* I>-I GS?%V4tu+9[a #Se#@n#Tcق^Dz#3*H8.N\bX+i{9s⤵B2Iբ Ohz6K>/MK#e7,AeZ4=?QI !7\Qu l8U5r6@׈_@8ˡ3tF$D|+0ލ^3ԧ]O-:5*(4[O_jfq18p"qApOOKXtzfSMI rw).O_3{c}~ ҫNl.:J4ʯ Gl-a^(Vo`GUΆf*tFt>5R͑r$tY) `gQϕ#yr,X,cOQcWPO+-1H4:yyh<4X~xlrʇ 5yq!jot4&pM_:;9Wˇ['Sˢ8jG^LmŗPog`k[-1ܘ/rnMi-x5i Hg_tY]hyմb[| 7'7Sd*&y2 ;A]5,?O&Pm]}5n=D( QSfv w/#}YF\-í+1`"AȲ{'ڹNhӚװ[F~)ekHXiT{janB߁JϤFJ(2ױ) &nrLr&&͓NfzOvSXv.i;ݢȳT&F&j!+]^-dC2َEOe'CZqbKZR݃H˵PCI(j18 t#}X\Ki@G8GR.i]t%嵨F)t=wA7G p*j8?)qOԦ?t;?$ԟ=0GMtչctZ,K̐|g|^^,Y*$,sO$&MIt9ZRCŲtY#p6pӇxҭLjXTCb]ޔNtOJq&LPK:&Gye #=p-@atS`y ςp78p\QNPi6z"l@.X|ӓ/zRl,?w߅(Y(e+J =;G2fffoFRk$XepCj=Thc_P"n C|4~k *R~ͯ;Xz7s1 |fh#7\{d#󵄍epCgŘ}Y"jE kgTH!2 6n6'O/ҾT=Wq hDPxaI'}bo7 }G6{.w;6SV{3?!>l!0%(`TsddJ0@f),SKl829y!AZJ9_W%n : pK2&D3X6`i%PzBf(t;Nw+LOڠq{:OHږP]'%ëW![h3Y ׎ѧ*0 @R5-H7r5lˤq܆8 RxȲ}G"k]HJWi( msl͡ h$p~M)$m-{,F~ʼjHg-3(L-UC_DEQVLJF:)۹(L9(^ %âk+ tL P~  `>+W0!iRFp:T5˟%םNv7R=ìg:tU?aʪŊYL?فlwH+}˼dyVr-eӷ?R;RһH7ş7 GVZj9+!,0&uVWi\sU%2Jа:ݽeӭEºY$o0G/̑Wϣ0D4kSD85̎;ڮ6dj;I6 V`ZRlx99#_SX6JN7%da=5Pz[lx :($;x­f-.ˑ[[B)GOƲ#w(9@5KYzZO-[E01UHJWs^XmϝE>,fmTIHL㩱j_LmH597XW4 G:̶TV!`#6Hf&҇dKݶ0҇;/E!> pjC&El-7VLN?aS&EBGam^A^tYQT[I5@E_IQ5˒l,{ϋԷE2/VeX.V6ێ:k+hWΈus-dTwZ ⣩[KySM>BqUǛS^ +D^3cBR(gRowu'.O }J(TE!K)W;&$L"<wˁ$o~+ {m>oZDoiGUia u#鼰dܙbW7,Xle-&&Z>{ɲ\Å6hK̀vާu{$y,@-b!^@Zjh[R%0KZ8H2 "}W2/$j`̡z Ӵf$bTAI'5jXz,ǷVKa_| d9gǓz[|(ei58-l@o ꓰhP4wt vrO BΩic !>l28:2~~dttt"ij UAߢϟVhh,pO8"u1ؘFnvE8jG86KMU$^Э&K-nzϕ¾PhJ*_`yݼ[* lBTq#i9uJ>Ls)uQs 7$@U ]v 1'$IfhwVWd/5|J.➃'rOnpuz#&}+nJk_*.MiKM#p)O46*H2\Ά b, A Ll9a!)‰c,P3 .1"N, |3]SKUESFwu2CgFƳ95<:2&!@Ho;hs0Gqe|ky^BZz&fِޖ9:n_~Mip{CJeQ/jiBeQBGBhcNh1Il݁unXS+=ڻ5i|zuU24M?&| kKlj(-u7[\LHe ooإC6v(P򮽦"k(2"؋XʌEwt5ɡމ|_QgCV4?[pIӨ_ϫ_$PLmHu4*ycYaY`#֑ĚG؇6Ju,%[Heoy@8l@`ҥs@5 dkң[)$r&{zI2 ȧI?i"J3H鼈#)VّM.,XՑ ]7%dN& UD9P8lJ.KucRf ͪgH?ymڼ BMWʐީ&$Cz| 钭N1`sHK. #dNiH/jE]֐T璭h6$PorĈ"*A'kvND!>5;2Isg[M)~v5,B5mQep*"lʼh -ѤUJ Uc4ڠw +X&GREүza"GHh>[zrQ8&*ƗP#}]kk<_RJP?׳XU{MeG|Z65Z FZi lEmn>{/Rpƛ~CI&cܖ&,gR67Ow/fDی N"=mO?(-8R[>8z6?7cҙ+6@LQjz@iL-6gyæL t<T1(ZJ׬;|wLeu=]e? o9-od8߮ ? <|~5GX0sg%kh+Ȇe\sƆEذ6̛E@_ϑ(djӯwlb|D8O)ϥ- ;7<:DISygߡ:}~MnFG# _ ׉+u[>p%;WQzYvD=hcNhI wZ; '2풍wxժ 6SvK&"M:WKcL}#[5~^KԹb ot3įc%69At:P7ҩ;eEHJWs^=jtv>1߃*'Ԧ-| U(:GPXzf+<)JOJ_6?;o4Y6MަMNPperformance/tests/0000755000176200001440000000000013620205622013713 5ustar liggesusersperformance/tests/spelling.R0000644000176200001440000000023313616476346015673 0ustar liggesusersif (requireNamespace("spelling", quietly = TRUE)) { spelling::spell_check_test( vignettes = TRUE, error = FALSE, skip_on_cran = TRUE ) } performance/tests/testthat/0000755000176200001440000000000013620350016015551 5ustar liggesusersperformance/tests/testthat/test-r2_coxsnell.R0000644000176200001440000000044113564746345021127 0ustar liggesusersif (require("testthat") && require("performance")) { context("r2_coxsnell") test_that("r2_coxsnell", { model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") expect_equal(r2_coxsnell(model), c(`Cox & Snell's R2` = 0.440140715155838), tolerance = 1e-3) }) } performance/tests/testthat/test-item_splithalf.R0000644000176200001440000000045613611533123021664 0ustar liggesusersif (require("testthat") && require("performance")) { test_that("item_split_half", { data(iris) x <- iris[, 1:4] expect_equal( item_split_half(x), list( splithalf = 0.7864936, spearmanbrown = 0.8804886 ), tolerance = 1e-3 ) }) } performance/tests/testthat/test-model_performance.bayesian.R0000644000176200001440000000373713620205622024140 0ustar liggesusers.runThisTest <- Sys.getenv("RunAllperformanceTests") == "yes" if (require("testthat") && require("performance") && require("rstanarm")) { if (.runThisTest && Sys.getenv("USER") != "travis") { test_that("model_performance.stanreg", { set.seed(333) model <- insight::download_model("stanreg_lm_1") perf <- model_performance(model) expect_equal(perf$R2, 0.7381938, tolerance = 1e-3) expect_equal(perf$R2_adjusted, 0.7110354, tolerance = 1e-3) expect_equal(perf$ELPD, -83.40375, tolerance = 1e-3) model <- insight::download_model("stanreg_lm_2") perf <- model_performance(model) expect_equal(perf$R2, 0.8168386, tolerance = 1e-3) expect_equal(perf$R2_adjusted, 0.791236, tolerance = 1e-3) expect_equal(perf$ELPD, -78.38735, tolerance = 1e-3) model <- insight::download_model("stanreg_lmerMod_1") perf <- model_performance(model) expect_equal(perf$R2, 0.6286546, tolerance = 1e-3) expect_equal(perf$R2_adjusted, 0.5896637, tolerance = 1e-3) expect_equal(perf$ELPD, -31.55849, tolerance = 1e-3) }) test_that("model_performance.brmsfit", { set.seed(333) library(brms) model <- insight::download_model("brms_1") perf <- model_performance(model) expect_equal(perf$R2, 0.8267671, tolerance = 1e-3) expect_equal(perf$R2_adjusted, 0.7908548, tolerance = 1e-3) expect_equal(perf$ELPD, -78.43708, tolerance = 1e-3) model <- insight::download_model("brms_mixed_4") perf <- model_performance(model) expect_equal(perf$R2, 0.9545026, tolerance = 1e-3) expect_equal(perf$R2_adjusted, 0.9524251, tolerance = 1e-3) expect_equal(perf$ELPD, -70.2357, tolerance = 1e-3) model <- insight::download_model("brms_ordinal_1") perf <- model_performance(model) expect_equal(perf$R2, 0.873797, tolerance = 1e-3) expect_equal(perf$ELPD, -12.78422, tolerance = 1e-3) }) } } performance/tests/testthat/test-model_performance.merMod.R0000644000176200001440000000123213620205622023554 0ustar liggesusersif (require("testthat") && require("performance")) { .runThisTest <- Sys.getenv("RunAllperformanceTests") == "yes" if (.runThisTest) { context("model_performance.merMod") test_that("model_performance.merMod", { library(insight) model <- insight::download_model("lmerMod_1") expect_equal(model_performance(model)$AIC, 71.59892, tolerance = 0.01) model <- insight::download_model("merMod_1") expect_equal(model_performance(model)$AIC, 23.58593, tolerance = .01) model <- insight::download_model("merMod_2") expect_equal(model_performance(model)$AIC, 21.4729, tolerance = .01) }) } } performance/tests/testthat/test-item_reliability.R0000644000176200001440000000114413564746345022225 0ustar liggesusersif (require("testthat") && require("performance")) { context("item_reliability") test_that("item_reliability", { data(iris) x <- iris[, 1:4] expect_equal( item_reliability(x), structure( list( term = c( "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width" ), alpha_if_deleted = c(0.454, 0.877, 0.489, 0.467), item_discrimination = c(0.894, -0.349, 0.863, 0.921) ), class = "data.frame", row.names = c(NA, -4L) ), tolerance = 1e-3 ) }) } performance/tests/testthat/test-icc.R0000644000176200001440000000221113620205622017405 0ustar liggesusers.runThisTest <- Sys.getenv("RunAllperformanceTests") == "yes" if (.runThisTest && Sys.getenv("USER") != "travis") { if (require("testthat") && require("performance") && require("lme4") && require("insight")) { data(iris) m0 <- lm(Sepal.Length ~ Petal.Length, data = iris) m1 <- lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) test_that("icc", { expect_warning(expect_null(icc(m0))) }) test_that("icc", { expect_equal( icc(m1), structure(list(ICC_adjusted = 0.910433115331481, ICC_conditional = 0.310947783569576), class = "icc"), tolerance = 1e-3 ) }) m2 <- insight::download_model("stanreg_lmerMod_1") test_that("icc", { expect_equal( icc(m2), structure(list(ICC_adjusted = 0.399303562702568, ICC_conditional = 0.216907586891627), class = "icc"), tolerance = 1e-3 ) }) m3 <- insight::download_model("brms_mixed_1") test_that("icc", { set.seed(123) expect_equal( icc(m3)$ICC_decomposed, 0.3877, tolerance = 0.05 ) }) } } performance/tests/testthat/test-r2_nakagawa.R0000644000176200001440000000076613611533123021041 0ustar liggesusersif (require("testthat") && require("performance") && require("lme4")) { data(iris) model <- lme4::lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) test_that("r2_nakagawa", { expect_equal( r2_nakagawa(model), structure( list( R2_conditional = c(`Conditional R2` = 0.969409477972726), R2_marginal = c(`Marginal R2` = 0.65846169440315) ), class = "r2_nakagawa" ), tolerance = 1e-3 ) }) } performance/tests/testthat/test-check_zeroinflation.R0000644000176200001440000000101413616746412022703 0ustar liggesusersif (require("testthat") && require("performance") && require("glmmTMB")) { set.seed(123) data(Salamanders) m <- glm(count ~ spp + mined, family = poisson, data = Salamanders) test_that("check_zeroinflation", { expect_equal(check_zeroinflation(m), structure( list( predicted.zeros = 298, observed.zeros = 387L, ratio = 0.770025839793282, tolerance = 0.05 ), class = "check_zi" ), tolerance = 1e-3 ) }) } performance/tests/testthat/test-r2_nagelkerke.R0000644000176200001440000000125513611533123021371 0ustar liggesusersif (require("testthat") && require("performance") && require("MASS")) { test_that("r2_nagelkerke", { model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") expect_equal(r2_nagelkerke(model), c(`Nagelkerke's R2` = 0.589959301837163), tolerance = 1e-3) expect_equal(r2(model), list(R2_Tjur = c(`Tjur's R2` = 0.477692621360749)), tolerance = 1e-3) }) options(contrasts = c("contr.treatment", "contr.poly")) data(housing, package = "MASS") model <- polr(Sat ~ Infl + Type + Cont, weights = Freq, data = housing) test_that("r2_nagelkerke", { expect_equal(r2_nagelkerke(model), c(`Nagelkerke's R2` = 0.1084083), tolerance = 1e-3) }) } performance/tests/testthat/test-r2_tjur.R0000644000176200001440000000055213611533123020244 0ustar liggesusersif (require("testthat") && require("performance")) { test_that("r2_tjur", { model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") expect_equal(r2_tjur(model), c(`Tjur's R2` = 0.477692621360749), tolerance = 1e-3) }) test_that("r2_tjur", { model <- lm(mpg ~ wt + cyl, data = mtcars) expect_error(r2_tjur(model)) }) } performance/tests/testthat/test-coxph.R0000644000176200001440000000172713611533123020003 0ustar liggesusersif (require("testthat") && require("performance") && require("survival")) { data("lung") lung <- subset(lung, subset = ph.ecog %in% 0:2) lung$sex <- factor(lung$sex, labels = c("male", "female")) lung$ph.ecog <- factor(lung$ph.ecog, labels = c("good", "ok", "limited")) m1 <- coxph(Surv(time, status) ~ sex + age + ph.ecog, data = lung) test_that("r2", { expect_equal(r2_nagelkerke(m1), c(`Nagelkerke's R2` = 0.1626795), tolerance = 1e-3) expect_equal(r2(m1), list(R2_Nagelkerke = c(`Nagelkerke's R2` = 0.1626795)), tolerance = 1e-3) }) test_that("model_performance", { perf <- model_performance(m1) expect_equal(perf$AIC, 1457.19458886438, tolerance = 1e-4) expect_equal(perf$BIC, 1469.5695896676, tolerance = 1e-4) expect_equal(perf$R2_Nagelkerke, 0.162679484267414, tolerance = 1e-4) expect_equal(perf$RMSE, 0.882014942836432, tolerance = 1e-4) }) test_that("r2", { expect_error(r2_xu(m1)) }) } performance/tests/testthat/test-cronbachs_alpha.R0000644000176200001440000000040413564746345022003 0ustar liggesusersif (require("testthat") && require("performance")) { context("cronbachs_alpha") test_that("cronbachs_alpha", { data(mtcars) x <- mtcars[, c("cyl", "gear", "carb", "hp")] expect_equal(cronbachs_alpha(x), 0.09463206, tol = 1e-3) }) } performance/tests/testthat/test-check_overdispersion.R0000644000176200001440000000211113564746345023101 0ustar liggesusersif (require("testthat") && require("performance") && require("glmmTMB")) { context("check_overdispersion") data(Salamanders) m1 <- glm(count ~ spp + mined, family = poisson, data = Salamanders) m2 <- glmmTMB( count ~ mined + spp + (1 | site), family = poisson, data = Salamanders ) test_that("check_overdispersion", { expect_equal( check_overdispersion(m1), structure( list( chisq_statistic = 1873.71012423995, dispersion_ratio = 2.94608510100621, residual_df = 636L, p_value = 3.26607509162498e-122 ), class = "check_overdisp" ), tolerance = 1e-3 ) }) test_that("check_overdispersion", { expect_equal( check_overdispersion(m2), structure( list( chisq_statistic = 1475.87512547128, dispersion_ratio = 2.32421279601777, residual_df = 635L, p_value = 8.41489530177729e-69 ), class = "check_overdisp" ), tolerance = 1e-3 ) }) } performance/tests/testthat/test-check_singularity.R0000644000176200001440000000143013620205622022360 0ustar liggesusers.runThisTest <- Sys.getenv("RunAllperformanceTests") == "yes" if (.runThisTest) { if (require("testthat") && require("performance") && require("lme4")) { data(sleepstudy) set.seed(123) sleepstudy$mygrp <- sample(1:5, size = 180, replace = TRUE) sleepstudy$mysubgrp <- NA for (i in 1:5) { filter_group <- sleepstudy$mygrp == i sleepstudy$mysubgrp[filter_group] <- sample(1:30, size = sum(filter_group), replace = TRUE) } model <- lmer( Reaction ~ Days + (1 | mygrp / mysubgrp) + (1 | Subject), data = sleepstudy ) test_that("check_singularity", { if (paste0(R.Version()[c("major", "minor")], collapse = ".") > "3.5.3") { expect_true(check_singularity(model)) } }) } } performance/tests/testthat/test-check_convergence.R0000644000176200001440000000131313611533123022304 0ustar liggesusersif (require("testthat") && require("performance") && require("lme4")) { data(cbpp) data(sleepstudy) set.seed(1) cbpp$x <- rnorm(nrow(cbpp)) cbpp$x2 <- runif(nrow(cbpp)) model <- suppressWarnings(glmer( cbind(incidence, size - incidence) ~ period + x + x2 + (1 + x | herd), data = cbpp, family = binomial() )) test_that("check_convergence", { expect_true(check_convergence(model)) expect_equal(check_convergence(model), structure(TRUE, gradient = 0.000280307452338331), tolerance = 1e-3) }) model <- lmer(Reaction ~ Days + (1 + Days | Subject), data = sleepstudy) test_that("check_convergence", { expect_true(check_convergence(model)) }) } performance/tests/testthat/test-r2_zeroinflated.R0000644000176200001440000000367313564746345022000 0ustar liggesusersif (require("testthat") && require("performance") && require("pscl")) { context("r2_zeroinflated") data(bioChemists) model <- zeroinfl( art ~ fem + mar + kid5 + ment | kid5 + phd, data = bioChemists ) test_that("r2_zeroinflated", { expect_equal( r2_zeroinflated(model), structure( list( R2 = c(R2 = 0.179754784762554), R2_adjusted = c(`adjusted R2` = 0.175242984898761) ), model_type = "Zero-Inflated and Hurdle", class = "r2_generic" ), tolerance = 1e-4 ) expect_equal( r2(model), structure( list( R2 = c(R2 = 0.179754784762554), R2_adjusted = c(`adjusted R2` = 0.175242984898761) ), model_type = "Zero-Inflated and Hurdle", class = "r2_generic" ), tolerance = 1e-4 ) expect_equal( r2_zeroinflated(model, method = "correlation"), c(`R2 for ZI-models` = 0.0945232333944027), tolerance = 1e-4 ) }) model <- hurdle( art ~ fem + mar + kid5 + ment | kid5 + phd, data = bioChemists ) test_that("r2_zeroinflated", { expect_equal( r2_zeroinflated(model), structure( list( R2 = c(R2 = 0.0920246818082126), R2_adjusted = c(`adjusted R2` = 0.087030318121789) ), model_type = "Zero-Inflated and Hurdle", class = "r2_generic" ), tolerance = 1e-4 ) expect_equal( r2(model), structure( list( R2 = c(R2 = 0.0920246818082126), R2_adjusted = c(`adjusted R2` = 0.087030318121789) ), model_type = "Zero-Inflated and Hurdle", class = "r2_generic" ), tolerance = 1e-4 ) expect_equal( r2_zeroinflated(model, method = "correlation"), c(`R2 for ZI-models` = 0.08938686), tolerance = 1e-4 ) }) } performance/tests/testthat/test-item_intercor.R0000644000176200001440000000046113564746345021542 0ustar liggesusersif (require("testthat") && require("performance")) { context("item_intercor") test_that("item_intercor", { data(iris) x <- iris[, 1:4] expect_equal(item_intercor(x), 0.2900708, tolerance = 1e-3) expect_equal(item_intercor(x, "spearman"), 0.3147349, tolerance = 1e-3) }) } performance/tests/testthat/test-compare_performance.R0000644000176200001440000000156313564746345022712 0ustar liggesusersif (require("testthat") && require("performance")) { data(iris) lm1 <- lm(Sepal.Length ~ Species, data = iris) lm2 <- lm(Sepal.Length ~ Species + Petal.Length, data = iris) lm3 <- lm(Sepal.Length ~ Species * Petal.Length, data = iris) lm4 <- lm(Sepal.Length ~ Species * Petal.Length, data = iris[-1, ]) test_that("compare_performance", { expect_equal( colnames(compare_performance(lm1, lm2, lm3)), c("Model", "Type", "AIC", "BIC", "R2", "R2_adjusted", "RMSE", "BF") ) expect_warning( expect_equal( colnames(compare_performance(lm1, lm2, lm3, lm4)), c("Model", "Type", "AIC", "BIC", "R2", "R2_adjusted", "RMSE") ) ) expect_equal( colnames(compare_performance(lm1, lm2, lm3, lm4, verbose = FALSE)), c("Model", "Type", "AIC", "BIC", "R2", "R2_adjusted", "RMSE") ) }) } performance/tests/testthat/test-r2_mcfadden.R0000644000176200001440000000141413564746345021042 0ustar liggesusersif (require("testthat") && require("performance") && require("MASS")) { context("r2_mcfadden") options(contrasts = c("contr.treatment", "contr.poly")) data(housing, package = "MASS") model <- polr(Sat ~ Infl + Type + Cont, weights = Freq, data = housing) test_that("r2_mcfadden", { expect_equal( r2_mcfadden(model), structure( list( R2 = c(`McFadden's R2` = 0.0465152150591893), R2_adjusted = c(`adjusted McFadden's R2` = 0.0459671013089695) ), model_type = "Generalized Linear", class = "r2_generic" ), tolerance = 1e-3 ) expect_equal( r2(model), list(R2_Nagelkerke = c(`Nagelkerke's R2` = 0.108408289848161)), tolerance = 1e-3 ) }) } performance/tests/testthat/test-model_performance-various.R0000644000176200001440000000405713620205622024030 0ustar liggesusersif (require("testthat") && require("performance") && require("insight") && require("AER") && require("ordinal") && require("betareg")) { data("Affairs", package = "AER") data("GasolineYield") data("wine") data("CigarettesSW") CigarettesSW$rprice <- with(CigarettesSW, price / cpi) CigarettesSW$rincome <- with(CigarettesSW, income / population / cpi) CigarettesSW$tdiff <- with(CigarettesSW, (taxs - tax) / cpi) m1 <- betareg(yield ~ batch + temp, data = GasolineYield) m3 <- clm(rating ~ temp * contact, data = wine) m4 <- clm2(rating ~ temp * contact, data = wine) m5 <- ivreg( log(packs) ~ log(rprice) + log(rincome) | log(rincome) + tdiff + I(tax / cpi), data = CigarettesSW, subset = year == "1995" ) test_that("model_performance various", { expect_equal(model_performance(m1)$R2, 0.9617312, tolerance = 1e-4) expect_equal(model_performance(m3)$R2_Nagelkerke, 0.4042792, tolerance = 1e-4) expect_equal(model_performance(m4)$R2_Nagelkerke, 0.4042792, tolerance = 1e-4) expect_equal(model_performance(m5)$R2, 0.4294224, tolerance = 1e-4) }) } ## DirichletReg is currently orphaned # if (require("testthat") && require("performance") && require("DirichletReg")) { # set.seed(123) # data("ArcticLake") # # ALake <- ArcticLake # ALake$Y <- suppressWarnings(DR_data(ALake[, 1:3])) # # # fit a quadratic Dirichlet regression models ("common") # res1 <- DirichReg(Y ~ depth + I(depth^2), ALake) # # test_that("model_performance (Dirichlet regression)", { # expect_equal( # performance::model_performance(res1), # structure( # list( # AIC = -199.993722776335, # BIC = -185.021667961168, # R2_Nagelkerke = 0.0405982703444639, # RMSE = 0.922951614921502 # ), # class = c( # "performance_model", # "data.frame" # ), # row.names = 1L, # r2 = list(names = "R2_Nagelkerke") # ), # tolerance = 1e-3 # ) # }) # } performance/tests/testthat/test-r2_kullback.R0000644000176200001440000000063213564746345021072 0ustar liggesusersif (require("testthat") && require("performance")) { context("r2_kullback") test_that("r2_kullback", { model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") expect_equal(r2_kullback(model), c(`Kullback-Leibler R2` = 0.383436177754933), tolerance = 1e-3) expect_equal(r2_kullback(model, adjust = FALSE), c(`Kullback-Leibler R2` = 0.423214488867518), tolerance = 1e-3) }) } performance/tests/testthat/test-model_performance.lm.R0000644000176200001440000000062713564746345022773 0ustar liggesusersif (require("testthat") && require("performance")) { context("model_performance.lm") test_that("model_performance.lm", { model <- lm(mpg ~ wt + cyl, data = mtcars) expect_equal(model_performance(model)$R2, 0.830, tolerance = 0.01) model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") expect_equal(model_performance(model)$R2_Tjur, 0.478, tolerance = 0.01) }) } performance/tests/testthat/test-item_difficulty.R0000644000176200001440000000115613611533123022036 0ustar liggesusersif (require("testthat") && require("performance")) { test_that("item_difficulty", { data(iris) x <- iris[, 1:4] expect_equal( item_difficulty(x), structure( list( item = c( "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width" ), difficulty = c(0.74, 0.69, 0.54, 0.48), ideal = c(0.56, 0.61, 0.57, 0.7) ), class = c("item_difficulty", "data.frame"), row.names = c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width") ), tolerance = 1e-3 ) }) } performance/tests/testthat/test-backticks.R0000644000176200001440000000115513611533123020613 0ustar liggesusersif (require("testthat") && require("performance")) { data(iris) iris$`a m` <- iris$Species iris$`Sepal Width` <- iris$Sepal.Width m1 <- lm(`Sepal Width` ~ Petal.Length + `a m` * log(Sepal.Length), data = iris) m2 <- lm(Sepal.Width ~ Petal.Length + Species * log(Sepal.Length), data = iris) test_that("check_collinearity, backticks", { expect_equal(check_collinearity(m1)$Parameter, c("Petal.Length", "a m", "log(Sepal.Length)", "a m:log(Sepal.Length)")) expect_equal(check_collinearity(m2)$Parameter, c("Petal.Length", "Species", "log(Sepal.Length)", "Species:log(Sepal.Length)")) }) } performance/tests/testthat.R0000644000176200001440000000041213620205622015673 0ustar liggesuserslibrary(testthat) library(performance) if (length(strsplit(packageDescription("performance")$Version, "\\.")[[1]]) > 3) { Sys.setenv("RunAllperformanceTests" = "yes") } else { Sys.setenv("RunAllperformanceTests" = "no") } test_check("performance") performance/R/0000755000176200001440000000000013620205622012752 5ustar liggesusersperformance/R/check_autocorrelation.R0000644000176200001440000000364013564746345017472 0ustar liggesusers#' @title Check model for independence of residuals. #' @name check_autocorrelation #' #' @description Check model for independence of residuals, i.e. for autocorrelation #' of error terms. #' #' @param x A model object. #' @param nsim Number of simulations for the Durbin-Watson-Test. #' @param ... Currently not used. #' #' @return Invisibly returns the p-value of the test statistics. A p-value < 0.05 #' indicates autocorrelated residuals. #' #' @details Performs a Durbin-Watson-Test to check for autocorrelated residuals. #' In case of autocorrelation, robust standard errors return more accurate #' results for the estimates, or maybe a mixed model with error term for the #' cluster groups should be used. #' #' @examples #' m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) #' check_autocorrelation(m) #' @importFrom stats residuals model.matrix fitted #' @export check_autocorrelation <- function(x, ...) { UseMethod("check_autocorrelation") } #' @rdname check_autocorrelation #' @export check_autocorrelation.default <- function(x, nsim = 1000, ...) { .residuals <- stats::residuals(x) n <- length(.residuals) dw <- .durbWats(.residuals) X <- stats::model.matrix(x) mu <- stats::fitted(x) Y <- matrix(sample(.residuals, n * nsim, replace = TRUE), n, nsim) + matrix(mu, n, nsim) E <- stats::residuals(lm(Y ~ X - 1)) DW <- rbind(apply(E, 2, .durbWats)) p <- (sum(dw < DW[1, ])) / nsim p.val <- 2 * (min(p, 1 - p)) if (p.val < 0.05) { insight::print_color(sprintf("Warning: Autocorrelated residuals detected (p = %.3f).", p.val), "red") } else { insight::print_color(sprintf("OK: Residuals appear to be independent and not autocorrelated (p = %.3f).", p.val), "green") } invisible(p.val) } .durbWats <- function(.residuals) { n <- length(.residuals) den <- sum(.residuals^2) (sum((.residuals[2:n] - .residuals[1:(n - 1)])^2)) / den } performance/R/residuals.R0000644000176200001440000000026013463762317015104 0ustar liggesusers#' @importFrom insight get_response #' @export residuals.iv_robust <- function(object, ...) { .factor_to_numeric(insight::get_response(object)) - object$fitted.values } performance/R/performance_hosmer.R0000644000176200001440000000413013564746345016774 0ustar liggesusers#' @title Hosmer-Lemeshow goodness-of-fit test #' @name performance_hosmer #' #' @description Check model quality of logistic regression models. #' #' @param model A \code{glm}-object with binomial-family. #' @param n_bins Numeric, the number of bins to divide the data. #' #' @return An object of class \code{hoslem_test} with following values: \code{chisq}, #' the Hosmer-Lemeshow chi-squared statistic; \code{df}, degrees of freedom #' and \code{p.value} the p-value for the goodness-of-fit test. #' #' @details A well-fitting model shows \emph{no} significant difference between #' the model and the observed data, i.e. the reported p-value should be #' greater than 0.05. #' #' @references Hosmer, D. W., & Lemeshow, S. (2000). Applied Logistic Regression. Hoboken, NJ, USA: John Wiley & Sons, Inc. \doi{10.1002/0471722146} #' #' @examples #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' performance_hosmer(model) #' @importFrom stats fitted quantile xtabs pchisq #' @export performance_hosmer <- function(model, n_bins = 10) { if (inherits(model, "merMod") && !requireNamespace("lme4", quietly = TRUE)) { stop("Package `lme4` needed for this function to work. Please install it.", call. = FALSE) } # check for valid object class if (!inherits(model, c("glmerMod", "glm"))) { stop("`model` must be an object of class 'glm' or 'glmerMod'.", call. = F) } # mixed models (lme4) if (inherits(model, "glmerMod")) { y <- lme4::getME(model, "y") yhat <- stats::fitted(model) } else { y <- model$y yhat <- stats::fitted(model) } cutyhat <- cut( yhat, breaks = stats::quantile(yhat, probs = seq(0, 1, 1 / n_bins)), include.lowest = TRUE ) obs <- stats::xtabs(cbind(1 - y, y) ~ cutyhat) expect <- stats::xtabs(cbind(1 - yhat, yhat) ~ cutyhat) chisq <- sum((obs - expect)^2 / expect) p.value <- 1 - stats::pchisq(chisq, n_bins - 2) hoslem <- list( chisq = chisq, df = n_bins - 2, p.value = p.value ) class(hoslem) <- c("performance_hosmer", "list") hoslem } performance/R/item_intercor.R0000644000176200001440000000421513564746345015765 0ustar liggesusers#' @title Mean Inter-Item-Correlation #' @name item_intercor #' #' @description Compute various measures of internal consistencies #' for tests or item-scales of questionnaires. #' #' @param x A matrix as returned by the \code{\link{cor}}-function, #' or a data frame with items (e.g. from a test or questionnaire). #' @param method Correlation computation method. May be one of #' \code{"spearman"} (default), \code{"pearson"} or \code{"kendall"}. #' You may use initial letter only. #' #' @return The mean inter-item-correlation value for \code{x}. #' #' @details This function calculates a mean inter-item-correlation, i.e. #' a correlation matrix of \code{x} will be computed (unless #' \code{x} is already a matrix as returned by the \code{cor()}-function) #' and the mean of the sum of all item's correlation values is returned. #' Requires either a data frame or a computed \code{cor()}-object. #' \cr \cr #' \dQuote{Ideally, the average inter-item correlation for a set of #' items should be between .20 and .40, suggesting that while the #' items are reasonably homogenous, they do contain sufficiently #' unique variance so as to not be isomorphic with each other. #' When values are lower than .20, then the items may not be #' representative of the same content domain. If values are higher than #' .40, the items may be only capturing a small bandwidth of the construct.} #' \cite{(Piedmont 2014)} #' #' @references Piedmont RL. 2014. Inter-item Correlations. In: Michalos AC (eds) Encyclopedia of Quality of Life and Well-Being Research. Dordrecht: Springer, 3303-3304. \doi{10.1007/978-94-007-0753-5_1493} #' #' @examples #' data(mtcars) #' x <- mtcars[, c("cyl", "gear", "carb", "hp")] #' item_intercor(x) #' @importFrom stats cor na.omit #' @export item_intercor <- function(x, method = c("pearson", "spearman", "kendall")) { # Check parameter method <- match.arg(method) # Mean-interitem-corelation if (inherits(x, "matrix")) { corr <- x } else { x <- stats::na.omit(x) corr <- stats::cor(x, method = method) } mean(corr[lower.tri(corr)]) } performance/R/looic.R0000644000176200001440000000330113611533123014177 0ustar liggesusers#' @title LOO-related Indices for Bayesian regressions. #' @name looic #' #' @description Compute LOOIC (leave-one-out cross-validation (LOO) information #' criterion) and ELPD (expected log predictive density) for Bayesian regressions. #' #' @param model A Bayesian regression model. #' #' @return A list with four elements, the ELPD, LOOIC and their standard errors. #' #' @examples #' if (require("rstanarm")) { #' model <- stan_glm(mpg ~ wt + cyl, data = mtcars, chains = 1, iter = 500, refresh = 0) #' looic(model) #' } #' @importFrom insight find_algorithm print_color #' @importFrom stats var #' @export looic <- function(model) { if (!requireNamespace("loo", quietly = TRUE)) { stop("Package `loo` needed for this function to work. Please install it.") } algorithm <- insight::find_algorithm(model) if (algorithm$algorithm != "sampling") { warning("`looic()` only available for models fit using the 'sampling' algorithm.", call. = FALSE) return(NA) } out <- list() loo_df <- tryCatch( { as.data.frame(loo::loo(model)$estimates) }, error = function(e) { if (inherits(e, c("simpleError", "error"))) { insight::print_color(e$message, "red") cat("\n") } NULL } ) if (is.null(loo_df)) { return(NULL) } out$ELPD <- loo_df[rownames(loo_df) == "elpd_loo", ]$Estimate out$ELPD_SE <- loo_df[rownames(loo_df) == "elpd_loo", ]$SE out$LOOIC <- loo_df[rownames(loo_df) == "looic", ]$Estimate out$LOOIC_SE <- loo_df[rownames(loo_df) == "looic", ]$SE # Leave p_loo as I am not sure it is an index of performance structure( class = "looic", out ) } performance/R/check_zeroinflation.R0000644000176200001440000000416513616476346017145 0ustar liggesusers#' @title Check for zero-inflation in count models #' @name check_zeroinflation #' #' @description \code{check_zeroinflation()} checks whether count models are over- or #' underfitting zeros in the outcome. #' #' @param x Fitted model of class \code{merMod}, \code{glmmTMB}, \code{glm}, #' or \code{glm.nb} (package \pkg{MASS}). #' @param tolerance The tolerance for the ratio of observed and predicted #' zeros to considered as over- or underfitting zeros. A ratio #' between 1 +/- \code{tolerance} is considered as OK, while a ratio #' beyond or below this threshold would indicate over- or underfitting. #' #' @return A list with information about the amount of predicted and observed #' zeros in the outcome, as well as the ratio between these two values. #' #' @details If the amount of observed zeros is larger than the amount of #' predicted zeros, the model is underfitting zeros, which indicates a #' zero-inflation in the data. In such cases, it is recommended to use #' negative binomial or zero-inflated models. #' #' @examples #' if (require("glmmTMB")) { #' data(Salamanders) #' m <- glm(count ~ spp + mined, family = poisson, data = Salamanders) #' check_zeroinflation(m) #' } #' @importFrom insight get_response model_info #' @importFrom stats fitted dpois #' @export check_zeroinflation <- function(x, tolerance = .05) { # check if we have poisson model_info <- insight::model_info(x) if (!model_info$is_poisson) { stop("Model must be from Poisson-family.", call. = F) } # get actual zero of response obs.zero <- sum(insight::get_response(x) == 0) if (obs.zero == 0) { insight::print_color("Model has no observed zeros in the response variable.\n", "red") return(NULL) } # get predictions of outcome mu <- stats::fitted(x) # get predicted zero-counts pred.zero <- round(sum(stats::dpois(x = 0, lambda = mu))) # proportion structure( class = "check_zi", list( predicted.zeros = pred.zero, observed.zeros = obs.zero, ratio = pred.zero / obs.zero, tolerance = tolerance ) ) } performance/R/check_collinearity.R0000644000176200001440000002020113620052564016730 0ustar liggesusers#' @title Check for multicollinearity of model terms #' @name check_collinearity #' #' @description \code{check_collinearity()} checks regression models for #' multicollinearity by calculating the variance inflation factor (VIF). #' #' @param x A model object (that should at least respond to \code{vcov()}, #' and if possible, also to \code{model.matrix()} - however, it also should #' work without \code{model.matrix()}). #' @param component For models with zero-inflation component, multicollinearity #' can be checked for the conditional model (count component, #' \code{component = "conditional"} or \code{component = "count"}), #' zero-inflation component (\code{component = "zero_inflated"} or #' \code{component = "zi"}) or both components (\code{component = "all"}). #' Following model-classes are currently supported: \code{hurdle}, #' \code{zeroinfl}, \code{zerocount}, \code{MixMod} and \code{glmmTMB}. #' @param ... Currently not used. #' #' @return A data frame with three columns: The name of the model term, the #' variance inflation factor and the factor by which the standard error #' is increased due to possible correlation with other terms. #' #' @details The variance inflation factor is a measure to analyze the magnitude #' of multicollinearity of model terms. A VIF less than 5 indicates #' a low correlation of that predictor with other predictors. A value between #' 5 and 10 indicates a moderate correlation, while VIF values larger than 10 #' are a sign for high, not tolerable correlation of model predictors. The #' \emph{Increased SE} column in the output indicates how much larger #' the standard error is due to the correlation with other predictors. #' \cr \cr #' An informative blog post about collinearity can be found #' \href{https://janhove.github.io/analysis/2019/09/11/collinearity}{here}. #' #' @references James, G., Witten, D., Hastie, T., & Tibshirani, R. (Hrsg.). (2013). An introduction to statistical learning: with applications in R. New York: Springer. #' #' @note There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. #' #' @examples #' m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) #' check_collinearity(m) #' #' # plot results #' x <- check_collinearity(m) #' plot(x) #' @importFrom stats vcov cov2cor terms #' @importFrom insight has_intercept find_formula model_info print_color #' @export check_collinearity <- function(x, ...) { UseMethod("check_collinearity") } #' @export check_collinearity.default <- function(x, ...) { .check_collinearity(x, component = "conditional") } #' @rdname check_collinearity #' @export check_collinearity.glmmTMB <- function(x, component = c("all", "conditional", "count", "zi", "zero_inflated"), ...) { component <- match.arg(component) .check_collinearity_zi_model(x, component) } #' @export check_collinearity.MixMod <- function(x, component = c("all", "conditional", "count", "zi", "zero_inflated"), ...) { component <- match.arg(component) .check_collinearity_zi_model(x, component) } #' @export check_collinearity.hurdle <- function(x, component = c("all", "conditional", "count", "zi", "zero_inflated"), ...) { component <- match.arg(component) .check_collinearity_zi_model(x, component) } #' @export check_collinearity.zeroinfl <- function(x, component = c("all", "conditional", "count", "zi", "zero_inflated"), ...) { component <- match.arg(component) .check_collinearity_zi_model(x, component) } #' @export check_collinearity.zerocount <- function(x, component = c("all", "conditional", "count", "zi", "zero_inflated"), ...) { component <- match.arg(component) .check_collinearity_zi_model(x, component) } .check_collinearity_zi_model <- function(x, component) { if (component == "count") component <- "conditional" if (component == "zi") component <- "zero_inflated" mi <- insight::model_info(x) if (!mi$is_zero_inflated) component <- "conditional" if (component == "all") { cond <- .check_collinearity(x, "conditional") zi <- .check_collinearity(x, "zero_inflated") if (is.null(cond) && is.null(zi)) { return(NULL) } if (is.null(cond)) { zi$Component <- "zero inflated" return(zi) } if (is.null(zi)) { cond$Component <- "conditional" return(cond) } cond$Component <- "conditional" zi$Component <- "zero inflated" dat_cond <- attr(cond, "data") dat_zi <- attr(zi, "data") dat <- rbind(cond, zi) attr(dat, "data") <- rbind(dat_cond, dat_zi) dat } else { .check_collinearity(x, component) } } #' @importFrom insight get_varcov .check_collinearity <- function(x, component) { v <- insight::get_varcov(x, component = component) assign <- .term_assignments(x, component) if (insight::has_intercept(x)) { v <- v[-1, -1] assign <- assign[-1] } else { warning("Model has no intercept. VIFs may not be sensible.", call. = FALSE) } f <- insight::find_formula(x) if (inherits(x, "mixor")) { terms <- labels(x$terms) } else { terms <- labels(stats::terms(f[[component]])) } if ("instruments" %in% names(f)) { terms <- unique(c(terms, labels(stats::terms(f[["instruments"]])))) } n.terms <- length(terms) if (n.terms < 2) { insight::print_color(sprintf("Not enough model terms in the %s part of the model to check for multicollinearity.\n", component), "red") return(NULL) } R <- stats::cov2cor(v) detR <- det(R) result <- vector("numeric") for (term in 1:n.terms) { subs <- which(assign == term) result <- c( result, det(as.matrix(R[subs, subs])) * det(as.matrix(R[-subs, -subs])) / detR ) } structure( class = c("check_collinearity", "see_check_collinearity", "data.frame"), .remove_backticks_from_parameter_names( data.frame( Parameter = terms, VIF = result, SE_factor = sqrt(result), stringsAsFactors = FALSE ) ), data = .remove_backticks_from_parameter_names( data.frame( Parameter = terms, VIF = result, SE_factor = sqrt(result), Component = component, stringsAsFactors = FALSE ) ) ) } #' @importFrom stats model.matrix .term_assignments <- function(x, component) { tryCatch( { if (inherits(x, c("hurdle", "zeroinfl", "zerocount"))) { assign <- switch( component, conditional = attr(stats::model.matrix(x, model = "count"), "assign"), zero_inflated = attr(stats::model.matrix(x, model = "zero"), "assign") ) } else if (inherits(x, "glmmTMB")) { assign <- switch( component, conditional = attr(stats::model.matrix(x), "assign"), zero_inflated = .find_term_assignment(x, component) ) } else if (inherits(x, "MixMod")) { assign <- switch( component, conditional = attr(stats::model.matrix(x, type = "fixed"), "assign"), zero_inflated = attr(stats::model.matrix(x, type = "zi_fixed"), "assign") ) } else { assign <- attr(stats::model.matrix(x), "assign") } if (is.null(assign)) { assign <- .find_term_assignment(x, component) } assign }, error = function(e) { .find_term_assignment(x, component) } ) } #' @importFrom insight get_data find_predictors find_parameters clean_names .find_term_assignment <- function(x, component) { pred <- insight::find_predictors(x)[[component]] dat <- insight::get_data(x)[, pred] parms <- unlist(lapply(1:length(pred), function(i) { p <- pred[i] if (is.factor(dat[[p]])) { ps <- paste0(p, levels(dat[[p]])) names(ps)[1:length(ps)] <- i ps } else { names(p) <- i p } })) as.numeric(names(parms)[match( insight::clean_names(insight::find_parameters(x)[[component]]), parms )]) } performance/R/performance_accuracy.R0000644000176200001440000001371313564746345017300 0ustar liggesusers#' @title Accuracy of predictions from model fit #' @name performance_accuracy #' #' @description This function calculates the predictive accuracy of linear #' or logistic regression models. #' #' @param model Fitted model object of class \code{lm} or \code{glm}, the latter #' being a logistic regression model (binary response). #' @param k The number of folds for the kfold-crossvalidation. #' @param method Character string, indicating whether crossvalidation #' (\code{method = "cv"}) or bootstrapping (\code{method = "boot"}) #' is used to compute the accuracy values. #' @param n Number of bootstrap-samples. #' #' @return A list with three values: The \code{Accuracy} of the model predictions, i.e. #' the proportion of accurately predicted values from the model, its standard #' error, \code{SE}, and the \code{Method} used to compute the accuracy. #' #' @details For linar models, the accuracy is the correlation coefficient #' between the actual and the predicted value of the outcome. For #' logistic regression models, the accuracy corresponds to the #' AUC-value, calculated with the \code{\link[bayestestR]{auc}}-function. #' \cr \cr #' The accuracy is the mean value of multiple correlation resp. #' AUC-values, which are either computed with crossvalidation #' or nonparametric bootstrapping (see argument \code{method}). #' The standard error is the standard deviation of the computed #' correlation resp. AUC-values. #' #' @examples #' model <- lm(mpg ~ wt + cyl, data = mtcars) #' performance_accuracy(model) #' #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' performance_accuracy(model) #' @importFrom bayestestR area_under_curve #' @importFrom insight find_response get_data #' @importFrom stats lm cor glm predict predict.glm model.frame formula binomial sd #' @export performance_accuracy <- function(model, method = c("cv", "boot"), k = 5, n = 1000) { method <- match.arg(method) # get formula from model fit formula <- stats::formula(model) # get name of response resp.name <- insight::find_response(model) # model data, for cross validation model_data <- insight::get_data(model) # accuracy for linear models if (inherits(model, "lm") && !inherits(model, "glm")) { measure <- "Correlation between observed and predicted" # check if bootstrapping or cross validation is requested if (method == "boot") { # accuracy linear models with bootstrapping bootstr <- replicate(n, sample(nrow(model_data), replace = TRUE), simplify = FALSE) models <- lapply(bootstr, function(.x) { stats::lm(formula, data = model_data[.x, ]) }) predictions <- mapply(function(.x, .y) { stats::predict(.y, newdata = model_data[.x, ]) }, bootstr, models, SIMPLIFY = FALSE) response <- lapply(bootstr, function(.x) { as.data.frame(model_data[.x, ])[[resp.name]] }) accuracy <- mapply(function(.x, .y) { stats::cor(.x, .y, use = "pairwise.complete.obs") }, predictions, response) } else { # accuracy linear models with cross validation cv <- .crossv_kfold(model_data, k = k) models <- lapply(cv, function(.x) { stats::lm(formula, data = model_data[.x$train, ]) }) predictions <- mapply(function(.x, .y) { stats::predict(.y, newdata = model_data[.x$test, ]) }, cv, models, SIMPLIFY = FALSE) response <- lapply(cv, function(.x) { as.data.frame(model_data[.x$test, ])[[resp.name]] }) accuracy <- mapply(function(.x, .y) { stats::cor(.x, .y, use = "pairwise.complete.obs") }, predictions, response) } } else if (inherits(model, "glm") && stats::family(model)$family == "binomial") { measure <- "Area under Curve" # check if bootstrapping or cross validation is requested if (method == "boot") { # accuracy linear models with bootstrapping bootstr <- replicate(n, sample(nrow(model_data), replace = TRUE), simplify = FALSE) models <- lapply(bootstr, function(.x) { stats::glm(formula, data = model_data[.x, ], family = stats::binomial(link = "logit")) }) predictions <- mapply(function(.x, .y) { stats::predict.glm(.y, newdata = model_data[.x, ]) }, bootstr, models, SIMPLIFY = FALSE) response <- lapply(bootstr, function(.x) { .factor_to_numeric(as.data.frame(model_data[.x, ])[[resp.name]]) }) accuracy <- mapply(function(.x, .y) { roc <- performance_roc(x = .x, predictions = .y) bayestestR::area_under_curve(roc$Sensivity, roc$Specifity) }, response, predictions) } else { # accuracy linear models with cross validation cv <- .crossv_kfold(model_data, k = k) models <- lapply(cv, function(.x) { stats::glm(formula, data = model_data[.x$train, ], family = stats::binomial(link = "logit")) }) predictions <- mapply(function(.x, .y) { stats::predict.glm(.y, newdata = model_data[.x$test, ]) }, cv, models, SIMPLIFY = FALSE) response <- lapply(cv, function(.x) { .factor_to_numeric(as.data.frame(model_data[.x$test, ])[[resp.name]]) }) accuracy <- mapply(function(.x, .y) { roc <- performance_roc(x = .x, predictions = .y) bayestestR::area_under_curve(roc$Sensivity, roc$Specifity) }, response, predictions) } } # return mean value of accuracy structure( class = c("performance_accuracy"), list( Accuracy = mean(accuracy), SE = stats::sd(accuracy), Method = measure ) ) } .crossv_kfold <- function(model_data, k = 5) { n <- nrow(model_data) folds <- sample(rep(1:k, length.out = n)) idx <- seq_len(n) fold_idx <- split(idx, folds) fold <- function(test) { list(train = setdiff(idx, test), test = test) } lapply(fold_idx, fold) } performance/R/check_model.R0000644000176200001440000001300613611533123015332 0ustar liggesusers#' @title Visual check of model assumptions #' @name check_model #' #' @description Visual check of model various assumptions (normality of residuals, #' normality of random effects, heteroscedasticity, homogeneity of variance, #' multicollinearity). #' #' @param x A model object. #' @param dot_size Size of dot-geoms. #' @param line_size Size of line-geoms. #' @param panel Logical, if \code{TRUE}, plots are arranged as panels; else, #' single plots for each diagnostic are returned. #' @param check Character vector, indicating which checks for should be performed #' and plotted. May be one or more of #' \code{"all", "vif", "qq", "normality", "ncv", "homogeneity", "outliers", "reqq"}. #' \code{"reqq"} is a QQ-plot for random effects and only available for mixed models. #' \code{"ncv"} checks for non-constant variance, i.e. for heteroscedasticity. #' By default, all possible checks are performed and plotted. #' @param ... Currently not used. #' #' @return The data frame that is used for plotting. #' #' @note This function just prepares the data for plotting. To create the plots, #' \CRANpkg{see} needs to be installed. #' #' @examples #' \dontrun{ #' m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) #' check_model(m) #' #' if (require("lme4")) { #' m <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy) #' check_model(m, panel = FALSE) #' } #' #' if (require("rstanarm")) { #' m <- stan_glm(mpg ~ wt + gear, data = mtcars, chains = 2, iter = 200) #' check_model(m) #' } #' } #' @export check_model <- function(x, ...) { UseMethod("check_model") } #' @rdname check_model #' @export check_model.default <- function(x, dot_size = 2, line_size = .8, panel = TRUE, check = "all", ...) { minfo <- insight::model_info(x) if (minfo$is_bayesian) { ca <- .check_assumptions_stan(x) } else if (minfo$is_linear) { ca <- .check_assumptions_linear(x, minfo) } else { ca <- .check_assumptions_glm(x, minfo) } # else { # stop(paste0("`check_assumptions()` not implemented for models of class '", class(x)[1], "' yet."), call. = FALSE) # } attr(ca, "panel") <- panel attr(ca, "dot_size") <- dot_size attr(ca, "line_size") <- line_size attr(ca, "check") <- check ca } .check_assumptions_linear <- function(model, model_info) { dat <- list() dat$VIF <- .diag_vif(model) dat$QQ <- .diag_qq(model) dat$REQQ <- .diag_reqq(model, level = .95, model_info = model_info) dat$NORM <- .diag_norm(model) dat$NCV <- .diag_ncv(model) dat$HOMOGENEITY <- .diag_homogeneity(model) dat$OUTLIERS <- check_outliers(model, method = "cook") dat <- .compact_list(dat) class(dat) <- c("check_model", "see_check_model") dat } .check_assumptions_glm <- function(model, model_info) { dat <- list() dat$VIF <- .diag_vif(model) dat$QQ <- .diag_qq(model) dat$HOMOGENEITY <- .diag_homogeneity(model) dat$REQQ <- .diag_reqq(model, level = .95, model_info = model_info) dat$OUTLIERS <- check_outliers(model, method = "cook") dat <- .compact_list(dat) class(dat) <- c("check_model", "see_check_model") dat } #' @importFrom stats reshape update .check_assumptions_stan <- function(model) { if (inherits(model, "brmsfit")) { # check if brms can be loaded if (!requireNamespace("brms", quietly = TRUE)) { stop("Package `brms` needs to be loaded first!", call. = F) } # check if prior sample are available d2 <- brms::prior_samples(model) if (is.null(d2)) { stop("No prior-samples found. Please use option `sample_prior = TRUE` when fitting the model.", call. = FALSE) } d1 <- brms::posterior_samples(model) # get samples from posterior and prior d1 <- d1[, grepl(pattern = "(b_|bs_|bsp_|bcs_)(?!(Intercept|zi_Intercept))(.*)", colnames(d1), perl = TRUE)] d2 <- d2[, grepl(pattern = "(b_|bs_|bsp_|bcs_)(?!(Intercept|zi_Intercept))(.*)", colnames(d2), perl = TRUE)] } else if (inherits(model, c("stanreg", "stanfit"))) { # check if rstanarm can be loaded if (!requireNamespace("rstanarm", quietly = TRUE)) { stop("Package `rstanarm` needs to be loaded first!", call. = F) } # get samples from posterior and prior prior <- suppressWarnings( stats::update(model, prior_PD = TRUE, refresh = -1, iter = 2000, chains = 2) ) d1 <- as.data.frame(model) d2 <- as.data.frame(prior) # remove intercept from output for ridgeline plot. # this would increase the range of the scale too much if (.obj_has_name(d1, "(Intercept)")) { d1 <- .remove_column(d1, "(Intercept)") } if (.obj_has_name(d2, "(Intercept)")) { d2 <- .remove_column(d2, "(Intercept)") } if (.obj_has_name(d1, "sigma")) { d1 <- .remove_column(d1, "sigma") } if (.obj_has_name(d2, "sigma")) { d2 <- .remove_column(d2, "sigma") } d1 <- d1[, grepl(pattern = "^(?!(b\\[\\(Intercept\\)|Sigma\\[))(.*)", colnames(d1), perl = TRUE)] d2 <- d2[, grepl(pattern = "^(?!(b\\[\\(Intercept\\)|Sigma\\[))(.*)", colnames(d2), perl = TRUE)] } # grouping variable d1$group <- "Posterior" d2$group <- "Prior" gather.cols <- colnames(d1)[1:(ncol(d1) - 1)] dat <- stats::reshape( rbind(d1, d2), idvar = "id", times = gather.cols, timevar = "y", v.names = "x", varying = gather.cols, direction = "long" ) class(dat) <- c("check_model", "see_check_model", "data.frame") dat } performance/R/check_normality.R0000644000176200001440000000421113620052564016253 0ustar liggesusers#' @title Check model for (non-)normality of residuals. #' @name check_normality #' #' @description Check model for (non-)normality of residuals. #' #' @param x A model object. #' @param ... Currently not used. #' #' @return Invisibly returns the p-value of the test statistics. A p-value #' < 0.05 indicates a significant deviation from normal distribution #' #' @note There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. #' #' @details \code{check_normality()} calls \code{\link[stats]{shapiro.test}} #' and checks the standardized residuals for normal distribution. Note that #' this formal test almost always yields significant results for the distribution #' of residuals and visual inspection (e.g. Q-Q plots) are preferable. #' #' @examples #' m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) #' check_normality(m) #' #' # plot results #' x <- check_normality(m) #' plot(x) #' \dontrun{ #' # QQ-plot #' plot(check_normality(m), type = "qq") #' #' # PP-plot #' plot(check_normality(m), type = "pp") #' } #' @importFrom stats shapiro.test rstandard #' @export check_normality <- function(x, ...) { UseMethod("check_normality") } #' @export check_normality.default <- function(x, ...) { # check for normality of residuals ts <- tryCatch( { stats::shapiro.test(stats::rstandard(x)) }, error = function(e) { NULL } ) if (is.null(ts)) { insight::print_color(sprintf("'check_normality()' does not support models of class '%s'.\n", class(x)[1]), "red") return(NULL) } p.val <- ts$p.value if (p.val < 0.05) { insight::print_color(sprintf("Warning: Non-normality of residuals detected (p = %.3f).\n", p.val), "red") } else { insight::print_color(sprintf("OK: Residuals appear as normally distributed (p = %.3f).\n", p.val), "green") } attr(p.val, "object_name") <- deparse(substitute(x), width.cutoff = 500) class(p.val) <- unique(c("check_normality", "see_check_normality", class(p.val))) invisible(p.val) } performance/R/sysdata.rda0000644000176200001440000225056413500713552015133 0ustar liggesusersBZh91AY&SY1%6C @@6D]|h@(P BJ AA P*ET@( R$R@Q@)R*HPT( DQ ( @PA* P*@R)EBJTREHPDUJ p| ($R)*a 9P4RD@PP$R*Dp:Me"Z$Pm)HI*@P4 AAR I@ %"P@+@ PRRUD((gjP䪠 (I* E  Z!RPTBR%* 0`R(T T*T[ *JH ITE%Rl$PR@JJBRDD AJ"U NUU ITQ]4 PU(K@iSE(TD*:R((JѠ((@)J)B@R(P( PP@( R@R(P(P UɦԦz$j~i虩iMb 15=OM Ljxh=OS5O#S3MOM5==S4с=OT?U??STSMOSS=TSOUOTU?OR<"=za@2= 4h0 4 dѡ4b4d@24"DSz)Ҙ#5@444P4@4@ h = $%BC$Iie =G  4%ISMO=54 2ѵPz4ddhh=MHh764hxA0ڔԧOF6ʞԀdddh4M=F=@U4?NԐU zu%D?:; G=O?iϤL??CчISΙ':p]J?Puk.>euY_؇?";Oڇl~`r9ҿRxuެ̬;wx!g>/h?3ܟ7:v-r7O 5"}A]͇>s睴q;9V^׺:LJSŚ4=L$ƓλDb^#jEG{-6v=ǐV5.Cy̚1с4:>ّY(,3m5kk"}RB%H;9{ǻ3b o66b '>)T7?Ru*_;tI4dR$%'Z6sF*mcCKcLf]էړ4,fMNЗ_:+oN?-Ri`ݛɄv}xZt-bF&kfd5m 4WKnr"&զ I2$x͹j4H-Km4:=(zLB!i@Кa՘>%=}A:⧱V jXQ1Wvڢ%%m]N@Oi.蓊A)vE}jy>juCF5tvhtuѼTz]p*uս8gٍj^7* c;`}Z¶fkHlq!2ug'=QnM ?S%YL!0V(N{G:VfjUS8 ^EDM%:3*&;)܆OZ8s%J+8:'v%,!t^&Fb]zfC69͝z若 "aNe\"YF!Pٜ/NYFCfM R:}VM }+*m5Z% T`Α(M GpBY\J]ɦ=m E,ڊS+q4ے׉tђSжHvyImh"3S+bm4bMp^S?KRq־Yb"Եw"B06ɏaoUT+,?bd.u1V*]rIeH-ջ92O],Prζ<IcqOJ*jrj\URA)eXRAw_n/L7Շ/B"QLʖ.OMVތekK2L??]1LҊq3t 3[ݘcӨm9O-q!ᙿ%脕>^D}Eoy4dyŐO4Js w9iZ2%n'wl:/爪3p rrkGع;i*-\]-_W-D8=KpWRFrTҴ,sXЩåo,(fx-u[KSB^'ʭZ" 6Ty(o~"'lpFO9,+#t=5Ƥˑ.k#zQMplTjB+GelW^tER<^96Vu{sXqq9s \&ɟMK n(&+t4%aBɼĆ+TӆE 'ULR`iaU_;{!D$AݯN9+L]KpHv'2y~cW[+wy+-J"ͱ>dX~(B$i:52!RJy_eo M$\" 2ss*O|)?UݩC/D;VD] mY&ƇYU(:m܄4o?s$I0@o'ԛpBzb؟6 l\٥c-Yj:\0K׻px77iמn bqaY%/Wh˴J.D*%w\wqRl2#9湄KBV6kRژYܞ[;̔7)w^沢Wg<,;ﭢN&VUa uH=W5Sg]!ͦƲ?~,YW.:O V%TgΊC}/ U; .'["#l+hEtfw6%$#J  eb?=A*YReB[cl9SdU0ΧTŧB-V"x{yz\'m"6Z(yeLgAZS[K|$8wdCCmoJ4>U_2P7"lAdnT]#ei#Ț?]O)LYz dҝN]YK` zx%AjGow-ιj\܈Лwh!Yz$:=+0Oѫ̨zS /TIro.CM#*-bv߻S=a&`2B %EA=i9[Y&M2`.pݖhF3s+48[ڌ=R-=b< -]~j%rw4<ՇMz[!ީ\gp޾$#:&~lHbpɧ[͸ŷBLZ}<,0ӛe]8LsM]Mn\J"} qdMjy -u38:\{S< ,2aʂTrdZZH)hdFbI+4R;o Z5nC !Ş?$ A2 Onn9$G_6sIΥ'~.iv;B?n/9LKF&uL#7O퐤kvS<4yVckJIdב+U[E5(2\]x{aqu 8ԦjsV؆5/.1b~4_2YN5GmF6&3'MY*Y5Bt S i.r-liV̑>F:=y$`ۤ -u]j11L3I&KvcwtS'6sFut0)KS L]3Ĝ][jF+ d.M[$\Rv\]jNn6Asvǀj8JJa+jVN^+3;ٜj7"`y )!B2!G# XݓL`BAƜӫ2cq1&n3..=yu4OZBã9 PNr*qlk>KWFyIWN1\ReZ?-<[I2Db<)댋\j1KEyslcB0E1 È^qqkdL~$ q{}f}lS4dS$y b[+KA/WԻRqv"" itNk oɎl(DBZ@laG"[g p1Ѱ摖OGy^sKKR?/lP״{k~hۺ&7xtWΪQ+ ~}l ? tIKKzRP.1 "m0i(x%# ΅\Awa4zֳz/ ~atTP 5.^]K^(&>S!ֆT񫋩~z+Ri"1FMF [El;䫖2+c`6eA4=JNU0%Y[D;`ʷym^XU5Iy6Bk. yc>:G<#$ ٝ&㯣lZ1 ɏR2$y%i<H}Tyxh;fK_L+:ZoMS%(o&OET1氮Bd'HBlu̥Zw\ŝ-:,nenIj,➦rP':^&I iKys 1oXD4޸/ϣJQH@.%(]JLQRm ʲ_nQRvr{[Tw@1IDgyњo`ku|3n!bn`Q&H"mG'56+،RY&e|贝Y˸hpB^ ^w_boT}PCm(W&RЦ=۱7mWI%|hPg?A;Xm Ɲ<$eUw3jXmQϜ]@xtlҬLo [٘Kѱ&j!ޞ8h6gGL\&G/=?B_/?G/q/K?s?s3$䜓rNI%rW%rW_mr@Hry?p'\\r!r9G rAPBT BJB $2LrrL 22111rS thjhe2L,cF21cc,lldc#c,e21llllcXX(J*X!PJ$J*AH!B%I*HAH1B*Jf/ET@:jI)R6H:tr˕*L0FѰpppppo//_ޗz^^zp8qwwv`p8wwewwv]eٽ޸qwvv]et]]]Et]E.Qr!ssn[8qmmmml[bĉ"B!hZZ~߷``5#8s2̳KKBдs'+UjKQΉ! "F-jh۫.nnnnnnnmr݌-aBH"*-mmmmKRԵ-KRPD"@(B"BD"DD"D(B""DD1r!$L|||{bض-` |||{khS1:-*ӧNޝ:e3wW \\SL\s7&s[N:wp\pp*p\pܛrnCrN2BB\¸W7fwcp908oC $&ߙ___+|__+x^x!}}||_______+||=F``J\px8 `d&IpC&Ix<d,\ Y*_|_+}}|FFApx9 !dd{Ǽ{ `|dd`_+厱`ǜYA\%8'``pVAp8G z0'* |ƍ y<{ϟ8N'M4MST5M 4M4M4M 2d155M&f͛5MST6lɒD2I$xxxxk aa4$ H$uG#8G#r9GQuG||8   O'y|=NS9MxN8NS%XKRԹrI$d !&KԢQ(I !&LI#$I$dRT8k afaq&LI%IRI$HJRRJ*TRDPĴKDrcɓ2d$$d-K(JRTRRJsr b)dɓj&Irsa,%jY,RJ*PJ A(%J*RHJRI$I$ÉJR'%Z%p\JR'9b86a0L%jj2bLY,ke*es b)b)a0)& b)a0)b Z*JɒI$*L!$!!%B'%jZ˖K%&)a0L&0L2d1L2da0L 1LS&L&&L p9'%4&5M&t9N8NSp8S'y===OS:s9q8'ND9MSTКfӉÓٳf 5MSQ5C:tB(E@"@@@@OS=8qPTAODxO 8P=OS=OS=OS'thѣEQTBQ(J%4UEQTUDQEQTEDTUDQ(@P@P @PTAPT AP(A(PTA@@@@@A A'99ɧ<4oտr(f8{ ?H$>5!ӅMD*"Fl#&kOWC5mxz+՞ q.WֵkU*,D#zUVRTkGe=0b[tIG*d|[Y=uȥD֝nȏggKefnjKN 0dg1cI<: s EmP؍[]V!n<_k!QENce.#}kyҾm$˪{B) sij0N]vdzR58:i&3BXs{ Ԅ~Mq6vP$#zJWS,hqdD7 Nj=pi.FVqŧ7BWQ։e.ި6Lؙ9JW6vN06"t2Pf/Z\7.ǡiIgK9#><GMOZVW\<7Z;/K=Ju^;<(JζMy)=wJYyCcaDŽ%;cx)R*Qy=Ml6 !a'o̰n`j4c-2sJh5sC:ۼ"Zf% "[13GUocřRC6$ (ÚhX\7p}ʅM4OS!qf$ٮԯU6FvK>Vс8,-Pn;ȭWKey C*Fkmg=trd{!"mjsɍmwD P84;e˝)8[睓WPÙޢպwmTOJt;>݈\r"Y"@J<~rF2*ixd--c[MVSDLs4dWY^ & p&FuN[`Y"ޘpn}o Sd9ttQU6b]q玊:.Qw|{On^K}s췹Ik>owSNMiV}Z=A,`>kΏYYu1\9df,$j.$WVFǵM\{7]Y_k鯈9lut_/-.Wfǫ^'mRkLd6M=O{^耚 n5uQi%3OL_TKReGRUΒ[+P9 F<NjuDM%#_-}!yk)Q[3 ;ʊ)9T?8뇂hI=m_uM,fc4o"xxER " & M>vҋj #Ɠrӭ~DK^6f9/m!|bL.ýEMKE0\Ysr j. tcr> S7l؋z(FGr~䎺9W{r][2R/c\cҥ$ |Vhy ])L[9qkMjП.>9[* xUzx5aaXb3< >|t-mUNzTl|h۟#?z^+74ST< );z60Ǥ5k)2 iøzuFh7 ^W*r[)W!AVAi6cwxR~Wm$+"FkW3^m27 lNK6(ͤ9=1y&XƒgŸB<'eD4vL`d4tLݝMQA:k2V"UhFtf41SkP׹:VaJ6AT#-Hl}Wy -;LY!Y z^N9NO]6+Z!e!GQ"\T̛છ^>J#zfP9w^[ķ{QiōS(TB֖A'i:A*q;Ӥ+n2 nv$2t.U1%#Z$Aݰ::X(dFvaҁ{(1~k$$4oylV$/h Wusf[g }8#zN8&eqChv7 e{8zhR̴HDs48ȥ(xkVઝz'2<5;H' 9>O͋ZȕL1M q\,Z%.ڭa%I Xүe}of rI]:>=2;WvY4Isu ~'QK,o ێ EQs,|$Puܨȼ6Z򱎟b",%iJ&eR+1󽙉"3,7/'<)5Hzj )֘i#Jz7Ȍ%hz+Ni225|}VΪ"B!03 ɮ+2u윙2d$%J+e#eR226[)a,b)䱅1A:%XG1ύnub ų&%zֽFXU.b$q(r;?n_pEWykdA;/:Qa_"ʝq?ʬ8s2\uf[[,H&!^.]e(U: DOBVYz?zyCQ?&!VMi{r|gjTf  -&Oo=Uc_pLr0yP` A߷eH$f!BKJO\VMKQ]{&ta5QJGv͹P [.y6u^m^#HWj3&wJA3V\b|pY{-8T-ݣx! ׬tBD F2-lLS`O<1 'nZ=ҽKlO#a %|Z7:CƹTR&:f+G5Dxu䜩]'I>'0UQ4xZ:jv,ĝh%[SYR|k=Jbgx2KQbHȐw»gqSl[%vBb/q9vיOs59՛:˷f#:(KS 0\*񌨦{^?NĝʐU퍽gxfΓY=V%~Mﵟ.%^:$cHlm`-МcJRwXtYs@O\h^S>2dfIDAXhJQ_JZ); Ly-V&HPD[ O"+7'L[پ(=?8*;KZ>v ߳ddu8=ѯp܋9AVTBN10뒷<I!jZ껖Ϙb/]:]zveF z c,c< }7SdeQXMIZGK4Lt;|wph(}2;"ϙ ;#7cN*Y7ݐg-☍{> LS6PXa-U}9DHh4lE\DƜ1)Tg\K ^ܤj*%>%z*7ZNx? ! Q()8fը;FDWjR/%=5V6IZ~yTBF5M2"1; (z mzOg !D5K=IZbA<ĞJ$8-G(PCrf&X!2QtAlO2 q,u+$+K}Wc4ԮZ.pWN<6x9Z"X Kb݂' ψim(ggQ׽ B,Gw彌X{Xe^*ΪvW}SN"+~u?mGfL*WnvWa{{}^mm~ڧOe+:/Kz]1 y~ O>o7G}fs=o~^ߵ{ynn6z޷hms9?2fOcG? ~_?S+z޴LS4Gaayo r[S*erco7qqzY\W+םyuw6kXرEv=BygpwqBBXС,繝;]mv~mv|7{n<7kO/;84Lptf$F4hѳ9e{3p--0 3y-mxDs99+L<:쌌~I$gJg-r9kPP3m,o 3-Ag3yg6[,r|ݖg${>?NMߠg3?6{Be@yP5M%iI`XBht;3fyEFG|IdHP(988>zWikk gAizmmzQi1N'9:m6iMd%ZSJy~]Җ=ёb"~\X].$[[N4ۖK d4nNNI4(y~] ]/9>i旷2e:cL_d1ƍMI>|xՕeYVUΝҥ 8xuuuuxxzfWZ 1ՑBddk aH=effYdF6Yx80ë5fY85AF[[ZVeY6W5dhX=J%edr9VeeeeaXVaXVVU a5QTdd==jOUUjX!F#E5J95UURZVQccF#BJEQUUTAUTѥ:~uǏMS^gun֚խUUR@U*UUERUJjTeQTUUF#lhnUjQU*5UU:tӧ^{ǨzJꞪVSFך~ך}:c6'{67?dd{DZlv;c~DZIRXF/i{GR)%I{G{K^Mi{m m6>k6mVC\k{ޯxpkk ÃqLS}#4շ:/wQ><wk} NvȘd=@1Ek{ŵ"OO& ҡeNԟG|F5ԢR.nje*{Zs!M ۭЏEŭ!5)?c M0ߞ_s\=)ԡEs ?-4?XN&o OlC/e+oY7,*aK p@Wr0kq'x#7x8DT玘SH72M1o(,$C׊LDSTfK h Se&d̊-%Λ")ߑ=~.SRN#q#՜p*"u]ޱ{C, cݜi:bhDDҝW& 6pV\G+{>x=˔ԀT`* VH 詆F|GZ5NN-;Kv+W;Όl36f3ONӧO~ϳp.rz{|:,^{_ [Yөs|;iӭmtZ)ªOqw>?OyeG'N}.ζSl,3+2/KqNO/ȽCk=Li+ߛ{I7Ӱp/廻km-+kdkxe?:^x {{{y.niRh.e 1Raα/6[/<3H | |;7Fhsf_fw:gOXwڕ3|j1r~1_i{5=Ia1XFcv;~SnfNww˾;ﮮs9ӽg3K2fI9f|_̙|f;')RWov{>779ȱ,MƝ9ӧ)fOSs<<k+(ѩӳ<k+/?g챱!gNWH-(m|2w-I<:9{;#"224;i4MLFhȄB$L|}"o=LjxZ,)%s6RYP~e|H3ĥSFu*f".gh;s󥙍0cbC=0^fs;'Ε};H5=Z;!0$#I|c'y"s\[{=Fk̎c*B\RMg-$+tSs#Fˠj2Tޖbz[ւc(4V%cWˉCe_la6:JZ$lu3.o>_9\=tA{g=9|qN:s3?s=̮Vω?Gs{_i_~p/{[[vw[v__μr[-^Ӵh}O>; ;>[.{zc/ooo{[q=?OzoO~g;b꺮{=bDP|rlzK~7f'ϞO'N:t:nWf5z<ί0꺭^?krx3߆bD?}75:~ ;Çk8|>¶ \V3Zk|"!e-mnKGrO#ȹKoUz⸮ ı~:c3}{ă&$M4gt+B4:oq}򮮮HagDooiRG'N`l … #{^˲{C:mKR̳++*쬤Hzì>-0z>z)e4Z(CDhh+?ﻉݷmx/ ;NӴ~<0o.^s9ܢQ`޵ש\]ڏ>lޗzޗN"M,X[}mV{~~͕|N&S]Ao]]u]7M[tGJGٖdx6?o[[ccV-:}i:uzv}MNϮx'=gO<t=xvt?fvgi'Rx'kߟ$11h]w]dYLXLٽ^[sct'FR67e"5kf:βO[֥J.}[[V3-mfL;sYB)RW=Lw;n:^'&::ϥ[޷_5:V\gui_#?'Ib *+Sb%NurFYj-\$O㚏to=n,UN^"A_;I:1lt]Fk5=*RuEU6Ýz_>[Ν'z}>OtvQd˗6m6~SCNO̙y}NO^V&' 5UXXY}yc47v#C>?s+EњNEJ|7#BI/VY6Uf:s lMA 5{+8o}AWAsXpx/ssaw}ʅC|_{ޛa__5'[BgsƣQ>t0>^g{{?il?j߼~ҧ3s ^W|C3N+濻sȑ_4_WkkkkxQ}uwe2M&o.]]^M&N_/>ϳ|o?i&Lu{ø_ٳ˯x$*R [o;KKsPq:ozޗ>?sQ [<~^^;G5__CG#.{|_O9tSKspW_v{=N>w'~Nv]?~7/??~ÿOeS,?{>ހ;gS>/;}>ۿS_~Oyz/Wۓ^c_z?qI=oW=K6=wK~g~tݍ)sy&u(U" r̯+9$e셥 NiKFs6\C)ezu񬆵szڇK]4Ǥ98Qo Z[DXHN3ъs|1e vT[ӢOqt=W"%4'"T(x.EHΤk.%ېXғ|%ז: %,!qk cFYPDE3ӛ阖3J1fJ~u/-ыhͩOYȲ'(0U+$E[}#E5yXBvՖ ZgӗCje!I5ҾKfFI#i/(aamiŗ;淕6 8ۼ=xPY24u7@G^ys sաu`|7c]1Ҭ%Y5V>Wl #*"C'"/ NTX:Q+?2Tz!e""y(YR*IJ!TT 0DX)YY -kQH-AgR:jY+U+ ²T @RPP3RrQEV* #9Y"@QADC 9:HJ0>2f@Yids d*JXy*Vy$2Ad b5* DE!ʒfKi S;32Ca"`d!BTf*aQad 9ȱIZ֊FÄ aEaYYSNwQ`S&H@mS$YX l*DNNBW5P*Mi $`$mP9P\ ")2r( ̬2 +YX.Bs-O~z*dUU@+b Z/~~ f)* тeW \'>93%d%HW)"h$ȳTP'k hAJɐ2TER6) ʐU$+$PȣmNkAdE99+PV*Va<|wdS*ʕ=Ұڤ*UD%UfJ =eE S*C33,*VX]jAJ*&sQaPE3XKL3f$Y+PUMlʈ8g99%Q+%^/%Q'f`٘R3ԯ+XsQaʮIoSX ~Y(fV`V01UTY 99I2~b +<«Vn%*jT|(̕3SY&P3+Y9LH)-jLaX}j^((/"$R( z@nITk(Nδ)^ȈλM`9*eS+䙀f1.Qv3X)QKDfem>aUYQI9(-5X?'|b"hgE(0(QVT%V6ԕXV~&c[*X̟*EUGyCVfVFeb>[+VEsA@R09Ѷ"[Z ]eE"$KrfV~zu%|S#lX,%@LYD{***Ũҿ,*kgd&Gk̗%;~WO2 aT+ iPH.o TX6aaQR&RVEǒ}Ng<2TR|ᗶ%GmljV )3!X+J!*rraQUS32+K b T*ZmSԧ~sC%nKznV5++ia0Ej2*,J: `g*iXPߝ~|>sEf)0δ"'bǚE:4~!eAJQcZX`H߷cEN^~{Q'~9>8Kl)pDe2 ´=X,gR(UQVҎe`+.O%MojkdܶV,O4Bu,YFhC5Y<Ua){|ݭhsSS"y!RFQQM;Z󹹩Cl<6*WWZk`:QV,kAZ GR+32yƧlWaޤ1Ϊr Jz|Rs(++-^r~u D)RU &0u!($XN~' ը|B>o۫y>Eʮj $P҂m3k0JʂDHس+̅W%ArW[̙%C0ms(TQ`,:9m2dR/ $PBʀVYZ0HbTQeFڤD_2V_Xv,Qڀ hÚ[*Ń~_2aR)ű-(#RZkk=lֈ/!z>!Uo]9=[NPbkc&nDEuՏ<ev(ycJ뵗Sk~~Zu?`Vc 栠ª б|9rRT0eNVdռ osQX.ʹ25G&*nF#/ m3OWɩA~4FTԋϏdW"* /R)PUԒrfǺ˻P<3FEUւlqRԧW9;`ÙB!>_E#?^,Ujf+8֪,<ȍazT3*kj:|LMkMW||T?7ڋ+ekh|Ty?/S1dF̟0As u?mALY^ӓM!QC'36,NA(~&g>N*Ym/fJeW5>RjUX>PtbcT sw) jm,R'SrɐTk"_n}oZɄ/RQADJRuz5a_&dKU}qBaؼkĩAS*)+pS8zVFu^??5oyȊ?,+ ZX]BQs*m˗)U;$޴DH{(/,<.,QͺPZ|}>+oY;Z1axmyGL> j}RhZ s%(bf|/䜝gR,Z-mcDY#S:D@JíC!mD=ӑ`ϝتKhMTX wDR)fϬ>'"s*+~C wb3<_!{2YZ&Tb,m 0U/Ƴ2~SOX>-9+iCeXQUD' X~Rυ30MkژfmRUy%Jme]ddjdR0+YY85+Щ2s!ɻ?frO34d j_!JTO9[,sgli>|n1^挴S,3zyMJj-y*(,˃ݰ{֥aVy |ʫO|"G6ϯ},s{xao=֊KLfFFT/̬BZۺ*""+&N5] QE~}ijl/k֡^!V ~@HأpELB3] 0^nxe-&t s6uٮk iFhpY{UOul'a_ئʯ q~!''||(mb1i(oͳO}{L:KsUֶߖ%Ui*ilQ-9j&DQuˬ밧>5ZkȹlFS ڌ}E(("'g׭|]}X0_edPsM\Jɾt0/Ƣ şx)io14{&PTF*>(W[[&B[Ok_6@BgcCF7Q5+k~&_c|NZfenIl͌xY!oLRVs*jX)>%i;}tO& \iN27~xaY4=rkocnwm෎^C3ZH$ `0鋂K#bL YSk/oxE5z\V4Zibf؆B C&UWK?50ߢ̴b>~ߞ׾ӟGYV cbaP*6BY2-H*?h5֋ * |s Ezˬ$NrMۿ8|ڊQij%V 6okenV"rIu Ԭ598LԆVe mY+ YeHS̕?,ɵ3=j"Cߔϙ3?nJR֋>!zlQbkpҤJu(E3)<D>JWS5,Qj,ZI7YG#ms39>_>H>u䠱eACںT75-+330Meqjʟzنʨ}~Rε_^ SQ*2|OjZ檭|>x9;Sfطh"T5dyTIޡO yJn=h,>Sh"&E-Em3A 8LCl5d>_6?/*/Z1hQK[%aUbZ~J'~iF-PAVO&J}*NKhKU6ՐYńPu}Ղ?S pȱ[wK9{X|N0s_RXª(/$Ôa ɕʧp~xN}{Ȯhh1^ @b݌D ($O~>gÚVG[m*6͵Kj6ر<~cm_QblOX7{?j*Zr}̇c;Zب,8.{xf5Z2g{ou~ȦK*5/3ZW1y+nuStܞ[#{_.n 7inbjV,>RK:ع%QJڅA_ՙ=Um2i벱H +@pԮdN{9Ԭ2F6 [Gy֘k#XnU1equm\%T952OX G5Κrp{j*e)Wm~uYS/|2c3!R< 3*)v +WP~eNF$Vz*s}`ےzcھo4Rְ+޻/4SYU6k֋3kǻS(C?-,9 -9*|+??T'" *a!F/^*NXfrf y!J#(_zGQk_ e`߆.?F,Kع ,L }_S.MS㲅*']SV.ju}ob0i<nԻ]&;a1T_r_9LNh|u#qBDk=gX}{+5lG[F WNJ9=ƴ2Tm8K|?#񚽁J&JZ%g~}y?/S\_MOm|9;<츯_l~i %~n=J3)+:ݼ (?OfXr颂1B߆$URR7wq6Jε@Ɇ#u0L,=8"on{y-C'};f&p=Y+X]aXXTX()RsQRrJ3R"ghTC ((([r(" YXrVds/Ʀj6TV6c2"5pR!+Tnn3D  y=y2(?(~sݾ7I>wPw(#sU8UZTDߖT,*9hVoxS=kxtQ "3uQ=yO>mO8\:׶~(#Ծo-)iPֵYhr-Xԩ}zrwO=l_RrR2lZό̣I/j}y aQ3C"ȋ4h/џim\~foru[0Í'3m/ewwN %sGmZڭơt)mÕߌ'_qw];nxE δփ͓@Ocqg]k!gu:?6?8<#"TdQuϋݫK`TLϮoZeҌ~&n\ǜGc.4>?XŖՋ.zj XٲC1GPkZbWj(= yy'mD9Ei냭VZt .<FcmTm_6 )\~ɝnEEQ(rVt-G_ ~ |IE3iYޢ'ڛ{1NՂڊ~6}!zə~[R1D3G=(]&ѮMj*=mePNө8~%M|k_Sl+>oW:ɚ{`GRLxrz]Vcʝ(e}nsTLc*mZyA{JZ #X쪯])%v˛5D~>z_1~o {n}j"率8/q-YVpZ-+o~cݿAu%J~Y4dFr).:LLuXD2J@N݅'5md' օ5ufEUM`V+)bFDtF2]2乥m+v'/XaEj[Tևo/v;|sy' 9S@]4҇X62E]i|:j C `$̢l@ڑ[k 3[ԥ9TTS:V|gE~q۶o3-jƋcEcEy:bRڗ[ZL;ȧ}O>O}٬jD6w`nڢ=oIiM1^pq'g~;gwlg汣&qHIJ"ݮ[g۝kzӑ}L86N-~9o]U7̨s}eZjJg}Oy=i ! 6c%ͯ=ڢ?[`z9Vv> 6uCRfQc"7HBM)I@e!VnpUfDe'j OEBWjtSjgXzA \gC_6\a>?zN'-P}HޱyVRݰ vKζEFe$ ַ{{ftMbJ0Ԕ-a<-~Qc6o^d:\ZKy8L:H_N$S[_aTLId~3a{'/m4+P%JRYnIښs֬kR;=J32 ]|4>UaZ:ML6Wd#}[!OPD>rs-l~=׺-^wZXiG>j2 0"^55*gW> eAA|NJDb5F_t||ωG԰}AW4C]E(h~?S~`2̡Pr Uuif9@j80]oH6 cv$´ M5>l9VG S{^|;NJ1B>ZQ"Bd*aŜT;l_gQ3"5,暟3|EɑuV{rCCh~P [&z2>fy.rDJjamSJP֪Tb<Q9ϽsߘXqҴ<i_SfFe1!|\h7pof]L^jıD-j6\ֵF rd܈Ҟ0mVVbuTX32m hU\[ D>qVT]lY޳kͭ!RkԮe{X)sM\ج֜b bfl$ j\/߮[O3~Z!R(`fXhѣ*J F 1 5iݙ锅ot YD^5+ڇ+o#_6 DFke~uQ̢k?kMhU~]+<0DY)Ԭ9 wc}ӟz0~(Ԫ^VAV9Ԫ0sA:EQmb!/_qGJvQ RHú3dJ#U`%>4D[b>E>qTYj(k_R=xu-Us+ma.7TP~~}}Elܰ5S,,QaLjf6dmT[p#uf7BA92?lmwsY;H'ͮ/zLEʹ m熯5pN3pH#jx+Z^<y*k:=E3eg'YDVEAg¨d}rGy_(b3l?)7W$ɌyjUTRqdSE9k*y+ S UW6/^]Enè(^F^F;̬ySB|UTz1PCʹ7IM2[|։][ڕeDEhj126cc<':C4#}`'v-(b+zmxV&䙢/daSZHOz#m϶c&0~tbZLz_~YrYDbR_7 YC!m,kC| EK*˵_c-zApblV2a }||޼J6_Δ+dWATfm/fF5zz.z;]52]Jg{TVױ|/u6Rgx\c9>@z59ZhŌCpfBj"")H?߉|Ŀ8.k\`3gW9̕W%w/V58Lfǩɽ;N8y'%F IRV r{1o|n';%Q + Ev\m=!=3ZuڝX4ŮJk)rgmgOvJ)mPO=qj|O2M7jk 畊NTb?5~Jtdi}:͊d~*dQcB9ǵ_S0ɓks f~_֬>{iɒy97c]Jµ2U+]KjDmyuٵռϝ|DCh4X|Y^F2>TDG̙ |h6rn~ 1jsLb XLk*P,kL4*)2WP*s=s`h 9'# $hrN<<&yQVW  kQ E+R۔=ڙgBl|!pλ@1iξwsksjV4+5ZԻO6LƘo^Jp356-fyJ#͋ww™Yu6Lc}A|tr~6Ezy??8v5(P`Zۣ9[Q5^ih یƎi9|ɁRH<(-I!"{r I_;Ub9랽)Q,_}Lv8@0mQDkjiLfwLx8۫mSޥe~u^,t-)y.meۨ [_1jyklS{?{>c{Nq|$,<㍧mkFט|cyA/N4~wõ34UDQ)X]_w?I7 ELJ[5vp` owmX4}hګZMo7qS˶zgDŽ}͔S_fS:$pcs٠9IǙO[wON}sjBtLgHp,[Q y9. x=>*_|oo`NT"hX%Jew1 RJISyŵW,+c}U$'8by+{_ZmOyYoqQy5袕oP9^+u3_Qv+fJ1)4Rau3|5j#%?3 ;h?.ϭW%'8TLC;(g xLTʰKE$99^ P*MsדkQ+n}h?-;i-Mh͂J?ZKyaDTVBJį9)lN|패=TԿ/u_.LGo˗YuY|Z3ZKYϏY5\/p^eqņ >~^T>+߯BwoHk}\߶?/>Ňp*vMN`QMKj|O?_y槞y ]AQ5-n*u5WJύr5?PZlDZY樟QbU EXXrgfDD,lo!povVR[iZ[ܬQx/Zbr<3.&LA ?9|L#^?T;Zn8=2ǍO/sS~s~vsDoAO!~9Ϗy+DG~U`mg2i3*u/ 53P{T[㯁3cO|@Rʜ(o݈nnмz[J7nna\|ۍc1 %mƙjb|>xh}_ϓəC6ܛ:++7z߉rrpDa?_'~{ _ǟOkJ,|+YXTv3(r.2/-9<׫1)Ԡ*ߞ$g3AKD}j`>;yqWTaD2 ]Q3_jLb04(!G9R'Cx׷>9>'QAHb{o#pIAfVf^_Yu%XgSu{f&Iu~'{}c~1(ZkИ޼랢gώ8G v^1ȈXT6߮Jߛl_֦.8O?0LnF u `6̈\i݄_k<^ljoU~RzYU֖_c]Z'?/`J?կ p.=[2֣8涴D>n>>Egv ͑pG^CǾU?̔T̵yO:=pSq)*nTnn[G ٙɾP̙tI ;n¶FDE9*BҐũOl'Ϟ~>)J j^J-99TU*D|7U<ʜf>kZ"*(1?$͋I_%hz팬=~wԹ\i o4$6iJAETSd~z{βcc\1+nFve4D_UbY~=UQyCnNt71'Z8E*l7[2z~R`[jOZ>#0h"u9{~R|eRPO9֥س%Vֆ#I臭Û?>n{yISjwSxg*/Պ(2[|˟s߈V\QT~Լ:P G ^6[A')`cC o^ڬrH-kӳx10_n Zwgb9_.rSu/^JZUh:M6>Tbsn-硇>~_/?IEz9Ǜ^svO;_ _ua|MD&3$ kkǙӏ10zAD?"uɷ}K/.l|c>Ҟ?hyޥg xؗ,#5LDNd*w{ʕ7ݗ%&b  *)M 9eZ:euF+C'1E[GhB uja{3cs7qT+ ~ԷOwE-| ߮*F`'dT赺+dqQךW]]lKVm 6/Vy$zc@NQNTyTT̠W|ɭ?=?Lsf.ryw(Q2]غ قL&ڠ]Ƅ"^m! jԔYJVr+-b\;*Nm 5ݺ*@=-L!1Ny}Ok ֥j7Gi3[Wξ 8lÎʡr!>b)izz{eު}Mߎܑ{"Bļ7dxGcob{ A3ϟ*"2(W_>`oS)Nj^}O/%~0PC(ψ|x*޵euAE紱͟_|f}{>-6{3i?:~nyێ<1@6FN㆖ﮆOgRW:ƚܪ%nluray"l8&A+F9ݵҏq}~ǍSUE[ND<WˆO\)Z *HtM&d=>>|_'ns`˔Ad`d"S3~)˪&gn[^yϽL??)ȱ+mSpy{xg56ϑu^E> |_-Ov|Tbb TT-.Z gU/M;9=o-ƭ-Ҩʿ-T^r|SWօ~gS4DL ԡZ/5Uk`F6bj=YcbZ s+d= ޶&"o:ׁdkXSb]܏_֨(9O/5ǽ6eN:|yT6Q@faYZ|Uu'|LxC᫯y6كVlˬN`9Ԩ?Vm Jgk7r5QA#]mYK;qA^6-yuYޕ|9?/_\fVy V?o%wM$maߪa=bڦ펨ꊗ֠#odbM'QQ% QpqnZyemYcƢdZZѬ;q|<eRq`zGY?)_K]j!Cfdּ56!]J|hZѷ:'QG;?SRaLmFAMWqi|E/o|#ӜozfʯZfȖ|^Ubma!+tk[OX.T4ͭV jF⊁ukVfRL;Rr/[a[ۻ$]("kyp ^N8":ٜs~o_ΨJcoȠKC9<׺:Nzϴ h?.KO,4Ƶ:BJ|m3qҝN.OM_l~֗yO>2p?uS>xglߖU|=<PъA{Ė$Nufbf(+!4,n]h9zⵇLd$>?VZ'1n`bYnR"liӾNN{ʦH+8xY&cU8"8@O%o7s;/6D M mQ>'Tc'ZpK|>ryyy?nGvעmsλ?B&Vadl qߦ?r_sM K()TSE$m%⎸A4ܫړj:Ƽ~ENXұ $2oxy"=~#]4^+JrNњD,Z E5% ^XǜYf LT12m.Dr1ix^)xN9w#[Xqv ؎vm'?{Z- nF5Mso:5}~O"íD"UJRxwa`ɺ:TevW=օ_xᤍ_0$ utM ۴L ,I$ NOqao^D3H#]ۼ/l6웑A&QE;gEW,YDz9h\M"蛊ZHaZ;M"z]IdFCN1&HZ( lPk- ־Gӄ.q2]ߔEz3jw2Eȷ(B/ Z%Kd)l;[L7P/ء.VΣk!xMtEYV=%))o>Yϫ%F C?Ze2#ʇ2;z%i]qy]J mBzq2i X*OKTThϽ|p&W| q~}."6R e҅[FElK+a0 .5DZT4&z9|$.uN苫Df¥X=>\\lXۻJo EVƧs$R2v-`^ҹM9Gag{3SP){0Q9b\"zRxiJIp(;ly(^cz.}x5#  ۆoK`E:=&YJ/2hSijșBǸY*adN 2[^e?YYifG!Ud8eBROK m:) ,MQ`k ;eĪV{Bȩ>1fQ8\.Tyzl[m3m26sk:s;;7֏ZR5ȄU3nF)zhe0D1BɽKd݅\mKPO6zQVubB&<&ґd#w^/ȯh 7&pxW2tJvbbHS'!E PI.H[Iϔ}46}uX6=YRS6oW Gb6_Od%u4H\*:<f{%b7qTicWA&ILƛBi/&2;9)&L1͕-tRN1!S w7yr>M HEgtciAU!]M#vTɧA2UmxSW Y$D-V#Ʒ {ȐpP uu3,KR.&a<_ǎ}5+Gw55JCx"@]+Lu=B&mjq7y! [)ɕtvI͖$u9]s`žB;BgtrisA|J?vq{箳Uwfp|wD))-)eIߟolNt̙ߏ6I/~MޯVADЛ`7^ ^5vasr2 &q奖D:E@!Ų?#i&+1KLɢ*WIcPSb, n n7EkC7Qlʩ[rm/ć('lIalyJ{]=^ bo.4.N=XĂ6cAxnPu^7y)ԐiBkLa$F*&_&DdmJϘl!$T:0x~^gk%F_^C݌A\CYYZEN!&U\N#4V#Wvi(XEЬqz02i2?%-_|}{׵eeז3*i$g>9s@WqgZWXiVrVfqB8b8+CWԊPG10F!.q!:f'H%iSsԊKJ!4bGTϼ޲n֘ɼ+yGT)\>Z4RjfBz7ܴq3)Cd#.R\hfMk/y.Qˏ1&V!YNw}&Yz}Ǐwяyğos7$mf4,egVղWT?@>܇*YGL)vsί[IQ RwT0>/}0#إ}Xەƫqڧ4_23qr*#4[@Yy硞a^ݵ ̫ Ow µ)r yy ;<˞^M1jq^T '8]s6$CG\G^X+Ff(ħ|վހeѢSnx)$&6mY,u&3UgKFq_TRa4M٨ue A%0EҦzy |~U!6TTI ތMvFPjFzGj5Lb4E- G4V+05ͽ\U\w5`Ӻ4r="5 !6S*A`rC'4r\0PAIz;x|?_^GKɷ.R`avJfH>Ȱ6S4V "DBA^6VhlyƧ˞V"JE9-d iȨ,TeiV`fvldPn2cT[ +*[IT)3R"QPS%qנQFT] C-!JZV; B x;! Ow=^P7"j$UFx$x8'{-ZVޑpLql$*Md==*~y-Ӓ9^UNDlVL3*M!a=Qace/b9 ^_x{rg< yS2%Ẻ=wl%N65ൈ(u28G%EJ.P$BemoX.ɏ;O؇B<*ʏ;j1#J‘!ǒaV9Jדj<}>S+ξfz83Zץsp.,dCsz#PI=R&TB*TPz#Fd 5YЅiWo}^Hm>䖴n6ERQc8&O7J%c#xYA=Q=8ۙZ_do, ͬeO?s,;<8d֜pBZ6b@uH5wxgBx;M^S؛X/)iAD0|)OS[+2,nzۍǃvJ<\nuTꖞx˟l"Q̣{3RjjC1738,l q>懰bT4SEW33y|Y{%Jū;q%VO)7ϥBMQoab+<2-Dw`Å`W1L0rF_y9yI}e*l;̷JZw$jtm{+RL}glc:KT*TD/ R$8/W-TRmƌst_d?M-ضIB#96zWۃ6~Cʽ҇- ~U3\x0qmǴqOg.=n.nǹWqՈiH@/έf\N'إ`(JZ\Gci >J>^FY`&2+qnu79s\$s3y)VA2=ě5xPĂ/v> jGRJ U9)Қ$O-KC<\21enzP=\( t^L14opG4JOkx64y|+A6"pV9! U^rݳ ɪSx@n|Z >&*M+6@%XZ,U,> R9E,&/=o_Fzx[އ^y3 k|!Jf13\=҂j<-w뭌7~[3 QI v8_x:Q3OM!+DsvR8BiDsW)c]-!/Lz }-`dˑ]p^DyP>pL]B=is8ɡh/OO! }yvgYyq.K R7l޿ocwCƋkT+hʪTݞ޲ĥ͖j=PSm ;ܨ->zuz<} f\3dayܜB}'mׁ}E{ZLƩ83-H{ _1 {M,)팒ٍUml,yK˧z^=*":*dž"(*vZ(+\wg엓2z7>c挓km7ۻ5pR3c 14c=!#陫xǜSBlkˍL͓{w8#-ɏZisQB2q#w)j᜞h\k8zU=?FLKwIŕyМJVbcZ;9lI=-BEs>ns1E96'q,BSQaKOEy"ّfW)O6)sE:=ڜ42-"H"Ə>ӏ>=- b7U]o #7{(ީ5SXDg%yo5E|DΙFu- "NpvfDfJޣR#qH))“zbx(!z_xz^(Sftm`G"t2XN1 0Ӆ)R&G{NT|GwKxO4/!49/}|?%| oP ΌU\Ȑ}:#ieаo u)Ahޑ!U/^R`I2:f%O2ڲޮF3'˰F7EE^+L%Pctt¤],O!C n W f պ'LY%8}2?1ԋIW趏[•zҶU7g-9]z9=NCA<W*b7k>JśzqK\ՖEq >stjTd5;\8ʴ꜕w &~>1X"D!!bw {JRl%ނb[It'քv JNjU6-!b̝* k#'gmdfR=$ y[_H܎, UТ ’ޡPfZsLw/;xjs5s[Xrv{5¼Ov08.WK}(Q,$UVvR5VLŃ:`N(<є𙹯%u# Tҍ# KQuYl*gQ}5lo"_?G̎6Y yw9XHn4X?9 eY?bePvU##X7(YJ yVZLMv0J Z L@+g)i AXc6RGgZ0TX2H(W:vE-;xnU]^'ǝaMߔbWywpXVMICR5,riMS5mii%Mcl;VߪLTG0%%#TeMk [iEmUKW0P\3OȰ%H"Wa94}|8xY szI*JjO93Oq|>i:u7K]] iLʟE;2b{K"^1]yFՊldY\$l<\ZEd0VTxNŇ=οgZD/<%8-ٻFJ7gdFy^xeX/1Μ~]J V Wcj_0Ru#& -W7F-[jLB\Ȏ)")>tSB -Vȕ,3j4PVgĝX8ޅܧD'HH^"|,wdk/*CStSGs^݆/DжuPM;ЕsRm@wz"~v*-" )ƹTV?wcѼAPW' 5G~$*:~^Z8pO"o(cޭw!HGfǣj4RM!s **q\Q~U(Ee1Eub˜_)/Uu&gG{u:8Y-X,u}>\sB餻KϊXXu8I´'jShR.IrEAx:$Zτ;Hکat^lRQ4a]!Dm ,JemYuÞf.#f!zsv8pN4DzSnR*^xH!~Go0' Hl7  2rb[NDEͰFƑAc.kn>!Nzjιd֫S|cC'!/qV0ZJL97i%=Վ6} rhWJVGkDY; AafrP" y "%:<:h^QLtRǏ5ҼW&J96.]3]"1\~sYaBIf`ZF nۗƶcKMdE%CDϹ<2t)C)!d$d^_VT3&PCpfB6'RmP8:bzs^IU>~2&dTN ?Kا?gF?#vt_K4ܤqX$c5/=ώ2m·MԖoK,F 8bhXQc}?ei$N-#Kҹ53jҊ Z bͱNI/a[=8#GfL-xJZӷm;i+G'z p.kv; (ѻ11s 35ynR~(IsWLMȤ }rng9u]GzdeCS?#KLz'̄/$H`,ڭ0'N فi)xӵkv `{wd]m WmDcM^ U p\n[[pj(#Yu 6:4>95L"owiŅ;HAVh³;egM [$nD(TIk:kNn1uBqߩ}}/OM=_J%.iWq'9/8*Э/k_jm6tae嶙ndLtDdpn^ؒFHSEc,{'$>j?^aXlmL/>ժxBZ ônXRvQ~* ~ T;%,p6!vi/~אrm: : ]zϻZrkr_&fOԵ(ДN4,4/m.( Q~!| ɾs\Rdܾ3[/XQq}rg5QP1)Vz!6K[GqљūJD'^Ze(^'!$< a&))k%\45,r1EܵB$\Z x~8vIO4z.l P6YV҆EÂX?cL8/ F h=B8 BV ~o,W].It8_ë?R? |@6|E\~R\S>sWK侺 t))2%p(}>և+J? +pAC~jCm5wѫ22)}//z?:_/+JPX}_qW*^LJ}5CJU|2ﱫzWjj?B*ﴫa 7-KBrKۉ{^8" ؃K  *T+t/noGWO}>}"_;*U>??WҫO<xBK!%R\%%IMIt4ЩrP(\+% UrB\ĎbG P @4ILF_ L/ӇӇӫ}5u};uRt}ԾX??HW%?rQw(euZsX>Uu}?'+eiijjiieejZZXjjii}eehh`eeg}M/ULYZVer`ŋSSUŋSS++UɓKK,X`ɓ,_̖}bŋ++ -,KUVVVVVV YZZZV,ZZXbť,ZZXbŋVV2būVVVLYX0bŋLVLZZZZZYYXhѪeeiijjjYYZiijZVUhѩJnTQ8L.*'w\u ȥgwp⊾ks*]qR tu?]I!pɥ&/bɓ++++FMLX54KK++&LMLXdŋSS&LXdɓUŋKK++UU&,Y2bœ&LZ_ZZZ2eejjbŋLZX`VV,ZZZZXa&UVViibŋ,Z2iiii`&LZZV,ZZZ4bţF,ZZZZZiijZՓ&,ZZZ2eeee~Z)..TNRw*ԈIPsJ]BwTt Q9p$NN(7N[R鎔u 8quP:DSYSr8qAܔ9oQN=ўǺ1ǣ^8k /p׺ML]2M38su{{/p1L{=]3u^q8rrwtg2,=tgvK1iiVgZӺiNtZOq0Y>9{=ƞV|ǺѣF>n{^/q&|ܰ,4p1b˖SSO{{=^re5jϗYbˬ{0ϗ{&M_.Ztŋ&M|ܚ&.Zbů^ŋ&M-,3z3w2crŋ|{y<{ MM>N^^{{Zd駺jje| {^βZtם4{7TNJqK.5jѣFɗ5jɓ,jŋF1bŋSSVZb Z,F554h 550 4VZh;M5jѣF5jɓ'rdL0ŋKvYhц2dɩ&hѓ&Zi2ijjjգFaYjjjjbŋdɣFeZ4bţFZjգFLjjhыL2a2dɕVhѫVa2aZjjfܪ9;w]ZF4h MM--ZhѣSS-2d 0ѣV4hɓիѣVMMZV0ŋSSM4h ]V2dիF2d ֎ѣF,X}NaSSSS&L0 550 4dɓ&L2d ѣSS,0ѣ,c&M2d 0ɓ,0 0 4hѣ 4 0VXjի&MZ55j,0SS 2dѣSSF0ɓ,bѣ,΢$IQQ%:rb╝* :Us59*7:qRq#w'Uѣ,KK 4SSFZhѣVMM551ML0 Zdѣ&MMM2VZhѣ 4&M4LcSS 5j-Zh/dLaF,XeZZXjիVVVY2jjjՓ&4ehѩFZ4dɓ&L4hѩ4a4edɩ2eejjhѫVYdɦ2eYe&YdɆ4aeL4jիV1*gBʇquQ3w:-rGrۑwq])ƞEΪQA49]®uGrwBs,x˱.N;H(㳪WLLe&Z4a4kkܴhѣѣ,j 550VMMZdիV5jǹZ4dɫVaXaV{rZbŦ;V0hYk^i4hѣ,,jѣV>=YeL2dɏja2hѣFYa}S,j-4ϩ馚֭Y2hѦaVc4cey̲իF4ɓ,ZM|hя1eL>XXaƟ?=LdɦaabST] V\0, 4hѣVZիFc 4F0 MMMO߲,VZ0цMeV-5jՖ}VYcM2VYjՆ4 V} 4чkYe2F,MYaF5cXaVic,zc 0VY4i妬nYehVZajզ1ϰVߖ{_=egś{Z3Z3cZmTңR(i/gLko`·0_sza>>bt<[/򰹮W{|W+c;~y$  9H$?gu"IOŌʼnbKOo.k+cX8{[6o"(-KYEԮr.Εr຺$s:ss]й:)JG꾲>}c'f53狿NpgGC#kPJ 4,Cu F2%6;߸#h*Ef9+ Eµ'4B=j-fbsV}K~b+Zѭ|֯4]) &!%࡜30 }r׏7S/ 2"6_<5%k-NN:M?9sZZ.֮}*cy}tƘl9BrV&m 5J۷cjS5*sf~ɉc3>6`ƛMާRn-Fa~!Քm=׳*V|9^AAci6: xj_ywE΋VuDTW]]hr)Pu2_՝0VKo9~j>?|t_^(a1Kk2ІO__)ZqOO̞2?awS< r3JgϺ{:/g\L=02|kaxOY?U_͛$՜jJ'dWޣh~=vLEq9SS2)Z7?#] G<{}(T}/R_qRUg@_u(޸xRS}UDXl%,KLW!>'9̕U!Ta H|dU~iRoV[%_ZAV1Ҙ̤σ* f11cmCFǜnau :AVԩu&T̨zF"[ +> (Xn,zڋcfE?Y\ZeC"·֤QHT9E b#&>\8cC:k/P 7Xn)EEZ5+ yK⳴RWvwCeeI<h,'&j6r[&>t8nAAfM hs By2gYE˒ҋ [mWZ/5K>uPc?؊'~/ˆofF&J+b$9ϭǸ~[sX|rW~2˟޳ݵ|ETy|/"9D︞Ls=hszYz fZFڕ%Vʋ!J >H?fa^RL؅OW8JSb|I+*/3 IwPkIuU<C l &O֗7s[@$5 dl,SQy~vMh *V-[OZ|bɘڟoEbQ}NL&TER'Qm`Y5eշn,!5 A6)ؤX ɐfr,QYQԢ,"ńXsRuf̨UDb-LڙJE*T*,fJʕR\f,X-ej]BX3)mbTTJm*#3 Q* ,`VJ d3X,H"g$BA("GRW2VڢJ WRnEؠ,ńNa6d9TZ)H` M`%d+ Z "h,,E@'94bjLÎrTY.S%E71Gh@(ģ R6ϯ2r=g<غ.غ0KTQ*X6ʑk-Z ]5F 5F REIb'99._*a޾T<ʂ lV(lV.ABօPmQdUQd[0ɍILQV*D栢JXf-a1s m@-RV-Tu D"֐U ڈB*V?, >&C<Ór2sTP2TQ@YJԲVNs aV2ڑpBm(ŕEYQg^&E'^&EeAejVTV\\@-SXT+¡UZ ,A2eILX}a><+eIYAJ v(&l<%NyRd Iu"2&ȈefsLVg:`-jkU..`C~~w (p^ϖ&S9X]LAJƕ+V,PY-Ad*ER +~(fdn0[VeBڶ*DER#3s3YXg37A5n'^MPjX DORRQ5.E G` 9 3 ^aB<a"mumVBV`d\A[VUs UC1֤6` JRd bfҿTrHR(,#͒59 2 2|H֗ԩE*u("N]I?@?I"Ű"|4{ߒ$Oa"DLQArҋO?XCy92/{B7v>rZPj~5ʇUB?= QL1U `R:i+6%U_g3_w/~xъ4[^53NIc Z66u.%O2''H~]Kcxeo)OG7mhZW]=OO*1j>ZV?2r)g_}t^|+|ϋ{/u38\1A6S/?*RTvk&d*Ük!ჭ~&Y=s@PfjGiDŚ/;_?{޿1}3Ŀt(A}[q+*mɘd03 Em.(T35_u~!  >ʹ^eYw%dJf/FxfmY-+VPud-{["B[3 H2 Hk`$$.a I92DaI322I &ZTXEKJ! @R;*%yzל3$(̒FEQmkGE4 t*fRNW #Cey!u̙XBau3rU[LRkXT/b1E:ұLƛJ2QP+@`eHkeAJ2Qm(% EЩBDed(vْ ioFy9io3>Ig$,M)uZլ-3CS9HV79TUcQC(%"۬K,QbmU&))r+ d3bZ&3Q`V3 j +,PPR ( (JηyQH )[`dXfԕeԕVB\إkkbX&j ֱT.`uC|N"łr,X-V[Ta[Tt@@eo)H`M|3*Z!Mېшb'$)6+U*DTU G6@ "5 k23 AEF,PZыQZ(.>HHkmBUd2Ry 2J}kLHbE C^`rאf+fE52.@urO[Q9qfC$qfC gz rfK.Դəeږ3u4GZKd3PR"|MSYmPP.ŸHW"-`sɺ2a#֋+YQkzgEΥf X+V) "!DZ$+&B\2(TB+v2L6d iT-ȥQJ0P-aRuS+u$*ISC(UP*!E&B"?+FVL*TV֤DLԎs 0Ü5jMʅMl)S[24KYXV*V6.JԬ,YrTeUȪr30#p8bL!LIE ¦[L+ h,R[TOy/g"3P+%Ƀ3 & S0kM>O5Y33[ fdo;H X d2iև/-2dU**E9%)YC?|?Y?#&mSEBrZӭ8 )_mvyUlPSoRnrʜuS͟E/<uP(d4L$Mֹ O[OZ SG1gmiON:CȍNV)zrU[մ+׵eC+k /GޙJ1/6мlF5>[6>/Rn~^ySEgT9K@j36Q`ڕ?Um䬢e:YScCRq 4bnQgp",U?'r}a &?Y?,"3ZiB}r.@cp+gu0E~}-B8}Z lж쟟ȿ<.)9#,-w>3 .1=J+3lu}LRڈ%L~ߌQHG͋'!QwCS#v;]w_;bУ ̅/5@FtjLc<A8emDAd3Dk# V0v_c~~O)_}~Q:eO4LBE;Qvg?S>E J)YPNdR E'L!R,bŊhֱSP23oTͿ5?9+v~S!m}| Lԏ~}ZmB~2n*9aDW C~j2iPX,zr@CUO4~r=9<`}tQY{i>\%Bj)YXkN5mpQja3'+ZCj}&Fߎ|om,Y݈UC2/#RgE|SȵOW0v`ɞg }`ad9 Z:B[%2t/ĮD gPTg熰W5XV'N}=QfL [0 .Xy %bᖔ%IdgNNC{MAxj"((rpIc|'J~76 %k(p€u>_7GNRO{_/wrCtꋺ|q wRJ$P ROi0^B@BBI˩X$Uw|:E]Ԫwy:H2C̄a;BIa; ̬Sag0Ȋ PRVNk,b((XbF EJ0DQR3199US0KQ  -A`A`MiRW*kJ7{do{fOjCrWl v(Ցr\ՑrJ0mi y &QP3gTm@ZJ/&ed^{^e[HTm*fDB(jJ2dR3B&&d5,JԔaR%,*TYDUXJUHTR/V,F(+#_iu+zwiu+z,,O~SNrVsZ'+9a畂!sع3fl\8LC4L"͒ˬ6K*HRc |J}mgp[WC`Q ̑efda݃9-AXȥ5Ȳ{X*T2V^+MbVTT|dra 栺W5֑T}BUF+<"gDDZAEr.-92[ ]^3"0"UXPV+o>Y^C|kyDIj"Oa%g9; Y<5Rg9ZԘHmIu!z ԬDUQC 6fE֠s9ns::Q lȥ,޹uS+5BefE)"HesR)v*+Z6J֍Ar &Mj%V0UF JϚ|_3ڇQT/w`*l}CŜǬQA`m>bUdz'fErm2,+dR6PQme,+-JYsMm#koQ̭s+\evPSSj s Э [h,`\ec(Z-Bf-#Vbf\Tk* VlT&n2kW'13E^Nq,瓭> yX* b~Ys5%kSlz_h{MĦs2s V,7z T* T+'%fDYY~sY̽yʇ0+YP ԩ""ER(EXy>=O>|kEX,WS30S`9HYF=`f5 ƪ )jł /$|oi3[LŤ#j+m9N2l er|yOh~'>^m;sչsO>5 )Xd*Wzfۚ5QKO Z%^uRaf5X7}wwZb ٥փ Doی9kiQw}g 1[V}[,>;Ozv+9+h7;{V*we}WTPU>>גfT=g{|n67J|U̙?gz>$Ec#+giGɓ"*ld֫9a ]|_$6V9+z]N^5~Sj+[en Ŏm69O<ϙ|VX?I!o^{8d2a'A}/%>בgm0c=/ŶM343~uh_P򧎱NBi\/+,B؟0>bLGrE͐Jƻ#PN @Wlj@\_]cSixQ]n>mX#D<6B{cL:ڔOh+w˩?5DXOyV|v~ާco]W[sS%U7a1{_4&7jhc Y,FO>~W߷_ͳ=][iѯUEWB*FHpnOwjk-w~SyƳyfƺ/u3)#q ~vhcD`2~>U;>}b=J"ʿRZA?׀@ gԱBZEޡ*~j Cc[k;!$ϖ~:g *s+'904Esx9#ĘcO!<ʞL"֕ʙ|ojrfYPF5PQ 'ĺ̐LPs?=TS֞yQ?6IP-"f.̓VX*J?E0/Yuȥ©YR?n=J)[TWJ *rQ 2dQfF?^LBob{N|[QXdJMԩڢ'pWȠ "@Z19LjV[`mmj LbKS 5l~S<0U}m6z<ֱCDO%{(PϷf0ӵ0f:2xB,ED۱j |V{hJ&/<} 1fMor#V6j|O;'>JubP_RΙE|V_|3mę.61eiZ#x>c<5-THf]vK/YY0"u}۟>Ppe%H[@QV""zf vއ ?(XryC%COb_5 m-6h@ /5EE4V [`meLk6Gv.oZ9b3SZ5:֬ ZmV39fKK ZRJ1kPZԪO>uS޺y;;Ts+# R:f@}jJ&O"m6ڙ*Lj9uTH.lE-VXטE [,J(R*ɉE&&ł7Xm`s hVS-U*WCC5 kɺohdjTmmɺy'&5i6ҶTJTdȘB,XeزrCڑ`[H[zEۭS aɄֶ5MkiS[m?uSݽ'Mhssg}m8VQ (j 2+{\v_N}⮥y9 ȈcXC־dR!^2Sw\%]律}zy=Q]i|l>`DS6r l*6ӓ;uNLkDQ)ӫ4דN4zd2Za8G m1 i[i>_*}>.^v(jdʢ*eQJSRy;Cϓd=6ܛZT*UB18C#hcB`!^Hh vf01ٖZ\>QS6zk*VZʕ* k5eJEʕ!Rް99 aX.±Q~ "B{~w#NF?h )*JNf{Xe{YY+PڋȢ<^E;G\ b&z Qu5]n2=JTY)^׊Qn׊V g ~i<>g>iC BvX?Q3/!?aȣׯ~PTχ.7[>+]spS[L|lm&o[Ī l9׍*arnsz_o{ڼ׶Ғ*mQ36ry~"O4i~SsWE>=NJg&ffNw+ӱUԢuc-M;F\3{91 S"{ϖy>yD3YRQ=VᢂhNdm2urH#5qPhϮ}y_Ug}~J O@a1sj4#|J|_b?-13Fm(Z'ד<,ZaX~o{]j-k3;ݪ|p|'tCy ,ch4_ݱ/ R%/;jӿCy6)}o ׺٭L%h^x=^k7PgRiS5؆R/,{4gǘC`{99|w]v25i̩mjJ] 1@V܈6+>Y+/ŬOa҇Ƥ Zq*(m yn2sɿ(SX';5 .|. r<"}?w=0~ROjy%OCP_EV<+yTFDFЭ]OpO!/Ea٥a~3 u%JKٕ`()m+UTZ߉Xn!ȿեPEhUaUk +~ٞZv-@[9|E9Q[MRun)aOS<9XuΠo"kP9|lJy5s{QIo'Ĭ5=JփY֍dXޫa=}a_+St29X~L?M~_߃3a9 Xujߝ+9>Z?oöBg*'9%g-py_|`QRrQ~PO7LᶖՁXUE>j(rdYQrEva&QLV?[5сȨXLK]s4.gmaOP+҂*|S\9UJ~RV>>c ŵ5Y,g[S EUA[Hr_Ĩ&}lT:ZfYwl-AK&fJCz`+3,kǎ9C^s㵕=—ZBbW,Ո*[E ̮>Zȧ[L+FIR}JOFfo?B|_4>k@%ZCŎXUL«mG#krh޲V.aaDPWQC1]kuya|sRm|T/PUAY%^uR[Z%pݬERܘU+`Yp60-,*{b;izu'[[.7j* mTYʪO(g3"-9)qvTʓRS<"1Ml[ij*Җ梩TMJC4ͬ*WMʈ{* |in`?,>w+;>G4O6FM+s}i?j( Ŋm*)iZfrEJvJk/z; 7ECE֯jZ-+)5Ҳſ=|σ";c dRZGbЛp/h[y !~cfνC?̂r1a .([OIrIRL6ay\c%2 #NXitQi֖ffظ3c{0=ݑ9ٴ_G4<^TVi)ZS"P/_k.oZzizPu뺅AzP]jkڙqڙufufЩQbi 4P!e)I~SeWSʯ_XFcTlժ.ZXS%bJ޴>3Ih}w| =|zFI3 2Q[mS&m/Y})_>M/*%He)Qxhnj\7\9L$6mٱRvJ{`- bҷҰ֋iXd( \2ű,Ҕ੩+ϓj*37y >My'>^_iQ1ebDBTT*B?fi|\J̕+(mخB[jnZ/Tihxs]֎716ig墚hZz lEگ.A|>} ,>}LD>rYſ6_u=Yڊ[O%Q10Ls qcDm kfjjؓkPg^߫G  }rt2fk . D3hvJms5u`S}jTÒZQemeLb+<^=<*i6TsESޥM3ZL9Ȫzkt]3+Zi E {yYQ\*Bu([LErTP6 i#ru?-;TD҈'Q3r;wS~jQHfwv2.V~?[bJ?-vq}>ɝ~i3}E)[>%oh˩~}Oo|}jdP:̵MZH`Nqp/>5ϯ/BŬo`~vRb),NK0'.F-4/&."̟g衿]oɿRO< ?\֟_>< Mr+V 7q \}lZ,>ڦ'K;Z湟Z~D} vgMbgQUWzl&r2 {^[o껴dszM',yl~;T1QkL|M.j>9Tߗ3>WߎuZ"dZ*Cfˮpo.(YO4cmWGQd6R~9Ȳ?>laXI,P3dj*Vg[l+J/Ƨ1ۛULJ*wZAE_[J_bymJ^3͞܈QYfz2V0P\RlEm83Ȣ||aZJkX*yIV/0ḿO23+RNxO$^>!!Y_y*ys(fa<J`s+3X'G sɯ4-P,`jX-AMk[E^0=Wj`&fHF2@̵!JB?C?7g߽3⹃e9yS|okF/] 3Xf((,3.y2JڑEpdP{Δ1Tay DE4E8VJi?LAO0edX39u 9k%wS(srql2 [^ckR9ʶjrNא5Xur-LIfRrSW1NpTI2xH[_Xy~k2y4,H֤<{QQ֥o,8zYz•%sR"T g2~y5>u;P9i j/P1v9*V@#Q9 syArpKk r-a, T%k=~Ey`gOk g!sʜZ42 i1S(2LJZ9,~{pʒw23Jŭ;7XT< JDz؈5[ɆwT3y0e%oդԨmRV6vW9"lyҒ [^it3: 7fҋo>ݛJo/|=o2%}ާK斔/4u~>V|sksOzapEpFep1mW6dƂv),|i"]*۴zφ(uq$A\" pEmeS[fDIY ҕkJVh,wXR*Uud*J;Pڅ}탩kj^탩mvS%TcY6kTg6oؾ| |oQ d0\kث]e+x'0e FAiA|^u=yN DJS͝D\ݰV3 v9X9PTC38EFo_,yR5CmѶ]5CS.8%5{ #"kob{_=l_զbO)u<ýJzaޥASxMfvmEWZ½+F52KZ(PQMim]BԶ.maFҩhУiTm`ˮF,ɒ/" ĝhĖE5$\8QAļf bTYX)ŔֆBT*[Q?[ތ|箺jyXV,ϷgYj[V iijkC`Fk#ɩIm+?_{a5(kajksYZʋ/PL'ݢ3 YS%@/jr=_pphݮD=eE}0L%Z&E-ETŪESr?)깊|iySKGACj\+AmQEVENW|+E @aL}fɏ@{ne|f^{.n¨TXC_|S~~']vsOt&|D֩(zؖOh 4z|S]odZE6lF'ydf'gؾkMrL?'ql6}%Kt' iFѶ֢YhK>PϽ}l]qm*jl8ow,V8&q3x؁}ͨ !L`ȠO󻑭)m}R`|Gڞ #{Y~޿]>2SEe Ux>^aDgmz?RU^RZ="(g'_"A/k>g^$JQPɞT;m3P\ʯ%ԯ&>kUfjJE,g"B)i9mQH#~H+OLBJ\PPG02&^TQu⟝AWGEu)icտ1GZr)`s*C$\d ֡yaUQ"Jf)*\pN<c$ZuRc)hVL,335'9چCh֨s)Su_MmѬ+ZڗY(Z&">Z98n>v9(fgweQTPWmJ6U2#*VUrL8bIO?H^fMKm[<ֽ0**%{O$槜}J!HlbUI>۱ozO~iSSl-*[bfP(Wr|dYX>zRUyصXYn2RLag+vڔ83eDq`KY%sOupQλ 3݌P!9HC=||qTwODL;=H! {cx2T+ Aa |8Ur*n$Bp>k '3d%d&B()$HV! PSC꼾iZz/Ek  uQ*xhUDV0j+D]+ 1Wo]Z>߭305jUB[JԪAWuY_]>LzWf2zd( _8|^qQF70eͭ0c7bOo7ôb_;|;A(v3 x=ry%R;WR*yc^W쟺a:O&"mrE<\d٪*fXJm19Sn=C+S!ſ<k+H MlbM>>`g?V2|#Ѡ3bmDwfҗheJaQeW"\m7*m<ȫV ֟`eC_{'Qg7,#AE~?{1L T}ҟ*pßq&"|zI~on$lDvL[fSU疰T n_Kr cnAwvQmjرm-m%Mmh%gיjoՉk aX`5eo8oJQC/ݼ!{jeEZqĆ.qYNBRy]JU0&L":LᎰ%UJAQ&~Y7zlzOŠT;U"˩b}O/OuDT!PH2zyom--(G5xhfGR=iت>Sت=J{gq(eMzt̟V`S2W5ilZ{kZFZS^il-)R[D%+ݫ:%8p/69 (ث`K ("@n3g8CxeΧ DSN/RȠn;嘍ik9ƟjߘsW+ Q%()G dAdovҵ{tiZδLZ09 P<ϩRyOz.\̺DPy80móGgf 3S"ɑWYk]|ev&&W`(g#xoY(G_W<Z![t[Z3EEFhp8B$3itOL]((o-qn ݦErQ>(hS絹=G 'W\L# vb1hNw9kP#[Dz>8u>Z"Z"<(y;(RJ*JW6GzyZ&Fz<)8CpL&}JmjrTd,[j':ߟ;k5oz%5o}(.آ*ݣqJ|KhLT|dh9Ǽ5GF֓Z8i;sjn1SDǣ)@k:d+ƯZxyʹ3iX@럿قukkƽfiTT*ѥQX&jpv R!7hV z߇^OMo^O''RrrwXk|ѵf1mS|S=^T= *,R* * #P*y,`)RċVW1nJNw^u3WN9i Hd;5wl4OzUZDj4E<`ku8.o# 8+v>8BugLXhf\EADV1WSlzٱu渿K׍渾ODZ8Q6:8fj}y=>|j} /_z*~0>WϘy_??GII??#N~k3Ju6ifa{pʇ_v ^Nڙk*6 S๻}9Q箛InߚϳMY[C}aZ>-rL|P;\yS'Rh+a,m?=``}fYO{?_{_&m;^n Aem:v7,g*~?|֍'1?qqU|68AG2o&9XflQ" (~2 {Y?m2 i'r6:ٞX\0 B)@ʆkQQz9'"h,83cN6ovWߗrJJXUMT( Wɹ(}O:2#/ۓ9*JlSFzsY;ra+l]D9Tb9<*a(R̒L2/[&Lٚ)h"@_om(S Ә ?SQarQrO<&D~%Q߮aȾEU3IQ9{*"4eEdJ Jٮ޹g/ּff4X,S>wL3||VY'zJ+Wwb?yVGC~J| |hOgkZjqx䷾5p[Gl=;-|{y`2>@ ]ők]EWex7k+Y#۠k^ⵂy [k`-0#5O4}5S~W͇>'Ǖ}MKZ̅MKZ7%6(]Y>^q֞dZyml ֵd^E{zٚ¦j~b2v6(fQ{}Awlfj*֩5ykF{1´3{c+EZשLUu)9('ד'L D򨳍v[m 7vC/3;`˜3NECh&8l[t6'XeXhs sEF4ZM7cf䗱6v"dM|3hM[(($bZ=6ӭvVMV ݔJ Rkҭ`fҭ L\3g93|η^"ji3$2{.r4hB;*){~31uFx! c{Z!v‰h_j4/SsW3EmQֺ)js)(QiPZ >vVmU-Or(r/'|ryq,+)݊h[jDJ<@+L ׌0H{_1O'6l٤z¾oz;}JQvOƟ5:݅kVq)bf'lFiZ3ykB |y5mTmT XI9wd/]m'ArlP~YOњ#^nZf&3ѐ!jV6kUl6*l6,_ٔf;4̣<{P{ښiSD$4ECKTT9Ƣ0L04 kE1luf6lnx;gbȧ1@DY҉S(\Z!kVKP2֕\ɉl[m2*[ʨd=iFoeIKEbNY52MlV~|Z*{{5kJ#mtl:onW3bEmu1ƴ׶# &|گA~or{`_m8N9c׮iE_+,6y;ҟ<)QoEy+Z溧9i!y٢| nާjkާFc&kZJ9Jp[,aPޥfv2;YnYH#PLy֩pǜF`)xDz/YGέj:G&~'!m<{w"(QE PhV1+ʊNؽWƍ&ض`UAQԪJ+)~NƳL4H]x!yޱiX՘:دfUEަUT]~qN%ױSSdϚd2 &(#JzWrJunq>?'O}pkze3m=J%GG[jwT7Xnk O2vC&j̯>TN3W/͉ZǭBԩWv~xto~ۥb:9Q(l{QU()^mL+>R5I1miIʯJwT۰ajrv6 Eچ .D~<Æ;.e> Q\ߚ!\O2 7晊D,>?V|ד/X~n_->16L˙̥~(ͩ35)??Og߹)MoKYQMJg&ŽnSjӺ\6>PNT"T4 Ld7L^÷2 u ~ݢ3k>6-_ uEoV3-(܎|yua[|=2 ^2\pfݭmu*v7I?墰kSL 1OϧdC延ɵ6ڳڑ|u{UczAoS #ӵ?u"O/ )S䮊Bز׵YUg_h{~ڟ[_rEN}mRJ%lL*Ig/:¥|ѣ_=/ϸ?ϩE~c\R} +hyb?~i7 (=i221DDm*T" V+R>9%S/lRV}I*uF>LYTEu3Ҫ}UKWphzر*,U͎PPߖmuHgR ]n J\-D/RWZ}NMQڟPs Zua1ET|yܕt~Zky'!ebÒf"RTQTPXF1+ujkLp'[sP|fg©|Oe*V()mZY+6 T2UEK2ke`Cw)̕-}Jk-~<`(^hURd*kC4Eq }45LmLԙ Z#2(TIj?^b7#Գfs[MmKoƌQQQ_ZDFAk[+S> yCSލ H܆ oun9ϏceSЀO~X$E I<<@zQO_XeI _Xfw @@Uwl {V֒HBk$ *Nd 7R]A.K|e?vS3V^k'fƞ<6981V|}o%OQJ*:QG\xăLN%'GaN9a8)9j GXV`j[DhO4~o5RJuNʲ( cƁ~wP;-{(D{#J FVUou=`F[#>qdgf8oUncz)kh4PX"6PFGZmԵm* MdMiHmR ݷ~1KDW1K1S;f:**f*VaE?ox܇{7+`FЈ1eGAǔBYqH_Q0rx|\ŭaUZX۱zbgU2ҢL) lԤ5ḥ5e9^]\-yusU5=:UMO) ȳ!dY_^4Am׍cIkbgas=cz_ZQTb.Aԯ>wμω_o^E>}NJ/v7Eb"uw~r_;Q*ڍIU/n5 TS`S(6ճͭg׶3kYmW{ DVUDVU2+Z<Q俦cD_C4:ZAnnO./Z_Yzʋ5v>je-~l*~0Szugs/] - -9j,nz\[}<~FC_Y8_QM3,*;}JuuyS 5+̩,X'ompoekohfiL ^) eR6ա\Te|o^&E$ 0c| :Omc=/r:9%鸱O2uuș%ɵ߽sOo%o}~0X?ORw^q:)z7v$}–ȇ8V8٫3@őIiQݠ4۱r[zZ?6kNom_!^-L>KO}SY r>)z4nJ lL(tlZjC˜Pdmg8%L{K"o!ǒVRoԺKhB+U #lQYOνR|C5U=>im?\;=L|>XeUOݵlW(Gږvj >9xjcmqS+WeZ.E_ O`Sn09'?}W'֝oӄ=o2ₖ*ۛ{O={9aloE%pJuɵS<".w?fEr6/f]f׵Rj"#rX\|UGv'͒Viu=nfTCr7*aŐ(` 'eIBZjS0ť-'j5TQKd3?L9awU>-'$dr+򒫘C" rxbE[LglE)nasW>C*(,FyeL,~)hV>KʹUNLQ5zu.m%2RD lm=lU \sQa|92qDLƹUUD(>/ouWdsmPTV1AnJS3&UC883ƘH2 Alƺܧ_RRrTYTDgU=7 ?Z`=h,fAԾJQvߺoP=!9/UgƠQjMZm梿1bBʥ:՜X?* 棯9v0sqQd6(o{Y|ȿ, S[oe~.y5<0T*[~E&vEdAeJHԟ5}J+?ɺQNIcPԯZ`+CUԶrb6-oOHO@>RrER|x8sV?`~0$@O$i$3jBOHdo˙B$![k dֱ!B2s@$4TIXB By* E$\T^hK!$X-] , JnB,jK J˻7/~{/}3<:(F6Gy>^]),">hl|y9ag"+3Q Ġo,hNFǭ={^6ԩ߮随S_?6ka %#helxe5٭ kO*"62"n۵y7bg0V|[ {׽O J泇2 i= 3|3gr8 !Fl-yJݲzyPޯP=c-mlm0̱,s=o-/SE{EY_a% nz wf=,ՖT3N0+m0۶[hP\uڌu(UKy8Lr|y}Jd!qcFL'zkTo6*$/| Awgߞ1ݔ3ƨضV]?s)VxY-mUb)EVReyIdϞ:N[+o5Z9o}n v6׎>Ѹ0¸+F4Uޥ< ojB֫tU!VUU!Vjq03ӏ*a1۹9.tdyj'9cqeYk`-׼z־__bѯ{gkݳŭneo]]/X]/Zoc)⽌4So:<5=}~jjjjTmO{>T(1rwPb[b5 !DG,Sfd}2 [EY\h*QAA6c=}ΧB|}z̒)D̤1ڥ2Q\<e9 xg9Rk6ּawoq)9PzSl $-/h8 6>{᏶.rZg7c{ZbbLKޑN.W"3XT'v.WbPؤ4[{lrXF)iP2\ٽw:kE޸}N~뙇m3g 3o e%`O8hd[AX^S;U~ˤn4X U8j&sNYQA j]78m58_m/_z!Dy?}W[׵KȨb:FdFC1(q ,d~pJz.u{6im/Y_u~&x e5V:֭λ{{ʜ[(9*}Կ -֣A6/kEO|o^#v<ަ^ڝK㹹?t5~&w&ܭ";M bp[k:yǙ_o!VPP$2v>Rl/b̕u)|(0y,d䵣4,c1(,g]hfE!K_9afMmD0=9S؜PO|^?t^ ht?^~gc0PZ$13 _. Y9lxbwfpmf3DǼ6zو0" ,M?v2YM_v6k.݌U=?Ӽ[`JG޼z ߖO~cC|RL&)F"OS{Uws=yō bB `giv5)d5!uPRu$ř2|HrYړ2Qi~x9D+7YNVg'-(yUa+f}t@ϰ^Dad?E ;& !2_6r)iy&CTBD-b%~!PY)X )j~0>PZ eJ#E[acVS!m+G36&@ Z}*  uAAbV,}Qϝ5iֈQf-R=L*#9D;n:V(ƆgulR#֊(M֮>XUBOxf&bm]#fJ"`}y)EO$`?؉C~e+K~8>G@X{z~z]BGKSsZ 92ױ[A"aE+k]S'&3&QUD֥ JԶhj4|-ku4zNӂ2lZn[-NHl[&׮5my+\7xbR e*ƶLZmaes;-}yUfddm J~oZU+8^/OL_^:93߽:7[5/E^EHFNHD#'x%[#j*v+>t5E^ܤo''%%1n=SI%c IfDUݩhfPAfPb|Ӑ/{3Țoؚ]6-@fKs+[)RZ+?ej nQ7> lywI,nZUlCxҮ'1,i;W^im7O*TCRUD-T?þ?=|;ϵ>붎O&[s*[nʫlSOq[ϟrwޞޠrysJ5 Z}LIN לc~Ld HݍhўG$ȌmI;ڟy o߽1})5NUgW;WMzٰ .ju=/>߿o}N[5mLxd3Qc;F3c0y\>QX0>XWz**9Ί][@_{)fȻ>& /oT堢7#XW4/|# .1UeTblQ[i#g9p:^qygK{Olfm3uAU2y*K:D`g#Pd0_5"[ϢX3d_*$zs<`6LMៜi}Z~߮grih 4k?+2];OӦ(H9 `juj nL-*[JFoiZ;?=?>kw1R U7[ \?TH[P'3<=Gbe O{tk}6l/͌A3#>?*~#DV3QApLQyſ=]Qg$P*:vҵvNgm01D5(SV}ݨlQF8Up <c1a0am Qen_J +wAѢlS3|E,ٯS3T-UqJS5Dj*~ǡ}}̕gy -3y _r9*YȪeeTjj~76zϟ2DV%A3hiQNJ?yBș]A3TFE|hύE"[#mbj-wah=k;ɛ^tŠacv>LX3.3m]g-?־a&Ipm>1{?4oq"?9Ow}aX-Z^o(y\Hf3Y0}3RrTu3 8[<)lZ1VɆ8i;^X *p¿*X*(?ȓH}2~>b};-o )R)M7umԷwwsuo>|_{r~Z)m~"w+l>)ޫU3u&I&/^OmA{8&< $dmrΪO'c>ڞ?CO>q6y=sRJ)v!ʇSfhoEP|Zٽi3;}|4C?]QϮ~{zVzӭ'z "9gƳ07ؕ"bw~7/>GEzJbw"JO%:-i}vT_ϕ̪iYDRiYf`&+}g9l.`δ/~v9*4pښm&`]UkY  ƟiI4}D Q!]# A| 0%0_C18E؊]oXնWgKPXÍ2~3233"ϖCRʕ(`g̫nb* m ֑e{~`(k`w1K4XRkݪX}ֿh{_q[>&ETwOk=[d2Z f}fpAJAM5"خJԯ5.wGfXvPǕB{VR)Ic6+Ƴ-P[Jł*"35~2A+׸y@uا+S'>*єh\|5ĺ 5L rA݂e}㧎| r B12!THCTbd;mipʝcKmEO_~~k}A.7ZӾ쟦q5^:,59vcd0~.꧳uTk[Afk|I?~{TMe¿6u P\q4&VKJwVyZL\▲VԴC391imK6;U{&AEҡ󩸣mWC[{2f~!96Rveug.+nmO1d*TnW**ֿCk61}򜩐*g/Up䮴 [<>BPf-<+O)f bj5 *f/,* >O1ҡ-hOj@OKQ~76[C!QGX7VT>%mDg[Zᵑ3'%-,>VWaSRj)#9" =ƴZ,?#'*p̟x[~&d~8PCZ T)ߛo+<:Eշ2<>ʀ:/uzo !0O!SG/ mٱl۴mٳQMUc&0`NFs]_''(, YS՚SbrЛXk{vvlv66vla#ESUEɌ8/X1ӑWo nHAnݻvMaoadcEFk{ÍÎy%sg|:jmʛ7Cc66m}}===l@X/xD2UO2/y6-n;bl6Uٽk6 6l7]4T2&DRpF_}=Z Ⱦl Ҟڞӓqչ?w;Kp=z=י}`_,hdLA$P޷,yh WjlakmvofsfF0#(lL`5 ѬW<ݕڹ2B6] @$X 7ٲ+[3;ytk&evDL0P kj { ͻv !$d$# FkZѩ_qsnp͓>J'i )@zChPU4SMI nQִj`cۮ)&ؼ4:C*h (i۽pdUfhw]_ ݒغRH%#-og=`g}d}o{d#$J;5F n(NҗGJA.&1 S>=>Oz@zִk[ѣf*( lcނsOHtښ6`Fc0֍kz4lEUSm@j6  (J)(r(;hӭ9cxes_V#BD4BE""?zFͻMMMTi֜1Ub1H.4$CKt$R!4MACTQ7TUU%:yx㭔boVY%Y;izChzCw{s}{>q=*ktgCٰaդ9;wûU @^_XػG ;C(RňE6;{Tvvcaa&Vg&ECV3U _. G!Bؚ"})=݁monZZ53 |y$h* us]WGZ~|E؝!6t:j}6 ivls,֜regG>uǣnxw|SVl]; a۱lv f>֜regG>uǣnxw|ӫ ݠ^PnA}A;o5EiѣOs].0c]ͺνNA\JR)6}A;{f:4i :<)5|ۯ+hqe . ԥ) R"H`F1"ďBdcz&rdyn~( Brv&@6ƒ) iQM4Gɜ1xt[мpтe BA j( h#HIFP*gCn\!a Eh)2],T@#0a5 Nxy9]u Xš*EbcB0ao4ϲ$d],T: [V v,\t"JXЦaeW(H ;,XFuJf X--)  :4tt &y-fNX7 ֵo3ݦ+J(OZkAMSAAII^kY0Bc0G/|wi-kJxRJ0V  B A5kICMQUX5{羲|6Z͂ڜhtHzДQACACE80fdge 慘Z͂F)ʻdrC@i (()i)(3:ִi*LbfdPG%NH9GjiؙSk@@A9֝kZ4F&1]c2^5u}Zńش'(M!*m`v0B$a0`$ vٲsv]uy~=ʞҚA$tItIt"|<>>'?q'?BSEQs[GuWKV]@yR0$BEiŌH݋., =60F-y=d-v/4țM6fݮݦl;ѣFޝFoR1]i)7d-` Je&h $hedC)4C1c< c}xy8 sygMp I61v;?l6v vCiӧF=XəZ<|V1Fx6Sȏbp@eVK!_!=>z=>Jtִǵu;;wUc4gse<'PQi4b쿥ϰ{ǰϰ{ZkGZw{Bc7.Di /vґHCki* jѭkFԩ9˗5ogGU{ z@b\JRZI;zOC=wUThѧ'txxyUU5`5Ϝ[ kJhM.Di B,Ol7l6fúF9;ƃʪqcy|_bZjRZK B#1#$#haɗ3awfss1jZG RB.AʛChlMTSE %:M&8  s1&g}g7o]#u4Х8R!@3{=wǼ={Ox{>*hi*yfﳳuuםyn-0ٸ0^AAtK@D,H1ܪ)>ϳᙐ-|Uur2 B ДXXc,I(h(txxQLkW/wα~|aݍYNڼvиB!I6aF Dr)A燏edfr|X͔H*`BD) $vvlmm۲IFs{ޜ `:/[JpWJS) Os゚AxzN=>J5d˜K_S y~jݜ. SbG*RM  J?ǣOG]}z ֵI(Ѡѣ\rs9o%'"GJlMH\,H'MMM];wv/`X3ŋ0hp#2G\;Jr#.KILOw#x ĉ;ܐB3tjjKa+@J\M!CH D$rBB\!Bi%9g%:Ԗ:V;RB!$!!D!*&C3َ<[[]H/BA") ^?B$BB5ZpҊ6J(kIPöc<R АHa Bio ẗfNPt"AyS)%iHc1bD`w /y|o<-crk, ʝHA($JEM%KIIE@QM:5I ^'uj;w^`͖DiNAJRx&"ii)()F!:z5{ݻ0fn"4 )p<K@PH1! B$b !J j*湜۪tQ ?@j=6BzC~W??ַ}V4?/??⟁}ޞk/e˔˗޸\V9}X9#qD4]osLg)Iϳ5ߔ˗)&(+q{~ss brG@ii"s{c<>|F:4i&<ymBP<@m ShEckl~a==`= }|/n;KB=g5fBz=CHla}{_r~oxYg_b>gy0~3݈xZ|?OI'$(iѭ91.L汃.\4Y-c`R)@eH0'{>~>ŋwT"ZJў:Kmgn'Hl]0`H>>d/"GC?SO?SQE4S֍55dɜ(r){;F!h hl~A='z}!ENZ4h &r\vw˔CvшA O}=>z:JOOIYɜZѧyֺrwl9(]{ D2Rr߭s=}} `}Os I#TVk93kZ4;:^NNGÃ~Nx_?yq9{c|ߚ|ΗI|?FPQMNfsxN굜i, r% )nH@ 1K~????Wֳ74>m0c˓陭i֌hrdk5\c6QPN-v"4&6!c_>p{r{0crfkZu%53!W͹tj"2%M!H@'m66l۴۳if4h4g880c g%1vfͱe;6~}\oϏk|||OӠѠќ5}Ucέ.,zҝzz)iIq-n<z{޾=}t)vsX++4qc-e?R؝ !HA Hz>/"|ϗ>!__|Ss`{Xkg˭pZ| 4J` qg/=QEPSAN\0by+\;UX-ք(.D1>2c"#QEAM9rfr9W`Zp@h`Ğ}7ٷ{ v w!HHQM bP`pbl߿~/^zS6&zHOOdzdz>Zѭ4'gUZ-td/`zS6&z@?G=>Gz}'&s2&huýrߞΞ{k[+[Б1ћ6vl6MMg93)Ti4kC>^t߻Z{7F.4$F i(hh((hѧFLK3OeyGxEt #@E 1`۴v ͆atdɄ9WϞwW@20Kp4R 4SIAAE%%sj4Ӡѭ8&HѧXӞۋ''"dK !"DZ:t4kN&I:4i/~4粼Ƽ-9"\LЈhHQIICA4ZF1>y뮌ۮl6m< .2,wٷfٴlvc$a!x~6[8ͥAt L0H P'7@ѻ28 p3h1uֲkFȗ KO緷fͦݻ6ٱޠG1ѻ28 p3h1uŬ"\L-.W+hZEMPVIִ|<ƻi Rfh " })@dHBEEMPVIִ|w~'2XZbq4eMHD AAMQM44MZC!@{܆$x<ڱbkrK4!0c`٫Л nTw6C}K03a`=26߷lGOC}V!dHnR%8{e.˓!A)4 Shz D0E5MA*0L}&"![T8.}_||  RCcH# QTZtqbrE fVԏ 8.}_||4P7@E 41֍u{/p!}88m@3X@g rNX͑:]!E"~?۰Mwin((h)Z4o |<ggY}V8flFn )M4AT$`FBFVry~;%^cjߒ]%4  hvЈmI@H %wKּPսY 6aM QITRQTPM9e*`c|S%FS1D_|DEyC"БHTб` oni{M 5C.\rfcsX羸kYX4 BE"SBŃ?c$J(hӣA1U] bs,:G+) JD4'1BFH0`˱X.ꭐ&g3ti HRʝ#ȔХ"B&Hi4MF5Es̹s q<"h]RC`;hl!-"D"@0"B(3e֡<W"'>Zś{h))J4QAT4ESm@{jp{)ARRbf2|Eŀ}|p$"`LД))hh)(3)(Z2{9:Ym@Ҝ Ș)4%,JhJh( ff } (CuDMJ lue#З!ASEPAE4њi(ι89u ͊F 1K. B Ѥh4ѡUPQMSAuZ5rMuwwyX.B)Ѥh4ѡUPQMSAuZ5rMuwwsCݖ#t9B D) PR DH Mg`'D)ݙ5piU\JE: 7C)Hh()()J id('D)ݙ5piU\g `Bp4:IitADHI iZ5;x<ޫooBep ؟IAAKACCIAMMBh)V k8nw100nRihi(M4uN0U9ɒ]Zfgw:k,S7S(A2@}z=>zOAhѠӭt脦Lֻ399yKXbB 2 HHB1P`]رhb;C ~xS"NTJicE4QE 9 4֍a{5;3l;)v'*`M4Ԁl )h@kYLɜ c6<|"<)B`iKJi  AKE Ȓ$%SZrdL80c JJ]JSHP?l6; c{=! iѭtk8 b$!tRb#AE4U %V-EUQM̆La$.jqkqޒ;G`)t M F;ub,QTUUdbL^rGzKZQdЂRTTIITBF*3BM:+""NQҗG aM ?on6m7BF)ot𣾰uc56խk뇈St˜SBA(`AACT4QA3 رڻ.fCU[ػ2&AB)H$O! !EUQZ4kZ<v*`L0E4 ()SbA.]:5 ]uͭon]) K44 0bDmig0f}`]b\ЁrXmo<}vxBM ]%RRPM!G@/B@"uxVA"RH1 e{Wnh4&L:k\K· "%,4iѠh5Ӥ}>ϰgB#0QKB~No-JNvi ( 4h4iL؅QM4gB#0QM49g}?' ;G`šJh(jӠ֝5ӬΎ{;[8 Z DWhdLĈ@6STRQIM RSZt,]먁V"ZV2+" TPRPGZtiɃ=B.^xf:9J!6AJJ Zh(h))ӓnv7}qhһ"iih(QO;+&\n^cwZ590 ʔ4RD!M4:]]hѩ`ϓFPP3Tvƶ.BA.|9SbԊmM1E: NZª(#%"!" dbcfD/>@>p4 i Jcnfa &K[Z4lV1UyJ-cHyiJC$"@,m}<CbÅDv)7r"Қq)(4*Ƹ/{qvheE4RPicF0"@ߴfXwd̰fiҪTrֳkwd0J\q2$BA QM IAMUhѭ:4jə`3Uة|D"߾RK  ##$93L296j޻4`-J])B{ i HQM4RPM9+>Fkh$9}֮`=4$(J hӣ&S9ɖFcw<>8w݈냋Wt$i`:ZE4RQF2L4c/~1pqcJNR,K@@6v nͮklXX?5ǜ K @|E 4K)h  k۰l6vmv;])(ѣB.dOn5|>@YCxB !@R ZSM%PY$)c ]ttq- [*AyRJ@n$`F0"H1a2nNHAE]1:8l-  7CJA@D0"A9s'ggaET ICY< D>"4|/_—,ѽn͛ i܎sѐ{1pq|_3,ZkPvAʗvPDS(+$k2[EWy(RĊ*(D*QTUQ(@AJU>>oh(WA%%HPD@*@ )Ch,p@Pwh@(=O'xA\&(R+8{y 3ACְU٢PT(%R @DI@H RRm(@!RH`_ }nt|`0$4Cj<4` h@fh" d(UB݂* `z6 XP΀PP٨@1h`MPP 5{h|@4ӂ)6Vj`(A@UP _l V @;ү@}H >+Vs}Ga6Rx4p"bVwhw]V .#0*ͫkbQS.;J"pT]&B,[; gmChcZmnnB݇p%nrR;`rwjRmMVusfWtT:pJl%R*c`Q)3PJgwNSnl]-ʒgnX 7XKq)Sn t8J$;U@w.*wM˦).NNne$&vt@w.⦵PewnUE@u!v;!RT{P(P@@4t@@Y,H(ƛ;q'l:U*()+;:tݎB"RêdAݹ\w*%WvuvzäAtRw\JÐ;J)@WlEI\R;rPk*R*PgJ*gAnQDJV'wt)DITU.:(ݺQ"EH9ڊUTUj 9تWvu Gvt:)*;%B v \jRܒ99%CQꊫv:w0RnEU *wn*UwwBݝ "s%(N 퇻I(¢w]ҠU3Q-@뜢n]J:"Q mjΈ.EUwgIR TR5yAUetu(qDJnA&tMWI@]R%֝k(CvSFJP۷HJSJ*Wze){5MKv T ѻkV v[rHgMکVuDΉ!jԄUTpF܊TWzkRNEWjźݰYu*V꒕Rݺvv*hmlřnvUQ(emW]**V뜺hP!.֢WlVMƚ+Y՝6̌nh-*r[mmlVf[67mrZ0.Zig#lwjuu٫6ַpnإ ulsY cKmlrjWLSdrU\f节dw7-eU5rQ\"fcS+7UK[f.m+N՚cjDJuJGn25JɫBJi6hS\UM;҂Vs,R'!֕tTg]!5vl,wl5T4Ի\m PSBNIH.UNwuEU%Uh5;fVݷUm62lQآsΝ(2wwZ-td+O{*ejا@շX![XE4@@&&&F&&h  M2 4hM1dɠAiA0!@0M41iOPiB  Lh  L h0S"H!ii<LzIOj4LhOSOT5=OD6h=2 OMOFh0Qy54ީ= E)LFFbhhd hb@LAM44OMO&OSMOOS5=OS?TUOU?Sꪧ 5og0{{UyY.^0.BT+f%Cd09QpQ4bH2i Aб*?AhJ izυpnAHsMR1 Hj/ˑPoӂ? ~n Y;G(klN@_Ԗ~/;Y" t?SoG&)70\(5Ls`[]^/ޅCoy$AD]E=" j"= Z$k4=#X#]rsT%]$p& %{Z# ̃T ɃR_5l7mq:qZV'vNo֜e7%j ʱ˔f챨E bPR G";s aP bw&`yz3z}@/"zEZ\զ܍ccUnw1ըq6\g];MɞP`kتEQ֪7^eUrf\l!\52%0uf;QEcspϋՃva78C(1(Gĭ\|"Ҵ@:Mb$ydGsVMR;x>уdI"cz~מWrzXJ(+B XCUX- X 4s*hLqؘםmQEn_@ٶZcNuMYwuHcLIV2eE` Ij2n|A"4(8@M3Z\jr„n9\Z&" 1@r nj )ω| ӆ+Y?.Qzf1P>3`iޟ?kk\E)j2KF^cNu5$ЏfjٷP .N]/Ul*Q+|"֦g48o8ܪ=-`C+W&i"F zmUqRBFe'l)6YOŬTZҢ;2^J4Y I:+tY0DG ְhDRUIAQES}Xd\MR*LQ2/K̢^W2dy! ff+ShJ뗴"ͪdJ ٤ [9 0~#gDŽPg3Ad`\xV+h̭TVaҎq\|+ zQF`U2h[nJ,W@[H DbYG"ԩYF+ D0)Т8_y|}$JIa`wXD:o<~MRC;uiS#=Z{Sy69DshxӚ/v 1 F<yhӋcKcBեMBk(ȱځ(FeD4lNN].Ju83ݍ>,ȚiIxl$^{584[rr#ZHBZJ$x𴗄5齄.ȴ2$:j^%#vpkᷦmqycγš|emU굮6yL))>wy~3ǩyM]XyvJ,b]-&rQ ┝w R$Ք OP}9P-eqT|g&mHJ9M]V$}]qْB9Nߧ7'Ć9<Ƽ$Rmu$f~w*73m;"xVWK dly\_Zn˵٭YIfڝ(}Ӷm^5a%wO=u5Y%shxQ'cgrE.B:k#4ʓƇX:tNbV.V)Y԰$4:5 0Q4z1߉H(+h67r5`ÙAt0Y[NoH"+DA|0`=e]>d6K+ݳ 'ﻟ>{BHw敄`(9LI+Pdӕ@W-D;kV:0bW6-b*ܕ Z /欱q(J8Dբ4EiPü|#ZBjmum5t8{A9bB9.هٕe/"ݟ[ngn㼙PQx_yn% cY.ڬ/b@̾9r.:}Ϗ8Pƽf5Vm{wb o|EOzU|%(k"7A*ހ_$iP'Q*7ytwN q&4)N4A|Lh.bl]7bظ$D9ȯ-o.st2DRqQS5@Z/aggpXDIL&T^ΕCC1( (1UQ9wsW.UOKԼ3b"3 ]`K1tZ:.3gNɼNO^sZyREkTu4IBD(|@USþ5&FPPJ!Ѵ_ YjXjif\}owm"LiQLfduiMAuث^c,L fleOrʁ(5c;rr=jz[i% "dD6!ӹZM^7h:I(!`商:r)DaBqQFӋ 1R(.KʹJr"R߯;mFK 'PlY\hVsbm-uۙK ft :kO$:rXjD^DCY]YG7Hإ'Eң P4 TTăB(K2Nl5`tq<>,q/D(V: )Ltx2-_}|j7Ƿ˺ȇϊGݛ͵4.lCK#$P'՝@jdMMԬO|7}pI7u$`UlGiVm밑%6eoƵ r5>H9r^:6Ifn~Q5v!biɒH,)'ґ[)roy4K巕etn:z<5$$aF_>8^z;ϋBrF7w{91DE[~+Ԩ+i0);=SqDTF['MrxYHd(MqO|,E=JY5DϖY'!U.AќwdyMK.˦ܓPWX9,..Yy qܕ vMjQb\ij%IfT*⻪AeE뒐prk9'mG-e EdF9^4\ea(<[2"*nЫ3y"&uNIG`/ᶇYl+< @dϪm;c]d9Ud$qd㮪"bNS" k."ч CRile6R.(:+j 4InuPemjex' ܷ}NO\;^É=-u=#yEvmIw{ eJIqUCg-wDE{^vqQ feqŐAb'dCFɳ$IdAyyf9FI\.LCd䀑"!G9>yW~ T 툪hHcY*>B>Z:A$d+]W|iÌPGd-zTihʮC8 (Dݥasً5"b*)䃳;aɑDCVV#RF7SIy׏AM-h,%iZ 05ѵe`"I#%ĭW3itܹҙ=@ֈi\(6UMb鎂!lN^R{ 8RMZmg4X\@lv'5s 9B-WNhq8E@ա>(Tdԅz2%Ѥ& :thγʃ0tRjnXw"N=rØ:/QbRXK"_|t=HJlXlfs78J6ݱs92HvD_;#+1R2H>alŅAԈ =zw!6B;r8qȉDSƊ&zE\_d"(F\ Ly}pi&)U%ZBUE&ȼ上dD+Y BLAR28)&UFɌ*y29㛉Yz$\q٥1 !!+ZAdfpԳ)T.]U4nsbˤ^Hx.`ͫr$Y.e;]ǫsoQTyGvng%۷6zh*!mmx .Ę{W"/#9waPjAs!!DI#U}dN'lTU݅$c%Fy睺*Ul {ȃg}ydHrB"Yrų(R$+d%f̘$m\waX>U!0 '_riII4II]-.cUh9ۛ}c3 nݳvmvmvckvoeeFQe9ObI9AAYYYY9?5KNj-IFC%It|y`?T* Dy֐eݶ9?k*-#Vu8 %r;_V WJLdakQƜBXw s'R{%F O|IRz.Nw[;Dne&\*LOER 4 (^t6$N|4-5n6rY IIkv2SmD`TcJ֧0`^*ꮸI讗KIAA1CT'[1ӫ>,$IW^ƧgΈH@-imEIjtIEԝ4AU8t$Ὅ:Z:>\SKGѤ]IżwKG Q "Uժ2Oќht1defq*O̘5x?BFB 霶KԬܻ+H -dZ] ] FVaKAmS -kC?@Xwܧ`x>`! W|5Q-ҝouATo"ypfiX5P7{5\9YR"RhϜhpY;RzČ/޹ -z~ PKTLZ:|2Q -^UTLq>V?m'.(s9V*}icURI};ϒ[#9LfO ,{m/:b]+\ 29I6d26b&>O֚lzN)#aQ`B~_EN0b Ŕ6/iS֕^mNBKfk˴C_!%9wօ6KQ NyUhuy#ޗcEUį4|46Ra OBW4ZSHb?*fd>"*I(+&ҫȕH.ZFT~Y 9pWQ$gd̙+F>m3Ƙx(QlsϋTDPcZ/)~cH(9,;FoI)/X%u~!q1GE@'>M <~A*MՆşOnIkɰj,J.w?H"^`ӔGl{Lо"IcBSJx gjJjs9Qӄtѡ^T'U:"HH.s#gfչSjƥEInھRtag*E00g1yu):*tw(LcJ.#Pvp[)B Ƴ[gZx:;k8Oؿ\CmױYU0̎*^~FI%N!|m_H#6Kd`gch?]3;y^)2漤[]i9<0޿Q {6ߛ@ʏCӅhHs{ei }u Ss.Ue˶>ɷyij&4"Ufc`IumBhqμ =lǖ#s3nTbOF UJ)->_S=Y?_Zg='#A_25GZ&{ \ *ӫ@a2*E+ f;׻ZĴ5|1K=Dyzm02S҇~7$K;9XXU^4B*l&`YENcq8eY,:iqogLsT;u'>7oj#@n,B)y꣔lD(v YⷍOt/))Էɕ~~iBAZF+%7i5J݊+,jPɕIJ&V07rH߹j_Tj=EYkM߭9꿓*EmT[x{Y6d̩u?qh~)yh&g$A|R9$q[₺< qz)j |L}n *7I"E62&jRyAVb x yqRx# ͸'NL PPdf!dc$ӵ]QtxP.@$oB:& bJn>qLvh~\0+~*Yiy`'W!wKϛnb|"3 eV̓eiէq 3Q'ne&ZsW;ʑNVZUUv4NdiT҆͞B燮[R*p)vթq%7nR /^T܁ir):}YZ\5}F`uT9RxZ,l\սÞ'oڛAq({̓٭/.m j Q(;: ySu~-s 0ȦI wxcJi9..Nm?]R >ɸO7zŤF7=EmaꍨhJh)ÝvϻJ9IK r_ζTݐ谓(C#soUk9Ony%oBn 伱Cf8pʮ{s]"ҟO\4WƿiTƇ\=St")\zH^ >b ރt9͎ziqחZKPz"ۡ!=p8rVxgx\kNUW_EKlխr@S_'l7"}<'$Y;xZǩh'fXߚ$g9@5DLy|Nz]5iȯ2tC7K{7w5L{DuwOu8e]:r$aEOIf쵰H0)0~PH>CK%=u7،O<6w4c) j$Y*Tɉ\DX:UR#*B|Zh$5HдW5QP6. doMǰʱd7ޓDSqB9:v&i*Bߏ&i]ձ򈚥%ͪHJE)o4TP"|qkͫ|;8'򨍘6$SHyB>rձgSo$s9{4SpCKjQ$dN2S©j#Yft\Nػ6W݇u\"-8Xd_:AwmMra=xj6+l?}Dn1.#vsDGB1ΕpvK(7\yKPs^v:RW,QŽD&-du١8J|E4tp&D˟5t"Y8Z)ǹ[<6hkAV5p ډl9i&H"  ^9vװ|qn&ZNHhj7?4,ݎNG* \ q+6u }I~@wҋO*4[]{Hc-êuQ(ba <= 76tNOˁ=cS+#g@ P7J}LJO 0҂R9 u%M!m]5>*?MV5)5Q1Zy&l7btW6P핝A*\~ҪQk(ZJP:t9r&sҋyf%!*L],$iH#ǛE!2|҆Tr>ŷx'銩#J!*ucZQV)No.zfʪ9m ;^*^v]r4I*3ٗt񑅈޽{nUe-{|cglz)?0޺&47r%4 26)!"}[O͌UZh1H3Sry0V9ֻﲢ:'^N-_v8Iq";kn~Te cpkQ-n"58{\ Xw}\[M#S|SXd:4ܽ:l3xuEg3*Bkʵ{lђV/F71&W^auYT {)*ںu@098|6kK^R?Z(T2T *^V_WZݘfN'VXJ6qɗUhw~TYO3a&ޛ ~yI7읥p'YHVRuj,I0I_܎]!y,|)8Sݯ߹ {Sc'v~kI ae=@Zbl33AMmtʊ; / sU{u?d_Tv YJcf"ְ4 h̐ogq3Sk[\)~wm\ rB=0Ͱ}hbY9jY 3g%WAQB5]:aI0 ]w;\ou}Py~ ]UUCaP0i0nz7MDŽ#z'&:0ãd;?kko쬾!vö[ooowwމz%^l{{z%av!r_p {{[] []{{q@K[[P P ygf,,ѹjjj%!p8}öooB;a ؝8Cn ^O~_߅_ޅwD~?~1r?_ ?#T6'b2222:8#::8h#" 2 "(".!2("1220h0#######0#2222("O*-::-BB8#::::8##"@$BB@$@i$#82 ###;O04OOpPB4pg pg#PpQQЅPPPЅPB5#PЍB5#PЍB6`fF0f`QQQхQQхQ 5Q`RRRRRRRN;;;m6^խcuMa5Z5unZkMnYk5 fiֺhj***))))))30)32+**;; 7E<p JMv.el!r22 2 2#####"ffن**2L$2C''$2L'&(2(2pn v $2rr\%r\$++2(2(2''$++2++)rvf̭2MκrrL'''&pn vm2L$2rrL''//++++)rL$2$2L//''-rrvnٻ7f;1f;''''%r\$2rrL''''%vA ldl6& ? ++++  k @ ;Mks3;;ܷ,<<^ܼy5~^kq5ιk q2ך^ך,5y5 xk_~,<<<2̳a2̓v 2 ׆5q2ܷ,2`l 62̓r̳|'l6<ך^ך^^;^^ 0G? rsu q5ι\k,ך^׺1|q;`l `7/'x>/giᧇgefc6&6!Mv.6!6&؛bCby{#dlld'dd'd]v;bl]v.ce#d[ -55--mBkP P P [[[[[[[] p p -+22 !r! !;'d܃ Ȯv{=β33) (&6m6M6L,rݮkڻW////nmݱ6clm6mvmll흳vɶMv;glmm ` a10 061111110///-***5*(('IHIɃ *$q% I  !F2C%天Bć8ˣ?\v(ƊF7Ҟ&TܣҲN_SFL MVA;xբ֕$*M0>،'9cʵR8"#7[%h6ϗҟda={$*Igw D79g|r6%%>>=osg/t)D*$K%xPH,mVkgNAB '*#Ytb/az/u,&C4c@V;Ŧ*HgvɄq,"NPwJC '^_#@&t$1De/^4gC Wp"ACSQEf}r$EԈeVhė.gSV ]͡.MO668睗yK]]Є2lQN)IOV{TK^FTn_;=աXDVNu½hKK/{Ջ6ӈR "X](%*ZhQ0N-c9>BD 񻾾7[dnӈ)eeՍ5gRдMũVXGJSer09Yӡ)ֆUЈJ za[ BF34T(YTSX0aMTZx[=HKaF {=߉H:10bԐ35w A7{I$|}i 9`d&m9kkO1)ͺאg7㝞s }d˞TSǓu9f$!uNrYO$\N^rI&9GA|[7­9{8;,]h{NZy`Sd< JLO+b2InsY*@nЉ+aiBBלŒl$ɔe(^Ækdݻ-ͶTr$&II**vD,qEMH>UQOA1QqXԬ8&ɩqqWԎ9gdJ+UH7I͜-Qb fDKs.y؈btbm\^DKh&NeȂC9M\Bj\[B"%‡s>F-Fem3tGJiMcS A}F5e/tj6T%!6kYCSϓ}}$~=O>:*trA:o5V:7y5SirJYhwpBqegIn~l%+P ++ ʺ :J =9iiiiii` )))))))) =?L4?~}>O]]ȁr \ΈH_Sų*(JD֡CSq̪ >^N'3GR Ru z`h #De$l d+`d&/˚s[ =g v6 [`;ۧ a7bN9 K=-m9$" !ܘ/E ka'"PGF0t#J@Z6BNFN{tFErh FHU0d~S\!W%( 7 kHr (qQ^C~"p)=s"!vҋÇ%_A_{=u.Aqqsqr@,C j ^N:ﯯooooorEѮv ?чH%{T}(XXX_ƇF4B......GåZэ@o___mOooowAk__|l*¬tpNNN_o5q8\y9>VVUUMc8 vo.`6.nn.58Op߿/_^!{{{ybUWWA$C߭JѠFttvvϯt&&&&: Kxxxxxxj_\JJJJJJJ{=K?KKhsyP`IttpG HI?%%!!6 l~_4P~<0<>>>O΍:7::yBo\\m|W{|}}}}\\\\vpl\Vݡ;B[[ZZYYY d'gdAdA%ItѺ^tHHtHt/K/>YYҽ+ҝ)6l=w..-CDw7??н oB? н .ߥz]h؛kr܌ lӭ6lޝΜm 22:s- NzLꃪmfꍙ::êꞩꎨꎨٻ7zz޴  //'L'@y0pp@0@. ' 𿿿ygٛ3;26ϳА@@l@ `hk a(h ` ho/~<q1C 0ONj2Ο2Lz^^O+*խmzs-^m:iάά:m3 ê꺗z:: Kн  н н н 닋km닏.. w/ ::Z_2ì:γ:Ԩv[-YlB [[CCZZC0AQVh4pGpGpG ttdeXttttpXqb!ccaccمllg>O7776H6$$#Z [}vRPl`jG+IC3- q܇ U :UmjrJ/mf0^%?N,Ȭ V]b*M*U%yJT,'#K.b 吞Rh2W&U^82lQ\Dz\ $읥q׳ᶱorEܭη:79[/$Z3 aM0L$fT]Zl:.W^c9mˣp6*3|m;iտ*j'9^V0NQ,fћ&UZY;'YnK3-KEi`A9Df8)@>=S\" 158+e[($%,h2)2U8ҸXz%&S2g'+U9#æx@4U*@ ҫع|f]8MpxPyi*Z($1 ] R9ɤe[ܺ(یmKi.D J`*?{Ly-̈́.EU#U$>2єXƚ*G ik8S _]9; ivF*N*lUK"4MF,/Q7k uP 7"+3GIgx<8Vԣ=20VyY$Dl[TL% V&Jk'[urH'TUo5k=G:}8E`KbD E;lY]j'YL҃ippa,!Il*"%$1!ȃdض*+YiąM r5) " CKҚl{7G8עV>]i5UZ$S7h ULelXY9r-7 M*.h m}['ZE{N$,K_kÇ7meIvnklvx67*o"{;NkMҵ20ňk"aKdw+kl仜P*''S[Oŗv3f{.!ubl=te"UN'd>ĸ_Y{l&ulVY^j\T6F6 52T<+\^irXE_/X0Bu%;\U^9Z·`M櫔Onq}E]BTֽFR ˷6k6'/lSY,!+LW4 UmBN)ff*9!qqܖ.,݃9 Y)vuqVw%wy'{yUƢRyIb0&W9YL^0Odf5ŽqdRjNIvBN}Dzx*_>=E;+F;n#C]aQ.V-m9=EleƉӥN.sѦ,lOkQ7+$ń>/Zn0c'*"Lɖ&!PH݂ζuwàaaaaLLHHGGiDDDDDCCpp}98xx8887W^U{m԰鸭ip=exwza'R=yWOVHh\9.ZT`[4u%.55_=RQYz)ZȬb+twk`ʉ{˕$$!Z%c2%;,k}N!6"/YAޒ00mB&]R͢ӫG#۲X*e܎Z_DD?v\eExqy[.0 o|1'j)}t~HqJY)TqU VMk!6<b%@,嶻b0) \{qىIM} fOXR & -)EFW]w8 !7{g.g&<Tzj?2&M.&rWzY(ZK5uZW6k׿z\|KwLۍKo9DwrPPf{\v|3(=EPCq9ĢZM#YqNf󽿔5+<A:!;&Is\҇A$z%I-%NV jd9M5)c[,ob}Lq8O,$Iv]eY㛿fjǒ)1ay<{+QQz%ʣf|mHϑ\y։os~uR<m%}bLOr[ ߡL-P3y.g'mko5+oۡ\  Y12*K:%)ZZd4Vݹ Y9TQFua㝷0kDlA(wڪS`O1)ૅ3T><_0ۜ^2 tX_ٽ[ hIH !=~'ȣ+A6Xc'uM^U^Yet5i5.OJ{k[}48ݹBB19nOO~Lݔj WG+㜣Ohf>l@HLRWQ*pu,)./lO/ ҊDJec1x(\t|+Eoy 5ΞY_Vmotc:ۍ?k;Ly ̷7ݭ%b],X⥥횐6̯ da˔,T氶FR`YQaZ9S;kvBȏ8Qsduw!Kȵ?T5x.5ǟor1R 0 ͫs,;kǏY擋@MZDjfd2Q&;m_KdSwTp~o~dtR9'ϒ{-=0}Ҳ5V[nʦy le)t{J>jቭH- Uy깩QL-"#Ӽ㏃mƻ@R&`gyC3~=ǛK4d6mˣc7"n]$}q(zH:P$3Ny_qLV$*ePYzjFPa~DW< G~_ nb0OQgKRho][dd0+"y f< !'e _gB>Hʨ/=;Rjn[dzaf@)gY] yF2\X&({^1[]y/&Beo:gǙaNOk}w֞f'#P.fgwOt] kL\/E0x~N=NwE ϊoЯzw@M~UEgG=Q4E21KT"SQҡKʝ}cVA"-h}K =^ovziy6l2s)KUe͜|E#ĭmqqAAAB+ʾkfT**_򲴹9ե ehHNHLo~~|~?'!Ha,,4w-<]==0=8F("*+8CKKH48C8BB:::::::;KK7@I###0!Ct8vzzt4:ڴ46n LLLOW6PWuz!A II 2u 7X% seeBT4H;v¼+ûrr{  {{ {{{{{{yyo1Z+O.à|@ `JKLX8"UC`UQT (;g`@p4Nb 6shvyb5dlbE>ROI ]UgwX(Lְ՛hEbQӅ!^%.Eь;eP$F#4(htnlV6x;r‹glJ9Ԝ "5ThF%ɥUc*ļiKF@ӅV7ӏzY;KJgķ^XT64_y.o&Nk+\^R Z6ZN DKJa*fhw4Iu4T'!!XZʗ^''<{AFEvmnȜ gʋ9:~RỶoy-Z&̼̤CSԱe9&u DȖg ^.*VZ8p/ beuaN:d .CrI([-Im^I&Jr[Mϭ["N*l{`"Mynҝvsm4MFroߧ'g˽%gx\(Njձzk/]jWьksmS3כ-zZFWJ԰3b,x !^W+`,[kfuZ98@B?Y"j^2xZsP^)U2:T@ 7( hW=GѯTv7Z|a4ۑ}l,CI=V0}]8/9mJasuY뫡 -#m^kr;tedsRM 0ݾO7GF*~~߼ПhX(hyyhA*+#-::8#_󮮸ZYٺ%RR}>"&;=)*WWwo*..S'ӓ>%%%&aIKV;//ޫ;;ghuuU[KLlnGgRRRR |EEEM-)IMgߚ^^``ؿ}))))2)blXXwŒ'`ffPTT\|tll.>:$9!$Zw7?/?wv!(-P˫ểjj0000//..sy ۸;ZMh_#uuT 54_...--A_߯/mlaDt[ ` PJKggɜrrrr$IGGGGGI',Q1DŶ `v`tt>GJ~~{!!!: o""//-ӻݬtt~]*P6ޞ +/ˇǶ<ۑ'.GH475-ofo,"ijj)WW46 *33[[3붃hW?5???GO.wvjc >/G[ -ٰ@f|yr֯1!1=8`Gd3(Uo*DtJx.U "nPdRjT 咬$~u*BRqh>`ٷH<2FMjV)=_+g&M1T}B*g Wf,KN&tVWRQ^{RtF =!^B8#B$܋ǕRTaDXk ^vĻ( Brg Aꢿp(=./h _MӐ=Z&5{^s VʤLt\n6*j}vx_M^άM׫d!9${9F;c,bc3\Hsy1w;6޻t ՅJ%Vko^;~ FY%XzbiMZѤeX!Bؼtneo%#)vː99>"(V6PL%lKN)x8%ɧ@TL<]-:otUj^"`ES1$1 @W]/7sUV[zg_r5%rQK'2`Rq!_ciҌD Cmv?KH #VB0 M@ߧѐp.Xeβ@3 ߨMjv4g.VR-QIN=g?n*+X[ ]F+Z}6pҪ_Z}T޸dbwݜJDHzT _=V1UWȰC1.~Z(^sT>|| 1K~/]0H=.0E6x,YU?+[N5T]A(h:v֜MY4 ZU3z-ZwHVT/)?e 2'HW I>E78cAib9z.λkfa+֯^b,^-PՕyoZ8^ʻrfi Ty%vO®UF1-& :IL/e&$~ 9`m:J;^:p<`Wù;w^ qŦ-)w HCkrfa#ָ\тP&[R#\4dGB>SҒ˷&= 3dȅdTO51a]ΣH[.1MYbcRUbL1;>G=qhD!׮Vǻ?f/CRGWb`;Ȕiӱ S<>it{Fs{ս&pQN V38o`ť;kV9ڣ@a;Y٘UV!O `;ZKz }gS.kѓb<_/n&h;8[.S9U.Px ],vM:%a"yH4Q,^6bv:*>·723{Mj>VUuCS3+e(rjL^avqZ{Tb|NG'u{tc&L.}׌Qu[gCO-w9Jpo;6lܯ(\wkҴ^o4*LV Yvy_)WƕB K`e+sCX `mft* U~aٜ1M?7BBB@BS L}M/}仳uo]oGSڰ]鱦AN+l{TNаjTSIY[|vTqִ{oSa}FQ3tMCN }gZr_[,+6ɣi $vC}>gcDXYuL\tWS ph/EjxmI( L=s)C?^P0'mɋsܝR5c<[MuUjy}6{:BRrVgnVpoOV2X#r=?ʤ_z{R#g9b,a)hp"}4$;]-\ϼ9j}O!;LL[]$T^CB "ZVdas8ts !]?#w7f(p-fҒ9\U--5LxG@@>>>߷7auٙt9p>23CCCBRSCFw)*7W,`]}eJ$'7X}+67 42bbBD!vv竫A;: xy 0w;NN @jjkkkkѠzzɹ|0D-+Tᡜ41<wz mww aaxxaa쬘A;(((/y{cc1111aaee!m4YE0wfown4[fo yVVNOgrrLy!l剧/K+FtNWN-Zbo>Q/gwTC}`cVY硳wCQVvӧ9N/[͞<ج*بΞ:``990m, La!8\%7ص󚚞١8 &W +>fnOqpӭѼqҒWu656WbpbU/4uꪓ1Β S))ijjQZddg'.??[[AA55}}57GO͛ooWWWW==piœ.1UOOw}?.. ;:bbZZ6>:=}} |R x]p{ϟϋqF:ĭ:õQē"|qK~^gCўiDі"6TQKeA dUBEѼԭٛڧٕhR nBmԞQDB/Zna+Um93!kd|!X}};=&_֏U{لBW E%swFYh7]; 0^d@}gCO>AKi˴KKKʛposPڪ^J ]}lZ^׺G"[A,9o؜E8L"=61Pp 0eJ(? 4!蚵ll7T2"ĩ >W_A;f=h⧺M`B@)J*/瑬ʖk= R$+mGkS$TUX®KI+ zM,Y>P-&nNa\yӿ_ްmoΗ 0 !HT=>q[!O!䰣J.i$\`ҝF0<:AY!O%*ڮ=u5BA췿1Wh@@Egl+T=;b+H9GL~3L`CsيZAL`T[,J)VJk'O%OW)IKh*dA:Ae2P7Ù"xz2MW$,b yh~ǎ]a/dž[7ʝ]dp > !ç>h,L(v=jhpNXV}h!dlX~ܶ/ʎ+{5\꽒- d򽀼8$S;صLA?&9rM!Q^;:S!>*yQm,1jw)}׾Y{B2p-˷,\XlTT/KX^lI8B>\|\ wrx%]׊x޿]N:)z3iOxTΪgg>*;.y-a&WgF)W[.2s/Pr'H*r7ď4;U (vE} kj44b_bk^V4Rj0f5e ώɩ~rҕKsѼ֣CE}<=7n޼e=/Ic+uV/e]e k,h/ (k>  |jy^7p%h6 gt9;?WCCUbsW~83+MogK<[Z;:vwuDT{/U\._4͹GEЎFں@$z d%c uaF +NNO~}\ɚG2 sDˮE|z9PX )goJUiCKUwtcUBSeLQV}4/JhT9̂HTĹq.&#FNL%SwvZqꍀS֡Yk-K6p5q (XUwmo:ræTq(@Ϊ:G>5ç6hz>%`FN t o4p䴒WU\ޘ%]ada[>,L lefJȦMbSIî|9 Oi/4dKZY@_Ϯ9 hu9K6k.܎t3svSxNu>RQ0Q/,I >dS;zbY;[JٓpUQqmiRU*{)8/WE1{޸K)&M编.?"  jN>K}Xm;a+4 uC:2}jdGj\=@Ֆ'e`@hQ%,q";L)؝&=f;Ь:0sSOnzd^ϺgCo[5C{22vMk*_bw9J}rՃ .\k|RѫߊPiX5HzhiZz*9r˂:4S=ri|oQk@vе@Xc dҌ @#֭go[xm™{{T[71$\O wbƩ)_*_|9}*O!ghibaŢ'&kdxg2bxX>}ISM}tMc0F{Z a3s9*Kr ,$"6L!x1e.ׯԺ2SX{MT9]SĿ"*kQ]Ið ]XMqOm*?'C7@ۙp]}ts4mܕUJ_;!9tr"_B+z씍-QJtBj|K ~o-cJӍU ,p2<,֐q=_3Cao*;dC=f&,H!juh4p>\*tmEǭ tor=j+YF$2лk*~,U 蛴0IQq:t'غ\AB)U+Oox{zaƐW^0>61&x`{hpm__..&N͢wlø敫pMG A<;y=~r DIEhIg)%' [BBJLI Q,H )Ƿ[У//_4뺏Gzdp>%V{LմiۯqQ2 4aQܛ"cN:x L59AP`Iӿp5?|~v_7؛31䧤ϐ񼛺=Uu%+L_ZAi,Sgo^we ;idr!9S3rUZEFC4;OYjl5/a8$AB>ziD_2+TPZy ("%̂ a|`9Hܱ&@@pMٯ3WYyK8ף#e׃D&ID(@#H Qdb,=-3ݥc]X\OîLostQ" vsrRNy}]B,Ӧ>W*F]?P tHJLD3, o,'Y =hPabs: %ѯYnH y5 sx8Pz,dP\ o8r"F ĊF-¾o8jXih}vz9^G3AV +f&Y1c|CW!iiNfclR3I iY>{wpI{en_ ٩!E]墧KsXGqF@f0ˡ0?EA•]CX-?Wt1JtxʥQ1jaWTl}aHRtM>͒6;*M4=UXӮGV[9& ym*l ~#pMZyR5k Wzs8UUHB݅;G3鹩m0?ZQ82"_۝ߋ{ p loerWC xѺ7m  oQ+O6[Bb|/&%MMwJ=<ޣy;zΧ_\8kO/.X"+moQۻV9w.S9er/vp 4;;<ZX33&*1_(Mf2d}mZ=3$^ǍE/=K2#9nn릝,:ߥ -$z!XW^022"a@`%KAsYqxUgqDH$-J1WZ2/umw{S#ZBYX2%%H};Zn7Mr@F2V9#D]ϬiԃXrx2VQϖg.0tR uP$K(a>48Ţꤍ @@\iigVWJLRZhuJϑQd8uԋUEÂkb׽giQVрf070Lxءk{M=/?{x)z.d~ē&Iy>'\vn+M99g}{RƒT'Et,FlRJ6,&hqH]Bm#vDԛ Dmj礊m*zrwn4K߃u}yK9faÖݖ1{l޾gVNZ_b׈gjpH#!)!2"DdF.! X4"xZNjy܊%P%$ZdVC"H0/RE)P |H^M`t,hSkLø0AP.=ryU^UJ.PLN۶=KJ^I݅7~HEJH'FŔggt()z ħMTZB^,}χ>Zk\+9Sϵzba  lh9sNn392 KeALϲW3I rTe\~_,c< Jnj.F$lf.q]Ie=EGo5x` vHl=sדO293vmd I}:"0dYhn#-^A!8:핪rӞŪ81 RAm׷ 'ChK_d"٭P [DY܂EfMFi;H@MKIJ!u:pe:NU *"%IEVז>".+DmS\5溅&")Qk ,)s}|Ζ':).F› CY&uD,Yj"M;suy5)욕 ny:b9Wqi߇5HH}W/ Ilms~.hD{'9UErs&FOǏ`)xh\8HU["rI9=wvIy7NJ6.DL )S.hjѼO;|HHwvO3l3le:v R'(. td$626ݖ1gػ=m=nn 9(ԍQ:\o''a}9,a$am68u_plyoN6B_Et%T2Eq62tg&HA\O7Ձ%#)JTĬ #$X$XЭ vTfq$kDNA r}LQ3c>6">7tY\rIJeX2͇9tcl=]>y=iC0!~}:m%HU0 vvVXɓo9xQ{NMC{R+e&}[P׹DӰ4HAHwSE}S^{(3P#c!%''l*C GIlW(VwVD氄emǶo |Oﭵ.g=ӗ)f:X63R%PtzZN3[޵K_f9uP9c;jNN; -gfgpyyKb7 % 6Z[>$\s9eT#YvJ֬[:k9'a\HT+5:NL3#s3ُ9Gl]휻Cyl=w:>H vB{ڲyT!qni8ʁŞ,,=ΐD2s9Y1)Äc;雪dx)$iݣ'3rɛbDAI&&Te,/+^H.zV|oӶ[fNr"M9v@hH ŬEF5iTur5s%h8 R{{8]9qoNٕʹzh fnboi{dW <ߦ{ݬDAu[#)yZyaG30sǢ\N;buNjM*I֨".iJ.4됬ffvԯyMes˽z*<^HDP/{V'+M8!Jr'51Y:쓖aɪk 8yѝg;)}owUHvhwn p~3\5 m.BdyH|9/{8qz$NۺRq{"K6|X❜z;fEF3ǾWwO!$M$YJ׶7d+w,9yCtÔm'{mwڃaygJ_]ky56zJvUy0m+XPQPBy<]ԛ[f30c``Y杄#RH" kxF23s.nXrNrۗ{Xq񢳎䏒B!iy=nBzHqsw}Gp%<9pQf{.?tf)%>&@b5B6 (وY56fOcr7*ga2 <ښ}i,#< }r&tHҫLjLq!-zQQ)(ák;Ihq$5!#&wuRv"AQ bShqANBF1 'Ōm1*Zک $}|~[$0l&ˑ nZ|a\yf\PY2K?Mc#&icy L6Yq[2,'+}t^I"̌%RF (%[fl=%ϋ/ AOi b(#`Y..y t3<33 7a9\ql)+ m}Һ+Q';b!8Y܃.MMSlfG]ָ ;4B'dZ̐sy7a"GxmdKvfku%rl˺;1BtAd"b$,&$"R.#kl͑*qUDU~EBjp䵑'o.jt%.ǎ( %ZWzNqfAȘxܬc6[7dTpUjATW5+T1VZ9㚑d#nK/FMy%f6 J͋)o K c!1Aɶl&Ӷu㲥)Pm*rb͚&HbN8K%CPSXim9" G؜,&86/6Qœ92D=ENmS#ُf"2bHRjY5-qyca9#s"R͙(C8Ux'5R; Tu"m`jP[&Wy!E36v[Iˇ,ȝuws]dv뻴њE-qBIR$C^:!ͤqr$.jI$$Y$‘WHM%T8悜=J!ynݤ6Wv- 7y9gz'NIi]Qغ"D͉+%Wf 9vQ*Ef)qɳ2Y~;tr=Z0E7cxoǖl\Kf/uUcl2B98;0F@Qr&U1fjc"bqC\f ]sT2\ʄB̈D#DD,pK!05+"b)D5¸dLR([aəQNWS#/90R;fD-HAq`DSc$g;uX@#bf1P*`ɃEȠ W MRNNJf$&.Ȣve͚q4|dJTMV=yޔX+e!":kmY7$m+ycժ{LǨx5n&[2bIs}iil]86b Ɩg%u! mr`F UJ 'qEI^nboejp+Pa\HV&SrC.'W9 2DEk0]s[ ^YO6*aM svb2:j8vd:q$y"8+`D\CRXASW[Rbg$Exa]5RQavg$v7fkGX1m&ʪͣwwi6PwjX<.X_^^e(lciya T IY%_6뎳5ȩdvqfPUik[_@@D"0 yFjf3Cf,5BvKxHրbgBʕ|1J̈́YdV>r|reB!Ͷ*{"g{ΰS=ҺC±c4D $(V eHHg]]M C9CdoE;jH4{)I Ƭ23NI-Q%k'Y}CζZ0 @"*m;6yTta`3~mr~lN@gľ jg |3$Gn':RD㱶͸k"㰼9m%rNi ֜MeJY} syu ܏&CUSK4no{ާ;,dK&֮^>d,LFOէKl]ϗ|:DQϻs3cЃН}Ybm 2y|K2Cnj/swth'lّrYlmV1¥d6\4Vۻf6mppn]! "q$X18G=.K*|dFsv":62F2G21,r|a9#y0+dڞCӢTU}9)Ǯz1I:֣fzH\rԭ䂈klGWf)&b2Tْ28*DT8VGG\DQLPl $ .I(#Bq"TF1Marnqrlɇls?MkK6"gP"'(]8`TR[KɂpDEd\U2HG$V#M)H+$p#T!S%`G3D\ s=ҹj( ɛd{J9U2Ia4{(isP]HcHkkاk V#$Q`(,l3 b VuѲwlit`8.nyc>mNЈkƻGvn$ƱHbҜo9r$!r;i n^ŭkɍ&Y*jAeH]7|v8s=Э{cy*;ǁ7,[WF pḷzso<=.O>rKI"kuv&d=W6ql*2hY2ݑaRr &9쒞+[}M]WXO5kweOLSsxV+7r)m(%6N7n]T ԤV3&fM~o6U]|vDgNE+^5݃!IeV+Iimf eѬTN_BHBK'.^O3vN\{^v3w|{ y<+ϟ{tIX.B["[>$Hl曧4y5ͼfU"s#VR\IhTDҧx\@Eً(DwvZ) 0aiEIץj}ZDZeSSU6g.3ZYԢru-4NNzV-:r#VyBhb28ENAbX ZPY~\֣ۦ D^"2$QBֵU LHVBK'ny:NΞZ9,Ag.#ʖn;lEf=NeVbF&:T ڐlDMd(:$̦6|zkT**",BT.-j,|"&2zFy&ztdE/\0ұEed0B1 0w7xIYL|+)sh*LB"UpYඋ!I"-!h(6l)1`<\š8/64ܩ0 qh)>IbД>&IL=s846OWg$`ԙ$Z^\^$w-.dfv>Ht}rR@QiNϕY>a>Z\)!ClT,Lj#;aa Ű5 )t$FÄ-pX!ȿIezY'3O{?kj2|CdZ) 6E] K ZbJ0yu#X[*LNtWaBm.e9Oo3,{!>ވlΣQFIuu ,N ߘW d= 6Q@FTHU]HQ4TxxhNP" ( y!HG#呲¢>u\0!TA"sb'D§: NlUG0B4qх^Cك09F>0h @####++ H2222$ H))##!!(J++ H(h Y[HŠ1)(J$######*J H22++####(J22$##++))"H*J))++!!++)) H22)),22(J,22(J2222 P% IIBP$IIIYYII@% YYD$ YY e% @$I@$ QBHDV! TT@A$`@YHYPbE@dFB"Q!TB@$ b"D$$I@$I@$ddddddIFFVVFFRRVVFFD% BFFFFP%P%ee%$ VW}T P$ YYBP% @% YYBP% @$ YY @$ @d YYDYYYeYII YYDYIIIIIIIIIIIIBP%  JJJHHHHJ"J HHHJJJH$ J(H(H (!#0 I 0@$BP D(,$ PD"2P"@D"2ЌB 0IB@ $B*2B I C%,PHHHJ̄  YIIII @J,HHȒ$Q (JaII@%Inaeed BBFFFFFF[Ih% YYnaddeed Ydn !YY .ad VVFFFFK ($BH(HHJJHKDA)DJQD!!!!-2 JQ% (% IIo!%D%,JQ+ H22C-D JJJJHJJHI%!sH%%, $   222222))!%,++ H22!!))++##$2;#2 2D*)! HC#I,(HJHHHJHJ2222222,I H JJH,,HHJH,##!!)#2H,ARXDBRV@$ IeYeI$Y eY%Id8`PR%!BBdY eY$I$|/, ==0 ==0 =====5asssr,2rrrqppp?oo' ""(DRT !@HPN9.JB-DTTP> UbO B TJ !D<@ ({EPf^@*XQ@m }*&"@*BP(G{S_I( sp A T~e[ {PvADa@B!7@#B {PE`DOXn!D4aŲ(( - uܟ=ٶ!~aQh=D (f̶wVٰ0bQePZ!\׉O&#@CŠ=?a@W`=1}XTAυoaT<G̀ h|YAEy*A?w7o`D]@  # cǮ@X ,dGXՁ,@v BXM _a[րGS6DhupPG@ (D#T hV 4 V7@rL T>?dgw]ɮ8M97LXl˥jqsh>.y9#rAfBo_(!]{k6n_o$prRҔ W?ͷT R>z7_d۔diEY7NZ5첽CNp0K}?CR,`z b>e"Qj[G4<@ِY!FPWx̞YSԁ;dN)hl9,TڵR~o{tVxU!x/Bvy^xWX>зy)ѵ|!?/vVd.kܓ i ¬1m!Å"xP B;\j {X;+<yOnYG~ǰu%0a@v6u|>=OaBqxBg \= xbŇ2BX+ 'ŀl~ h% 70(__VTrYWM6pʢ?7x> x*}o١B7z׋(hDgwE1`à ŸksۃGwl ʹ/,Db$ˀtz<#bK{b@# ;  GK͋[Rϕ>f志|htv޲=,+Bރ}:.j#9`t}矰 afG}.=jLC}p~nt+ً0o{(63wE[=ĝoaja v;'ٺ0gd ?#; ߜ  t. %Aכ-4YR9m: \p_ܩ}%9}U>8o1x2Swc(='1!%ѻk"̻@{ 㩐A3 Lë6Yy8pq!鬴9' z谥Pb1́>Տd_X秶:F!x>yB鄈p9tSv-6C\o^e|ɒIޣ{7'yJgWNAk|6KHYO< Ѱ2 %\e.n uh0<܃zG]`_6^~o^RG;nnUBƐ`,)}| w;͓™V<x9Tu7г%Pn}%nPXQyK F=e|._~[(>eŁx5z;5 8G;xk*e١N3W,N.maK0 P+wdH`N/`82oO?;=RKh,ȧNF>jEr1G@,{q{Uol75γO Zͤԕn*gړ*l\Q&MU=3:$䊒AqF딢/G6^i"V+"2I3=!+ ~Z;"/)AN8AL>9b:0UT#f,qAvADDE K, ܦp P4 v| ¶|X̰@߷ !;A ;dC}݊_IK+kqܞ` /vAذ|n"nXz@Ah%'mmAb(!B"K#;4Ͻp5*z(/j|7T,ٓ;Af~" 7'P_L@88~)SR9өG/@ܠŀ.B, A "G-N9.E\qt,@o] '"d'B=wnx"HܐXa8"I{no3{Hmޢ bGX-Rbʼnm}j< i?3DYķĀzJg_~Sn4X{9BH%1~CѐXB[lD!&>ZtZI4v 0}"0@,:{nEim]5#=|Yt,%LCDŻfA`;wL_ǵ7 Lj|g!NB$3?/[ X Tgb f Yf YHx|,-decc;~9!jd@8j#" B 9cc~4i-G7,s,1oX\4p}/㘿P\wPHB9{Xį%wo {_ ,B?+LD#vڇX,67|2#Arg &\>G?7wΖ+P<_} a  GP2. |b&"෠NX #y?}`.G@39˨53^Kȝ$""'! tɑoi/Mb!CꞻCou4QiQ[V3W/0b"A` lJ9 3< wt%nm6"t;rgnDN*ts{'#&I#-r"NN@u26"y-7߼]M7{XbsCSVaRZJ/5֎BNjrW&~2HG,;'><D Y3ԧ @CA;H"K%~WOpCP{I$iǑѵm4qPFwͦbH%E$'1WTUMkIBIS;Bc({gv]W=to5o\,0 ڐ#9?dǩ-lY xE[Yɮl$+\EK&D"Jlsmp"LpؕŲ`uq&mdlז7k$Tpͫ]تd\$+%p\G;-d*qþG<bYyo3GCqd, $md.ʄQqqQ[@! (P`P.r hOy- T`VA!U(AD>DC {&`faku vL@'ˀE,Am AmEل^\ (DURґ$ rW,@n7b@{՘6]e0R ?Đ:E@?W}XDONx@$e7( NyDq!S8AouCϸhV_8w5`2'fiZ71cd~XXB@->rȈ"],Cⶵg@A,TӠH ,؎ Đ-'E@HRuYmL#.o 4@ o=Y=TfSHL'O W@W,\ӹFN^$3 Ē&!JLz_3Y&>Ch'|gN;O&6A7bXOew_t L!n;ٚv`",?^aPF.B4 h`A:xτN;xr< =0 awN?tq`@ܠ@z_PGDž@ @,/Ѕ 7<@>O&:O/j_Bu ~ktPu r!:hG@[I,8(B.T,CD$8(ޣsCMYC"_.?*2%Ym9 187'6x7z=?s Sb(? ?~!YNq(żC,[w2Ɗwb?W9noMEd~Jh,#.!:/jrS7faC2(ݙ"sMwkB5忄3 x;3,Yp'+\%mВ85{Eyj rޞzXQb@ç: wO!438.#BkEq?y b@ @L8wEZ%t=N'xDäIʒL#!ᔵY- &J?n~@vpXcs9cg=g+бĀ y%׼4PGo 6@v;1,.B*tڈMA=W"H'Xojd7ax릹fy_,@&~w>9b )6ۈh@~k(O>ȸB G$:pFIzXyn^:|$;_FKcqx;xr!;ruvM (̄ |Q`hGqQ DdBIi!$kk@ hlSa3spnO6GtňrH, ?Gp|H$׈q%Hߓqԋx [ ;z!Eؒ \9i|2hrݓz$bY1Fgv WD4@[ݷw$Y #a) :'"?!>x;|xk 3aGQo_SIa̷`ݦ{A.@D|  K+?빺.+Kيv\!5(/P_@DOٸ`. "Wpo ψCx8 -=j\u2Ȱ ,>Y$_Gj>t7@vOS**iE?)K4,K f",!t$ L܀7W:Yo/` q0J"!ݚ #y8qs4 +Ս?5T@E3{=SDQm-G-pCxBL\;/iAc'x[ >M Z-zIo?*IwN$v#܌_MAI^-L I='cQ-{vb[3 }Pآn`ϗ7f.HEp DX>Hj L,5)EgֹǛH&Qll5'frÒqyh; hූGƸԯw/6,\H@ &V6 Y M8?_7:W8QQ· oo$Q;:i%+ +woG?+֟l)=3~}"!eXZ8Y84ߎT Q$I,u1OO$1ny򾿮8oh##.L0wBJqanZi:`/cN6~o/^]S!IĥOHIbVhF%j</X:sb&P-{aĚXSeiDe6NKi h^ H|Γ[88@QvqGOx]xT`h{C%m4 7H>h &$6uL) fNBnW ccX"g$$B$ACޓ=sy]`7S\kCp:p=y*u\vQf=.F|_*#Ʉ}%j2<aE~?UNHQ!fO6"Ԏ2TÄQ .HN$ׯjwרQu=zfv9&vHaԣNx$SPTL'8MC܎SdE &uC0Ū",a m\ L=ZW!x]/wVHP B -9 ,# p u9dl)kDr.\ci!v~H/  W"cHַ7j?67k=;c*'S32rDpU; ֖EVTPvEWӕ#831pQAzM6rR(Q= څDQ1a=[Śԩ`n>+i\Ԏdl-Qχ"!\Տ]@QT`j?T{b(m 1UCYI(D9f?D-(r{M#mc\X8+lpxep^EuHDr9eq_d`ɑ$K!\auUrT\7&qHjbc"`"ldDcޗIHq,ȹK=7`2;əQ4FKر  Rw ZSD@[?P mt℃.=5t_WF #6ݪ (:9Y=LrC1,i,῿fPXA?L0:1wHt !pn R"dO`%$]0;(} Zd@%RQ^{}?J{ȦڤY{n>yf$@"͖AqڴM56>w8;%p@c?G1$H%ܢA-r k,I%3"1\Q$j4E~Q2"GȈĉ:MiI%$\~M'! iU!?_?n~[ MGRZ$Jn Hc tĆ2?yRmoCF8gԡ26YȤ}h0@ILuLY1Pu;A"O:! ?~|0C txgW@`%\r 2/I&Ȟ:TbI&ȟ=u5Y1,Fn1,x,K<;&q=4|Q"x=NY2-E #$oϪ𘑾dX?7l-b,dcqȅhj"4! W4iw?۟ *In((?>~{o pPo2uw fkj-E}4Id5#ؾf=1XȎFdG֯^(Hsjg&ʻIL/Eu`5v 𰊠 >I1,G(G=j"nmٻ$|Q& He O|![$,:HZԒqL[ȯZ P b~?\cBĢ9@<&%6u9ۊ]7׾sTvg6~˿಩8}_@.rL~܁Đ.G"ym,|AT:ؗ R@d33kY'w)1 "J,4$LI`$Y(Hy2 $S ql.XζH<" %I$ob Os=X̂[8@%.Dž=8ܩ,GZ'Op?OTErO꿗v0pK<,:4$O_i =,l27fTP fYlk5>}= Tko ɢR"F?j1+'$7,1]t!$\`\ xI!%HT ^V%eJ>DGȑC?4G0b$ IMru/ jrHy"\\'kdsl*$fhOlg"XlV1ŮAH&ds;yml:"K&$AI?^ Gį+_¦.]d-0rCaL ,z-%2$9 "!_8 p{~ lmNۨ %4H[ëp%/[qh.$tQ=ΆFY2́@s!rF2C.?'%_,J|LAk91n\EsTJwtEʛ7{ȋH:VL$jj=zt"A|J樻 [-"dyrDDB>SDŲ:de$4ZT s"u(#WCDE$&̄RpU0Ab`‍jv̬p ًrɆO6&8~(lɓ*QIQ ZQr&G p,HbUT* ʚrd =28rLPK2S CD13!#QplqQ en1rIRIDWa5uNE09pqʂ6-Bl & G#EAVH(G*A!&ȞIdpmh-qHBB GEUHY5+ "I/]sLM;%Gava'-H*llR"#H8)*zuD:8Up3W B9䋋݅EQ# ,X)!!&Eݙ@~ qDP8r \@!Ép:ԮӁ߼?=9Ki] E {o,iC$?jg$ڿG?OP8G&O ` C@½t® 8f`TPMDCGBD:XB vP> (B Tx9( !A;(zhTy;@CK*R=BsS Qp7@qhāCp)XB"R B ՄTC@P C@lghS B#B+PUWUP)qޅ̅UG!5 @!_ BpʅO^j_M E1/ @ $ĄC`g. 6~O,C1 6 @WFLM }P\k,L@GXGQ JPi,9=.?Dm}d&s]n`,sva  |XHtbEz÷|5c.7$`)u-V-ky}ׅv&F~-mG#טp';_6<7B{0(m}}hp spH7쬄 Ǩ,md [pD5{!Gy~E䆫(ܨ3fܑ `9u?ػbصއ}dH.G"5{I~o&lõ8sTڊhKW$$Q$~9LF%F)-s}DhZ\iErt $-T4$+>.nhr9>n^)_#=l2+CR$?LHWLL,CAe@ oM:x@W-l_qr9=#|v&Ծo:qbI}S#ʚdD LⓌIb_#8$i6&quO"i5g lԷ8@)+S"@фaFV܍ jpH韃$X&5S*dw!w/iHn~<ZȂXQ=S׼Rj˚]l@6LA[Q%5{[Kg3w _ĐNG.P~e}?~= .3pƈ'_{kMNhC {{s<텶P^RfEЃuAAED ~Bk=Wө=8:V7zFҦog Cé%ֻjK٠F#o"&@zHI!.`ԉ$H!m #~rܐ\݅^"ɢ^lȈbI SHjL? vS=d?]4L?_>7, i3@aHg?{zM(kDžtp9S;L8)~$QADb Y0 LXoo0C~7;\փ[wx^8Wy}m荜&kaÑi= L}s YthY!~ZR% __Xl1=!Eۢۊ`㻰o-8A#M҇^H$XHG%Ъ Rr*hN_ .A&KԺJ  σ6ar[}.t^hXy?e_x\H[o՜ I^ڴrӦh/٢Ne \rR3ݐMEZhܩp 2tD̬r$ڞ4U|mqț۔N5vi5Bg2YM~i4YM`}>5\~ M|?V8N@q &` k!DŒd#J֢ T]*85X1:#21HL~89 FYbP&GT2\"Y$E5%$$Gekݳi#ƹ#83dpa&'!Xv ٌA "*UjD$ֻxyÎ:k-;(]H8+vrG?P *OI[$r|sgjㅲF[f|7`1"".l/=8sA9rER~yX6\\FBbAȢ&TdCӐj..) <,Ue\ ĊB:$&lH.86dQGƫr5"WB:֡O!H".jD(lAm`1Ω` H\t@m ;@[Dڌ{m!Kfk&0]CQ Ux`Cό$$^LH,zQ 5:jP,r#*g"?C륄LruV[da$RQKL("/A j/:ȋY9fӯ 6HD1!EASR\Wѷĵ6LAKC9Pܦ9P/&@ 9N;V GiާmԿWl SeHa܂G}G9 " ߺ D ѐ@wFꥷ! ?&!dGT'y{#= 8Ps4 ]2 hM$t^MK](66E=)]伦RZ_z/" XYHQ`!,_wowuCQ8 =.Vqc`mdτp'u>M`=g~/{9TSU~m5ds߱T׻TQqrIH'_>^*_?o)^*_.qzWӞSj4UJh|nc 7!J^3n݇ sX #rC'rOÎU:mH绢\6ws<z@} SDY ;Ó"4~}ۉfkᝣA8.߼y $|\ݠFRd !K>fM-p:e3+\Fosvf ivr}R;$&~)(+?+vt8)`KX-O̶n3K|#x^oxYg^ -?wh*Öܐ6 7 !às;g<ć2]MM"WlZd/|+ߺg#a3Ȏ;6 I! 1dIE\ۢ"Hs!LA" z"XE3B-ӧHӈRsj "5"7OtՂT@B$$E:p @yz7!m"X- ((b'yn(~e \mԇ3vw?^(v,//6$܅u{/ݱ$l+ݿؠ "=q${y9&bA7l6wtz.zy]:G3i1$}AXvqK^328^,CE:(+ccbCo?ib׀%{Gcc~(#of7>d ;Y2wNᵖ?G`-8_u:mX#a._a+Ɠ("*$ DIP=cpg)K }'}A =gh A'y-SL;!*AT#mA|nuBEV{[8ŕ]^#50(;x DY! *nCm$Y =<"r I$V<$HʥSB,Ҕ Ifl̶wln;4;U;3B)9?;$'j|^9LAf8 ljn<$re/?s3ʦ;]$Qv3yR2g.8_qdՋ$ҽ7 tn>a-y$"fob,GM X ]Ny"DZGA 溿xi H'i+ɼv}/ghjb=7\\")2@|XbbYu}ƪ(wߣQ>vieo¼*.Y>2!4B!7RdKX8^E, )Qm9ZWB1٣o?y\+},~/Ė$ Cn~s%LԆW/KR]O]<8ULcВ/u\>pG?d嬐<):aW ue'ݭ0T=cڅ:#pK"Hrq56HYpd L6vkHל$Jrʄ$2I2(+[ɣDžӳq61GpU@3B^̉d8Gٓu rLS J86\Ē *FŒqq#fLPRzH⪊ ZfZ8/_ 0h$(mL&,(wSAUFUQAUdPUMN1 `u$ufI#"nʱ9~4@`gH [ dW`eLKf\V0Bl2KͲWd?^aaAUtop6I6!1#,cEuHH(cV */>ݽ>l &## Bj6j][[~_FB&Į&4k>c^yϟ8Ŭ 1 e"A+nH/:oՎDp'o>ξoKK|%4y̲ͤ h/ KD:W ׬[3#8p5HXA G+S-eUg6n u0b~LȠ*vCUWp1Mr"U YQkr8K( ݙ=q3 H$_P,wY b~#$lτTxHy aTEW59-n{W51HYVQ*Ux\1u7 3+B!vb.FՄꥤrHCBGW*dq^z LDn>5$R0HSf3QvL+2 !٘S#3I5xآ"8uS66E(Ls $}Hbi B=p]s=$wd-+9 EL[n7lD$b8, M>zC|C.|]wļu uxX@>z0r098D1@|P^DCD q!tgc`YC@ K<3Y 0!RX>,6~N?@3='d 38Eq):| bcXQ6){r`V;(Q'~H}WM$vkwS .gECTGwgrou i6 & fff'̧=$hTdIOb@=_V!ύ1!tMXC5ͭ"  ?Z  Ȅ9_L`J'̉ 0%$9ɐCS(wO .^ nWi  `CI2H]7Lqh?lH7nD;bM$$=&%$25"iS tVH"+~;(\U"l>:dbwxNK>ٸ 2d:6t6?rl6FƒԂ%Aw{zgR;tGWv[^dI0:.,h$}'x`  ۄH͝>6HY{Vlr&lco?߫dn2 ïl).B_B_ӴNW8`5 Ga_#v{L$4_Xl ADSସcy쾌"kש{%`TBP A{:'4=:[Z(~;'%v5h8Ow3rY OuҢvS4:xMsr oWlA-11GKK?5+B'^Hq?CACX'aI=.c$x4 xD?1U ƐwϟcHBr -&QOw0\\!TsjA5gv튰 aݿ5:I"΃;/0QqS)BG=~NLz7{7>[˄Q?z@ ,CH̹ypHA݋v44P`\ФFO>l:wWq3s >f8vi" ^q(" D$[_u_$Ȑ[{oږZj5W"僃߮|ΫD~|4n޺M{_Ff6(wJ3#Y$E[;ފ$A-nE }w'/[GxC5?pHq#Sd!|wHD?dk8=eoq#V %ߞ!Öu؝;C,Nt Hc $Iqb@5d,āY?Sx7><a2ga2 >Ñ%"|'ZI G[/uB 0Ez}@#<͞X}C=RF4O/x'sI% jU!(Qa;{:Gb].`LX"m$1,7\˿ԃoQܵy;͈cdn# |ǣU\ Ӑ ~g؋:!!-۩U?6 [O0ķvaؐ.=no 2ӠuZ: 1Q;:fKj/ї'LC A쳀xѿ@H3- %W o@" m䦩m(s" },ǜ [*q1\\-p9:ؿ3r[$9٩=scAq0*ɑcFiRHr";f JvڏkS@6 UE\{=EqMxY/#:mŪ ݦ/բvLYIH^B*>QXjxm~%lDe(mr- rAxp.Ċ"n`lt%лݼWz/ݡAǟn\K.<aИKLswn% }#]\Ov`0qM@td?)ow%İff cuEk哒C̒ 6hEBEb m ! Kwθ`*(3rRz(-/a}$ qb 4׈Vn`BB"#*[FAQdP 7ϟ:/ K}Z.QsPf1`$;8BRB%i}?o%$c "Vvp(gpOCi5SHA ڷ.`a%[aP%#r@ !9CS;XTDanXr0蠈FBE%DOGqH̻%.e=Dm>7[ f23o`G-XhBC;+-F~ "yI KM.t3gMs}//wM71M hvH({-AhLg+T_Ĩ޸ {Yj4n9 %gCc7o5wQ`bx!ɜF9 1hbaа;R=}$iHC9 ִ9t ÁUd쩭'?ɓ.ZT7U*hX; tԴ.mISD&$#qc)M2^S+{SBYRa|xf߻]@e=&%q؊@P;(o}- .y[rR\7C})QTx6ȫѢ^=p bQS.۾Oq;tY\oKEܒ>Du"Kk<pxGzZFM@;/MVl=Я=yeD$YH67 [%sߌpֳJ2'q0Y#2;0N6RD©|[}evdݶbjڻbMQ8s"ȿ``W/'U AYEyއVWju{9:~;䑰DߵN $ FB;u$fU?z_ |Blsd5^]dd_ DXrL_:Ҽ5k"gjVvvoMU;5}W@e ePYe縪 b 4ҳdw$/mS w$]J`oq{B+8-ϋ^cGVz4g(.~"Omp O.8T'? 8!RJ+I>MwtϨWy6J fuID 2zpBpቔK|n:drKXh_eK`c_/ {nҢ;A$_js7bkA#GeLUD>q>`"*"Zfme(Y"8kqL8R9 69RH6x8Tsڐۻ3W$\$p\%ț`2QģJeS9( ;߆]u`Z\zQXˏ LKJ1111-BB]ypp$ " TP\9b쁶bv$?!aĮwJC#q刢>9Zʍ+Q@\b#kX T:oeUf19ĮMLJ- gw\Fnَ-:PMQx%r+]i7X#!̒+$;hVd #* -6[V=/!'-)⊡QX7%X~,FW#UT"zb!6rxd;|{X XSt;WKGZvr7Ԁtρ޿4p dșvo?|y[ & 1@0] `Lax;k=OӍQ 1mtIQ߸E$ >3s,Fw6;MT_y9$8NI=[s Wv8h"1cz_n/ps?nڐs׻]&jǬ$#}Krd}ca'[LE[ϖ"*hH"ܯWB :}nIޝ>7.ge9~=q'>sy!;H Xmkl IsȣrkSvͿ[r:BC:WPpsIN۶HlA xnM8 N@vg!Z Cv08^6$nxr)W,AKRM$=~@rrIӡ׿~&Q%AdIYߥĖD+˒=X~?vц[A}B&B4 tޣOZ#`K@$ziHZIQ`H!y8(iWX~ݕpA( BA5 0k0zANGpAe9 ۠@c|ol4="8x`F w(ڲ|]VTBH :Ŝ}Dͭă\q=5w7Jn _3^wfeTE F\cV_۫v/:?.+s d9{Ay9pA(x >"T Vzu-7MW2\@%ԏ? ^B-I ߿]Pˆ4?Bu84V |O8cr?)n =!]]йs)~o(OT =ei}OC? e|2I`=Ӱ`wL+fa&d-k qPIoo^ IN2Ӛ}xh9'3*xYLj&L#EH\Is)xOID:tpO )D#~mx8s"Dy/j}Bȇ8혐i$.Luվ7M+FVP—Ev~\ `.1N [|ג$>fH@,Sא ;_'ܟߢ3(';@ۑ夌](} WٸL$tw)  $#ls!!?%բw}/sՈxwH"y/21k+=/NjpOò|eNJ,>Q ["gJAme-wpXصAD=P59x͘{/HA0<^g\8Q!! ;զEq ȹkn{NЋ$Ò/jfRL,_x峴 ~ +2# wA;TI'7NN3 >}"r9ޚ5nomjL:/e Gfw/ \N{_xP47⢤ ,JP@ eA&OB(K">tw ܱK?(F7[i5 G%|$.CX&'MHNe :PQ${#ZNQ$CNt?\ 7EGi= 8tǎ_=Q93qlH`{MÑ|@B_r"rZ! \,.K |_!d6skMd./$n]tt| '?&mrx4F`>(C;tv{\>]cX;k N&i;%}#|# 8y ED$A#e<{!̑.S-10ALO +sB܊-b>+g1-`Q^YH(Gu?s̒>S; 8JPABD|OX]{abC(ڿmNz t]>U <I2!e%2D=_^EHrƄ Gێfq GḹèDAQ ;kQ6(3@EWQ@H! t&Mq%D4ߛ 6)?/{ȴ+EBYw"& >bfBxuxMゟq`@3Ca20&]3k6OH._bfևk ZL<8 %Jr,v$,H'ċbĂ~zΒwrD9>Op*:ޯ/G>8_m][뇝 p> E[9a &g*epܬgY?LqTNBy׮xE''$䂊dQT$?s9g#&+X"(8b kUk.Eӟ@||h D aagZ_/~WN"'W^yˁ?) 5E{R'mom$$ , ЅEm[GX lm+MN4nQ2g'ClA-Zt!V%)Hb|AFoIYm}ڶS,Rp4+raX ,Xgs]s28|?{4&8`<8PZ;.#)nDW"{9\}JIUC,MwH9F$\SC&\McY-B+d=ggCʜLb(bGeb)f_QSX9#TB(G*{9?BxҦPS鵤x͂UԭASEzxC"Ꮹ$O3S麩?C". f".eٴLQrHybq!Rvfc #9B L5=y8|>> sw6 i ]9+DEvޙ;ĶF0w~[mAZvSFi31oClEŴ!ϐSP䞯aŽȒmgrOm=닪l$H0 Fth -8˸II@?&6 Q$ib#|ŕU!@$0(wz@B@-}S\-PEyC ~\ mU 9e&n-R/l<&M:fx`siD,ۻ$e7⹼ 5/6IrG/* Ku"9N^ĤX X$?F^SVt9ཟJ>-bQG0Amkd(>;4ԳA"%KmIx ?iQdռ8W6C|(W Ȁj! y~9PvrۄƒAADoŁAotp#BD>40`zK0e zmH lƦD&[O<5^D&Iu;tgvDd!<.G]t3 ˭C}g$Xw~y0QVBCxÎI #n[`RG!R仈=x8h6!yzw+|z|E9:Ք8s9wa8swenМiINAaؼ塰F sDzgxwXJ bDDQ^%E tXυ"u5N4HǪ{H!,GZ}ބvK;eu8vO⽿U;c qp{J!eKN 9j!0഑|Ii܅saF>սQ8"Iw0'>=c]UÑ&\ G^g$A/ iH4Gʁax`wz>^#sǷ\ $.:@懣/XerI?PD(Q Ap8Q/mUQ. 2{9>#{wA_[l|5UA{?x{-t [(84$b(̠I2{@(9DCkY%$|U߯}ٰ%8=oВIw o"I'Ռ@[ns&w;s{ʢ*9$vNG t*w-$^\ kq䒺o?x 6Y;J'u)g=_֙! {6<`7!߈bh~ԁU.CeB!!ti"֟V(9@vN*XwiT<{xxY*{.!/}hJ-NSPQB,[\!*e RBґ;$\Iڦ46W !ERuE?q6DTn EYཥM>o@rE>oCV2'셉 jnlAkWr'uo6ML@&]u#ܥcqD#ħpDYD>7#v90_ 9c`pIAtd}jvbAЅx|ߒ, heL >~|jXNB@rڣhFwk{nj%ϥ(NsNpn~_ѪLHS/6b@[#xXbJ]s<Ӡ=IÜa"BaOvkrӇ#m:[,)pog{/M;y[ __}$]qUZ8I!Ӳ9g rϰpWf@%ozȒAoXT^&$߁zx~׶@`` w\ ^:"׳YSjYo_jlOHIɄ?VG-#_/#(i$Z;L$T  J7^!Y¨x9Ksm?u{iӦ9}{goQ'F!aw jɈTSmN}͕w-h}Ȣ4@D9>Ur{֟Z6L3@^"AD8 G;($]ւ!IU(Y!B &:\R&HYJN D/nN Dzߍyv,][怹 ,Z@7;UnoCTc_o鬱|(FHreESPc+B8{9("/h)?毨Q&¾2uo6I%CՁQ"fٓ.=vrI3[? r8XI1#DuanrYA]Vo٧\jI$>_hk Sy'28(%f[re'"Ob#r#el v YN7F&qŮh"_Ÿ?MOgPAdʁ! Ȁ JCqC'?{n!_><~Rj.M9=[tSl+?23eWS|9+죄Y(2$M8E*,r{7ׄ\MNh) DztÓTa(oi亯{eBf $ {k ?zY4A ^[o\Pd ݩ1U_mͥG5dB6eExŽ8/)qqDSv1qpLm+J"X9q{ D+5 kV0*zwg9F2{1+ 8IerOhD\=>$yͥ$Eu#Vs#2aG<bN1)O Ĉ"Pࠢ" Ȫ)*⢟۲I6 lݵ^Lۓ bjGvIHu1Y3nÌFǭ:" $|\P(e>}(z竟ׯ 2b+ݣ( ]8jF'\^IlΔl"f}&eR"! R">L-P r?k6&U1>!SHpMDd!l9&$fjd.)8jT1*fIM/ʸ >لpTEp\YEN:W"mR~,dAu#xGɟ{Ba?$R:k9#Z͕1z$FGQH)Klnz)˳[%Ȃ , ֿ3cdWa+XIaFpG Ϥ9]#pZa$ I UQPLk#g-|FLQE\ddf 9Z&*E&$$q89ƌEl 8dH >R7~Mi꾣&DPԣ.?0S0?mCrXry}{ü:HهE mbvT!!hLOfu2Y3@LE0hС.QAD.`gT 0=9Os Ϲ0?L3ǶΡ}z?'Y+@߄?"$n PK= U0 ?9 `=DnX" %0ΎaРfyoTpxD z".bSB'5fbYo=Əo3H1,\f%zADKQL~UMmWhW׽w_ XY5Lލ ʞSQj,$Z 9oŖG/d:$q $] >U@7{6#%гK񃻪t)%~E,I?cp&Ә#uٚ$!ާm$ ,&XCOJZ.^o% $ nrL7qH=* OQHǁ 1)XĶX DLy1#9Ȕ~}4S?%1(yNEu=/q~grHIozv =B'4r~CDB{|Yl. d$91H${D6=la~> LkZa7yǁ [ս yyxE 5i8 = ˅Kh{O yGD /\ vTPQhszH}"(Ol?pmGBA@`Mпvs 빟AaO熮?\Px@%I:@Cy t %CD"9gex/v@ҏp} nޞ"?"'B6 $>GͯI\܏8uq9;DlzGWU(GwY"fZŨ%}O'fx$`麟749T&5 :H`E)yB.Y').UN9djܗ{sE?ݫdǨD5R.PGMh$Q5%@[DQ7Wr.H&yݑbMNWd}~o G\xXXrgׇTo=g2;K1Px g .|Wg /%$uEeo atx^ZzAC<-=G{k@7Гuܕ޹Q) ./-HQq_;<11ic\^v9EEvΰTYR>7雋aBfL7\-6>#I+OmIz *\Q-S5:x%{5# s/t{*rG)NSP9ɰVQz{-X%S`JtXԘ#{x$`Gv<|.dB9/h^};.2ˈNH'?;AQDgk 5]1_A捩B轆r/w[<^ǯ{G32Rc_)1:m8 acϡSdC˪gqW@M&9s^MFD/@(<&\X`-0eɱhrU ZVEٺ,:]t d IKD Iή4GLmo1kN.her1m2oxWwMAOQ5dskgS$l$'/#;?v*b&$:5ǏA܂OY$.Ǣ5F!Spϔ8#|i -@7=]6l| K4F{n@Ls3A@0H@z7AH^P{B'^7HPq%!s|W 3y+@f,b8L\%@K.Yo1q] LAS%0>s@$aZ$HWiFh]--ͦP:lXz<|8XP=5Jϡ29 g⡚ w)j3I ZN#j n~!"["ȇ 6R6 C LP㍌Q%v/'}/H+rA[}b" -#.)חg[wT&v^Q]^~"N}|$(~+<Օ$ =qf\e(evəDHADbA7ܑs$QJze؊{ۍ'G-(AUP"`]r(4]P"Y"ƈ}}\i;$9t^@jhB\0 " ~l'A#)B HG ݬ06Vt:Ë,=iȂȐGDQb[EKuɱbZmdym{>mS Ϯz6P$γa̭5DU~DG?p =stt8Jp#|!xG+yEY0Il|K"Ov`.EbK- }+lZ#XrԸ-^K`*dakI1Mc"N=''Yd,Ŏ{8Î0-:ޓ*K(-̈O$ɮkR a5퇮[٫adA1Q̲⊠`A+Z kC]CZI1Uݐ%ҵ8ă 쌆r̪8q8T[3"∣~7y'&u # .=IN5˩T=L͛lq^wr#wwN$;4L;Cv-,(֑OPudWb/#Rn'ܛ[U+=p>-kgㆡGDG j';P}+H#^˞nlHؔK9r{pJ`Te^tn]7"aqUB3ě|2!"̎D+yvl77`Wz6 W OƵOGqƜm}"RLcX0b "XX %%VĂ6gP.Ow9iN8٘(qL~7hU*CL*FɍM1]$*ob29!Q1`B$r!eJ!_I1 F &3iYF1-ָG1x*uzEs<(Y\I[ 29yԣJ2(L,4rPһ=lsb&>qL5U" 60U&HL$%sv>ldc=0 kR 5XfdCu"I?rL3&pf$C3*.igEOru33??g3dCr2,fJDjڨv` A eD`C|^2XsbIH'5ƙt>eq&Ă3I$)&>k4唿Z2s;fle. mk(N¿{jٿ-&H DZz5j?FGo|' ~7>=Q,'{7ƚr"|SlQ`/$x3SC=x0ڍ᣸wR5x4m}2xOH}dA@I]HA$Hӡww܎~[)Yd9#s淬V\>=T=h.zM\xE6p 0q?3v{/=>x[ ;fӌ| ",6NK?!L f$s0XO9/yRCѭ/ z~Qs{^-\O~򞯾q:bhf؄!,8mD3']߮M&U-` 3Lv]G#ny( |Nsxw=ƓSo|1.^6M*5r&`qyD+0t J>P77S9 M.O=x ?lg6G( Ⱥd\eh٩h4P4J:ego!TD|W`N>hvPڨmμa"Mw$E2 jtMKShiFPۺ0DAye ,>A @'$'/&/4HHA}'vٖOA=iB}W]M-C<ѲV:\ZGf :ECH[|['B19u {}4A"ZF$KQQExDvM@R]dМaؔ]x&!ؔC塞6.Yw~><4JDYx4DvâD, OU+@@C8Ǻ60;x}e@"GnpI*@WB/5ubWjLf\_ykY!O6y$My$L8<NS?Rsn2N-^[}?gu fbH DSF(a7(B|G8W \?€Ht9bT<_rάNYv| .Ks"Mt?Q3ARVgqޛfHw3!^:` ز8!VwS÷znF]۰[M5~ٽ`$!m ,I5UQ2;sݫ+:K^ JI9. &1f !̅O QvE!S5| =p߃k14č#ϲSy-඿ְP܌(:id{S+ ۵u])cy$kۑ˗)5:?KwN:ppuěhiWw}1B]wdǐ~J߹dIs>o،;IdLr%?g$ cCZH(|Zcm\"8w`B+w`B+mkLPrpžRbz(ܫ~ɞӋpg[r@hf!PY҇(J<y=EoCxI ~o <!ǃ#?r?\a5w |nrH]U~NGok .{}yQj4@>G8r;IChr6N,A-k!g_lΝH)<暐S}=u_忿U<nLd28K9$wZڨ_43t-d=Ƹfī}.0%d;zԖN6bU#>wڌ Kyϛ{t0> 0<ω~}6n&iˤH Vr0OÊ"4he@OnLX hMub{BnjF&k"ˮIHvܨV.;s:b gfP$Kʜr0bJrt{9" Q3͉L,.S匎aGؾm  5n{ Nqxbeg ,{-r!PLm6 X^Zq%˺p!I~m#Tdf8ePt}L9P8>QV"ĒڎFO;j6ƙ}" ,eKs׿L} ZXCLTe^Veeu0rHɏ C"e:Lt`D4;4j ٌf~.f\K'`;Q?}Oz4u.ں'FvZ컳RnQb2(2cbgjkx>PͶRuw҇7o;^$ Ҳ7q#Y `. 8䃧(5ɠ0 ;2#=MI<{@F)* ${߽׳[%i#hsVkӻ_xkx]vNk¢q3nI"~aG5Ha06vŮbO}\Ű` .ÈɃ2<]DAq#S59~T!%Ȓz ĆE"fK-$ܝṝsDG8F3/ D9 $ɶ9\5 kvk.pȈaU.ԭRzC'&f.4NضJH9:   (@: 1@CMH9f~Wu>B< rw^ KtcmMαV^RT :xPD0+=ʈCW y?kZи7$>^$Ej|eHJ·BsyqJ4⦄ ';w8# 1/^_23̲P]2u>[۹\`FNFN|,~R `┤Aro`b|Tژ ׺W9!\,r6G][ra009_h:#|pߩFJWW^ ZC.Ƿ7:qLmgb(rڈ\z;JX8 G`VtwE)tG#׾"F GuIrO/9 MKGCMNwDY&w6V.K{7}E/?\%_|tEuݮ7ax8\h 3Pހ8M=yHOP U}@%ЁCBT xP{mEL /a DT 1d ~x@\'_| !Gʀ j=D ? {Tx] tq}, ">, } ?@MU;P€n  ;^N8h4zHQecBUsШ£N&@!?4?r4!>p}"C!a}W¯ՄDBB/+zU KGpnX}~C`WM\?K99WΠU!6g M5 (NflYT&yiCHϼ>l̊!AC]*;'c6a{Z7"Lx/%"֓"7辕|üt^J~7;ȶz|n1pp`g]D"2h<% H( (wߺ-k&!l+r1k=؛ hCFjd&?}QX^0Jp][@<@\oȻ GU\(q:BTNxY#YJƸtz(2>eԋ"vk}B?[NbXW;2k1ӈH ~?EQ$I缓R1Ty4H4p۟.HEղ|yK4h@, 4{KՅT)?,3*(ׅ?;UMDrݷ[iY8LZ 4||KXXȤHK‚Kqzͣbhͭf \4z/u@%pRБ$nإ&yt61]҂y]ct2(yQn*~>wbw+_5Rbv?[S2 'p3ᤉ: b7rk-iMйy^ дyk %D%^\{bJ v0IC?HpS1. 2RǦdLoex-/J#O"RP@ ,aB?H"„hV(zok{}=o>+,R} Q+ݶ;;yKcqP'/ٽSogSil #g򗽉 ZYn;翧M$%M$~ µM4 +ܶm:4 oݻYytKb(лY XՋ;h;8{َo M(ȯ~Z~^=QkDawP_|twMx=|ܝ*=k.M韂7^~9?|Hyy[~ӱl[vU;X a̳f(~3C ;^ܴ$>f&cF (9[y٨\m"ZC35w8{O#"3_;Moō_qg֡S'euucX׺ -Y 4H[K]"G弔77Ԃ*wVѽox)ͤ9wmCش @m*nPFwI˒pD ̋dW+6o:QGa͈ A ‡[6Q*wBf"77*ElTѼLOiÓ-BHٵ:UT3}&揈Rk?3L=`~ މv@7zmvL#5wF!x}_ۓr߾gXсu.؜ww긢8sխ ,T3^ެ261a9B+!矁m9ٽ1p$nw<-Q"Ǘʇ$FBZzssa]#gjv# 0 >XHI(˓st o<UUUUSG}ꦏGߔI;6}W~ Le? !kCRٝƌm*[+DI/WW+;E9R/;ӪF@rI ݠHG7շ87N va1":GdAe9wY4~=vwiQd|hM#K{yU#lhy(|e$'lȗrX.3Z@cQZPoClqK )1!$Bng?K\ 2RfLh6Qh`鐉5%Ub1 S^1IS\3\{y8&@&0@;z>/Q%V,.:װ:Z90jQ+i:}x[n񭐗. SF?8Zwo{5yk\>@*_]>64rU z.#Yq&u4w^y="8Jk,b1knRg޾j)gԁsnڣ@u/ Ȅz}|Pfp5-I,'yjf"sjꈉ~Q0D/>)*4ċT:~΢ ֮ 85 !߿^;Ӳ>d^@{Be準zsXeyNQ~ ,&LI$߳ՙY4=BCx'FXJrbnpiXg:F<pk7X[<cqqy=Z?T h&k*1 Nt`Q/oRP9K<,P3O=grk 7ຏGg.ȩyM$同EqUS*[/p{$BIR ExD$BEÈET ƾ!"̉ 61P7bDF"0}Xkskf,"`7I6XNI7m+fL ČnZk_ꤩEcs=芦T$Q#28DqA+*V"B8UǕbqI", ,Hl6DVA\d&\"پ [J }9q)pDbB*)*))A$TG";6s&0ٸ$E #$$ ԘQkJ̈I;&J *jJH<"উ,ֹ3*$#*Ff§5{#O3{22X+?_'4Oպ`E 2fG IHEɊ) rۛ'2)$E?ZĻ?[pX p(li ݆ѧ|SHG rs+X5#190&6E8r>v\E3#Ԫ⋊"Uַ#R6E n9!1B9Ae ֫k\Es#?`0of3F@r{%A1VțsXG@lUs"/0D\{M9iƥI$VbD)\qId-)W" D!&m Qz莹RVxCJxniv9$ }AhIT|VtICsk~uw{G 2&T$9~CQu8&jA=`q7*G3& fDX!1G4W"8Y37<dN#X&DLwaX 8IB$MnGfm 샖B J5g9J69\$$ Vq5+qQI `&(.cY$Hvㆦ/hCccl3irMБǓZ&AFmͱ v*$jےȲG-HDvȬWLF`(T;f(bE*IQ3͕2HqjY:\"XD$-$(ABE !0MX41EYbrHu+5X8I YL\d~bJ)3PC(jlR,2errڦ.;2 FZ! IA\W1tuBv櫙A1(T*&.FF>(qɼP77&bU/))b䀶K#IYx"5P>݅O`-*bv89S @Pb/fİT7.@RSu ߈~>n@B%)"X<*~HT>W @w'@Bu},"̀BDa@()mrJ W%bjcqD"Z#JiH'KoбrY/>gW҄kaNq˙xwv/r9*n`yW`GT ްOr0<5F@b&k ܔg pBcHLJ^%ݼ:Wss ڮ=(rTyL DER39<~X4=!^ 7\Z) Q}Vfvmd`Qi~{X)#p#8:3鳀x[ AHʨv g,ˌ'BTu@Ǿv*S]R'dFBe(Tfϑ!j4Ә@8JG l.sң- G8s0 ;\`v(vK{5ĵ|oxX}K CsPRx Č_dǺ@U?=pܴ,m<E| @k ]]2T8as_޽UV .fjο;?? U 12wn>&2s< Eôa%D/+Mp C"L^[hA Աps>y<9o$>hYŒ)gyBgZzRp^©H{:^NI1d`BEȢAZ 1Mxw5;EeL: [Qo28߇l4OMNy5t{v[U\*T[ű%3iT?;9Hc $<0>q#-7&Hl-Y1`[嚎Y1ڡp}Ά ^=ׅE(яiKt$'J-,aDXd1T㹭Qdr9'"#zu2$EMr -rزG*RTgjE?-'C/S*q .pzf&oiI$?gͷcz7m7h:2hۿC' Ynua78O ,q=н'=gЌH<7ڌ](-K}i:y\[M@#R!7&6r$ڇ,f2JE_YI)5Xz?p?sاQrFv?.8P7MFٻ.='㜶KSEF&yqu^Y+1fq9 M<`wîq q ~r_Uo5񛑼ۍNJ ~ȑ'LQay2&v9=r oEZPDp٭ ؠd '+KT;gQ$wpzp pex}6u; tHrYciD#{Rb\o3 $pCtoE)itR/W0?(#O5$gk*.{m0'ǒf 90glxWy(#(*Q\*NzMdyr阕2 ğ쇫E=.ϝԠܘr,aLk,B q̎st5 qfT>G2Ɂ-f3hke*"V~wUN/fGkH\&ں?erbŋ~)퀢 S巒.g f'itU2ͱ4Oh{nLzb*Uh$U10PH~vr#4SezNvny}.}{1({ Q̮UE?/a]oJfMT!|MDC$v 5ԩu3q#i"?t+R|{KP3=s\Uq$Y Rbf܌gˎ̩W6UT}Z UTEboi%4ns a`UiqY8=L[!a¸dMshyi>2<kB>53밄緵7\=8z~95㏌̉l a'lLlQL7m媧zFQ da`a\.(*`ٜb 0ܰQx֌A1"Ddpۓ=t!$ LCRr%`m#"zIg&ιs[}r^l:N5)Hxs͓0W#G$wwQLhWvlW"dqm",iq tTQG&D 21gP=1I$!'{4º0Y q! ٕb[ncevu]xrBeC̉k &A|'$r%s!b9yRiP p.xM?:ߓ) /];zKՀ@6ߟAeK_" hHHT<‚ʐB.'K|{(|TI4h9/ pzxh.W|V+6djoF3'-E+2Vڪ_@=vՠ8z9wSUpD>eBL Gdgj]2~ɋҲ n$ɝX(6^ܝc o&;|KWy Πc wJ׉ձwHgf y(*UFxUW1i+"<]<-ΌԺ>y Ӿ|[J6Ļ['@璊`7Hj=s98SHrl=+3 ZQNtOw`ʜ M+1D=01?88ER}D;ً J*Jna?s :E 4ʯ^L]қL_oA\%|#[t  <\{!weSGN|ڋ_wkO)-Lo3;R»s ttI-ο K5 :Ǯ٬GlD:u|uي;bͷ("7b\L:r ֶ W0ө1d,gߵg]W(Wv\&jl7G,Ŏ<8]KNդA AmY $IJHNPb `?92>#%`ocHgRt\2<yfiH⬅% 6Ąx߹=٭W.T'0uaۈb \?iⷴWׅV׭oE/署Nl_xnfsf.A (ju,>nręA]A\/4̙a3,!ѯ9z!/GP/7wgO6v惠`Y˰"`+pY"O&} Tc)A:S2L&pR[pf;}Ιph<!dD "1,; c {OiK DŽ)'% V M2 MpQ.*MD|}V]X&" 7xkʟ_GS}yML pH)z~K$p:iMK[#3P~.}1_-DW+cqzyd`mv c^[Zڛbn6acBvl1b:\mƧ1it_()+oY\'o"i;HߠG/nC@⩩vЖ?~e+!:(-| bSRg|ID{?% E-HsmrK|+ ~ v!EZbOt%b br{?RQFi @ra #NnFXafLBnv/MU<ދ3BPQᆼYAQx1箌5ߐ"2{'- ;w7qb_ iG;ܮ*,GM!d 4EyXJ{hܗ!F%\ &/M#+ni07 5c ՌpB/滍,CNg @(^MX8ﴃ cz<#Zs9dp3_e6 9էϛ8/<P.0]rwͶBwN<&lbPZV??媳h3A:I?Djm]PP2dF'K/vAd {I" [3# 6!P?$Tu(+ :BxQyWfo38ȐX5 Tqg)Ę G ๐};2+Is$R#bIJs2qZ z0,XEqs:ģAE"VL$='6*"0RIHyn̑=SZ&RfzJRa$α*2 \It!HS,9>o㾯=\6> p{fn 9`LQE~+DG'\P4&gxr.gvْ̊⋇ /vdAy? D7ɕ5 5Z˷]d8H'9bwXE QdfiUGȲ@_I=BE"8`=.ݷn1JYGQMȊb#(X&DTCsSpk Rȫ, "R‹wl^l!Hd D$IK#Ek4D?^#i:+-ן|q\9& ɓ#6>fD,Z6ʪ nԨW #I.>qj-mcUAq @rY"Cl MTܙbN"񈹲n5ԩ.IQMZ"e= MzٴQrI&Kو;2D`nۙĶ.rJxꂑP*2\3"b4B eNYddG,\Aa:*$Wa}jj'P5q&8;+95 8 GJK Kl)$PR$I aX1H\*#r*W0ȊkLEr2L {3R!L5fph"eeB; dÜ*Dl..1A^3GkWu<=}ܠ3b?):ÕNv)>1b daxŴp!ɖB:]z>DG0b0xM #Qlw$Ug*J0:@LwĈ]*)_M/ $m0G 7*B80JAoS!*-. Xԇ[Rro]dP?=Bx7)=-TȬ'i]6"90}NH(mv+T >|c/z@37 d yBA$;IxQnjmY8G͆s~IEI.d)>wx^8l,D6+0tB N~uoE7wu(igLjY&CQ8,)Cy\_-  0N 0ɀ,0 TɄsP'(CuF?tAppq|l@榁B B؅MX5لxQ[飋w˿Ӷ^/}Ƿ0 RmEVt>8C%w^g_ؗN a`(:2"P-8MACUeu2}N/U=Ԧv[")x#$+Sul,x?ǵ[w{?'a hl0n`x#@:8c`@=t&UTtƇg'[@sooLݷcoۈMB`&z1C[K})r Ex K$hsIgf6rl'<N $w,|ߎFʇ4FIhwmmH:xR{Fx$pkh?8F}?:͊4:e ҍH{@5tj(ߊwOBƒ1¼pmiw`#Ӣ_bs3.%CbMM /۟uoͶGWt6=l]GM o-<3* fO6:,a6 bUw^ 8O'\Rn)/(l/p obzU6^w9GxCd%ArmPOÅXL.f.|A9Ȝ9SdX*O}}LUc=ea胰ϣ,HkDa붶䁮1,S6[}Fv+/&1`j.Ky?ņ' Ƹ!-!v\@B~SL8nJk\ދ.5CY˸]LOa>7Q2@ g?9ɚ9~xfc'H u>Až:z_oӉN'u׳ޝ_>̾o8BBP`|MQ >hNGpRѐ"SRRKI&2;Cy[>&nMq| n(5 / %݄ݐЮ:| 8⎜ir#bYs|Ri>MR ,Yq.B;CGXo4vU1Xz<u 'w8}$#@ Tq09D=' (Okz8>$/sW}8BA@HLzWtfCzsŀB\~8[_ }8A}!¡`7MȄ8ABdT(l { MD/-7 4 >n`P$XO9Eqs/w@'΁>\|X_utzGb#;D#B5tOG˽_Mq^ΐ>8qlF˛I&$8$FzaM'Q갬t#aDGꝦmwЉcixWo8OO6P7ǐ%D roDեMAsq/JQwY ٴe -R1&e /=^b At0s&6( yr9̓0ŃfH30a: x u5FX3H8I0Xc|+Q yb8k[bMLFXv*9#MvJ;,8@C)8,LF`W:_w@ :>!@3 ih9\Kaw;>-r^'T& sO{| QfR݅j}1VT]a/_jJ8dkK8x :@l)aZn&d^U#ɳ6m<{,Ͽ|LR U_F[TI"#öZvbY{B <8Onȡ涹#JFrtno_z x^o7n?‡w=Hg#WF7~եh ѡFers^3.M3zscIhh,.0DHg |m6Mbr[De攜UNg[@Xaon0 -:GN ee -/law f‹\v\g2k Ϟ^=KaVMDo,(2 G!mvps$1b8s[Kw/t͊b_zz D}|:\Axke nmSiTtXKB"7A= I Nx #ʬF'7P6Hbl=f,,( 6+~{ӛ4Zq{_ J4=ZH@s!\.wY_8ʒ,_H@m1ծqxԖ "uweO˕Yw:!N`1-]n[@Y+^`31\6ԏHBiE^; {@|K1N:Es/[kX"oÖT$mM]|F%; vD mb VP._*yb\4wR!E0': I9۱7/+5|f5B#u-W6Q8\PSUjT HBG#{K v 69 ȺT%tLC4Wc0 7 1lˁl{R~K:Fsb$ 2HsNh{ ZL (>}(q%MZ7/DaD\"d;#8šz#m":#+ᑆ=d(A?w|1b9Q1+UQ'/6Ca>a1r.X0L0";s _SFLN@%k P1 @^'!aL?K4˜%[Es j2?e (6Fj++8**E{HduyLÿa2Y ܳ8_6N-~AvWwGU+au63:5*hzBti)ts{o?s @:h 88(R Gq ؃G t> @ V@LuS!HJ (yrܰ#ǥ;_`0e-@i#^,A X > ?E pO.|l[f_7#:qN&V#Tz~܀Bs*jFȂz4,宋KR &!VpY$H ;PN-"|wJ)%^tcĝ}BD٭C.i|(۫ʺ)-9E߉F]o$":U^a0e]xy$ET4apw8fho]&vZrF|Axkb}Yhs}fA#@~<}Nu96qtqm刲UT[d=60f)fVZ'(B; հCwW :FHao>ľӢW =/abp~GNZ7knׅša3~o;&,gaԾ8H μ^Ƕ:x=vr↝au;D+E#>Wx 8hN4n78K_:ŁwqY˹ߔ7BygeG? 0 ,B#,a sI1͢3jRݴ$!臧z`vgg`H( ۜWO/^"Pke eZ6VWsL5ΡrS 1-_},arH@cKoC .{;pڃMtŶ(m2" +tmYlsT >Y;.s, ڕ yl`DB~(1w$GLDDM 1KFK"&5Dsn@pqI&sy1Gk-xbz$~N_bZr8\$= TיMb3_T? .(Mm ;Jcx /'8sdS7M&'%z/MLa-d;7Թ?0Ft4\IZXGSބ/=jooN} wVN8'uW/B DTN3.މqf'qˀA@'z >o?&o"k% qؒG=_B0n=l] sAp:OO _|Wl^%?Ҕ._v ]z >E: 4hԊuA`~y "Dd*P@``_ Os?"P ~pXAZ3lD0` FQ+"dp>űJYʐ#4

@[Be̝' VZ {D`l>F?MzXw!!/sc-lR  C 5xBt `>uX;./ipK↕~q[KK^KvWz[I#$JndLV%b YNhHZL3o6Pl3@@>>`~ԫ'PڱN--,7|ˬNh_IkN<`naӡϦqP*qEoУk|o"O㏾w/\k G4>%f mqB|y%;j>J.GVB@!7t5ƳLZ'3 b =xaq &ռC݇s"UxR gRmuM`AISo%FK~d@-eb!nv"^a(ч~skDJK5 sۛn؇Fl]%xo[^ïVJ1-O ܦs1ve=",{9~ύhNCV釯U V:'ɲ"}tZs?vVTT60l j>Di(d;YY,>WНj" #n([I%@}!ڡ{5}JVQ1 Bg#&(R[ڇъ/sS˾<0m~qHAcg>X틭J><- F*I^AIlZh\7#ʠ%\Y/8!Dwr8gM>;)qm <@w@C}Q|+= n~(wMs$4;H#I a Lurߡ,a×a;IqN_k4,UVRg8Qw?(ɾ,2@ؠ $.T8"{\E X0/D_Cr0,ABP,v%I'{fAa[It1#*(x Jr/$wIR>Q<E׏=UH&}qV'TBǥt>]jYtA)Qj!~ŁM(K/c4gwQ*@0` wt8NYwb6"IbHQE ryj/Qo`Hz!r^< :aL_0\ `Q"0 xK!&`10ps3`o`$6 i8S{ Vr8.A"nM40Lq/Ak[bl4!Kf7놅I8Arg5nu+}>yh^YAx e,\{2!4P$K_3|L@+H54r7CwvOJH|#@:B}g)G.HYY~ &y߉h Q θ#էn^辡/x~E4 J@=n}1YSZ9o\5m`9.vGz&!vA>=4}Of=ft4rPsyƇks[7SLTw*Y\imq;!O>ĀꉣCR5kzBP0 <1dbIwLSG@} U$qK0E=C4H :Ay1~()6 L?b9F:?&Z?=D1paR>oPbcE"=%OdhVXZ{IttJELVsZz=Tȡk -2xgs ("r5opA$ _NByM-k3iޔmb4x=.|'t1oꠁmV[)i!sێ)S3 Oȥ'^NEgO1Q ɏCaG#1@6l&$/?)%W}S8X$dj~b\!.}k. YWKBc=[wx`98v% . -h:"8bO s>9G w xL^/ĐYPŰ䀦Ksm,2D ӥUZ){o8d=-6=Qz~g'O)Cn|7ݬ{vxwwp plk>_S_LJDPt*ڬoxF5o:D@a<69d/\bA9>:xOo!o[CLl1VUZ~<(! I<r{wO}.>7=G]Aat?^]ja>E`=yBOc3Kai -tHgr SPwͰvE L|ޣ6f@0mD " mIw[j㡶Li1?cWh"ceTٽBhU}˸}ȬOwO $qYvS9!0cW %9(=cpo!8{_?S b&&!RJG|:T@ ɴ;-/dg jq˄q`qPq́6`_!8a^G66y΋ެe8[ tfЮ?~D(=:&|n2SA Fcz(ttVy5Fڟz=yl$Ci@G8*c/()/c;#{tRs6L$yY/6{` zl7hb~ģR@NM/SY &씰x >Sٽs!jSv nn)6JcHZ9(!N4c?S[*c3*| o~X't oznr{XRxdi}7ۏF,yW A q_~wW)zUd̆wRA·)ny|5Cz麸+T.ϟlP:zW=wCpfAcT D@W&U::OٚAG^!q,͞=NpAS%6$5FI$~ж,]_!*P5plsD)X-T3oj<*c,LBȷ7-;:l xD*Ⱥpq:xF4}؜6i_lz"1V_ÈCOnYCD` K!-l^5:zݜxF^7 :bt,`({毳@%OXQ>*a+K:7& .ymҹ8?4"F#O1XbVݫrf'xD <; I"  d En /^^+=ezԩdx_UO䠣xs}h8¼AT&1B w1"MWlϲ÷5`J_?׿n_4<, ~o+ :  +(@ 6b$=B+pN frJpaCh;TxgL>(+T}OocnaT0݇ aH[”l ;b~G"ʀ]6Pxy@)=<?UyЇ }8~ Os]vuR) TQ1|roxGK7gs-^ b)}&UFC m+װ>*rTc JJO\oS;|@Y}_ MwY130_]`Jzvwcѽ|2®*Q(P1x{1#6UzE`|<!8. 0SX^q3g:M^pK_)}ѭn*[RAZzn<]h~,FS}3e@~ !X ts~G`ʧKO}ĸ0C96Cɹ,'$T}A`7#L /k=cEg-k$gwbhÕ3);L>fyXC-Ei4D gX49͕exzWx~%xaESDjWyYȂ7VqF`Ni!ΐ9jfàޖhtpLA06QteFdbIM@twiF%܏1'oD!w|ƃqх)S{4Ri/,\6V(/1Hx -2p NṌY1n2ʑCXh& r}5u#„ WGZ]\LFijnRjb=}X: !E@-bxhHx[8܌;Dy8FQoIpHR )NSL@087A)uN5aMD8"sNh/ ɝX4''GczUP`)CJlOmxue +q޼N)ӟyv1>ӷأ(j!cj$g)&.!` i~@N5oe+'^' q X<|ɯ5e.d'Χ7wːN0x_>xKb̮|-iz+DC00D FE h4A=^2Aۻ}eݚhy"l`oZԁ0HRFpQz`!=ja" 6ϡ@@D\Aov^'h@=sMs`S@'C z]om`ǀo)_>:~m߬<)t?1Yޓw7zHEJNk̂N uY  +CDd7$1?κsՈ8]! *R*׳Sp>ٵ uSjRn7%i8_ +!kS⡦q3i-4]gEuf.u)Ϝ%y.<>1&{ت?gL}#ЮGYyGmޟzK:'Jv"zl͔ F}cT]1DTj758룈;5 T"+2oڗSW!I[0ystPo2 sIZ|Z oE A~<H(ZC+Q8CClvw-)r'}zUHVVZz (RI8U`[cMG4 ~^xpy梎roS#CbM-2>xW807"-aՄ?xEy9ol:{!'Ygz;6UHҿard?szA_,߂"EZ.w%Wպ:h"!!j%%[b}rZw^'%A-TSɎ1)#I` ]owu xZbKMsA6ك  }ur=LJa|bh?nՓ@ |"2wa׻O_WgW56ߞƼ Pp˷ Ʒh@r2Vks( _䎰~nlglw!3l `Ў80 sa>S7ɲ;>n{>-Ml"Oɝ}q9?3 !?Yy톏ƪ 1v}flc3[N?/ @wCr ƌ_szoQ%@͡Ľr>%D-:깤O*c"0EyWZleXJ-Ecmf6gq|ڥ8IлQGT;@B=Qb15cn_ ɤg&d@$NsT-pJnkХx܅傴H.=|Yk#4WTɟ39Qɾ]wC >ևPg9?ܝ5|,kVT<)5L#e^+*;Gwfj1vaQv#һPbp(ܿ^wQ@(oo*m\1%CRhQ|.&IJ" t3-4zw֬w]0_+m|Wra+8;T8|)Pf ~a "0#ɹzT(e%"'o'x=C߼ nDob}}s2UqbB8xp|)vjӓJeJ[Ueg>Jf4OóEKkOՋ}S!^k;lE_3zRt^QbmF|`-пo*lk*FuD.D7^C}ksM&i9U-m!>w[(J|pM-[}#zT~ ӳ%w fen}KbepE c9OuD*x!;$ja$"R|=L3)M-Lܾ*#`]JQJf}y--VDcSل?\#g;D`gBڙ*(߄^`Yދr$ͭp=ҕ2W|H"Z7 @|%I 欒aPq;`7aoiFx( ȡcjqޒt"ߙDv./lcjC)cKm~e^ܔK+*]?:z,1R¦J:7 @P9a^OLQ @J1 ~zsGk6fێx[kf*V>V+;I{x/,q@#aN f:tM:8`ag[ ~.{Ktx$=c9 KOZXci@@nFY|T//ӪCΕ:&pe1.->6^ON[A߮2q#T:!C]b`[}8lC C-%>e94GužbGR" =:8ݨ"haо4;X]ypCAQdhIA`w2 ]([HIm6l*T5+Q(?2aDl 'BQގɡCGld첛 |!gS}<h=ިÞc:S3ksT9S*O@nuH CY ,.QK]'v(0MLSLow).`"=$ɍ5VN/#2Oh7.(pH5ލ3N+^Dؐ=U8'E<tƩvNIa$uv_OɋӺޛ%f)6yпzV!O)]ND ph+\03>\IW`] ,2xeyQ972!K]`e9=HP!7mjBkwZn]"7{'8=D\1$iC{x g/U_U{70Y<qRjr/gnӖ xA0v.^yr ʎw%5o[|[6 aD 'h%&B"'ziD]Gkn=^iͨ'qa!83B8`=ۏ xPA4;WpW:7YFkƃqcώ hPy8^3A(idaN,kgT<-GÊ1pc;hm.aPO?rV ߛ,0}D (0Rθɹ5 WyB1uc:=M?jDaV&B^Q 'eXCYQ@I:hn=I^Y+H4g\h)_д͒9^⚏Z2mʼn;nApaL`2 u'vO$;Ez',Vqj2q@Έa]F ^  q!n j;kwǞ$V)rl1.go Y[0fc] 8:'^aU"}CAO΁p|wf FjQ'[ kۢv)ep/j94B8@L1)ޅQ (‚ qZYfJi:"# P+~|mwW]C[fm~N|-ƴᣱ,Zc|3]َQYrb9œpHKbCC3{:gJ7"Q~&gdK"S 'slcK{I@ԏ #ebs: ~/m7=Rv`~;/G)+w̆+t_ދ+nƄsD1*2+uQ$KZ;d^=>魯C/۵k0!xI쟜Q7ns] r}^6fۀ6l 9fp;WoL8nVXw8 ˫t öq qPk7|b*c/< 5 /6t]_)N7#'`PtD{ ?gl|N =ETrYáu0^\ ?$w&L .AǏ GW[adQ 2w8yBk= 8g|nej#q$¨M|ѕqnO#z۞I,b3}&3c[<\6ӲdiJzS6;zAǀܹ:XRs*Lau)vK%U.@qTiOX9y_{W|ⲶZ.o++7BM+m[ϞaJ-)#w] 3`lFձ{:2Ϛ/pJ" A'ݐR[}iIS8[O^G Xx^ SޏD=f;t#Iak2yL.T;:qJ9_"({B2:H$cɶdH:bG_{bpSi ˱{0N:)Y۔3Z4s!ajҌ^ !,NE4Q$ }8\5'7kœ+kQD>ɿ;Uǥfe.oۃ3O,QS?ˠ=bqxGO_ &T{UI;c.Od raKZKuokt^6s=Fj?jezf݆Wq}@x ii`U79IUUfbX&do[H\n97hN ˚c!Yx5yx;h']bnyWƟWŽ0_q{p5OuVPRx|[ʉ/@){0 gZ+,ֵ o3fC<71PhxӚ8}OkTtmǝ<pAc wf fBf K,Zaa˘y.xErN_yQh5ed֏+';ИkV^a}o)cO#_ C=u~``\-8j. KmLjIT "6AeJV2>cF}oe7n 'Q6^Yn.|`sOfq&P'O#ÛU(zc!ܧ$'&tl./GU O Ͱ _cVjT@@b[VxY/h=Zp;l9qͭQ|yxwHu[U>Yn5^uZ mKtp9'8ۃpA".A$$˓'Gmyh. X|}4#D Ua:C8+h-[ iI-_v7ӫLt#Dzcgڨm_v9&U40KH.nK?'B8U4g0;ə%1sqf)9BܩP!0 = u礎w ~:bsx)9g묥A=yMf(ESq#%_o])3YQ¬Pvŷ ̽$$lx-/bn?+6ym%#d/_G>EU/.<ɊIK"aOa8@)&"yl?/8{W%&6Yp3Pf6Z[}7/owr[gڄ/EDi=J?yIG9em)jEä7 (4(0dg7G Evc9ư3 Eqrc?Q#^.ĺ pS$>GuǷr~ѝYHr1{=Ao,a^ zAqvJyG'{apW*@NQN'gt.)\5!oÊ]Ez#<_BMȭBd=Րv3yr3WEoJL&w%StMo%}9]jt6_0y9F/W %iqc~tьymZUT:cz{u=rPtN$}RVmr"LmSN)V7xBcIl_I-gzlW5W[;DV%2- db0$Մ f7DHh4B|Q-q1ϱS6oF"*("" @x# e4¦Оs?a T44737T4|O]ImOCpk/)-z o}] AMK*G}V34j _s>Qd.?w?{lg`&歰ETo{ 'gER2J n|JrLk"of-aվBP`NcT&){n+sea67 a9\ o_;__Ҍ99I5ea/( <$KWzcf&z=;I0Ԗ&HsqB;_Ë.!o~N`YO?IȎ:\WzlL gE7~Ak}{2握}󌷕^sUOljDt#<9Wy d¸PҸ,q o e^L-bzSrX|_-wz|hhln.m6وZsߔzCdoGz#a8& r;p>z-SMbKpk )Kyc\H#<&ωr㎆8g>8K#3 ;~;x"yu?\w1`ﺪ#oE`=^P({@<+ nk$`RcPcimKF9.Q홅Dmy98;=`(JM^6jC?dĉD3gcv󭤮jMeʿ>d:&vъ߸ץY1ľ_z0V+awՙ#g eDRʍc͓u\ D6 q?ߕ;>W%4_7", hNde9Mjܾ-(@}fM3e0%Eɥ.#!TovcUۿq넌ҫg~QC7@) EG;zTƌv\n`֒k2H~Zg .^Z^Ԃ]ZMq`{ft <';MNgYОKi81QO, *ghEqW7x{^j0"'t/:PW,_%~M#}c7x&}|B-1V$M+.}⒪qTC#ly2'_}tmM< DŽ ´ƕ/cpTO[W[#A'&]=fDR|\l #%ǦBhRwW`[A<54ҙ AA~j{M @W.ʏc&މ@@E;CQYbg1u7Eumᶚ rg;~G|wV3D]7#;wGY 2 ` q`PPPDNiEw}RZz~zc.WƶEQ˥i+JjKL) OC=Qf`yyV9 ߸mV4"ݐtAxҥӱ̧Rն\v߿bon!=$aQ% l ;WS ~=[sW2U:0tpP0!\OPz?,iδq+:.sx1d}m.\v` aXݜXh8ZCG&n8V"֋_ @۠.PҬ~h5Qz)ut|[4qZѝ׽O+X@pHuZnKsaj%<4Znm(BoL]Ppxna:f t_ռM)v`F!0mi(ݝm85q9N.Ayvӏ09& .읿|l"Dbd=41TCo@] f| oK\-& qhgܥ x8‰N'@e͇֦e&E)p$U{r 6l;ϷtUW)V+Ecשz | ZMrʺT|~TIĿFJ¢:xyf/-Lú~Z$/x|G\pLzېWJ|L5P9g6>@Bu蹣o%CDfXWw=Hؤ&]siށ- e(aLm=WEe([6ӴfZ[ɷt>cNU&xjmh EH܄'6<%,<d,ʎ./&rڃ 8<GDxJheH 'bq*EE?׭nL{ƼR Y%ӷAfvo0λD2A!ءXΞz<{W/+%d4(Sjl<ا0UV<=9?geYHav?Y;$[-TI$'@!6'z :s@+7őүK[PGJ$>g/{CCH/!C 8$43QbU2_o ݭy0 U a!~ `et+a2Sg#Xc] 6h}nZ^3IYv}_y-$`PJ7\w˟P [ Zړ^cXݤ;@Qwocib{9;o%zXMP>WK94iF x0PŻ((b!&Xt7iHr"WS=ԁ:}[kсZ*AĨ8) @C9hP1 K:PNtqҵ{p$XwTh흧yC&yhܨ&qMB.cn{2ROY'6t6rnhgN2|ڐ fLxZȂ-9X6O&(LJpFj;*FWKx dx0S=[`tm̫ߍodEn] ȣV/hQX{c~/,ߡ,O;uNluRk:ZIF8y  y뮆K:ؿ?l&|zfYfHc_oh ݞ-)-I@-zkXuц x Õ'6Gv3GZݚejgKmpg\`KJRc)[$B^_{<%f.GLUxvJ0`8I)_o5Чh 8ԧ.6ݛm}GϮS9)sؒT^> a?3S4t1L߰i|hvǛ'+/5x-yg>V4¯~o+c1c60*I"sc83 ֢N5r`̧QiSv8y d,!>h^!t} w| K<.~IXN 9|F`s\g8jkH{f; W2`0XzFejā녒K;WsTkLm+ֲIaw/| (y~FF5v'[\_DM5Ȓf'd6]Pa!]dT 2(1 N_ty s zSfM];z%,+W*}6CaŎPҼh,c88g"]CͫG%Q Ifa[ҠNU[ɀy`+ͱ"ۅwX;1D\n:B.yrxM2wggHҭ?gcVgԎw/$q蓟VJYL _xz96L=t0F)AϮmMTCTTYĴsv@k*ɒNa J}WU},u O_,Z5A6A80RIb!EO s š,T+j7u;ȉ͌;Cq?4C;N;K Mţtp,`x ;l{˲z;޽f'xM4P/FiId"?=}9y[7ϯyn&?؋azI==8Շlc>2( $lyHIHe R:CD" @/o|;Vݻ7ft[KW+=*DZ,RD>Z'ܸJ{@:Y7W|]qB;cZ~'_|w񵱐@)[yI4w>5n_IQ\%=ZV*w1M4N=Yds_xݷhv}]wi O& $j0ܾNKY˥QQLE`}=< _sMJenoPԄ鄢I);vG])\P>DH-}YLKzD3n|:hZ.-EdO|"gskƿK3zy^IBЇ}m@ZnÍ%vmVXFt+ԃ~xEOFȉOLe65$D3YVׄ0Y%$|P>W6aZHQҜ4 kay /OV_ >8B @mP ]F, @wEwpCm>;1kgq tEh0=[6`wٽ?YCуHiWt\@5[h?2hVbde8#XzU쪂jM@"[Pr [ acI G"S=ǥ[wq{Ɩ,m3=Ac?աQ[X[ZİeWܛ!gV{,1&l=y̰pU{\3ɚW RSiTT[3%O_ ^Țhu|[ ? rX=2yC]t 7AP;,n;vMn&;ǸD(mnoayw-NE&cXqz-*i#w GP#"轱%i@xo~` ~4}VnvX5ȕ zߠvثG,|o*K9}DrC(yv F#oO9a)|@.&sX\#.6L09^gxn (ځqaCG3`G`s&Vq ;o61`5 pM0q8I9. 'p?e#u% I'b\Yuj_Q]?2X8c##".,"ΊIN:椺_LہpHy5? cN&ߔ*毹=?**u=Q?[3T4@YGrOVP`Ac]Q N4$Dui G=W yrq$^7:xQ>gz pc7ucW" AwṺ8RZ0A ʎqP!m獒P]{a]$QnOW УH{K}Smj_z?ck=I*v j-P`/gv#W6]e2M< :xs|]x=tI:5zU|?sfWp7G`痜B.geߊ> _Wl܂mAjY!CdVX|VyboPg`y>K{V\$|5}Z0,==5܇P6.{{뚞AnLnfl䡏)YMwŧoZ %Z/(2)d aV7`{&߆A@d0`:{gi/[M\l/I8:|[awXV rͽ}vf /x $)nɆ7gϥ\gMP2bC} PՃtborȃ I HaB+w]ii{yU<sVfQ~ν+/cbҕ׾yfW0g#ԀUkgp {wkJ̱Oqk἖ Vt^v0S0|ȼ?k1>#`&doeEd2# ژ6G.Shreʩ/cC8PuX:̅⚺D/,la&A68o%A1aL䋅"հ`LkÙqFg`|?hppkc8zju#Ҟ(5mD,$M0M⽲3wGcTCln D Pn4 D[XJҿMd>B7Q\yNA^^K- 7wugPih}&`_\ְFsLB~GPsVs0c]-a7[`*DWnOǒC> 7'~=xc%Yf,ʪgWEJ)_[[fجQ-p"xl  --Iݿ&Cq[gJ{Iۮu '1Y݇QJ$҅m17u8콝IMId0 2!J%dz<ˌctVJʷ㾇j2n2\HƬcLZBv?Y3џ gw/Lg%CKyYwp0O\Bd8D힞z(E:f818XJ(;ծDmX&Jq' ȼK3q૜I WYi8~Nrq$v55h߶ w{<{Bxܫ-*ri:c1vP~s$51}:B+❭u| j[F.+]G$ȗ!d'ی` sVjդoP5:9Ӡ@$ r;6v=T{,>3YSL@1 bd }iU YBza_. KTV[9s`s틛wʎ.f AAtn;RUxڙH^A0m\5 uQ4[\jpSר@FnՊ$ߙnsߢt -3 p;ϻ>L##Q#]bU!bfw@ nEөdsXtlG:.k@\tJ`Yo,oG+sFxeKRrn 9o j7)P-a6r #R﫛G muĬSY^&(`pWa!Q:']f q 7} yg֌ŠTdCKA#Q7DBwl 0 Iٍ)--=9eHYZ"Ot:@a (UU$R)g䷪80N}ZIۏ49} ZGsC7/R=ɪTIWtE~70`g] BoSĉ͗U:S;<vq:HZ bJhP+1SIbYh(&x==~%1b Af0ҹz^z'Wms!P> C>j 1gp6ۥ䲿_>fX[oKa@uPG]eHãC.:W/q䨍מl~j{1{7r|D\7D:xE'Xb>IAș' ZY  Gc v"mKAE5?֚ca?yU)v+;֜8k(tt n&BvD\L"3F#vNj)B\V#+ud1)nL1sYW~; 'Z*%1Dhtrn.w,l8k"MDPSFH5`o(!ۦ5FX:o/XQzfhƕD>^jVd'dojs ɗ{ ^d1N8T=riһ֜W՟mD-7/ھNT Y˻<%.1~k_!pp2?Y0J0ٌ=z:&g`vɽKpx2uV,ɝ=LPjc J -(HCi K7eDO/-P" Ċw&*t4Jwn3\h.L 4I)r }Mh\QrDфAB(BJuLlW }Y0aqwC著RYټ]hdۉǏZL⢼q~e2Pdms]\z8ǃ[ǎʸЊ8uQ:0ǴcLXѣzxi6,0ܢoJpRK*_wTK]lw53KZGΑ'KE ٭MvizP3]-^e$9?F0Ġ}ɢR,*ڛ2~}Ŀd l]+zT,Mo}Ơ"Q`9珂Zί;S_B~?5!o4S9?v8'a}~EWO#'Xy v}rBŕYY ĬI$ "1ڝ%|zL0Ǽ"q'=sW-.UQa K1@~A#À|?DDL'ڄ>+B > :o?Cv$6=̓TFcxopQoՏCy.;c>tkIp 9? 6Ƅy3EVS ]!_ؤAm>/U# feS?nÍjS~4&qL<#t7rtH_j8^M nRmaE౼@ P3*ҷg$e^n1X^_U5ҍ6Lij a( $3ZF"S96UDEWFƑ@sU_aPtFʛ1Gq@f8 0j9@H&7^4#*VRXo~#8H>'29?BCT5,JRtYԯ7 bDfqhzpP 4pH'reAspl5gި 0n!Lw[Jt=e$MC"d! RD1LN$ [C8AvG,)eV RmdN]Ɋ){};n8?uB?fG3~jvQј[3߬P]|ZqKDA)(>zQNu»l7\,JI.aolRE$$bK# iގag~} _d'-R߳jukO5,J PImvU `rpyEvX!\G;WMB5PZ03!]5[, 62jC >Kș[D-*µ?ܠ嘄W:'t q.o| D_N.HID D؄n]%8ˣ3f <<< &I"/'`{;6o:sk۶de'w_vVW/3Y&38`q: {]nz] G9?kO|mS;V&q Ƨ"[K)dFA6|? SИ G2GjB[lm? Y4u2A[BMʬ0Ϯ!/Z\ 1=nw Y ˇlnxјuOr K.2Ӯf}*=w2^֤bDY4Tff}k3o&TãҶn׬a2ni fl~~z:\2QKoe2؀R/ N.L.u×emعKcYQՙnp2gRf. H8{OW"(RErY~'>8ܩdMOP^{\`r&]Y=J>ǫO{3U=~/"vWJf|o6 3r42Z'MM ~a`vq$V{_j"T@4Qm-!z}ʇZ.J?;b%f{7Ĭ9/si\i2l "-+Y2e6{P UMfI.`hW¹UCf9V܋G:?JrBw¢)&t KW|Vd"3orQLMZ #Kizz^H]!Ũ}ʙ`ƣ]UwA_؊?sJrbd}c?ŃO[T埱k\ ~즸ڼXO&2u]!ZoyDMř(rWX}H%ގD"Qpu/&4C bPU4@5a@uS x/ׂIQ@zܾX;%qg{<]q\uB 01 q?wEWQ̷|@{mqah-\@uGRdzxJ7 ;[R^Qb tȼ.S0 y>g°.'EiMYf0+SSɛMj߯)=o* {gṯB9Lim2Aoe`T6YG~#[D=T}x6<^ǵʷUz'GHKP[h$c4տ-ɻ۾? 2T.oM˕b?8]e/1ư +JK)4H\X׮@LƕNG1i1fQƭs|/ɕ9Hh=t$UóP5z'N$~p_s:.{=u\s=X]/uO{#~L X⾌?EXVOAܝjQOJb%DG"Nk![l,!9V}U7R; Ӓ(=BͶ'UPi5;rUf;)/T춝;B}c}1EL^aYl~qX^%>&$jѪZtB=T{5tJ$ <DRz!7WxU->nR@Hy%8l+gvp^B2['Z^ Vy` Dhp:5{@C}k-bJi;HM4$zOny;x8=MO n)ea\UA@A6+$lϙ54nA;@BzR3{?HȀvi>V|G%jŽ+Oۿ7k 2Xd|:Ȉ>ne)]Pa؝>?h,(otF~9AR|qG7 #3eOt3SJ̢>+s[<W,"a!ubIf5pB)<]^v('2"5ɗ#|k^s8>$kz#GnoLMj*[:^_fԗ1{GZhuVK_{-WPɨ|h]>UpeZsc{ՅJ&Tflϴr"*+9jFçfi;}hn`b%\<ߘѿ 'O椘{ t9f+zvbxA/G@$-;cIGDS&ql mݤko_RzeD3 u?!!P)s6W -m}梥ý/o!0}Iݔ^qKLʐvnj!yyIA[䨙ІI@ca$pב9SkSy?[.-oCB˼U!e?|&JYsĂIHLbP'c)_&*v\63)㋟p^{.6vjn"{6>'Qk-޳Ou :w: 3x\t +rЯ0hHG?ˊc3yS.%ຍe/o ^cl2ɠ^W@u-u,Ro_,vCNԭ h7?D}=4A1C`@ =`n WWV!Z6Cۛ A5k@r.wO;emY`A^8zmm縻 B1[4 hGpz 7'qEuOuw|i`A6Q"zZ; Wгvy:k#9 Za~*ӞyCw}Y{ƙe3PbQ5'7 h PzZac]cHL9="s(Ǧt9 m f='|~Ƶk>ճﲝmǶsƻw QmW]Iu1FNqkZ ^UUUUUAQQQPP ʲ\N7ʪK_Ǔ+>Ӳcv3Fti'6 ; PpJ@NS|8&7oa9Kyޫ?s837|c<  x`d* ng*f|BBN'{f!.%9 ӏGFV:83P`$Hr \1=S};`,Ss ;Mj0~ |Wlfa'log՝s8J|*:Dkn G,)EXqݹx?_ "P f >}jI/v]Ic%p f*?^҃[Bcya|fH FaqW`"v8[QCmȼ%fZ_b`%Hh7U_dt/}cs;5>n3E!--ӺTIk<ӟy0Ȯy bDPr8XG :y94^9N|0=r xjiV:׽3 2Ưdz@gu]Fw1E]z⥇kwgya+ա FS ݯg5ekfTڕilZPTD|-To&?ا Ҵ &;hnq/UG)dRzhxCIJs ZjƔ-ZD8w`n!*(;X]k{5x473t·e4HC_y-}W{KǥsQϕq)ht7^֟n;pk"}&՞OHDd͹m VPף; k$n7f͛6`ɓ&@ .CU 辬UO-._!zi$a\k{?rkBB9yqE翞FJIvBUkNÄP.AI#/a`x/[K-kYr?XX_T+W!5fQҤY:AzGեfupoG)nl+*{_==]] ECZ 2. Fq 5dAr|fB`R[TO J** 'Q(P ۿZBx rvӥR@?=w'פ~siy|֋B'2"cIOY[a"]M&̈n_кTKӠX 5bt/76 9FxI^dk1 JpT#q![h6B1#4XiO8)h|$X[sT,@v I (@LKJ8"@3]U OfE8Zյ tq(WU=գ˓?7@˙$0F=͒zQIwH̱Dx^JsSk1Bo7orE_=A\^ 9GzsO&oȬ2͊qM)1MwXw_?iUl*|࡙E0}BeQ͐0;54+=2;FWUIL=0~Cyޜ9I}b~M>-䳘ظv4(ntu?2Ŏ9`@ 1@m`!(`iopC&p~{?3g%Ga^-7TRQ(yB Z4:y0eںM1Sܹڞ,;V|Q/ku>N4y6VΨ3~!D.4aZ uz ;BdYؐExT[TYPIrЪ7Cp5)$6"I[ 0myZm];1%'TXwS6omAuP%,ҟ"@ Tقj˝ .봫`b֤"|+xZ 3}vܨ'߃v!ĢkZ7gٕyvI ɢ2M;&_eL$0^MqtRV rm9ܻ'UdЩ=]_+7j&CT]nT9[sZDtauHyFXB"Z40- ௰V}Ql+T:Oճb3$AsYw_I=Vz7 ?k3gYGX ̦*}Ι7|ر :s˅f}{ї%wH{6sR*lg8HGMh`%K]z[//@1Z UZl/ϾAgRW8rH9ldsSa_#S4fgd+_찑IF>IE9んw0CdǮJKi%(Sp1я u&p6+T叕8fL䲦,$tz \dP 1?v{>`uic|/OMP^tJͿ/[ M5wsv~7`ᲪaǩvI8}_ F?wm9Z^3"™׺:9Fz. 7~;a26xP?kj3{0U\=}8@^`@^XS|pDޏ;>ԞY"\JpjR0R|rumimiJ LJvu+C>@ſ^bMW "@O3^gw^o%q`}A;E+r9rt,6@obVVEiEAN{b^xn A$D IWVF.>snݸ7:j9p$ 8 |&0xb¾/m[rp sgCs^&6>Ư=oAsx< g)ڒ@ab] Zɫm͂14rRyRean/I 9zS*R>7Qd o<Iz8ZNx t$7N1@1}Ktؓk4> n[χfSˢ{One:*@,^R.;O(Hw/fT~Ľ?D?_Z|?A"PF2s~v3[ cxbAǿsHUSzF؜Ж35?Y`mOֹtM#'-5Ik.)N&倌-5 nH {R$G\ Zl=@Yl/IzAa㚈Yc %xT<)Y9# h꽔,0_?:@Ku`}0{5>fdVMģؼ;ыXTz:F{;_~L xtf$F7,řI6̊2&nْgvnո'a:m |+4b^kqyDw) ̇#1J˼`r|+o6<3.q'{ixaTQJYq'LY5۾{D&'V>ҁq.ˢ-Oi+\8d ,#rk<G`]ߕ)+4] X頦,D4,IkGo*G<#}¯u/ czqt\xZ s/w eI!V c{Vu!Xs1̊:hi,i ==O1ys+}v =ҵ:Zn`^g~)2]\U80%#˰"Qfn3)_^|BWGeypa7[=A~ʒ{A?Mc2؋F1TߚM]*p>'ʙ<%[lBg<͚򊨐NJC/vqByW{c 2,R8}Z1Q@i܈-<aHфKx S߱HWWeU,L{ ~Zj1Ѳ/Yϔnjt(e.4G4IL"vJ"e];[y h̉dBAJ 6nq[R@ĪNaC\]ܱ:p%>`K^vĨzl˷_ْF۟OA2:UN4G9ų Ȑ;V%)<0 6 q˾{Җȥ\]jp50LDӟ/[أ.!{Pa #Xjag =ABC'rc}, E,y 42]jY.%qie{N|62#bm,vIl%sWxM!\_J5DV.T IoZ jAkYKThcG4WJ~YQ~kNMeB9F$g 2v9Ӛ鞵{w&,EfaEvEL4H$d"* USf2PyHI$j'֫Ϭ`zvR#\}pP#$!F А 4RUЖ˓6%k1f,y .&MIkrrZRP)b^`'G:ڭ ܪ\q/tU?}ffxԬEJb8! ΂Vb*hVTcWWw=\{'|DyI aa0o0Ԩ-)q",Fz aө㍖rd˼ՆQXW^SMI[!7,URJo"YB5R՗D%*ܔn^|j* Q'WePJ5^L(  غ =qpb)Pbܢәt t],/dO}Z.ƍ-L[=H gi{[vrM!hZ1.}cҗ$ XAoZ'7M֥"%BXGd櫚6E2)t";Հm2*;p+r|:@ mMRgӶGf=T8Vzzd W:|* NjYR 5Q&E G!1M*P6%VKJL&8 ᐲU2f/FMz1>8ZqÎW}9NH֍KBR}8U:7pe2ͫ-YCȖWb3%c?t kҎN%Qh"[:&=\2yUaRIgC(^>zU+RE=Q [l$^$gKbn^Gp1?RT'f G=UKkY,~g7 rGR mpXZ֩J<1z#i]M^7QV/yώF));:G^#X/A޲΢\pD9^Qbs(M)ۻdatI%l-NGHeH|p+^OYx¶cBa~5sR-)E%Qu YuUPpPZg}ܪ>&lu 3_^ 䊘6^!](*mg ` 8Tͱ$/QmR˷ $lPD#ϭt7GG yu%O^-KJ (T&4ޝ)!g4vyb!yB'|='TZ}]J]f\+*HXOX"gs(7A7ՔO +w_@o9M2ţk~a"-P <]hd7>CY͋ngQBCD"g1w)y yT?%Z jE!Vc,ȸl)rT3@xC Z>L?@/ qOa˼dY#8t:7MREAaXٴz;U5F>6B+g)K`$EBy7GکXlNJu{f9lPıxU '[!v)'XA7|:Vc-eV| Mq!?F`drvÚөʼnAO([iUF8[z59B>$V?^hORLEy_N4 gpH1ZSԭ巂uGzRBR% ^OX$R޶$fHWe-3L)qK6rã6E/k{wD+lYSqY)aiJ{60i$yBĉ,6)v`^n}n&XM46>V3z"[/Z ,naj 3ٿY3G',ߩr ?A4Z otk!)CE&5`(qJlaUU5,oj NSlٽ W^0[EѲ'Cu FFSS8\Jڳ\vuv(jN Z5~ТPu,i/Iꄬ FJ,lқsEvaz"9+HLGB)B CDUdj#G9"z{Baa4XV  e3'blyrY`jzxus#js׏ݾ12ĔiuDw:_\FȨ] r~=!T!$xC,^/˄$ڌq% VsB~0͑E2ɛPgl# V!gvRa pBaqiQWάbȂ/Ca|ZaX,JtlkS˪U8,1)7dnj#Q_׬@6 ͙3} ob u&J 8m&+G:TO|ϊ&``Pj]HsՅG؏rXd02izm]ULLhJg 8;#mf=yN-k ##O#e enP Z尒Q4K'(ބ`{WI1KKGvY@h름W yt[$m8զ9]\Mj>Zxn6 Cv3tm7yV ܒǚ\Lq-XH~#\i0m5qjn$'VYԷ' iB]GelQ4rb^hܠÍ!q(,8$jHȊH9°+ByJzg2̬I$m"CDӷ%aljఇNݭ ]F !Vn]"9X{)W]lU߿ H (U)7MjSZ[+RÂhKB֦,H]\ŎTe2lV"X#VkqS>0[0H)ݑnRG5ͅ cP ([|kE'RPmw1,oTKffU($&ic,R%lԮTl\;s.+"}h.KJחT@obk .g@-BL ZDkl ! s+xa'Xj|tz8z^<ڸKW< 扃B7\}}tIҧjrpBI|sT2~N9 . |yIzDSBX^digYrǼ"8p] 'S7uEFkZw ([ifreE&3 '|1j^ymX&JID ]pca!0a}'hU// :Qص첦HaV yc2 thq)סH#Z0AƔp7yN/0I|c3-~}34JbW7PF5$KQ@R5j/q$IyQO54V5Y[͈lg?JӞ]r$Η/xFB}ޑdK×SqeM4^U^l=P"A1Rsw{oQ)Yuqo<=Mѭ+vEےī6D:%+3,rѺNL|*HHkNIsCLf}Y=f|Lł姝E48&U%d6JrT"6FaPg4X?wT+zinD/Exۺ[>|tt˱"1 ^23LnCrPBqRE؀K/R!zcm<Jև<Մ ;רp&[R;T6?O&j3+$YE6O Z|#ft&-̣vHM4D z< fge@3k>hR[]ᣲۦ5*PlU%?+xiVm&hɐXhc4v"\/l؁kY iތ ٦A>cd &!!`r?<*,+^j s(Hֈ 1Mbl*G)w9B]gYOOC3c] }.` RWɓ+,۴t y=eVkkZ&s;ɢj]j(*4~1J W48k8*.qX1dQ"X "Ou\vO*xNEX"[uj5X6lH,5N;b8fފ_mZѩNYJM) sk`VUS.F@JK> +]mXwmsFeݦ8h4eDW0hUH3%|f- vy{ɼ02^!f\cmhf9-zHx @y I;!z?+ȭKAϲAK ea %k 쯚,L,,%m?&2~/ttg38˲NEe%?fG)פ}b& <|}6H8-9IDQ A/*9vVה'z荽x(`12$ٰʳFM/Sof]lu "F֜jad_;{=$- &mܱa#"b@Yx /w~Bd{s%2[A ƪpMp!= -712'V%!kj4Zk٧ߪ+Ig2&?0*Iy*$`yX+MUT"nr0 | 3ى-`˽F Y[מoZ[/AK`}m,SR☦"E\ɪ c!D'0;r_nVRTQ^*r氉FS~ov`3ܼa/:ݣ/Sz0YxPCt'^{[XZEscr f!<2V")ԔDj'@MhѢxZQ+]msuE_\ǻa3U$F AUrfCSS~W-Rne{@|ag/o !eQ]RuWZA|Y&ƱԮS}$ÿ`pXd7+=sE.( \ʙߐQ'YTWYguO}Nh ` 9]< 78n"J8qaGpV"LI5EUlh9V(-;ξx6f S|qJ^c9.hfSAB(E/Gnq,Ʋ<v٫ʀ5$>kdM25VT6Rל뺃tVJL'$jR f *R*0C*L/vi}᫒H&>Q9- $t\Da+|5w3#aԵeIڨ\(7Lphev*b4ADdĠGaG>?Py*dkaTh&|(}NK"nЈ#gƧd/1,("|"x70Tr~~$z ޮUmmnQ{<5"L{szw% N rhȊKj;Z/`&7}T3GKs35mTޟJJ7[%_*8F (@^W1u !cM̲a7g+s2:U{dO.F>׹]Tm5^-čF->1 4,`}U,ƁFTQz7Suя0JiщxkԽ YyA Qd =|_rE}22p_jy@1!w$E) Y$Ʈf~rU!03,Tqѩ$lMv3GhЫI9g2[Df/gTvO.l G~-y.jN&rD pF& R]=|qQ@Aw2 ,bD=lIG<(d-뚠T\.!ZNHun{Aj7 2ME #0"X<kc-fi†sbjrucqЃ]"R,Qr煺}VR9PmJmY$}6dYiBy&A>~ȷWNEt4m6%J(ѪL?hsdl%ǥvT8&97*A04 s^|&hdqYlb޲ȴH K lI~Wr.eeRn+;"[ࢇE wZ в(c-:}Ti4;Wc.ziBtr7j. H05%2Q1 0( >NZ;۪t}OutVO?߫A?{T _, 0Y 'fQW>\?T]-g =JW i<d\P)R>GZG󕋕G UJdG?^ܝ׈CrXw6,}*;Ep,L@;5d s,&y+hi9:#|ufR --*3#kn<;ğL֦$t}r $tH#!#b- h(.O{<6F'(M+TkiDˡòZL~7?^;~YS qڢ}(ʎ Tp!@)5.+Qɭ0 nw-ZpBYj'AcW?YƌlS'k,ڡJ^`u /4vbUB1x.D;PҘɏroRhDY>o hI*y^) ?;sXHC B8vhWHw'9#Em5(2`ѣEK6^YL`,ӳ8w.C&{25/a# G.># -!>H*-A%M qj<PJf[#2k m@~zeXͬ;)+CZ#ms[A| ~P%,Kx-o!Vy3CPL& h_m:£v2"oMEA fm#nb1bΜ3!ITp:ETBs-ln ؒE[I$LVjLb3]*T&Y CD*GcGP$A"/qb|t°Tۮ}=1!4h5vLZSI䌫FDzmyi('&<=v;,STr9HO?"0 Mx_-N"M"ДZNو}}ԣV-; ,Ŷq(w/(&1%/֣Ҏ==ct h$?d ,mX}G9~^S:zʷtR;}ڸe^3$2(o"^/ m 1nHߠk5Q* $ ڈ >c}_&e[#kY hN5,,{;G'YF@B换=0ϚfS^5(Bώab]]OSi~Z373jO@.*YaWp^<Ғ"+sU@>+ 3ٱNq[|͈]ǻF~ *b(ѠDQeʏjCiN2:|<[V$&.16aQiڱGu$,=<ڗ x\ffgLELRC{TiW=F-&7Ćt yM\|<$2x%pu"?)0}DX1aw+3dUIzmrj=DW)菋ܩ8yQ~v5">ok\P\=ƾs/5ϮmCSKP[OE+ş@ࡳW)oP]%H6?>n1YhzJt ^4KgRf qc;6&,E]NdFߒYܡxoZ`Mwզծ`%$آsu28^L|7UbkZ- sjW-cZ2m@]BRC:1U[Gg_>{c77aVT;@i@ Hb`݄Ӣ8k%aDb}WJY^vAT<߮W"!>5l bĴTµð[Aۼ>NqP HV9kV P(P紾ǫĂ&`^}2>k~tönЀ4^pf nγ^=jm? +j {.HVԐ>(gędR,9063?%^{oUO ~H ZSMohƄY{r31TC)[XcW8Jsf]/APy7 *-4 &<|7NcWZ1:T+*cS=3ś2 q Xf)6A̎e=AIaCO\_bPtA9 ؍Z:cDuĩS+dF-]*Ifo"Eqv&UD&.0T\&6 U4n3&dx= >-ָ%PxF s ̩b-r6I}YF&lfa05 o*]C^mO <%[g1HF=+!9\Q$%աMG]YyxQ\0Hp ПpWvyvsz3J.:4偊#91'4 b~1:ɥIJZI$nCؾ @;gF;󿮭B٫ySoÞ2^6Z#ub\gqG`_6&T*aMaJͨ0D0%D"VWgJN^aRE@l}Q~1«xk^<;9o65 &4Erܡw_.ϢS]qf>D;w (lqx{ XF. >܌OU3zK?[ +W`M\Z2ֻʢ갬>Hi^mڪ/#]C(>h6H%$VN/-D`ħMj.c.JZ䱤|זqc'63XMqޑo9uvQj,j 5n^IeNKi89rcGH9;6d ޮmzQ e'=yesC@bfFoxdAQ+*g2?V:ʭc.aQ4#阄A +^<!9%A ٦f}aostQэRy%V#!щ,3( vaN(m4β!!]X{j򫰆9~yXyt"",dn* 0Lw=[(S G#K'y=qV@}:86M_6޲X+4;kH>,i5ku H㐧5XRB{&5cbПD řIA;pC-GG? `IQ0VUpTbe|ː0vg `U!='?C?A)!j2? luv_*caN<kO}ޭX5#Fp,W`H9ҰC;]/Cш[_U \llز`|KKMVTfV$I6'/H4o[1z;Յ8U5k*D\V"$9wmWTF*%iO-Vdpq #545}GKT,B(-Hsʈ)74/kؔ"q2r&>mYħ]6}:Εo&<3174cw ]AU.4{؎*|ڧ.F" L0~֍GM\ʲ@(s^rɄMEֈ8wk- 2X2܍lz\LOk}rsel{;{./1p>9muuB#r&QKF|GNHBOFv_yK3/%͹!/^koFQ . ,U:Ff/J %:rj}Rvd(4xG5ݾZA!&c%fΆwG"XQHܲ\exF 6XI%p`.رsmMmgkׂ (]K.ɻFϋ/=Gl@=`-&?ǷVcKi> *BOܽHavn$6QQdzHIJ؊4 3Jў5$CYNhA$q/w߃IIޠ>8kT2+`Ř/E}_e6,&.o١Ŭh3L!H oS|~~++YO/wEAYџgaaK 䇘pvN:Fy'OC[ X0E񝻱鉤+e2Yz!J=oO@U a0^ifO @)-X6e&B'א%/÷4D i a!6ӊHGҡ4Bi~YcN1[E6az_ibQuf*ccqW s6 9aՏXȮBhZkՎ ^䘢|O(XX4Zk!!PS/,c Ih ]5=o&z{ ^j F^qW#hE&Ӥ^5Bo1~pI ЧfȌ:Rk2 ,xbn| [>s'1;+OQYȕW,o*4V;1vBb5x[ZɯCr0nà5$l-Yfoi\nM%V$a!c- V*[<{6V"z0*!!&m+ WUH+X?bK sOJnpD1"~N YưAbZTwE0d4MJ)I.,F?-^]1P\-"t1XwR&ݫ M(L[vN~+vTZTL6@,pXQQ\*8䝗;x2`$VԮLYs:$}o@1N5y$0P$Vjh[XYNHmy$"3==死)$Jt[ϬJhpQd xQӿs,d'yRJdtr%Yc/kD)^5;#hs8w+0&y3+/"䏰UeqLGޙ)D]WD$_R[Q,C ^æ l7}SMb#u?嬂lEf|fpFBxUtLZ.։oD΁! d bFQCTaZ`ĕ }k07TIPsz_^?p^'YA\r ^5Sp@ĭ/.t+gֶ0FH/*~fcڎha`JMhnpo˫6%` * zCȧ{]`b,9?íRlyG @cҬK(у#W{\؎L͸ eՃ)"0 䍁d%IH E +ү諒B֐w؝1BYW-|w-d(X\k͑[ &J%``Nd&z[ou*l[ͅr ǒQ̜ h2g{~Kys:Pք~qVN?U^Z:B1qdvr[c_ZH 9}Af/2VeN f% ;7* sl*Z>mp}|\A,Lj`˖fA;/7;40)>!ί2.4;fLh]g3 Xą>y`F3wmDA% PbZk ´z+C)@5'@;d\b扁Yj zy7A"'4僑$Pǚa^$HUՠqLAЏEtYV> `oyf7C4ӳ՘ зZ祳|6*(t%dDYiP\Z(]\2Fk q`~2G =0.D0vHd:h>T)ԞP*RFͺ?32ii,;YM~G(I\,=`Ws5uMUkfƑȒMa Y}j3xR+=\ܾ/"Nyx5[(W @cܲ?O5\FZC[UH ayLNl jRL{a̛ހ>( (д]Rt|eي:,[&KE4{MؒBR7!_VȪIYsU…;b?z|dWBA_a'Xl'FҽA4ϼȚ(Z8EKWX^ _VqÈGTNɨi2BH>$`Cv*"͈>C`y-9J`ȍzII㱃Mjŷa &7},U%a%XM׻ Q V.^erZ`NJԣ\ 1ռEůA'秷ޅ'Q5nׯ]*J2m,^ڸV'}=uМZ^8&yЬFu3iXeʲM4׶aebi-YazTn_v_ru,cV=(VEeVSb[{9\9".k>FUʱZxd1HyҬ1-PۑB\f`SO `^ b^ԄYJ@"ƬEt7;7wKFxHqW;$Ga/ !$vݞϰbOh#f%|/iuG*>[ݏŁzL1LK _/Ȁ1r\E/5i7*ې,O1H7'{YV AȆ&g䙔+ß [*L{mD@9"E e@SĹyG#mv3vVMn7lE׋atAxhÎPVE&V{Vޔ!4|w!a<&G„6Hk.d2|['w eaKb/`'g T7|/LEvFyeQ{]Ivwh~+G> eF1U "9_鏫X }6zOVB_P憘J[`#ܠq= D\cIPη&Y;R}2Ư&I!=TyPaRV->qUϞՙr58%lCoBNF3 mI%Mi ]'V;⿐e h# 1}_ }JY0 xJfjmIxA`m+O!`Vk. #a3dQ"LiTF5DϽ:FVc[ShSIKy0'W07ԼS-umTPPP#u9BS!"<`mXF@HܢH,"d93A,:(eJ i~LݖGpoCñ`楬D98 bzevn_.MEdb+Y>oab~,?)uB G3ЁmEYQ£-׿*L @0 3 +$eBKa |kT4`ϡy2#}x]w3vii•{6¨mb91Ob-{/}kIʲeKkr& qR/=}NS[#2,s`[Č'fwɉ;A=8ҋ@n#B}P"{сʁ;cƣ]+Ip;"jyiWEZ{9orXy$VtҬZtfr@ދ>/vg;hUpؠ$D/} FU.+iQޱNRR</TGSizZ75CPif N)3eHfM zQ?Lw@Jb(>otAķ Jt}TɺaU8_-}"CvƢJdV8CC!!^ό!`,KA̘+3gՔ#%K-e1ZZ?;1Q=puAWtb!EprvٕM6dSC#ein:*Xkr\_'ަDL{-czFb#3; /7*uEн{UwO^[XUi__7٢_MTbx`K]WcqL 2bpң, e_Q#e'PKF dQ~4&Dӭ#sfdHM=a$`cw\cFM[l7X2kFG6غ&恪K'7omЃbywH4MYJu@H2%^HԬl71bYQA+_hRoE=k-oC'!Wv cw7OHvCO/ȼ/,ھC\X&%9 =7S}ά랏)7 8*:*-bVtk 0e39JwEnk(HY2=d4rYf6y"&ZH 3\i rlA$eTq`5kf6|RTOxeZeRߟuߙM| WF3/])]*m$B]p%ԉWDrB6%%^V$Qwz#F\wE wZpGUHDGs@IA<:B3?ht'!pNvH\;u6n\:ôQ}:y$:1#+Fwv̪/@ R #ڊ[@JE>2\90xW@[wGc)'1age:xw6y|ydqHVFƸz0?=KjΰWbw҈?`CY씀jpoJ/N)Uľ@?Ө4b(vQl}[Ҥ|}dlcvFvQ>#5="]%pDT8 ̏-OCar̾WA?zzz \rz, u Aj c}="Zet*]uI>}-W.6)^]'i oZU3c-ʹ\:5<^T: 6}@$X^b-ݽҷ#! vF^y(bbIPTYEpLOӴ>NS\<ĺ}-1=,{8 ~wSC W*H!qF9,{)%BԪ* %☬5S|9<oNsL)A"zܗT4Îų.7 O. 9:ɚ[=\9Fs/ >̊X#ՠ:s"my} =*N̨iQ(Pe2;"Kػ֎U/xTݤgȲ^#Tr|*ŕ]J"9.|a~;"1= ~$ ] v*c}l殻6y ^C˸=9HJ Ysabj$㳚y )G*cs">d2zҙY R"ňސ '_VUj;%R5lT14&ivZؘm3D'Z +ז5P6UXe[Z4ȫ'ĭ͆P&W`b* —v>"&7zhۖvS< DMg/*< xM#[fׂM亱|E2iLNΖ0jN²ذtw0ygsUb;n9j;=*SmI󗻮1aAƒ&eERnj}޳iq&4:9fRk67yUI@;J6_Vz)drM +5J2Yx*'Uu mɟSKLAkvJ:".*>c1kSeXY0?4G@uοu fMc5rUz7uM;nK &|}eH3 9JSLHsU2u9}XQp1٤Q)^R-}kxIzbn+/&Xu"g쪬+ƙ^/Dlr={h*st$JA{_=Am?PסȼB bƣ[hXh1 @3WsA2*,iTpR-@/T\ᮂwd+T!-C\ȃ %}0Rd;bH1dX[m@%uhpk-}.Zh=͑RV :J2't}6dt'v x!MhT>M^dbl+ҽD8M۫OtR$ gu=WU%TlŵmўS7`3ۚdG s`#pJ;B.L1# y940O B\B[z6 Uh~$*I zt,AQ}|NL$X0I\%v]f`& S%Da'M Yt2F3l3)4' }r-E=9w}ac֋H  b/oKޥ(,nlϫP61rE %#LTl: 8a0#U͔QI">a{Bd:gt,d21Euk^:! ҾW Q y_$y\\H^B`g()1^LDL gOv۾qh#aH&4X4_!ڸաsRc=A(*(JCWYƭAm \YO' s# o$dP)4)xwŰ2SmuH`r§*,H8,1V>%# ɣE7i\u/LXLɜMg ]*(QmɉNH7ߍkOy,UGwRZhy >! b|cvK}'9kRߕ^+$豖Nxy 'Մk} ΌqVUe!aϻޡW/ђ+Jo\kIa-2l-JMGK9O1d[R"ՌׁN,dʔq˲ mgrwlo3M_OhOhG~vX(eژ̥!@ J9 `:wYգg} &3T7w" tUc`OY H=r1*Yʂ&unBAq8I6)҃_acÙ:!8'\[>?s6֫'/x\m0lV[`Q"oW"uD7h  `~e+ xdllN Mr1ؐ14w<ޫ[wЈ ;uɺZ&f-h@Mbe@R@? 2b,34C 'U3]4F<ƕ n9G3NUx~̩"a~Ib!!اBOgօW + }U-D0WݤB0'c'ߌUm`Ь?L 0940>]her/?/\G 7~c|tuqM&[SM3! jPuVo hܩB†Ep].zcDV(,;^X CEdw76agsAjD g}TS<%zkUܳoB-q 豦F]/S}a9,ΈeXl{&6te+ʀٍ{+8tI30gǑ6\;/h! wu\ш?5Rp?rCeٌ0C ,{D#/]3.6fW|,r`S"StKC+ h]E#GYiBZH+䯻"y+&l!59,bh!)ݞJYsRqEPCwxhoIcqP G1963 G8Z73|Be;!8#oӬ9U5)4-_X4l`Ҭ@A-+ X6-=yc#HfxbndlY_z=2&sElV!K{A0x}Ojc/v)/RĂ2> C \qlI x2EMVFLx0 ~N C-w?I\9Vt$LD|] rh& i&VV k%I"\?\T[GdTa^s@FDX$|-` 5O7$A{xV8[ԗG:X.tO Ѡ+ƨ/&"&G{oZ8|xЩ( . Q}1Auل[k:Wǩ{|trJ2p)mv<-!}ZkykJH3Po bI-~zU^1v  qzZi|L42-dihNѸRAd ͏-ֲ,.Mщja+L$jK0V)aq -TX-bLЧ#*BFo`WRB h ̫\T:hMO\+R_]=E d&]UL;I` ϖ<=.J?TQw##QYtZ )Q+E9>Ԟ}iCdړ "L/*Q)ScyO.OWE!XG|+\R/0O G}7Ⱙ!,$"NÍ{ەOLJ,E{!#E(:C&bYwxy3I"<ciRL$ ?~MϘVD/F,AwuwTM6\˷F @pIt%͑8Y- [!aߠz)7tv' ]:LRN鏾{\d<ӥeGo]OR7YK3濠^0<^8E!O-2bWКsW?Xc=^[ES;M{$2XBug{1ev qhlW0>墾W5 U&k nG އL猇KC WʲLdJGyMahbyC AH/`ѝr.J {vqퟑ`TO,`t T<6z&&@@P{% D G z!^{4&Iknl ܰ(]f+&]m`uJUϑ x-/y0 K3qbNs˴Y~V͔mI(, c]v}KH[p{ٟ/[;^ԑyhԄ/}B޲9\Z1A4l3 hoCTمf:r'*SQ2 !m< "ש_)Kh\MF-FC}k EKr{-X6AGNO6Hy"ƥe% ;Fx9}]fUl?͍yl"[C'gl`.-ҦbƳ7hXD^ Z< NSZ%?)y=#95՞PjĖPwvwo(^B:Z %7,d%@{ߔ3kKem'V܏bsؐSn$W<7bX c&21Xj Ug5=_hNEv> u >Qbn E,+jZ$P66C$m7Jdϛ-J\"(!YlD~^ 6L[q.YlIf{fad1S`9WR5i]T7D,J"$=nsڴ˾zAZlYbQ(CmaG~ͧڙPRODa_b#pKrΎ}p*<(R.BG;ԃQgrj|ӹ(|@ FoD xqG MٳPǡUu~bʶrt64T"a8RU@zj_5(_RKnPӗt@3õ ć6f~@c5޴v)j/BߤyN>%[F"_ +Cp'> QQr)ہbz4;޶=3EE] Ĩ.:ΘVSPaeKIZa c(#T MڿgVBUc$AU暉?|{NYfqhI*5,]HyOktnhm$o4l4{g^ ZOH5ܫYS_yoyϡfx +ZMq1w³W'ʖ:K)(I"+t/-aekǃsOW=gp_ \݊,ZplZvc-=N3 Hl,:ڟdS)~d״x<.pG<s&k QgbWF+gǞ auCvr` 5fzFH!%%a%Kqy~k!%33B^HFw8Q3B,d$*0l1Y}:Emw y?n &ljAo[e*[&'gh !Pː8V;froכh:p iJnXqSK{@ɡ5K@av$|]9w UCYB3z⦽yΒk~?IǕ,wa3Ѳv 3Pwk~%EVy2-fls(X 7ƈ2b?tCE:;ѹej&jBmKO̠~n|j#hg(3Bϙ7?W"#HbH&p@(1n ?#hF- qzAi"dsK(+50fإyYDO%N'MH>6?ϊ9ӿ\|/qGEO_ ŮPo]?w@mf N;E鵾a9Љ28cOST2$/K, y2 A3+E6$%v A%p3lDH_['&kdG]?x+@i+KxG)ѣW˩Iw֑{%K-3ϱզ+>J3>><.'DRcBcAҗWJY, GiͮV`;͓-!#Z6h#VJϞ#aB6 u4ޥ_;goDO׿I<ˏHD 2׳}5a`zJVQKR8X;ZolgZk<Vl0inٌ-z^1N={~ܗ*%MW{YbV@o?1Y3tSVd(\9|Y<8-/??I3&\vcwB=9Ny+$'/T|ăhdnL&l͘nHk1wBP]a'IN}fJ(h[W I(CcH<We8uG`O$14ƭO2N|p-)Ptȁ唋OLc*ޣBZVBH0E5,N mt$tT3O7+e+L*A/cܖ%Mmkʞ@  mNk$ڸH EC kFS-y%-!gTE3ǻEI,N[pZ qaZ#j'UeLH" s3J9wԗ^x"sHh;JfE^RrMՄYeD Vd^.fOFP<$Xryn v 6e f@(k?( {^r(PvŒEa"Ta} )У  MMe5P2z]ĊuLlƱkI;?]!@/Ì%j(WVaH&떩JקVO-]={mokJ, >AS5H+Z&? Bk:I,T]'0 ^=}Dry8L`"ϣ[,Ŷ_/wݢFrEb9` Sg "(He| mϞ2@l:/-}UQ}._Ej1Yٚ+ŮviQ-PQ{5ݴ:F lͲ@x|#3uHrnSh)D - jy콒-.|,3 cIva{sU3f9'm]{_ .Ͱ!ȶ(oynË؀XK&2t/IWg_tv1rhBWǗO;RV=ĐHv瞤ZWo}dFܧw*BLҸLݹۮccVCG9@Ώ|}=߶Xmlw]t<{<ƯD381'u7L_CMzY".&hTm <+'Nd6oPB ]baݬ_b m^*eÓ*Xh5yr`5&)ők:hK:bwnHQW7DѨ}dk4 & ,[:0H 2{aHy&GfX7[&|I,TTϵ,"b↮=jo}@RN ꙭ㵩U,*'Av;Cfk1X6٩:d5Ur \Ljk؞l ۾sK'cdZ2͊,e}Mw*Y:WgIu&LY4#̈́'?Bʇ;b:EIܓZGD#p5՜,w ͢OD/ X>ks0y HSD|37$Hx 3jh5Ew> , ( NO襔gX,\ /{"k 5_J#l9”90Ou!WKzVo3L|YG^6sS|^,OJ)mb<{1tNIA\'v_(wq}5΃ui̍|4WQRJzwzEl=>)^n>@NΛA$rj;0[ߨ0z(A25)TrK ESu޻G5(\V[9xvWO0t+&lSƊ&t?`@Gq H$Rc>(]Rn F. 3jf.CS!6Go E:uj'aB O@7&rs3oԒZKT2'#sQr1'@^k/6*%FooXiǚ3M5;svi܃QlS56&Pʜ}n?;"q Ǟm~tbVeF;GCrYNv K]gҦ=߉ wH`sݱy4jzgm$vCvG,>z&gMBJ50/^; =fR}KN?9ս>NedP`Eg {Mb{ n5 fg#c,D?Ń_˿qN&HxR4cZ~FX$꒳aM/ hM ry耼pp `"rBu݂]+=hݢZxPD}ԓJ3 uGɖ$7y|O\ayaj$q$L k`f|lC>'0 &JD;?if?UR}cƭgp ʆzFE^g?TJ F: |T9iq[giKíׇWiF{zvEk-cm?35{~\Waޝ! )zg=zp@\\>Kܑ[ߪJf)rb΋~[ sy)60Jsܾ3Qp w1y+ɟ#-]FdR%5h ,LH(u7n.DiOV'~Ųdɪjgfέ [fhvlvF gvw{U*(DY<)fqpXg-Zoʈ7>xvl"TP^B]u_%0&mn 9EA/H} -+ T?2X=n)6eR[("δtAcPoUI K: y ğM0>.5E4;M.C5 bSns'iwbZU$=EŘoPqR43&{o~嫑W0uKvWC 8;`%}WS& bH \=:=«SSw)ɩ܉R6$Ra_jOj?BܦbGaz!{S7@ ǛiƮڒ-.TqNb5XɂrH`)8PT3_w|\y/H)*lOZs) 5zԻvi徥pt 5vU!taӴcmK^0f ٔR'NdN RhaHAKMٺdR㮜b?5nSw00 =O Ⱥ?YLNpD#qp'! ̾2K2d #{I$ ".XsX>ah.1-E|koa4;8#dK0D!v  rd*' |{Vӫ9}:Jyykb އv8A66]Ý76p=ĒrNWE" cR \:şS;0E-St':>ȶqC`3NcCޠx[Z0/R!F3K}:g'ܼAPeVp:3TIt.m:2eeP#vy}&FPĜ(ivpA\I1 _t:E9lLbR>;JT`$Z-A@>ȳ %^/XYoW$ҏ})c"|+o&4#ʠzp gy\+Cbm'Wi]K[nh E C6oa6ڲ5Ɲ=TX͎FrmW]M.0IB|ONeVмksp;s*%_ 'k*=wܠȧ,X>vo_@;cYdn\h~;q{eScnvzrS)'# ;\cR0?oUn>v_!t Ʀ[ĢR{} 4$??|q+ɒzKTrڛf<~=!Q~4N?rlm[)*ԯ[2x;+y1CBw7^/LyC ȏ5L-l\ g{Q 0ZAPdoڒ6-Ior 8#W',A:RPA*PHQAltAZ3 =%3-B88 b7vF "x6 qW 7_(CfGZ nv8kvƖh́τ3$m-@MfNd$?^oKjdZu:63 Xi?MrqkogK]0"Y[2McO@u) P; H^AoOFw[k5y>kܷ߳K"e~Fķ?*jV OmZ"*%/hӰ\X֚2PS1B ɸgn?:Xu@ƴ 1Z/!NS4Z0D"P%S`XY1a dlLl5yс4}nc]^C%i1Vk ɫ6v4^Lt`]9=3O4WMp:zho2{DS zGP2OO?)5[_%櫌j?~$WoBQ#k[s!,v\LXԁ1~:^v|bVdzU^ް8(59kC:Ru7/:?^;1l py7 tdFC_obZ)1WX()VTN?eP zM@Nd@(D1ѼM[{ ^VSCEPnsn c.AEENGc"0UV+-+/T-\Ʒ6Pd `tKsjj CQ D&@ʍ2Ƣ/CPP+Rꖇm!ᬁ'ǯ;S!x^;M+ rL&VybtY|(Z>U»%b&jc+: DjGE;.EL/_82i]铹1P;W%~TVP lbզQ1=-x^:~2ho[R㹭"^i^gOJ3soOFmͣx-(ts-7=1*hGo2/é̯jRsr6|U{ǘcً?#͓![o#܇ړn1vI>Czo{L1o(%^[{:6h:"ICvT~U c8ZK}g?aS `:߾fQ qsnB-N ?7v{u!aqLIĥ,r;;y/w'F R'MZt2ˇ 7nQR!GI>L~I`lI.3vHpYs5/znYw5]?'auJ| ی_*pH=D<( nBq4y]@D kkW^*Wȹ0@E}R$D[fe;5XR@băHa;Xfx4w1+a i¢5GYvQd"  yp8+`O_b; o"3c: uE34Ee]uSӁ94N xy3›IZ񁂌M;E܎6#,Y} *7=r]w sxwb :߀&sgP: *;m#ߗo-1ӑ0KM¾NTsӎ;~\~F]e\$ü~8B?TUwsztxw,aTG:5GU /S}GzjS@Bn &<ϙLGٿM[p*(ˌ۸Hyv&4i1aC3k|NpgjqF|wP$:1Eeݜp4spkT|6|ڞ,Rp75f>ϏK#}n!ČO2dՓw]nVAl7Zpn8`$lաTPO@%Djo_Z^WB[Y֓< <Ewjert7 ͥn"bTxT _Ҏ{wxƸ]2Bww\&{-V(Ju?o@W$3Sէ9(|Pؔ)8$ܑWNwmy[5ˊfHȋe?,wYOR2fBl;ߙTҰWbbNOsȍ*MFl` 4"L7Nʉ}ݠQ({Hy2Sq]w߭41׺]ͳLg$T?%0w2[.ۛ؝C]݄]\=V=r NglC>A[xd"Ȇ [8;fx1N.y`l co9 \^_>vq!3H^!`L@1o,Cڮ$Hpz1zCˤļvS"94ӭ`'ߦBmy~);dR0Ty~l'ϭT)VP ͡oeF ɻ}un1}?ߖ K҃s<鈶cnYC ae@U)LmvF'hԱ\x:)Q D0 K+;I>B_{,?=~KݻOo>\Aǃ⣅=@K̽+ܬbOfSޘtk$vM7*]}~ДOkg? LÆD D W_RחQܹ/`"Y4QT8݇m;)K,&wn@9h ne|Z0c Ie)yOQ7̟.3+,?wx{:ޕuos𱝁=x&8{^_z͞ .s,LJPoL:ۮdQ&m.d-ɰQO K[$B<3` S ,M Dcl):X|eCwLqAVh-%0oD9wvqj=2. \OڣZvjU;\Y8(70fVlE#(jex\ׄNN]UEs&݈k j"mtҜkarWg]ly#ʡG&0jiD )~:t-19J5Ϊڀ GZl?kƶ0[4m@{<Z tadUD,+\9BE%"vָ9"~* J1aȓcsLWZb l>|koD٭sx%2.@KS+6>%-H֒]%sY|"\Xw.bࠨtZW,{[[6sg ܒvI%SE3 hu,4E+0"KWN*\hy2E7k#mOCo(Cg}["›!حdwW>{9Dry=b~s"ig ͹<>s؜DHP*lKay7]Xگ׭qf66٠u<7IqȇV'Xx?Ʊ`pS p: jV =j ]̽[,?ـ{V]e>gt=C$+h8pDa*,@* ̒b^P~*2]U"<58Y[-chӱe;r 1It=NnXƶy!Wz+F._3] 'Kġ_1ͮoт7|x o`7'>! & )HGY 4C3SB ̞[{+^5}bqoþ1\HQ+z~rfBY;ʘ(;|`A 9j8|߃/}JV?irښޯaÛ`=sq.“|ܱwUcbwHMȳ%@?W}LQ_HQE1:56 hbz&͟dob*r`ꀦȾd{k3H*t8"9$" F b#L~/7D#9Z?|rg/7DR ~E^(@ 4׻Xyc WEn&-mQƒ,RjOks+gQI;Wԟpqr(v}#A^rbn^笕py*g:55•_IcAߨ=z)POq_Dcg]^GX9(SX_%q%vBY^< hyRVybG\K(@rt˺oͦ;ηcUpvH DoQE`zpsWPL$4  dNw٧QY鴐ؿJ gp_(ebyJ/F.٥&=o|O5l~R L=Z2)$&a1NЉ-3MvDRoWC܏n$g@/D7GvC&$JR/gHWgHBkms)_ly8 ,/p'Fcn q<kH*:P'|pb3*4aʃ?Yӛ8dW/{fOw!˿#̕$_Xt̐؏J7f^X!a03Wkّ;kOrlhӔeGY_bvA03X0S 0@B ~g0Dјzwn#X+tU-|cEr)`vsQlEc\;'TS\i}Z0Bxx l.#t5rt4Q]Qه{>Y<ο`YdV'F@c×%"v6|7O^TKl|:a+].gpI#]WSXQ~?Zomڿ&bPPgbc%h\S/?^]dѽj9>~,ݹS?`="Wv:9G3;*$u8dTTlmVL\`f|Z_^n?smĿ;!;-r_'[x"r4 Vx#5? } ?BUg"?5/CQr`fA@Ïo۟Z4)u(?Ů:=txڟK].Ar0PW~ !x\OXw{tB0mBZmx+uZ_98[&:ؓ*zl_Le,F\s7Yr4i@P}!}`2N5ש uB|Y`߹.ֳvf-0f@ slOgN<4_(=Pp/to>o[~ GwG.*KbR|Qje06Pکj ֻ5+zo8nѠKFX*}yu2^ D0F3nC p>&| a-&nB-No[OnrvN?3 %{zB_'zIkΟOwH|LqZa2ܲl5_f=Pn~oyԲ}۱?QZwW98pzMKFښE|\"*nY:[:&9|*+g沸`bVzf@qKtɀ~ط \K87-=FZ5Lrcm kՋ|V;;j_/r.DSpPNT㘁Lg@.r Mqap}o>. c5/9{ 4Uh<8 2SCqѰ͌v`BƢ(LJH$#^C'eV^}+: r%LmƊ3U}-Fx҅e C$qa5^Ywh]'1WlQ~ۂ[Fx52Ɂ>z0UHLwy'Hm1S}vu U)9w Z*˚2|U')ߢ%a&jvݥtԥm%JӲ7؃+ŚGP {nU<-qz_aHt͂k%ٶ\80ϟʆSpӤ!  VêaMV!T)̪QZ LbfiCj7 &?Rqo^o: @x2YuFnJp$6H) KQ=Y'u f4ř#,/b6ᬻ<؃\NݳC+c;3>Y$}<{h?/ TL'R)sЧ2wc% VLqr B&pP Qz>yel1W(AIoyevq%.>-Zͭx^yd.\;*A ʞ`x|E˵AW>UvsZQ. byN,~J_{],dIUzVFZڞ~{b;h|jg;6 l3.1|>h0 R]s!0VxKJ;FPT{c{'Vµ(ck=$wh>+so[*\qrD>TҳcFck{1:?(뜒^R6UX=[FXUiiC"l4+JɁ_7pUML;1: K>g?kio'bS`7!;jY YCX'tS/nQHU> {c4Wf7veRqM%(zݾ?"'_'2rFOm?Z$l* LU<GfWpw2辰 2 |V.Tvf$}+hw7y@9߉zUJd;}tbu$?S/Ҩ~v wO$(Ye\lj"tUB|_8<6eOIM|%oY ^y%,̑G'` t5JȃXTy4czyg' R&A6"̳ȩ1jLѠ4h 31Zr7vcAyپ10/^AhDt B"pv b fAw!Fǘ䠰[l8-s"=I){:tT[Y}[X&  ְ܋6{gW<ŀqv.?3W#sˬśYUw۾K)|.OvX Uao1v8uP-wxW#t&QOca3 7HAZ-tMO\Ucx=7NȱMQO1'=P[Y qzt$V#kZ&;>Ygv=v|]}kAUqW FK</']z ?` yx6pD*(̉@O)d,q6 /¹@Lv5,kX}Yp ]|Y3(G fnn` x* r okkZq%)a)(v=cH,Js23/GҘFl:H3L7p~; R-1mʵC3D:'x<Hu#n"k@؄GPWbׯ G@ ᪸=bQNmi.{Bk2ͱr<woPs~7('36MG'lS)-U}d5-.V\_T~gEUܤ_7^eKZ?g\,Fۥ뜄Ŏ J5 sC@X)QW%A9mW=1ytr&Og./o&m\"VV}FLf/M`P4ԝ mVIKzf$MBwa8墷p{ձnOTWcx~]vQcؿѪ979Mvclun؃e5Ŵoz̟{a?n:3ݿю7_j~sp, =6sG,o"JuZA"c-\t>Q>ex=S=:>B乞4N;s06B_))ǥܞ -SH } dwMG ؋(;EOrѵ0w?o;Á!zSd}0מ.}*ayrMP@NGk orO/+ ہGp%D(x>(C)} }z<34?¥Nܔ)dqP^Og[Br"^bFL0(g[7[;O{pX[X2}MYVfNb!= Rzr5/x. ੰd5Mlz79mid 3]7^XxpK|!.uO+%;mԹ}PsABWlb-_ 9UdjUOE'=A 1oag;hoTdێ/]73aME3 (ui[?-E.S.5w˒o`okg7x>.+(vjscϙhK3/پuHؾCs)aF:GoFȬj[D2} %9g,#eӥ32$0z:}3ls'w%vȞ[cUB `U+29.#|J ^,ۇ75tn9ngx˔V uzEjsgC@:\8t8놂?YigY9vi BJPq0(pXzHVvK:4ɜZ1{Au 5NԞx黨{ظ>ϕoאS}(-0moT^ϭ {aA,t>D0ORi՗'5R-ibS\p##65\gכ膆N~l+Eb$Br,ȏ&>E,|{#) 0oO{DTJ40OբR>CKhh~+qSh?bt!EMp E]w1v4-F[7Wx2ƜYb:ȗ~g{(fIF8WeZ?s|VqD=aɓk"\`r-k2!VGwQ 䈴%P T*kڶp9GH Y.Lgj)# xUgV-Wl'ۃZ]c f>3I*Jn׍:p_,M>8Τũ:pu]S}!‰;MU㟜Brp؍/?-W#۷Xk{ J9~ۺ^io%̈շ rAFq3q|5~Dͥ¢ jdd1Zd @_fYJ"0s2q[eiνfؤ^ހ<z= s{סd$2ׂy\njʷ:Trѥ/KTwzkg OdN)Π 鐷]B!v8ˤWrO/^='!EE8jй&!o+Hyd.v6y]O{yǦ 8YAgcȞ& '3x2'S?8'_s_liU#tM0vηҷ|p2,<͕eLEhԪ?gMvc_Crxo@ +_~yxgIDõz"(;z<+{BW7u8"8Uph'B1^D(v~̼/_I 6I-=q,vՄ:*=b-2^H,`obae5>Vg^s8ԢC ֙ǫ͙Mesz=ʾ;;b`ö==ޭ!b jfkԑ׹?ƛwz&{TӍdh~%i1&\YgN{J<WRu[ZUIᩊm9Rh Uo~=M@0{MJ<X,w|(wۿdL>~U ;/r|-]g [3+ xIW9d&e+"|xކ[{iR/-H;$}_1k ѹXy+vanok! E  wU%>qh9 =/pfc\39 0%W$}&"w̷7k)Qywdil4W .ʣ]c& T&?%Rth_%Y9r.9y+ʲeMd>xO%r.eh->w&1/GԬ}l?kK~I3`6x7ANnIdZ0Җ9:|=rWݕ=iēCɽ$n'6զീc>Ucsڨ*Oe8CX8| SPS/qkza8%&.O |` "Ⳉ"mԵ)eromW}߾NO717'ZK/<2浕K&9r k&&?49t@9!f !,  77@bkUU5hNDv جJ0֤X yX2&a{:B΢ρP%%RRPD̬XURg+9ly=MVtOqBh@ެtqP!!!!pY<п?:vuvy.ۥ^U=>DMo>;BvܞثmVgMLbS )ں]B:cpt6F_Nlb{~i|'0ex|޾7c}F/qneG#OcY©qŬ՞iݏϣpzNԞTq,'3qҘHH~Q}azlq-n:%@Y~D?i=yc>͒{tz]|W7yHg[ ;杍4^~3*#[?#ZN\ _~jօ@#yCKAqdtdh:UVU=umB+qw[USU_J\RaUhϘuF];,oCK!+4 )>EmMcu]AeJޛ y}<)BUlg-?k6Ucjji5jWgӢ3Q_.v,Z8h8oRܱezy0nX׾X&v*GL taᤂ['l!t,e~JttKr0|J\W/T` g {͟RQڙ%կlѿoD}.F>qńƏ\!Nv1x 3Nok?۹I̳v;NrL[Wz a p1@`<xt{bofFvpn݀AI$r(:P000.(=]ŶO^}?p3MJ:44`a@/ =C#bֲ8h7wjxТB&:]:5)^/ c+lL}oʷ狻[hsNy-:(W7]?3_fߓg:?x7$6&0F^bWr$m ~h1K TK:PQ}.5{ 6ol|φQ [uX'/VږfQKEYvI ]Ӫxշ)]mb)%qq< ,Cz][]zrw-Ya*ًtGEG*TR/Q^oȽxbjр;;oQ=MRT1~A{briC@BPIulo:_q0"i%YvarV[YJJ P a`! J LʛdQkFtw^ͫYXZP!t{! @Nzi8M *:oO cʣMsuTLYO;¹?# P-\Q80G 8cxŮ^L:[UH(+: ⡴*IK!kOێ$oq<[1Rx!8P0iWQՏUF-K;чr6s`|dO64y+V10y ZS]aWx?mE,詭+AU6rHM C!)WU7ͶV?]-@<:V~{JٸFIϥ?SWrr6fY[O腕=oi'E%vJNNotu6i{KōKAo*E"T H4<g#r[[Hnut˦+f@QV'TKm8w!uZe"ŵܓoS|QiهXwYU6Kj!ASǕ[[:P[[3U@HcGJ=k{1A$Ǫϩ(Ժ|b`Q }G󻦎lMkX1<[s/9F2{-kŪ|(CdY46=|:3@C'=B"f)eY}ͱ= PWD.+(lK努*1g)*'@95S8kpW‹c3XGGg1M6^x=?5~ g=FM9n8VZ)̑*rk+ϧۣ$qdFPARpNȒl\6Z=u[hs@f19{0Afu{r`TQDQڛo]#zϡ8+& ';9S/qqPzx^Dys-hF=&RGE8%u ox O/0 &y`UܩY3_"8n;w]wǁE3\]lTbo84ڽe~=aL:CQ{ECt/Nqɕx 2&2Q)8dh&1nA2FPDr{ΆW/,ٷ,i*M;'kGҖ e}M߷Y}o~GU.{ɩJw+dQ[bp0NȮꙎ QuӦ^ clެ?q!SOF; /ȅ$Ak|`ΧOZ7,}~/f>^%7p%=gEޫ̳"i,= @svI-no@8S_8Ϟ4^BG5iZ~ WMuq駏7P7jl;|"Wtfiye_-+5"#|sah)a]!# drdgGJ&^[t$3` 2 '+(bp;$Uꫠ(i8c?BrAC8|-~Oin2iZK][T)unjpn8VK^kT?tc p;c7؂/^$sBE בC-Q !WD^tel()s? yñ=y-W!BOnߙ[1٬6NG> ɈɰSٟnl>y L;0h&u)arVuɯR΂LH7{zG;"Oew?oþp `ߍ^0P 0T vTP`u {ot3[f͛fI$E"uSb}>^Q]] b 9lmosg㛁:Z*kMr1q{J!\HU1 оЬsOrX+Ck\ZrfqhYGUƊ7~> Ŧ9(qreHVqM(="%`؎]$꯫4\,a򭥥8't0S(a R@G'߉.h(7o`e ]gm\ ^{ʠQ2N/:#i㣣iRl:aq+:7RS)i?BکEeA_;]B͝t5hU_E}GVW2AfP!^m޸!Ǽ:m SLp-\QlLJ*i/On~bCGf`5`wI z[ʠaRaBkRO: ~/[{P:N"MʤlhR y!rX]R>$,~2Eu 2xcAlrk\R.\Wio*M4,Z.("LAFT}kP1y32r`Oo^22'ŕZ9֡rpG:sP8pUӁ0PCN>WOx8/-sg.7M.mkXSt4]flg£Qyߞ/)(+kubz񤞌W0D%TCf\ܪsC<\EƬ݅Ĩ`Sjn8XdLomvuA?+Xf,2@ׂƃZ|?N1 30Ո:=Ema ktcl~H0{c-c2&>$s8/M]wUqX) ]`lJLިp=T,)>]tUR\:lۍT:h~ 0uj^PzByt*P8R*c7~u--4BB";tX%;|R SIQr_t"ĦB.mE;O\~j:/9q53A*aDMh9/TOta 'yCPֱZmC;gZxyl;pET\R(P|79MZmsϝ13BOѠ=W_|_ Dw[.{cykQ݀ > (5O&,lto*z,ـf &@03&qE5Go?}/gVp7X],#\\p/P ɥu)K^x >05ok bE=z@ugU~BIDGӃpGds$+IO2sX/zTE BF&u;{<' o/}RV<b0آ{1naWQp J*Q_QI>v lwiR)"c; @Unf>x\Z`bt:4` =bI"|Lͦs;=,?%׫#]\xߩ֭o {8143@^ -P fygFuq Z%]LKCq//..j!`fu$v4KVDv$nE8'93^*=5=щ#N6lKz_VG4v9h>g܁AЩ8w @zE+ bg*"2Xo5v<~6]2+L\{p~&gr srM s]NE#4*2R0W$/nvzG]WGt<ػ3չ;#K^79͑t5.P\HvjZ㬚[_uM!c hhX_m6/׿o:bF%(_qop8Uݙ3LR:9Y5dF+y.?&K%PioZAEh= |B]M_{sa0H1a雃!)A%ӬarH5T#_܃R_SQ^[ f)'(ӎ0ć`ܽ~ׄy/sjDr2M@äxf;?dzurhy)otFU%&4drbH2qÆS{2 c>W# 2^%j‰-2^`䔬1}QQu¶_md-9&jNvJ=]ɳƋP6=L _ sM)dݪi78)%a{K?SormMbկ"]L}#iƗ̊(Rr6Gʥ]oXn!P/i|]GjSwdŋD1po51iUOV !vtlxwf^]×]_ 3+2qVʈ"r܀ひæCBt"L͒9 Ehf%/]}Cˍ19Aδ _/i~Sl$}67VWC~/.-,FFzӜ]¶;GPxC۷e7m^j_ޗ￴mDU(lˮjc׌HDŽ7oE ]\o3%h&|'Z)#кkO;#p2=scw%)Kӗa{9q]ep 卲6b:bzw"+8szSaߋSL>>͎sd, ݯ ,Woؓ ځgTt rH~r.nS;َSb׼{ ϕ]2(7p+wnPN~x6(0k'j`Z')} 6TZ@hyAH3ǞYܵ 2B&g s't l]h)xgZLtΪQgbz`Nc6?)<73'Z3 [*Ѵ3%\Qr`WӅTfꎂ39=W"+?pkxM<8$~QT]9 irrМ-Zտ@@ޭ-ώN2оC/ˎJ%3;g(4Ե%Bk#EsN xj*Hz2'>?)j\N"e194a*'ni&5~E -fAu;|+, `k/ o?sziٳV͙̀l47p,>Q)dݓw%a>uYY oԃd* o@D@DR }IeP/'ǓH*]kNz &D#6!ǻ-x J>?5;۪Q3ܰ=_p뾊Qpm[tc94)a$9 EK:L*4D:ͬ(||6_,kmҧ#{kˡk7oQ#Oh?YJ*UHJ Tew2Ď4vXdsrSvz[:N[%%_eDW݈܉EI7n)ȀΆ!ǟ1F4|`>QjLv`+= e"b 3G`ݻ0r+/Q8i;j"'\+]36LkVܟl^_![1ľD#6L-xɻw>H٨B[+d*ڂ==ϗ'"py%3S./ksĒզKC_+m`fniڨs-޲?3;(:7~B\$ i BH*'> 3 tq7HmxY Y{+h}dQA>h.NoӁ8 Ё)N|y[wlj6p6Q$Q>ۘtzvL7j`f_X +\Ǽ"=8^( AB›d84;:ux~O?ˡ[c1pi օIjhB}bSsesJn_̳J?59n~'K#HdC 3;34Ҁ|N{J˹hb6CrWª_gK yKSC{d95L>\zlܽ H~6A+Qds|oup͍_o^ =8h^Nyxj]H/J撽Mj҄69trGщima~ e <0ۀ e#&CγAne>囧@@@@$15_M};Z `Z}Qz̖<}\P}@A@@.A݇> `v4r:oI~`p$ pyyzڛVϬB2Y9E'18j]=(u?G)? oN'*ʤ&muv ܫ`:'T4E4kVI~]l^l/)"renV/e+cMm]v= .&!J,c7ݾM<&~dp9F]B% kHyB*&/fp}94VD|;^gYCS֓,(,MpW-)fbt97zZ T\G#*0"ZK ?M淩^mX!M̑yuZޕ.㼏2 K*g1JEݾ=$זP -12(G[fnؔY}6 ||jXEJW~rxQ`VE)KRd?DT]_-^{`'x^cR88gip1XK)N M\XmM&*Gzyu=|a-Y)LkD"!xwB}b413"ؠVM1NvG.C @Icl"Cr@SIcGz-y3 C6ppo\4/ /c?s w~wq֪w?Fq7]>kV VMRK܁[rwi+~(~:ܽ",L8#U׹4"] Bg |y1j+v]JD'+O v TezOWUcدLTpIu똱FLWQxF%N"oP#- 9~A,yC>6Y֩8_jpT,K$%&>~7'2' gVew+BZ -G@Q /ؔ>p)wLiHZk:܄ŇkvSgGw$ڧWX *˰j̓=ځC|DɂR}4*Z$֣OAYt+޲0=n0:qX$|tƬXjޢ]CfW_;7<\`ޑ ո7ty5QoS"q3uR"n0Մ3wu%EI|ZwnAb_ҠN<]|@{. 9sԗj%)5Kͧb>#{adBs7'}.|Sj*sR}H5]Cr 7<]WƋg΃Q{8r Ą ! ڃ7KcW2~әz:YӼ➮+-qJ_l|@2=6*N'c. ;0303q&VL0d s~ZKLUu- `wvVGGÀNr{J+;fF&"SH܃BW>4!|ݷFσ"J2;'D3gp~&^O󷍼H.TI/x}'׺H^7{HH!1?gsS ^~8gejo`-PUFǚ}L _yNujWfNǠ|4`u&/.3܅8&Y>. R{S{M7I$e +K"'}˜}It7Y6ɈR[|ߥku&/\ #'zadNgH6'_f%N\>F{8w Aj,ֲd>q-߮yނR \helA3N4'Ce ďVL>Tژ'w=jZ8|?; tp&Cfug1㴢wPM T\ș}&awJ(S k~D| | dAUC҉`pmq`-:C3y .;H-kTZ.:&F7nIAKT_Vrab{&թ G;3ִW?̷kv]P̖vXkh$%n$=0 oh۪Z}ZWc¥sJNqC9TD挀"5V8 OMsgc$7,麖L܃r s.RtI$@ 'ZʨӠr,+Ez~^/1|r˵aA>z#نdVz'VT+VJ.iyZ}p>+p);ݦNEj<,Dk]KLH\.Nf |Bࣳ.Y=e Y!stvAc/"nFPLFRBU@_et GH<߳fۍ G?ۼsmn zo6uܽoyتs Mq4z~q*荐o?µe3\҉_X:jwuXP7S\u_.+͙G̙ f4m yVkIsLCY6[~]+EG|ۧ=K-t)/|18Y/7&m Qƥ>~'@{׻Ѩpµ&9e;4\sg&3]gE sJ?tE_q|E?+]UNlM ʛNM?e%{wr>pH̅ȏD iCٯfᇲw]dh):RY\2yZv~Y>cH*9HJa 3`B` HHK # ga>Fʮ7y޷chJJJJH+r\r2Yp.ZralZSDPtm΀y$R F85=t˓@a2x:e,-K3` y ~sfE~^ʼnTzgj4 p`OP>x|t[/r8&Y]ө|A۷ۘm3Pp˟I?=3ǞxZs /cCl޵^ˉvqۙGUa?i(֑"1G(5]Nc&e{R*,!=|mH@"Pݛx \뤎Km|LPW5L++ꥇ*\2ͱYڿMf ;5@{h=Zش; ܚuec1jp.1DOɠC_88! VsOH<UJ:}rifKmڕ14= /=TFZIߛ#wbn ?4WK[>_={C]쟚mmHÖtJWK-} l/l$@ڻJ)_ @U-Qɾ3 |x="K/Jm߀HM bj!H–P7" Ռ-{ bqxnT`eӽ>˓)YSt\Yxڋf(9Rs*q?֪)yNKf9a(L^r_Akܱ} nuWp= TnlA1ښo[}AlǍ$Qxq o-Wt A@%XI=JeM]&@0`s H(2@QD:\=X]`qTK\`C17:MRy5tRfyAR[m,l=RcoIJ ̯—L=5|vs0^+WUB6B"./+Idg:"CϥC6U)^CUxk)PGO H~fj󅕵Ax0ytrn(|zÙ/,?]+tqpwmaQtz<=#;\uȩG5ԽqTsLJWo۟JޑKз>x}} .Cf3b"C}R m w/6.+˸B>Yz_D;&׺{Cd + .xf<{Cr]q~ U 48qZY^Qk?duh)OSUP6|4G$sbj ,6Qyx`Kϛ%|BsO㹸ern3!q+orMÿY\ߕڧŢ 9_>Q,78XDCӾR}c}^;b|톉l?)rƲq;Hy p 3c Z0w#T꧷0;eF_Ylk.!2vl1;g3Ϧ~m[FZZDZZZ1\+8=$73ἰjIM h2 γgD2>e,q8| .x$B:p<\~W>oxיi|}b|߷4jg8Tt9ѬӁ45xz=t<~4K?yxT1,9Fk_# }M #͊ͤcu)F=go Bhj,MI4 yi=ZK&hu #KR|miϥ,ApVHH7͎m뱼9$(2iɾ2[!5U[NA͚٠k,492X3 {NtevP#/:r`?8:ɇۯw < $Qi򹜚famLǎ`s"zy{+yxґsPR> 7 sb@7Bڍh99DD͗fw*wx "əgיYNrT>#Mh( uhٮ٧_ -QϖWG(·BC*sVQ+t-PDrN0cW4C&1TrEhay6%u8~4DZGͯCr ԙfeVv~WgY>MɅ,D,{w*;0~3}5g'~H3Lg=95>tّ׼,{oG9%Mވ#Aam)2ۚ:"ū#wTx+&Qnlis1V G{bwrF0aj PF>s{g>& &ق@͘3l&M4juTx/gz,?O(Cd尹/Bn1SpݞZQAZ9cέ"Buof}K:qDɃa'@4PS=|jj0z xS=)Z.y2 V(4|ekSإu;~z_Cd#Ρ`IU'Q-zfOx.ДȵT\k7 bew"3"_aTKd}|Tܿii1N6)F]a?|rw H8?'K"Wvx7X:9&ZzGG݄.{ib>վ?GչɪE#͝Q[Z6zܘu1Q9덼6 t`LXl1oce*[8F>^`&1&hЙ\([U~*KΆ[?qqRŠErt`@ٝüVlqBL-6q)Dxzn'~UO]E.#7ЫG7OP}u-C-Ipw^ %x;  dԺYMA_ D@5jofRZ xEN PFR %#KҰSF$n%VMb??n.o%uӼY)]bLB غh!gPֆJ  3btz ؀e`!Bx h2?̝l4.]BmN4:W o4 @ (6%#_O'~qgr h7cSn_OCgܛU&cg/RvH1z?{eEr{eel2*?<2_W yc/a+Ʋ=RPL}JӠ8L@'lAj')M^]s}y{gvH3Ưa>(X0Vp8yT+]箠Q¹tCC17hwZ5NKvй!Q^M -@ e6|ɒZj\71N8++q Ɖ1fqљyN[+ÈGvz*Σw/[[:oܹS&=if[9펏@*\jXvD>;j푻w7~X@8RzĄcĪl`BTS.0UܫQԩ@ߐqy,<}Wypgcdr+/c0k 10v7dv#ݎkUE|>z>ڃL{₨cԶ6Eum)aϩ6w>u4C rW7^LHCbNwd$T6(r=,efR}tcqt3b3&W̾,^V͓z-$)?gQ 66] UǤHո($'Iڟ& -Q%-ҷϓgD?CXVX_}z@6KL\}G4t#Oc;d엄!]F;kb]cvaw.J`XylhKxޱsw9#Q;omp= _9:Ue , k'GT&oJ겷Q²ONK@@>G>4^_ S45D8*fcn ɳwqjrW% >-$!@n@Fun逻C1i?|HGzs$c-%ϯq7A|FSOTqY0`@0Kշp?fpd~\ 11G m9ܪJXgR:O:ALf_OA>ۙMz7nƈ`Yݡmj(5{b]~E^y}n/a?+qTyJ%U״Y7[] HYG݅>Z6c~AdtS޷&'hźL~ɅΔRA/۔s-^+9Q~n3-)=RbZg hsi,rXƬɨPi⢚u< ՜YQYPa]^<R~uЙpe7~hzC wyʂ&70{tQc^*lUؗp= ( )4l #r4SKS<~ee$}:ݽgͧKJ05S|c/o蹹m :Wb L欒۾^"u"||R<֠N`'\0Ʀ+4 ޚSHrdEwpY^U{Y-[mU^A*u̗"lMr"is!r#qT:f#Xm@ vVHI-XiSu |͖h\&.y}17A %=K(2fV;;s\,yQ?زժ}:k&I!'5=RG>E 1z?,3Qa>'-x{<#Nv1BM'pF Ac}J\?]t-6r烗( [>110p7=v7Ƿ5|Ǯ4'$N>v o[vaz>UN7eoM?AV!~= 7^^b^->}xm_tkӛ^1FfN^YVqv ˫d$4NnìY'm (4DN3jde=?Q.a3چUg+nvgݞ~? m"rWa;\ݵ5j<Ł&H]e̫0FRӉƝK!jscqmΕ Y0KXdZpn**ʬW p~ :}*CrxIs`bWs+NOgjyXNB<0c&gylU#hYUuodm!pƸ|Sw,%|{Hcˢ4e9a2(Q^H&\~+!<6jR`T{-D5Io9Eez&*D?ږOch#@&/3-f4d2n#(c1 JE雥UTx>ml׭7}T^"s1t>#@#:Н* c%?qKM`F8{v\k3yUΙ?>FkOEG|@e{~hY欇L|cyp  bP I"KS%z&ǡzۗo3 W]U A HOtձN3fv%jC܂؏^zc4#@6@ݗtH]:n]iϓ.&Z'KiH>Ct'GP O_Y_;>;9zb$g؃]L ߐtށ2_GH)Iٽ€Ch sկf'"v5 ԡ5آ> +)q"R3ډOJ7=ZW韤Eɧ6 a(q9jهq_9>Z8+ɇ#*OaoK|nTL".m9ѾiiC{! 0&&v\YWwqŜ׶=+5_ܜM8Cvť]qYPw'?_V5kOpg[\n{l-R \I*oV=2f5\qP7P kQbr ހgy wg=%ˍdDyμ WB E H#enKa&Gs'6Jg}WOw/||mu]2ٷIҧʶT/27t-񂸙G(k;>PɎDu~Ki|(ޟOa M Mz.|.|_½74Ǭ HekF9;z~'<ނP 8G":BDbF+zwɬ#ԀGNfi5𾃲kui| aKEp,50G쾙a&.&wЏpA 0Gtϛ(yemz`YI](2x%mϙN.ޔ|W$J,ey[D˛*{a[1SMl uc6o{*ںHd?B[ ΡP@.: _bIM Q,4 | ʎ9U19y޳PMS }.;f?rgu뎸dbÞAڛBRkzګ޴zxzBdȳ[)TmG7R7᡹gƾ9|,~6XwS@6w'+uM%|!H]Mehk`I}=K?f-&nd@ z%0r Lvg|y FVInIpᇱgd&J=˿A;}r<տ\u)m)J13]u5GI3͋f+ǒ! V(iL.xrk)b}ɀ'X^JNF O\H9좍/Vcд{r~hEf.CE|Rnۭ@j ^1ϑf_TQH<ً`|c쵺|jG"mKKtXU´?p%Y}LHZJeV>V-ZNhĨ@qTas=:S W\ oz)ғaD vGOEޔ}'oh1:E"dz}csRG#F.sjK<-T q yo0TMNcD)yuDi]6u< 7ּ1T=]N*zȅ xKF'*T>T( m"Wޗû,6U2f%un|K4yaí >=5E~FvsZ15\_wMWޛ gQ`6NO06zh+sfAAI$$ I${[ξ{5BJ kܵl8O2m˜#f4_-|iijlᳯU۞68[2ێ3%HՒf)%}\_NBf ɺ^D!ʣtQjzfJ'Ejn!sGy|̃`d 24[UYL{ ʚ#ods[Lb;>f4 =Y#o'{ нKtNQ,3qz_(xӈ"C]*O[۲J= ֹJd32Q/ ī3F_;JGiȪ)luk)CmCΆ0h][Cl" XK:m.\''*lQ]͛9N5!vmZOE:t=h%wH)$|U)R `'i4M(~RГq,v~k}֞b%c$l"lsoH{ř+m5?[wL`7KJT!.8M 2bp:_"Tk2J4#Q~XKg%tl' ̃ P@ bxa>A%*AS؃.K)aZ 5BLstn!IcuKY= %nv,^ LyS+W~]'bU7-XCQǫO[&NiSM!u"au;~˖''gj=X FxF30됳ݰtCW_d~7drbk~heN_̌N<%f PE3wI _}[d$ .0ӏ3 q>Lpa;si.'C0RP lCWrVղl!3O/5\GMCyb 'T6eu4/~WVq?4Qwdc>:E"oQz kܿvY5I0C7] : ^sadg9傑hYx?4,-1N̫? ?,Q{i&MAJƚ7f\}d9'o=\q51qq F`MQDZ"5[Kظ, H7#Gjw9=W3}]Lz@o ;bNB=L'r|U#bҬʊCeŃĪoȀ^Sh9xٖDcrL2mTr_<̿AF%NǮi)T3szo='RYUj1aQ?F1h_|&[X5d~lƒ2ݷ%x4:^׸s?f+R8"[z{b]#׍ce@<%}eGSEJ9v/Uә~ӁbyԹX\bv,{VO׵r~R\D:@5("EEn}otj PF5i=/P]gǚl72~Rgď;\f7sYw>4QSiC\nL6dP)DОP\z@`gyNUY>OǞ ZE&V/Z5r%lΎz$*җt /Fu}ߪoRG9x ppl6_5B}PSShT'TONxNbn |+Gx7!U@Qr|Ν蛄h@qsAs,)RLV}=RQi2 4o8Q'7 _F06~|~-)#B4ј0f(DABa_ T^zܫYz/hoC \p0-ށށ_S{~C|)vܷZdC^#IGOGEznÏ zGYbfvZ9َR!K_9 ` y2ssZK}t߅z9~=I8Nb+]=BWo=*z:$Kdŏ`]p7cs(rVgxN'VA2s9n]t(Tp?H('U$T_7Ҝ l3ȚqȻCfj{:ؑ[05nsB,Wn( 1ʄx<wFԱ(KGA37d M.6B:-װ+)8>pH7ܨ[|NJKRAzX{s}@OB)!lB$?V_qYTLKϷ>J/$B3jg(5(xQ}%"mɩy-yZf筳Ԙt3bM])q,5cv^,Qd/?cT H)\F WD@O_s%Mz'Ѿ^@#WN@7Ûg{ˬV H&un,om(`2fO_9PA$ב=R2caV~p4S`DPg۟|6i}yr<}n-O}b~ B( Q bgY#1ARYR<ڍ]rK7P z4KKKA$ROu_>tiX5%%vqS"i[my%vwu?[{˅B4~8!pf x  lMr nv/]\v*=݉ͅȅ(O/)@nJcՏUZƫ؍_sv *Z й\F>.Rc湵h$ٮOqRf-:Lkž4gd޲k6K ݄ĵ?1~fxsQi3HP AֽD<)eP,<4i)G4_{PN.$*8RRX;'[5VM:UPU"(+/4ҷ/-6ȺZ kE^oM3י"#z}N2fuU. ة fT#: .ulònio2-7v=zqrD0Kei39.kMrsbz4 0tXiMȰGT +a]RA(ETBb7=n_;MFuԧ/me0)'y˶+\4O;I cO3{Gq[<ā'_DliBML)X+^dž_gj2<3Ƴ¸PNɯTE:mDUo)(~<s{G_?zeTv;ռ53sC$mG׋xCzqLS=̊Kj]EaaF)糺 " Zkw Lx`|'xd3vґA҃KPZOzt/Μg@*!_u|e݄ɑxڮswRJ9R+Ze 6V>xj {ZEȐ.2-CnH?Fv&|jJaKbƒ ainA }D9SgS^_;ތ=85κR6(jmMͅ\k>2ě2vԞb>ooܸFO \C\*d%{ dM!9xzO:\喡3uW49.!bPruZF*[< {IPwNޛ703]* 5ϟE[?u)DzDg+^hA]68]?9s?Vۏѽ毺W?0 < ~/R]l TNzv,{x~lK=M'DbKUok)DU9f7j9EnuWMA:.A>L47r4 /#-eINs_\Cct3"9*6K^t[1Rϖ,Z S9gPG kWY'CQ<3xZpt8l{k)~~RGxc_]7i7٪^FϲLks{u}SqX?K@DD1@  i@w10ͩma},~,S}wYobn֟?ϓ?^Rh=ҔL1kV^3QDc_`>n.37+L=smx!rDڌ"VRa5̱?麴Bo S _C,`I{VЂ4ƾ,^66.3|wKKǫLZ־#'=ǐ~_J<}KA3I"6Q2zTvP^anouZ{^6hyI5[Gdr$8iiyEډA |08)LduuFM{Ɲt Ǡ>)s{>wcSx] CDLJm'Чyحl[uI|7хcZ2sݻν`/3^0QUQA;q8[X;8t7Bk@~x kOd 7oea?_di{~LyM.d- SCw ( FjpRA~)+߉M"QN ,U5F>o?+N@V9]oa;Ulvv% M(Z3k~ՁV8n=Uj/zI36ݿ\쐔-"M1^CH8eR _@/=Um4G1ј[g;)NܶdXZ;aO(p85#4"Œ~0srifiCKc_oN)냩c Һِ`07J{6lٳf6}8.>9QcyPB.z (K,)t(@btx7w~!4^6|5`Oʼnʦ3^#"TU'eI-vLOG!'Ys1nfؽ+HzQ׵zo1'}^ hj=0a:RYT$oy[sCzd_t^.Fԩ`C-cPĨ@dE96>ɨ"ȏa=5Le9Ѯ6 7}M{& Bm5{vlasxynbY'0_W\c=>zW;A$}d֋hF΁?:R9Т[yD}s#tSQ]mc%(l3ɵOUUהǥO4wt}cLhB#m`A kWaSϊJ)jtvEUB kc HoPBy"IP='zl>Rs\#xjSwzדfשN8[*8N ڿFXI@;aܚ^z$)%meAQ{|%qjea܊ԎGwqA慉NB1s>b:F< $c]KǾP6ougS/"8sB!р~Pk>!?)w[4\Z=^jh/=е N:Tiڨ&Js:-ͳׂ|Q\v`nt^+]2=⋱Y5ZVnIf~  WLQ ''NpgwGM oĖ΄G^yu{x]#xR^ĝG,<(jƙѭ's׷jlY'0V?>3'[e;R= y;wAѧb=㙢Q`l[=RL_ kǤ# CqKͦ("PMg_ V2DmiJ+BڃG} /ѧet3ҬQL. F֟e EO׹|VuH7уp5HpQ>fw|A!z=6=j淣,hx؎6#) -;\Uo!^Ze;R5'zg:l; 8]e>^Oe{6-'d1GariKQG/ [)'RÎf(~$BTrۼW{mBP6QB`ǒےg( >*Hi@4ץ`r\r+[=*siW yيf9Io-Gl~N r1syV;N e$*-]\R (^oY *|xL3SM¿PKr7l(?:Pct=./7{HhNsF{)cw.H E"P >`Xtصq%=-9L2{mA( 1`U5OfɓO7O| r<捄/φ `` x ({'WC.yoS HƧ|{i$OzgkicJ]dss-{"g9Zf]sbU:͓v{= Ֆ}Ihzhs)ZHHc /?COD7Tf4گ7OMYg0pdn:ZD_*+%4ǥmҫ6qOK־od.' [~ڗ{~'/-98s'}Ks01m,N$8kCx\= {D<^g%)c5c"Xpp~S=k\7>])D0TFɃ2Ҷd*jvsva*em̋7)IeQ'b釒>Hqz,w\OǤ)3ip0MI܇6Nh-2G.<9g0ߐZTh z)}\K xC-!tGbXRߞn0~]@S˃>p|*-\YR?z-CooZY b}ln7F|#a(4DQDHXM~3~8=2z/gB&nwUe2fjA@$@NSQAI#褳:b][2n.2{:[=//)w44n`uwd7d.*`bCfV=O0Ʀ~ gqPM[wU<`KYcВuΉ7)CQv[ՀdP%h2IF HT URLDVi+5 MEvCSOd\,W4ޮ{n<yUWnZ];3jf"b} :%(&CdS}wYhyS2Uٵ8Pۻ4}cXGpIFǬ='#zr4IHyQ|*8+b>-5hvqDO#DyHa˰A1h 5vn `[;v T;#3=+&̾uP0iī>c.Ac^phZb s?fχ;^B$LkWS]}@^Iu"*d) R-T sv(@2V=f:$},0mރūBSA\e2!52~+Tru^!zRocJ*߱UqkDji ׯ5'>E #2/[RӪwsPVT&}+5DBox*wwtͰ4? 2vo랸=OB=ʒaFR_px: _3Et>[r׍d]lrvK&"9ypq9A L /6ݳ𥁨 I'@< Sf(;6REիPjը55$M$G ȎR%8lgzn45pp 9Ц*߮ /Bp?/z['t}蒶Q/kҼI^^^R)7ޮk8f kjg_'#9gJ5z/21;i0rOYsU]nDoauZ:FՎ FkӤM^}&AoPw&F:AJdbo{zDrz9;26Uʳ'r*EӇ/5G4 AZJTDK9WZ. wOA^|ќ'm2ft%6~/w^VV3lTUM{.D.#]ǿ;q} T>ޡtXm ji1,MI+b:'kU%;|_sh ^ƻuo_4ҴF.Vd*OA 15m Rc'xeq`TTJxmEdY mM;}4Ҧ _ D(|t>9>eA9r z4}baBw@zN yDl(&u+ƘhP6n{Kmnx]QD;E5 DB+VM7IM~vxrpd3v:*mr|sz7]ϼ0x€Rw4y.RڙA y$gh0HWȼg0| ~:Gh፬LԱɇp8%='gAGSRO!p^͢$H!2 YJêiփ?Zt FIr'P$\w'oߊe!mHt/Wj_7u<0={tIx;|_fӕ`aǫ}~CU,E|^1orh%A+?*y. jчӽC]!2~d6m*cVrgvzKʿpQK9M-L˄Kyl8E` .ך򼋨U7=wF(̻KtMu8aXQnw"WlAƕG1_yQ]CIp26R<-C+ă(ipec*Gs%dB,lF]펤9mh,N{YZm 1! ض:w ,ovnGmZ&0ܛ=`'L S4~J&gxN1>5֪}H <}'O(DڡyUT> Z{͌CcA1,wr:PjylTjU+$T/^pI_cGGq٭@QPP`{19̇.,l n;vU XZ[Ez3 0m*Y=(o,g&!ʂaţǘ@l9H Kx8h",@@+!P`^t%}CԿuh ̃ A"r<[ZPaIqe :੎ nJfĸ5ͩ~7gZxzz⊤Xl:Vomr?5^-K{pxxK2Ǻ37t:w5>6iV,Hyx^],o h!픑 'I{M^IL|F4zm#c1= FS5s_;7\"<~gTaPR79-ĹKS~smT{/J[[O2iv+.} ;pK)]46>3o8VN>v?f 1^~%}{y?:,cNO[TP\:ٗ Fl{S1az-޺칃!>x Q,iHi ˵&ȗlOhgs*EH,Åj'33M(0[vj>^ ޅIYNvIuL֯~pZM~C¶넔Gzq6ڡ;޾ѦĔrTgqR: N:L|W{_b!o De}{o@q]k6p,z0@QBϫ]8.q+2{R^W.^j*=roTKj4'^[ )_ax=x&=K)B&7gҖ偓z١xdgv@vzU$!D0@!Cҵ"ġzb?# " "c!RYbŀU=ӹ1YLVl4h28_|ȉkwUX7 t b."^.:71 uy;INگ_u_&ᶎ̵ROKsIӋqBC)\eW0))*x*JsC͕..me9ƛU{$`n:B{[:|1 b"]vXK~gI˞^IR9jr )CnWDJ_4.yԓn񯏨edMYo5NW =|<ż]|h^= te-TVG7)^(j7r1h0p:&s! [cr-3 eB 0V]ZvCUGkK]}>TI5q ~o-B8Tм>3g+Ca͠0% J 4p!^~0jnwu49N@8Ie0J'J߭:t :=|;>Xϒ1h _-T&8Eeh^;6O/ t㠉y?Eڬ7w_ 2, »#auR?r@;Y $ql wnч@h}H;2m/;&!.jߺV`K_"G"^{eye^ ҄=2qtP s:hWj~(-I T&ti]Ye|07Ju(*;Λ3p*:qL>9h$G'ðKJ=z6^=O陔4!lDs J?kr\ gVʀ!,OePEx"*7 F>P|0O !@0A4v7 Q̼ey=VA( A10` 9CO)D(hY2f6;$f?@&"`㡚4` R `!0#f O0T߾x4x}w#?A(l}fů_XťI8SԺ' gؓ+xi)]Em:g(d϶>(TA92y!Se)!#N ,A*.Yᩢ !n`Il9ebhX|ޜutk;iuy-j]Ku~LRJ^7zY_#!eF_x .9#NG2mSC)/AO/G ۷'sὑi"=7,@FF؀{.0MPrȒfZQ\e] >w2u^݂IT\2H7s>-=IFvhj݈޲*ycOबӫRJ) |[]Yb\B 5'*WnS܏2Vr*֮D̘.r 3BcB+t֎Rm7= oUyYp<4Uv(}hCgse19i[Q*\26m^f*xe4,J#_^GO/B}#S_~ ( 71)ߑ,yLª2qBݪ5-づ闅tp0wWJ#MC Xqa%=T;6neN 4F1cVʇdָkP>@@/;" %qtՑx2:u*#wch ~2=wL:OBl @"v:94NI4ү>[Wm?i$/uHT}<<̂="Bt=Q5BԟI A*dd, ;CrV4(*E}ϐj Bd/P Á&ph0K7~37mQCyKYoǢL>Cuu)ըQl,a,}цa{O 5Y\݅I^"(`Z q}Lˊ€W3RN ZS>>QEѽrоˠPkI 'δXlrmbq,²>|!Чag[\kv!.>[ CFT5+ݣx2WO1#'-|Sk~߻>BhXQO5'k ^ׂ--9)݋6Eu_=w[c3s^MO1hB-NIo+ &Zۊ/$T2WsI:$s XwCa)|nL!w„M69E>o6`kg(_;ϓN V4Gpci䃙Yhg\/ žW9>aSk6=qvȯh` ы&IKȤ%Fy$'LrB0 W GR]TG'!~nLaޚ%RDkidd|MkS1+-q Wp+ީwNĄ’q;S3]@똃u*0re7JJ f;] AYlHܤ^ o0?tv:[{!S*bh([du/*>}hsC-9`8izZs˘jX˺ñ`iZ0/з\&Li%gDY R?Awn(5sЄY&KsSNp$݌>qsF8œMNUJg_x?\x`5 HuɢHypE:C\#} (7sww7Z1JM-]M 9DЖ̹yPO OTz>}pt5UFV{/o_szln1:FG׻SK\nɹ>ٍ]t!COJ=soa!GTV~or[R ;*y(V Pyͥn (\( hcOY.nGF[\QWrISEFēNE2o1nt 3X ƺOtOZPqCPJnBxBf5*( ͕!meZ>YdyOԨA5! RM#\݇,hBMC^{ו5ٞ㠙NĀP_OilfEŰ.EZy+p 1+_l ӟi华c~NM9@95V]u]Ď_j ?x ֢̜G:H>y=1~".S -Y1GPf^(dLA}V q#kY(ڲ ۝R!SKFqRF/C\`]ɢEݠiהR+T}l4hc"_O]3rޘ#sއ+{IqB*] !f_V̹@H}Py3%y(m?ڴк3#T;GG$XBBI"@ C_wIuPkPZ@(=XZ/9|x k7z>C@D<;!r v0 1nҀ |o}<Ўj6 [5'>o{7⹷VAK3 ;8r8a!PP!tM۟yoŭbBbXQ+~ߢBD_U&x-w$=% fM&L_n$iq_xRrn>ִqm“ĘH=_z=ԏb«]\d݇GΫg??UIu>/mhljQ,[ԣd5,ԐE$:r?)p6 !M$R5~9U ο 혘-V8ƛY9N+l EWdZǤG*+,s aKZS0|($w&^s$AKN(غѷķ yBj䆵xْ|t>ލI1Z Ld #$<ǿmӄ 6>9XzeuCpPıu+f5-]rUy8ov?믯0kxaꍟw[X [;pl/IkRCs*k(hE7zHRa2!t9^lp"bzYtY)cP@݋0̘.+Wgg5I>ǹp# *mR|ERPI_۩Dûʡуzry2S}_Rl͓g~\kyk0  }`nj=2"/yw0ݛ\Dx=Ƞ5ԨR 26hY u2漻nwlbd 4DAA5_5«yâs7?Gq"8XS 1 @/p;_Y㘣?w;oK/S"wų/cX'{]콃M볖!]-2ܭZ).z>0_&JnTw[ol_@iDw5w[x  'fOqMD#220ꞸU?)+K()sOHUgjkDz"GbX3mj Q޿*ߨbLxĝQ5q\M>_b:\~};51n$ `5bY6:(ǷjefzS-6IZY\,u|wnvMuGR(DuŽZ#۹щ_\tJV7s&.+[VZ}gq]1TvbgZwV݄1?dHLQp#Dvʨ[4=d'jc52D+W,zL~~B$KDnj2,ϷC2Xڪ觘kPWI*LСmlC aw=u=cQtX2ؑ ݓrˌ8v}7kyblrn0Ja\dnoqBX,4x6 2ߡ#|+ \.tܝ/V(_QnW0ﯦ&&%HHɠ@D-fB稙E|W祈 ˕?V+=/<|*w۬^}E# `N  M4Ẅ́*hDl :`nZ$KF*hh37E l YoH4ͧpdXr& tdWz#ҽ:c]e(Ȟ,bM {ojsK ֒GW@Ƕ`)0R1IYfɀ0`s2g3T찆|$خ\Ma7x}G_mEG@%4a.t t`L DQ3F&lpqo{ eS.KYnmmj ҇W3U_4Yl|V", u( Zt»^1ƏYerL7 ߷b{1Ψ)(!@zzy5}&'ɦۦn>nF= MgZegWaVcc=¹}c`9i|?KjDzk+I)>bCe*:JvI{CM '* ȩ[-k;Qk.`u21d P#@/rwjC6M$6 zA9"-lvD`m{y҇I1<_NNj=u%FュmʋS-3 IeRD}^xds䮵?MAМW=h$18@X3-#%.EfXwb4YqlW?{N˴V8!cӰpN*Y{3nrcXR-"9YI{TKϤ[Z.t}?P]^c# w o]KYV}nv_ӝe/ ?B`(q]|+E'o$ 1$[ f7nZ^qڸUTO1-Ş }qkfYnA'?X9M޲sXZ4OzԇOg|RݾUG|WH_ڥվ/6wa=ao$Bo7b Wd7A T07gz[i7m7꽢 , Ɵ&G)OW0&rlYmU3nb=-]_ݛ?<5frkCѰwo0W'spbTǻ>gPh~2+yvK$~U%¢!3'$`;K>5hܕZIv(ʅXjnL#oBQ dNΊ|_qk=9TOm"I%y펹U/̏1 zBoy=zв-u߬P%i?s;Wq!z˞-4DeQBoQATV6.m4!=iQč(8G6T r !D q-˂4-Ɔ6́69E&^ xv>̙"'lMIr N*.D ˎݮ}旁w3uW~? IW߀x9}9Igo+zH/0g.E~Gx΅X|`NazOuR8FAlTk=~{+mtՄgWG@9sвa吷֤= 4ׁ,?g AV WSnwZlY+-~g?.Jax= jzwS7'6Sh|R=pohUB<5S<@uc輡p0j i_'L[!qagL/a4\yK8803L |>\xTN}XXCdbфf-.p:R#*kȪ>m# 7Ps?YdѝA8ۉ:0#+%'F=Uq : 6ɟ+7s4i2~*0,D׵BTeanܯ틣$qq4OII:SNH`wgNT})Zj:po <١;qӍ o|7L.| Nhs{fz{ܿI>s%[6̰JrX4p}l:n|p̳p'ݼyZPK0Ro䢙+ܷڗ>Bw\bG Oʒ8+Ü kKY†=\ c:/p>4`6:Y~ъL9.~ *p` 4!jPS(f<3Zq0Srf= #YF+sޯ/q mN- @V`F}8 (>., Q[+*@vv4GhNN),ʼJrfܪB>}sg@4(4z%OW [sflfm>}6<`9Pu s  ~H=żl啪[ݫʍ=#I:297sP'R\·,im# lpq -n-ޭBWYyշY. ሁ6 &ff`>m)~ ] q$]43ҽ?&$L]\}O4J *rƨK%sѯ]0Nȇsܟ\6IJcJ>x'7 Vk/9Zi7e_H1|w.vGG?ou4Pnzzzz ӢU|LJMk&ݗ0+7ӱ~;tKy%jL!tW F䠦Ytoye[옾RBU׭`g\iϖSq%B@``Aa\(lV/SDx&e Yƺ&|2ű㵀 Qs8.&|r=;+|srz"_&C ̬˅bZqmmraAg=F_C nJQzFdt gD/勅U 9kX:=e,I YRoUs8TtY95uaj[Rt;ͼNw?2O(m^:WZJރQӳg-Grȣ skc10},\y6J蒴Ū &ZNQJP `x;gϟzҨ-GeN1tM搴#LB﹛C'SpQsw[ss>^/fo,^\0N$/$ I5zm@7Cm' nǦWhs54hcن<9}i^Ok7X9ނe] 0m ۦ48p7_&2 z{=?>$ʔD -P*}_KK"B6kҳY+9LyC2۰49^_'gҾY+sj$JbL?B HlE;dLPp3e_1ϔF(. K mD|)=9Hxmy< }6fGs Ώ8#wM8%<2\W{^*ႃp:RI/ud Ҳ~ث\7Φ^"!Ly+{̷Ldaץ॑ ${g :6sQ_Y ӯ [{(U+_(-HBvǣCC_o|ˢ)緽0- ^2iAG<$xP¨3 LU\ ]o@)3lpǕrVK|$7yFHs/<1buux{tnuƛ=10-D"pN6F1"'tP˴y4K<'wk$l mROz5)$EDCEu]_. 祯_\L> =OjBI<{kr>N+>_oo›blRWnk!>6.,|5cdrV{wkׅI[^Mk UC\LM\ $g1e^ociդ--V7+nJ{*8$5x6&/R6^ Mjf!~[F$#eaP}L ы?b![s=DcTi-kn_#BCܴ2nDރrE*]fEv{o2yLv`e|pA5# !!)#7}?Eyw*?{l ,wNK鸗'm'rK0_\udzvJDx0VBzb6on%r)cX8WmY8[zK)Ͷ0  T뤭E}_rSF%>y:*rm4};S9?oYfx=к0[iG aL:\ ό |+ggb6hPZ ^G즛d d& !&lB<-aXhvD*Iz;צ;#s8-/1o~icb j4rWQ_g*g1~z>PbɃoQz2f&z[Y82,f /,<"eʣuқ_ /j<#X Ͼ_.g}= ݠ;\v-|G GJxek/{i}.eg ,!8ՃҾDɨq1{lD'? GUQ)GfnԷ]o(WuN#QI#1E~>Ҽ6SY\;<<*hVx0>5*l=NHWP!HfMpp4px΃AiIݑkxCUs(,TQ栒 s593<(%U4N <jj̘_æy:A_P9bguB.~pS1$ 覅nQҎm=oTp;]gnw_V~l%ɚ0Mš` hg7bS etA$D1)ǛQkqAҿsf_Y_tU*hYb#*;%q`~lmbLYjGe Z Q򞐋?di^{& dhrL7>^dVWڃqҹ0w.7UMYk4 e;9H^Ϊo$fuF[}frڵ)?$EKה+eqDztI)u[؀O4Yad"dy+.y%# ?|1XlȿYru_VD>*[a!c!RP?+SJ./.iiSJN6rISg{DwHZe wS9tClzM#ش V>Fe桲'[8U*.)pm]`r˻dc=:_nMisM>.9៑Q,Gs&?Sz NX[fZ=7x7,=9j;oxҥ H3 gFiTnI~+/&ÝщyIg\INkGWyt:}'ƃbZB_5'g0DRz&R&/AtNUxdMc$Ԋ2w䁲졷m5β0I<(=CI8a /P򇢨Mͤx6*o'ÖVw> D? 8uiҹOvG_~ߋ\ XsEXȭCVEX3G Ɏ1u/ \_Rl|/\3d0s˝-Y0a, ^O%DTW|$۶mEg f"Ax,q+02?:F{ja0~U˲sҢݿKXoUטԴ߫gSm/u߼ygM5G}楾z;ʞN^jmϞKILk0Fitn͈;攞~`i0h҇EHg{XeLzo'a=[ADL?c1k/@e8Y*^LaTCܻ27(I8Ht}J>LRy?}DS͜J.(1aN/bmRMtⲬn.!fL|Lu[]=F<5X*W|Γ |9C=6ie*X4*7t}\lICY30Ĵ?i ͋H4GsqW3E+ ,L,Gue&gaLGbr0FFF1~H(53/{V`LCSXR׏aHpӜ?Ip6-hyȜou(ƾbx6// QZBs({{j3m~۝4Wm᪦ӧ֞r*ۉiS}lV36=I)pCW(({"qB^|g_~Aԏl[T[qu5ޔV5ݛ4G2 l<.݋[sC_jvC .hglRZ,Pkm#Pg]%UuA.;V)zM̄L2W#u(]SM!$`ZȂ `DU`h$3ˬ)¶5b^JېWú"iB:~kJl9hy#4 ?~B5¦ﴳ% zFTuo(<x3SE\9xe\.KdfdGnFЀT=^fJA狺<9܂{dOPPșB)W=lWyd#gꝝ.NrS3-WWݭ~m]~.Ba%n3p* @G(-ԁVW/9 ; RUцcܰ1-0H,ʼ n%?,A aj/+J1R0'O"yP(hӸ"߭Bn~iC#gc-)z-V^gA rO=rJWC81,jU/e/c,Gխ~O"M"W>ҀF@y2c&_?EF\uP4:edZ yf2@CU[ 呫z3uܪٶZ"f}89܂c,jk릝P.Џ`Nm ,P[;Jz檶{Ҽ4%,>TM ukN%YNYP|;ENZuW5*QBw>vO7ݿinctoݏ*_!+xBtG`~&^Iн~ n%DKC)kBsWVDYY@CV))$PPCX'srҸ0lJnP>m#95<pfcԵ1 EË~ȧGm~Q4xfElP4h3h*47$LA[ R;x4:n?SݰtEޓ[ }-# MPhWyIp|J0ףo!AƿZK_={* Lgq͌0{Iuڹ= AUWGQS^R:"D'|vCs2Do ,g"=p?ߗ%[!szL>iRu||ۿ|eͤmM'ȜYtwGtGѤ߁sz mdOΙ^[yGQƄK w:"õn{l:R@p&_ypa7J'=gRkp t!'N ֹ|aPCu~go<&#bb,I"xZ4`;,bv_KObt3P|LD1!ЅWQ}Rs.ǿ>C?rRe@m@@h5BPż"^q!"8Y* nyp/ /iL 3H<[Mz3EJdӅ=dՕ %u +mr~OHG17ՌInp,fhx%FG5xhތ#|45ZqN+a["KR6c3>ٜ?\3 kD'-Ǎѥ1e7H'5O-k SWhy~%IIj}՞.9dxbL~^A;SЁm̉e:ex0~%/r Spޑo0-dգ6 \D.pzB>DGB Nt 6}?s"b6Bl_>UBzaew\=d CfF;g }$鄍E۶cb/h'}ikw 7юܞX'[@>Tl>(r&CbP,o_ޜlO6U7)1iH6Uwk3Z1Nmoq%U`o/g@6:[~ ٪EYL o @r+3ǚ'UQZ8SJO]t5Bu؞J~>hK\]̡[ph̓5VdE NC8}"ⲏ6P6y~@$c])g{ ,K þi9h&x^' uw >X^`)|睃w29ګѸt΢Wey}7X6 =ӤEO55!@W ɁUOD?qu#=o5{YDe4J`!7&1 쮾qȚwp|t\7z׌EQ"Q|߱ g? ($<3 q嘾$)J%FQfpM:QLd֧Փ(öc>:;ە+{ž4<݀@2=vX Ơ=Is}35),/s{w>iRw>(0iU^~<%:> >$*HE(4VtE]PxA1nXD GJ  3'*e+Xz9ڼ)\![7=v|—3|*s&hB1A"~)1+99>̇6oNxL/RRdX5[LTSڤaF* <4\u]~6 #&'Sߝ.B7a'SϤf^"C"ң&sK` X/)/mzT̟u^a{'M}| u(ӯ񢴃1їyUѦ* %_kp*q>+gO^ 6,H" "[쎣 vqrիAh-[bN@ &%C]?#^vrў e1Ρ8&*^Bb]>;<C!0xh6 'Ay`*V4}R<,ò:Տާ4NY$+00{ë" DOz!Q Ԕ§!R\ffsBI꾃.m0F|j|x²]k}[؇Xuvh^{v=l_GNs#fp @WlDs :52;P6veq4O?u}zUzk1?^5d}e"?B)F Ye;roguџ^ŭW.k J3 ſ{޻->H<`CdGRȮ/r7P~pxE#"cfx0}(p0؇FOgu+=*tG68^;;7-s&x8gǠDQVT򷓔ls@]nP:eݐL&0 &.pOG&؋!)ͪ *bRkzԿ"lC]>dgۂ0}5Pڣ<-8ZjwKBcovK- ).nd'TzRTC\dHB~N;ޟ Pwd\3ĦtR0f7^d7'pñhץguvqe ҿldNHʛ3-4q@a3;DOXj!PVx9jV 3plr) _pBzG 1KAL 1|1b:I~`yJ(+pf *VeG&*'/߼۸l >]<ۮCAHӝ,Sn:>rMr!}-^+{\[K٭1^, 6ycr ,-ϚsQ<ӻjrMvC%fu{urVf)ǛnΑMD+v DWC|h}Ww)ߞ;pFyT%)Z??y9uK(c_ + u| l$=#{ 23)%L5/[}~_+PnYv425:$9JyrUC&?xβGu6#2h'bY/ǜ}-y2QDO91^ML 5,,auRlai9;d|+\PcVZW)/%{B7Rv >(񈎨XE#AVP%K ݄2 ή*toq%K*abS2mC,ɫrc b)C` %(BկxokK87ssp7Ä@4b *©m_m12 V D38[(B\.*bK?3ڿÕ RzRO*}cS%ZT2eg #_optL8uO\ꮋ:醑ͳIUr kr~Nx㢚KU\vB}1W)rC |ƨnE7  K:iRZlM o$+L}m<ϒwW(+30?5[T^SwtsKV_2t»۽MƅAӻeh|E9%pA;đšf+a?7?85iϗM'35 fZ`e+ <16 Q蠊Nvn3CdG4usƕm$v}hI\i=\Q{jW Hפr07 g e lC0]t]Ƶz1oƦ}>cn# DX\gE"jV*ZX5\k(r7'[9 u Hf?+o OTT[)?'*L88f?DS& KSh6]aĦrm ^UtMb:=QU;_EFJ~>\L[vzW{6r6kUPN7u"B& vӬ48\οTl &2aT|92\5idZM1~!Q8%lcҊ1N,kLx\gHA|vuwc{_͂DaC$abvl?.DPHϥb7Zl_@hƁ |: o;FfFcuuU9*DqeFNj>x*bU Y$_e2Ɵ=x!sa/pZ(QoYFwtg?R\]؉ZHۜZ3=P0\}|XCY7TDa\7mDe3qc1,Bwץ}t}h7fvpkI84~,|w.s~vx"J ;N)*U2*!`=}N6ב=%0=Pa뵧B H[=+~ t2Hۖ8&3㛼fqO¶ ")-5um=pDnVz=)nxrQa1P kzq Hc7dU_Oyc^-?V7DP!g9&QD:s_4ˍ&дs u5@U2Tpis )dVߌ&Ӻ'[3[~\ӭ6tzO*Sq6XV -dU 1T궂)/MJnկ󯷡l['anyw>Pudq(+4C)<d'\)DەB2d ̙$G$Ȃ( s.ƅD5+wy٭aί#m[0nhfpr9Cs 74|H&WDIۃ-CuPJ+Evo$ЇtYD̾Hu^$"߾}fUA:jw4Gɕƭa6K| L>Q؅z@2ϸ FjQ G*pH׫Β_X8{9yZ%,#2 i2$- [{s銯Ǧ?*QNp?Z`<+΋x{bӥӪ56ja;k(6)cV 3v@/o:Ն5 ^.#V4\='$iQv~h܍`_#:[ ?/PWFyg4(9XRq;=>RBN:f]>W~A~^xgAH{D <ݴK82}6Mݫn:=TrA k6EQʱj i-wA71 J=򈛚JU^tcvH0%pᱧW:3IM'03׏P燶{wT3T]ݿ2mk+ѵ+)ȣqi)<~k$3IYew b<;+}1&I/f:(ݒG&y>Oh,!Kux-G)4p%$vnQ6JtWWtG!y$-7 D'; 97U󝭹|c1-U`҅ULkRrxM{"Jgte^u vCeElO|`9s lV30Fɦ-P^?_L_" JIߝ􌻱ûNWv 1"/ile R٤ϝzZOy,?mZ[o' )J IV2gA_ceV ټNARU=Thl;^+$@b g+_B;0On3Z6_}[g,fU7p#@3INɴ]5?OMWe+.Hm4=?wJ=[l{n>Ģ>h@#M4g+2U`x KmͳٶE~n&pwOAYRYoU/ Q4|&/ڡE7^,G{D0{@4]f`̀@(B/Ww-碢!`2zoxn{Po\Bݎ dO\0AQC Cn<&y/ 0W|Pf۔.'؜޲ Yb1O%"(% BQGJ_PZfQ>M[H&k`(xN1 4DOxAkHaw):i{r1y<⺱:6aAO*1aFCs%]v(~\ U=qa0x-~1ARMODu;+ \k`bj|:RmJxD[a#W0.S=Qjq+%v(H .AB|빴C/A Y/4,VY?ib@a/T=~xЋm=WH ebi̺hW/Nj98m/kTz]'T)~!hnJ֞㧟Ƥ?Ln5x?AzgM|B}՗n/CLLٲ\YD g<+iB%':/WpMs7j7g)~gi*ƄI]q4hIgV{V:I+k2' e~]͇hM\b 9 ' V1nO49 9upT"[*o%; gBXXX\6DA=_ݤBg1E̗2`l1WE~Iy3vhoowwE8OD 3 %ng 1S:1b/E1y ;Tqś?6,zXCjy_^m4k|Pםr29޿=qL: yv:t gDá͙oP2m9+Ѥ\=\k~YT\'hd޳ۃUEΚXf*#VawpH9k7fa v+DϫlM?ՙI.F!z]f)quU|Wjhؑ~cd!,gvqO*B cyC&S H?ЬY;fUFS!Qz!ngK2pc!2]f9c} yBr=٧9ݖkt8X |TJU{J(&"\ WgjIswCh+ӝp/Ijj}p; S^1<R+ %`= +\ _OKNx#d9@7ё۵UW#:fjJZ|Xr="Y<9?_m&NK?rH*e (m"5^f@ϫϏ!*n3kwy>5?;jZހĢb狅H5K23Ѫ7bҎGiYw*`\sSՃVl E]Zpu.rkXT65VGM(Cop@-q4;^k]Z5^6F/v-F~Y|WfgwH^˜u9 r:aCC`EȂꊳ_S׿}E0v*U{O7>2sf݀6_AU t`\! \?K-648  s'I! Vyfjrg/*W#ax~=S9Jc Yݪ!ckNU$#d.z[/j0pYQ -U %{E5V~U[nwVmNg,%QZ 9AeQ\,.AEQHiNf>RxRoYm`SVfLV;]J@rk1y>(X'v\dDoJ (G#y Y6h^{lɗӟYueEm np%`cf}nushΎbN@8lYPIȠ'EDL@v?HjH$m핯x5,t{jg 2YN($ iPak)| x& ˿-Q0߃K:\ír#Bh5R"]Ba?{%yʼnmpotLz7Jߗ*HD4ll!ʚV#J"%N3tV,Ro6v j(4P?S | 7A@ =0s?b\yN͗yc7s:|ڥ\،\LEU7cLu=Bk^6m!ZJn=f\ ]ּ,6hh>؀4|)Xهiv7}o-Xޒ뎳5j)S"=kwy&#+?51}ScDgoo`h8i erVEz½YuȨnr_=6m nv+WFvQї|^;U#X?oEC&ALn3S [B >_$ V4¯MʮqfI %=5'B8=X;9(hF;3_.&OCj.Tђik$Ҽp՞j8x |Dn(@9mmi7ɰ66jsVc[B`דV=//_Y<@h " %hСK[1 jӏ0][zJ[3MmF{GpW m 0T{ VzU/׻SIN"I$闱@rx/s5'.] gf ^(4ʙ{߽ :+sfx}E3˭5 /]Q"u[bC򫦕;nvJ<[EU\=GBa+}I‰gG|DgYM]*Wu_`sZI;ׁӂadZ]ܧ ]qs/g ;e/<>|NS^=8ak~nc/ӵQuaiwwAw2]=KQC\ZrD, JW. ˰3&$M'Fl[8#ӀtX`9Q&3=7H'/hT"n%vE{RFX [zM6:q6>pr&߾M"{%Y~0gB%Š5ۿQ`<# m?_Y,s(^*KD7$|:䵐Q~=Fj>_ fn@)~YH)oj*ygP "50m4e&Ghls\uBqJG٤spGtqQLI'Эmk #=rD=&] [ߦ`}w^~yv;[ڝ'= Yt4.Tͮ|KJJP㜜sT+Cq 7߫ A4kѭR#k8}b<@`~B&Ȼj} e N=+Hf!-{"1V';Oi4Y7%MAO41'xU_K P@5JU' I}Rd4JRL4R9G8h7'=~r_r}.+jC>y f= \Gi^Y)꘣VǢ^LЭԶig& gh,V0C:T.5ճד?l9갵bԞ38cOG g;C?x1!Q2z>W~7X`it-XUN}IvQK [ J÷./!x\M<}aiA0B<%i~ bZlLSLS;_Y v|^Vձt;^>ۃ.cD&(5HF|iJbϮ{f}׮R8oZLPOH*.0BFo?-^Ow3_ϔ2RtmQp>DmaBxHRZo}ߞ8'rb2W[>_o-ȾeeeeddddhDMP7E {=^!rpTyf4SJTp+Ʊ˶Bw/O:K`ܻfq]TϠ# :(pZCЉ&>#x}6>;!RR[r sn;$ѩXjLR柲RT.`8rPss5NO~oGfjeThނ}g#" 8A5ޞIV|p?UɯAe0vp&9`Ii !aJCNxzˀһ"# fh*"gw˦'X "z>]f(-IrURzeAͯE!~ߦA;wvhVW<%s LƋ+!.Wvt"x$ePyg?׎Ex)uͳkJ\e|q?xnDKggh5s(9S!Js9vR'E~C&YQ} 5]KOz+ڽ޹2Ӷ-+MJc[bTfn K"Q}1VPb(z:1 ht S<{0vnL[cqvnҎ2q F^mri.lZw͝1^=c;YN!r˜_DYЮTKIy,RZwR%uDxbCUp0"@AN oѠ7WҏQ8zkG gUO 69I5٤oPCAo+v HY^hEn̢v+Ea<߷)fFY R; pts$TRYK=mګβYOŖ! Mt-e}ѡE0;. xчDޒKf\4g/p [E}_sibX\<Ȑo=({Ckd.+󍋅GHLc.FۂHƛе (@MD8$0^ ـ3f< Qˇo=Xċ왰ld],k4ZӀChέ4h\d/ļ 0Sok=LV !'X.;EZ4NҤudB?q,bD>q*kY"@SgEFsXA!BXc<Lq^Q6`*e ? ǿ"m4SUwbx㰤_T"ҷ|ahxuۛN}7 fGcI d8AZ^JFguͼ3g۫~;)c s8[0n+Bb+>^ziBl<-wE,C>U>ý:=V?Jox*h|OL#u(ୃHtŽѧ}u~ݵSflA(\ʤ"whj}sc{okSO]fjhՕ"*F}4gvy3]Їpڵ۠œ0j;eb@,G$\ʄYCi 0 ^h3]M[b K/l ۝]^xKybgV]3妼hp=|i.w&K\=Oxv6{xX[ zz!7^jK.ϥYdS;] .ToRrkowFq?e%(Su?^@E}ovhE` : @3Qxzr揜{=Gc^K?oq\uIYH* A%$A DI_&H  $j~G%1`*<5N׻uXБK갺\okzw4dM 8%58\ yU$!O,0QJi%ymJS)~aWE }TagSv+\T$kJ wdAZ>g%y--Z|< Z&twDNMT6^Chwkk%.+y!U"߬~n?a8èD +'f^>|}WCJF5Vb.FWE0SQw#'@sοɀ*Nc*ݓ42XݓtYj)g +t(цl'%`KP>&мFCjfGo6Htit >:g_+m/O~o Qsu8P[Rp(xf(d5?Oj5, vXOkm?FTPf{Oa"b^8({އhq*sэ=օe]瀯FQ_{Ôh?Sg³5Mb>^ ʹuzeh,ea v\ wl |%αwvA͛f*"{יfa-b4DH*nkD:8 L5pR/CKgnN{$k*#;ԳF1Ӱe,f3pzu&gH⃋~7JIYq+[7Utgm# D>dS4E؏>'~_Dk4kSeWo-K v:4yzv_zRPsUцopQ^N?QJ[[xQKJvPK)\?0aBBnN@N\]/"(1=_K ~=,1Cs$+yUiuQf2"%SĽ.?BZ[,/*jFQ 툫)W{dìL7t$pxݱJ;qAB#Ip i3=K H t 9yC*$Όq̉&צWǽΙk(n3[3!Ba>3QO?v-EEF\ڷ_oDxa}BD;O⮼^ii7C57=v ¦Sum)3IIGdd?zFORw6%x2zoZSGz~-nc3'/ .DjWtVׄBBNl:qE5z"GM߬sop2~yFl8 7_t:zjPY>wMw3CAܐMoDp ) \ Ļgeniկ+tG'5 (vjsDwAչҜ|qf@ӣ)?]O+) 7^f* UN8\D /&Ƴ.vz% =.)lxb+OSJ;ެvdGE<9m@j,[$vb5,p}Şw_CSEs=hp)_b[uFt&"e#$/OfI7PM$-yԷf$?ɬ?j~\JE _}S_qEm*/6^v0[_RLkfiGeq/᪙iªgL$lMg1w_s I[21ve"P 5Jn9P_JN0!6 ]rƟueAٰ6́W (grSlcfwm>=}obXm7Lm[1qpGo;}oq|>oγ;?BчV!Er&K_z3l5R7$PYfR'ЀH0euN\-Ü*27IVߎP""nl)6D 067 {Dl,1͡dL}xJ'܅VlSou?U}}RƷ^ӭ| cۊ5(YAəӿJ͊lЎ[;<5l( PGV׸pz?&G!4"wih1tt}"t#ß,JB?nD"z; އeӲn䵑qp?45Mv_*n b2$ 3kA5'a?n97:<pZU߷$ tN=Dm^$97i[N ψNN ؞O*rVRˠ5:`d)YE/4 ua`c,bY-@{&!RzǮodڒtqJ}mGDmR'^UTX ֎:~UW2_ήvb,ه*7zFs8HSȃ4Aխk"uLCp"Q̃#!C1cwY*KDV3ߔ2m$59s+55uqG`h7}S1yZ)YpT$ @Bp` pJIvWW=\pYۏKULA@@ePP7h˗.YIzlְGQɋm,[oRf_yN:Qt)D4 -a J]{i}ƛgyOqjhX硉 m5@_2o;{M8Ni}fYIpըj*^O۩r*WXKN8{ﭢ϶Ahڿ vΘ$#OȚ~hcpL JS{tefT{nB#~g. _7aW"mqKErlÃd ,Û~w,&G2d2G0EBߖ~-r.5Wcʹfۀ.m ,vk hp(0 ';r >=,ԃ' 8h!*ӿi v )rLV<Ƴ>6HC+y]h! /n7&ؽ  ڂ D$Rr#b H pf lBwz^Z;[,tubI\JOhDڏUu~g9Ye.'dqn*}U*_^uāAPZ;; ^C}+aC2#KBN2[ 5ԝ_k/ïRZC3|ӡT|cxAan0X 7Xi_ɓU['QP?LËEϵpmvt64h1ʟfӾtVΏs-C|$@ C%j?u8+X򞳚L4elkɟ7evUfcIj#!Zdn#++22nVQV堤 5N=w<1ƥgK{Ô H~V/%ՄzPm1f0ޡWv>: `x87Я ` $+E"tK o3Hw|}h+=)BL朩)ShG *=jI7 0KZEOK:?Er)ǹsH}\%ol73JmW0%tΩR`}LP !Oe&yLJEὼi޶ۄZ//|SCӶ#S^4"ZI3v;4JBkZ ;WKsJ]'GL2,r8B~.,(0l$=aJn+l)e$z{sdq`3xMB"(*baf!殙A[0Pls/)+pNlI*?Jǽ9B+ =_Fѐ/}wߊKHC_dTNT'HtOK Ȧe>wʭM>sN+,?%5nNZ0-ϸpD J< "'97]r6n&:K.aDԁO5""h25F1)rd<~ ],Gb^C5F5<3LWr;uP@* N qH7?W-sC Yq˩HIEa{YViڄ:!! ΃1iy}gYZWXyx?|0B|-5  t#i*1{RAc۝ʛ،|;o/ {B  ^ǖ:n pHVO#[mE7n%_(F!O2'{wv2$lZyV|UVtɰan+K>B5/ڳJK:OFB˶ѫ68_E>GԛCc5ORͥPeF5׼8϶3'ǼS=QXDDƵi"~n޲ wʁpHHqIJ 4MMY+J)ZΉN|#oSTBx?0 %z5-$:M8co!_ 0CdwB,h@^ {א=K%p~,V so?4j(m.cS 6#2 2K7ŔX&DﴓH6sü+Dkl_viMmHb-4乑]ܛ] PsIq[R)z#_͡f WGb I]cg+f}M >; MM&#i{2. 5BaJ7/rQ` 9m[@b[?>vGvCrn>ZZRp!\jip6(#ƆIbDB%Ә>RAΘY%E02cfFU4cFε6CwHGfmCvtj}u!O,Crz+hM0Q4E4m;O~@DvTk@f*?|ƇLSTAF9>H?k:ЙBu]vvA>> OD! ]~[0LmTUEA@atXeyXƯpݡv tfys5U~P16-71ȩ"qs ˖S:+6b:\!2>UEM<8E;!Ԙzt{η/8KxZSi#$AT }5~M,/R'o՞%j<Τ}Rk)+Sݬ'ܠz-',U?WqD) _YKva bϠذRH [65x&7촳 ' E|ܫ7(IòP4Ec|luߤJ)u-0Ƀp ṤDqOV ^ܘZ}kU9 ˟Ze_/w9^lkG=/>.xȋuѢRvq/ .aOM t^ 7` y[H/Mb N}iS1|{†ԇ(\d,iw/n]Jmpc^YF@Be!?7Bȸ&N `s.G8lCR)0',=<%3 2! aߞs5wɤ+(<_yL6u|*99-UӲ5xt0Ww,(^A. UXOԓ}=Y5ό-\l:,SXEIscyyLzWßS=|T|I^߿('oՕv>cV5liar/ސ(;z($]AIJz7|yvp%8JV.s,F`Ռ@7V _{"ȷ }"K8D sͩ r: AA!Jkz܏El G2]ţ#Nn2W)9)2qoܐ)(P$ @T8D4~&q<:ps,GgyBD.qU1Jʛ?%88;,6вȱaLG+䮞*SMrt{mLpyKvӧ+;`rޚͫJ$B{=Wuq4 DאwUkB_n| MFDžc897"@b*c֚Zqw'7 g}9=KmN%~I^=ߝ1WSe] Jz X)R:GT|T bzPI EgVh"dق_D)mQup6F,򼣯f\UgO?:j87! bXr'r,<%Ԝ[ӾktѨ^k֨(yJD=6YlsO 31_tE6CM5nMS疹=C_vGgݗ/,r߫c )ƿ9DWx(y(]mT[hhN,:%Q20ĈS.dauM/动@V[8œ/ho}E}瓙Ir[%9ah]Z<& :Bk+%=R7)+-?O7!?RRl/txƌ^V➄ʻƖ2%mw^ Q o3Qkp9z;WQATUkW<5"CvVetA7WHR'dʵl!zJ#uB8G!csTW < Kn:L $/VC|։ VotOXJSdaFeQR>3(9+[M_\@":j<@  r{ӷ[UY϶ݹ69̀`l :+R-  9˷CsD$#q*a8/(_?tc;ұW>0oXRU ΀ %majP!dw[^ uC=F^;~\5%gSjakx|oޝ+?w?S(ciGdK4eïpKi2;U(eT[>| ـ-:rNʗpRxЭ" A,$ .v?]|VV8I}\k!hӛ9@JCt UfIZe"Eno~q|~Lщ >$" 1=+ԝ_߀8N7j7E6Gΐe$'`u  !ǰQ[gJ")Mt,|醵ޢzm/(zepDtC/8R~Og̎x]=K)EЊ-ECƱ$58gxs XBWVGL !oxxp[G҆q{l#s%~ҥtAL:_YkKpjzٹg7-zŌi- ]Gb0D i.ie'M6"ՙXcpj \N )|rCݙnO2 wtr?ڠ-.dS~=Xo1} Y_2zed<n% ^ r T<'~cާ(&`~b+t efJ2YӶ*,{O6QN;DuP$}H(zmyV jeFF#$ (V]Vvҏy32}5:}[#ɸȟl噝g<\ل?#-R,pj. Q7(^_oV>`=ݽ?(/b]B4G 8AlE8x\G 0ygZ͆a`jiF s3 ͜kݖf-@4cгn:AMYj/LN ZGڞrbGUC8oUfLӾOgk 7YG)o&eܜ3&`GĽ R(&v[þmGz)z:Y+x T~,]>5 k'1x )*44`S7k{O+^G}C`ʕPtD ˍ4e_O,V@"zjc=[8F&gϮضi#U0oZ<聐7޺J?b⌫y/wmw,933v쌍g'˴'KocSO',MLKL,4 ǧ߃Vu9j$uPN& d?p?H6Q@.}%nTU1T0 L]OXUGΨV 4r8c.?@f nS :-%㊓ŽDTz2@QA|}?*k`aa|&1)3Ӆj_ŏ 2L=ƝCV뻑{3 ӕidɦ: NJav{'VeK$[>f9e|1Mh M>y~(*\rFQ1~?Uo1)DJ2/H#>"&/߈lu.Jr׮%i }v/K8?k0A5Fvp iy+dٸ#~MY>oS}Y7WR>@R !尶)no5-@\\Af/I+To1=DD>@=h5I#EDd8 iH}xm8@B& 8=qЇ&p9:%NSl[~U'ϒnn59Fͧ0l̍*gYFnd (1rquǽs <\e,2 \hjol=ju&ZT'EkVJ#ۜPN <"$}~ܛѫe8Lc?Dv-pLOTVlf77?jGk*N,5: ㋄n5g!烴ꠤr(+c zv[U?Jà+ pFX֔ XduS#,"7҇um G#b"ՅvK,n|郋"Fs~N/zJX#p[5CއI6_I>F82mYeh'<ĞK"xƑ&w/۲6'M쪕zcє) <:n"X<%ZcŃodprhj]$snݻv78Q9_b/^.ͅsclkUo|gD4&pLh]&!H@&!]ws,1$ &ՕIƏo^/G>}"z~i LmK+.ܢysS%PS8:ǡ2dq޴4B"9$*ӆ:1il[.w'ha; YR8Սc+ |0ahVHʽuj軔G^xQkx}z,<$#=Jwd7mGކܔn2O=)QC/q bQ񒣗Ph!o7Fo~&ځGW8\&#V$a<=cN?@HL'I=@Q19RPht1.FmE{̓~ 2P%P$D‰JTbV|΢'Ҫh!w<;8[͜Pr]``/0~_75Q>V g(8-͡L3v铼4[`}jSvkt$lګ:=D#וĽbv 慚OS\?~%룿*~9.qc7t&&fҚ9ĘOan.]!8|*o%s>;˜$>wO?Ӧʎ~ڞk7$kcA^ӚaC<(8Ob)h"Ҳgd99Ay;oRgoJhXR#rӲQi)7Hq 5JuaG&#Q(ulp>opYᅫG, ge=0%LЕr_clfٞ讙jW&Nv5QR&r*i _`t {H#3$o1*[JLs;|h,~ex.򅝕5 4x TZ>TSs)i`&Y=>rfÕfwc5}\Q6[;GW?8&\edB iKݹr`o,Z;g~1{X&?56YNɮת9 #+A*~у[S G*itL#d(=K|rC2r39tOX7^eٛT&h^4` ~dy- mylo[5E ŮF I6Or[3]rhHAHpEIKԶ+9 6:!1LwKݚ1P֥1qSg;E+_D)sC3n&wG2tuW;Y[Hb2>ﰹK,[&<-A_0)?wxHKt}FGV6K. )_ =33d>q&7OGC~6SGd b-Bwc+WڵhҜWGsޏCQ, uwRX"Hɳu~&Y DьB /Cbfrw77t+ 6R}GƋ =93֌X 8hf~{ʉ'{ѳ'%:0V?@tOb *K~# ~f_fg߫Qx  ͈8u@ })=0-طNo&gهLnlha_ى:\QjXɚ( ())"Ҁzk&Jwo3SY]m ҄ $T 8+^dl^=gz}.Wl#DBD`}AWv\noOx?{_x tu~Wn|w\yMD+(|KOkw+>i4cRJO;sPq =߹LП՗@fhUf/I%2F֨7^׋z/јOűZ:9߆n:wf}⎿1$ÉȨg^2bJXW~0zHd[R];Y'osPhhysY8uDV dUڐ;+{敧6j΂qoJnb+JcӒ]P[2z3 kl81rà ɢyj#9H7sѐt@ɳA}n^bGG)/SZC(pMA:b5:ki[ʹəf fSڜH6z~_/1o%g:pu9zq8,fD'!miGznu1@bؗ%\5;mBqbD y(heBaXKF[X<򟬸^̮`ehLO(dixu '$sX}80#Qj~ڌ츷qmS3.wETg! MybkY>Y ׷V <3Үћg6jcI8;%jS7uCrLoBRmN'TպwNgKW[`F-$ >c ;7yj䝱hwr\HӚPFa$` }Gwu696"n*zy/0\GEalw |c7 _B8@ o'18 s 9Pq˹w^wVg^?e== y/1εu*0ZO1QWnQX"wQ68<RU䀷ڜ.bư)G{{Dk@늬v!K ޭɀVw`=_}CLT=)[ )?wCt?7ֈDq: k6-Ok w3޻\fH{c߈O~,>qeým Ĩ;x;y̔g\yO ZJ+1yDQx#{\3o.o5j. ٔHixeuwws P}'cwqoJa DU76n0{܄L)ctC'Nfz"y$7wB*`w\Y~ ^5C?98 90׏÷ra͙s Z&G ZK=8&}kwtR'q?R9w> VJ#4}U,R+z#Zf79#J @6 /4]-u7E,uօhYv3r#FFSR@c*}F]zyNg6*ɂrعʮ\GBX-۴4[,-6"s.XVk3+AD`߷׏ dI8;b9?p%ӫq { sr$w7vsUC/I ( @!1ĀSh ?ٞmuՇPrqh*@@@r 1Mmoj؆ ehϹWW^#F>~G{ų{u@7KB y A Da D+hDݕJbm#jM)`qnhrp!pABpX6Q1Y4ڟ-X^UR %.}_:OZn~Z*%cJ|l~oUAIE?Jv2NG]Jt,\ WVx(՗tW; K(#(+n N@wlŃ{j-L>B-8at{ˌt͌lhDz,3_mVSOIG.=Py]Nci8LeF+*Wg#\{\S~{0m~KDq_ƚ 8 Mk%j=z{:4]߂a]n`BKY$9&pdBSz`?7s,TU$3d`rXL]F̏Pw 3V>jisPhUG lC]`/Kc$94mGL\?1_]/ _i iؙ,B>cr~vIkyY[ e$M7o=DZd'Jzm8ʷT.G hã-;gz#݈SxK=-v6e̊阅 ow%b},M^};kqb뼲.Ӻ(>-TFSN%;xF燳!oHGߑ2v*WT} !iu)T _w__]Ev[j˖baëVij?@b:/a%͐?`2q*`\)G[gvJ#y!t}fi@}6~i ƛN{Og3yn. qp[$-X){מ.UUh_[?a@c9 4g\%L$/_{W9ܾ42믊=~J 9ܮ)Q­_ ʹgy7zyKgzTM-U64Zlp }CWG*U?Jk -= .z.7|_ 0fו52'磞6t U0/pRzjkxFԊJ,LQuUcqPgʫ\>ᝌK#\HUТ  n ~ޙ.K-*z;%~,gO{Ɏ}F:W/Tr?I@{]-:0S`M$^G5#6Ql/hA8ѭ Lp]W(|(bD1BH;Bڕ`rn(96~E/Zwrv=jy {vR~dF]䖩6g;8d|AvD5`ݲVo>y6hKvw[;$ZK:aKۻ1#d-}vcB6@A,K sT]W&T)j{Uʓt=#^a@6'FEܸ ђl@ 'yG"\gynĥ.n(Q32hZEy 8;JSp.Vqo"]P>&, #"VdV#κ6KX,}a;kұZkZ*eOmHuFtxmJBٍh{ Gl\6":(QW&ۄə1u‡خ%CL7_Q='Ĩk21U6Q)N?դҏCH,PM~ k^[K=$-"[d?VE5%Z)x[(µ!e\d֕v1iE)Y5~]&i~Us 112hDu4[C~J%!f:mATbER=j6fn#oE6hD--]zOƮ+L"pQΘ 1u -,'[u\ǩ aѭ$yNt(RU@Cȟd-|?#%heZb*͉+.FSc\ AT侗C??I,erR@r3[^݁ҸۂQ*.ua4  ܇GPs̯Jb+MF\miZe]e22YvܕzKboL-L03d>uB"^{!r^:7QJ-E+rX:Nq/1mtU*?zkq\cL\[R: DM;`T'2 )a ).[z5AZPw^$4u?KRMb%ڶHcy+GQFrC"՘uu3oCgJ\] Wc>3'xibFJmBf"ƀNrU-M |[v\Ʃ$v?odn&f5QQ܉",=5\2#JfDXc 89_IlߑK;eV!_>\A \ ˘:0O td![ufMZfcf h:UQڀD`Ŧ=<wck|M *6yoĝ{=tyW?>J;8[>̍vOadG*!i[MJg*jYb]U)tN H7b pZh`O &K ~OʒܬG*߂zɸO&oOvJ{~e^jl«tr7:Q*hi)zåŁN&%2SKiI:\F"_W[Š;ъ=0j.6TR_BD:vOnuuK"0-J<1m]^|_)0Zkg/bm1{p~,_-d> ';P5CX|Wғjm? MI$JԣQ=rJaŧF{xz$vs6Nu~|-HOy^Y/$Dt7rڡAM Uj~AVb]47l+ROC⁅e=FkB+o BV(*賝^Zyl70fU|ǖDwm>HeO1d[HEDhV|_2UJ I7f6ց&L֦k>,),jXɨDѐפTOEoF޹Bѳ3| /"d'ymF޸B%։.Ƌw7pYEIv pyjzkeX/lݶ S}ޑvzEF北B֍_o< W)4~Ԙ,B6@-/f·;В)DFA$m{YRCxkE9`aK4w5,=gq)b(AiQdz}]z@HmoUL$sY4A,T X-K^la-ɋ%-$$?MK 'z녎;&`(>ԆD˥4jYWmUU :{1#`3M,0@.m/4-+krQѴ/T ?HMC ߔOA-f^mz=jc옜m*',t@aU]E7QK}dakϟz[x, ,&У5XT'Bt|j8F I.#ݫS& TV'exlA/j@ sVDŽ8~:>:0SH\~BfHelR& atvՅ#kPgl_n%Y1dY{LH Hl/z6#*ĸ t7G?w(N8jN)Mk%=ݿIK?>yvF_Rv9"X}H~ qGK*8`דG0 @kS '7Wt^ I1EQ?"-*C߰6jx.j}atu{_!"gmy]g?ƾneoa2(:|>q-d:W!-["TΝ,=6C}13D_/j{2pOa̽JμI=:SHۡD3z#J׿'r=囏CJl'GM4߿J0EE7|`OW= b' Q2q @`p(p &e/ Wx $$ʅ~KmJV%Uk 9g6kHJ{m ~Ǟ2k)ػP'jF2'n~9UE]?!74 ΜK} m< 8˂7jFjш g3+u4zj"ljif1znqW ;#jN)??Eۯqٚ9od:`ͭt6Vo@P : -4s:؁+fCwҾ0 [>즹Yqi=U'h޷zETro&SX`eY|+IKA)fTr^wcK:8FFRJ+B|i6҆,f~G&.Ƨba%L, (~p@\Snl$+Iɐ0F9i2mߞG^5SVŌQ^R6T^SNM:"MڗHX]]>nJ {;ο4L>%QXwdu=ª#>ݿ>/+ K#rsrsTnw.q\uX,ͭ^xq5I.*S].ۄ]۪Ŷ r`lNݫb%Xe#AGCkuK+Q#ܓZ9.d\a"9x# 5,p`TvM3v_>%N8G[dC.6ú8Z6qzR{o(?&froAx= ;?P4 jLa534]e}rmHmtWWjYy2s0ؤ0$uchh'Aء6P&Vr5|X`E|Kɹ[(_LBw\8:nZQ?j)ng{]lf](`\X"c{3 "Zv]h[> $9an"4L삻P.$P@BvEaD$[WN*O:PM-J4X<6jEj+{y_p<ֆڬ7*+]]o{KN{@Cna9S{Zd82"O}4GE.2,qWp=H"@H%0/yV\`@",= PY ͅ@yC':;:hG)̣K7ZzJ@%Q[#h{WtȘ\=,Ua_{}wPr NQ  ΃:0NH|]g *D},W9(uM n8^gur}}oϽw/F&q 0gB.:8I;+~˷?$FGαG_P],oŨs*T|Kw)ԑ Bv9rȡQv֛@xpViV$`q筵 yJzzdvd&eׯe_ߥ,tkw%m_1Sn3ł-DěT&SFاNJ1# BVx>z.9`睃CyLWރ-xӤa:%O;) /j adK\hh1tx}e9K^ܿǒ'<ՒfݔtLœVB)(/ {SB7+*/p gBAo>o_ۺ7cS28h_S[2LEoZC{[F/̑H헝's2Tq >L_T l 8BFL9Gnύ.#&Y p}~]_.f{ڂ*#\8;5D?<7L3lGg2Bt\l'MC7>1N߀XF|"v [ /F>9z;I7aٟT] muRG@7~v*1[i*R2hOK`aD8;PEtE ?$2 *fK5ܖmT'cP"/R啢@h?;˭k+գBk$vveH'pgIPq>)dy MwV_lDdh*ᶘ8UC3bX.ЪR裀 9j^S%;S:\`$eح=ڞ%/uҷQ(B 2CsJ~zzP}&Q &9^-~G^r>s><\7 03{έN}\~>=˸mR oN>d&Kt7ʻGRMu eA5Gt + /,CFl@V //<e!a_4F螡j¶+"oKM%k7R%tƫ54wkսZ@xXEtϾt/tHW d>Ǥ[zk#e휟Sم|'O܍$&"zTT!#-m~cK*5Hvz@< i]t2Z.p;Srw.>vfE7VPTPP!HH@lq7* *og7Wy΍441 u$'rx8Ƃ+Zioni!" }Eӡ 085S Bh 4KL=;{^̶:@U%oSuI vXVCwҜ␨;E\Dcb0V'x9Z[d_IXZ|7 ;߄RP_Za[~tK8w" ՍЮ= Mq*WCVٶ>>St {Ҷ!=Kwn8Q-Z}?FdX_ԫ#?\ In,z_F?l:gKԑ`v6&cag-L氮V,^Nl2kk;HV3 r￴L^j&sۨDXy]`CytAyQcXWVlZsO׏RWmk]gVLuټ;(;hAKQlE.䑜W?wB`8GW 27L&Rqp"JϏX!Xt-4w@o}O((76|ťq1?+k" _Hj@dx%Q)vHg/W;V̻}q??$o4LJm~/!fM("7畺*rQ"-Z@` IأvL;Nc8g.ͦ^& z Hy+W!xX.yL u9V/]._1T0FyWSzRb>U05LA↿\wA+ZnD x1;j A\ mc!VxH-Z-ɯES֜)١S&>`;yT;VW$hO="y[H~J4)#J1_TPjX)xώf>H5SFbfw4OYzueR@ks܌[޴\4E~^ա&K M|! &Dnpd;4[.4Ɂqr}v:2a#$ T\r# yZb9W+uv#WsLs 6IS:ɄΒncD(U3Hjq\nꖉoל_uȈ[MiNs38w0~o x7U Cn[aZ* 8N' اo;wBUDX? Ǫzm\L!9:BD4h\Lsn#ZWVB$g'2D_ց1mu-ihDHrX7:6iL8SPnlM.Wj>xjζy>Sbf.Cۡ/#!|e4N-XPq7a {AuYgCS:I~&#Bwar (p#0`d0ݍ W][{Ի]m:009 rs@0aCX簹O4#APg;nsw8se[IXrp>y @ЉS>tt.lt(ato^ӂ칫=̡ⷥ[%+t>$.1=N= CNCkX]0@op?.*Ɖ8LR dTaF)K;,80Kr ICAS'[wкt?{Ln"y&8[o qw_!no3ZI@и;Mx]=|R7wi?}8ѳޔM6m a2`COU "` &XqG9`)3Fry\zb*jbƼr@g'2Dy_1 e 1JY`ǮR4 Dׁ(Ѝr4$Hck.Yl`gcdO robGa뒡l)ڤ=c Tpj"/ֿ.=_""jiv^ Z}R13oj|(q*QAOYGtgUY0Kb6! A88= ŃJm s7\ަ"v&o4*R#c/A $J< 1Iljs̻"29,qimyT,6jԳO;R0na$ʊO2}H8 ?"RA)$5bW]JзM^ Uo܊AiM1ͤ4 7)гO:_ K?luG4̷1XY~!jv苲/EyQ@Rg㸆H{*=^P'&p\ߗ2y 9bh`6R\&Ylay/L7b~c3M.{*1S63ĺ]<[nO*S3xH?ͯ1@YBS 1'_y-G}$*1Cϑ 5c8\憴 8`:4j8c|y#딼gS<RZި3GcxٻtB!a`sq*p'?rPqj 9S]yc m{n?`0f>WCݞ) ݘ;* Q੽%qq쿇1T{ Nc#ݟѡ_8%P6Uv¬_hsx}j>_ Qw!8C_\F!Xux4֣0bhpoT}٣bP^e9ێ-ʴvҽ|k5i?oGr&2 %z (g#'9W h~Cqj(4H$- G`vڃ"'H * (,ҤeAly=\ 21S\Eހހڥ/*P.?^vzf' wsotB"UAɍdxGU&#r`6]J&fNDf 5 RS+D//s!yXyF)P;O3 HqVw$L |goJAO_]aWB Aɥ!.Q7"?~!Vkj:J:*xy5](*s؛s3gی/өK 9LRA[tQ]Yh՟Bz%NPji TyXWf_a߰鷢E_ O4ts\L ]K6T$$ <԰Y5z(Iy}N]8Bq Avd5g4D`wVHl]pܗ+"8p_(kW4c-,|b\^?EZad_#.G[7, %Xv˵;/r'XO.o17lU%zV+xC{5)AO;]"ێDyϫ@ƫdW*:\_Щ.zCD;mMŎG4Y1&%}%#qR.Ĭ-^[* Fy(6b~0 bRľV%V ;K7b8E79Ƶ"/7J7.A@UOz wW}2r~3V1& =ťٌIJq+ ؇|IsșS%'Sq<&>n[~Mߙc0w1kLM49֛n#P@` x畷[. 8\pc\͍]un 0vh~)%M!.yOiKi/a2NS] l̞"}=i0`x!GYq<<2;ݪBGXgp VX.J*| `)Rs'kݨDpqC{Vٴ50[&XGۖMFgɶ:>7M?DB atI]ҧbSSaMisr|^GGq[c_ws5ެB@pY& s!-ڹc #;;N^Y(b_ec(ߌ|y)?рTi} ?{67hRD1QtZWx G^NOm,!k'dc]}uK~R)D>EL);om_nA@}/8$l,Q9G߾ZI>;evoG3b'pg>~ wɔE*[^FVWx8h$Qs[m5”6F-ȒC)59  0%.1ɷ?öq*xz%({Em\ vteEα2FʔZݭvh̘by3!MqƮ.8t܀o.?YZ4m H?uխsǸv+̖/: txǛT^:+s?k(7#BBh%'0y̨_i|:ɨUCˬ3bEbuJ;"FP2]AHU9KwL;9xQd3~5 `xWK,HPh̸/*ufr5YE1?7k~ l'' ND@ @>n9{? ?>ѻvmf ^_Ȍ5aJU g`sˤ[ i7M݉zU)[kn%^kGU=AV;1 AnR}6 {|!kB_2W}^(cT-_[_QWB"벑4 Y(w #*FS{.)[隸1|KׄDu-d@(/Bs/2( Ӧ5/7X~2GhJ]7T/2ԏyGUV..XaNkNesģs4R㮝R=zS Kq.iHG 7fs?u|K|'c$2?4+)yFYX5vye*++&=KB5پ2HS߄Ңo5bfH |O`tb~e[CԈƗ|O悯 V JD!1k+~#j;Qh–n`P⢻.g/+7X@B;켒e%xvR{+voDP5z[HE4Ts(n=4SO8p8=k[pik%!II)+B?1|g?'ƿ܋a 7uG[oa @@dշ@tttt59@Ph Á{o#\Ŋ+gZ2pC+q7[ gDn Cv%f|Ԥ$EO,6䃭'1V)]n~.$H_iRcyG8*{\P>[0=7 4Y, ̅P3.{G~ @.b[.ӒooN<>HAæOOP1)nh/pڱ9* QD/ԅu y:aoD7*']м:%+kӎh>]P d}^p z;(MtKV,-Zrd/kXJA6auHp.&|q%3yr3{̶;$O P3/'J'bhiAOsqEa+bU~5PGr b@9`|-6"׈ sRĕP kI:07 ɞ4ćaӯ9oLOބbo蔡ŕOH 5wqdԄVQz`0*eu l]uPhbߌ8 nzI`Qf> zs?rMɩ8(H኱<6H!e'E>""Av4o'GC"ןdv5qMx8%=m*Pfx$| `HO> WƖ1 n@mtX|=ՔRΆ UP ,hpiwWv5_Xd86 )E;E^׻S;}fz#<LLnU}WPP+LȾvRSD`z,F|@1R'gf-wHZqGulѷEJ 0&I+i6;f#8##c=~-bKbZ[_m#P丏m`sQ8XM:<. gB;뽂ue?oɱjHw8NYɘ6 ʭ|:l)v:G~%0LzPyTdti6r|"sֻ) ){ԯr2#Rdj14ثs Bkm^PloςIV"KD0Q%D LW6/q/hP4S2zc\(Љ=i MԖKd_ڤ{IV{r?'t㇟.5lwكeFTBph+#* 8|"mb5kL)A_fkwIxRA ν0ș:J\-n0~[Qtԍ|ue^=~)Ė1~c4C*[_P6ij)bdZ~%OyPI.P5xY8M!9LK2w2ĠHcEZ0' PV)] Wr WPi\F?FxJGtq<[TF8k+\m,er6J5~9وKUd;][7J\&h$Bx;B9/Ffxim8znc Qc *=轿dM;߆Έy0(^x٣N*Z4ExоOdW*g dS))}|:́f nF#AX2,k[TA?BUb˞]{hiz߉eY'Kfh:G I@V?V`T6..vzBPNƁ8*i|fxaG PƷ{NĎOBSlaO8KYÑSLb-~[ؽ2[qwK7PrE(Qe/:8%2W Im[p@ 4x) `r7OS۰]9?2g2Xx<6s 7q&LT "M9ОN=\fcg0uCTxc KgԧF*qw..k1cuM3ϼQm ;wE@c>|hrQz#WK#acDfPDpcPҳвGuqń*opjRV}ʠP]n8!7I$כ| ?$y<*/as`ɿ52-0'xqtfjSP#(Ln _}q<0z32 9g66;uj_˿nlٜ EsCepZK\Y-lj#29.8 ,) vlzߺPhL88a5}pH-+Yq\cSS%of[FB#CQǽ&"'9oaYk' _SvwѷqnMa$yE@:^Ơa%@<:`Ǹ8Ð^2 % `qJX>τYȮ},s;c hxkV(J*6xaPF %dÝم8iZXkYz.ǹ*aArTd2C .L_#i셒5r:aiR_~q/E8L.^>1P=2sfg>z! qiwu%׀N7NU1L<^ep&*ޘ\D"בW}T{ui;X\O.W,Px>E$3Gzh!'+lH!4HMm/ʴ.}*Jo9ݼx9=M} !\h- OJdX&%Ozaqsx9'[SI'iF#/;w=FIp"D yhA$Trkg;`=Lˆ T@*lV ֩|meVFm&]Y:h"V#^ qXw_vmp6n2W@!W|;-F*nGh,q./gs~uhHV9($~܉"^iAqv)z>_}%KI#瞀ϻ h-\Oc 8O@ <&Jq^]Z1n_*RWm-a 2U=hWpnO3!路mΚ A4t{HL'ezh !> Sϔ˹2k ̩&DdTJ=?wL')DI[њIu_S(b6S85S?0^<6ra@0$J ߡphx͡LJr<E/x3 bx%RbY~pvb`oh75"=Л!-Hm}iKY1pC@r xKZ ]ul!joep+b.];ӂRBq\{R3 'A, B =dhם uo;_vA"yCܽXHC)xh5AF̿|%l|;36au>"<_2eDb5uT{R^~l~X w4>ݲFzc!?5NûqBUhג}A2. :7t˛|j`+P|Qg}dYth;Rk/_!*Du1ۇ9D4'(H2BVX:9a`^dK"S[n@ZHG?Dڜ3,``-y0"%~0ِA0@,\j?~#89yX,ڶ[x|9 ԓ6`X=F };]y1(  S AZ܅Ex$&|sI*TBoû j1kHcTȚ] b\I[+-$a]SmB!H+>-Ƞ!G2.u( $YHя$í "S?c̬˄G2 _Z\[%NZOؙnw4oIh3 P%B&1}b&rM0FQ"dD3Y'?yF^6mv-43{HeTx_H pa1\FЈ +{0Ny+l}u~. F,ayE1$\۬)s*= {b(Ah3N`'#)<;ok`vj79;3neq{ogFc] Bnh\t8`681hh\T .ݼyamCo= (1fZ F/r6evdۓ4 (f"@/`^_42Ԓ}ԘH#t@2bb yZ/>FjTmژW4龐+XB{c{ziWbvERv٬&[8Iyv;CbHM *J} tsIw.G"7ISd- TUtH |ѯ.}Y 7@3 =Ǯ$>@M" _; B2hpq gm]3>!~DjGe\u8>ag./-"Fk❌u.Υ&cBia,ڄup.Q9$Д$֗[KMWq#->=jc| ʃ:_cW$ZARU`8<#es:\B/2Ѻb8x5fB>FBHjr酶w1y\ Fz%kq< 4\sQz@!2ħ+53xP?kRW5/'[G.%m˭ɢ~0, IEJaa&IۢmE`44S`0*Uhf;OiH(aV[&:2 YSp Koo&i N8GI{>\_j8mMSyxG(.Y#TJJy:DFJAwֽLt{B-"5{w 4s?3o-0/PFp0&ie$"bi—&4D,jٴh`}*X^ {XbWy$I(ݧC]s1wQ?X\Ɵ#7qmAɣa5:Y`c*Uнxf8X``m 3W/Kz2̏ W={Y29d|y2X} Bp֘QD9~xz1R 0Ǟ1!&I>뮷M;Jq1jw1BjI!qb%ȳp–VY8KQ o`5a=t%rӀ8ytw`v0YƕϡOHk6[XЎVyLYBOa1-#S֏sowlsa M[CH]xY#ǎ;pnlA5Anȷi`8=իAp$0^C1Lh,6fpe.J9;'?ҸXi d j9wߎQn+v j@6FNw3G̓KWY&ova6/ԕZD?!w..N//˕vx^j״q7iq?\]2q^VOyfv%Iq}eA'Gۏ |=E]'FK_4?~TMf0;o*7tKSBK> rCc@zO)k߯bUЪs2e1ldϞmH#wc.T%N Q6g/H +s8<Xɀuمb!_:j[Zi 0uPծ`p&S Dز"VWOI00k.unc ZEvkdH}(?*i -]S{[NqT\ b01X+3BBKψl_v[ǐb}:dy۠0EQcCy혍Y)0C)W"@ƬcPmn-a@.kzc4ƐrR_O~H*Shp9e$Uj a2;HHBߜE3}Y~XerH6VK>$3ns08, [4+ġġEveo^qr^DIה'D|`‚F|9.2%C0ubgG5g]7]'ZmUk\ ;)N'}~v(OZ}[7Y \e{ks6϶0 01T3Os߾}1![K%Ҙ&pv Pcb ߑhuq䫃 k5?~ڝdR?ʇEsn~(z\z;]`B󜲥iWʤZ3 X}t+ŵ5 ZH;r˥UPLR3>Ֆnm$)vcOn>IFG#&^ZC7s #|aFr.u:_rj&OWA 6؁.i8DZ4arMT=wll'XFV"nAc~4 Y".SC a@t2v?[vm'q}h/\  ڑEC;3=LC_2";c_}wKEB{ft%ql~Nظwb EVMWxrx2{laxJMx&⧑@c 1iaO@P a-V-gH9"_:EG=]GTkC&{yJ m w.ĮD`G2\q2V_ZMɐW7ZpHT"LT;]nN{+aj0 w/=pOup@w\ @C@B1ޏ  }PUQeDēK6/VFJ=&mY?Sۦ׌`.N$,]3\ؑa X?Iӊ"|E.Krpk_MH3( &/ڌ@99l_48NI8\89Ã`lAP99Q>otpc |\8LP1%]-2x-݁qx {o!o:O\w>$[{ԝ/X9C  XX3xs od('<28^"#HiFei?w{2~arES:(Xv_K1@}،aqLezDA{ZR+dُq9~DwRM/~2oZ{*S݋!!¡cj1i!1[ )3N@}d7J‘Rzn0)!\ >+_&<[P;Z pw z(<ݷ6mf= AU^;egϧ*(.;BC+}ÊI `{oN芤#!1 Kz6yUB+:,Uq.Ou(F-6^kMD}Ǐ0-`[*9F:Loکlj >/;~izխ˯<ƂәP覢 GSy/&j8rO.'18VoVf[ <he?[iHR%0wsClnV[8J[|2}@<hש R"ɐ]W$E4mkD{! t #GEE& 6`4\Rx6'̉!py[`gX,\ 4KU``X@@@Bh"r':|2PU7;9`D]U[w[֔NDBhq7\.滚?Oob ?fW \jJ{~V8Xr\# 51,ʆ;&gnɿY$ =HOIml }k5z/#}3`¸Ar3ʗT!G*}==HY1=)HWR }LH,6Iźe2-g:*{R@>\Wݼ9bX )J6ߥ')wqtV'X/;=Iڿ+mab\vK40ٲd=옦ᒌ͗$"k>#_H)Og+l7;W {H؆$5BNv aJ㟵tBOv=\q~OI١,>7 1NB\]epDI(#Uh-hk}K"tj+B#maDLH *+z鰂 ^Y!Q[T16hֲѓʥ"roB(`қkxaoAʼnE(SG+h@oO`[e<$K 'h2 ;[{%F7sH<XŸS]gTB0\oR}KY!X8a7 kU_ !o%p&y2 E>}0WK 'I-jFIj%]_IzD&ANlCg)¾sRqg6` T ~aEÅe|{[+OpOD$ĠzJ޽d혁J5# -VF>W:oYkCg&A]J{dX59"mG9T\O> zP!474w>Lݚ!GR oM0{}P3{QpEyu-x][6m(ޔƾZ5$‹`l|Wİ Yӌ>hF P5H١VUO(qZf%wSTl!gpM )Jjo|,;V(X^vκ_bN-Ppzd E:rKnL_"e=㛛tx1>ɷKwǗO~,a;J#?n*(n>ďR_:qME₯UD)Y/?)RX.R㣮~ON?cI?y2^zXu.GE0|/VHn`@r 2j?+Ѐ!q]"VF߽k'l yyIkD}Y0|FW'cϾUÙߞ 7jo)?ij[<-STuM a 6)NmPC+ei pYqQ2vUhyGy`m̐\h"Bq݉n˪gr1j[S!ފ+ 8P=~\R_6b&RuyQs)T,3Ar6nCԠ[kl`PKZ ߋ(ˆ?%+8-8oRr|ZCY x/6ZhuK(t>X h`(_()E&FD>K l.ѱ_W= ClËr1p g",1rW䧗LIa $=Mbt:HP/uLDr͐>Za}SݡAh&Cs5uSA0Z]ף1hh 4f ٝ"TAED*36 ʦO:~P ^ ql CiL\`.Akmc:[n:t 9m#>!z4'일 +Lp8;?8`:Jqoq=vpg#DMV] (RXʁ/i6/uD?\1kGp'N rBWXvKB v̴fԡP&-fsI񦩮}gLٿj{@vy8%yOeO567\)VYJC6iovNo.C5j 3D7]=jc3/]m~Sy=+qF$eZx-& F];CAp)h (*;#{{ I_7b?$̔'vP/ aP'yښOBPZ$ MQ9Z~$B0`sz9|=v8D:7"ァ"zh4GSav3Q`ڀ(>(agams(*ɛHA,P@7<yUK-mnؽ7ɹ́熇<2( ZuD(ytћhѠ7(WɌ89=c,~:m-sukrjD@&& ЁɈub;,t]EۃsB.:ck(*<\Bؠۺۏg:baB|8l8ě{n5ada8K8xvc[VC >pS5<v QAE 'CQ̍dx7Qruq@*E4OzbUeSSܶO 2B|g1$FK[SX |۳X=BATh,:<9DxP{U^Cg.meɺA.yQ)_Pqf>/i6R %s5<N,Wr["C? N#Q-i?\K[ƍaÛJsZTqLAHLe1{IYSw,086X;|җL|ߪGqȁ#WrtVIʄYDNUk.(WD{=w#OMr U][+ xq_Wɻîn?,C;AoJ | }))o]v"Y,eKHT/.;-{x% <7ԝ=m(%GVIxp*wFBydpB\gɲ 3V$mI\DxԖ_AOZڔGX툶l#^pKB_qJDz?PyM>n. fQHB}"a71g !j#J8پbFƳ'TK)ɞ! 7?Xr{7~+ͽZᕚz55Z3>7\׈QY/,|WAlMcVbͱ7OZpC&9yuFiIX7>8,f{yZACS%d&>1o§yXm8!S)VH wp^R*~ՍzԮG`% G4> >p;047F|Sm39e59J3ph"{T`֔t/``044[DB烢iqnX [=D]к!n\sz;!d :CR_r>@|^{D a7sPKrO0 '(J:w*)]/^'Yǜi&;i "0#@Ǐ8S;ᖲ-v~s+lfF>nKCp ؛ !;{ۭhTLX vG V3HY/z'v08MnfyXj(z]ic὘ؕ !QXaǼ u %AZ\|0:hR‚μ[ğG~ӓڮ,k^@d>dZڜI**{ASmeؔrj9"f R7#8Oo24zo' fCbPПeXu<[t ?DVOkW&ҋ{ }+C Ăn(ie#(J m Ob5b cMEqk{tC[jr'&{-cӯ ĞTT]i{- }tX2ЖU4:D#j=c ,(#D4})=;16ƇYGRڒBzغtU522U)ɜ}/WX3 .0{u"15~ѠnyN(g#ʢLg=%쵈"0Rp2 SȎxAZI8pxV!>,6gVjMp@%O&hR`'mNN5o3/|T@ $sG58&oạ([`~? ($ ݩ>#ګm {D A[&p YBy>c_~L\4?CdWmix cI`/+ x?kWdu6$3]x rfOv5_(1B%aE90X*pb(>d! JBL+oawÌXՇ)Ip\rHY&!H\f K|<_ Z:76:c!7z)>3ta')ǾzzzxDYXH L}-!g-?Wgv6f774h n] 'G(=Hް,0u17|N!vTH}}E$Ȇdc p&DҢ*` +nZާSkzH*hQE$V8m//ZI4=$ToD97ݦBPw+Y71ə CZ;XPD8) ; )sgH#s&<[y8>dtI\O]̯s`Mٕ ,ǹg.i~GP>I.P%A{<|t!1˃yגcx"kd ,XG}rއ(g[wޜt¿[bivbwxz6jС&M+yI D0n><*O;NQ{n0&`@)L $ VW,>-Dsz6-3^d~6>b2rI=>m9DZQW@`!@84V9F,W֬_,5f۶("f,]^?0\\K6Ԃh'Wm@ G Vr]݄O~{>T1v܇&"!G2A& ,O6`Th0 Q܋S,b-hrKҹ#0LA,4'Ҋ5K7µXD듬x]A*,/D! b` y%@eA@[MHJ>W(ak}C B!՚NfImw-ntoxُlSĎ: h78,mT&8M{֎JOZ;^&Qts2sP0瀝zzj(ByCm-7iqHZӱI 56àyߌ%⽋Lٟy="=^Խ~}K({ʐ ;LHR1T4\IKn@m8|;NUjŕܠzɛ8%~RP*u➺)`0,Lן"e1@u om/+8ْ EMҢVDA _xA0ƌw@zUz"QQ*?…Rj7cYBmiԔ5{9$lv hg_Dҹ_~r/{x5K͓V8K~2y6dw+_ V_BR?Yד#4>m}*3 u|6ocnaÚ_ۧk7x렛$yXf*ɾ%6R<{AC8|ej?C7t"aA{b?$!j A 3)bFߡ!0\vAՏ#!q-ۄ[o=ov (cq6" y7Adex}unL`X<;W$9A\ 8C+ dy-eq8gwo6 9"V݈(sk/Y_j//Dp:$q1 ,>v 3J*!2G\g@ EclTR >Ѯ Tn@ y؂EE^0QT@|0CK;2vRub%s*,D Sр?" ^G )g#:+#1R02+{*Y;s11c6B/<'Wa ds bJ|ۙZN&hI oPxnךTXAZpƾ1T ` >Lsx0)ˀg2G2L2Lh Io4˒{¯~Azaf8٨u esqLژr q.oXG~_(=PD-5feͥUeoỌp1i |طnx]??0.#d1HY (uQ3(0ԏ1U+@j *r@/ /=o01938d'rc X\Z?C5rVHAҵ وak:klCO/fFžQFq+!op ֎⾭=T3jo-k7mr`]sw HZ(+?Ex<\ۈD8 u[嬭ƞI@8naѪF8x (A .Apxɞ!Ä́n+w KGiǺd7a@8;eNu3w҈Ģޱj0OE7jH+>Yאy &)!#1>om:{|n905jgRՈSX;JpvEޗ]e)בe\Y;3a2 p "+M*yfq<ˊn:ծ DS"/BY)@/H:ݲ2䓲 Lb8;эAU׹%7OX Z0aI^lK8yk.8/(ﴭkNBůد%{;` ;Li03_nb&ta!Xkhp:&.2b̔ jX'ot !S JDu3DGIQ R 8O ?a-+ ɖدGvS!b "<#-#b%2"}sD * 6%g`#H2`jO`[=QET~ KY[{FdPD@N3$!A H$Br6IUs/^ 2G ЛFsç)8ˌ06/Fy^p@K=ѝl.LP h7@ MU$̦ .Hc` pRuE9F/D*aV%0"DAb%~$`t[Z"ՀPr>?L1~Gy˜ P>DDp;;ٗ9ꚭzv&TO>҅ JRreG.3LS\\Ci@ &+ċZ ( ZlAl.b!%@a49ԧ)Xg8DYݎ"izj,9Y?ދQYR@SJ dx|pWnl4 =,sO2ڥFF46~$\qN(l Smu%9e.SpH="*UDg :B3 }$( ֠e 6壚bD%`oEw(@ӈ2?k$ Bf+B `j /y&RRJB(x(jA7c@k?G:3Nmz)<+_(o1 ;K3}o>vbq_LA? al6C*8wfJVL2tt]:P`SBp al`I y^.Az0D9K$!ݶ40b;` ι% I4nqS42\(1wU˴{_X!`Q^[R~YE*%X!c[rw=˼LrB#L̹ڰnf}w! P 9"eկGbfFbbP\qns'+8 +08sCCLq,l_|Ɏ^ƃq_zͭalvޓ~H׌zO0A-l>Cxx$w`6zqTp8Lp o(m3JGLqER9O<%ґŔ,LW.0 HG1 u>yPl@d, $w&F}vy+UZmdO>0VQSR&y"..-q@"(c h$i>њђχ\K⤤HP0@$D⁓iU@ƛ|Oe殼_UGR4,~8[8bOw=|/isA&kҀ{2o6!)8y:0B)aD*tN YGEMT* 9< Xqۺ}rQ ̏; Emn?( NC'RcCJ_ka8X9`<;j yZ+貳 l?.X!ML&"4w&ASx RAٮX.P¿Gv#Z)erc x8GAd=}_XUyf\{rܟk}W_F,]5[l<l֩/ XE5+#9u$FYI߲9"ze.dҺEƵ7:i&\R\x@u=CtO9te>>ǸJ["=rb[9ab^$i\@^s7@.!}NubaB UhM+Ж{'m*<{Gc<`wzk7-"L=Q W?=@w8m=cM?1_Tm;vqLctmX妀^0Lc˓g:103 y\6hKk_sưh՚f6AC̷H=`3lu" 6}Є=LEHa7[-4D۪H.mB~ޱbC1WJȐyǒ>&{Hӈ30J-K]Y9ЬT'41mÄp]H'%82AGe_ 뺏gn,4g| =υ0g\EWOKQ*+Έ{"_?ۑ^4$?}&I %0i*}躞hF);V؇ {s*Wh{YMu(R &;l : Cx:d_UF0fs$cYݑ\V,J?vWO݋lTbcؖZ/Q78A݁` \\gWJ&y0MO)~g4z#\‰KWV23ÔݕpO"7f03bb GX萡Hp|Nȶ+g]szXhw#aFQ]{V2F$t{UzX"xCDSKO6x/]Aue}hՒVV9hWT9XM;/j e'|K"XygCXEϱ_׳ iHSbn#Pm߀cVD'MI)x@0})[U~gzk{ mg{xgoÂl@"o59v3/#Ee9JP_F uݨ)l}8wBB˼p_tc|p:>/7~*|;1-!3bZjLG8*88jarљC@8aJ~2~# VKH( KFՠ=cXTRL⻚YOO+پ'g|$\k^FsplMb)n Wm9a( %nC) U<VDF{<(S٦<̹C#{'_bR6G>:(a-%`n(kVWLTkYzpF^1,D/{Nj=φ$k3].۵0G '{ 0.#%'7%ŦȞ|q d˟a \CxI'"2  |!Dd9~籁<40^M :zWw_])WJTnLX4Z6X8E~U>4v ۦSфwM7fH8scT/y+es `K<;90:Zw:'|!ޝ3zL 1 8#'W43t_i~$R`_נɒ~E@#Q&4XL;y?NJJtEݫ'hZ@Onw.1ypVhh4Btwqz'uhF)J_jeٴоx3H7*9OB3lj\ͤD;|@nþu|CK)D1oF$ 6N̉1&,%SZ  HͲ gRD@>6C,?+ DmA>VeP!se$2GB60˔S_y'XzlbaTbX34JV=e0Bۭ aº 'H_{C`CtQϸ0| 4)ZJh=?^,lG* "V:dֿM|s$(qz.AkZ<:BmWʫ:Nw&;C #y0JKsRT׸rEB75l('Rpr.=qW #+ "I$ Lc1^.0"Va^'-[b+jąr^mwJ2I8 (BȚ1J7pwPΦ'#bni^?9Ău + ϯG]Ԟs$P=ؚI͠0 g`9\"{EJE:bQpz#=O~6Y#a1r8+ơ(Lt@Yf^gi Wj6חûF} 'D>JnYQ#&G)lvKC*J,n<>c).cX/%A!%":bty4$jW 0ؘ}D:O;d9;\]qА$" տ^~H˲C&ߖ@;㣾drפ)6O4i>d#b dJQԒU˼ʇ;)aB|k)V|x~H)~?= >'Vz8Xp|Dz_ ީrp6-h0^CGK~HQ &)pq7t$sVȚzF}d[QrQji>Lk;)C B `.&CAr -I @ziHOӐǐF~}Whʼn!Jdo -G mG {,.qDJ~85s@y# /Q59 ;x䪙Oe/gDYhǫ?JM S*"Wٺn PlVK YR[nL-6-aF4䯖*8)Y2<rC ՝ڢu$x_<ŀOr[(Jn=Dhc"K̢߯e"X.hwD*~ 3f bwގjG'76!LΞ@eJ0 |!ըG/+NAQŵ?^/~ng&7_,JIbZFg::ayݶb/MvB؛'m8Xmi^Hail { 3,.T'vY<vYgnWe_w¨F[qJJ@!C8&$ 5vY _qu,NZjj`nnlZJAŤCbF+)=O (@C›@n 2hCu]? |7#v"a 9y%vNvRV3.>֚<W :O5>_KI 5~f gjmA kHX ((9p)LEXD xUWƑ0򞢗\q,wI8% Q˧")Ie3x/DegO5u0Wb8hr{5yMϺd}&>8K^i#9{;4:fcȈ='EKʃ$۫]J}88=^q*N,=HʊHߴebvt>\1C;-$z u~=A !+,4Kp!K&L,G x%f֊U1`0Q` 0Dm:ǖbŋPz?w8gsi(8nv0cm&)vXUФ Jӧf% %Փȅ z4FwN Xb 8YOHL;k HLСj>#$xc~jE ()hPAk\ %s- io pOkl:9{R\NRZr3%FAG0 M7*+Ḳ_#fb:B#MM*sygaTpj fPk g1EK& {{x)4 ,Z4nTs}28/ 跭A@5 5t>NWL7aՄ hG* v曬];d$l-L'G]~Ïcr0ÿvʘޟbH8hk.};\ekn׈8L0 LA&$%9$0J{8{ʬpsoAD&g{x榶ᵀc}~jx8ּ^,z a.7hV1kME, ;YQ9SW()z}$4f:$q~$?֪MpNA'y;_s Yxtq{@R<;ńuDLAO|P Y:2BL|rRYqW'aayI<*i6G Ւ5r`HjȲڂX q߿ }\XQ ȎȽoJH0_.|IDI|yސq3b%fxGCֿ_Wo!V>璩3@t*j(0lO(G4T!~,.%~D9j/+lg ]/+8{ /88<SI-v7N94 h`l01=eg5A6J[0pl6C ~`& ^oH>ds=gCp17Lnek!)@_IR3Y◐1ֹۧ]mIfI,(>\`Gnj2W@e7J|AXK1r0J|ńFVɜnlH7OZӹHǓmyhv#+ʏ7pxRd$GX)RkШ2"?T9p&3< W$ 8ai^f6;W?b#NkhMeE&Z Xr„<"Dn>^_~[w90QDsicm X=!`5C}Az N~\S>Ǿp7|j#޸63!4oJաws_8P8`u&&Yz>*o)&06ٚwWe9l{ypql~@$9/!jJ"TzҸu4?H[O2F$4p?Gu/߶MyW{?Bt/Fi`ĎA y nsRڨ~HHЧ7&_WC8ÆZ=]І{l38Q7BAg~b`^GTQYD ^/W,c IraR+`-AEZ~$j_O 1" *2Tvb:8 sz}}MME~3r}Ֆob  88?33T#1^Qe9v4| %ZB* > P3>gAuqE>wnmi ¶.:wD0 TA`M]4AaXW&}/3hYy4=v 8CpX$))B!x+ckjA7gv>HAy r}/?"˯'; MP&,m.\.;[zMODopdl?Yf難1/Apl#8j< 6,a˯y1דPo\+,i b->aZbE*d~%(0ac9~1\8-6y1w6hH.;E=%*I2hљ1|=Bֆ([߇@5#~ۋ-+9|]Gon"z%y Z;@H]Y:A2)Zvˌ-Zo'8Ax yXU$)8f^;~/i]°0$pV+z.p8PYÍx |j5An#^k`dm5.%pKH'NUE-I!w/{,!E3pY h'%!N_=۹Ot_)Kb1ʉV_i˺K/N0E oR;W^:^pChHU w Qp|K]g3p_m~OV8A{]sNŐ젮A^pwHl*u؂[l$.Sgt֡R^ϛy3 uJ[&QA2۹%E `Q{C*t xw7_&j:o9˓0ppp89veq{oų?vc {ڽ$ P:㉂+|`'w:o}Xuxu"&PG==/!1Od2Ur'dAILEN݋ 4{^ׄk.OԏQjxVQ  0ʽDeJouPtv-,2(D<#@w.Jo=ޏZ7aFOAmI)E$ݏiۃbˉd .Up^slsIfȞ݇ @{;ۭ2Sp5rb^ 2 ŝ{.i׎=>9řE ]`LK_˒PB숣rRBUx¸3|@#w T򝔓3~pXuJ10Գ7YƁ& FW^.1}gK#)3Ώ#S_na5BCD6 ZH(AEYW1֖Xwd:-obx1Usf ٖi:%!Wb3`Cןbg0[y-El_YK0=0oCq`+[J87EiN!ڽPݠd3 C$3V5r#/5`sV3レ 1 yrc>bۈg "r( /r7Uqi pH & `t.̀zS-w}9LLJgb])X <c >l黜i\=jH 2 J؁)SviFϯ+Tk4lܼA7oY4EOCѳm8m쩓L_7+++S8:E֣ere+SԢZw @!0  0o!pozݽGj3VX8l'P-B/v:傰qε8}#9 LP[=!<8BΌ8ʿ>xUv@ M#ꊰ./, Z(va jH1Fq\~%J=h+Mǽ݀&PyD]䁳z&RĶNj?5OM1Ph+YFJy7εB!T;2T7 3_NqZrEx}s+ u= X6ΪCe+ͺO~[P-WCج^_y Vn% {o'T:L00G_ր±lB%ړpE pظ؃I X\:Z֫xG;i}yCǏĒT9qU?Y*;"OeɘQGJ@nÑ'cY-<~{9eIRme-ΈHڋJGA{{CܿI[H. ;͎P2]ROPqa&Lk8J\zQ7lHD^AzH1Z6)|i*Q0  o6Q1 1!HcVm_8KaS(f ZD;,/|q98AG9Pq`d&TA-`?8 1څ&&(BK +` ke8O5T~q|*;M 2UV"RVgS p0 Z]cqq@bB*Zkз *#f`j SMcC0s$l)܁НlP!q4 ָyD^׌ "3!gEhwN'{u8W`*a&ۀ tB {]ԏ6vUWN'۟ '(OQcxL')a 04+w ,;K_6vQX%;F`͛0fM( @d bAev6L0poK/p~j DXB1мBoGK.=~L^x6{kc]|ӷ4Æڼ_[k K<&d &a\?WRRi LJ- uC =tX'ná,VGjqYEX/EIa,@Ȫ>;B`bASe qˡczODîE ypqiar~q; !Bzxy0Ns8Td| ;y_3zI͡~_.!8N#lbzLZp }`s7IEu ϤC4!!W8\+N+9($1Q\:,K>d2r("p5 ^;J{>OCۊ +?۪uPm%ŸXxkzIpw8AG$ ?K("/9 Y1#ae*圉J29 IV½MiF0 TT3,oCZoL|@ҨVΊ`$ z(I?Cpbd2r{"{P`:ه"ۮ?8,.EWpVCȃ d0j©}Y1 I[;, T]<l!N>kBuむ@SBώ%crcᰧ}B_*_<:#_/ p檩x'P.?YX8߰6PP0C<#8V~vbrˆ%,>I;˜`FFFF`FF$)y 2dʁ_ߥjF3[6mjxM4yS,Z\,$ 8KCPhώ| 5 wyՅX )Zp)pe*^l_2:=4&3%`hˁ Z?\Iv΋h-lH\(yA n'rIq $G HdGhZk%lsISB$=v*__\b, Pڎt0g3sf{ZN L_ A6. ;;uQI7/{}1doxNZ X/263ƥ`-Ѓ8kZ!Z/T2=`ѬtD Bӑv@}3GH=gy=[{޳|Rn>9۶h,v͌b߰%>aAW5è Nhm\&VHAɏch;+"1 %$: h= q9iowh7RFD[*AѾZA>)dM L 9C7!瘎ʯp\( 7=BSudpTstKj+'-v1g6-Ȝ~:.RJscgч{0k7'}zx{r9* )eعy@?&,) rNн/oh`lPQx`B9,H<_)k1#[ IsȞ !!d&|vL"8H -b$ᖳC.Os kn1*A5ڗ%9pP T&KD;*p)YOil=}~7%-]h̄LGqq/BIq - " %c|T۸9%Ň}ʝ-@30ab0%&&uBV\>~JE}3XjtG_lܴ>ʫ4+5ckk;s&4|'1OՈ.+9/SZox2FZ3yQEUze|BD7dDh?8(\=EL_!o-.Y'b2>`sȬi/,=Mx?Aa68x22 ̞6e |^RemӻɧA R@ 7~/ϛS]a[46`W ;l~cŶѡa`\eYܼ R #z@㚜㗜+a xz1D>GŘ]OGQvv4AoH7/+)|?#qxx_ AajJWQ$-u&$/Ң^&K=8HG'yM,dtQ2yZA!sa-H V8<`~ɡdE-Hy(#kDˍkz.m]aR#͜P'9T(um$ U˲U[@_ץ))N/y6Cƾc 30q6Vo۷늿2-"FEQ22t+ԟi";eb`5{<[)жAfu μLt>ix@Hg@@ GyCfu =%84\x!#"IIU8JxJ**y p- "-sGqVN?XIck, WP@Q40ڴD 0:1 p,y xd?kd̅\![:<qc0qfeb i8 Q1Cj`֫x".n.0 .x  $8iP@0T ֱg5;k[3mw^*A@@E@}2fcwdՋVZxV{&GG'{[oG}4ѡC8(R C@0 8@W3 سz-EL[3j 17auD[;8-خӵ[DJn+y`ǚ\3_,M&$z3XCU <(:0hvulA~foŨIA6ܓݳOȉ~/|q2Ii˅6.n2݈_ 2ËK'>|tt2|t GlvdfnF/l$jh(KE^s,>60l8sWW>G`[ҹu<ƳB;ge'[ȤӦShúae"ݦ#^)5,s]PL;Gvx| Lsk@BWZxU#lR%!(u0xĮ'K-mC-(!ٶU8{"l冖oo.Ǫ:n^Q=\? &YbмvRG"S,H7B#7(@w Ia|@`,Deo^[#+&GVr GE[]!^do&ygCGP> v&tK`C@DEU8%ap]R*  O/cSKYIހ~q5y9ϴLt om`CoSV&әKq@>™8d2z8ڭv v޸bT$51^1!v`eqlw3Skt={<i(p@V7RkJQJxXj3rz*޾nA,%bs[N e!1v-p% $!M'[ͮg%UMmAf9?ЁB٫T})l 7y/*vto?^דp:3 exCiK{`hupP'QI|Dڐ+WǗdD,9f 󸤳KDwd̟͝gĥN1oڢ`EA%" r50GhwRL.u@LBGڥ{@іM'K[<0avXq aQQ$$6j||Wvo)V!h 0ڣGHj.Gɴ"Z8pO>wom>|/9ls]r ^ 0bTBv;5eyފvMXpa^ʪ[Js> p/Ŀ)WMdaaUT Dž dhZ)Ƥ/#vw޽裳[k v Jk; <#'>0ORjH[]heO0rھG@v PLG㡀7,wR&4]Ci~H~udxO?˺&fAh.mT2o}O{ 4 h @{fC_pFԬtaf(1s E=C*m::ZXn [O * <@wj;0@$!,gct R];;>?ꌈL8;z7gn9C1~<&WPsزKoغfy=SцZm9+PUI}fLoU%Yr; WqA~[6ry$W,Սȕ}k-?iGRƁ8)saJdN%!KTY9;uH=\ꆜk.תgaAQ11p.FJ"Hj>B (goK8t:{R.G@ӛd un h,02`~xC "r []ɱCqxGkt{.S{ :Mzu݊Ba/N= 77dnώXj{G1!HV.ؕkfA(YR/Q5ԙ FDG 6X#*lA[opew9vZ67mrt7hWX:YK)&ÈbgzOS 9->N%߼|M#sP,JmB[^xDUd _I ZT >MBpܧͩz b8|wrǼ#P#s"zka-%!EROyLj[qK_)­+c_dzh[A-{

mۈ(B~AVgY%dԧl>HEn8OEb@GdžqsD$y%lxEN zq/5fk}L'Y *,pzL[Bt>B4iGl1@1H澹SW/L}DsP{6g=lz=#:֥{ c0R-Je+pc/7j)<1 KCʛ5Ä uluX*/tiܹ"R vjl ]t[؃|tbǖ`pkcYO aرj~\Hy R\'a/!X tiHcYBZ[ 0C:P - JI#{`?}rJpMS%ٸֶԮp,X(ĂzTA[\kHj^񝁈ˠ`F(r!GP{34i% ]pGԾ [ -o+lt6D\T%L!s? XVY pd b8,=Fl 9`0+98"Vn-$؆(Nw,!N C:#N1t=02EX̨t'gz `2`G~\7WIWDr+< 58p<죇Il!(@J0L$D?.Ƿ׷vdr%v-AbN 3O~ N{~-RF"q3>+ ϟ~.z4WEz_t/9l;{g3ЗGyPz ]aDw-L9ΊaU43d@] }c3 H٠5P:?c4U8G.8hp֭-OE4ru,(S5 aa?GM\S#$ Y\'3b&y Oha(rtI>u iy(,$Ow?TE.'}t߱['?vTU+׻z*S:'Z.6+ߨ4cӘFuo~@H/8ڧǢTvK \InwǃR}%-AWp`Ip@k>[Dn@}~r`m_rh{{Ꮎ,@|+LP0+Ь.h,)~EŌaL\q ? :#Q&~cB mk - aH Y:soŧ7|wxU +:?Jј>'*g?'!8ofJ,R'Tc鄔Tcy6TL3]ⱖPVఛB>l3$\*^q\C?1BՋ/Rg?(a,$|&Q>c%зK9裪 !yϳT|lIb zRV@yڒ=gX@%Vϳ7_`qPa H4%Lδ/̌FBF#Bتo2]1M/20hNc_B% J#ݒ Gdƶtd!AǫJ$- +L6ӊX`dzȂP^5XʉClbWz- _K[6lCzٱ"p ( &$q3 -Aj仹9D}d^ϗQA3v>c!|| Ϯ}s_&)=gXEo  n[I!ցwh4; 䝥MB2{+N%m_% dU p#m۳좔H3[`:&{~qۚlC *ƪVƹP/,sC)X v#8>yƟWD֍Eǭ~OЀ #U$Zꟍ, nƖxHf |ۊB᪍ͽ&[^K7ԫ򤅓1Gߡ]v|3?}\ )dz+4L- OM%Mri%%n)1oȑػ)! \4b.$Km\p'B,`8qKHdȍ,?SÝm!n  7xt:~o{Xo{M|F!d\7\L8hTzfN,ZiO\[;|/ ?d1sS;. PrRfO[Ô1ԘagP%x!_4|A)缲q9o/Au/xW錜`ך^LbjQśtd; $ W4Wgʰ5!nb!ncDҰ|&r'P8#, !uC!Y;Ԑ<sfBru#O:޺q:(% X@)?kvS7TOF*:)O"T4SK(\;>iƠu\fO^` Џ£/z Wޗ>}КDCAP  (dd`i{*dz96?%~~!ˢ06iǭ&?]&L@'#r~w'%\w޴[ѱSHD&971>1 ƙ4 / ='30\:[n΄܉,-o]\N ި'j{ Crw](uc|hWeY65N".,~邅8;j$p8>>mb,pW>T`y!2M1}T3[g^sMEMܤ;x7% P_i+5C[&z'/3VJ&}rٷԓKlvO+% [afH!Vޏrvs]FR)Q@_t7wfNГ٘uiww ^)Z[L!/ :/_ kGo!!C\$W-WB`_(H=Zݑ|~8$ ruZg.}\@ 'pvmf9;@Ii@;܏9k5

GH*ʐ3vXCp|vËZF+'ƵZ$Alۿd05m;ZR_j/>9͉m0ېS6/F p..zO= uM^2s?D_E1\-M06XM¥r$nUizz^:LA *j6 !qBE = 0H9_jHAŌ+}+|*\(:YvPaG 91< *pv./\RpH UllO)fG札;c >ߦ޹f}k9riIXY>.iH#=+oM3yCodhL^U^Pr)f#1stax͗ڲ,mm?qG A\ C.@+yB/掳30|%Mr |@b 0gS)3ُ@l0{zDV^A!¹R3*gq:p xR bV x]A7_Hjhj(Զ0Õ3)HP f{aocYvCAD୚y.A'UOsZ#;75|>A?̌*ئC <"#jl ?: )KW*o1{8 3w C [=>֙z1)}/Cr"0qI)|+u%vo>GFT0U`ڱXbreOUr|cse)IDt@ؿfyvY*{(A0@*| hPbp__𚰎KI֧[i75j k'&_P} XBb܈ k۸ 2)a&{G/bvK s<C޻RJ N1)uC_"ƨ}şK?RwQq~mgpR.ZyLj}{ ]w|+CYa~-7 I]W-OxoJK>Y?1A>2æV W a&b\(9baDM:Tb22{{ç[/S7~i~ %,41bhy>+⸸TO<j$,UR/Ɉaih0EN-6 k a,& %tL4% (@0m8VCdo `J&) F" Es~&ZXv?U RB\fUlM{C OĞ OΉ!? Ic10|AW0j I!@At݈9xN$@4TlB.߬ڣϗ$a ? S}\B~׋ zEbZn#޺&౓+&l Ygq=;)q#yZbu1os_-1@/Z+\j _N?ͭyye U4"FNr:<# i}79oihrųel6S?@]]ܪ֊@l3j?UA̷e%"5XNI^*&cz6IMcΐ] bhlz; oPuhq7a8J|p7J'䏙ư/3/y|<$֙|Me*XaOE. 0 /\6X_Rѥ (~3& l ,I Ǚzi^/oz|:~6Ht"~dko]ПlfFWNԆW3L*i]Ha\pGmTZ'xE^ConOxH>ˤ>]ތ"e5G`O7{2ۻ;nݷ6o}zSUoo}y;j׻Pz>ր{nskyS)^_]gv{}yܠ>{F{mˤ{owsnxLu{XϏv֫mǰsv۹7qmڲ}Z@Rw} =h=4kݞ7:uð[H-m^ƞ֛-ݍܶm]۠)ѽzpyQ٪% aҞSZkvn]}oulVQY oݤ4wl[2qîvnn7;v{4fѤ8ћiMqnt7&;MUnaSn;޵vu:]ZVnw]u휥uO@4w7{ݯntvV{n컖mwcnck]7}y׺gy}{Oy7v` =ujn]'2Қ^{*P}:a]CS|>0Ldр5=b`&&!bh4i0(UO@L`&ib`&&&&M4ɦ4Bx0M&`2`i#&&SɈ`)F4hh4ѐT2dL@ѡjf21=Ldě$4h&ɦb0M1 OSLM*FF LLhd6 B EgāVB'[&;wGΡ yi FAPǀiYEګ83Z0 Ϧiw/ 'w,v~m-&b[QܺkR䠇7-({ti02>po1s;[8q|hViTHKCYy|?f I!{>8-C[Hߔ躒zΒiX~`̎Kv4++ǣzD—ڹ'&T)=֦>|NXu-.ea<뗭.pRѤ"*Dű,]bkJ5e+T*Kue|iR/"9[.HRW5܇F'K:$jlD;˝I+^9[ewİk92J]}3ZS귯,MayK*jI0XaiDCkZq J$%Ep/p#Vg}sxK/a{irUVٿ{ Ǧh[z>-wKd=DDΒHcu23)n#-"b u|*ga%g uN` QUHĸ9] ?`[NG%x,MlلcA,ljW5W>%^ȶ%tw*+׽YO3Q]Dsyh7UvKԉz O3bNBO\Ao>V<&Ρ@܉ Nr`b>%Le}#}Tϗwf75\P\j*JwTqH$딾;~?i" DT л=+T1oבaO./h`Pp6jpJSC5? )!) %&,*/^aM)(()/%< ow7IfTHT>)DOcO`wM-8lAl\Ae !Z[72 vgZ\Ai!;2-{?knI|Qw(Ҋ8JreRܵB+q/(zj: >@S>(Z͇sNV?1 &e3 r: ( =֩9lw6ѱ]UΤ)jx'Nh҉RihDt-sr"Ƽ|V+yͻkLr}>ex,r܋xt[(#P X3e#tԲ'r!(zdK{p@PN{T yT<*wNQ 4CT!Z2#JSD"dx|~'RD]e^?e4@FYU;N6I1, ,7ULcFR9e6jdakޏR}bݕ8:FHJ6;VI[FZ8mkFwj;8JR ``Rۻ0FU&-n,E*x΄ktܤv6 )źƈ HHny^g^ l䎭ٽ8"o$tSsD6+Ǽ2 3F6%q)SN8gJѰ"r?.S*+@Tf[J´4ggVIr&CH#(-J(ޥVɔ?[=+C1~aq4 cd..z>@3C~E5Wy"W܋/vnԂXA#^j"`&OhJ`⇣ZoV1֎,z JҀn܈RI|٢*O,cYcz{Q{ޯv5Fqtpl+'{ ?LO9>E "zL2ϝbM/82nܢ٬8TsEC -UOɾhGFFnbĀJ @ tU  |0 &,%ˀbbjcDXA<dK{2 䙯vc+)a>Q%~Ae{>"V˧ {sDv*CpBjًI@ UH*Y)$)"tJkhI`1B7 My: 5讃l܌Pt UXkkV8t_f' DAZAC ӄB=AD>"":@G:- ff31s`ۅ{~\y+-Tnzw$<UA/ARt-eVA [ T<ɺf N%\,ޝ;[%S͘M&؍^\…}UCd'Cu~i!/_ t\uೌM]XLBtmVYK\2CyetxfIze ԏ5}DTv:P ~VPy>wAɩvlE.卡'j\ *jy=erzcB'$=>d<_S,(nx[wr\)CR&1e[J*8QpퟔC&px;%cERT*濂:n` G}1A9Va bVV&}u3^xuzk^ ՜B-.z<:!OB3y}QDkd8Ȉ_F^ݵirB|ʻVI`, (b!CeXh+OJn1$B~F#ZnޅT+ıOCGC.@ӹx D$UmykqkT;,< ތ'rWqSSKӛc-SљTb dK'Q1ޏ{O'sX"C%E3I]F,-=R%X'*U(ʹ fm˳wnxd/ IGD-$OD\S@G{Wa9v-+g(㦘Ø*ľ,A&tjukƣ{MIT7\2Xi'bg E/H#ù#7QNWrɴ!h< 既zg ıx4)^HY㪝O蘩&y-+XT1H/Sms<\W"6'=TM!PE 蕈J?p_fYȪgmd|\5 "wnxf!˯5)z:?6Sb^"7MSU^'&ȞBW*E.nzDS2voOws T>l:b ;I;'+* |җ؉7[|(=J-!P,vRoU <$q.y|+nvS}|6dQ?YZ%q cx{#b= |u&E)'*܈2qQjx Y- YxovrG|QSr&AE2t+$$KtNW(cthبE.|iؓ+LbꡎAgkھAk猝8'߃Ð>@PLg=e^3A蒃l69]к/tURծ|>lS\]Ao,+~v_Mr$ivǸt_oMoisV$ NTx7]W;QcU_3z$40L ~6".Ruњ?0PaӜqʰPN&tz-*tMWvW4g4VOP+_!=4Vx\Ufˬl(_> 08"DP2R#싱=RqL] yy;8quSG*3WuWQI$r_5u^ٞݯv Qs%rdYVBgn[<6ٓSHz\ ug_jn[ \FsX tSCR9ՊOzr&lJ^̶/ ֠%C+6C3 )2Rͤmj=]z ƹ6xVͭa[ئA_2!n0ɀ ` $4$M$PHU;dD` d" DF@#df@@"P@0@  F di^& +^{$əԡ(Tl03 ^Dd@%L""""dDD3""PPvD$ٌ2/ @ "e 'T5 w/"@&#  r$`0`#0d0` "0f Fk l 0LȈ@d@0blBq̐`#iߐJ٫W0.lF(eHB*#T o&XM 6`L" DMFs@dD %qASܒ"3"^`*d ^d. O%DȈc p, &A`B΢gL {̃"3)pb[(M%IQ LFW" ZLp=YԠ^; ʑT ( <77uTT؍竻-G1@Gڐ^"Ќq57ۼ텾6.|Ue~ 9a,}"9ٵ }O ]#Po5]Ro LkfYW~eovV u Rc|b-r4%+;؏;` >/03uAN,4wX0j(o F60 A"3+#928.5 "U3c;En?]ƕ !;^/IĪ?O|"w.྆BR`*"!`d2}0DW#"&y2 V ' L@ E3JpxןȈx̀ `8s pPMp ڎ3394l:|&PoQ:͗NGc}r hY X*-Fz=ʋTMՉ_Olߙȉ Bo+8hݏiM}jE0v. Ɂ}?'U<$CC ff Mz,32 "h7LK<:⡞P{\ՌLιS'u&E[-F_K.Q޿\Q;.-xbe0 u/4+]=]w{/ou-Ɲ.FT(׮âǰus8{Ěd_r A8(S S5r&_#S&O3WW_xN[~{}ϳʠl`h&~`SGj@^O0rB(۰]W}{8]؅U{sfNjXX": ) W!q/rofxe2M)g!'#Ҏ#ֶ:`߽K;gW,`SC:AG?o1{Vp[VZI L)eB=oA/{)Kd\)߉A63A&pXcْAC @ /x•Bx;C6esL7֊.}U6#p<_ iӭPWrDhvkjXaQ!js-+ Nd0}йŋ/rIDūnqFV"Tj +/~>$"N㺹AOé}^޷n/;%jdb6ך_ܻ6VK#tNvh^<`W$br.SpIdmD$-&z vɦ\F{pf,(o;9s?EGvC ¸&%?o?zA$j@eLboQO#BA)`v`Ҭy( pLYɢD^aZ`8`d11^"}o^~t[94پ!rc"GɵhaM,Rr($Jf; z5;Xx%V'oOw6.kGoJuCgYn~q)1F%Ii;8؟ -a)QlzD9q%ȉa 0< 콴Ck~ 0 1ȮkA?d#C]I+#jJPEc7oBpn6$OX*NʄȒ*~8Ek\U~^y$VW.đ PBQvgFqGPĵqX [w7fI S!i` `-^Ax)d#p2]6CU{#+ V^lvH-Op31-stRW;R_F=^U犒+ww?j CȽ[7٭Tac`43d`dWjdgsGսL`)KD~c=~όMxj徇t9qk}؇6iGqW18+-)`q C89?ޑKه,Y؎c'Lw(S{*ε.-4S{Mb҂Bv֤R܈U[DP\W<"A-7ED)Gy՞#`FE8 b[:btYIpeGd.t13(7ty^- PtƝiwDOjsub#~d]wy [s" @ [" Q$Ȋx!$~3(cg"L̉eBzC ?vTLԧUOy&I*j0\ɹޡ`+z"GRӤ[4ig<2{as+douҒ ?MԚ^Bp멈6n '&g۹nme'uG1_mⵣ,cy:lMi;X !ژ/O@?fDAhA/F)#!0sJ ` dDÙ/ V3  !03z |Rl0h)T@VcUT{V C^Za8]Wx_?xGIbj 8guܿo>",0y~󉖵ԎsO)Zﶶ"zGPbU߿p?m^?ŭInwhL I@` -y3[!۷ HBe$jWh9;t #{܊FNn|C^dg3;U/5e@-Pv,\Sp@MjO,sux]p1Z#s*NU^շ/B9gThTZHF;၂}LE\?Fe}.o>tE#qyq 2WøLzL pI܊ ,֙=[>HAЀ%Xr餼| h[g"%݈,h뷃4` C$!ی ;FC,z0CIْ.N=HcCb o| {V}M0w.N!u(12!B15j ÷Yn5m6c+Ԋ<$pS?L󁃕,|W g⋀h06BRÜ#f8\bbU<te!LRߏ-Jǽa;rqzx=+ڼ@Te~xU7;ekNYwSkQ%B0iAVly` fYy5Dc*F/ռY~Fp;$ҏMː=Ovvr Jamvm~}`*V +(f <<4_MZhk #AETӼEǂSUWMJ>c  @}!jh OBsI9k+{ 2 P+DaѾܑ5EP:h7 }+jemG1;Eq^t&bqlt 19CŁd#k<25

b id1h+ d c^R+}>E)7au:lvZF"AF]˗XOed/N _UxO;O?f.q}F)`LFD bd2Dhj 7 kj Ct`" 4ȦC `3Dz0Bd62&@ 9b0D2FD[c O/H0c;GjJ09=@zx6Z~+ wȸ=@|3 p>GM*{£$W[Yͽa<cꛕ'+N,A4bݔйX.9z_ZS&C Arom`Er^ve+SE8')@1Og(ANCuM-yj]gRնZ1D~%@g?ziCKBj-ЋfB+ր{I]Y\`h eҍݔ2`dhm*6)ϝ_31uuڣBp'|lΈp1f̪2\RrG=uM{);.:;2 (t=Dzﭝo皯$0J a ڜ#<PY}^:a"w+R-G1v>ˋ|7^ } [.)Z uAɺ_øwD T #LW@Z#p>YXq>]šB?TӜ*V˪F #-Mw|9u|B REը1gsDۅ}6MGH&57Vv}eN X6Î,ۇW 5iF! \8.9w `iGVzک:t>'&g}ш= ZrMu2/ Z ~!l]#԰GD[8AIU86ߺ3* 1{fo>)Z-᱌6ݶ<ۭH'Z.]Mo"y-VF:)Wu*MZʎw(eT 8fɻVko 0zbȳg/xvk;I"n5R'+L^.ߞCy#: 3xx՘^ 9&'iH{ӓ܄`ńB7<DǮ3ol ױ݉SY?bDs>n^%=m uy{YɠJv^Hys&SH[[eTl$?i2-oYC"ajEJ-ui>vU0yB=Fr𵧶ڌ7N9',Ap? K}q\s*8:w@Zo}) L)9y02F@LݯccSGx$6+S:aM*wpqt NyCQזpDŧh&!Fϐ6 JrG Ɛ*{F3"H"@}V#Cl腤V+#2a7+ 82[|Gկ\S1sa{[ڧvIXs{r8DtH였1Dn5 z>8,DX`HE͘4^)p+(*/m}\P~p EsҳB='jkNֽurN肉=){̭Ed0)~rH*CB{26O7S: k]^諮f#;q$^7[ȹUvu >TD asV?%06c͕ hm z- tz ݾtfroC1I۹v. o+?gohb2〗 ؽ Il|N$Yy@eTp(+ ,I=ˇuA ʍ Ctstm K!?]wvB[#0sY>0J#p*%l!c:Xdmds$2D9l.Py+ ZvH2K\aQdHz(mo``L 2~N_S~0[l.4D6RNr :Yځ $  k{YC7+R"Y,Mjv&tϹ@33~1@M +T D &RR8SAk.HAQ&mtY!V_=ioO!jlfb$<^VΣFuv`˾GCuܷM+MlR dF8&ȠLc 3!2e2+Y102 D +(C$7@!{ y2g;m^c'dY#"(e2-T&0D-KZB:lS'G!Pw1+I۳W/fiZ/pxT:=(#"v'1׷aI!b}FnFûƟanD#W2&M$?=>%]`yYGC_x@"Sֹ:\ph^x EpY,,]'w 1Ms ?ىyhNmnhuipF= >V|91֯6 W{,9^ofD/[\P.ުϥ6'I/DNSuEI 1Mm&W/-].F6ߝ IMo1*}r\dJ:)6$ޘ/#+Lq@{aeGTS[l[a'OШwK fIatܭKD+ѡ.&\Bs8[r$Ӗ/0z|6Z wl#yI'c[ƍqv7su 9T u%K*nkGNmEPCh 4 `Cqo$>D>̴dqJoIMCh[ujj˥'  #dE(WO{|k'Ҿ^3Τ8k D(8?C"sq&?c֚ bAUI ŀhKӎCfMx,m]>rhP6jn6>igC!,CZ-m(=ӼYݵ>:glSM5jġ ^i~tmoW{,S[H^%[ЇC>| OV#sߔHj'ӔG!/A{HO>_"H#*'aJʹp& Q=0q)"ERпt*BMhbP==d ):F~- lb­M٧߭)5V4اJL5x@=]W]Lz6Qb$JHxE˺{=@wQ34ƀ6~:_]ExF ^Iٳj B$S#CǏӨ?LNthrqMbV.d?gڿZ8/SJ(ѐE; D1k &zZΰ5 !1X0˃͛|h& u`yڔ u6s7C@ϋWrҋE M= P:b@s}ߨ{I kw&@2;XI'qޟۨ{q) !Q5l"t!Ŕ u&"~ ~Ȯ8r^D`7 %6 vSUz^I#;Z.޲69'%I//(ew0?VÊ0d̛r[ CA뗘£ J**!@:e4`9썄\&6{`zY3I8R\*  I) 0h0 3[@34jPǒKfzXչPLC(IcBb z.BSjs4Xȭ򍪂m%QN@C,u~G6\-j-~qM:.)uLjwvZ o`T̝ϩ@!Q=o<_~Jܗ~D&ެ5Nu/,3z>_6c!_07KBlft5PDAV:9kzt0SöLjT@mf>O~baM Lj̭i5W'(x=c~~;0f]>t$ׯk͛.Y*B7=';tx.j⻲4j\-hM̉F57nt{O`GPd9vqF K(I!OQ)#dۢVl60LʯP_:(d-:۶IC.p+r{$1d)BjsbKt{¼</vo'ZܛM3Bv7e-9{_FӸ88d?:y TEQyazB~*1A-!hZf2v}%?v7t ӻʧ[j{WRE"ub"/;$ϙ8(8d׾IKƾ!s7S3U̳2Dp}eYYshw(*\(tg]ee蔘=snǥ:gxbb(:,6]y^ bQl ]$_fVNXPL<{ CH(E`1&{aT;kVT ã[UieyރDO_6GhXK?IJA`g.@Lwа1֋s;9^|{*YAUZ(ϵpկiva Lw'sq.g%~sw}S]˘wbkZS Ӝ0uOyqLN }8: |  5 xgH> GN/?O9vYNa Z/In+) Kz(Z)έ&kk;8ͩYh Jl` /6*œ~ Wi>hԬ\ R=^3VgmS]CV5*7D!Er=it!O\嬘jG@ i@P`2FRh֭T6oj~K,,6I9\pw.~hnYNԬ1IB'#Ǽ^ǽ@Υ۝읁ilMKY jsA l;'9 I΄T.q2:cرesk\>a|2vQsAftIZ2h=1A?}|FJ` 9ZOM@^ g4v ΂Q2O{Ha5}$ؘҿ0nR'v_OC"$-u ʡ 8?"0!E>9 77nU{>k:c5n0`UT>5b-ݴ~_/Ej :Ͻrxb"\ ܭ4w4Fr)2huC\I njTN+jTW]9Z T!fƆƁ-R[Q+U9r UK֌i i}̀rOUB]P/kY:JͥPg&$|JD"9U:[860d@qDf8X)RF ~Yõ)21%N3a#X %& Ѡ)+*K^Ov%,1]12" [!.˜ p̣Y1ΠL&;F@| ȴ`yEh;ÏK٪4f97+i6^Q k5W9Hjv ]ѩﳉ<|'{wڲGXktbfvpA&sw= .C1mu)M/Alݩ.˅iHr&ϴȠ"qLD`6~,HY-4rA]ux/$&wJ,J*@N'K7V&h ]g%Nu<Z.&X ZOU^ϟ!&:ڊ5 ۹x[E|'"A,"tC$'etWggɗ$7b=fjoFΥDXem'H$ou +B1ASN!y1V z>VAeb:.DYPћa?~uvOJOOP略~HO4`VDE|G O++ n\:jO)09F7&P9u:H6̎mw͟=!V:f> f`s&b MYAn("vvH~뛓>jo]\ w@ܭp[.,w)izjuJy~EMo !@{3x#Db ('NaCfG*ߤ}?{N8Eo㔮dV)c!09Yhq] !bHX0~·U`ŞU`E*2Jb veˑOë:0<ʜA!ު]YDŠ=H f# .PQʣ.~,\W*ǡJnB$-Gը1%||T͖՟`aI-dUdᎾUmO(*Dv($K_G?-k5kقc.G\R6/ rg,4$[j* vscVg/k>+ຢC~L!N}uJt.ΪnڞdYڛe?Qb?8./iBs-mg"/ZсR,16&C5Nx{3[>itJf6j:7-ufŖ[hMʿ˿ \㠐|$JW3Vt i+czV!Go%ao@ 9OHDϸrRߜ*z,ONޔg!JAg~Ss3ܕl~S5ok3QjHI*bYdX7\SnH_הyS;mԷm|i~1?\lQYO˓yWΤfqx wol3f575T$ ;{O]z.1no"O&}(޾-ZsN&*XV| k8 O}&<2FSK^{=HW cNd&8qH0U g0:0|ágP.Vv؋T Uv)SrCܠu3sܪBɓ97"4m'rBmつ詾QC3H)s}}vfj+U뗺U]vP{SGFcgf95qN͝.afXYSU/9w8=mH%<20~/&غsJL^zӘ4_mE{<88jGz5PHkǍ$~P7&R݈ W8/!/4VYuґrP)N)="dH P}€8fQ,#5̡!/iBn@)"{R=߷cq}8d(vC@TA|$6_v7_4վ$Vg'޾z|<LB0N,|̩m>(k>WxZtq}%XZYިT4b:.\ 85Iq>(_Ճ}Ksa+joy|U;B-=ϙR|lS{FO|S!RHZ`=Ѭ6(|bѷe7RVlc{Rg`t86!:Z yߕf(Q}s) r-W[)9m#Ċ64 ßmv=j.F08DPwO 6r"My@k2(۔8g "nP ?R&c,t9߮E[0CIL*GSTS ith|Zxkrsrn\7|A#k>!4Պ [8a`'ʞSԹ } *C}u5X 0c)F##ԝ6]$&}#ihxMo Rnyf0HP2'Cd:㠴-Qk/ y;@6Ѹ6y%Y82ZjJwڄ8Wgb' k$!di҆} w<VVFN.$G艩\4eբKvS Q*JB'ˑqdyKCM;$нnzM zWpv%-Uy DirO? y2Ϝȴ9Ote,Chb( ;#3]]KB>>׎mYXi1R&byiwW$3}`c4Э-ӌv֜EGNɑ%@R?XR $d`{t WbcA Ⱥ_d!`%tmS(/q,pOSwAud1&%MiN)~Cš0gHFݏ_6'N2#-[ۺ E[C?Usy"|jR{qJ飆tYD; dTZoq{ٺTIG 9jlZf(濕B K>\dwkM*z*ލMǮ6lZ$D-LpDŽCxB`F3Q~F_DsP ՇZ+v`%Jx_-K-0o1P JF ޻O'IDG<"MߠأkDyȣkxG 3rWAoi`ȳgeyWgn%eenYG0%1-(sr@mү|(ЭA^OA>7fk_yؚ@q"Пl\4-.O(pX#`cu)]F0W]R`!=h| sΩ$xWm-{S%-4[?vu&5E r&V09,jswS)ϗ.$fumWc1MTXI}*P?-=?#,EWKR` lt,^YGzCXF~WqO6yLhE2t" Kn-"41H%Y!H%:Jbk2KLkÒsnu3chrs3^.JHE6u$䌟P}gWm{*0iʼn?]iVwW ĝqbӹdLU =J1gw`9rr碞9%hrj͒yhcOMLWQ_pK%^GI@6fG 5P}l;.r'6\xeQU ΖAvN+}%XOen9=x Eoq qw3JO7GLj9n>Xl.~Ezq.OѽyALM},.'}l_~.{,PDXz >H.t6ړ{;MIHYq,$|wzn^?7quE`g0x/<_-F9dy^o]mS.sJW M(,OU 0-asU+p4@1)3Hm&dO%PH m)ar[-j,j!6ò*[Zn/ 7׸^Ҙ.XvMuę"m bgMIį'ڪf,H'F%URmS|Zc|dHJ9K<ſL2%㽴a_T0 ݙa2у-<]s$aQ'+^;- @ϭm07(n/VZ#Q gpWJxM:He7,D!6[ABN-Q?@iYr(pWk .2y'߳%w&.a6"eϣRJ V,Vj 7ʉ}!|d nKʯ~큄b l4!mW Š&*Ex pLZkRFh>p^?GOjQ[QU/mTڊ۔̾齔l`BPS~P;6="q2z%qP}I$ %-H" A -P+{:L@wnG#J1<:6X„hEff`j[xhSD߄ Y1 \\:|h_ֵݤ Ƭ r'%@c2:r]%@2q6ImBCV4qN]ѠԸK2T*!C{aWI >ҮK-Dᘊxk<qKZB!vRμ[q*%:Tݥ򲹸V36)"k*{!5Ò30z[- ˋXSwm#9Yh/we1D@zrG1Ј/?0dC[ԁO<=:FChiֈJ6hHXa왚 p"j2ZvhF|Mi) `i[j,;[ʬWUnW.)2N_2H& O0 v@>:-T~eݥsҏ/J5,y" FRːy %D92(fYL$c#b `4NAGN1C`ekd3avFl#/ UA'vZHV$IGS }Q`wس$y) /kj_]FDD!`4j!mA Q+u Zm:etsL{ҽ4b~ceFw}"ڂ+%%ü C"j,.N4:@9Pnƻ[pEeDb;VY=m@.1 5Ohꑣ'07(?RDMGZ M,G0L@#h[m&"1)AZoYFT6@\,i 1 TC qu`0foFwҤt@8q(*?'f9;~El#3+s#J+%*kNځZYI4898+ݖ-hN/9aC/I&0d bY Pk[Qҵ2&5e!L-ĭ׉!`ģ`Obf;I3Sv}-G ^ڣّ^n93ڑC*'mH'jQ,k! sD1;WH׼S8]m}*'9A] 4uJw7lLKSNCV'vHS"h H إ8/AAAwϊ*=:>!| #j# }@PK `5ϓtSjc/]f~@IoA~* m;] 3' :G1j@6!r_tPH$ȃSz@A7ޕCEs樐=&Hᰥ x Ax5 `_'pyQ3N4V+b DW1?`Z2z6΅MVnm}r#lJάYzl)Ksb:CO#4]ilsMF5kƞID}w?PȥSXx`h$lk9hd[_>3e`J&&T/Z \Ӏ.-ZY1&}ظe6,VlV*y>(+1y~ c?Ms_"7ě̋$`]Q\Pj~^8\ m8-CJ Zl8`o@rbPV[#89ߢ4HHQ-fbKC. ~ԉqj#wt ] n]`bH fl,;^#*gJ!\+>J[aʠ^GnܣBUIhbX3I wĞtܫ&pzG:-k4Aj7FYM 4/bN1@5cWYf|cOz LЛꛏ8ts"iQ}tC1t8oß+&q(4 i ăWd~əCTU&`+ǔEv'Уx(+  @fSkMmy&Z l^$,s04ތ&vB@dy_/c̜ Ǣ;S+VNڣunezE\5ZلuA$?blRP--"5 !QXX'OГX~cw(,iU[yS(j/I *R8*3R\Hpo ۅ]MѰ$]cI"EԝxG0GIn[/㾫{YE/OvT, g.镝֘O7q…P+UTv4:=; ./=qO,IkPsJ캺+lfȕĈ#^Gh͇uh&@ 01YmqvtYxEM L#vuvYu>0 4|hȲlINS/:#myds-Xnv-pF&W:ntTz>TVF ٝs#](pv]NJux V m;+wA݋=Q0WW$9S\y1‹MZEx#؄>jPClE(0 x-kͳS K?ʔI= 1  [>ic^*e/$]ȉ~ՍmEz&R(Z+4K!Js  EDMn{[3`99$ /!~\(@GsSCgs&K2*8\Ѫp5$=F`@oLF\֕'Yq˙s,SweupO! E'dk+/tPu|KXxA&Ov~0ԣ^ 76͜a>.8h%GJ C C@`%9Te]w#.jja=Oz۴ l,ΓB5,OAR *1.yA~ K Yd i)iͩ4GK1A#92V_{eP]6JCUЙ4<7y6A62q5f,e?F?;qfVN\XhϽ_A{f wUn9XGwI%&&ˑ/a5kysK`; Av. 5Q@ I9ff?CP^e%P>Q[öI|% _n4?0'CD!jSFx{!m' 2`(`w"Φ Gnۿi 0q 6SLμ* جǐ xW{2iCP69%]|$L˒F| .RH‹oFI V fs K)EKE4ڈ~RCC2jz, T^~^LC.0Lz I]T4 Hp&$-2B%_{$4Mx7 i; 6kcvi;6e<]?[V.^}o<ҐDx9tg?'E ctcF,d @(o V%Y ,H+UiPI]K~UPf,q]hbd2@8G ^2E"c\b0*lWӐ02w%RO@Q Lmb, 2]栮E TDQJ ֤&e#|ǯMF~;EmRGt.ocԯzac#2_/̗{-,V{/k؏>?yX /CO'ĝGyFrS1րaEEKl Eꄕ t'0noUcǤ:aю@LF D@ m_H##2&JCD6!ˡIl[KEH/~skEq*٦:~CBI;tYDPOAlZ˻])xG2 Lm}Rإ3Jl l9 \i'=Xaec-Wn}= 2TRΪ̅x:{mpEV.-Z[ʕzfͯ 3c*B$ HJ$&KB@[ &WD77|0|{iS&l/6]eN*؜o+'({tCXCًzc2FrF^ț7Nzs.ljs8E^8,o]hn"#ʾCJn/U?FT!pp\9܇~rFj@DKCtT #ɏLYt jI$_1 h_Y>SVS(u*a. HNu1/);/u6ޭblat9᛼O@pl*髰Hq sIȴ{PDI7!iyUV6 Ff+VQܡ"|P[@sܽqb왌%6=$%3m=̬ȧqFf%tZn2ģ0xrY{7u'x)W+|r񄜭@i$DZngWh;w2=|7dp{Np,DK Bғw$F>q='#&Iq;&md_|)Y5"AA@I::H[rTTk3)*6 hrՔЗ YXB腰w;s?֯^C0uS'OTw"|b SZ _($EdIUtٝR*0bӴioVrDeAxI)נK񅆇Qj YdwttW9}*/#@FSK5CVbNC/j=˸h]`Os0fے8 ᘠW]ΰv"(v+ ȹ܍ {^ӗ$iL}1 <`R";9I}wrc;xT'~DL>>8f( _o z#o'h2mx`fr(BSZO_݋$X*&Lek>)!1bgD<Ń1' 8xb^ T`/^8Kkz/PtLPQ1HIj |\A5!R:Q;|12ÜWF|AQ$YPRၩB0@7-RݍKF`n̝B}㸸nFDe HQ\b쒕 }r"9\<ƖUbñ}XՈE>ƈnz"2u;9Щ^%c+!UB%orCOAߏ.@hNGm wڊHX}I2$oX`&O)^PێBA)woRpuOtTŬH$'dYLQ!& =9r%踦!Dq8mOU-\^: ;B6п!4\tW1l;wŪ 0l؅13Yj &bZ0r$"1Wh;횡^I33mI㍡P-\1O@2zb{ šːAoUD?7![񳹨v9. *ᠡ/Mʖ L`u.%|z }n]0'sǻN.C}e/ضB@7i %,rY@r%[(Tkϩ ~6 IpDދZ\`G%d]N O铿 JѶ>;+Uafp}VD jSw1C8Rf=Ry4⫒gk{OfQyEs7qysƥT#pycIr bb,Rh$ B2K4Y TaG51;2qM-dLjG dwwz|C 5 ‡u]EkT"ԘJ0BPeN{\I7|e 9v/e4CP-G/c,~RSyjl)l[đE i t!mwH CE6X18,O d^#wlV怕1oǝݝj9~O[tΤ0%glUгֈ DAȉ* N`F;ڣ7mTcyϑǟGܠpjt}[O VZKxO+"]Qٞccкf,AX4ADA!BLaEpN6i+>rw1:kjz7%L ,PHZQx2X?Rgfl:edyX?`ղp#BM4#Xpi/zʷG_x!vXj<5x__Xg2p6kd%r/bݐ7Ojpy\ X@\ϒ@_TxU G! ) 6_ ,%gwly_n/wCpbZPf+Jѭ+B{KA@u< Oef& Q=~i0:ȲzUZjq/kyӫ-0(0a@et/D͔;ЉNS-"Jps,?]}(4 @r*B,|Kvv8aW_7jL B1n%̕pdP*Q*ʣI,տ oFǗƂ]פ@k$+sH!ޡyc^r _dNTb=W UGWHSRk1#!gBe]o.$4KU|J[}Cyި'/FNjx]i¿zs9̧U=SCmjȏFƱPه wEU,1cZ` RԢL6ȸb)3:03e/Xg#7iOUwٍclpWFsC{3Fima2b5FO R(e#4_DT/u&W?5|&oJryߚs yczpv\d\CK ;eƕ/UVW|]dͽJKh$&v u|>s+UȚl>"^!8v+ʽ¬+21I+m{=#Ef껖Mm-Օ/ozzS*eK㫮ILxM&³ &z2* =@>*9xнBHPom5SzPWQAkŤ@aI$we $Լ1*n'oDD.\\)#'fn$ȴӡm9o܇6k-+F6\Z#|n] |\qhwպӶ}3yF~|t4څF촼:Or$|!!́It]O> rë\0y<m [mh=WPj7t IfPX\gx+rԗ8I%Ұ7Y|܊~-[*]v&_5Ŧ:#_(hkUz b `7tW( myHɐ39]>O "͊gE b۽xS{VU׭imm#]<V^޷fcy w5Z8y/58Jjg*_j;MIo%%qi=P-l6ëܨ" [{Y:J$ڔ:)ҽo󪎱,GtPʢqH##_X "ICd\) ɕ{8JPQ"7>0hT#㉭?׈ĪqT7Cǀ~Y]4U٭&`6lWf~|HPŕ|J lF4*ߦrZSɲ{mff/tgY,x٭^[#ԱջD8nZYP%{t@p>_9xO05aQ|{i/Pn|eZ# ?|)]HKj۴!+DoD4ؼ#iD99iHmOQ|Z"LYcl#{ 8nB8Ah:"^ 񴪙Z %\W+7c rT hM#[Mh9"l%]Tw(rm1#|E \ iڕ0xхѳgv9wz(: -?q3~9 nn~âǕ4Y-319,$ eXR~ZqSw2ۇXbsխmEX6]z1C6,D&b[2BsOx.dr-3׬2ctHرTr-@1 ZJᣮo>q'mʿ%XTv]kYQ^E""Ag\D;lȑXiߖv  +&Sܼ_IYF̘R6FBzMA)}=r#m8EǠ,4G0.|$wJƯ 5X}iZ`˟SZ,WZOyDv sS:ϕ&oxWDx#ω=|MrM%x``M%7Ce-p6{*͔n-AfHkE%sLaɟ%ztn4-"\d &'|q}ݰHfk.>9(۵+l(Cpu.?'jf)xbSx~yx ,}R[Kk 宋WuC\1(&=|^B漕pEE^o27--,V3Uî={R Y#@eUfe0/J@ǸʓPԍ,A$>@rȭM8(2Cv B{fo bJR Nл5n{}uј߈x+Rc4!N9OœY]}_g.'彛tn%"z6̇ka{3CwLlƥYإ c\v (t,[DfAѭ(8ZǾrQF@zA\& }667YYd,''C ;\eyH`ʻoH}L>]\\l4XuvQT@V'r0D%& e/S# FlX;'M`b^h}0mh͢#}˹w-4ڃnʑк3y! g %˺޲=#q`hGظ'0> 3`yNbѻβԽbAq5:z[4*ǂRk#75k=NfyG|>Cy}p[~ toMͷ|Rm<~õC a"ΩCb%G1]_-]G--#[p]:Nc@vCEdHe2 =p0Lo,$;*:_6O.-I6MMC _eRhMANVNup}aUGo-sR}+SU w꠿ֺGr,aX*CHT%jվ]${9Q{)gwz{Ϛ?q?}hڄZo-H2n}p/IgW*:I^/?[>'J ϻ6u3x=Ctfs+W6(vJ#j'SӘdaDG?gZQHRNއ0Lgܛ ~F %w wA2F F/ ^?/^9qT8v\L^$IW3EPg$ efr'O˕':4)֕bs[8 .{4;"Y߲!!Y+ݖ8tyB\n8_-'i0`JZa\\^< PW%{5?{jykJMH9]gIw %Vl~F%Fٻ?PJ9+$BYm\S"s,xɺ)&z tcK?\TOby|]|O1BIL"%E*ck~Ei2=)j"M-yC XJ,OQ{dxϿّJO0js']wYQղݖi(Y]/JqF@%?Y{k vJI^4߾:;o?3s]mP=fEY<Ѥ_1ɫnM 3$=a.6^ b;_'4н=QyUVO{7}>{Cy$g{&Sϴ/p.?]U#UT^{_)ft.f Oćᖨ1`Sj-(ٳ^̄u"SL-o/:]0zvR gIpη6K,nR iY;#-{ijnʻ HXR`}S4@ 2}X.s$L-N;EĴG .oM+>J ٞ#d@^won(}nb'OPJJ+D}8 dWcCE}TtyAWiv}JRytm"o6؅ +>iUxk~\˔4Q#*+)_Tƅ.~A;tT𡛵Jv|*ʒҹ&eC3Bί[/1)sm<^1;jhe^ʎ'`zNK)Bd KoiRQpNsj NP_}*6SL_d6f%rB/xhB]e8&-L|Qo`/l`^cQE+#ſ>D*xox1ThYf/O{6.SK oV4\N+R䄿0mo;+*_쁶0g`qq5!ʯO2V9pDrTN|N6?c1Q㎟ U2 ?ڞGU"|FvD~Z=||9%KHςU#sf+^ :Eb4ٙϥp?{}8:O:‹*|'HN {k`5`(|ԧMGw:aWn,߳Ɖ2R> [y^Iz\,ct^Oj6Hfm2䧚V$Uys\+D)-[ П2:b(R's鳆5 Io*>VNf_<4s/qdm1B'=W%cyءYZж}z! (M_hґ7M=͒#ґ.ҤP}7VR/K W_eVZY*Nʎg٫.D{ҟG (5^0P02/S>+fgGޯپ>]6;|pn!qysb<[V EԌAaV= %zgDTێFjlWXHf(͈/dhiM'~a7t\Cǯ765V4\_RԷ~7E97JTpiMAvvǹ$Ym}6NyU9SqO`m1kbsm4L]yj,DAً/"IT2 ;>$@$rZT$LZe"sZMN4t&[&Bxx}οrܽz\Wk,cmAtaxgScL\ߘmCHLK<5_L o@YƦ9t*Qqab¢C؊]yM~gEp$h o_#`N}f=?b\!o#I(n^a2Ơ-G1\{j$Ь |ptx: ˕}L~, CӱQ(oxeSTRJhWtSYLPɿr B8h܋bْkM ͸ ]4dXR[C l˓B OvZX/Yøy!}"M&Ti7adZc)0F9"JHL8G1+wc Ic1QG2- ^",w9lDJLʌV+ޤJ$iʎ$:5XOCʙնGNע9,zFڥ:,0CAdoOH_(-oֻ'䤖1ꕥ.9]FNɠRq~ 3oYc'q=[мlvI®u꼻`sj99]k#:)U儶a]glp-&AʷEZλNa*OfhNMkڽU DO`VYbŀA<1[2Ko;:5ѷi-^C]̿l$h(m=5?'߹խ 3YFuVI%yE+)W{8Ε~-UID0.?%lb#Τed^kn? CĒMg? 4 9#_+( d})#Ǖ%r/[ _GeLKi>PR_``1˨1 Kpz^y箉[8"nߔckS CLR\(зQkc}))~{p! a"d#JR=U7q\,.{n-<$ +EJ`ۘF;s{|y;̝W5C,/Z+D̎0 SLi6faCYⲯ*-x;+H (!I[: m.6[89ˆVF@|IW]_J.I\xĈC kr\>0[췠Cy;7Icy/rC/2W{úPI-;:`V|RW}~45_{tAӅZ&{UqN;_n-qO<{Sshly>u-SM-+KULDuS5cm.LED B @#!1k@?~ "#-M 0Hq(Ǒf< \7V=;n{m{o̽m.8^[('~ϖ(˧,F;N)dVdKc[簳 wӖEަ~մ h[=9eN7dݑ,2;mթZ▊=:z$QV5,߻x&>ɓeuN 6]?\}a{Yk7jVp6E_ ;RYtں O0u*&x >[q], & *2I [h&OoCؙ*]Їr|a:U٤;yO 1Z&ubNG/CahX+W9^smF 1-4%8@&9_Ȉm)/qiD ²*a)RSlЬ{3PPӋOMWx+uox83 č .}I rx5w'J큙2;0݌_0cY|UU`I4~m\E6o,Y;"~_?\ NrN N@KVг-l[߲WIYSn_߅ptCqsf e#Z@k;[+iX9z0`n5O#rqq_ 1K?!qLQCpB{L.anu|+U~I*O!ŌN}XspdkE2UM/R'~qh&B<@"x?l<WW H?'3 4x%1+e6seQYyd9j,{wkZ>ܖ1r;"͙+]En,3dy,W's;MEp. TLm}MxiKW=oMʺ㉔}_sˣù\^o ccv\~:ڃsV. e1QjE$KݫAs}-[$+Sc |iu5O.H/#yb皎̓ ȃNMMNZ' l>4Nǣ aKpSE}cZ7w2 G׼YR- (y]۽0(DP iMZȭeiYqd$_:{nvӈ(w_ }:- EStUWxșY DΝFuNg`B|{`|^mvF%5.­''ݵ^jBTLO)T;kҔA֔w#HztWi= ni/i8^fd+ͩlOU־?0Y3wWx V)opn΁^{9a*t{,1`} Ja{ZpJ|ɜX;š˗#%cB^NZ:/xC6YZ7bԱxa8OM5VzXX߅ Mf0J_9mbd4 2]vX̭ ٪,%JNuw{3{J1SEHB\za ՁWBB"QEH"Aa5زm5tгqI0pny } {ZKU}VgbOw}jiwGd&*˸"̦ z@eԭc5RޢV,vU~S p̋ PʆNkX>N=Z'f'y }4a0Կ[ȸA+2y#(+wAyh H}WaplRKדjX/"+6bd:j][2J7%H]8WvsgXpX>Zi%u?iB,>=˪.w)u=ֹ(֠Cg48j)Us1n7Y/ ]Hd}Nޅz!Y|dJJJl:^sxY_]oUM,c!^"ވ$?`h<埚%2Zl]@'%U`=;3"PSUUR0b H 00F7^Y"3 6qNϾ?\9ay˰@%÷;%vKkiJ]Y˕z7 VZWa+R\[K şҰӀ#/--CO Җnfȑ>M%Yխ/1Kibį3z3sCB$f Y[z7Irqyo1^|_֞%Hmt*.eHhȬ}t;܈Ox bu;j84ހg"3UA]f<+SOD?ޫnq}<,NBmmYXv`7 [E6 JGGْ}LBDcTOAߏ*nwd+_>a[+7֯ywDMDT=uÀGv  i- D%F9ׁ\S}^fwǜ#f8bلDzW?VJ<9"te}jn6DPa/_]l-EBT|;p1wd_]+6:Qp5g2376~߾ DEҩ~b,S}_jw@"u&6Gc)cYJ[>@l˝=[tTdwI/zoW͸mo|˝H#[qYɿ׍D?0AC"iICzLȽ  'EsIPJM֐.͟@<#sΚmaeg +?|175 E;<,e?C7ZwɽwzorЖ{%RS㫚$ZfY ʇ!~aܗ/sW.IE/j;gTPt/ꍆ]!~DS1$DEY?!!mapEUo/j.tP3gSL6KJzqa[u<"y)-?6{,Ha37;]rUiik 0;6իV%\/ %fS!0#5_~y{h"io籜>XbX-DB:؆/خ$65ruG>W%ROުRW y?-,g&򩉑l( LJ3r#:Rt7,bҦ#^ϰ,aMmA`ași3nژQG{䙪g(?Fք*:f ѐK夠EѼd!0utk&]vo hBb'H N>yY| !#Qί{1RȒ*MFp~%}+SV # R(|7(. "gʻ f_=۝}7ǫSDgfr)Ŏu%r;Pq_1G4bpחa0)u~B\ f[l:s|Oqc v1pr)O#F1=1#|hҌ3ROw}QXN ^ Zҭ`uSs#Qʚ2]  >_ě GiT8 ;n4YᅧOԥ4mcɉΨ<%Uڄ sNJk葺]*t~+%Z+((ԋoQ~RrUNtes~q9c3 `I TtHl.!X#,ø<-~Ɋr*g+ِxq>i(PDe $k4Q鿲]Zuxr{h9& UEusx.=yyht6wlyLLz2ېM!~#|[2 8&xVfyctj+tOv-ߖG0} gzV ˞p`O`k*^aZukݚʎCR+q۩3e״D-`OF,,eU)M#F i;'b34C!Nw^eBaI'~UW49.b/蛔9M[Aئ9:ɺp UkXHB8jvV3Y!~OTĂlȁ)N|Q][= ̔_ vK9(8|Q%T8 tnVO.L>F*$%.)2C&:y%o[(sY!Aj5/ <5K!a0~٧K%⿳f'# V–bkK6wܟ"c`IDoCKeШĥOCHӤPOĤ7#lx'mس:Dv 5C7T.R칣efYc +7$I{Hx3K"RyQ1:Ǎz]fnR _%ϰ¨A;Cc'V&͎+-l Fvri}#UԘq');qYcXQ~ 7$SPd3r ?P\|m6_i~UG]\Iرe:h ݎ l91*|5.Fj$(WeC5Î$N0^ #C5$(;,7MMAUƎG}>_"\چΤueHt$(eP$X<5Oa :LeLeS_SGOm)GNvW$tƪWlX01%FTFul1Ӕ]U?;&~'$UІQ{wPw߱;dmfZ377Ǒ` hAbg~U3^5O@$u]$u>{ WT?aKbh~m:0 x~C > 9;\^DuZ.kb̭;xcї˴#IGoܚRmK:c<  4oLU ['&i1[ ݫ}:n0lBl0;#YDyԓt-48sy8.C[x?נׇUO5& A$nssߍ,GV͗,Fgd9BZ)mA,9ӅzfXp;@A7(t߬2ZDgou4^>N?̎$Pc/PL<~Y=?ܷ"$"aؓ Aʋfk@D TVH]%uxYϷYSJ: 6JNI/J g\倫|oy'g_-j2 WM4,N4=x0y ]w U=}ǒf&-*%e){\|JueşꙥoK#綴|8h03| cr,\$<h'gwӏ Zj ݅):>2NwO8HX=zBD$AWC٭ #h Adz˽8n/I R)B.IS(ZmP-3.zcˤbYSw}wPyzՒ =4e"u ` Qfic啼Z\Lu4wphATɩxtϨC *mz/Q=6Nqzf} :˷X|wȦu1$Y+>۴jOWjt.?jGBQZ ϰb}4 X7aަڜ2W2Po,N(LCPR=Ęq41=<\K~J= ɶ#:Myò^a@Cr+T L( ]_0+R38O3䗈Rd׸՟G}lĩ>3p/8(P;CX.=ݸy ';,]/[`Ė]߬O+C%6ш<ڡ@RÝ?sh9sxF$Хb P\Xqk2I''14+J1ϺMظ ֫L`n- : ;=;qmCo#^xˀ%*n^i{Lϯ]>EƑ~ \-) e*Fhg;( 0Y'%FYZz^󫶰B1ab={<8нrl{]ɂöf;;!a mtqK/X?xBUF{!NkjnȰ߶Sh5ݍFW-4kPC$%OG҆ͅOgpv"1~aE#s8-z=mX>'}QwcrK|Na::GCo<WV匏!k5[CSY`=PEɸrAgLZ&ƨkneڲ6SH꘩MuAHEӸw~;i?(‡>SOW}%Zf$s+B156CXG]A-2 V@->{,"^"/"%.> I:O8=r'^MkB nF=KΑѶmdtj[Y@*(mZ"tY6nT\TCڈ.7#1ů?"Qq}ڷjPggcNvo]+nB絾ř'T֑ڙ}mLP1}f7Y5BCf8yQcEmzbsX[)بi[oط7޼ 0TR4\7ȣzgE9V<9=1+:3Z~H=ZĆPdz֯txIپz˛ G4Ǥx*q8'>ELS{/ΖnMSb:i4¨hT^W6.:oڃqͩd_fD\7\ҋAtU+. w~;-ցmVqJ>'bl 8q49;3p1e&+r&\_Y*!h̋-*Nt̉*LW!>`pq ' .%3~C1 Y|t-V\I{v+qc*Ka!"ZOO D;33n.Y.#1-)> -Vl'=D`ٲ4w ܲ2umA=4i#L~n&%j 禡T`=*<ĘysT$:+|(lߣ6: }$ZAKfg+WVGPm[ֆ4(ldq~}^u- $IF^,AfTOkOEGT\LFtYOEe_(,@f$=d}l"P8ѱZ߈S斚 DI-u$mcvx .gúEHrעɋduo9OOyy-IZ>#UOў FYFh Y3;o,fx*X$8HURJ4mחy߰Qqz(GнjZ29/Ǡ͵ }9.Qe;}3jFq3Qj2XpQ'&&D*gi]=u+(k΍{+ ܃>M|U^/ķ#nʦ#px8N{g\<:AZ3G]Btw+Y\S7SX\[ ?ɶ2A99 ,ڥj:_3q,k|$<"fu~?˔ z0PWes mQAff}ީƻ%=뭫ԊgP#r얪?/iY}~/K y vSg%N'#8n@O #)xo4 soײ .FߢO5$0P <=wħnCUKw s(v?Dl~l_OVO.@!Jq0mj/Py;>h{jh/n %N*Λs]ˏ<%ϝ [|u(i)Ցhs֔Xig2{ PbmuKcM$dsSQ5)8EE}Oʇ/ObD}~_< aJc.4=EN; sdZ 0Da.5E *sIthWSC(*GJ9 ?B@:/t#حY(Mͫ7$HܹymS7/Qk >l ᳢%;dSsvR 3es$b`{W#Iyy" h=آ?!d_Nz*nc(` aVkSoUW"0l`Oi-ןr4}M];jKC.,Xas&^MĻ l5d\xƥRs|ot}pL)WP1p}Jv[{$\sbc99Z<ʙ;$FS7E$ STQ?i56]YŽYu4c{qN(FeNiWY ́@<㷊6",v댳) s~C,&TÇ[aGR`/aGZ4*0gȒX8|PGo߽%dtsCY6|rLjU1у<7[?6슏*/19:`JF0{_J){a9kr'لEJ.:f~3Am-wsˊc6vH!W^8} DG cZvgQ%o?S &^x+GxlCKЩ[x$fZr$YSq>F)s(ARK:uM㈾܈|Н&]}Yc$~b{qm`ꚍKOޟY @_~=\^g&Jh31 v. o _Ū\:aEr5}]3JR YM.? EyGmqwQoiQ*}ƃ+R`vyH.4S%l̒f.RS!e]o:0tqdGy5w;?ks&p֥},Φ}$ &3@xUS74\z@tdYS\y:-GP y\S>cg]r7zG lhښ-'1 M\jNG'cJV~3ܰ<jͫN,NcO&MŮ_̈+T yYEMu%4%tB^-G˩B?<~F6kz86A^1j$tM|n3j=">M!1sjS/rq^!|᲍¸Bk&GtK{:F/Aľ+} `G)مj^/nTЏy˯+ -\vKtEac}OG|74BMpG""@i?F$UGǖ/pΉ *.p1yc?%[YՕYqMEBޭJԀ$_9hRKǼnY, s_${ϵX\\k.V+?GY-J„K1Mж!eE1H [Ο+'sn#cghbc?e6*E5C1hE"QbP¥|Ќ/ )Wi:".5~ZNͫQ:kԇ#ٸ7E\u尿](ЧlimF-7?OsX8kXִmjQ~td{{KA|zHE:@w,)~y1NJyq\&fr@__ut,1aGU:-iS.v 0ʑMjC^dcµBVj&(#a;mp=anx?\ N2nDzv:u5 kߣE& cx=EMS[S! Ci?O442| ߀7AlzRd;Y sC:byf"XR۱ɵQU~bER gd֡/9&0i"'ɲuCd\.0dj~*Huk9E^s %Nݶ;'i ײ?e6 aiQo^W^Q)*zg7{!Q=E6ݒ]G]$Xd`Cr/nP>\?+#:P`Rq2XG5@ d]u٤QGyy(uf$1"<5 Zp|Μ~F1V14N@$=`Lm)5:/n\tQrm&O-ffi%5h6/J$ʏaDܿ:j03`]kBq}C"۫"mrwK@H6?q"kɏ7  g&"u2!Y]+;}b3BAXB^ZT1SQ3gl9T\=$r%=Mp" ӔGPI@b,Mׇ{^Nk:!C FbI(.z56)E\To3T:5]h k\8rrE86]We5?\k*Ko G("gNKy8o3-֡cm{=yDs焙@҈8htP%[tbx{zOAQצW.69ټ>oú(\ݡ*- ;_J& Jo?h<sPGj~5}%*{te==u2F`fR@vHV/SՕ]\Phܹ0.3'7&/K~LsTLǑx>jWV4=,vu8}ӥQI˂o |)>:[.W{'RҙJ_!/ǿVtoevW`&튡>n˱7?r6ḎN\gqɻ; tlch~9D =0Q<4?Ԓ-\-fc]#;(UW FQ!-V~ҝL?iD %;xMkcZͽ֢E yBF*IŘ]XP:035*=\rZKDؾ^'e5z ] >KOymEYDIokU1u^GrdSX6M31^LO\8NXɅv5jLfMO1Coܪ2/LNF5Pr_]>DqbFӰksG -QG+*Nk xx8LuFgۣS; ,&Ec`qC➌=wc<ɻ0ۦl~ .YQOl>G^yb;')<ȗwDgbT)թe]},e=3 bKlȨy3@*RC jՋҺ{Sέr~^aW{5f\ԭh>?No>&s_M|Fl.k8T|v_ߠ6z4+xYt`?4%E=AՖ 3RC_b'.=mjr}9IU\*^鵇bWhfgoᡏ󇜭^ OWx?s'jw;]pQ%Vщ? Nhvx#of_;-ͫƞLX:51`#HN/>Fd)M14 B%3_GGۉz;<:y-<#H$ 9>yP%LXnŘÌQ5.Xk:~9h[1%b 5b(<8S݊ 69-+v^snX)Bl=82vhf ?^#%!,Z1NG0@oR#{g$[Ԑ@(I}{oUg99^P"v2z/U ״Q8}_Ƙ?Cf ?vD+f<~r?.3C`YEUc撉n$M˾i ؼr@t Y*Fn(y@I{R9cvHwqvw>J2t ti=ox<ACE0~0mnu?w(!5 IsNj~Y7zMAH;{lD>| )i9g7f bj4 3 |dsQGu%NZLo4<$rPzciN7Xn,eo+(og&`@N{^_Ji<֔x-KU.+S NPAJ7Cg_%!}.fV@Hl es}d[i+,-&dO;#~  }^V:wq QpV6XwY ޲wQxK>X4f[11`i-gq>'. Dݿj+!;E直̙bujwF\{Rc#|g‚͈bCn8$_BO+֘C>RgaR"U(Ѣ4]td6R26#LD5Ij O8?_ !4!\pՁOE̫3I7K n,~:x7hsC:^L[7Eqfn H $cBu0|ij`!eL^NL)v& {)RwBe.3U0?ɶѹa*5G>tch;2Y~[ CaMiUªϙn Œa?C tN)_Uױz}~/a`ExgYCɱeD% xBKA ʖJ&&"bQ?FR؇ה(qIsβ=9/L!iزg3nDŽ7n-׺qsZ>8HFܙin)JAɳ+ZB-V'я.X&gX@)Z6tsFoQoY?Mݯ ԫEzZiYY$Wu"ŁK縂FpUf}nc7)hPz|6)7aRl"$NM^;I~(IϥɯYN5\ O^dq9, WJϏ[?coQvāT{qc=!wlI՝<2W&"+Tf4o\,2YS kvI}~ڪ K` 9ŏt7G۳~.$d|w>"sBAM:Ksc;8;xF DJgKobpcnv_}gXirP\ϘP7+6M|Ex /4 NLz7VRC)YuFZq VZQ'z7#H(XH(=nQ)FFwf촵9|.)}E9G `θWZ{uIW%:_'ܜr"DhY;/k|;O ',XS&pyȓ_c@ B-ۇ%%%$Ҕ&8RP!Sb{ñw7#iv4v{u=?r)Olzl6G?yOFRC}X$%0}-^4 xҗڗ=Oc 9ZqNH|l:*uF)nLDa7bC4c&4.4SaU")_;9@\W7~Q :2%oP¿lJN_ o'ޯ3eclU9,)$TK ?\Ӝޚs}pyއ,Kޡ#]i:zI hiZC \ı[o-t_b|V kϾ:Z|0BC7S>jSزgm=7*{#tPy/? ` :X<}˙ rQ.2!$1-P5]͋?RLR|?QƵ j͡"e$8f&W7xCT74 Fh]+X36C;R%xUL otގR90oݹF=IF¦(O?>N "2t(w =\%Z (}(yOFq/I%A>Dh~75mNb şfDdd;(-v|qHb!Xr&#W~XLK&m#_^BXڽtpEHNzm7Ql!"JX2c0.[8$ '6LD)p#Z VV䯿U8Ӎ -z}Cel_lZ,""UTW/-]MXz7| +$o^g#7A7,wBTzӑb `l8; =fcC<=wZ8Gd i>1u y;" /{V^\kMQS!rtbojhGswWxcΛ/[f̷|AkG![OfDǏf}RQ`teA,ꢧieRg3_{#== Q< N{ d5Jc?ϓ?mmsB5?0I +.t O{ߊ17^`cup.HM Lʊk$&/n@9 G\ q0-e0+\#*pG:3dpTo*2. S)#c($Ib5Di+qˌ3Q.%6Yo;[dӟV1 ]޹ǜ]O O'5RSԠ ZڪueLc$1E/artuH:~;;Avl¡f. 6TAKaG#ríTnoeJ IHӴ ըR#鐦b`3y?J["_pM x.ZTG _us`NFSZXsP;=rxppVr/˩R{&KcxM \5gu Ĉm{y H$qT+⬂SU,ܱc-6uqԶWr]v;|ޓXjoF4w*b<~5|O 9٪agx, zd!esP-7|$ %_ _#1-v:og6^A09DDWy"l4R5]2es'?bmv^RǷ!F$Gxwqdk8E!ډĸʬkY=YDs}VW1 bvo \x/u' /Z#1Tkڂ!I Ab; ¼ }rPR0¸BxhQ^D6-WA'fv.{p+g={~5׊C,Y0SYK$MN9V&ۃD8h 7k93ESĴUjP{tZWѿr,[L:Ť p5.xf/5y.1!tުS̾K-< C.S\ ~*WCEMI7tnxD/\zr t*HSJ>0*ԻDOhv-T@59Σ~!!2>V0o~C7W 26L m3`}hvW4Gdѐ>\cSit`qYzXN~G]ڗ(tN]ݏEu$PVIћOa:x0уN[1̬zyͥ֟Ut鯣l<DqF ȟVcZwbGouO 4w+;*+J這\mָQ^5~?0牰AyՁs92sN?8r"Òe7,"GЁm(G/1F(ąxHd$ĉ ቁ"R0coF;R]Z"4FיfѵQp'wc;/㊡' AFb: sQƆ:N/dAN 8Qy1}Ɨ;?, [­Ȱ\Kl6ѷ?eA?whT҂$cGGU5VIWdKT_W40R''Г(P Ax==Q摷ҘRk59ͥ<>DҒ=RَsQ#V ?GuX=k `AL@7Y:9 bE[qa݉sRs,I6zaZ2UgWXZrN, x~#i ̒#:!X7w H{*_Fy<1cjBjTbNFxڲUx': d8l ߠ " XucZ]_!|ݗ}%8Cx;yOY!] 5da"}BV' n4DMǨӝ?X1,9x$IVFEVɟkv,2\е{R)Zz7@{@2pkt7)BǚvS?Y49MQt@ xE#;CJmk?4O5# z/1ِSvL$Yj!fV褶>qUV@J7No]pҙjV SΏc1Vf [w9@vC1p}Px|6Mq@:'ogD|'tٙ%{2Qrb< ތ7tX7WD@)Lque&LuW rZg(gI葛p}P D&rn{8(ZGbXoB_+:$?`>k7G{iteFbp /uBb{6ZmyP˾ pc;X3ix^)b$νrD5sCU%n*YYLD#;/FߩY=U͋h裌pS[& I(dƸ>E#}IXrLaAң./)v--{K^h`Pٓ_<\4(P@8ō[k We`m_y޴XO@\8΁q! 8]X;l}g%HZ^abnCV6yoGVzԽ^8wPK?)Dϻ#ak̘R 檸Gz%#tEy`vi0&9ח=VMo4zcn蔜doNZi qʅ[bgCZ`-}¦oXSװ0Sl3&DbPQ#nKs]#[@kaRr{D;G| ɗZ$t fBQ(m2r,i_Cb?HQZTؚaԁoH( ]n-JI_$tА ' öS K;aF%X<4&WRx1 dE<28Gzzx *F(YԞ7,rcT2a/`lYa/˷˟txH+tH jR+GXHFNF > 9ȳ鐝tv,٥;Z:Ϛ DL E1:uN {GӝhͶfk$mUd) 07~ធnd-5n:'>z~A}c⎚G@n nsŞ&R/'V˯M_b`ɭg6n \8ۂejƑ|:z'RgXd0+1 ǧEgIWAb-m$>+Z.VQzFsGkIM٤'MʥCR!0ngH[ bS!P@;T*3uEѰ`0Y𙤴؄)+Bkc֙ K]p! t|0[&/a,VN}>+߬yMψʾrS{ڔHWJ*r ">KmKՖw3N&L&A釧}KvEG x)V;0QW]z=᳼C0U׺Gp>OgB>>wT} i}4XS W\Ӂ9  `5{OHckr)GGpv:5,Ȅk4Iɮ%Dқ$T8xJ%?|-(wiWWf?R!7,zw:Ƌ'my8E2|J&S%7kXC)W؇md^{aU"Y&^U˭ CeFWEpA@>mDP;`l!u!3 dUXx8w;BI3AE72;C~.2($&ܺ>~E©*Sn=qU9%P{{Gu ;B)]$/rM(sЈ¨I[O{v{^fq0G uC۔G]vr YD 4uT]$C%\S~ZG7pNBbkjX?>`S4 k(]Raû(ħ}F:iG35vݒn[н4R9 =$)VT _'Na7Uiv].F4̠74 SP5%@3_``fQ4J?NmDI8n&~KBɋsF0_oO֖7$(þas|f~&{50y8yj(BJ'X1ocЛpGpm –B"Cf v85ȗE*?p"]:{oS,'.4㔜$|YYE\@F,$\T W{PnUD5|6-HlW$7!1[}/fVT wvv,J͘ □ 5[ExND&v S2퐷C6]è ן, e˘pO0 Zg p5"0xg(-AFAppAp(~Wa?Eo.j,`o{ECwkS%e-uo]&Cjŏnj_DbO??q=6+ՇooFNXp6"YKP1@u6JgvD# M :u25ӛxJ+I>>M~oِJE 'OޮI6k1VvYϨ쯼VϫP3dK]H ٓiVw2xr78WHB\A Qz!N\@?U;%y(خ07U'`y@QLk /Kko%C]c2|tEkG!2lyalOYrX6ÅFOo6]ѠN >m*S*P,[(;7ur E;oFE^VqRV{slt0Ek+kX{)Q\+e<̱6m#+~s*1SfRZ]A5W+ ir{ 9PUlZBT `#k qK.?nQG KC{hu3h6kuzMS}&Q}BQ Vs lN7)0JAF0**%ֻ9σQ<S'oԜK`B;J]vl#椓,4@|Oxӹ>Tu{⎜F.T0@Qy?8]Z"ZQ@"#j|Ω6ojq>84W@,,A _O]RSmo"5ǘ*ոwږ PO>A9R#5h+YZBb.oh[yFGaA #)aPf80zqoIY,;$>'qf`{? ʘ`fT Fawz* 8/,l5-\ RH='k1=N+p?+]w|;М4PF4y n;I%f4DenJϢuK51kD83I-Z.؁DUI i-X"T/;V |5 EYB_Rю=08/b!h7`zEÄ |-#_dX0>iX) 飆PQF+6?, d >oĴJUHD\/L{D)K/<%ldF1~޼fR o۔ɔ=szMSиX}M\17hDiFG-b/,hZ!I,E01UyP!k ࢍNK(s`x%,!Mhd`wiw yTY ç< bT.Z{b֏d}-|O] kz)Romv\>$rHAWم3T2}Xh%RsjutKsR@?zAAzER'Y7~Ln\Q,-̹^@#hMyFېwA=^&I5d3}):"L;\0='oo Pܱ!"'!7LŶ' h/1Ʉ8/T܁BL%%6fmp%bCl0rE xHc:-Bz`/ěI{sU0DCаXѓPmSRn>< 8MoYH@߽ n@RW426;p/f/RE^l"sÉdS>8hkq)JGꡊӉ1-:Fd'Dk?k`1aG$׀ 3jom*u3 /~I(XE o%36C  ^!Rjho ~z%Z '.wv_Ug!.B BuPH%3 Ȑ!oɉ $taguO9>V,Vu*}4xMtBF/$ FfŸ˗'05+(A0tp|v>ƶel}#)8^"Ѐ؉NpMƩ)R+r$o2=Z F1 AY ]oo*]N]~XJo,`}g}).Ӛgu#õs4VKWrvRIYh]%IsL2vd H1-7 ~뢵z1 lf`j\ %m &J*lB 詎GU͖2`=BKW8;6g.cjFFe+'Qw,4=z":<7\0WF<@84Ϙ XN5qXd|KX@?G:nB4 g-+"rYz/2m ,ާmnrȖbG"oueZ = @L'}`9VQExG=|{?vQ݁FDhMY{5x{F{pᘾnO/C%Mz)W34ɬd'n4 :WՑLl Z@= RdZ mй?g TY}"mMICMv[:jaD -AH{?[nXu$Y6#>C=ķ؆&3 gu}Ã(>o d)~& 64ȉ/|Ĕtbq1ߩk-=Rr->tˢ~zwlVs]o]ݦN+xDgGK)`S))o9&A//`P#ZVgF_?s:,}/ WpOZϯ 6#6T&R[&ÄfOuMU)ڞmmv:ϱdf"aͫʡ@6d x2e9QnSeFGbQqr So:wCYsRn|nWe?y4 \dXjO.nTAhvf"ϔj!LI@8Vcd3X69/L@UZ9ߑQ,}A\sŸߌ<mEle9+8X o)4rc q 9a'f o]k)N;8~bFCg9[ÝlFO>o<^҄Cp$@DsojwAQאEnӬ(b9pWk@ s5t1FN2{W9w:ݖMJn&긕g?¬jkQhC:d{njyˁfee~SۋGΛ m/FBX6` J2r8o8Z :o,dpgl*ϐ_-JdI6p_b'#gnEWO0{%DPxc+ME(ڃ tZGmqe;"ch&DWBNWQr%AyH|bMlDRpl^2Oiv.):YH2LǣJbF~{ᝊ>vI:S1PbCa8KxmH-fNcw۳`VHC}5 j]l::)x yi 7fW lv͇-5ot)LZ1\_&Ƅ>$)f J .!;amM@gK5ʹ폒>&VgU˨ n.e۞ ['-@U"VG.{5McV6/@$KI[ͦ9-H_>}7ԼuY|56~dF:CuxhS'b!/\i$T H^Q b^.!tԻV:aܝ@*Y L8u>ue*P{M1oJh-O' f5kxE{\+{~IV 9C1]QyUZ9NlAW`VsuYZ0/nO@,ʑ2uUo;iڎY{4~ڧ+<Ď u+hܪaPKC퓅$F`Q |dc_ކFBE :PLpk<5lfuCo wnBy U)"q=!{]l\t['á;htZ#*o)dYRRBd1d }~>k  T&Gh9hΖcv?7C!D?m 'piv?PōZ"( T@ieW}M5'%Zj g6{*ِ6$bԊ$K\Sv}19&)yj`8 TɌM4eڪr(!Y|F{Ʈʷ]3bj)\]ɧH y;Z{xb Dzt|L4V|+r0p5 cD* WLaO9?k0?~$r+W+zN&Y]]БFd1M=:]%UZߎRm^.JAZ/FՅCn[їXǩ@uI% p݃Uu7wܸW>.A4O4Ѝ ]Ͼ <{fGa.n<^?G7ʧa_-tF~ &Jw$j**__$/\WBޛ)yE>Kr[;TDDw !x[ KoInzMPFK|T <}hky] FGOc[ kg!nv iAeE ]`_a'fVC EKݫ ÿ@#"Ia5gbnrMq AP2XٜZ>D$4|"bs{/i7w­*JtN:/Ş%yM^P&$&T !N^ e)fs0z}r4BCix˶~#d8J$!JQWr7q%)Hikz_mfz݅쾫Y"[Huݤ"w+n!.ަQ}2U{!fdx#k[Zr?'ͨN%=U!Ru2:&@%j0 pVB8H'WvFi8*/"d>NgZTN׭j7N.s|k{tt׋JOP*0а)h),D ?j"Vk5v ${; yjk<*ȋ1W.5+j$OTT|@rCY.&"?A£pF(n|uxdBWv"6Ag8t[嘱"pdBϕ.YT;t8V[*@6_< QFj!;+}>_筴nxh?e8RP7|/f%%sTPU+"6i6 adX93h6-FB*K3LsV*~/uCkF[x V8ڮ"ufBLV(EGMFU)U{F1 4ʛa38(%a}<>y^d 1QDI˗,0oBNnZj;xVٙV\S;9l{ JQK??PB j8W֫1fO:7u')}M&5!#kƌL2mƝ~혆98ͣ j,An|mqFc yY(iI!^ tjcei83TqbX.XM睞/Xoу$@g/ LYk<U갰լV]+I HJ(^|@؃`|dwb})z[Abh؞4:H3n!LZ~3m.!AGN(p__'n0s^6k,[0[9SKq]S_܌)29RbZ8W=?J\)C$mTUP!ۭu7'ۥ-}ڬ*#fdz eG#.*q馺ef4mO|KY>E=x4O9R{tiV/Uv/4.Ԧ{J}8ZZ~[Jo  7D&4eƸVǶe{"|{L~@2o^SwH0UZ&~5y( BH0,P/rk LMU@{Р^x'?";_eRjhd|@Yw HjCYrD7(8]ΌDmuZ+b[]Fog![EBZ< M?'R6tqNqv6x6TT$Pz! [ cƽ4PmAZc@L QN~\\@9"x|FVGSBtg"%߸h[*đN .dFRy؅ 6b|f4/(?e.\fY]c(4@QxpP(&X A$a@~CAg]˔?n8ȓk(^' T@w1 }V'2[9KNeXU5la|k&"/*<LqZ'LVSqn>eHhD_:Ӧ`V9ZRz7bIlrDzذ:ͳX!L`6u_0b5p"PeX~)CZ~! MO 2)D$d]r 8ľWAqkg<|cNF73pqDK6Ӆ 7;=j.CgYPؕNm"h գ2l-۱Cl9*fKX@ou}j-tSyq4 ǙvT{\eog9Zy=Xn$_wr'B|OQtU)hN'mt6SmmOm5° ƳZHL wn}7 ~B ?\uY3k n$/[Ln Bʮ^c צ C3[bwW͕B}A v4qgۣF*gK|S.ץ` 0IyFOДBX_ҌD6s,2mz^̺Xu,UmS̍`"wKu\tekY۷wXekܦr՚,&K=@Zjt^UI}A+M+2![4(Cuښ Xw,L$x]O_uwt QV?qJj3j?ӄ[ebt8we=>~`յrPW<]RPBv@$H)V D̙9r+r;2w=Oϯv狡K~;PB) QaC$-渇 zҲe:oң抳IW:?ݧ̞\Ks0r2ZyT)ߜ`S<1 ̠QķQ^7D/"$NdMF(dJl(>!%IF %`UoM3-BP@ fD ]ߐ(+Osb5E C=bjM l]~|Ne+xy~y;'~sGI J2 @  { 6b!%l"$ }X#@aM3uemԮIbBr7]]6WhuZ)iaZi_l2ɖk1%ɑK"(h5ܶVgAk< 9C HG0tCQMU .PWŴH1$.C_ _j!,GvqLk(WN"=:&֒_ oa2)jy/Ry҉*{R!φ,xאOg5&/.2+yXL+8:svlaIgi,)0?{!$s!*$|cb*D"{ 8 g(9Hm}ҘVLQ3Cv*橧7E/ F@ ŽW9  |n7^"{z-JdUpl_t:o-0bt,F"%I? tAU(u 3dN-g CqۈhO "{]#_L3HmO LG[.RceG1,gǣlGC4@ ܞ}bwV.m??!$P58 W] a=䁖M8Ӝ2d]UW(ߛb1 _̯{2'Q3g6tnt˹+E|aU}5,DI&Cð$hE303Fe2U3/,^_d;;au]Cّ9$2<7)m@έ{e7EF˫( .=:7]z.pVH`/pIP_I_ a$4rhU;+}yA8YQ|EӑeK gL5;usi |Fgȣ@+DӲT.Ho7< /u[~,D$2d# :'|c66H|d <^)Dj;Wz_s6?yȣ5Y"S]!$v #~XNSQA1E:5H.# dv9cr6La 2Y)XKi6(/3;dO~w~sj]{noes4F)= )e=sOKNb8;]?Eɐm{:գr$fNg,X!w@4+-S]@}.'e::yj^{Oߒ)=ޓ0>8r~O;$ۘ6xތz cn| >G>IG|:_z_SlQrUWQy)cBq`>|TJVb' \7D^^/Vv &x  pwh܉ khL,$Ʌjݳp]Ml2)&xIH>' 3"F[+nNQ;ܷQw Gawʍd¼|wQZ7\ `ܧho$O6!vb&%1[^yE"5(? Juf2zLMҁ'o%L4υ|+h>MIQZ-*rHs=叼a7?=i~i3 '(WvsI]?37G0tU';^YkM^CA#h>9̐g|_}ՐL׶~'ly6:a\( 1ٲ}ak}O ^D04pݢZHs!f:uMFiL[R rUp(T>M\ jv,ǟĭ_HP#ǭ%íC::.ʯ ;Zdsv9Ͼ"fA*|05Et}gC?Ic,r+v/ P c@ 9_劻(S+'ӅNUτ-0&ʏP^R{:hL}NJg.,Ò.qEE! Fab6מVj+2j!",`@|=׷{h)*5}=L;/Q=FmZ">O8lM)L mCy+" ܮH>wh0P};GDm{'\ Eؓv]\I>dwijt5d_)')$~,Eɣj |=}"'~āF=L^Q.囷N\DdTGITs_W۶۵|zIf8ٰ"/qɔUM5 07n՞ h UvDD8oZ9(q[m~帢AE|Ovڑ}5UTTJ A"}@)ˌ8$D0! G"ˣԍ(4wV`,o݁iV35 7F1|r(YRkXH訩Y+B)kkXcBGTJ._)LqZ_D)!j!T\ lj#c{D$)/ @ s.*$eZ61(JJ8r័j_Ԧp*kE\ |Qڨ"^J[^>s\~WBHT 8dY:t`T*HP??nk, @{+M'lJp!R`Nk5x6tu<J" tDr3A*6h^TNu/it%DNY]*3WY3Wъ]͋t\#(E̊O**'o$/Eq& 0VRgIgLb7^0yd# =3'vJv8(LYt;QVH RBک+ D.|KB A>Kq{LƇ$_VDk o=vBQEoiot# apƀ70\|ԬG7ƫK;\K(2?Y5؄`+LKS|ׂ;m+ =^ Q"/C}֝ Z? %<ԘB4JbMZTQ&O0ƄL%rt.4TO$]q}^)]FKJܛ6%څ=G7at}RЇHj-sKo;i//ڿI;'Z$*CK*,U sv+wcC Fc?Lzcpq)ߒ8n\)0[Y:VΘ' H %6ZFԉ}MhD/uTo2 ) /k}vzrwbY@8H,lPH.K}!tv^6T?MM)sL9L'X[b늵;*K \:v{`CSW?'-yh=h/ C_/ ,/(KAK%?m%;CAI<6*cx5vLR 8;gh>xb ;Yp^ ZWw$S |)pperformance/R/item_difficulty.R0000644000176200001440000000314513616476346016302 0ustar liggesusers#' @title Difficulty of Questionnaire Items #' @name item_difficulty #' #' @description Compute various measures of internal consistencies #' for tests or item-scales of questionnaires. #' #' @param x Depending on the function, \code{x} may be a \code{matrix} as #' returned by the \code{\link{cor}}-function, or a data frame #' with items (e.g. from a test or questionnaire). #' #' @return A data frame with three columns: The name(s) of the item(s), the item #' difficulties for each item, and the ideal item difficulty. #' #' @details This function calculates the item difficulty, which should #' range between 0.2 and 0.8. Lower values are a signal for #' more difficult items, while higher values close to one #' are a sign for easier items. The ideal value for item difficulty #' is \code{p + (1 - p) / 2}, where \code{p = 1 / max(x)}. In most #' cases, the ideal item difficulty lies between 0.5 and 0.8. #' #' @examples #' data(mtcars) #' x <- mtcars[, c("cyl", "gear", "carb", "hp")] #' item_difficulty(x) #' @importFrom stats na.omit #' @export item_difficulty <- function(x) { d <- sapply(x, function(.x) { .x <- stats::na.omit(.x) round(sum(.x) / (max(.x) * length(.x)), 2) }) # ideal item item_difficulty fun.diff.ideal <- function(.x) { p <- 1 / max(.x, na.rm = T) round(p + (1 - p) / 2, 2) } di <- apply(x, 2, fun.diff.ideal) structure( class = c("item_difficulty", "data.frame"), data.frame( item = colnames(x), difficulty = d, ideal = di, stringsAsFactors = FALSE ) ) } performance/R/check_homogeneity.R0000644000176200001440000000640413620052564016572 0ustar liggesusers#' Check model for homogeneity of variances #' #' Check model for homogeneity of variances between groups described #' by independent variables in a model. #' #' @param x A linear model or an ANOVA object. #' @param method Name of the method (underlying test) that should be performed #' to check the homogeneity of variances. May either be \code{"bartlett"} for #' the Bartlett test (assuming normal distributed samples or groups), #' \code{"fligner"} for the Fligner-Killeen test (rank-based, non-parametric test), #' or \code{"auto"}. In the latter case, Bartlett test is used if the model response #' is normal distributed, else Fligner-Killeen test is used. #' @param ... Currently not used. #' #' @return Invisibly returns the p-value of the test statistics. A p-value #' < 0.05 indicates a significant difference in the variance between the groups. #' #' @note There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. #' #' @examples #' model <- lm(len ~ supp + dose, data = ToothGrowth) #' check_homogeneity(model) #' #' # plot results #' result <- check_homogeneity(model) #' plot(result) #' @importFrom stats fligner.test bartlett.test shapiro.test #' @importFrom insight find_response find_predictors get_data get_response #' @export check_homogeneity <- function(x, method = c("bartlett", "fligner", "auto"), ...) { UseMethod("check_homogeneity") } #' @export check_homogeneity.default <- function(x, method = c("bartlett", "fligner", "auto"), ...) { method <- match.arg(method) resp <- insight::find_response(x) pred <- insight::find_predictors(x, component = "conditional", flatten = TRUE) if (length(pred) > 1) { pred <- paste0("interaction(", paste0(pred, collapse = ", "), ")", collapse = "") } f <- stats::as.formula(sprintf("%s ~ %s", resp, pred)) if (method == "auto") { check <- tryCatch( { stats::shapiro.test(insight::get_response(x))$p.value }, error = function(e) { NULL } ) if (is.null(check)) { insight::print_color("'check_homogeneity()' cannot perform check for normality. Please specify the 'method'-argument for the test of equal variances.\n", "red") return(NULL) } method <- ifelse(check < 0.05, "fligner", "bartlett") } if (method == "fligner") { r <- stats::fligner.test(f, data = insight::get_data(x)) } else if (method == "bartlett") { r <- stats::bartlett.test(f, data = insight::get_data(x)) } p.val <- r$p.value method.string <- switch( method, "bartlett" = "Bartlett Test", "fligner" = "Fligner-Killeen Test" ) if (p.val < 0.05) { insight::print_color(sprintf("Warning: Variances differ between groups (%s, p = %.3f).\n", method.string, p.val), "red") } else { insight::print_color(sprintf("OK: Variances in each of the groups are the same (%s, p = %.3f).\n", method.string, p.val), "green") } attr(p.val, "object_name") <- deparse(substitute(x), width.cutoff = 500) attr(p.val, "method") <- method.string class(p.val) <- unique(c("check_homogeneity", "see_check_homogeneity", class(p.val))) invisible(p.val) } performance/R/r2_coxsnell.R0000644000176200001440000000710613616500605015337 0ustar liggesusers#' @title Cox & Snell's R2 #' @name r2_coxsnell #' #' @description Calculates the pseudo-R2 value based on the proposal from \cite{Cox & Snell (1989)}. #' #' @param model Model with binary outcome. #' #' @details This index was proposed by \cite{Cox & Snell (1989, pp. 208-9)} and, #' apparently independently, by \cite{Magee (1990)}; but had been suggested earlier #' for binary response models by \cite{Maddala (1983)}. However, this index achieves #' a maximum of less than 1 for discrete models (i.e. models whose likelihood #' is a product of probabilities) which have a maximum of 1, instead of #' densities, which can become infinite \cite{(Nagelkerke, 1991)}. #' #' @return A named vector with the R2 value. #' #' @examples #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' r2_coxsnell(model) #' @references #' \itemize{ #' \item Cox, D. R., Snell, E. J. (1989). Analysis of binary data (Vol. 32). Monographs on Statistics and Applied Probability. #' \item Magee, L. (1990). R 2 measures based on Wald and likelihood ratio joint significance tests. The American Statistician, 44(3), 250-253. #' \item Maddala, G. S. (1986). Limited-dependent and qualitative variables in econometrics (No. 3). Cambridge university press. #' \item Nagelkerke, N. J. (1991). A note on a general definition of the coefficient of determination. Biometrika, 78(3), 691-692. #' } #' #' @importFrom insight n_obs #' @importFrom stats logLik update #' @export r2_coxsnell <- function(model) { UseMethod("r2_coxsnell") } # helper --------------------------- .r2_coxsnell <- function(model, l_base) { l_full <- stats::logLik(model) G2 <- -2 * (l_base - l_full) # Is it still necessary? if (inherits(model, c("vglm", "vgam", "clm2"))) { n <- insight::n_obs(model) } else { n <- attr(l_full, "nobs") if (is.null(n)) n <- insight::n_obs(model) } r2_coxsnell <- as.vector(1 - exp(-G2 / n)) names(r2_coxsnell) <- "Cox & Snell's R2" r2_coxsnell } # r2-coxsnell based on model information --------------------------- #' @export r2_coxsnell.glm <- function(model) { r2_coxsnell <- (1 - exp((model$deviance - model$null.deviance) / insight::n_obs(model))) names(r2_coxsnell) <- "Cox & Snell's R2" r2_coxsnell } #' @export r2_coxsnell.BBreg <- r2_coxsnell.glm #' @export r2_coxsnell.mclogit <- r2_coxsnell.glm # r2-coxsnell based on loglik stored in model object --------------------------- #' @export r2_coxsnell.coxph <- function(model) { l_base <- model$loglik[1] .r2_coxsnell(model, l_base) } #' @export r2_coxsnell.survreg <- r2_coxsnell.coxph # r2-coxsnell based on loglik of null-model (update) --------------------------- #' @export r2_coxsnell.multinom <- function(model) { l_base <- stats::logLik(stats::update(model, ~1, trace = FALSE)) .r2_coxsnell(model, l_base) } #' @export r2_coxsnell.clm2 <- function(model) { l_base <- stats::logLik(stats::update(model, location = ~1, scale = ~1)) .r2_coxsnell(model, l_base) } #' @export r2_coxsnell.clm <- function(model) { l_base <- stats::logLik(stats::update(model, ~1)) .r2_coxsnell(model, l_base) } #' @export r2_coxsnell.crch <- r2_coxsnell.clm #' @export r2_coxsnell.cpglm <- r2_coxsnell.clm #' @export r2_coxsnell.censReg <- r2_coxsnell.clm #' @export r2_coxsnell.truncreg <- r2_coxsnell.clm #' @export r2_coxsnell.polr <- r2_coxsnell.clm #' @export r2_coxsnell.glmx <- r2_coxsnell.clm #' @export r2_coxsnell.DirichletRegModel <- r2_coxsnell.clm performance/R/helpers.R0000644000176200001440000000633513616504035014553 0ustar liggesusers# trim leading / trailing whitespaces .trim <- function(x) gsub("^\\s+|\\s+$", "", x) #' @importFrom stats BIC .get_BIC <- function(x) { if (inherits(x, c("vgam", "vglm"))) { if (!requireNamespace("VGAM", quietly = TRUE)) { warning("Package 'VGAM' required for this function work. Please install it.", call. = FALSE) return(NULL) } VGAM::BIC(x) } else { tryCatch( { stats::BIC(x) }, error = function(e) { NULL } ) } } # safe deparse, works for very long strings .safe_deparse <- function(string) { paste0(sapply(deparse(string, width.cutoff = 500), .trim, simplify = TRUE), collapse = "") } # is string empty? .is_empty_object <- function(x) { if (is.list(x)) { x <- tryCatch( { .compact_list(x) }, error = function(x) { x } ) } # this is an ugly fix because of ugly tibbles if (inherits(x, c("tbl_df", "tbl"))) x <- as.data.frame(x) x <- suppressWarnings(x[!is.na(x)]) length(x) == 0 || is.null(x) } # has object an element with given name? .obj_has_name <- function(x, name) { name %in% names(x) } #' @importFrom stats na.omit sd .std <- function(x) { if (!is.numeric(x)) { return(x) } # remove missings tmp <- stats::na.omit(x) # standardize tmp <- (tmp - mean(tmp)) / stats::sd(tmp) # and fill in values in original vector x[!is.na(x)] <- tmp x } # recode numeric vector, so lowest value stats with 0 # factors are coerced to numeric .recode_to_zero <- function(x) { # check if factor if (is.factor(x) || is.character(x)) { # try to convert to numeric x <- .factor_to_numeric(x) } # retrieve lowest category minval <- min(x, na.rm = TRUE) sapply(x, function(y) y - minval) } # safe conversion from factor to numeric #' @importFrom stats na.omit .factor_to_numeric <- function(x, lowest = NULL) { if (is.data.frame(x)) { as.data.frame(lapply(x, .factor_to_numeric_helper, lowest = lowest)) } else { .factor_to_numeric_helper(x, lowest = lowest) } } .factor_to_numeric_helper <- function(x, lowest = NULL) { if (is.numeric(x)) { return(x) } if (anyNA(suppressWarnings(as.numeric(as.character(stats::na.omit(x)))))) { if (is.character(x)) { x <- as.factor(x) } levels(x) <- 1:nlevels(x) } out <- as.numeric(as.character(x)) if (!is.null(lowest)) { difference <- min(out) - lowest out <- out - difference } out } # remove NULL elements from lists .compact_list <- function(x, remove_na = FALSE) { if (remove_na) { x[!sapply(x, function(i) length(i) == 0 || is.null(i) || (length(i) == 1 & is.na(i)) || any(i == "NULL"))] } else { x[!sapply(x, function(i) length(i) == 0 || is.null(i) || any(i == "NULL"))] } } # remove column .remove_column <- function(data, variables) { data[, -which(colnames(data) %in% variables), drop = FALSE] } .remove_backticks_from_parameter_names <- function(x) { if (is.data.frame(x) && "Parameter" %in% colnames(x)) { x$Parameter <- gsub("`", "", x$Parameter, fixed = TRUE) } x } performance/R/performance_rmse.R0000644000176200001440000000372013611533123016426 0ustar liggesusers#' @title Root Mean Squared Error #' @name performance_rmse #' #' @description Compute root mean squared error for (mixed effects) models, #' including Bayesian regression models. #' #' @param model A model. #' @param normalized Logical, use \code{TRUE} if normalized rmse should be returned. #' @inheritParams model_performance.lm #' #' @details The RMSE is the square root of the variance of the residuals and indicates #' the absolute fit of the model to the data (difference between observed data #' to model's predicted values). It can be interpreted as the standard #' deviation of the unexplained variance, and is in the same units as the #' response variable. Lower values indicate better model fit. #' \cr \cr #' The normalized RMSE is the proportion of the RMSE related to the #' range of the response variable. Hence, lower values indicate #' less residual variance. #' #' @return Numeric, the root mean squared error. #' #' @examples #' if (require("nlme")) { #' m <- lme(distance ~ age, data = Orthodont) #' #' # RMSE #' performance_rmse(m, normalized = FALSE) #' #' # normalized RMSE #' performance_rmse(m, normalized = TRUE) #' } #' @importFrom insight get_response #' @export performance_rmse <- function(model, normalized = FALSE, verbose = TRUE) { tryCatch( { # compute rmse rmse_val <- sqrt(performance_mse(model)) # if normalized, divide by range of response if (normalized) { # get response resp <- .factor_to_numeric(insight::get_response(model)) # cpmpute rmse, normalized rmse_val <- rmse_val / (max(resp, na.rm = T) - min(resp, na.rm = T)) } rmse_val }, error = function(e) { if (inherits(e, c("simpleError", "error")) && verbose) { insight::print_color(e$message, "red") cat("\n") } NA } ) } #' @rdname performance_rmse #' @export rmse <- performance_rmse performance/R/check_convergence.R0000644000176200001440000000432013611533123016527 0ustar liggesusers#' @title Convergence test for mixed effects models #' @name check_convergence #' #' @description \code{check_convergence()} provides an alternative convergence #' test for \code{\link[lme4]{merMod}}-objects. #' #' @param x A \code{merMod}-object. #' @param tolerance Indicates up to which value the convergence result is #' accepted. The smaller \code{tolerance} is, the stricter the test #' will be. #' @param ... Currently not used. #' #' @return \code{TRUE} if convergence is fine and \code{FALSE} if convergence #' is suspicious. Additionally, the convergence value is returned as attribute. #' #' @details \code{check_convergence()} provides an alternative convergence test for #' \code{\link[lme4]{merMod}}-objects, as discussed #' \href{https://github.com/lme4/lme4/issues/120}{here} #' and suggested by Ben Bolker in #' \href{https://github.com/lme4/lme4/issues/120#issuecomment-39920269}{this comment}. #' Further details can be found in \code{\link[lme4]{convergence}}. #' #' @examples #' if (require("lme4")) { #' data(cbpp) #' set.seed(1) #' cbpp$x <- rnorm(nrow(cbpp)) #' cbpp$x2 <- runif(nrow(cbpp)) #' #' model <- glmer( #' cbind(incidence, size - incidence) ~ period + x + x2 + (1 + x | herd), #' data = cbpp, #' family = binomial() #' ) #' #' check_convergence(model) #' } #' @export check_convergence <- function(x, tolerance = 0.001, ...) { UseMethod("check_convergence") } #' @export check_convergence.default <- function(x, tolerance = 0.001, ...) { insight::print_color(sprintf("check_convergence() does not work for models of class '%s'.\n", class(x)[1]), "red") } #' @export check_convergence.merMod <- function(x, tolerance = 0.001, ...) { # check for package availability if (!requireNamespace("Matrix", quietly = TRUE)) { stop("Package `Matrix` needed for this function to work. Please install it.", call. = FALSE) } relgrad <- with(x@optinfo$derivs, Matrix::solve(Hessian, gradient)) # copy logical value, TRUE if convergence is OK retval <- max(abs(relgrad)) < tolerance # copy convergence value attr(retval, "gradient") <- max(abs(relgrad)) # return result retval } performance/R/r2_tjur.R0000644000176200001440000000310513564746345014506 0ustar liggesusers#' @title Tjur's R2 - coefficient of determination (D) #' @name r2_tjur #' #' @description This method calculates the Coefficient of Discrimination \code{D} #' (also known as Tjur's R2; \cite{Tjur, 2009}) for generalized linear (mixed) models #' for binary outcomes. It is an alternative to other pseudo-R2 values like #' Nagelkerke's R2 or Cox-Snell R2. The Coefficient of Discrimination \code{D} #' can be read like any other (pseudo-)R2 value. #' #' @param model Binomial Model. #' #' @return A named vector with the R2 value. #' #' @examples #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' r2_tjur(model) #' @references Tjur, T. (2009). Coefficients of determination in logistic regression models - A new proposal: The coefficient of discrimination. The American Statistician, 63(4), 366-372. #' #' @importFrom stats predict residuals #' @importFrom insight get_response model_info #' @export r2_tjur <- function(model) { # check for valid object class if (!insight::model_info(model)$is_binomial) { stop("`model` must be binomial.") } y <- .recode_to_zero(insight::get_response(model)) pred <- stats::predict(model, type = "response", re.form = NULL) # delete pred for cases with missing residuals if (anyNA(stats::residuals(model))) { pred <- pred[!is.na(stats::residuals(model))] } categories <- unique(y) m1 <- mean(pred[which(y == categories[1])], na.rm = TRUE) m2 <- mean(pred[which(y == categories[2])], na.rm = TRUE) tjur_d <- abs(m2 - m1) names(tjur_d) <- "Tjur's R2" tjur_d } performance/R/performance_rse.R0000644000176200001440000000131013564746345016265 0ustar liggesusers#' @title Residual Standard Error for Linear Models #' @name performance_rse #' #' @description Compute residual standard error of linear models. #' #' @inheritParams performance_rmse #' #' @details The residual standard error is the square root of the residual #' sum of squares divided by the residual degrees of freedom. #' #' @return Numeric, the residual standard error of \code{model}. #' #' @examples #' data(mtcars) #' m <- lm(mpg ~ hp + gear, data = mtcars) #' performance_rse(m) #' @importFrom stats residuals df.residual #' @export performance_rse <- function(model) { # Residual standard error sqrt(sum(stats::residuals(model)^2, na.rm = T) / stats::df.residual(model)) } performance/R/r2_nakagawa.R0000644000176200001440000000653013611533123015256 0ustar liggesusers#' @title Nakagawa's R2 for mixed models #' @name r2_nakagawa #' #' @description Compute the marginal and conditional r-squared value for #' mixed effects models with complex random effects structures. #' #' @param model A mixed effects model. #' #' @return A list with the conditional and marginal R2 values. #' #' @details Marginal and conditional r-squared values for mixed models are calculated #' based on \cite{Nakagawa et al. 2017}. For more details on the computation #' of the variances, see \code{\link[insight]{get_variance}}. #' \cr \cr #' The marginal r-squared considers only the variance of the fixed effects, while the #' conditional r-squared takes both the fixed and random effects into account. #' The random effect variances are actually the mean random effect variances, #' thus the r-squared value is also appropriate for mixed models with random #' slopes or nested random effects (see \cite{Johnson 2014}). #' #' @references \itemize{ #' \item Johnson, P. C. D. (2014). Extension of Nakagawa & Schielzeth’s R2 GLMM to random slopes models. Methods in Ecology and Evolution, 5(9), 944–946. \doi{10.1111/2041-210X.12225} #' \item Nakagawa, S., & Schielzeth, H. (2013). A general and simple method for obtaining R2 from generalized linear mixed-effects models. Methods in Ecology and Evolution, 4(2), 133–142. \doi{10.1111/j.2041-210x.2012.00261.x} #' \item Nakagawa, S., Johnson, P. C. D., & Schielzeth, H. (2017). The coefficient of determination R2 and intra-class correlation coefficient from generalized linear mixed-effects models revisited and expanded. Journal of The Royal Society Interface, 14(134), 20170213. \doi{10.1098/rsif.2017.0213} #' } #' #' @examples #' if (require("lme4")) { #' model <- lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) #' r2_nakagawa(model) #' } #' @importFrom insight get_variance print_color #' @export r2_nakagawa <- function(model) { vars <- tryCatch( { insight::get_variance(model, name_fun = "r2()", name_full = "r-squared") }, error = function(e) { if (inherits(e, c("simpleError", "error"))) { insight::print_color(e$message, "red") cat("\n") } NULL } ) if (is.null(vars) || all(is.na(vars))) { return(NA) } # check if we have successfully computed all variance components... components <- c("var.fixed", "var.residual") check_elements <- sapply(components, function(.i) !is.null(vars[[.i]])) if (!all(check_elements)) { return(NA) } # Calculate R2 values if (.is_empty_object(vars$var.random) || is.na(vars$var.random)) { # if no random effect variance, return simple R2 print_color("Random effect variances not available. Returned R2 does not account for random effects.\n", "red") r2_marginal <- vars$var.fixed / (vars$var.fixed + vars$var.residual) r2_conditional <- NA } else { r2_marginal <- vars$var.fixed / (vars$var.fixed + vars$var.random + vars$var.residual) r2_conditional <- (vars$var.fixed + vars$var.random) / (vars$var.fixed + vars$var.random + vars$var.residual) } names(r2_conditional) <- "Conditional R2" names(r2_marginal) <- "Marginal R2" structure( class = "r2_nakagawa", list( "R2_conditional" = r2_conditional, "R2_marginal" = r2_marginal ) ) } performance/R/r2_bayes.R0000644000176200001440000001235013611533123014604 0ustar liggesusers#' @title Bayesian R2 #' @name r2_bayes #' #' @description Compute R2 for Bayesian models. For mixed models (including a random part), #' it additionally computes the R2 related to the fixed effects only (marginal R2). #' #' @param model A Bayesian regression model. #' @param robust Logical, if \code{TRUE}, the median instead of mean is used to #' calculate the central tendency of the variances. #' @param ci Value or vector of probability of the CI (between 0 and 1) to be estimated. #' #' @return A list with the Bayesian R2 value. For mixed models, a list with the #' Bayesian R2 value and the marginal Bayesian R2 value. The standard errors #' and credible intervals for the R2 values are saved as attributes. #' #' @details \code{r2_bayes()} returns an "unadjusted" R2 value. See \code{\link{r2_loo}} #' to calculate a LOO-adjusted R2, which comes conceptionally closer to an #' adjusted R2 measure. #' \cr \cr #' For mixed models, the conditional and marginal R2 are returned. The marginal #' R2 considers only the variance of the fixed effects, while the conditional #' R2 takes both the fixed and random effects into account. #' #' @examples #' library(performance) #' if (require("rstanarm")) { #' model <- stan_glm(mpg ~ wt + cyl, data = mtcars, chains = 1, iter = 500, refresh = 0) #' r2_bayes(model) #' #' model <- stan_lmer( #' Petal.Length ~ Petal.Width + (1 | Species), #' data = iris, #' chains = 1, #' iter = 500, #' refresh = 0 #' ) #' r2_bayes(model) #' } #' \dontrun{ #' if (require("brms")) { #' model <- brms::brm(mpg ~ wt + cyl, data = mtcars) #' r2_bayes(model) #' #' model <- brms::brm(Petal.Length ~ Petal.Width + (1 | Species), data = iris) #' r2_bayes(model) #' } #' } #' @references Gelman, A., Goodrich, B., Gabry, J., & Vehtari, A. (2018). R-squared for Bayesian regression models. The American Statistician, 1–6. \doi{10.1080/00031305.2018.1549100} #' #' @importFrom insight find_algorithm is_multivariate find_response #' @importFrom stats median mad sd #' @importFrom bayestestR ci #' @export r2_bayes <- function(model, robust = TRUE, ci = .89) { r2_bayesian <- .r2_posterior(model) if (is.null(r2_bayesian)) { return(NULL) } if (insight::is_multivariate(model)) { structure( class = "r2_bayes_mv", rapply(r2_bayesian, ifelse(robust, stats::median, mean)), "SE" = rapply(r2_bayesian, ifelse(robust, stats::mad, stats::sd)), "Estimates" = rapply(r2_bayesian, bayestestR::point_estimate, centrality = "all", dispersion = TRUE), "CI" = rapply(r2_bayesian, bayestestR::hdi, ci = ci), "robust" = robust ) } else { structure( class = "r2_bayes", lapply(r2_bayesian, ifelse(robust, stats::median, mean)), "SE" = lapply(r2_bayesian, ifelse(robust, stats::mad, stats::sd)), "Estimates" = lapply(r2_bayesian, bayestestR::point_estimate, centrality = "all", dispersion = TRUE), "CI" = lapply(r2_bayesian, bayestestR::hdi, ci = ci), "robust" = robust ) } } .r2_posterior <- function(model) { if (!requireNamespace("rstantools", quietly = TRUE)) { stop("Package `rstantools` needed for this function to work. Please install it.") } algorithm <- insight::find_algorithm(model) if (algorithm$algorithm != "sampling") { warning("`r2()` only available for models fit using the 'sampling' algorithm.", call. = FALSE) return(NA) } tryCatch( { mi <- insight::model_info(model) if (insight::is_multivariate(model)) { res <- insight::find_response(model) if (mi[[1]]$is_mixed) { br2_mv <- list( "R2_Bayes" = rstantools::bayes_R2(model, re.form = NULL, re_formula = NULL, summary = FALSE), "R2_Bayes_marginal" = rstantools::bayes_R2(model, re.form = NA, re_formula = NA, summary = FALSE) ) br2 <- lapply(1:length(res), function(x) { list( "R2_Bayes" = unname(as.vector(br2_mv$R2_Bayes[, x])), "R2_Bayes_marginal" = unname(as.vector(br2_mv$R2_Bayes_marginal[, x])) ) }) names(br2) <- res } else { br2_mv <- list("R2_Bayes" = rstantools::bayes_R2(model, summary = FALSE)) br2 <- lapply(1:length(res), function(x) { list("R2_Bayes" = unname(as.vector(br2_mv$R2_Bayes[, x]))) }) names(br2) <- res } } else { if (mi$is_mixed) { br2 <- list( "R2_Bayes" = as.vector(rstantools::bayes_R2(model, re.form = NULL, re_formula = NULL, summary = FALSE)), "R2_Bayes_marginal" = as.vector(rstantools::bayes_R2(model, re.form = NA, re_formula = NA, summary = FALSE)) ) names(br2$R2_Bayes) <- "Conditional R2" names(br2$R2_Bayes_marginal) <- "Marginal R2" } else { br2 <- list("R2_Bayes" = as.vector(rstantools::bayes_R2(model, summary = FALSE))) names(br2$R2_Bayes) <- "R2" } } br2 }, error = function(e) { if (inherits(e, c("simpleError", "error"))) { insight::print_color(e$message, "red") cat("\n") } NULL } ) } performance/R/model_performance.lavaan.R0000644000176200001440000001303313611533123020017 0ustar liggesusers#' Performance of lavaan SEM / CFA Models #' #' Compute indices of model performance for SEM or CFA models from the \code{lavaan} package. #' #' @param model A \code{lavaan} model. #' @param metrics Can be \code{"all"} or a character vector of metrics to be computed (some of \code{c("Chisq", "Chisq_DoF", "Chisq_p", "Baseline", "Baseline_DoF", "Baseline_p", "CFI", "TLI", "NNFI", "RFI", "NFI", "PNFI", "IFI", "RNI", "Loglikelihood", "AIC", "BIC", "BIC_adjusted", "RMSEA", "SMRM")}). #' @param ... Arguments passed to or from other methods. #' #' @return A data frame (with one row) and one column per "index" (see \code{metrics}). #' #' @details \subsection{Indices of fit}{ #' \itemize{ #' \item \strong{Chisq}: The model Chi-squared assesses overall fit and the discrepancy between the sample and fitted covariance matrices. Its p-value should be > .05 (i.e., the hypothesis of a perfect fit cannot be rejected). However, it is quite sensitive to sample size. #' \item \strong{GFI/AGFI}: The (Adjusted) Goodness of Fit is the proportion of variance accounted for by the estimated population covariance. Analogous to R2. The GFI and the AGFI should be > .95 and > .90, respectively. #' \item \strong{NFI/NNFI/TLI}: The (Non) Normed Fit Index. An NFI of 0.95, indicates the model of interest improves the fit by 95\% relative to the null model. The NNFI (also called the Tucker Lewis index; TLI) is preferable for smaller samples. They should be > .90 (Byrne, 1994) or > .95 (Schumacker & Lomax, 2004). #' \item \strong{CFI}: The Comparative Fit Index is a revised form of NFI. Not very sensitive to sample size (Fan, Thompson, & Wang, 1999). Compares the fit of a target model to the fit of an independent, or null, model. It should be > .90. #' \item \strong{RMSEA}: The Root Mean Square Error of Approximation is a parsimony-adjusted index. Values closer to 0 represent a good fit. It should be < .08 or < .05. The p-value printed with it tests the hypothesis that RMSEA is less than or equal to .05 (a cutoff sometimes used for good fit), and thus should be not significant. #' \item \strong{RMR/SRMR}: the (Standardized) Root Mean Square Residual represents the square-root of the difference between the residuals of the sample covariance matrix and the hypothesized model. As the RMR can be sometimes hard to interpret, better to use SRMR. Should be < .08. #' \item \strong{RFI}: the Relative Fit Index, also known as RHO1, is not guaranteed to vary from 0 to 1. However, RFI close to 1 indicates a good fit. #' \item \strong{IFI}: the Incremental Fit Index (IFI) adjusts the Normed Fit Index (NFI) for sample size and degrees of freedom (Bollen's, 1989). Over 0.90 is a good fit, but the index can exceed 1. #' \item \strong{PNFI}: the Parsimony-Adjusted Measures Index. There is no commonly agreed-upon cutoff value for an acceptable model for this index. Should be > 0.50. #' } #' See the documentation for \code{\link[lavaan]{fitmeasures}}. #' } #' \subsection{What to report}{ #' Kline (2015) suggests that at a minimum the following indices should be reported: The model \strong{chi-square}, the \strong{RMSEA}, the \strong{CFI} and the \strong{SRMR}. #' } #' #' @examples #' # Confirmatory Factor Analysis (CFA) --------- #' if (require("lavaan")) { #' structure <- " visual =~ x1 + x2 + x3 #' textual =~ x4 + x5 + x6 #' speed =~ x7 + x8 + x9 " #' model <- lavaan::cfa(structure, data = HolzingerSwineford1939) #' model_performance(model) #' } #' @references \itemize{ #' \item Byrne, B. M. (1994). Structural equation modeling with EQS and EQS/Windows. Thousand Oaks, CA: Sage Publications. #' \item Tucker, L. R., \& Lewis, C. (1973). The reliability coefficient for maximum likelihood factor analysis. Psychometrika, 38, 1-10. #' \item Schumacker, R. E., \& Lomax, R. G. (2004). A beginner's guide to structural equation modeling, Second edition. Mahwah, NJ: Lawrence Erlbaum Associates. #' \item Fan, X., B. Thompson, \& L. Wang (1999). Effects of sample size, estimation method, and model specification on structural equation modeling fit indexes. Structural Equation Modeling, 6, 56-83. #' \item Kline, R. B. (2015). Principles and practice of structural equation modeling. Guilford publications. #' } #' #' @export model_performance.lavaan <- function(model, metrics = "all", ...) { if (!requireNamespace("lavaan", quietly = TRUE)) { stop("Package `lavaan` needed for this function to work. Please install it.", call. = FALSE) } measures <- as.data.frame(t(as.data.frame(lavaan::fitmeasures(model, ...)))) row.names(measures) <- NULL out <- data.frame( "Chisq" = measures$chisq, "Chisq_df" = measures$df, "Chisq_p" = measures$pvalue, "Baseline" = measures$baseline.chisq, "Baseline_df" = measures$baseline.df, "Baseline_p" = measures$baseline.pvalue, "GFI" = measures$gfi, "AGFI" = measures$agfi, "NFI" = measures$nfi, "NNFI" = measures$tli, "CFI" = measures$cfi, "RMSEA" = measures$rmsea, "RMSEA_CI_low" = measures$rmsea.ci.lower, "RMSEA_CI_high" = measures$rmsea.ci.upper, "RMSEA_p" = measures$rmsea.pvalue, "RMR" = measures$rmr, "SRMR" = measures$srmr, "RFI" = measures$rfi, "PNFI" = measures$pnfi, "IFI" = measures$ifi, "RNI" = measures$rni, "Loglikelihood" = measures$logl, "AIC" = measures$aic, "BIC" = measures$bic, "BIC_adjusted" = measures$bic2 ) if (all(metrics == "all")) { metrics <- names(out) } out[, metrics] } performance/R/plot-methods.R0000644000176200001440000000364013565530313015525 0ustar liggesusers#' @export plot.performance_roc <- function(x, ...) { if (!requireNamespace("see", quietly = TRUE)) { stop("Package 'see' needed to plot ROC-curves. Please install it.") } NextMethod() } #' @export plot.check_outliers <- function(x, ...) { if (!requireNamespace("see", quietly = TRUE)) { stop("Package 'see' needed to plot outliers. Please install it.") } NextMethod() } #' @export plot.check_collinearity <- function(x, ...) { if (!requireNamespace("see", quietly = TRUE)) { stop("Package 'see' needed to plot collinearity-check. Please install it.") } NextMethod() } #' @export plot.check_distribution <- function(x, ...) { if (!requireNamespace("see", quietly = TRUE)) { stop("Package 'see' needed to plot predicted distributions. Please install it.") } NextMethod() } #' @export plot.check_distribution_numeric <- function(x, ...) { if (!requireNamespace("see", quietly = TRUE)) { stop("Package 'see' needed to plot predicted distributions. Please install it.") } NextMethod() } #' @export plot.check_normality <- function(x, ...) { if (!requireNamespace("see", quietly = TRUE)) { stop("Package 'see' needed for residual plots. Please install it.") } NextMethod() } #' @export plot.check_heteroscedasticity <- function(x, ...) { if (!requireNamespace("see", quietly = TRUE)) { stop("Package 'see' needed for residual plots. Please install it.") } NextMethod() } #' @export plot.check_homogeneity <- function(x, ...) { if (!requireNamespace("see", quietly = TRUE)) { stop("Package 'see' needed for homogeneity plots. Please install it.") } NextMethod() } #' @export plot.compare_performance <- function(x, ...) { if (!requireNamespace("see", quietly = TRUE)) { stop("Package 'see' needed for model comparison plots. Please install it.") } NextMethod() } performance/R/performance_roc.R0000644000176200001440000000667113564746345016276 0ustar liggesusers#' @title Simple ROC curve #' @name performance_roc #' #' @description This function calculates a simple ROC curves of x/y coordinates #' based on response and predictions of a binomial model. #' #' @param x A numeric vector, representing the outcome (0/1), or a model with #' binomial outcome. #' @param predictions If \code{x} is numeric, a numeric vector of same length #' as \code{x}, representing the actual predicted values. #' @param new_data If \code{x} is a model, a data frame that is passed to #' \code{predict()} as \code{newdata}-argument. If \code{NULL}, the ROC for #' the full model is calculated. #' @param ... One or more models with binomial outcome. In this case, #' \code{new_data} is ignored. #' #' @return A data frame with three columns, the x/y-coordinate pairs for the ROC #' curve (\code{Sensivity} and \code{Specifity}), and a column with the model #' name. #' #' @examples #' library(bayestestR) #' data(iris) #' #' set.seed(123) #' iris$y <- rbinom(nrow(iris), size = 1, .3) #' folds <- sample(nrow(iris), size = nrow(iris) / 8, replace = FALSE) #' test_data <- iris[folds, ] #' train_data <- iris[-folds, ] #' #' model <- glm(y ~ Sepal.Length + Sepal.Width, data = train_data, family = "binomial") #' performance_roc(model, new_data = test_data) #' #' roc <- performance_roc(model, new_data = test_data) #' area_under_curve(roc$Sensivity, roc$Specifity) #' #' m1 <- glm(y ~ Sepal.Length + Sepal.Width, data = iris, family = "binomial") #' m2 <- glm(y ~ Sepal.Length + Petal.Width, data = iris, family = "binomial") #' m3 <- glm(y ~ Sepal.Length + Species, data = iris, family = "binomial") #' performance_roc(m1, m2, m3) #' @importFrom stats predict #' @importFrom insight find_response get_data #' @export performance_roc <- function(x, ..., predictions, new_data) { dots <- list(...) object_names <- c( .safe_deparse(substitute(x)), sapply(match.call(expand.dots = FALSE)$`...`, .safe_deparse) ) if (is.numeric(x) && !missing(predictions) && !is.null(predictions)) { .performance_roc_numeric(x, predictions) } else if (inherits(x, "glm") && length(dots) == 0) { if (missing(new_data)) new_data <- NULL .performance_roc_model(x, new_data) } else if (length(dots) > 0) { .performance_roc_models(list(x, ...), names = object_names) } } .performance_roc_numeric <- function(x, predictions) { if (length(x) != length(predictions)) { stop("'x' and ' predictions' must be of same length.", call. = FALSE) } x <- x[order(predictions, decreasing = TRUE)] res <- data.frame( Sensivity = c(0, cumsum(x) / sum(x), 1), Specifity = c(0, cumsum(!x) / sum(!x), 1) ) class(res) <- c("performance_roc", "see_performance_roc", "data.frame") res } .performance_roc_model <- function(x, new_data, model_name = "Model 1") { predictions <- stats::predict(x, newdata = new_data, type = "response") if (is.null(new_data)) new_data <- insight::get_data(x) response <- new_data[[insight::find_response(x)]] dat <- .performance_roc_numeric(response, predictions) dat$Model <- model_name dat } .performance_roc_models <- function(x, names) { l <- lapply(1:length(x), function(i) { if (inherits(x[[i]], "glm")) { .performance_roc_model(x = x[[i]], new_data = NULL, model_name = names[i]) } else { warning("Object '", names[i], "' is not valid.", call. = FALSE) } }) do.call(rbind, l) } performance/R/performance_score.R0000644000176200001440000001506013616476346016615 0ustar liggesusers#' @title Proper Scoring Rules #' @name performance_score #' #' @description Calculates the logarithmic, quadratic/Brier and spherical score #' from a model with binary or count outcome. #' #' @param model Model with binary or count outcome. #' @inheritParams model_performance.lm #' #' @return A list with three elements, the logarithmic, quadratic/Brier and spherical score. #' #' @details Proper scoring rules can be used to evaluate the quality of model #' predictions and model fit. \code{performance_score()} calculates the logarithmic, #' quadratic/Brier and spherical scoring rules. The spherical rule takes values #' in the interval \code{[0, 1]}, with values closer to 1 indicating a more #' accurate model, and the logarithmic rule in the interval \code{[-Inf, 0]}, #' with values closer to 0 indicating a more accurate model. #' \cr \cr #' For \code{stan_lmer()} and \code{stan_glmer()} models, the predicted values #' are based on \code{posterior_predict()}, instead of \code{predict()}. Thus, #' results may differ more than expected from their non-Bayesian counterparts #' in \pkg{lme4}. #' #' @references Carvalho, A. (2016). An overview of applications of proper scoring rules. Decision Analysis 13, 223–242. \doi{10.1287/deca.2016.0337} #' #' @note Code is partially based on \href{https://drizopoulos.github.io/GLMMadaptive/reference/scoring_rules.html}{GLMMadaptive::scoring_rules()}. #' #' @seealso \code{\link[=performance_logloss]{performance_logloss()}} #' #' @examples #' ## Dobson (1990) Page 93: Randomized Controlled Trial : #' counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) #' outcome <- gl(3, 1, 9) #' treatment <- gl(3, 3) #' model <- glm(counts ~ outcome + treatment, family = poisson()) #' #' performance_score(model) #' \dontrun{ #' if (require("glmmTMB")) { #' data(Salamanders) #' model <- glmmTMB( #' count ~ spp + mined + (1 | site), #' zi = ~ spp + mined, #' family = nbinom2(), #' data = Salamanders #' ) #' #' performance_score(model) #' } #' } #' #' @importFrom insight get_response model_info #' @importFrom stats dbinom dpois dnbinom ppois pnbinom #' @export performance_score <- function(model, verbose = TRUE) { minfo <- insight::model_info(model) if (minfo$is_ordinal || minfo$is_multinomial) { if (verbose) insight::print_color("Can't calculate proper scoring rules for ordinal, multinomial or cumulative link models.\n", "red") return(list(logarithmic = NA, quadratic = NA, spherical = NA)) } resp <- insight::get_response(model) if (!is.null(ncol(resp)) && ncol(resp) > 1) { if (verbose) insight::print_color("Can't calculate proper scoring rules for models without integer response values.\n", "red") return(list(logarithmic = NA, quadratic = NA, spherical = NA)) } prob_fun <- if (minfo$is_binomial) { function(x, mean, pis, n) stats::dbinom(x, size = n, prob = mean) } else if (minfo$is_poisson && !minfo$is_zero_inflated) { function(x, mean, pis, n) stats::dpois(x, lambda = mean) } else if (minfo$is_negbin && !minfo$is_zero_inflated) { function(x, mean, pis, n) dnbinom(x, mu = mean, size = exp(.dispersion_parameter(model, minfo))) } else if (minfo$is_poisson && minfo$is_zero_inflated && !minfo$is_hurdle) { function(x, mean, pis, n) { ind0 <- x == 0 out <- (1 - pis) * stats::dpois(x, lambda = mean / (1 - pis)) out[ind0] <- pis[ind0] + out[ind0] out } } else if (minfo$is_zero_inflated && minfo$is_negbin && !minfo$is_hurdle) { function(x, mean, pis, n) { ind0 <- x == 0 out <- (1 - pis) * stats::dnbinom(x, mu = mean / (1 - pis), size = exp(.dispersion_parameter(model, minfo))) out[ind0] <- pis[ind0] + out[ind0] out } } else if (minfo$is_hurdle && minfo$is_poisson) { function(x, mean, pis, n) { ind0 <- x == 0 trunc_zero <- stats::dpois(x, lambda = mean) / stats::ppois(0, lambda = mean, lower.tail = FALSE) out <- (1 - pis) * trunc_zero out[ind0] <- pis[ind0] out } } else if (minfo$is_hurdle && minfo$is_negbin) { function(x, mean, pis, n) { ind0 <- x == 0 trunc_zero <- stats::dnbinom(x, mu = mean, size = exp(.dispersion_parameter(model, minfo))) / stats::pnbinom(0, mu = mean, size = exp(.dispersion_parameter(model, minfo)), lower.tail = FALSE) out <- (1 - pis) * trunc_zero out[ind0] <- pis[ind0] out } } pr <- .predict_score_y(model) resp <- .factor_to_numeric(resp) p_y <- prob_fun(resp, mean = pr$pred, pis = pr$pred_zi, sum(resp)) quadrat_p <- sum(p_y^2) structure( class = "performance_score", list( logarithmic = mean(log(p_y)), quadratic = mean(2 * p_y + quadrat_p), spherical = mean(p_y / sqrt(quadrat_p)) ) ) } #' @importFrom stats residuals df.residual .dispersion_parameter <- function(model, minfo) { if (inherits(model, "MixMod")) { model$phis } else if (inherits(model, "glmmTMB")) { if (minfo$is_zero_inflated) { if (!requireNamespace("glmmTMB")) { stop("Package 'glmmTMB' required for this function work. Please install it.") } glmmTMB::getME(model, "theta") } else { sum(stats::residuals(model, type = "pearson")^2) / stats::df.residual(model) } } else { tryCatch( { sum(stats::residuals(model, type = "pearson")^2) / stats::df.residual(model) }, error = function(e) { 0 } ) } } #' @importFrom stats predict .predict_score_y <- function(model) { pred <- NULL pred_zi <- NULL if (inherits(model, "MixMod")) { pred <- stats::predict(model, type = "subject_specific") pred_zi <- if (!is.null(model$gammas)) attr(pred, "zi_probs") } else if (inherits(model, "glmmTMB")) { pred <- stats::predict(model, type = "response") pred_zi <- stats::predict(model, type = "zprob") } else if (inherits(model, c("hurdle", "zeroinfl"))) { pred <- stats::predict(model, type = "response") pred_zi <- stats::predict(model, type = "zero") } else if (inherits(model, c("clm", "clm2", "clmm"))) { pred <- stats::predict(model) } else if (all(inherits(model, c("stanreg", "lmerMod"), which = TRUE)) > 0) { if (!requireNamespace("rstanarm", quietly = TRUE)) { stop("Package `rstanarm` required for this function to work. Please install it.") } pred <- colMeans(rstanarm::posterior_predict(model)) } else { pred <- stats::predict(model, type = "response") } list(pred = pred, pred_zi = pred_zi) } performance/R/binned_residuals.R0000644000176200001440000001165113564746345016436 0ustar liggesusers#' @title Binned residuals for logistic regression #' @name binned_residuals #' #' @description Check model quality of logistic regression models. #' #' @param model A \code{glm}-object with binomial-family. #' @param term Name of independent variable from \code{x}. If not \code{NULL}, #' average residuals for the categories of \code{term} are plotted; else, #' average residuals for the estimated probabilities of the response are #' plotted. #' @param n_bins Numeric, the number of bins to divide the data. If #' \code{n_bins = NULL}, the square root of the number of observations is #' taken. #' @param ... Further argument like \code{size} (for point-size) or #' \code{color} (for point-colors). #' #' @return A data frame representing the data that is mapped to the plot, which is #' automatically plotted. In case all residuals are inside the error bounds, #' points are black. If some of the residuals are outside the error bounds #' (indicates by the grey-shaded area), blue points indicate residuals that #' are OK, while red points indicate model under- or overfitting for the #' related range of estimated probabilities. #' #' @details Binned residual plots are achieved by \dQuote{dividing the data into #' categories (bins) based on their fitted values, and then plotting #' the average residual versus the average fitted value for each bin.} #' \cite{(Gelman, Hill 2007: 97)}. If the model were true, one would #' expect about 95\% of the residuals to fall inside the error bounds. #' \cr \cr #' If \code{term} is not \code{NULL}, one can compare the residuals in #' relation to a specific model predictor. This may be helpful to check #' if a term would fit better when transformed, e.g. a rising and falling #' pattern of residuals along the x-axis (the pattern is indicated by #' a green line) is a signal to consider taking the logarithm of the #' predictor (cf. Gelman and Hill 2007, pp. 97ff). #' #' @note Since \code{binned_residuals()} returns a data frame, the default #' action for the result is \emph{printing}. However, the `print()`-method for #' \code{binned_residuals()} actually creates a plot. For further modifications #' of the plot, use `print()` and add ggplot-layers to the return values, #' e.g \code{plot(binned_residuals(model)) + see::scale_color_pizza()}. #' #' @references Gelman, A., & Hill, J. (2007). Data analysis using regression and multilevel/hierarchical models. Cambridge; New York: Cambridge University Press. #' #' @examples #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' binned_residuals(model) #' @importFrom stats fitted sd complete.cases #' @importFrom insight get_data get_response find_response #' @export binned_residuals <- function(model, term = NULL, n_bins = NULL, ...) { fv <- stats::fitted(model) mf <- insight::get_data(model) if (is.null(term)) { pred <- fv } else { pred <- mf[[term]] } y <- .recode_to_zero(insight::get_response(model)) - fv if (is.null(n_bins)) n_bins <- round(sqrt(length(pred))) breaks.index <- floor(length(pred) * (1:(n_bins - 1)) / n_bins) breaks <- unique(c(-Inf, sort(pred)[breaks.index], Inf)) model.binned <- as.numeric(cut(pred, breaks)) d <- suppressWarnings(lapply(1:n_bins, function(.x) { items <- (1:length(pred))[model.binned == .x] model.range <- range(pred[items], na.rm = TRUE) xbar <- mean(pred[items], na.rm = TRUE) ybar <- mean(y[items], na.rm = TRUE) n <- length(items) sdev <- stats::sd(y[items], na.rm = TRUE) data.frame( xbar = xbar, ybar = ybar, n = n, x.lo = model.range[1], x.hi = model.range[2], se = 2 * sdev / sqrt(n) ) })) d <- do.call(rbind, d) d <- d[stats::complete.cases(d), ] gr <- abs(d$ybar) > abs(d$se) d$group <- "yes" d$group[gr] <- "no" resid_ok <- sum(d$group == "yes") / length(d$group) if (resid_ok < .8) { insight::print_color(sprintf("Warning: Probably bad model fit. Only about %g%% of the residuals are inside the error bounds.\n", round(100 * resid_ok)), "red") } else if (resid_ok < .95) { insight::print_color(sprintf("Warning: About %g%% of the residuals are inside the error bounds (~95%% or higher would be good).\n", round(100 * resid_ok)), "yellow") } else { insight::print_color(sprintf("Ok: About %g%% of the residuals are inside the error bounds.\n", round(100 * resid_ok)), "green") } add.args <- lapply(match.call(expand.dots = FALSE)$`...`, function(x) x) size <- if ("size" %in% names(add.args)) add.args[["size"]] else 2 color <- if ("color" %in% names(add.args)) add.args[["color"]] else c("#d11141", "#00aedb") class(d) <- c("binned_residuals", "see_binned_residuals", class(d)) attr(d, "resp_var") <- insight::find_response(model) attr(d, "term") <- term attr(d, "geom_size") <- size attr(d, "geom_color") <- color d } performance/R/r2_kl.R0000644000176200001440000000163013564746345014131 0ustar liggesusers#' @title Kullback-Leibler R2 #' @name r2_kullback #' #' @description Calculates the Kullback-Leibler-divergence-based #' R2 for generalized linear models. #' #' @param model A generalized linear model. #' @param adjust Logical, if \code{TRUE} (the default), the adjusted R2 value is returned. #' #' @return A named vector with the R2 value. #' #' @examples #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' r2_kullback(model) #' @references Cameron, A. C. and Windmeijer, A. G. (1997) An R-squared measure of goodness of fit for some common nonlinear regression models. Journal of Econometrics, 77: 329-342. #' #' @export r2_kullback <- function(model, adjust = TRUE) { if (adjust) { adj <- model$df.null / model$df.residual } else { adj <- 1 } klr2 <- 1 - (model$deviance / model$null.deviance) * adj names(klr2) <- "Kullback-Leibler R2" klr2 } performance/R/r2_mckelvey.R0000644000176200001440000000512213615752156015334 0ustar liggesusers#' @title McKelvey & Zavoinas R2 #' @name r2_mckelvey #' #' @description Calculates McKelvey & Zavoinas pseudo R2. #' #' @param model Generalized linear model. #' #' @return The R2 value. #' #' @references #' \itemize{ #' \item McKelvey, R., Zavoina, W. (1975), "A Statistical Model for the Analysis of Ordinal Level Dependent Variables", Journal of Mathematical Sociology 4, S. 103–120. #' } #' #' @details McKelvey & Zavoinas R2 is based on the explained variance, #' where the variance of the predicted response is divided by the sum #' of the variance of the predicted response and residual variance. #' For binomial models, the residual variance is either \code{pi^2/3} #' for logit-link and 1 for probit-link. For poisson-models, the #' residual variance is based on log-normal approximation, similar to #' the \emph{distribution-specific variance} as described in #' \code{\link[insight]{get_variance}}. #' #' #' @examples #' ## Dobson (1990) Page 93: Randomized Controlled Trial: #' counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) # #' outcome <- gl(3, 1, 9) #' treatment <- gl(3, 3) #' model <- glm(counts ~ outcome + treatment, family = poisson()) #' #' r2_mckelvey(model) #' @importFrom insight n_obs model_info #' @importFrom stats predict family coef update #' @export r2_mckelvey <- function(model) { UseMethod("r2_mckelvey") } #' @export r2_mckelvey.default <- function(model) { .r2_mckelvey(model) } .r2_mckelvey <- function(model) { faminfo <- insight::model_info(model) n <- insight::n_obs(model) if (faminfo$is_binomial | faminfo$is_ordinal | faminfo$is_multinomial) { dist.variance <- switch( faminfo$link_function, probit = 1, logit = pi^2 / 3, clogloglink = pi^2 / 6, NA ) } else if (faminfo$is_count) { dist.variance <- switch( faminfo$link_function, log = .get_poisson_variance(model), sqrt = 0.25, 0 ) } y.hat <- stats::predict(model, type = "link") # fix for VGAM yhat_columns <- ncol(y.hat) if (!is.null(yhat_columns) && yhat_columns > 1) y.hat <- as.vector(y.hat[, 1]) dist.residual <- sum((y.hat - mean(y.hat))^2) mckelvey <- dist.residual / (n * dist.variance + dist.residual) names(mckelvey) <- "McKelvey's R2" mckelvey } .null_model <- function(model) { stats::update(model, ~1) } .get_poisson_variance <- function(model) { mu <- exp(stats::coef(.null_model(model))) if (is.na(mu)) { return(0) } cvsquared <- stats::family(model)$variance(mu) / mu^2 log1p(cvsquared) } performance/R/r2_nagelkerke.R0000644000176200001440000000550013616500624015615 0ustar liggesusers#' @title Nagelkerke's R2 #' @name r2_nagelkerke #' #' @description Calculate Nagelkerke's pseudo-R2. #' #' @param model A generalized linear model, including cumulative links resp. #' multinomial models. #' #' @return A named vector with the R2 value. #' #' @examples #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' r2_nagelkerke(model) #' @references Nagelkerke, N. J. (1991). A note on a general definition of the coefficient of determination. Biometrika, 78(3), 691-692. #' #' @export r2_nagelkerke <- function(model) { UseMethod("r2_nagelkerke") } # helper --------------------------- .r2_nagelkerke <- function(model, l_base) { L.full <- stats::logLik(model) D.full <- -2 * L.full D.base <- -2 * l_base # Is it still necessary? if (inherits(model, c("vglm", "vgam", "clm2"))) { n <- insight::n_obs(model) } else { n <- attr(L.full, "nobs") if (is.null(n)) n <- insight::n_obs(model) } r2_nagelkerke <- as.vector((1 - exp((D.full - D.base) / n)) / (1 - exp(-D.base / n))) names(r2_nagelkerke) <- "Nagelkerke's R2" r2_nagelkerke } # Nagelkerke's R2 based on Cox&Snell's R2 ---------------- #' @export r2_nagelkerke.glm <- function(model) { r2_nagelkerke <- r2_coxsnell(model) / (1 - exp(-model$null.deviance / insight::n_obs(model))) names(r2_nagelkerke) <- "Nagelkerke's R2" r2_nagelkerke } #' @export r2_nagelkerke.BBreg <- r2_nagelkerke.glm # Nagelkerke's R2 based on LogLik ---------------- #' @export r2_nagelkerke.multinom <- function(model) { l_base <- stats::logLik(stats::update(model, ~1, trace = FALSE)) .r2_nagelkerke(model, l_base) } #' @export r2_nagelkerke.clm2 <- function(model) { l_base <- stats::logLik(stats::update(model, location = ~1, scale = ~1)) .r2_nagelkerke(model, l_base) } #' @export r2_nagelkerke.clm <- function(model) { l_base <- stats::logLik(stats::update(model, ~1)) .r2_nagelkerke(model, l_base) } #' @export r2_nagelkerke.polr <- r2_nagelkerke.clm #' @export r2_nagelkerke.cpglm <- r2_nagelkerke.clm #' @export r2_nagelkerke.bracl <- r2_nagelkerke.clm #' @export r2_nagelkerke.glmx <- r2_nagelkerke.clm #' @export r2_nagelkerke.brmultinom <- r2_nagelkerke.clm #' @export r2_nagelkerke.mclogit <- r2_nagelkerke.clm #' @export r2_nagelkerke.censReg <- r2_nagelkerke.clm #' @export r2_nagelkerke.truncreg <- r2_nagelkerke.clm #' @export r2_nagelkerke.DirichletRegModel <- r2_coxsnell.clm # Nagelkerke's R2 based on LogLik stored in model object ---------------- #' @export r2_nagelkerke.coxph <- function(model) { l_base <- model$loglik[1] .r2_nagelkerke(model, l_base) } #' @export r2_nagelkerke.survreg <- r2_nagelkerke.coxph #' @export r2_nagelkerke.crch <- r2_nagelkerke.coxph performance/R/item_split_half.R0000644000176200001440000000334013564746345016263 0ustar liggesusers#' @title Split-Half Reliability #' @name item_split_half #' #' @description Compute various measures of internal consistencies #' for tests or item-scales of questionnaires. #' #' @param x A matrix or a data frame. #' @param digits Amount of digits for returned values. #' #' @return A list with two elements: the split-half reliability \code{splithalf} and #' the Spearman-Brown corrected split-half reliability \code{spearmanbrown}. #' #' @details This function calculates the split-half reliability for items in #' \code{x}, including the Spearman-Brown adjustment. Splitting is done by #' selecting odd versus even columns in \code{x}. A value closer to 1 #' indicates greater internal consistency. #' #' @references Spearman C. 1910. Correlation calculated from faulty data. British Journal of Psychology (3): 271-295. \doi{10.1111/j.2044-8295.1910.tb00206.x} #' \cr \cr #' Brown W. 1910. Some experimental results in the correlation of mental abilities. British Journal of Psychology (3): 296-322. \doi{10.1111/j.2044-8295.1910.tb00207.x} #' #' @examples #' data(mtcars) #' x <- mtcars[, c("cyl", "gear", "carb", "hp")] #' item_split_half(x) #' @importFrom stats cor #' @export item_split_half <- function(x, digits = 3) { # Calculating total score for even items score_e <- rowMeans(x[, c(TRUE, FALSE)], na.rm = TRUE) # Calculating total score for odd items score_o <- rowMeans(x[, c(FALSE, TRUE)], na.rm = TRUE) # Correlating scores from even and odd items shr <- stats::cor(score_e, score_o, use = "complete.obs") # Adjusting with the Spearman-Brown prophecy formula sb.shr <- (2 * shr) / (1 + shr) list(splithalf = shr, spearmanbrown = sb.shr) } performance/R/check_heteroscedasticity.R0000644000176200001440000000352713620052564020145 0ustar liggesusers#' @title Check model for (non-)constant error variance #' @name check_heteroscedasticity #' #' @description Check model for (non-)constant error variance. #' #' @param x A model object. #' @param ... Currently not used. #' #' @return Invisibly returns the p-value of the test statistics. A p-value < 0.05 #' indicates a non-constant variance (heteroskedasticity). #' #' @note There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. #' #' @examples #' m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) #' check_heteroscedasticity(m) #' #' # plot results #' x <- check_heteroscedasticity(m) #' plot(x) #' @importFrom stats residuals df.residual fitted anova pchisq #' @importFrom insight print_color #' @export check_heteroscedasticity <- function(x, ...) { UseMethod("check_heteroscedasticity") } #' @export check_heteroscedasticity.default <- function(x, ...) { sumry <- summary(x) r <- stats::residuals(x, type = "pearson") S.sq <- stats::df.residual(x) * (sumry$sigma)^2 / sum(!is.na(r)) .U <- (r^2) / S.sq mod <- lm(.U ~ stats::fitted(x)) SS <- stats::anova(mod)$"Sum Sq" RegSS <- sum(SS) - SS[length(SS)] Chisq <- RegSS / 2 p.val <- stats::pchisq(Chisq, df = 1, lower.tail = FALSE) if (p.val < 0.05) { insight::print_color(sprintf("Warning: Heteroscedasticity (non-constant error variance) detected (p = %.3f).\n", p.val), "red") } else { insight::print_color(sprintf("OK: Error variance appears to be homoscedastic (p = %.3f).\n", p.val), "green") } attr(p.val, "object_name") <- deparse(substitute(x), width.cutoff = 500) class(p.val) <- unique(c("check_heteroscedasticity", "see_check_heteroscedasticity", class(p.val))) invisible(p.val) } performance/R/r2_efron.R0000644000176200001440000000255513616504452014630 0ustar liggesusers#' @title Efron's R2 #' @name r2_efron #' #' @description Calculates Efron's pseudo R2. #' #' @param model Generalized linear model. #' #' @return The R2 value. #' #' @details Efron's R2 is calculated by taking the sum of the squared model residuals, divided by the total variability in the dependent variable. This R2 equals the squared correlation between the predicted values and actual values, however, note that model residuals from generalized linear models are not generally comparable to those of OLS. #' #' @references #' \itemize{ #' \item Efron, B. (1978). Regression and ANOVA with zero-one data: Measures of residual variation. Journal of the American Statistical Association, 73, 113-121. #' } #' #' @examples #' ## Dobson (1990) Page 93: Randomized Controlled Trial: #' counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) # #' outcome <- gl(3, 1, 9) #' treatment <- gl(3, 3) #' model <- glm(counts ~ outcome + treatment, family = poisson()) #' #' r2_efron(model) #' @export r2_efron <- function(model) { UseMethod("r2_efron") } #' @export r2_efron.default <- function(model) { .r2_efron(model) } #' @importFrom insight get_response #' @importFrom stats predict .r2_efron <- function(model) { y_hat <- stats::predict(model, type = "response") y <- .factor_to_numeric(insight::get_response(model), lowest = 0) (1 - (sum((y - y_hat)^2)) / (sum((y - mean(y))^2))) } performance/R/check_overdispersion.R0000644000176200001440000001130113616476346017323 0ustar liggesusers#' @title Check overdispersion of GL(M)M's #' @name check_overdispersion #' #' @description \code{check_overdispersion()} checks generalized linear (mixed) models #' for overdispersion. #' #' @param x Fitted model of class \code{merMod}, \code{glmmTMB}, \code{glm}, #' or \code{glm.nb} (package \pkg{MASS}). #' @param ... Currently not used. #' #' @return A list with results from the overdispersion test, like chi-squared #' statistics, p-value or dispersion ratio. #' #' @details Overdispersion occurs when the observed variance is higher than #' the variance of a theoretical model. For Poisson models, variance increases #' with the mean, thus, variance usually (roughly) equals the mean value. If #' the variance is much higher, the data are "overdispersed". #' \subsection{Interpretation of the Dispersion Ratio}{ #' If the dispersion ratio is close to one, a Poisson model fits well #' to the data. Dispersion ratios larger than one indicate overdispersion, #' thus a negative binomial model or similar might fit better to the data. #' A p-value < .05 indicates overdispersion. #' } #' \subsection{Overdispersion in Poisson Models}{ #' For Poisson models, the overdispersion test is based on the code #' from \cite{Gelman and Hill (2007), page 115}. #' } #' \subsection{Overdispersion in Mixed Models}{ #' For \code{merMod}- and \code{glmmTMB}-objects, \code{check_overdispersion()} #' is based on the code in the \href{http://bbolker.github.io/mixedmodels-misc/glmmFAQ.html}{GLMM FAQ}, #' section \emph{How can I deal with overdispersion in GLMMs?}. Note that #' this function only returns an \emph{approximate} estimate of an #' overdispersion parameter, and is probably inaccurate for zero-inflated #' mixed models (fitted with \code{glmmTMB}). #' } #' \subsection{How to fix Overdispersion}{ #' Overdispersion can be fixed by either modeling the dispersion parameter, #' or by choosing a different distributional family (like Quasi-Poisson, #' or negative binomial, see \cite{Gelman and Hill (2007), pages 115-116}). #' } #' #' @references \itemize{ #' \item Bolker B et al. (2017): \href{http://bbolker.github.io/mixedmodels-misc/glmmFAQ.html}{GLMM FAQ.} #' \item Gelman, A., & Hill, J. (2007). Data analysis using regression and multilevel/hierarchical models. Cambridge; New York: Cambridge University Press. #' } #' #' #' @examples #' if (require("glmmTMB")) { #' data(Salamanders) #' m <- glm(count ~ spp + mined, family = poisson, data = Salamanders) #' check_overdispersion(m) #' #' m <- glmmTMB( #' count ~ mined + spp + (1 | site), #' family = poisson, #' data = Salamanders #' ) #' check_overdispersion(m) #' } #' @export check_overdispersion <- function(x, ...) { UseMethod("check_overdispersion") } # Overdispersion for classical models ----------------------------- #' @importFrom insight get_response model_info find_parameters #' @importFrom stats fitted nobs coef pchisq #' @export check_overdispersion.glm <- function(x, ...) { # check if we have poisson model_info <- insight::model_info(x) if (!model_info$is_poisson) { stop("Model must be from Poisson-family.", call. = F) } yhat <- stats::fitted(x) n <- stats::nobs(x) k <- length(insight::find_parameters(x, effects = "fixed", flatten = TRUE)) zi <- (insight::get_response(x) - yhat) / sqrt(yhat) chisq <- sum(zi^2) ratio <- chisq / (n - k) p.value <- stats::pchisq(chisq, df = n - k, lower.tail = FALSE) structure( class = "check_overdisp", list( chisq_statistic = chisq, dispersion_ratio = ratio, residual_df = n - k, p_value = p.value ) ) } #' @export check_overdispersion.fixest <- check_overdispersion.glm #' @export check_overdispersion.glmx <- check_overdispersion.glm # Overdispersion for mixed models --------------------------- #' @importFrom insight model_info #' @importFrom stats df.residual residuals pchisq #' @export check_overdispersion.merMod <- function(x, ...) { # check if we have poisson if (!insight::model_info(x)$is_poisson) { stop("Model must be from Poisson-family.", call. = F) } rdf <- stats::df.residual(x) rp <- stats::residuals(x, type = "pearson") Pearson.chisq <- sum(rp^2) prat <- Pearson.chisq / rdf pval <- stats::pchisq(Pearson.chisq, df = rdf, lower.tail = FALSE) structure( class = "check_overdisp", list( chisq_statistic = Pearson.chisq, dispersion_ratio = prat, residual_df = rdf, p_value = pval ) ) } #' @export check_overdispersion.negbin <- check_overdispersion.merMod #' @export check_overdispersion.glmmTMB <- check_overdispersion.merMod performance/R/model_performance.lm.R0000644000176200001440000001135013616746412017201 0ustar liggesusers#' Performance of Regression Models #' #' Compute indices of model performance for regression models. #' #' @param model A model. #' @param metrics Can be \code{"all"}, \code{"common"} or a character vector of metrics to be computed (some of \code{c("AIC", "BIC", "R2", "RMSE", "LOGLOSS", "PCP", "SCORE")}). \code{"common"} will compute AIC, BIC, R2 and RMSE. #' @param verbose Toggle off warnings. #' @param ... Arguments passed to or from other methods. #' #' @return A data frame (with one row) and one column per "index" (see \code{metrics}). #' #' @details Depending on \code{model}, following indices are computed: #' \itemize{ #' \item{\strong{AIC}} {Akaike's Information Criterion, see \code{\link[stats]{AIC}}} #' \item{\strong{BIC}} {Bayesian Information Criterion, see \code{\link[stats]{BIC}}} #' \item{\strong{R2}} {r-squared value, see \code{\link{r2}}} #' \item{\strong{R2_adj}} {adjusted r-squared, see \code{\link{r2}}} #' \item{\strong{RMSE}} {root mean squared error, see \code{\link{performance_rmse}}} #' \item{\strong{LOGLOSS}} {Log-loss, see \code{\link{performance_logloss}}} #' \item{\strong{SCORE_LOG}} {score of logarithmic proper scoring rule, see \code{\link{performance_score}}} #' \item{\strong{SCORE_SPHERICAL}} {score of spherical proper scoring rule, see \code{\link{performance_score}}} #' \item{\strong{PCP}} {percentage of correct predictions, see \code{\link{performance_pcp}}} #' } #' #' @examples #' model <- lm(mpg ~ wt + cyl, data = mtcars) #' model_performance(model) #' #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' model_performance(model) #' @importFrom insight model_info #' @export model_performance.lm <- function(model, metrics = "all", verbose = TRUE, ...) { if (all(metrics == "all")) { metrics <- c("AIC", "BIC", "R2", "R2_adj", "RMSE", "LOGLOSS", "PCP", "SCORE") } else if (all(metrics == "common")) { metrics <- c("AIC", "BIC", "R2", "R2_adj", "RMSE") } info <- insight::model_info(model) out <- list() attrib <- list() if ("AIC" %in% toupper(metrics)) { out$AIC <- performance_aic(model) } if ("BIC" %in% toupper(metrics)) { out$BIC <- .get_BIC(model) } if ("R2" %in% toupper(metrics)) { R2 <- r2(model) attrib$r2 <- attributes(R2) out <- c(out, R2) } if ("RMSE" %in% toupper(metrics)) { out$RMSE <- performance_rmse(model, verbose = verbose) } if (("LOGLOSS" %in% toupper(metrics)) && info$is_binomial) { .logloss <- performance_logloss(model, verbose = verbose) if (!is.na(.logloss)) out$LOGLOSS <- .logloss } if (("SCORE" %in% toupper(metrics)) && (info$is_binomial || info$is_count)) { .scoring_rules <- performance_score(model, verbose = verbose) if (!is.na(.scoring_rules$logarithmic)) out$SCORE_LOG <- .scoring_rules$logarithmic if (!is.na(.scoring_rules$spherical)) out$SCORE_SPHERICAL <- .scoring_rules$spherical } if (("PCP" %in% toupper(metrics)) && info$is_binomial && !info$is_multinomial && !info$is_ordinal) { out$PCP <- performance_pcp(model, verbose = verbose)$pcp_model } # TODO: What with sigma and deviance? out <- as.data.frame(out) row.names(out) <- NULL class(out) <- c("performance_model", class(out)) # Add attributes attributes(out) <- c(attributes(out), attrib) out } #' @rdname model_performance.lm #' @export model_performance.glm <- model_performance.lm #' @export model_performance.glmx <- model_performance.lm #' @export model_performance.betareg <- model_performance.lm #' @export model_performance.censReg <- model_performance.lm #' @export model_performance.clm <- model_performance.lm #' @export model_performance.clm2 <- model_performance.lm #' @export model_performance.coxph <- model_performance.lm #' @export model_performance.felm <- model_performance.lm #' @export model_performance.iv_robust <- model_performance.lm #' @export model_performance.ivreg <- model_performance.lm #' @export model_performance.mlogit <- model_performance.lm #' @export model_performance.multinom <- model_performance.lm #' @export model_performance.plm <- model_performance.lm #' @export model_performance.polr <- model_performance.lm #' @export model_performance.survreg <- model_performance.lm #' @export model_performance.svyglm <- model_performance.lm #' @export model_performance.truncreg <- model_performance.lm #' @export model_performance.vglm <- model_performance.lm #' @export model_performance.fixest <- model_performance.lm #' @export model_performance.DirichletRegModel <- model_performance.lm #' @export model_performance.flexsurvreg <- model_performance.lm #' @export model_performance.hurdle <- model_performance.lm performance/R/performance_pcp.R0000644000176200001440000001421013571155102016240 0ustar liggesusers#' @title Percentage of Correct Predictions #' @name performance_pcp #' #' @description Percentage of correct predictions (PCP) for models #' with binary outcome. #' #' @param model Model with binary outcome. #' @param ci The level of the confidence interval. #' @param method Name of the method to calculate the PCP (see 'Details'). #' Default is \code{"Herron"}. May be abbreviated. #' @inheritParams model_performance.lm #' #' @return A list with several elements: the percentage of correct predictions #' of the full and the null model, their confidence intervals, as well as the #' chi-squared and p-value from the Likelihood-Ratio-Test between the full and #' null model. #' #' @details \code{method = "Gelman-Hill"} (or \code{"gelman_hill"}) computes the #' PCP based on the proposal from \cite{Gelman and Hill 2017, 99}, which is #' defined as the proportion of cases for which the deterministic prediction #' is wrong, i.e. the proportion where the predicted probability is above 0.5, #' although y=0 (and vice versa) (see also \cite{Herron 1999, 90}). #' \cr \cr #' \code{method = "Herron"} (or \code{"herron"}) computes a modified version #' of the PCP (\cite{Herron 1999, 90-92}), which is the sum of predicted probabilities, #' where y=1, plus the sum of 1 - predicted probabilities, where y=0, divided #' by the number of observations. This approach is said to be more accurate. #' \cr \cr #' The PCP ranges from 0 to 1, where values closer to 1 mean that the model #' predicts the outcome better than models with an PCP closer to 0. In general, #' the PCP should be above 0.5 (i.e. 50\%), the closer to one, the better. #' Furthermore, the PCP of the full model should be considerably above #' the null model's PCP. #' \cr \cr #' The likelihood-ratio test indicates whether the model has a significantly #' better fit than the null-model (in such cases, p < 0.05). #' #' #' @references \itemize{ #' \item Herron, M. (1999). Postestimation Uncertainty in Limited Dependent Variable Models. Political Analysis, 8, 83–98. #' \item Gelman, A., & Hill, J. (2007). Data analysis using regression and multilevel/hierarchical models. Cambridge; New York: Cambridge University Press, 99 #' } #' #' @examples #' data(mtcars) #' m <- glm(formula = vs ~ hp + wt, family = binomial, data = mtcars) #' performance_pcp(m) #' performance_pcp(m, method = "Gelman-Hill") #' @importFrom stats predict qnorm binomial predict.glm pchisq logLik weights as.formula glm #' @importFrom insight get_response n_obs model_info find_response get_data #' @export performance_pcp <- function(model, ci = 0.95, method = "Herron", verbose = TRUE) { method <- match.arg(method, choices = c("Herron", "Gelman-Hill", "herron", "gelman_hill")) mi <- insight::model_info(model) if (!mi$is_binomial) { stop("`performance_pcp()` only works for models with binary outcome.") } resp <- insight::get_response(model) if (!is.null(ncol(resp)) && ncol(resp) > 1) { if (verbose) insight::print_color("`performance_pcp()` only works for models with binary response values.\n", "red") return(NULL) } m0 <- suppressWarnings(stats::glm( formula = stats::as.formula(sprintf("%s ~ 1", insight::find_response(model))), family = stats::binomial(link = "logit"), data = insight::get_data(model), weights = stats::weights(model) )) if (method %in% c("Herron", "herron")) { .pcp_herron(model, m0, ci) } else { .pcp_gelman_hill(model, m0, ci) } } .pcp_herron <- function(model, m0, ci) { y_full <- .recode_to_zero(insight::get_response(model)) y_null <- .recode_to_zero(insight::get_response(m0)) n_full <- insight::n_obs(model) n_null <- insight::n_obs(m0) pr_full <- stats::predict(model, type = "response") pr_null <- stats::predict(m0, type = "response") pcp_full <- (sum(1 - pr_full[y_full == 0]) + sum(pr_full[y_full == 1])) / n_full pcp_null <- (sum(1 - pr_null[y_null == 0]) + sum(pr_null[y_null == 1])) / n_null lrt.p <- 1 - stats::pchisq( q = model$null.deviance - model$deviance, df = model$df.null - model$df.residual, lower.tail = TRUE ) lrt.chisq <- 2 * abs(stats::logLik(model) - stats::logLik(m0)) structure( class = "performance_pcp", list( pcp_model = pcp_full, model_ci_low = pcp_full - stats::qnorm((1 + ci) / 2) * sqrt(pcp_full * (1 - pcp_full) / n_full), model_ci_high = pcp_full + stats::qnorm((1 + ci) / 2) * sqrt(pcp_full * (1 - pcp_full) / n_full), pcp_m0 = pcp_null, null_ci_low = pcp_null - stats::qnorm((1 + ci) / 2) * sqrt(pcp_null * (1 - pcp_null) / n_null), null_ci_high = pcp_null + stats::qnorm((1 + ci) / 2) * sqrt(pcp_null * (1 - pcp_null) / n_null), lrt_chisq = as.vector(lrt.chisq), lrt_p = lrt.p ) ) } .pcp_gelman_hill <- function(model, m0, ci) { y_full <- .recode_to_zero(insight::get_response(model)) y_null <- .recode_to_zero(insight::get_response(m0)) n_full <- insight::n_obs(model) n_null <- insight::n_obs(m0) pr_full <- stats::predict(model, type = "response") pr_null <- stats::predict(m0, type = "response") pcp_full <- 1 - mean((pr_full > .5 & y_full == 0) | (pr_full <= .5 & y_full == 1)) pcp_null <- 1 - mean((pr_null > .5 & y_null == 0) | (pr_null <= .5 & y_null == 1)) lrt.p <- 1 - stats::pchisq( q = model$null.deviance - model$deviance, df = model$df.null - model$df.residual, lower.tail = TRUE ) lrt.chisq <- 2 * abs(stats::logLik(model) - stats::logLik(m0)) structure( class = "performance_pcp", list( pcp_model = pcp_full, model_ci_low = pcp_full - stats::qnorm((1 + ci) / 2) * sqrt(pcp_full * (1 - pcp_full) / n_full), model_ci_high = pcp_full + stats::qnorm((1 + ci) / 2) * sqrt(pcp_full * (1 - pcp_full) / n_full), pcp_m0 = pcp_null, null_ci_low = pcp_null - stats::qnorm((1 + ci) / 2) * sqrt(pcp_null * (1 - pcp_null) / n_null), null_ci_high = pcp_null + stats::qnorm((1 + ci) / 2) * sqrt(pcp_null * (1 - pcp_null) / n_null), lrt_chisq = as.vector(lrt.chisq), lrt_p = lrt.p ) ) } performance/R/model_performance.bayesian.R0000644000176200001440000001106713615752156020372 0ustar liggesusers#' Performance of Bayesian Models #' #' Compute indices of model performance for (general) linear models. #' #' @param model Object of class \code{stanreg} or \code{brmsfit}. #' @param metrics Can be \code{"all"}, \code{"common"} or a character vector of metrics to be computed (some of \code{c("LOOIC", "WAIC", "R2", "R2_adj", "RMSE", "LOGLOSS", "SCORE")}). \code{"common"} will compute LOOIC, WAIC, R2 and RMSE. #' @param ... Arguments passed to or from other methods. #' @inheritParams model_performance.lm #' #' @return A data frame (with one row) and one column per "index" (see \code{metrics}). #' #' @details Depending on \code{model}, following indices are computed: #' \itemize{ #' \item{\strong{ELPD}} {expected log predictive density, see \code{\link{looic}}} #' \item{\strong{LOOIC}} {leave-one-out cross-validation (LOO) information criterion, see \code{\link{looic}}} #' \item{\strong{WAIC}} {widely applicable information criterion, see \code{loo::waic}} #' \item{\strong{R2}} {r-squared value, see \code{\link{r2}}} #' \item{\strong{R2_LOO_adjusted}} {adjusted r-squared, see \code{\link{r2}}} #' \item{\strong{RMSE}} {root mean squared error, see \code{\link{performance_rmse}}} #' \item{\strong{LOGLOSS}} {Log-loss, see \code{\link{performance_logloss}}} #' \item{\strong{SCORE_LOG}} {score of logarithmic proper scoring rule, see \code{\link{performance_score}}} #' \item{\strong{SCORE_SPHERICAL}} {score of spherical proper scoring rule, see \code{\link{performance_score}}} #' \item{\strong{PCP}} {percentage of correct predictions, see \code{\link{performance_pcp}}} #' } #' #' @examples #' if (require("rstanarm")) { #' model <- stan_glm(mpg ~ wt + cyl, data = mtcars, chains = 1, iter = 500, refresh = 0) #' model_performance(model) #' #' model <- stan_glmer( #' mpg ~ wt + cyl + (1 | gear), #' data = mtcars, #' chains = 1, #' iter = 500, #' refresh = 0 #' ) #' model_performance(model) #' } #' @seealso \link{r2_bayes} #' @references Gelman, A., Goodrich, B., Gabry, J., & Vehtari, A. (2018). R-squared for Bayesian regression models. The American Statistician, The American Statistician, 1-6. #' #' @importFrom insight find_algorithm #' @importFrom bayestestR map_estimate hdi #' @importFrom stats AIC BIC mad median sd setNames #' @export model_performance.stanreg <- function(model, metrics = "all", verbose = TRUE, ...) { if (all(metrics == "all")) { metrics <- c("LOOIC", "WAIC", "R2", "R2_adjusted", "RMSE", "LOGLOSS", "SCORE") } else if (all(metrics == "common")) { metrics <- c("LOOIC", "WAIC", "R2", "R2_adj", "RMSE") } algorithm <- insight::find_algorithm(model) if (algorithm$algorithm != "sampling") { if (verbose) warning("`model_performance()` only possible for models fit using the 'sampling' algorithm.", call. = FALSE) return(NULL) } if (!requireNamespace("loo", quietly = TRUE)) { stop("Package `loo` required for this function to work. Please install it.") } mi <- insight::model_info(model) out <- list() attri <- list() if ("LOOIC" %in% c(metrics)) { out <- append(out, suppressWarnings(looic(model))) } if ("WAIC" %in% c(metrics)) { out$WAIC <- suppressWarnings(loo::waic(model)$estimates["waic", "Estimate"]) } if ("R2" %in% c(metrics)) { r2 <- r2_bayes(model, ...) attri$r2_bayes <- attributes(r2) # save attributes # Format to df then to list r2_df <- as.data.frame(t(as.numeric(r2))) names(r2_df) <- gsub("_Bayes", "", names(r2), fixed = TRUE) out <- append(out, as.list(r2_df)) } if ("R2_adjusted" %in% c(metrics) && mi$is_linear) { out$R2_adjusted <- suppressWarnings(r2_loo(model)) } if ("RMSE" %in% c(metrics) && !mi$is_ordinal && !mi$is_multinomial && !mi$is_categorical) { out$RMSE <- performance_rmse(model, verbose = verbose) } if (("LOGLOSS" %in% metrics) && mi$is_binomial) { out$LOGLOSS <- performance_logloss(model, verbose = verbose) } if (("SCORE" %in% metrics) && (mi$is_binomial || mi$is_count)) { .scoring_rules <- performance_score(model, verbose = verbose) if (!is.na(.scoring_rules$logarithmic)) out$SCORE_LOG <- .scoring_rules$logarithmic if (!is.na(.scoring_rules$spherical)) out$SCORE_SPHERICAL <- .scoring_rules$spherical } # TODO: What with sigma and deviance? out <- as.data.frame(out) row.names(out) <- NULL attributes(out) <- c(attributes(out), attri) class(out) <- c("performance_model", class(out)) out } #' @export model_performance.brmsfit <- model_performance.stanreg performance/R/check_singularity.R0000644000176200001440000001300113611533123016577 0ustar liggesusers#' @title Check mixed models for boundary fits #' @name check_singularity #' #' @description Check mixed models for boundary fits. #' #' @param x A mixed model. #' @param tolerance Indicates up to which value the convergence result is #' accepted. The larger \code{tolerance} is, the stricter the test #' will be. #' @param ... Currently not used. #' #' @return \code{TRUE} if the model fit is singular. #' #' @details If a model is "singular", this means that some dimensions of the #' variance-covariance matrix have been estimated as exactly zero. This #' often occurs for mixed models with complex random effects structures. #' \cr \cr #' \dQuote{While singular models are statistically well defined (it is theoretically #' sensible for the true maximum likelihood estimate to correspond to a #' singular fit), there are real concerns that (1) singular fits correspond #' to overfitted models that may have poor power; (2) chances of numerical #' problems and mis-convergence are higher for singular models (e.g. it #' may be computationally difficult to compute profile confidence intervals #' for such models); (3) standard inferential procedures such as Wald #' statistics and likelihood ratio tests may be inappropriate.} #' (\cite{lme4 Reference Manual}) #' \cr \cr #' There is no gold-standard about how to deal with singularity and which #' random-effects specification to choose. Beside using fully Bayesian methods #' (with informative priors), proposals in a frequentist framework are: #' \itemize{ #' \item avoid fitting overly complex models, such that the variance-covariance matrices can be estimated precisely enough (\cite{Matuschek et al. 2017}) #' \item use some form of model selection to choose a model that balances predictive accuracy and overfitting/type I error (\cite{Bates et al. 2015}, \cite{Matuschek et al. 2017}) #' \item \dQuote{keep it maximal}, i.e. fit the most complex model consistent with the experimental design, removing only terms required to allow a non-singular fit (\cite{Barr et al. 2013}) #' } #' #' @references \itemize{ #' \item Bates D, Kliegl R, Vasishth S, Baayen H. Parsimonious Mixed Models. arXiv:1506.04967, June 2015. #' \item Barr DJ, Levy R, Scheepers C, Tily HJ. Random effects structure for confirmatory hypothesis testing: Keep it maximal. Journal of Memory and Language, 68(3):255-278, April 2013. #' \item Matuschek H, Kliegl R, Vasishth S, Baayen H, Bates D. Balancing type I error and power in linear mixed models. Journal of Memory and Language, 94:305-315, 2017. #' \item lme4 Reference Manual, \url{https://cran.r-project.org/package=lme4} #' } #' #' @examples #' if (require("lme4")) { #' data(sleepstudy) #' set.seed(123) #' sleepstudy$mygrp <- sample(1:5, size = 180, replace = TRUE) #' sleepstudy$mysubgrp <- NA #' for (i in 1:5) { #' filter_group <- sleepstudy$mygrp == i #' sleepstudy$mysubgrp[filter_group] <- #' sample(1:30, size = sum(filter_group), replace = TRUE) #' } #' #' model <- lmer( #' Reaction ~ Days + (1 | mygrp / mysubgrp) + (1 | Subject), #' data = sleepstudy #' ) #' #' check_singularity(model) #' } #' @export check_singularity <- function(x, tolerance = 1e-5, ...) { UseMethod("check_singularity") } #' @export check_singularity.merMod <- function(x, tolerance = 1e-5, ...) { if (!requireNamespace("lme4", quietly = TRUE)) { stop("Package `lme4` needed for this function to work. Please install it.") } theta <- lme4::getME(x, "theta") # diagonal elements are identifiable because they are fitted # with a lower bound of zero ... diag.element <- lme4::getME(x, "lower") == 0 any(abs(theta[diag.element]) < tolerance) } #' @export check_singularity.rlmerMod <- check_singularity.merMod #' @export check_singularity.glmmTMB <- function(x, tolerance = 1e-5, ...) { if (!requireNamespace("lme4", quietly = TRUE)) { stop("Package `lme4` needed for this function to work. Please install it.") } vc <- .collapse_cond(lme4::VarCorr(x)) any(sapply(vc, function(.x) any(abs(diag(.x)) < tolerance))) } #' @export check_singularity.glmmadmb <- check_singularity.glmmTMB #' @export check_singularity.clmm <- function(x, tolerance = 1e-5, ...) { if (!requireNamespace("ordinal", quietly = TRUE)) { stop("Package `ordinal` needed for this function to work. Please install it.") } vc <- ordinal::VarCorr(x) any(sapply(vc, function(.x) any(abs(diag(.x)) < tolerance))) } #' @export check_singularity.cpglmm <- function(x, tolerance = 1e-5, ...) { if (!requireNamespace("cplm", quietly = TRUE)) { stop("Package `cplm` needed for this function to work. Please install it.") } vc <- cplm::VarCorr(x) any(sapply(vc, function(.x) any(abs(diag(.x)) < tolerance))) } #' @export check_singularity.MixMod <- function(x, tolerance = 1e-5, ...) { any(sapply(diag(x$D), function(.x) any(abs(.x) < tolerance))) } #' @importFrom stats na.omit #' @export check_singularity.lme <- function(x, tolerance = 1e-5, ...) { if (!requireNamespace("nlme", quietly = TRUE)) { stop("Package `nlme` needed for this function to work. Please install it.") } any(abs(stats::na.omit(as.numeric(diag(nlme::getVarCov(x)))) < tolerance)) } #' @export check_singularity.default <- function(x, ...) { FALSE } .collapse_cond <- function(x) { if (is.list(x) && "cond" %in% names(x)) { x[["cond"]] } else { x } } performance/R/cronbachs_alpha.R0000644000176200001440000000507113616476346016231 0ustar liggesusers#' @title Cronbach's Alpha for Items or Scales #' @name cronbachs_alpha #' #' @description Compute various measures of internal consistencies #' for tests or item-scales of questionnaires. #' #' @param x A matrix or a data frame. #' #' @return The Cronbach's Alpha value for \code{x}. #' #' @details The Cronbach's Alpha value for \code{x}. A value closer to 1 #' indicates greater internal consistency, where usually following #' rule of thumb is applied to interpret the results: #' \ifelse{html}{\out{α}}{\eqn{\alpha}{alpha}} < 0.5 is unacceptable, #' 0.5 < \ifelse{html}{\out{α}}{\eqn{\alpha}{alpha}} < 0.6 is poor, #' 0.6 < \ifelse{html}{\out{α}}{\eqn{\alpha}{alpha}} < 0.7 is questionable, #' 0.7 < \ifelse{html}{\out{α}}{\eqn{\alpha}{alpha}} < 0.8 is acceptable, #' and everything > 0.8 is good or excellent. #' #' @examples #' data(mtcars) #' x <- mtcars[, c("cyl", "gear", "carb", "hp")] #' cronbachs_alpha(x) #' @importFrom stats var na.omit #' @export cronbachs_alpha <- function(x) { UseMethod("cronbachs_alpha") } #' @export cronbachs_alpha.data.frame <- function(x) { # remove missings .data <- stats::na.omit(x) # we need at least two columns for Cronach's Alpha if (is.null(ncol(.data)) || ncol(.data) < 2) { warning("Too less columns in `x` to compute Cronbach's Alpha.", call. = F) return(NULL) } # Compute Cronbach's Alpha dim(.data)[2] / (dim(.data)[2] - 1) * (1 - sum(apply(.data, 2, stats::var)) / stats::var(rowSums(.data))) } #' @export cronbachs_alpha.parameters_pca <- function(x) { pca_data <- attr(x, "data") if (is.null(pca_data)) { warning("Could not find data frame that was used for the PCA.", call. = FALSE) return(NULL) } # fetch data used for the PCA pca_data <- get(pca_data, envir = parent.frame()) # get columns from parameters_pca-object where loadings are saved loadings_columns <- attributes(x)$loadings_columns # find component with max loading for each variable factor_assignment <- apply(x[, loadings_columns], 1, function(i) which.max(abs(i))) # sort and get unique IDs so we only get data from relevant columns unique_factors <- sort(unique(factor_assignment)) # apply cronbach's alpha for each component, # only for variables with max loading cronb <- sapply(unique_factors, function(i) { cronbachs_alpha(pca_data[, as.vector(x$Variable[factor_assignment == i]), drop = FALSE]) }) names(cronb) <- colnames(x)[loadings_columns[unique_factors]] unlist(cronb) } performance/R/item_reliability.R0000644000176200001440000000614413564746345016454 0ustar liggesusers#' @title Reliability Test for Items or Scales #' @name item_reliability #' #' @description Compute various measures of internal consistencies #' for tests or item-scales of questionnaires. #' #' @param x A matrix or a data frame. #' @param standardize Logical, if \code{TRUE}, the data frame's vectors will be #' standardized. Recommended when the variables have different measures / scales. #' @param digits Amount of digits for returned values. #' #' @return A data frame with the corrected item-total correlations (\emph{item #' discrimination}, column \code{item_discrimination}) and Cronbach's Alpha #' (if item deleted, column \code{alpha_if_deleted}) for each item #' of the scale, or \code{NULL} if data frame had too less columns. #' #' @details This function calculates the item discriminations (corrected item-total #' correlations for each item of \code{x} with the remaining items) and #' the Cronbach's alpha for each item, if it was deleted from the scale. #' The absolute value of the item discrimination indices should be #' above 0.1. An index between 0.1 and 0.3 is considered as "fair", #' while an index above 0.3 (or below -0.3) is "good". Items with #' low discrimination indices are often ambiguously worded and #' should be examined. Items with negative indices should be #' examined to determine why a negative value was obtained (e.g. #' reversed answer categories regarding positive and negative poles). #' #' @examples #' data(mtcars) #' x <- mtcars[, c("cyl", "gear", "carb", "hp")] #' item_reliability(x) #' @importFrom stats cor var na.omit #' @export item_reliability <- function(x, standardize = FALSE, digits = 3) { # check param if (!is.matrix(x) && !is.data.frame(x)) { warning("`x` needs to be a data frame or matrix.", call. = F) return(NULL) } # remove missings, so correlation works x <- stats::na.omit(x) # remember item (column) names for return value # return value gets column names of initial data frame df.names <- colnames(x) ret.df <- NULL # check for minimum amount of columns can't be less than 3, because the # reliability test checks for Cronbach's alpha if a specific item is deleted. # If data frame has only two columns and one is deleted, Cronbach's alpha # cannot be calculated. if (ncol(x) > 2) { # Check whether items should be scaled. Needed, # when items have different measures / scales if (standardize) x <- .std(x) # calculate cronbach-if-deleted cronbachDeleted <- sapply(seq_len(ncol(x)), function(i) cronbachs_alpha(x[, -i])) # calculate corrected total-item correlation totalCorr <- sapply(seq_len(ncol(x)), function(i) stats::cor(x[, i], apply(x[, -i], 1, sum), use = "pairwise.complete.obs")) ret.df <- data.frame( term = df.names, alpha_if_deleted = round(cronbachDeleted, digits), item_discrimination = round(totalCorr, digits), stringsAsFactors = FALSE ) } else { warning("Data frame needs at least three columns for reliability-test.", call. = F) } ret.df } performance/R/logLik.R0000644000176200001440000000344113614040623014321 0ustar liggesusers#' @export logLik.ivreg <- function(object, ...) { res <- object$residuals p <- object$rank w <- object$weights N <- length(res) if (is.null(w)) { w <- rep.int(1, N) } else { excl <- w == 0 if (any(excl)) { res <- res[!excl] N <- length(res) w <- w[!excl] } } N0 <- N val <- 0.5 * (sum(log(w)) - N * (log(2 * pi) + 1 - log(N) + log(sum(w * res^2)))) attr(val, "nall") <- N0 attr(val, "nobs") <- N attr(val, "df") <- p + 1 class(val) <- "logLik" val } #' @importFrom insight find_parameters #' @export logLik.plm <- function(object, ...) { res <- object$residuals w <- object$weights N <- length(res) if (is.null(w)) { w <- rep.int(1, N) } else { excl <- w == 0 if (any(excl)) { res <- res[!excl] N <- length(res) w <- w[!excl] } } N0 <- N val <- 0.5 * (sum(log(w)) - N * (log(2 * pi) + 1 - log(N) + log(sum(w * res^2)))) attr(val, "nall") <- N0 attr(val, "nobs") <- N attr(val, "df") <- length(insight::find_parameters(object, effects = "fixed", flatten = TRUE)) class(val) <- "logLik" val } #' @export logLik.cpglm <- logLik.plm #' @importFrom stats residuals #' @export logLik.iv_robust <- function(object, ...) { res <- stats::residuals(object) p <- object$rank w <- object$weights N <- length(res) if (is.null(w)) { w <- rep.int(1, N) } else { excl <- w == 0 if (any(excl)) { res <- res[!excl] N <- length(res) w <- w[!excl] } } N0 <- N val <- 0.5 * (sum(log(w)) - N * (log(2 * pi) + 1 - log(N) + log(sum(w * res^2)))) attr(val, "nall") <- N0 attr(val, "nobs") <- N attr(val, "df") <- p + 1 class(val) <- "logLik" val } performance/R/r2_mcfadden.R0000644000176200001440000000601213611533123015240 0ustar liggesusers#' @title McFadden's R2 #' @name r2_mcfadden #' #' @description Calculates McFadden's pseudo R2. #' #' @param model Generalized linear or multinomial logit (\code{mlogit}) model. #' #' @return For most models, a list with McFadden's R2 and adjusted McFadden's #' R2 value. For some models, only McFadden's R2 is available. #' #' @references #' \itemize{ #' \item McFadden, D. (1987). Regression-based specification tests for the multinomial logit model. Journal of econometrics, 34(1-2), 63-82. #' \item McFadden, D. (1973). Conditional logit analysis of qualitative choice behavior. #' } #' #' @examples #' if (require("mlogit")) { #' data("Fishing", package = "mlogit") #' Fish <- mlogit.data(Fishing, varying = c(2:9), shape = "wide", choice = "mode") #' #' model <- mlogit(mode ~ price + catch, data = Fish) #' r2_mcfadden(model) #' } #' @importFrom insight find_parameters #' @importFrom stats logLik update #' @export r2_mcfadden <- function(model) { UseMethod("r2_mcfadden") } # helper ----------------------- .r2_mcfadden <- function(model, l_null) { l_full <- stats::logLik(model) k <- length(insight::find_parameters(model)) mcfadden <- 1 - (as.vector(l_full) / as.vector(l_null)) mcfadden_adjusted <- 1 - ((as.vector(l_full) - k) / as.vector(l_null)) out <- list( R2 = c(`McFadden's R2` = mcfadden), R2_adjusted = c(`adjusted McFadden's R2` = mcfadden_adjusted) ) attr(out, "model_type") <- "Generalized Linear" structure(class = "r2_generic", out) } # r2 via loglik and update -------------------------- #' @export r2_mcfadden.glm <- function(model) { l_null <- stats::logLik(stats::update(model, ~1)) .r2_mcfadden(model, l_null) } #' @export r2_mcfadden.clm <- r2_mcfadden.glm #' @export r2_mcfadden.cpglm <- r2_mcfadden.glm #' @export r2_mcfadden.glmx <- r2_mcfadden.glm #' @export r2_mcfadden.polr <- r2_mcfadden.glm #' @export r2_mcfadden.bracl <- r2_mcfadden.glm #' @export r2_mcfadden.brmultinom <- r2_mcfadden.glm #' @export r2_mcfadden.mclogit <- r2_mcfadden.glm #' @export r2_mcfadden.censReg <- r2_mcfadden.glm #' @export r2_mcfadden.truncreg <- r2_mcfadden.glm # special models ------------------------------------------- #' @export r2_mcfadden.vglm <- function(model) { if (!(is.null(model@call$summ) && !identical(model@call$summ, 0))) { stop("Can't get log-likelihood when `summ` is not zero.", call. = FALSE) } l_null <- stats::logLik(stats::update(model, ~1)) .r2_mcfadden(model, l_null) } #' @export r2_mcfadden.clm2 <- function(model) { l_null <- stats::logLik(stats::update(model, location = ~1, scale = ~1)) .r2_mcfadden(model, l_null) } #' @export r2_mcfadden.multinom <- function(model) { l_null <- stats::logLik(stats::update(model, ~1, trace = FALSE)) .r2_mcfadden(model, l_null) } #' @export r2_mcfadden.mlogit <- function(model) { R2 <- as.vector(summary(model)$mfR2) names(R2) <- "McFadden's R2" R2 } performance/R/compare_performance.R0000644000176200001440000001477113620052564017123 0ustar liggesusers#' @title Compare performance of different models #' @name compare_performance #' #' @description \code{compare_performance()} computes indices of model performance for #' different models at once and hence allows comparison of indices across models. #' #' @param ... Multiple model objects (also of different classes). #' @param metrics Can be \code{"all"}, \code{"common"} or a character vector of metrics to be computed. See related \link[=model_performance]{documentation} of object's class for details. #' @param rank Logical, if \code{TRUE}, models are ranked according to "best overall #' model performance". See 'Details'. #' #' @return A data frame (with one row per model) and one column per "index" (see \code{metrics}). #' #' @note There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. #' #' @details \subsection{Bayes factor for Model Comparison}{ #' If all models were fit from the same data, \code{compare_performance()} #' returns an additional column named \code{BF}, which shows the Bayes factor #' (see \code{\link[bayestestR]{bayesfactor_models}}) for each model against #' the denominator model. The \emph{first} model is used as denominator model, #' and its Bayes factor is set to \code{NA} to indicate the reference model. #' } #' \subsection{Ranking Models}{ #' When \code{rank = TRUE}, a new column \code{Performance_Score} is returned. This #' score ranges from 0\% to 100\%, higher values indicating better model performance. #' Calculation is based on normalizing all indices (i.e. rescaling them to a #' range from 0 to 1), and taking the mean value of all indices for each model. #' This is a rather quick heuristic, but might be helpful as exploratory index. #' \cr \cr #' In particular when models are of different types (e.g. mixed models, classical #' linear models, logistic regression, ...), not all indices will be computed #' for each model. In case where an index can't be calculated for a specific #' model type, this model gets an \code{NA} value. All indices that have any #' \code{NA}s are excluded from calculating the performance score. #' \cr \cr #' There is a \code{plot()}-method for \code{compare_performance()}, #' which creates a "spiderweb" plot, where the different indices are #' normalized and larger values indicate better model performance. #' Hence, points closer to the center indicate worse fit indices #' (see \href{https://easystats.github.io/see/articles/performance.html}{online-documentation} #' for more details). #' } #' #' @examples #' if (require("lme4")) { #' m1 <- lm(mpg ~ wt + cyl, data = mtcars) #' m2 <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' m3 <- lmer(Petal.Length ~ Sepal.Length + (1 | Species), data = iris) #' compare_performance(m1, m2, m3) #' } #' #' data(iris) #' lm1 <- lm(Sepal.Length ~ Species, data = iris) #' lm2 <- lm(Sepal.Length ~ Species + Petal.Length, data = iris) #' lm3 <- lm(Sepal.Length ~ Species * Petal.Length, data = iris) #' compare_performance(lm1, lm2, lm3) #' compare_performance(lm1, lm2, lm3, rank = TRUE) #' @importFrom insight is_model_supported all_models_equal get_response #' @importFrom bayestestR bayesfactor_models #' @inheritParams model_performance.lm #' @export compare_performance <- function(..., metrics = "all", rank = FALSE, verbose = TRUE) { objects <- list(...) object_names <- match.call(expand.dots = FALSE)$`...` supported_models <- sapply(objects, function(i) insight::is_model_supported(i) | inherits(i, "lavaan")) if (!all(supported_models)) { warning(sprintf("Following objects are not supported: %s", paste0(object_names[!supported_models], collapse = ", "))) objects <- objects[supported_models] object_names <- object_names[supported_models] } m <- mapply(function(.x, .y) { dat <- model_performance(.x, metrics = metrics, verbose = FALSE) cbind(data.frame(Model = as.character(.y), Type = class(.x)[1], stringsAsFactors = FALSE), dat) }, objects, object_names, SIMPLIFY = FALSE) # check for identical model class, for bayesfactor BFs <- tryCatch( { bayestestR::bayesfactor_models(..., denominator = 1, verbose = FALSE) }, error = function(e) { NULL } ) dfs <- Reduce(function(x, y) merge(x, y, all = TRUE, sort = FALSE), m) if (!is.null(BFs)) { dfs$BF <- BFs$BF dfs$BF[dfs$Model == object_names[1]] <- NA } # check if all models were fit from same data resps <- lapply(objects, insight::get_response) if (!all(sapply(resps[-1], function(x) identical(x, resps[[1]]))) && verbose) { warning("When comparing models, please note that probably not all models were fit from same data.", call. = FALSE) } # create "ranking" of models if (isTRUE(rank)) { dfs <- .rank_performance_indices(dfs, verbose) } # dfs[order(sapply(object_names, as.character), dfs$Model), ] class(dfs) <- c("compare_performance", "see_compare_performance", class(dfs)) dfs } .rank_performance_indices <- function(x, verbose) { # all models comparable? if (length(unique(x$Type)) > 1 && isTRUE(verbose)) { warning("Models are not of same type. Comparison of indices might be not meaningful.", call. = FALSE) } # set reference for Bayes factors to 1 if ("BF" %in% colnames(x)) x$BF[is.na(x$BF)] <- 1 out <- x # normalize indices, for comparison out[] <- lapply(out, function(i) { if (is.numeric(i)) i <- .normalize_vector(i) i }) # recode some indices, so higher values = better fit for (i in c("AIC", "BIC", "RMSE")) { if (i %in% colnames(out)) { out[[i]] <- 1 - out[[i]] } } # any indices with NA? missing_indices <- sapply(out, anyNA) if (any(missing_indices) && isTRUE(verbose)) { warning(sprintf( "Following indices with missing values are not used for ranking: %s", paste0(colnames(out)[missing_indices], collapse = ", ") ), call. = FALSE) } # create rank-index, only for complete indices numeric_columns <- sapply(out, function(i) is.numeric(i) & !anyNA(i)) rank_index <- rowMeans(out[numeric_columns], na.rm = TRUE) x$Performance_Score <- rank_index x <- x[order(rank_index, decreasing = TRUE), ] rownames(x) <- NULL x } .normalize_vector <- function(x) { as.vector((x - min(x, na.rm = TRUE)) / diff(range(x, na.rm = TRUE), na.rm = TRUE)) } performance/R/check_distribution.R0000644000176200001440000001176613620052564016771 0ustar liggesusers#' Machine learning model trained to classify distributions #' #' Mean accuracy and Kappa of 0.86 and 0.85, repsectively. #' "classify_distribution" #' Classify the distribution of a model-family using machine learning #' #' Choosing the right distributional family for regression models is essential #' to get more accurate estimates and standard errors. This function may help to #' check a models' distributional family and see if the model-family probably #' should be reconsidered. Since it is difficult to exactly predict the correct #' model family, consider this function as somewhat experimental. #' #' @param model Typically, a model (that should response to \code{residuals()}). #' May also be a numeric vector. #' #' @note This function is somewhat experimental and might be improved in future releases. #' The final decision on the model-family should also be based on theoretical #' aspects and other information about the data and the model. #' \cr \cr #' There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. #' #' @details This function uses an internal random forest model to classify the #' distribution from a model-family. Currently, following distributions are #' trained (i.e. results of \code{check_distribution()} may be one of the following): #' \code{"bernoulli"}, \code{"beta"}, \code{"beta-binomial"}, \code{"binomial"}, #' \code{"chi"}, \code{"exponential"}, \code{"F"}, \code{"gamma"}, \code{"lognormal"}, #' \code{"normal"}, \code{"negative binomial"}, \code{"negative binomial (zero-inflated)"}, #' \code{"pareto"}, \code{"poisson"}, \code{"poisson (zero-inflated)"}, #' \code{"uniform"} and \code{"weibull"}. #' \cr \cr #' Note the similarity between certain distributions according to shape, skewness, #' etc. Thus, the predicted distribution may not be perfectly representing the #' distributional family of the underlying fitted model, or the response value. #' \cr \cr #' There is a \code{plot()} method, which shows the probabilities of all predicted #' distributions, however, only if the probability is greater than zero. #' #' @examples #' if (require("lme4")) { #' library(lme4) #' library(parameters) #' data(sleepstudy) #' #' model <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy) #' check_distribution(model) #' plot(check_distribution(model)) #' } #' @importFrom bayestestR map_estimate #' @importFrom stats IQR density predict sd mad residuals #' @importFrom insight get_response #' @export check_distribution <- function(model) { UseMethod("check_distribution") } #' @export check_distribution.numeric <- function(model) { if (!requireNamespace("randomForest", quietly = TRUE)) { stop("Package `randomForest` required for this function to work. Please install it.", call. = FALSE) } dat <- .extract_features(model) dist <- as.data.frame(t(stats::predict(classify_distribution, dat, type = "prob"))) out <- data.frame( Distribution = rownames(dist), p_Vector = dist[[1]], stringsAsFactors = FALSE, row.names = NULL ) class(out) <- unique(c("check_distribution_numeric", "see_check_distribution_numeric", class(out))) attr(out, "data") <- model out } #' @export check_distribution.default <- function(model) { if (!requireNamespace("randomForest", quietly = TRUE)) { stop("Package `randomForest` required for this function to work. Please install it.", call. = FALSE) } x <- stats::residuals(model) # x_scaled <- .normalize(x) dat <- .extract_features(x) dist_residuals <- as.data.frame(t(stats::predict(classify_distribution, dat, type = "prob"))) # Extract features x <- .factor_to_numeric(insight::get_response(model)) dat <- .extract_features(x) dist_response <- as.data.frame(t(stats::predict(classify_distribution, dat, type = "prob"))) out <- data.frame( Distribution = rownames(dist_response), p_Residuals = dist_residuals[[1]], p_Response = dist_response[[1]], stringsAsFactors = FALSE, row.names = NULL ) class(out) <- unique(c("check_distribution", "see_check_distribution", class(out))) attr(out, "object_name") <- deparse(substitute(model), width.cutoff = 500) out } .extract_features <- function(x) { data.frame( "SD" = stats::sd(x), "MAD" = stats::mad(x, constant = 1), "Mean_Median_Distance" = mean(x) - median(x), "Mean_Mode_Distance" = mean(x) - as.numeric(bayestestR::map_estimate(x, bw = "nrd0")), "SD_MAD_Distance" = stats::sd(x) - stats::mad(x, constant = 1), "Var_Mean_Distance" = stats::var(x) - mean(x), "Range_SD" = diff(range(x)) / stats::sd(x), "Range" = diff(range(x)), "IQR" = stats::IQR(x), "Skewness" = .skewness(x), "Kurtosis" = .kurtosis(x), "Uniques" = length(unique(x)) / length(x), "N_Uniques" = length(unique(x)), "Min" = min(x), "Max" = max(x) ) } performance/R/skewness_kurtosis.R0000644000176200001440000000167013564746345016731 0ustar liggesusers.skewness <- function(x) { if (is.matrix(x)) { apply(x, 2, .skewness_numeric) } else if (is.vector(x)) { .skewness_numeric(x) } else if (is.data.frame(x)) { sapply(x, .skewness_numeric) } else { .skewness_numeric(as.vector(x)) } } .skewness_numeric <- function(x) { x <- x[!is.na(x)] n <- length(x) (sum((x - mean(x))^3) / n) / (sum((x - mean(x))^2) / n)^(3 / 2) } .kurtosis <- function(x) { if (is.matrix(x)) { apply(x, 2, .kurtosis_numeric) } else if (is.vector(x)) { .kurtosis_numeric(x) } else if (is.data.frame(x)) { sapply(x, .kurtosis_numeric) } else { .kurtosis_numeric(as.vector(x)) } } .kurtosis_numeric <- function(x) { x <- x[!is.na(x)] n <- length(x) n * sum((x - mean(x))^4) / (sum((x - mean(x))^2)^2) } .normalize <- function(x) { as.vector((x - min(x, na.rm = TRUE)) / diff(range(x, na.rm = TRUE), na.rm = TRUE)) } performance/R/r2_loo.R0000644000176200001440000000373013611533123014274 0ustar liggesusers#' @title LOO-adjusted R2 #' @name r2_loo #' #' @description Compute LOO-adjusted R2. #' #' @param model A Bayesian regression model. #' #' @return The LOO-adjusted R2 for \code{model}, as numeric value. #' #' @details Unlike \code{\link{r2_bayes}}, which returns an "unadjusted" R2 value, #' \code{r2_loo()} calculates a LOO-adjusted R2, which comes conceptionally #' closer to an "adjusted" R2 measure. #' #' @examples #' if (require("rstanarm")) { #' model <- stan_glm(mpg ~ wt + cyl, data = mtcars, chains = 1, iter = 500, refresh = 0) #' r2_loo(model) #' } #' @importFrom insight get_response find_algorithm #' @importFrom stats var #' @export r2_loo <- function(model) { if (!requireNamespace("rstantools", quietly = TRUE)) { stop("Package `rstantools` needed for this function to work. Please install it.", call. = FALSE) } if (!requireNamespace("loo", quietly = TRUE)) { stop("Package `loo` needed for this function to work. Please install it.", call. = FALSE) } y <- insight::get_response(model) ypred <- rstantools::posterior_linpred(model) # for some weird models, not all response values can be # predicted, resulting in different lengths between y and ypred if (length(y) > ncol(ypred)) { tryCatch( { y <- y[as.numeric(attr(ypred, "dimnames")[[2]])] }, error = function(x) { NULL } ) } ll <- rstantools::log_lik(model) algorithm <- insight::find_algorithm(model) .n_chains <- algorithm$chains .n_samples <- (algorithm$iterations - algorithm$warmup) * algorithm$chains r_eff <- loo::relative_eff( exp(ll), chain_id = rep(1:.n_chains, each = .n_samples / .n_chains) ) psis_object <- loo::psis(log_ratios = -ll, r_eff = r_eff) ypredloo <- loo::E_loo(ypred, psis_object, log_ratios = -ll)$value eloo <- ypredloo - y loor2 <- 1 - stats::var(eloo) / stats::var(y) names(loor2) <- "LOO-adjusted R2" loor2 } performance/R/r2.R0000644000176200001440000002143013616500714013425 0ustar liggesusers#' @title Compute the model's R2 #' @name r2 #' #' @description Calculate the R2 value for different model objects. Depending #' on the model, R2, pseudo-R2 or marginal / adjusted R2 values are returned. #' #' @param model A statistical model. #' @param ... Currently not used. #' #' @return Returns a list containing values related to the most appropriate R2 #' for the given model. See the list below: #' \itemize{ #' \item Logistic models: \link[=r2_tjur]{Tjur's R2} #' \item General linear models: \link[=r2_nagelkerke]{Nagelkerke's R2} #' \item Multinomial Logit: \link[=r2_mcfadden]{McFadden's R2} #' \item Models with zero-inflation: \link[=r2_zeroinflated]{R2 for zero-inflated models} #' \item Mixed models: \link[=r2_nakagawa]{Nakagawa's R2} #' \item Bayesian models: \link[=r2_bayes]{R2 bayes} #' } #' #' @seealso \code{\link{r2_bayes}}, \code{\link{r2_coxsnell}}, \code{\link{r2_kullback}}, #' \code{\link{r2_loo}}, \code{\link{r2_mcfadden}}, \code{\link{r2_nagelkerke}}, #' \code{\link{r2_nakagawa}}, \code{\link{r2_tjur}}, \code{\link{r2_xu}} and #' \code{\link{r2_zeroinflated}}. #' #' @examples #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' r2(model) #' #' if (require("lme4")) { #' model <- lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) #' r2(model) #' } #' @export r2 <- function(model, ...) { UseMethod("r2") } # Default models ----------------------------------------------- #' @importFrom insight print_color #' @export r2.default <- function(model, ...) { insight::print_color(sprintf("'r2()' does not support models of class '%s'.\n", class(model)[1]), "red") return(NA) } #' @importFrom stats pf #' @export r2.lm <- function(model, ...) { model_summary <- summary(model) out <- list( R2 = model_summary$r.squared, R2_adjusted = model_summary$adj.r.squared ) names(out$R2) <- "R2" names(out$R2_adjusted) <- "adjusted R2" f.stat <- model_summary$fstatistic[1] DoF <- model_summary$fstatistic[2] DoF_residual <- model_summary$fstatistic[3] if (!is.null(f.stat)) { attr(out, "p") <- stats::pf(f.stat, DoF, DoF_residual, lower.tail = FALSE) attr(out, "F") <- f.stat attr(out, "df") <- DoF attr(out, "df_residual") <- DoF_residual } attr(out, "model_type") <- "Linear" structure(class = "r2_generic", out) } #' @importFrom insight model_info #' @export r2.glm <- function(model, ...) { if (insight::model_info(model)$is_logit) { list("R2_Tjur" = r2_tjur(model)) } else { list("R2_Nagelkerke" = r2_nagelkerke(model)) } } #' @export r2.glmx <- r2.glm # Cox & Snell R2 --------------------- #' @export r2.BBreg <- function(model, ...) { list("R2_CoxSnell" = r2_coxsnell(model)) } #' @export r2.crch <- r2.BBreg # Nagelkerke R2 ---------------------- #' @export r2.censReg <- function(model, ...) { list("R2_Nagelkerke" = r2_nagelkerke(model)) } #' @export r2.cpglm <- r2.censReg #' @export r2.clm <- r2.censReg #' @export r2.clm2 <- r2.censReg #' @export r2.coxph <- r2.censReg #' @export r2.multinom <- r2.censReg #' @export r2.mclogit <- r2.censReg #' @export r2.polr <- r2.censReg #' @export r2.survreg <- r2.censReg #' @export r2.truncreg <- r2.censReg #' @export r2.bracl <- r2.censReg #' @export r2.brmultinom <- r2.censReg # Zeroinflated R2 ------------------ #' @export r2.hurdle <- function(model, ...) { r2_zeroinflated(model) } #' @export r2.zerotrunc <- r2.hurdle #' @export r2.zeroinfl <- r2.hurdle # Nakagawa R2 ---------------------- #' @export r2.merMod <- function(model, ...) { r2_nakagawa(model) } #' @export r2.glmmTMB <- r2.merMod #' @export r2.cpglmm <- r2.merMod #' @export r2.glmmadmb <- r2.merMod #' @export r2.lme <- r2.merMod #' @export r2.clmm <- r2.merMod #' @export r2.mixed <- r2.merMod #' @export r2.MixMod <- r2.merMod #' @export r2.rlmerMod <- r2.merMod #' @export r2.wbm <- function(model, ...) { out <- r2_nakagawa(model) if (is.null(out) || is.na(out)) { s <- summary(model) r2_marginal <- s$mod_info_list$pR2_fe r2_conditional <- s$mod_info_list$pR2_total names(r2_conditional) <- "Conditional R2" names(r2_marginal) <- "Marginal R2" out <- list( "R2_conditional" = r2_conditional, "R2_marginal" = r2_marginal ) attr(out, "model_type") <- "Fixed Effects" class(out) <- "r2_nakagawa" } out } # Bayes R2 ------------------------ #' @export r2.brmsfit <- function(model, ...) { r2_bayes(model, ...) } #' @export r2.stanreg <- r2.brmsfit # Other methods ------------------------------ #' @export r2.betareg <- function(model, ...) { list( R2 = c(`Pseudo R2` = model$pseudo.r.squared) ) } #' @export r2.feis <- function(model, ...) { out <- list( R2 = c(`R2` = model$r2), R2_adjusted = c(`adjusted R2` = model$adj.r2) ) attr(out, "model_type") <- "Fixed Effects Individual Slope" structure(class = "r2_generic", out) } #' @export r2.fixest <- function(model, ...) { if (!requireNamespace("fixest", quietly = TRUE)) { stop("Package 'fixest' needed to calculate R2. Please install it.") } r2 <- fixest::r2(model) out_normal <- .compact_list(list( R2 = r2["r2"], R2_adjusted = r2["ar2"], R2_within = r2["wr2"], R2_within_adjusted = r2["war2"] ), remove_na = TRUE) out_pseudo <- .compact_list(list( R2 = r2["pr2"], R2_adjusted = r2["apr2"], R2_within = r2["wpr2"], R2_within_adjusted = r2["wapr2"] ), remove_na = TRUE) if (length(out_normal)) { out <- out_normal } else { out <- out_pseudo } attr(out, "model_type") <- "Fixed Effects" structure(class = "r2_generic", out) } #' @export r2.felm <- function(model, ...) { model_summary <- summary(model) out <- list( R2 = c(`R2` = model_summary$r2), R2_adjusted = c(`adjusted R2` = model_summary$r2adj) ) attr(out, "model_type") <- "Fixed Effects" structure(class = "r2_generic", out) } #' @export r2.iv_robust <- function(model, ...) { out <- list( R2 = c(`R2` = model$r.squared), R2_adjusted = c(`adjusted R2` = model$adj.r.squared) ) attr(out, "model_type") <- "Two-Stage Least Squares Instrumental-Variable" structure(class = "r2_generic", out) } #' @export r2.ivreg <- function(model, ...) { model_summary <- summary(model) out <- list( R2 = c(`R2` = model_summary$r.squared), R2_adjusted = c(`adjusted R2` = model_summary$adj.r.squared) ) attr(out, "model_type") <- "Instrumental-Variable" structure(class = "r2_generic", out) } #' @export r2.bigglm <- function(model, ...) { list("R2_CoxSnell" = summary(model)$rsq) } #' @export r2.biglm <- function(model, ...) { df.int <- ifelse(insight::has_intercept(model), 1, 0) n <- insight::n_obs(model) rsq <- summary(model)$rsq adj.rsq <- 1 - (1 - rsq) * ((n - df.int) / model$df.resid) out <- list( R2 = rsq, R2_adjusted = adj.rsq ) names(out$R2) <- "R2" names(out$R2_adjusted) <- "adjusted R2" attr(out, "model_type") <- "Linear" structure(class = "r2_generic", out) } #' @export r2.lmrob <- function(model, ...) { model_summary <- summary(model) out <- list( R2 = c(`R2` = model_summary$r.squared), R2_adjusted = c(`adjusted R2` = model_summary$adj.r.squared) ) attr(out, "model_type") <- "Robust Linear" structure(class = "r2_generic", out) } #' @export r2.complmrob <- r2.lmrob #' @export r2.mlogit <- function(model, ...) { list("R2_McFadden" = r2_mcfadden(model)) } #' @export r2.mmclogit <- function(model, ...) { list(R2 = NA) } #' @export r2.plm <- function(model, ...) { model_summary <- summary(model) out <- list( "R2" = c(`R2` = model_summary$r.squared[1]), "R2_adjusted" = c(`adjusted R2` = model_summary$r.squared[2]) ) attr(out, "model_type") <- "Panel Data" structure(class = "r2_generic", out) } #' @export r2.svyglm <- function(model, ...) { rsq <- (model$null.deviance - model$deviance) / model$null.deviance rsq.adjust <- 1 - ((1 - rsq) * (model$df.null / model$df.residual)) out <- list( R2 = c(`R2` = rsq), R2_adjusted = c(`adjusted R2` = rsq.adjust) ) attr(out, "model_type") <- "Survey" structure(class = "r2_generic", out) } #' @export r2.vglm <- function(model, ...) { list("R2_McKelvey" = r2_mckelvey(model)) } #' @export r2.vgam <- r2.vglm #' @export r2.DirichletRegModel <- function(model, ...) { list("R2_Nagelkerke" = r2_nagelkerke(model)) } performance/R/print-methods.R0000644000176200001440000004173013616476346015721 0ustar liggesusers#' @importFrom insight format_table #' @export print.compare_performance <- function(x, digits = 3, ...) { insight::print_color("# Comparison of Model Performance Indices\n\n", "blue") # if we have ranking, add score and remove incomplete indices in print if ("Performance_Score" %in% colnames(x)) { x$Performance_Score <- sprintf("%.2f%%", 100 * x$Performance_Score) x <- x[!sapply(x, anyNA)] } x[] <- lapply(x, function(i) { if (is.numeric(i)) { round(i, digits = digits) } else { i } }) ## TODO remove suppressWarnings() once insight is updated on CRAN (> 0.7.1) cat(suppressWarnings(insight::format_table(x))) if ("Performance_Score" %in% colnames(x)) { insight::print_color(sprintf("\nModel %s (of class %s) performed best with an overall performance score of %s.\n", x$Model[1], x$Type[1], x$Performance_Score[1]), "yellow") } } #' @export print.performance_model <- function(x, digits = 3, ...) { insight::print_color("# Indices of model performance\n\n", "blue") x[] <- lapply(x, function(i) { if (is.numeric(i)) i <- round(i, digits) i }) print.data.frame(x, row.names = FALSE, ...) } #' @export print.check_outliers <- function(x, ...) { outliers <- which(as.numeric(x) >= 0.5) if (length(outliers) >= 1) { o <- paste0(" (cases ", paste0(outliers, collapse = ", "), ")") insight::print_color(sprintf("Warning: %i outliers detected%s.\n", length(outliers), o), "red") } else { insight::print_color("OK: No outliers detected.\n", "green") } } #' @export print.check_model <- function(x, ...) { if (!requireNamespace("see", quietly = TRUE)) { stop("Package 'see' required to plot model assumptions. Please install it.") } NextMethod() } #' @importFrom insight print_color #' @export print.check_distribution <- function(x, ...) { insight::print_color("# Distribution of Model Family\n\n", "blue") x1 <- x[order(x$p_Residuals, decreasing = TRUE)[1:3], c(1, 2)] x1 <- x1[x1$p_Residuals > 0, ] x1$p_Residuals <- sprintf("%g%%", round(100 * x1$p_Residuals)) colnames(x1) <- c("Distribution", "Probability") insight::print_color("Predicted Distribution of Residuals\n\n", "red") print.data.frame(x1, row.names = FALSE, ...) x2 <- x[order(x$p_Response, decreasing = TRUE)[1:3], c(1, 3)] x2 <- x2[x2$p_Response > 0, ] x2$p_Response <- sprintf("%g%%", round(100 * x2$p_Response)) colnames(x2) <- c("Distribution", "Probability") insight::print_color("\nPredicted Distribution of Response\n\n", "red") print.data.frame(x2, row.names = FALSE, ...) } #' @importFrom insight print_color #' @export print.check_distribution_numeric <- function(x, ...) { insight::print_color("# Predicted Distribution of Vector\n\n", "blue") x1 <- x[order(x$p_Vector, decreasing = TRUE)[1:3], c(1, 2)] x1 <- x1[x1$p_Vector > 0, ] x1$p_Vector <- sprintf("%g%%", round(100 * x1$p_Vector)) colnames(x1) <- c("Distribution", "Probability") print.data.frame(x1, row.names = FALSE, ...) } #' @importFrom bayestestR area_under_curve #' @importFrom insight print_color #' @export print.performance_roc <- function(x, ...) { if (length(unique(x$Model)) == 1) { cat(sprintf("AUC: %.2f%%\n", 100 * bayestestR::area_under_curve(x$Sensivity, x$Specifity))) } else { insight::print_color("# Area under Curve\n\n", "blue") dat <- split(x, f = x$Model) max_space <- max(nchar(x$Model)) for (i in 1:length(dat)) { cat(sprintf( " %*s: %.2f%%\n", max_space, names(dat)[i], 100 * bayestestR::area_under_curve(dat[[i]]$Sensivity, dat[[i]]$Specifity) )) } } } #' @importFrom insight print_color #' @export print.item_difficulty <- function(x, ...) { spaces <- max(nchar(x$item)) insight::print_color("# Item Difficulty\n\n", "blue") insight::print_color(sprintf(" %*s ideal\n", spaces + 10, "difficulty"), "red") for (i in 1:length(x$item)) { cat(sprintf(" %*s %.2f %.2f\n", spaces, x$item[i], x$difficulty[i], x$ideal[i])) } } #' @importFrom insight print_color #' @export print.performance_pcp <- function(x, digits = 2, ...) { insight::print_color("# Percentage of Correct Predictions from Logistic Regression Model\n\n", "blue") cat(sprintf(" Full model: %.2f%% [%.2f%% - %.2f%%]\n", 100 * x$pcp_model, 100 * x$model_ci_low, 100 * x$model_ci_high)) cat(sprintf(" Null model: %.2f%% [%.2f%% - %.2f%%]\n", 100 * x$pcp_m0, 100 * x$null_ci_low, 100 * x$null_ci_high)) insight::print_color("\n# Likelihood-Ratio-Test\n\n", "blue") v1 <- sprintf("%.3f", x$lrt_chisq) v2 <- sprintf("%.3f", x$lrt_p) space <- max(nchar(c(v1, v2))) cat(sprintf(" Chi-squared: %*s\n", space, v1)) cat(sprintf(" p-value: %*s\n\n", space, v2)) } #' @importFrom insight print_color #' @export print.looic <- function(x, digits = 2, ...) { insight::print_color("# LOOIC and ELPD with Standard Error\n\n", "blue") out <- paste0(c( sprintf(" LOOIC: %.*f [%.*f]", digits, x$LOOIC, digits, x$LOOIC_SE), sprintf(" ELPD: %.*f [%.*f]", digits, x$ELPD, digits, x$ELPD_SE) ), collapse = "\n" ) cat(out) cat("\n") } #' @importFrom insight print_color #' @export print.r2_generic <- function(x, digits = 3, ...) { model_type <- attr(x, "model_type") if (!is.null(model_type)) { insight::print_color(sprintf("# R2 for %s Regression\n\n", model_type), "blue") } else { insight::print_color("# R2\n\n", "blue") } if (all(c("R2_adjusted", "R2_within_adjusted") %in% names(x))) { out <- paste0(c( sprintf(" R2: %.*f", digits, x$R2), sprintf(" adj. R2: %.*f", digits, x$R2_adjusted), sprintf(" within R2: %.*f", digits, x$R2_within), sprintf(" adj. within R2: %.*f", digits, x$R2_within_adjusted) ), collapse = "\n" ) } else if ("R2_adjusted" %in% names(x)) { out <- paste0(c( sprintf(" R2: %.*f", digits, x$R2), sprintf(" adj. R2: %.*f", digits, x$R2_adjusted) ), collapse = "\n" ) } else { out <- sprintf(" R2: %.*f", digits, x$R2) } cat(out) cat("\n") } #' @importFrom insight print_color #' @export print.r2_nakagawa <- function(x, digits = 3, ...) { model_type <- attr(x, "model_type") if (is.null(model_type)) { insight::print_color("# R2 for Mixed Models\n\n", "blue") } else { insight::print_color("# R2 for %s Regression\n\n", "blue") } out <- paste0(c( sprintf(" Conditional R2: %.*f", digits, x$R2_conditional), sprintf(" Marginal R2: %.*f", digits, x$R2_marginal) ), collapse = "\n" ) cat(out) cat("\n") } #' @importFrom insight print_color #' @export print.r2_bayes <- function(x, digits = 3, ...) { insight::print_color("# Bayesian R2 with Standard Error\n\n", "blue") out <- sprintf(" Conditional R2: %.*f [%.*f]", digits, x$R2_Bayes, digits, attr(x, "SE")[["R2_Bayes"]]) if ("R2_Bayes_marginal" %in% names(x)) { out <- paste0(c(out, sprintf(" Marginal R2: %.*f [%.*f]", digits, x$R2_Bayes_marginal, digits, attr(x, "SE")[["R2_Bayes_marginal"]])), collapse = "\n") } cat(out) cat("\n") } #' @export print.perf_pca_rotate <- function(x, cutoff = 0.1, digits = 3, ...) { .rotation <- attr(x, "rotation", exact = TRUE) if (.rotation == "none") { insight::print_color("# Loadings from Principal Component Analysis (no rotation)\n\n", "blue") } else { insight::print_color(sprintf("# Rotated loadings from Principal Component Analysis (%s-rotation)\n\n", .rotation), "blue") } xs <- attr(x, "variance", exact = TRUE) x <- round(x, digits = digits) x <- as.data.frame(apply(x, MARGIN = c(1, 2), function(.y) { if (abs(.y) < cutoff) { "" } else { as.character(.y) } }), stringsAsFactors = FALSE) xs <- as.data.frame(t(as.data.frame(round(xs, digits = digits)))) colnames(xs) <- sprintf("PC%i", 1:ncol(xs)) rownames(xs) <- c("Proportion variance", "Cumulative variance", "Proportion explained", "Cumulative explained") print(x, quote = FALSE, ...) insight::print_color("\n(Explained) Variance\n", "cyan") print(xs, ...) } #' @export print.perf_pca <- function(x, digits = 3, ...) { x <- as.data.frame(round(x, digits = digits)) rownames(x) <- c("Standard deviation", "Eigenvalue", "Proportion variance", "Cumulative variance") print(x, ...) } #' @importFrom insight print_color #' @export print.icc <- function(x, digits = 3, ...) { insight::print_color("# Intraclass Correlation Coefficient\n\n", "blue") out <- paste0(c( sprintf(" Adjusted ICC: %.*f", digits, x$ICC_adjusted), sprintf(" Conditional ICC: %.*f", digits, x$ICC_conditional) ), collapse = "\n" ) cat(out) cat("\n") } #' @importFrom insight print_color #' @export print.check_zi <- function(x, ...) { insight::print_color("# Check for zero-inflation\n\n", "blue") cat(sprintf(" Observed zeros: %i\n", x$observed.zeros)) cat(sprintf(" Predicted zeros: %i\n", x$predicted.zeros)) cat(sprintf(" Ratio: %.2f\n\n", x$ratio)) lower <- 1 - x$tolerance upper <- 1 + x$tolerance if (x$ratio < lower) { message("Model is underfitting zeros (probable zero-inflation).") } else if (x$ratio > upper) { message("Model is overfitting zeros.") } else { message("Model seems ok, ratio of observed and predicted zeros is within the tolerance range.") } } #' @export print.check_overdisp <- function(x, digits = 3, ...) { x$dispersion_ratio <- sprintf("%.*f", digits, x$dispersion_ratio) x$chisq_statistic <- sprintf("%.*f", digits, x$chisq_statistic) x$p_value <- pval <- round(x$p_value, digits = digits) if (x$p_value < .001) x$p_value <- "< 0.001" maxlen <- max( nchar(x$dispersion_ratio), nchar(x$chisq_statistic), nchar(x$p_value) ) insight::print_color("# Overdispersion test\n\n", "blue") cat(sprintf(" dispersion ratio = %s\n", format(x$dispersion_ratio, justify = "right", width = maxlen))) cat(sprintf(" Pearson's Chi-Squared = %s\n", format(x$chisq_statistic, justify = "right", width = maxlen))) cat(sprintf(" p-value = %s\n\n", format(x$p_value, justify = "right", width = maxlen))) if (pval > 0.05) { message("No overdispersion detected.") } else { message("Overdispersion detected.") } } #' @importFrom insight print_color #' @export print.icc_decomposed <- function(x, digits = 2, ...) { # print model information cat("# Random Effect Variances and ICC\n\n") reform <- attr(x, "re.form", exact = TRUE) if (is.null(reform)) { reform <- "all random effects" } else { reform <- .safe_deparse(reform) } cat(sprintf("Conditioned on: %s\n\n", reform)) prob <- attr(x, "ci", exact = TRUE) cat(insight::print_color("## Variance Ratio (comparable to ICC)\n", "blue")) icc.val <- sprintf("%.*f", digits, x$ICC_decomposed) ci.icc.lo <- sprintf("%.*f", digits, x$ICC_CI[1]) ci.icc.hi <- sprintf("%.*f", digits, x$ICC_CI[2]) # ICC cat(sprintf( "Ratio: %s CI %i%%: [%s %s]\n", icc.val, as.integer(round(prob * 100)), ci.icc.lo, ci.icc.hi )) cat(insight::print_color("\n## Variances of Posterior Predicted Distribution\n", "blue")) null.model <- sprintf("%.*f", digits, attr(x, "var_rand_intercept", exact = TRUE)) ci.null <- attr(x, "ci.var_rand_intercept", exact = TRUE) ci.null.lo <- sprintf("%.*f", digits, ci.null$CI_low) ci.null.hi <- sprintf("%.*f", digits, ci.null$CI_high) full.model <- sprintf("%.*f", digits, attr(x, "var_total", exact = TRUE)) ci.full <- attr(x, "ci.var_total", exact = TRUE) ci.full.lo <- sprintf("%.*f", digits, ci.full$CI_low) ci.full.hi <- sprintf("%.*f", digits, ci.full$CI_high) ml <- max(nchar(null.model), nchar(full.model)) ml.ci <- max(nchar(ci.full.lo), nchar(ci.null.lo)) mh.ci <- max(nchar(ci.full.hi), nchar(ci.null.hi)) # Conditioned on fixed effects cat(sprintf( "Conditioned on fixed effects: %*s CI %i%%: [%*s %*s]\n", ml, null.model, as.integer(round(prob * 100)), ml.ci, ci.null.lo, mh.ci, ci.null.hi )) # Conditioned on random effects cat(sprintf( "Conditioned on rand. effects: %*s CI %i%%: [%*s %*s]\n", ml, full.model, as.integer(round(prob * 100)), ml.ci, ci.full.lo, mh.ci, ci.full.hi )) cat(insight::print_color("\n## Difference in Variances\n", "red")) res <- sprintf("%.*f", digits, attr(x, "var_residual", exact = TRUE)) ci.res <- attr(x, "ci.var_residual", exact = TRUE) ci.res.lo <- sprintf("%.*f", digits, ci.res$CI_low) ci.res.hi <- sprintf("%.*f", digits, ci.res$CI_high) # ICC cat(sprintf( "Difference: %s CI %i%%: [%s %s]\n", res, as.integer(round(prob * 100)), ci.res.lo, ci.res.hi )) } #' @export print.binned_residuals <- function(x, ...) { if (!requireNamespace("see", quietly = TRUE)) { stop("Package 'see' required to plot binned residuals. Please install it.") } NextMethod() } #' @export print.performance_hosmer <- function(x, ...) { insight::print_color("# Hosmer-Lemeshow Goodness-of-Fit Test\n\n", "blue") v1 <- sprintf("%.3f", x$chisq) v2 <- sprintf("%i ", x$df) v3 <- sprintf("%.3f", x$p.value) space <- max(nchar(c(v1, v2, v3))) cat(sprintf(" Chi-squared: %*s\n", space, v1)) cat(sprintf(" df: %*s\n", space, v2)) cat(sprintf(" p-value: %*s\n\n", space, v3)) if (x$p.value >= 0.05) { message("Summary: model seems to fit well.") } else { message("Summary: model does not fit well.") } } #' @export print.performance_accuracy <- function(x, ...) { # headline insight::print_color("# Accuracy of Model Predictions\n\n", "blue") # statistics cat(sprintf("Accuracy: %.2f%%\n", 100 * x$Accuracy)) cat(sprintf(" SE: %.2f%%-points\n", 100 * x$SE)) cat(sprintf(" Method: %s\n", x$Method)) } #' @export print.performance_score <- function(x, ...) { # headline insight::print_color("# Proper Scoring Rules\n\n", "blue") results <- format( c( sprintf("%.4f", x$logarithmic), sprintf("%.4f", x$quadratic), sprintf("%.4f", x$spherical) ), justify = "right" ) cat(sprintf("logarithmic: %s\n", results[1])) cat(sprintf(" quadratic: %s\n", results[2])) cat(sprintf(" spherical: %s\n", results[3])) } #' @export print.check_collinearity <- function(x, ...) { insight::print_color("# Check for Multicollinearity\n", "blue") if ("Component" %in% colnames(x)) { comp <- split(x, x$Component) for (i in 1:length(comp)) { cat(paste0("\n* ", comp[[i]]$Component[1], " component:\n")) .print_collinearity(comp[[i]][, 1:3]) } } else { .print_collinearity(x) } } .print_collinearity <- function(x) { vifs <- x$VIF x$VIF <- sprintf("%.2f", x$VIF) x$SE_factor <- sprintf("%.2f", x$SE_factor) colnames(x)[3] <- "Increased SE" low_corr <- which(vifs < 5) if (length(low_corr)) { cat("\n") insight::print_color("Low Correlation\n\n", "green") print.data.frame(x[low_corr, ], row.names = FALSE) } mid_corr <- which(vifs >= 5 & vifs < 10) if (length(mid_corr)) { cat("\n") insight::print_color("Moderate Correlation\n\n", "yellow") print.data.frame(x[mid_corr, ], row.names = FALSE) } high_corr <- which(vifs >= 10) if (length(high_corr)) { cat("\n") insight::print_color("High Correlation\n\n", "red") print.data.frame(x[high_corr, ], row.names = FALSE) } } #' @importFrom insight format_table print_color #' @export print.performance_lrt <- function(x, digits = 3, ...) { insight::print_color("# Likelihood-Ratio-Test for Model Comparison\n\n", "blue") cat(insight::format_table(x, digits = digits)) if (sum(x$p < .05, na.rm = TRUE) <= 1) { best <- which(x$p < .05) if (length(best) == 0) best <- 1 insight::print_color(sprintf("\nModel '%s' seems to have the best model fit.\n", x$Model[best]), "yellow") } } #' @importFrom insight print_color format_table #' @export print.check_itemscale <- function(x, digits = 2, ...) { insight::print_color("# Description of (Sub-)Scales\n", "blue") for (i in 1:length(x)) { insight::print_color(sprintf("\nComponent %i\n\n", i), "red") out <- x[[i]] out[["Missings"]] <- sprintf("%.*f%%", digits, 100 * out[["Missings"]]) out[["Mean"]] <- sprintf("%.*f", digits, out[["Mean"]]) out[["SD"]] <- sprintf("%.*f", digits, out[["SD"]]) cat(insight::format_table(out, missing = "")) insight::print_color(sprintf( "\nMean inter-item-correlation = %.3f Cronbach's alpha = %.3f\n\n", attributes(out)$item_intercorrelation, attributes(out)$cronbachs_alpha ), "yellow") } } performance/R/check_model_diagnostics.R0000644000176200001440000001235013564746345017745 0ustar liggesusers.diag_vif <- function(model) { dat <- .compact_list(check_collinearity(model)) if (is.null(dat)) { return(NULL) } dat$group <- "low" dat$group[dat$VIF >= 5 & dat$VIF < 10] <- "moderate" dat$group[dat$VIF >= 10] <- "high" if (ncol(dat) == 5) { colnames(dat) <- c("x", "y", "se", "facet", "group") dat[, c("x", "y", "facet", "group")] } else { colnames(dat) <- c("x", "y", "se", "group") dat[, c("x", "y", "group")] } } #' @importFrom stats residuals rstudent fitted .diag_qq <- function(model) { if (inherits(model, c("lme", "lmerMod", "merMod", "glmmTMB"))) { res_ <- sort(stats::residuals(model), na.last = NA) } else { res_ <- tryCatch( { sort(stats::rstudent(model), na.last = NA) }, error = function(e) { NULL } ) if (is.null(res_)) { res_ <- tryCatch( { sort(stats::residuals(model), na.last = NA) }, error = function(e) { NULL } ) } } if (is.null(res_)) { insight::print_color(sprintf("QQ plot could not be created. Cannot extract residuals from objects of class '%s'.\n", class(model)[1]), "red") return(NULL) } fitted_ <- sort(stats::fitted(model), na.last = NA) stats::na.omit(data.frame(x = fitted_, y = res_)) } #' @importFrom stats qnorm ppoints #' @importFrom insight print_color .diag_reqq <- function(model, level = .95, model_info) { # check if we have mixed model if (!model_info$is_mixed) { return(NULL) } if (!requireNamespace("lme4", quietly = TRUE)) { stop("Package 'lme4' required for this function to work. Please install it.", call. = FALSE) } if (inherits(model, "glmmTMB")) { var_attr <- "condVar" re <- .collapse_cond(lme4::ranef(model, condVar = TRUE)) } else { var_attr <- "postVar" re <- lme4::ranef(model, condVar = TRUE) } se <- tryCatch( { lapply(re, function(.x) { pv <- attr(.x, var_attr, exact = TRUE) cols <- seq_len(dim(pv)[1]) unlist(lapply(cols, function(.y) sqrt(pv[.y, .y, ]))) }) }, error = function(e) { NULL } ) if (is.null(se)) { insight::print_color("Could not compute standard errors from random effects for diagnostic plot.\n", "red") return(NULL) } mapply(function(.re, .se) { ord <- unlist(lapply(.re, order)) + rep((0:(ncol(.re) - 1)) * nrow(.re), each = nrow(.re)) df.y <- unlist(.re)[ord] df.ci <- stats::qnorm((1 + level) / 2) * .se[ord] data.frame( x = rep(stats::qnorm(stats::ppoints(nrow(.re))), ncol(.re)), y = df.y, conf.low = df.y - df.ci, conf.high = df.y + df.ci, facet = gl(ncol(.re), nrow(.re), labels = names(.re)), stringsAsFactors = FALSE, row.names = NULL ) }, re, se, SIMPLIFY = FALSE) } #' @importFrom bayestestR estimate_density #' @importFrom stats residuals sd .diag_norm <- function(model) { r <- try(stats::residuals(model), silent = TRUE) if (inherits(r, "try-error")) { insight::print_color(sprintf("Non-normality of residuals could not be computed. Cannot extract residuals from objects of class '%s'.\n", class(model)[1]), "red") return(NULL) } dat <- as.data.frame(bayestestR::estimate_density(r)) dat$curve <- stats::dnorm(seq(min(dat$x), max(dat$x), length.out = nrow(dat)), mean(r), stats::sd(r)) dat } #' @importFrom stats residuals fitted .diag_ncv <- function(model) { ncv <- tryCatch( { data.frame( x = stats::fitted(model), y = stats::residuals(model) ) }, error = function(e) { NULL } ) if (is.null(ncv)) { insight::print_color(sprintf("Non-constant error variance could not be computed. Cannot extract residuals from objects of class '%s'.\n", class(model)[1]), "red") return(NULL) } ncv } #' @importFrom insight get_variance_residual #' @importFrom stats rstandard fitted .diag_homogeneity <- function(model) { faminfo <- insight::model_info(model) r <- tryCatch( { if (inherits(model, "merMod")) { stats::residuals(model, scaled = TRUE) } else if (inherits(model, c("glmmTMB", "MixMod"))) { sigma <- if (faminfo$is_mixed) { sqrt(insight::get_variance_residual(model)) } else { .sigma_glmmTMB_nonmixed(model, faminfo) } stats::residuals(model) / sigma } else { stats::rstandard(model) } }, error = function(e) { NULL } ) if (is.null(r)) { insight::print_color(sprintf("Homogeneity of variance could not be computed. Cannot extract residual variance from objects of class '%s'.\n", class(model)[1]), "red") return(NULL) } data.frame( x = stats::fitted(model), y = sqrt(abs(r)) ) } #' @importFrom insight model_info .sigma_glmmTMB_nonmixed <- function(model, faminfo) { if (!is.na(match(faminfo$family, c("binomial", "poisson", "truncated_poisson")))) { return(1) } betad <- model$fit$par["betad"] switch( faminfo$family, gaussian = exp(0.5 * betad), Gamma = exp(-0.5 * betad), exp(betad) ) } performance/R/model_performance.mixed.R0000644000176200001440000000747213616476346017717 0ustar liggesusers#' Performance of Mixed Models #' #' Compute indices of model performance for mixed models. #' #' @param metrics Can be \code{"all"}, \code{"common"} or a character vector of metrics to be computed (some of \code{c("AIC", "BIC", "R2", "ICC", "RMSE", "LOGLOSS", "SCORE")}). \code{"common"} will compute AIC, BIC, R2, ICC and RMSE. #' @param ... Arguments passed to or from other methods. #' @inheritParams r2_nakagawa #' @inheritParams model_performance.lm #' #' @return A data frame (with one row) and one column per "index" (see \code{metrics}). #' #' @details This method returns the \emph{adjusted ICC} only, as this is typically #' of interest when judging the variance attributed to the random effects part #' of the model (see also \code{\link{icc}}). #' \cr \cr #' Furthermore, see 'Details' in \code{\link{model_performance.lm}} for #' more details on returned indices. #' #' @examples #' if (require("lme4")) { #' model <- lmer(Petal.Length ~ Sepal.Length + (1 | Species), data = iris) #' model_performance(model) #' } #' @importFrom insight model_info #' @export model_performance.merMod <- function(model, metrics = "all", verbose = TRUE, ...) { if (all(metrics == "all")) { metrics <- c("AIC", "BIC", "R2", "ICC", "RMSE", "LOGLOSS", "SCORE") } else if (all(metrics == "common")) { metrics <- c("AIC", "BIC", "R2", "ICC", "RMSE") } mi <- insight::model_info(model) out <- list() if ("AIC" %in% metrics) { out$AIC <- performance_aic(model) } if ("BIC" %in% metrics) { out$BIC <- .get_BIC(model) } if ("R2" %in% metrics) { rsq <- suppressWarnings(r2(model)) if (!all(is.na(rsq))) out <- c(out, rsq) } if ("ICC" %in% metrics) { icc_mm <- suppressWarnings(icc(model)) if (!all(is.na(icc_mm))) out$ICC <- icc_mm$ICC_adjusted } if ("RMSE" %in% metrics) { out$RMSE <- performance_rmse(model, verbose = verbose) } if (("LOGLOSS" %in% metrics) && mi$is_binomial) { out$LOGLOSS <- performance_logloss(model, verbose = verbose) } if (("SCORE" %in% metrics) && (mi$is_binomial || mi$is_count)) { .scoring_rules <- performance_score(model, verbose = verbose) if (!is.na(.scoring_rules$logarithmic)) out$SCORE_LOG <- .scoring_rules$logarithmic if (!is.na(.scoring_rules$spherical)) out$SCORE_SPHERICAL <- .scoring_rules$spherical } # TODO: What with sigma and deviance? out <- as.data.frame(out) row.names(out) <- NULL out } #' @export model_performance.lme <- model_performance.merMod #' @export model_performance.glmmadmb <- model_performance.merMod #' @export model_performance.rlmerMod <- model_performance.merMod #' @export model_performance.MixMod <- model_performance.merMod #' @export model_performance.mixed <- model_performance.merMod #' @export model_performance.glmmTMB <- model_performance.merMod #' @export model_performance.mixor <- function(model, metrics = "all", verbose = TRUE, ...) { if (all(metrics == "all")) { metrics <- c("AIC", "BIC", "LOGLOSS", "SCORE") } mi <- insight::model_info(model) out <- list() if ("AIC" %in% metrics) { out$AIC <- performance_aic(model) } if ("BIC" %in% metrics) { out$BIC <- .get_BIC(model) } if (("LOGLOSS" %in% metrics) && mi$is_binomial && !mi$is_ordinal && !mi$is_multinomial) { out$LOGLOSS <- performance_logloss(model, verbose = verbose) } if (("SCORE" %in% metrics) && (mi$is_binomial || mi$is_count) && !mi$is_ordinal && !mi$is_multinomial) { .scoring_rules <- performance_score(model, verbose = verbose) if (!is.na(.scoring_rules$logarithmic)) out$SCORE_LOG <- .scoring_rules$logarithmic if (!is.na(.scoring_rules$spherical)) out$SCORE_SPHERICAL <- .scoring_rules$spherical } out <- as.data.frame(out) row.names(out) <- NULL out } performance/R/performance_logloss.R0000644000176200001440000000351613571160010017141 0ustar liggesusers#' @title Log Loss #' @name performance_logloss #' #' @description Compute the log loss for models with binary outcome. #' #' @param model Model with binary outcome. #' @param ... Currently not used. #' @inheritParams model_performance.lm #' #' @return Numeric, the log loss of \code{model}. #' #' @details Logistic regression models predict the probability of an outcome of #' being a "success" or "failure" (or 1 and 0 etc.). \code{performance_logloss()} evaluates #' how good or bad the predicted probabilities are. High values indicate #' bad predictions, while low values indicate good predictions. The lower #' the log-loss, the better the model predicts the outcome. #' #' @seealso \code{\link[=performance_score]{performance_score()}} #' #' @examples #' data(mtcars) #' m <- glm(formula = vs ~ hp + wt, family = binomial, data = mtcars) #' performance_logloss(m) #' @importFrom stats fitted #' @importFrom insight get_response print_color #' @export performance_logloss <- function(model, verbose = TRUE, ...) { UseMethod("performance_logloss") } #' @export performance_logloss.default <- function(model, verbose = TRUE, ...) { resp <- .factor_to_numeric(insight::get_response(model)) ll <- suppressWarnings(mean(log(1 - abs(resp - stats::fitted(model))) * -1)) if (is.na(ll)) { if (verbose) insight::print_color("Can't calculate log-loss.\n", "red") return(NA) } ll } #' @export performance_logloss.brmsfit <- function(model, verbose = TRUE, ...) { yhat <- stats::fitted(object = model, summary = TRUE, ...)[, "Estimate"] resp <- .factor_to_numeric(insight::get_response(model)) ll <- suppressWarnings(mean(log(1 - abs(resp - yhat)) * -1)) if (is.na(ll)) { if (verbose) insight::print_color("Can't calculate log-loss.\n", "red") return(NA) } ll } performance/R/check_itemscale.R0000644000176200001440000000764313620212376016216 0ustar liggesusers#' @title Describe Properties of Item Scales #' @name check_itemscale #' #' @description Compute various measures of internal consistencies #' applied to (sub)scales, which items were extracted using #' \code{\link[parameters]{principal_components}}. #' #' @param x An object of class \code{parameters_pca}, as returned by \code{\link[parameters]{principal_components}}. #' #' @return A list of data frames, with related measures of internal consistencies of each subscale. #' #' @details \code{check_itemscale()} calculates various measures of internal #' consistencies, such as Cronbach's alpha, item difficulty or discrimination etc. #' on subscales which were built from several items. Subscales are retrieved from #' the results of \code{\link[parameters]{principal_components}}, i.e. based on #' how many components were extracted from the PCA, \code{check_itemscale()} #' retrieves those variables that belong to a component and calculates the above #' mentioned measures. #' #' @note \itemize{ #' \item \emph{Item difficulty} should range between 0.2 and 0.8. Ideal value is \code{p+(1-p)/2} (which mostly is between 0.5 and 0.8). See \code{\link{item_difficulty}} for details. #' \item For \emph{item discrimination}, acceptable values are 0.20 or higher; the closer to 1.00 the better. See \code{\link{item_reliability}} for more details. #' \item In case the total \emph{Cronbach's alpha} value is below the acceptable cut-off of 0.7 (mostly if an index has few items), the \emph{mean inter-item-correlation} is an alternative measure to indicate acceptability. Satisfactory range lies between 0.2 and 0.4. See also \code{\link{item_intercor}}. #' } #' #' @references \itemize{ #' \item Briggs SR, Cheek JM (1986) The role of factor analysis in the development and evaluation of personality scales. Journal of Personality, 54(1), 106-148. doi: 10.1111/j.1467-6494.1986.tb00391.x #' \item Trochim WMK (2008) Types of Reliability. (\href{http://www.socialresearchmethods.net/kb/reltypes.php}{web}) #' } #' #' @examples #' # data generation from '?prcomp', slightly modified #' C <- chol(S <- toeplitz(.9^(0:15))) #' set.seed(17) #' X <- matrix(rnorm(16000), 100, 16) #' Z <- X %*% C #' if (require("parameters")) { #' pca <- principal_components(as.data.frame(Z), rotation = "varimax", n = 3) #' pca #' check_itemscale(pca) #' } #' @importFrom stats sd #' @export check_itemscale <- function(x) { if (!inherits(x, "parameters_pca")) { stop("'x' must be an object of class 'parameters_pca', as returned by 'parameters::principal_components()'.") } if (!requireNamespace("parameters", quietly = TRUE)) { stop("Package 'parameters' required for this function to work. Please install it.", call. = FALSE) } data_set <- attributes(x)$data_set subscales <- parameters::closest_component(x) out <- lapply(sort(unique(subscales)), function(.subscale) { columns <- names(subscales)[subscales == .subscale] items <- data_set[columns] reliability <- item_reliability(items) .item_discr <- reliability$item_discrimination if (is.null(.item_discr)) .item_discr <- NA .item_alpha <- reliability$alpha_if_deleted if (is.null(.item_alpha)) .item_alpha <- NA s_out <- data.frame( Item = columns, Missings = sapply(items, function(i) sum(is.na(i)) / nrow(items)), Mean = sapply(items, mean, na.rm = TRUE), SD = sapply(items, stats::sd, na.rm = TRUE), Skewness = sapply(items, parameters::skewness), "Difficulty" = item_difficulty(items)$difficulty, "Discrimination" = .item_discr, "alpha if deleted" = .item_alpha, stringsAsFactors = FALSE, check.names = FALSE ) attr(s_out, "item_intercorrelation") <- item_intercor(items) attr(s_out, "cronbachs_alpha") <- cronbachs_alpha(items) s_out }) class(out) <- unique(c("check_itemscale", class(out))) out } performance/R/performance_lrt.R0000644000176200001440000000522213616476346016302 0ustar liggesusers#' @title Likelihood-Ratio-Test for Model Comparison #' @name performance_lrt #' #' @description Compute Likelihood-Ratio-Test for model comparison. #' #' @param ... Multiple model objects, which should respond to \code{anova()}. #' #' @return A data frame, based on the results from \code{anova()}. #' #' @details This only makes statistical sense if the models are nested. It is conventional to list the models from smallest to largest, but this is up to the user. The output shows the tests of the models against one another in the order specified. #' #' @seealso \code{\link[=compare_performance]{compare_performance()}} to compare performance of many different models. #' #' @examples #' m1 <- lm(mpg ~ wt + cyl, data = mtcars) #' m2 <- lm(mpg ~ wt + cyl + gear, data = mtcars) #' m3 <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) #' performance_lrt(m1, m2, m3) #' @export performance_lrt <- function(...) { UseMethod("performance_lrt") } #' @importFrom stats anova #' @importFrom insight is_model #' @export performance_lrt.default <- function(...) { if (!all(sapply(list(...), insight::is_model))) { stop("All objects must be valid regression model objects!") } objects <- list(...) object_names <- match.call(expand.dots = FALSE)$`...` # LRT for model comparison if (length(list(...)) > 1) { # sd_mle <- function(model) sqrt(mean(residuals(model)^2)) # ll <- function(model, sd) { # sum(dnorm(insight::get_response(model), mean = fitted(model), sd = sd, log = TRUE)) # } # -2 * (ll(m2, sd_mle(m2)) - ll(m3, sd_mle(m3))) lrt <- stats::anova(..., test = "LRT") # create data frame with info about model name and class m <- mapply(function(.x, .y) { data.frame(Model = as.character(.y), Type = class(.x)[1], stringsAsFactors = FALSE) }, objects, object_names, SIMPLIFY = FALSE) # bind all data out <- cbind(do.call(rbind, m), lrt) # add AIC, if necessary if (!"AIC" %in% names(out)) { out$Df <- sapply(objects, function(i) length(insight::find_parameters(i, flatten = TRUE))) out$AIC <- sapply(objects, performance_aic) } # preserve only some columns out <- out[, intersect(c("Model", "Type", "Df", "AIC", "BIC", "F", "Chisq", "Pr(>Chisq)", "Pr(>Chi)", "Pr(>F)"), colnames(out))] colnames(out)[names(out) %in% c("Chisq", "F")] <- "Statistic" colnames(out)[grepl("^Pr\\(>", names(out))] <- "p" rownames(out) <- NULL class(out) <- c("performance_lrt", "see_performance_lrt", "data.frame") out } else { warning("At least two models required for a Likelihood-Ratio-Test.", call. = FALSE) } } performance/R/performance_mse.R0000644000176200001440000000252613616476346016271 0ustar liggesusers#' @title Mean Square Error of Linear Models #' @name performance_mse #' #' @description Compute mean square error of linear models. #' #' @inheritParams performance_rmse #' @inheritParams model_performance.lm #' #' @details The mean square error is the mean of the sum of squared residuals, #' i.e. it measures the average of the squares of the errors. Less technically #' speaking, the mean square error can be considered as the variance of the #' residuals, i.e. the variation in the outcome the model doesn't explain. #' Lower values (closer to zero) indicate better fit. #' #' @return Numeric, the mean square error of \code{model}. #' #' @examples #' data(mtcars) #' m <- lm(mpg ~ hp + gear, data = mtcars) #' performance_mse(m) #' @importFrom insight print_color #' @importFrom stats residuals #' @export performance_mse <- function(model, verbose = TRUE) { res <- tryCatch( { if (inherits(model, c("vgam", "vglm"))) { model@residuals } else { stats::residuals(model) } }, error = function(e) { NULL } ) if (is.null(res) || all(is.na(res))) { if (verbose) insight::print_color("Can't extract residuals from model.\n", "red") return(NA) } mean(res^2, na.rm = T) } #' @rdname performance_mse #' @export mse <- performance_mse performance/R/check_outliers.R0000644000176200001440000006762413620052564016124 0ustar liggesusers#' @title Outliers detection (check for influential observations) #' @name check_outliers #' #' @description Checks for and locates influential observations (i.e., "outliers") via several distance and/or clustering methods. If several methods are selected, the returned "Outlier" vector will be a composite outlier score, made of the average of the binary (0 or 1) results of each method. It represents the probability of each observation of being classified as an outlier by at least one method. The decision rule used by default is to classify as outliers observations which composite outlier score is superior or equal to 0.5 (i.e., that were classified as outliers by at least half of the methods). See the \strong{Details} section below for a description of the methods. #' #' @param x A model or a data.frame object. #' @param method The outlier detection method(s). Can be "all" or some of c("cook", "pareto", "zscore", "iqr", "mahalanobis", "robust", "mcd", "ics", "optics", "iforest", "lof"). #' @param threshold A list containing the threshold values for each method (e.g. \code{list('mahalanobis' = 7, 'cook' = 1)}), above which an observation is #' considered as outlier. If \code{NULL}, default values will be used (see 'Details'). #' #' @param ... When \code{method = "ics"}, further arguments in \code{...} are #' passed down to \code{ICSOutlier::ics.outlier()}. #' #' @return Check (message) on whether outliers were detected or not, as well as a #' data frame (with the original data that was used to fit the model), including #' information on the distance measure and whether or not an observation is considered #' as outlier. #' #' @note There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. #' #' @details Outliers can be defined as particularly influential observations. Most methods rely on the computation of some distance metric, and the observations greater than a certain threshold are considered outliers. Importantly, outliers detection methods are meant to provide information to the researcher, rather than being an automatized procedure which mindless application is a substitute for thinking. #' #' An \strong{example sentence} for reporting the usage of the composite method could be: #' #' \emph{"Based on a composite outlier score (see the 'check_outliers' function in the 'performance' R package; Lüdecke et al., 2019) obtained via the joint application of multiple outliers detection algorithms (Z-scores, Iglewicz, 1993; Interquartile range (IQR); Mahalanobis distance, Cabana, 2019; Robust Mahalanobis distance, Gnanadesikan & Kettenring, 1972; Minimum Covariance Determinant, Leys et al., 2018; Invariant Coordinate Selection, Archimbaud et al., 2018; OPTICS, Ankerst et al., 1999; Isolation Forest, Liu et al. 2008; and Local Outlier Factor, Breunig et al., 2000), we excluded n participants that were classified as outliers by at least half of the methods used."} #' #' \subsection{Model-specific methods}{ #' \itemize{ #' \item \strong{Cook's Distance}: #' Among outlier detection methods, Cook's distance and leverage are less common #' than the basic Mahalanobis distance, but still used. Cook's distance estimates #' the variations in regression coefficients after removing each observation, #' one by one (Cook, 1977). Since Cook's distance is in the metric of an F #' distribution with p and n-p degrees of freedom, the median point of the quantile #' distribution can be used as a cut-off (Bollen, 1985). A common approximation #' or heuristic is to use 4 divided by the numbers of observations, which usually #' corresponds to a lower threshold (i.e., more outliers are detected). This only works for Frequentist models. For Bayesian models, see \code{pareto}. #' #' \item \strong{Pareto}: #' The reliability and approximate convergence of Bayesian models can be assessed using the estimates for the shape parameter k of the generalized Pareto distribution. If the estimated tail shape parameter k exceeds 0.5, the user should be warned, although in practice the authors of the \code{loo} package observed good performance for values of k up to 0.7 (the default threshold used by \code{performance}). #' }} #' #' #' \subsection{Univariate methods}{ #' \itemize{ #' \item \strong{Z-scores}: #' The Z-score, or standard score, is a way of describing a data point as deviance from a central value, in terms of standard deviations from the mean or, as it is here the case by default (Iglewicz, 1993), in terms of Median Absolute Deviation (MAD) from the median (which are robust measures of dispersion and centrality). The default threshold to classify outliers is 1.959, corresponding to the 2.5\% most extreme observations (assuming the data is normally distributed). Importantly, the Z-score method is univariate: it is computed column by column. If a data.frame is passed, then the maximum distance is kept for each observations. Thus, all observations that are extreme for at least one variable will be detected. However, this method is not suited for high dimensional data (with many columns), returning too liberal results (detecting many outliers). #' #' \item \strong{IQR}: #' Using the IQR (interquartile range) is a robust method developed by John Tukey, which often appears in box-and-whisker plots (e.g., in \code{geom_boxplot}). The interquartile range is the range between the first and the third quartiles. Tukey considered as outliers any data point that fell outside of either 1.5 times (the default threshold) the IQR below the first or above the third quartile. Similar to the Z-score method, this is a univariate method for outliers detection, returning outliers detected for at least one column, and might thus not be suited to high dimensional data. #' }} #' #' \subsection{Multivariate methods}{ #' \itemize{ #' \item \strong{Mahalanobis Distance}: #' Mahalanobis distance (Mahalanobis, 1930) is often used for multivariate outliers #' detection as this distance takes into account the shape of the observations. #' The default \code{threshold} is often arbitrarily set to some deviation (in #' terms of SD or MAD) from the mean (or median) of the Mahalanobis distance. #' However, as the Mahalanobis distance can be approximated by a Chi squared #' distribution (Rousseeuw & Van Zomeren, 1990), we can use the alpha quantile #' of the chi-square distribution with k degrees of freedom (k being the number of #' columns). By default, the alpha threshold is set to 0.025 (corresponding to the #' 2.5\% most extreme observations; Cabana, 2019). This criterion is a natural extension of the #' median plus or minus a coefficient times the MAD method (Leys et al., 2013). #' #' \item \strong{Robust Mahalanobis Distance}: #' A robust version of Mahalanobis distance using an Orthogonalized #' Gnanadesikan-Kettenring pairwise estimator (Gnanadesikan \& Kettenring, 1972). #' Requires the \pkg{bigutilsr} package. #' #' \item \strong{Minimum Covariance Determinant (MCD)}: #' Another robust version of Mahalanobis. Leys et al. (2018) argue that Mahalanobis Distance is not a robust way to #' determine outliers, as it uses the means and covariances of all the data #' – including the outliers – to determine individual difference scores. Minimum #' Covariance Determinant calculates the mean and covariance matrix based on the #' most central subset of the data (by default, 66\%), before computing the #' Mahalanobis Distance. This is deemed to be a more robust method of identifying #' and removing outliers than regular Mahalanobis distance. #' #' \item \strong{Invariant Coordinate Selection (ICS)}: #' The outlier are detected using ICS, which by default uses an alpha threshold #' of 0.025 (corresponding to the 2.5\% most extreme observations) as a cut-off value for outliers classification. Refer to the help-file #' of \code{ICSOutlier::ics.outlier()} to get more details about this procedure. #' Note that \code{method = "ics"} requires both \pkg{ICS} and \pkg{ICSOutlier} #' to be installed, and that it takes some time to compute the results. #' #' \item \strong{OPTICS}: #' The Ordering Points To Identify the Clustering Structure (OPTICS) algorithm (Ankerst et al., 1999) is using similar concepts to DBSCAN (an unsupervised clustering technique that can be used for outliers detection). The threshold argument is passed as \code{minPts}, which corresponds to the minimum size of a cluster. By default, this size is set at 2 times the number of columns (Sander et al., 1998). Compared to the others techniques, that will always detect several outliers (as these are usually defined as a percentage of extreme values), this algorithm functions in a different manner and won't always detect outliers. Note that \code{method = "optics"} requires the \pkg{dbscan} package to be installed, and that it takes some time to compute the results. #' #' \item \strong{Isolation Forest}: #' The outliers are detected using the anomaly score of an isolation forest (a class of random forest). The default threshold #' of 0.025 will classify as outliers the observations located at \code{qnorm(1-0.025) * MAD)} (a robust equivalent of SD) of the median (roughly corresponding to the 2.5\% most extreme observations). Requires the \pkg{solitude} package. #' #' \item \strong{Local Outlier Factor}: #' Based on a K nearest neighbours algorithm, LOF compares the local density #' of an point to the local densities of its neighbors instead of computing a #' distance from the center (Breunig et al., 2000). Points that have a #' substantially lower density than their neighbors are considered outliers. #' A LOF score of approximately 1 indicates that density around the point is #' comparable to its neighbors. Scores significantly larger than 1 indicate outliers. #' The default threshold of 0.025 will classify as outliers the observations #' located at \code{qnorm(1-0.025) * SD)} of the log-transformed LOF distance. #' Requires the \pkg{dbscan} package. #' }} #' #' \subsection{Threshold specification}{ #' Default thresholds are currently specified as follows: #' #' \code{ #' list( #' zscore = stats::qnorm(p = 1 - 0.025), #' iqr = 1.5, #' cook = stats::qf(0.5, ncol(x), nrow(x) - ncol(x)), #' pareto = 0.7, #' mahalanobis = stats::qchisq(p = 1 - 0.025, df = ncol(x)), #' robust = stats::qchisq(p = 1 - 0.025, df = ncol(x)), #' mcd = stats::qchisq(p = 1 - 0.025, df = ncol(x)), #' ics = 0.025, #' optics = 2 * ncol(x), #' iforest = 0.025, #' lof = 0.025 #' ) #' }} #' #' @references \itemize{ #' \item Archimbaud, A., Nordhausen, K., \& Ruiz-Gazen, A. (2018). ICS for multivariate outlier detection with application to quality control. Computational Statistics & Data Analysis, 128, 184–199. \doi{10.1016/j.csda.2018.06.011} #' \item Gnanadesikan, R., \& Kettenring, J. R. (1972). Robust estimates, residuals, and outlier detection with multiresponse data. Biometrics, 81-124. #' \item Bollen, K. A., & Jackman, R. W. (1985). Regression diagnostics: An expository treatment of outliers and influential cases. Sociological Methods & Research, 13(4), 510-542. #' \item Cabana, E., Lillo, R. E., \& Laniado, H. (2019). Multivariate outlier detection based on a robust Mahalanobis distance with shrinkage estimators. arXiv preprint arXiv:1904.02596. #' \item Cook, R. D. (1977). Detection of influential observation in linear regression. Technometrics, 19(1), 15-18. #' \item Iglewicz, B., & Hoaglin, D. C. (1993). How to detect and handle outliers (Vol. 16). Asq Press. #' \item Leys, C., Klein, O., Dominicy, Y., \& Ley, C. (2018). Detecting multivariate outliers: Use a robust variant of Mahalanobis distance. Journal of Experimental Social Psychology, 74, 150-156. #' \item Liu, F. T., Ting, K. M., & Zhou, Z. H. (2008, December). Isolation forest. In 2008 Eighth IEEE International Conference on Data Mining (pp. 413-422). IEEE. #' \item Rousseeuw, P. J., \& Van Zomeren, B. C. (1990). Unmasking multivariate outliers and leverage points. Journal of the American Statistical association, 85(411), 633-639. #' } #' #' @examples #' # Univariate #' check_outliers(mtcars$mpg) #' #' # Multivariate #' # select only mpg and disp (continuous) #' mt1 <- mtcars[, c(1, 3, 4)] #' # create some fake outliers and attach outliers to main df #' mt2 <- rbind(mt1, data.frame(mpg = c(37, 40), disp = c(300, 400), hp = c(110, 120))) #' # fit model with outliers #' model <- lm(disp ~ mpg + hp, data = mt2) #' #' check_outliers(model) #' # plot(check_outliers(model)) #' #' check_outliers(model, method = c("mahalabonis", "mcd")) #' \dontrun{ #' # This one takes some seconds to finish... #' check_outliers(model, method = "ics") #' #' # For dataframes #' check_outliers(mtcars) #' check_outliers(mtcars, method = "all") #' } #' @importFrom insight n_obs get_predictors get_data #' @importFrom stats cooks.distance mahalanobis cov #' @export check_outliers <- function(x, ...) { UseMethod("check_outliers") } #' @rdname check_outliers #' @export check_outliers.default <- function(x, method = c("cook", "pareto"), threshold = NULL, ...) { # Check args if (all(method == "all")) { method <- c("zscore", "iqr", "cook", "pareto", "mahalanobis", "mcd", "ics", "optics", "iforest", "lof") } method <- match.arg(method, c("zscore", "iqr", "cook", "pareto", "mahalanobis", "robust", "mcd", "ics", "optics", "iforest", "lof"), several.ok = TRUE) # Remove non-numerics data <- insight::get_predictors(x) data <- data[, sapply(data, is.numeric), drop = FALSE] # Thresholds if (is.null(threshold)) { thresholds <- .check_outliers_thresholds(data) } else if (is.list(threshold)) { thresholds <- .check_outliers_thresholds(data) thresholds[[names(threshold)]] <- threshold[[names(threshold)]] } else { stop("The `threshold` argument must be NULL (for default values) or a list containig threshold values for desired methods (e.g., `list('mahalanobis' = 7)`).") } # Others if (!all(method %in% c("cook", "pareto"))) { df <- check_outliers(data, method, threshold, ...) df <- attributes(df)$data } else { df <- data.frame(Obs = row.names(data)) } # Cook if ("cook" %in% c(method) & insight::model_info(x)$is_bayesian == FALSE) { df <- cbind(df, .check_outliers_cook(x, threshold = thresholds$cook)$data_cook) } # Pareto if ("pareto" %in% c(method) & insight::model_info(x)$is_bayesian) { df <- cbind(df, .check_outliers_pareto(x, threshold = thresholds$pareto)$data_pareto) } # Composite outlier score df$Outlier <- rowMeans(df[grepl("Outlier_", names(df))]) df <- df[c(names(df)[names(df) != "Outlier"], "Outlier")] # Out outlier <- df$Outlier # Attributes class(outlier) <- c("check_outliers", "see_check_outliers", class(outlier)) attr(outlier, "data") <- df attr(outlier, "threshold") <- thresholds attr(outlier, "method") <- method attr(outlier, "text_size") <- 3 outlier } #' @rdname check_outliers #' @export check_outliers.numeric <- function(x, method = "zscore", threshold = NULL, ...) { check_outliers(as.data.frame(x), method = method, threshold = threshold, ...) } #' @rdname check_outliers #' @export check_outliers.data.frame <- function(x, method = "mahalanobis", threshold = NULL, ...) { # Remove non-numerics x <- x[, sapply(x, is.numeric), drop = FALSE] # Check args if (all(method == "all")) { method <- c("zscore", "iqr", "mahalanobis", "mcd", "ics", "optics", "iforest", "lof") } method <- match.arg(method, c("zscore", "iqr", "cook", "pareto", "mahalanobis", "robust", "mcd", "ics", "optics", "iforest", "lof"), several.ok = TRUE) # Thresholds if (is.null(threshold)) { thresholds <- .check_outliers_thresholds(x) } else if (is.list(threshold)) { thresholds <- .check_outliers_thresholds(x) thresholds[[names(threshold)]] <- threshold[[names(threshold)]] } else { stop("The `threshold` argument must be NULL (for default values) or a list containig threshold values for desired methods (e.g., `list('mahalanobis' = 7)`).") } out <- list() # Z-score if ("zscore" %in% c(method)) { out <- c(out, .check_outliers_zscore(x, threshold = thresholds$zscore, robust = TRUE, method = "max")) } # IQR if ("iqr" %in% c(method)) { out <- c(out, .check_outliers_iqr(x, threshold = thresholds$iqr, method = "tukey")) } # Mahalanobis if ("mahalanobis" %in% c(method)) { out <- c(out, .check_outliers_mahalanobis(x, threshold = thresholds$mahalanobis)) } # Robust Mahalanobis if ("robust" %in% c(method)) { out <- c(out, .check_outliers_robust(x, threshold = thresholds$robust)) } # MCD if ("mcd" %in% c(method)) { out <- c(out, .check_outliers_mcd(x, threshold = thresholds$mcd, percentage_central = .66)) } # ICS if ("ics" %in% c(method)) { out <- c(out, .check_outliers_ics(x, threshold = thresholds$ics)) } # OPTICS if ("optics" %in% c(method)) { out <- c(out, .check_outliers_optics(x, threshold = thresholds$optics)) } # Isolation Forest if ("iforest" %in% c(method)) { out <- c(out, .check_outliers_iforest(x, threshold = thresholds$iforest)) } # Local Outlier Factor if ("lof" %in% c(method)) { out <- c(out, .check_outliers_lof(x, threshold = thresholds$lof)) } # Combine outlier data df <- data.frame(Obs = row.names(x)) for (i in names(out[sapply(out, is.data.frame)])) { df <- cbind(df, out[[i]]) } df$Obs <- NULL # Remove temp column # Composite outlier score df$Outlier <- rowMeans(df[grepl("Outlier_", names(df))]) # Out outlier <- df$Outlier # Attributes class(outlier) <- c("check_outliers", "see_check_outliers", class(outlier)) attr(outlier, "data") <- df attr(outlier, "threshold") <- thresholds attr(outlier, "method") <- method attr(outlier, "text_size") <- 3 outlier } #' @export as.data.frame.check_outliers <- function(x, ...) { attributes(x)$data } #' @export as.numeric.check_outliers <- function(x, ...) { attributes(x)$data$Outlier } #' @importFrom stats qf qchisq .check_outliers_thresholds <- function(x, zscore = stats::qnorm(p = 1 - 0.025), iqr = 1.5, cook = stats::qf(0.5, ncol(x), nrow(x) - ncol(x)), pareto = 0.7, mahalanobis = stats::qchisq(p = 1 - 0.025, df = ncol(x)), robust = stats::qchisq(p = 1 - 0.025, df = ncol(x)), mcd = stats::qchisq(p = 1 - 0.025, df = ncol(x)), ics = 0.025, optics = 2 * ncol(x), iforest = 0.025, lof = 0.025, ...) { list( "zscore" = zscore, "iqr" = iqr, "cook" = cook, "pareto" = pareto, "mahalanobis" = mahalanobis, "robust" = robust, "mcd" = mcd, "ics" = ics, "optics" = optics, "iforest" = iforest, "lof" = lof ) } .check_outliers_zscore <- function(x, threshold = stats::qnorm(p = 1 - 0.025), robust = TRUE, method = "max") { # Standardize if (robust == FALSE) { d <- abs(as.data.frame(sapply(x, function(x) (x - mean(x, na.rm = TRUE)) / sd(x, na.rm = TRUE)))) } else { d <- abs(as.data.frame(sapply(x, function(x) (x - median(x, na.rm = TRUE)) / mad(x, na.rm = TRUE)))) } out <- data.frame(Obs = 1:nrow(as.data.frame(d))) out$Distance_Zscore <- sapply(as.data.frame(t(d)), method, na.omit = TRUE, na.rm = TRUE) # Filter out$Outlier_Zscore <- as.numeric(out$Distance_Zscore > threshold) out$Obs <- NULL list( "data_zscore" = out, "threshold_zscore" = threshold ) } #' @importFrom stats IQR quantile .check_outliers_iqr <- function(x, threshold = 1.5, method = "tukey") { d <- data.frame(Obs = 1:nrow(as.data.frame(x))) for (col in 1:ncol(as.data.frame(x))) { v <- x[, col] if (method == "tukey") { iqr <- stats::quantile(v, 0.75, na.rm = TRUE) - stats::quantile(v, 0.25, na.rm = TRUE) } else { iqr <- stats::IQR(v, na.rm = TRUE) } lower <- stats::quantile(v, 0.25, na.rm = TRUE) - (iqr * threshold) upper <- stats::quantile(v, 0.75, na.rm = TRUE) + (iqr * threshold) d[names(as.data.frame(x))[col]] <- ifelse(v > upper, 1, ifelse(v < lower, 1, 0) ) } d$Obs <- NULL out <- data.frame(Obs = 1:nrow(as.data.frame(d))) out$Distance_IQR <- sapply(as.data.frame(t(d)), function(x) { ifelse(all(is.na(x)), NA, mean(x)) }) out$Outlier_IQR <- sapply(as.data.frame(t(d)), function(x) { ifelse(all(is.na(x)), NA, max(x)) }) out$Obs <- NULL list( "data_iqr" = out, "threshold_iqr" = threshold ) } #' @importFrom stats cooks.distance .check_outliers_cook <- function(x, threshold = NULL) { # Compute d <- unname(stats::cooks.distance(x)) out <- data.frame(Obs = 1:length(d)) out$Distance_Cook <- d # Filter out$Outlier_Cook <- as.numeric(out$Distance_Cook > threshold) out$Obs <- NULL list( "data_cook" = out, "threshold_cook" = threshold ) } .check_outliers_pareto <- function(x, threshold = 0.7) { # Install packages if (!requireNamespace("loo", quietly = TRUE)) { stop("Package `loo` required for this function to work. Please install it by running `install.packages('loo')`.", call. = FALSE) } # Compute d <- suppressWarnings(loo::pareto_k_values(loo::loo(x))) out <- data.frame(Obs = 1:length(d)) out$Distance_Pareto <- d # Filter out$Outlier_Pareto <- as.numeric(out$Distance_Pareto > threshold) out$Obs <- NULL list( "data_pareto" = out, "threshold_pareto" = threshold ) } #' @importFrom stats mahalanobis cov .check_outliers_mahalanobis <- function(x, threshold = NULL) { out <- data.frame(Obs = 1:nrow(x)) # Compute out$Distance_Mahalanobis <- stats::mahalanobis(x, center = colMeans(x), cov = stats::cov(x)) # Filter out$Outlier_Mahalanobis <- as.numeric(out$Distance_Mahalanobis > threshold) out$Obs <- NULL list( "data_mahalanobis" = out, "threshold_mahalanobis" = threshold ) } # Bigutils not yet fully available on CRAN .check_outliers_robust <- function(x, threshold = NULL) { out <- data.frame(Obs = 1:nrow(x)) # Install packages if (!requireNamespace("bigutilsr", quietly = TRUE)) { stop("Package `bigutilsr` required for this function to work. Please install it by running `install.packages('bigutilsr')`.", call. = FALSE) } # Compute out$Distance_Robust <- bigutilsr::covRob(x, estim = "pairwiseGK")$dist # Filter out$Outlier_Robust <- as.numeric(out$Distance_Robust > threshold) out$Obs <- NULL list( "data_robust" = out, "threshold_robust" = threshold ) } .check_outliers_mcd <- function(x, threshold = NULL, percentage_central = .50) { out <- data.frame(Obs = 1:nrow(x)) # Install packages if (!requireNamespace("MASS", quietly = TRUE)) { stop("Package `MASS` required for this function to work. Please install it by running `install.packages('MASS')`.", call. = FALSE) } # Compute mcd <- MASS::cov.mcd(x, quantile.used = percentage_central * nrow(x)) out$Distance_MCD <- stats::mahalanobis(x, center = mcd$center, cov = mcd$cov) # Filter out$Outlier_MCD <- as.numeric(out$Distance_MCD > threshold) out$Obs <- NULL list( "data_mcd" = out, "threshold_mcd" = threshold ) } .check_outliers_ics <- function(x, threshold = 0.025, ...) { out <- data.frame(Obs = 1:nrow(x)) # Install packages if (!requireNamespace("ICS", quietly = TRUE)) { stop("Package `ICS` required for this function to work. Please install it by running `install.packages('ICS')`.", call. = FALSE) } if (!requireNamespace("ICSOutlier", quietly = TRUE)) { stop("Package `ICSOutlier` required for this function to work. Please install it by running `install.packages('ICSOutlier')`.", call. = FALSE) } # Get n cores n_cores <- if (!requireNamespace("parallel", quietly = TRUE)) { NULL } else { parallel::detectCores() - 1 } # Run algorithm # Try outliers <- tryCatch( { ics <- ICS::ics2(x) ICSOutlier::ics.outlier(object = ics, ncores = n_cores, level.dist = threshold, ...) }, error = function(e) { NULL } ) if (is.null(outliers)) { if (ncol(x) == 1) { insight::print_color("At least two numeric predictors are required to detect outliers.\n", "red") } else { insight::print_color(sprintf("'check_outliers()' does not support models of class '%s'.\n", class(x)[1]), "red") } } # Get results cutoff <- outliers@ics.dist.cutoff out$Distance_ICS <- outliers@ics.distances out$Outlier_ICS <- as.numeric(out$Distance_ICS > cutoff) out$Obs <- NULL # Out list( "data_ICS" = out, "threshold_ICS" = threshold ) } .check_outliers_optics <- function(x, threshold = NULL) { out <- data.frame(Obs = 1:nrow(x)) # Install packages if (!requireNamespace("dbscan", quietly = TRUE)) { stop("Package `dbscan` required for this function to work. Please install it by running `install.packages('dbscan')`.", call. = FALSE) } # Compute rez <- dbscan::optics(x, minPts = threshold) rez <- dbscan::extractXi(rez, xi = 0.05) # TODO: find automatic way of setting xi out$Distance_OPTICS <- rez$coredist # Filter if (is.null(rez$cluster)) { out$Outlier_OPTICS <- 0 } else { out$Outlier_OPTICS <- as.numeric(rez$cluster == 0) } out$Obs <- NULL list( "data_optics" = out, "threshold_optics" = threshold ) } #' @importFrom utils packageVersion #' @importFrom stats median qnorm mad sd .check_outliers_iforest <- function(x, threshold = 0.025) { out <- data.frame(Obs = 1:nrow(x)) # Install packages if (!requireNamespace("solitude", quietly = TRUE)) { stop("Package `solitude` required for this function to work. Please install it by running `install.packages('solitude')`.", call. = FALSE) } # Compute if (utils::packageVersion("solitude") < "0.2.0") { iforest <- solitude::isolationForest(x) out$Distance_iforest <- predict(iforest, x, type = "anomaly_score") } else if (utils::packageVersion("solitude") == "0.2.0") { stop("Must update package `solitude` (above version 0.2.0). Please run `install.packages('solitude')`.", call. = FALSE) } else { iforest <- solitude::isolationForest$new(sample_size = nrow(x)) suppressMessages(iforest$fit(x)) out$Distance_iforest <- iforest$scores$anomaly_score } # Threshold cutoff <- stats::median(out$Distance_iforest) + stats::qnorm(1 - threshold) * stats::mad(out$Distance_iforest) # Filter out$Outlier_iforest <- as.numeric(out$Distance_iforest >= cutoff) out$Obs <- NULL list( "data_iforest" = out, "threshold_iforest" = threshold ) } .check_outliers_lof <- function(x, threshold = NULL) { out <- data.frame(Obs = 1:nrow(x)) # Install packages if (!requireNamespace("dbscan", quietly = TRUE)) { stop("Package `dbscan` required for this function to work. Please install it by running `install.packages('dbscan')`.", call. = FALSE) } # Compute out$Distance_LOF <- log(dbscan::lof(x, k = ncol(x) - 1)) # Threshold # TODO: use tukey_mc from bigutilsr package cutoff <- stats::qnorm(1 - threshold) * stats::sd(out$Distance_LOF) # Filter out$Outlier_LOF <- as.numeric(out$Distance_LOF > cutoff) out$Obs <- NULL list( "data_lof" = out, "threshold_lof" = threshold ) } #' @export check_outliers.glmmTMB <- function(x, ...) { NULL } performance/R/model_performance.R0000644000176200001440000000225613611777366016606 0ustar liggesusers#' @title Model Performance #' @name model_performance #' #' @description See the documentation for your object's class: #' \itemize{ #' \item \link[=model_performance.lm]{Frequentist Regressions} #' \item \link[=model_performance.merMod]{Mixed models} #' \item \link[=model_performance.stanreg]{Bayesian models} #' \item \link[=model_performance.lavaan]{CFA / SEM lavaan models} #' } #' #' @seealso \code{\link[=compare_performance]{compare_performance()}} to compare performance of many different models. #' #' @param model Statistical model. #' @param ... Arguments passed to or from other methods, resp. for #' \code{compare_performance()}, one or multiple model objects (also of #' different classes). #' #' @return A data frame (with one row) and one column per "index" (see \code{metrics}). #' #' @examples #' model <- lm(mpg ~ wt + cyl, data = mtcars) #' model_performance(model) #' #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' model_performance(model) #' @export model_performance <- function(model, ...) { UseMethod("model_performance") } #' @rdname model_performance #' @export performance <- model_performance performance/R/icc.R0000644000176200001440000002372413616476346013665 0ustar liggesusers#' Intraclass Correlation Coefficient (ICC) #' #' This function calculates the intraclass-correlation coefficient #' (ICC) - sometimes also called \emph{variance partition coefficient} #' (VPC) - for mixed effects models. The ICC can be calculated for all models #' supported by \code{\link[insight]{get_variance}}. For models fitted with #' the \pkg{brms}-package, a variance decomposition based on the posterior #' predictive distribution is calculated (see 'Details'). #' #' @param model A (Bayesian) mixed effects model. #' @param re.form Formula containing group-level effects to be considered in #' the prediction. If \code{NULL} (default), include all group-level effects. #' Else, for instance for nested models, name a specific group-level effect #' to calculate the variance decomposition for this group-level. #' @param ci The Credible Interval level. #' @param ... Currently not used. #' #' @inheritParams r2_bayes #' #' @return A list with two values, the adjusted and conditional ICC. For models #' of class \code{brmsfit}, a list with two values, the decomposed ICC as well #' as the credible intervals for this ICC. #' #' @references \itemize{ #' \item Hox, J. J. (2010). Multilevel analysis: techniques and applications (2nd ed). New York: Routledge. #' \item Nakagawa, S., Johnson, P. C. D., & Schielzeth, H. (2017). The coefficient of determination R2 and intra-class correlation coefficient from generalized linear mixed-effects models revisited and expanded. Journal of The Royal Society Interface, 14(134), 20170213. \doi{10.1098/rsif.2017.0213} #' \item Rabe-Hesketh, S., & Skrondal, A. (2012). Multilevel and longitudinal modeling using Stata (3rd ed). College Station, Tex: Stata Press Publication. #' \item Raudenbush, S. W., & Bryk, A. S. (2002). Hierarchical linear models: applications and data analysis methods (2nd ed). Thousand Oaks: Sage Publications. #' } #' #' @details #' \subsection{Interpretation}{ #' The ICC can be interpreted as \dQuote{the proportion of the variance explained #' by the grouping structure in the population}. This index goes from 0, if the #' grouping conveys no information, to 1, if all observations in a group are #' identical (Gelman \& Hill, 2007, p. 258). In other word, the ICC #' \dQuote{can also be interpreted as the expected correlation between two #' randomly drawn units that are in the same group} \cite{(Hox 2010: 15)}, #' although this definition might not apply to mixed models with more complex #' random effects structures. #' } #' \subsection{Calculation}{ #' The ICC is calculated by dividing the random effect variance, #' \ifelse{html}{\out{σ2i}}{\eqn{\sigma^2_i}}, by #' the total variance, i.e. the sum of the random effect variance and the #' residual variance, \ifelse{html}{\out{σ2ε}}{\eqn{\sigma^2_\epsilon}}. #' } #' \subsection{Adjusted and conditional ICC}{ #' \code{icc()} calculates an adjusted and conditional ICC, which both take #' all sources of uncertainty (i.e. of \emph{all random effects}) into account. While #' the \emph{adjusted ICC} only relates to the random effects, the \emph{conditional ICC} #' also takes the fixed effects variances into account (see \cite{Nakagawa et al. 2017}). #' Typically, the \emph{adjusted} ICC is of interest when the analysis of random #' effects is of interest. \code{icc()} returns a meaningful ICC also for more #' complex random effects structures, like models with random slopes or nested #' design (more than two levels) and is applicable for models with other distributions #' than Gaussian. For more details on the computation of the variances, see #' \code{\link[insight]{get_variance}}. #' } #' \subsection{ICC for unconditional and conditional models}{ #' Usually, the ICC is calculated for the null model ("unconditional model"). #' However, according to \cite{Raudenbush and Bryk (2002)} or #' \cite{Rabe-Hesketh and Skrondal (2012)} it is also feasible to compute the ICC #' for full models with covariates ("conditional models") and compare how #' much, e.g., a level-2 variable explains the portion of variation in the grouping #' structure (random intercept). #' } #' \subsection{ICC for specific group-levels}{ #' The proportion of variance for specific levels related to each other #' (e.g., similarity of level-1-units within level-2-units or level-2-units #' within level-3-units) must be calculated manually. Use \code{\link[insight]{get_variance}} #' to get the random intercept variances (between-group-variances) and residual #' variance of the model, and calculate the ICC for the various level correlations. #' \cr \cr #' For example, for the ICC between level 1 and 2: \cr #' \code{sum(insight::get_variance_intercept(model)) /} \cr #' \code{ (sum(insight::get_variance_intercept(model)) + insight::get_variance_residual(model))} #' \cr \cr #' For for the ICC between level 2 and 3: \cr #' \code{insight::get_variance_intercept(model)[2] /} \cr #' \code{ sum(insight::get_variance_intercept(model))} #' } #' \subsection{ICC for brms-models}{ #' If \code{model} is of class \code{brmsfit}, \code{icc()} calculates a #' variance decomposition based on the posterior predictive distribution. In #' this case, first, the draws from the posterior predictive distribution #' \emph{not conditioned} on group-level terms (\code{posterior_predict(..., re.form = NA)}) #' are calculated as well as draws from this distribution \emph{conditioned} #' on \emph{all random effects} (by default, unless specified else in \code{re.form}) #' are taken. Then, second, the variances for each of these draws are calculated. #' The "ICC" is then the ratio between these two variances. This is the recommended #' way to analyse random-effect-variances for non-Gaussian models. It is then possible #' to compare variances across models, also by specifying different group-level #' terms via the \code{re.form}-argument. #' \cr \cr #' Sometimes, when the variance of the posterior predictive distribution is #' very large, the variance ratio in the output makes no sense, e.g. because #' it is negative. In such cases, it might help to use \code{robust = TRUE}. #' } #' #' @examples #' if (require("lme4")) { #' model <- lme4::lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) #' icc(model) #' } #' @importFrom insight model_info get_variance print_color #' @export icc <- function(model, ...) { UseMethod("icc") } #' @export icc.default <- function(model, ...) { if (!insight::model_info(model)$is_mixed) { warning("'model' has no random effects.", call. = FALSE) return(NULL) } vars <- tryCatch( { insight::get_variance(model, name_fun = "icc()", name_full = "ICC") }, error = function(e) { if (inherits(e, c("simpleError", "error"))) { insight::print_color(e$message, "red") cat("\n") } NULL } ) if (is.null(vars) || all(is.na(vars))) { return(NA) } # check if we have successfully computed all variance components... components <- c("var.fixed", "var.random", "var.residual") check_elements <- sapply(components, function(.i) !is.null(vars[[.i]])) if (!all(check_elements)) { return(NA) } # Calculate ICC values icc_adjusted <- vars$var.random / (vars$var.random + vars$var.residual) icc_conditional <- vars$var.random / (vars$var.fixed + vars$var.random + vars$var.residual) structure( class = "icc", list( "ICC_adjusted" = icc_adjusted, "ICC_conditional" = icc_conditional ) ) } #' @importFrom bayestestR ci #' @importFrom insight is_multivariate find_response model_info #' @importFrom stats quantile var #' @rdname icc #' @export icc.brmsfit <- function(model, re.form = NULL, robust = TRUE, ci = .95, ...) { mi <- insight::model_info(model) # for multivariate response models, we need a more complicated check... if (insight::is_multivariate(model)) { resp <- insight::find_response(model) is.mixed <- sapply(resp, function(i) mi[[i]]$is_mixed, simplify = TRUE) if (!any(is.mixed)) { warning("'model' has no random effects.", call. = FALSE) return(NULL) } } else if (!mi$is_mixed) { warning("'model' has no random effects.", call. = FALSE) return(NULL) } if (!requireNamespace("brms", quietly = TRUE)) { stop("Package `brms` needed for this function to work. Please install it.", call. = FALSE) } PPD <- brms::posterior_predict(model, re.form = re.form, summary = FALSE) var_total <- apply(PPD, MARGIN = 1, FUN = stats::var) PPD_0 <- brms::posterior_predict(model, re.form = NA, summary = FALSE) var_rand_intercept <- apply(PPD_0, MARGIN = 1, FUN = stats::var) if (robust) { fun <- get("median", asNamespace("stats")) } else { fun <- get("mean", asNamespace("base")) } var_icc <- var_rand_intercept / var_total var_residual <- var_total - var_rand_intercept ci_icc <- rev(1 - stats::quantile(var_rand_intercept / var_total, probs = c((1 - ci) / 2, (1 + ci) / 2))) result <- structure( class = "icc_decomposed", list( "ICC_decomposed" = 1 - fun(var_icc), "ICC_CI" = ci_icc ) ) attr(result, "var_rand_intercept") <- fun(var_rand_intercept) attr(result, "var_residual") <- fun(var_residual) attr(result, "var_total") <- fun(var_total) attr(result, "ci.var_rand_intercept") <- bayestestR::ci(var_rand_intercept, ci = ci) attr(result, "ci.var_residual") <- bayestestR::ci(var_residual, ci = ci) attr(result, "ci.var_total") <- bayestestR::ci(var_total, ci = ci) attr(result, "ci") <- ci attr(result, "re.form") <- re.form attr(result, "ranef") <- model$ranef$group[1] # remove data attr(attr(result, "ci.var_rand_intercept"), "data") <- NULL attr(attr(result, "ci.var_residual"), "data") <- NULL attr(attr(result, "ci.var_total"), "data") <- NULL result } performance/R/r2_zeroinflated.R0000644000176200001440000000455613616476346016222 0ustar liggesusers#' @title R2 for models with zero-inflation #' @name r2_zeroinflated #' #' @description Calculates R2 for models with zero-inflation component, including mixed effects models. #' #' @param model A model. #' @param method Indicates the method to calculate R2. See 'Details'. May be abbreviated. #' #' @return For the default-method, a list with the R2 and adjusted R2 values. #' For \code{method = "correlation"}, a named numeric vector with the #' correlation-based R2 value. #' #' @details The default-method calculates an R2 value based on the residual #' variance divided by the total variance. For \code{method = "correlation"}, #' R2 is a correlation-based measure, which is rather crude. It simply computes #' the squared correlation between the model's actual and predicted response. #' #' @examples #' \donttest{ #' if (require("pscl")) { #' data(bioChemists) #' model <- zeroinfl( #' art ~ fem + mar + kid5 + ment | kid5 + phd, #' data = bioChemists #' ) #' #' r2_zeroinflated(model) #' } #' } #' @importFrom stats cor predict coef model.matrix #' @importFrom insight model_info get_response find_parameters n_obs #' @export r2_zeroinflated <- function(model, method = c("default", "correlation")) { method <- match.arg(method) mi <- insight::model_info(model) if (!mi$is_zero_inflated) { warning("Model has no zero-inflation component.") } if (method == "default") { .r2_zi_default(model) } else { .r2_zi_correlation(model) } } .r2_zi_correlation <- function(model) { r2_zi <- stats::cor(insight::get_response(model), stats::predict(model, type = "response"))^2 names(r2_zi) <- "R2 for ZI-models" r2_zi } .r2_zi_default <- function(model) { n <- insight::n_obs(model) k <- length(insight::find_parameters(model)[["conditional"]]) y <- insight::get_response(model) # pred <- stats::predict(model, type = "response") var_fixed <- sum((stats::fitted(model) - mean(y))^2) var_resid <- sum(stats::residuals(model, type = "pearson")^2) r2_zi <- var_fixed / (var_resid + var_fixed) r2_zi_adj <- 1 - (1 - r2_zi) * (n - 1) / (n - k - 1) out <- list(R2 = r2_zi, R2_adjusted = r2_zi_adj) names(out$R2) <- "R2" names(out$R2_adjusted) <- "adjusted R2" attr(out, "model_type") <- "Zero-Inflated and Hurdle" structure(class = "r2_generic", out) } performance/R/performance_aicc.R0000644000176200001440000000462713616476346016410 0ustar liggesusers#' @title Compute AIC and second order AIC #' @name performance_aicc #' #' @description Compute the second-order Akaike's information criterion (AICc). #' The second-order (or small sample) is a AIC with a correction for small sample #' sizes. \code{performance_aic()} is a small wrapper that returns the AIC. It is #' a generic function that also works for some models that don't have a AIC method #' (like Tweedie models). #' #' @param x A model object. #' @param ... Currently not used. #' #' @return Numeric, the AIC or AICc value. #' #' @references \itemize{ #' \item Akaike, H. (1973) Information theory as an extension of the maximum likelihood principle. In: Second International Symposium on Information Theory, pp. 267–281. Petrov, B.N., Csaki, F., Eds, Akademiai Kiado, Budapest. #' \item Hurvich, C. M., Tsai, C.-L. (1991) Bias of the corrected AIC criterion for underfitted regression and time series models. Biometrika 78, 499–509. #' } #' #' @examples #' m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) #' AIC(m) #' performance_aicc(m) #' @export performance_aicc <- function(x, ...) { UseMethod("performance_aicc") } #' @rdname performance_aicc #' @importFrom stats AIC #' @export performance_aic <- function(x, ...) { if (inherits(x, c("vgam", "vglm"))) { if (!requireNamespace("VGAM", quietly = TRUE)) { warning("Package 'VGAM' required for this function work. Please install it.", call. = FALSE) return(NULL) } VGAM::AIC(x) } else if (insight::model_info(x)$family == "Tweedie") { if (!requireNamespace("tweedie", quietly = TRUE)) { warning("Package 'tweedie' required for this function work. Please install it.", call. = FALSE) return(NULL) } suppressMessages(tweedie::AICtweedie(x)) } else { tryCatch( { stats::AIC(x) }, error = function(e) { NULL } ) } } #' @importFrom insight n_obs #' @importFrom stats logLik #' @export performance_aicc.default <- function(x, ...) { n <- insight::n_obs(x) ll <- stats::logLik(x) k <- attr(ll, "df") -2 * as.vector(ll) + 2 * k * (n / (n - k - 1)) } #' @export performance_aicc.vglm <- function(x, ...) { if (!requireNamespace("VGAM", quietly = TRUE)) { warning("Package 'VGAM' required for this function work. Please install it.", call. = FALSE) return(NULL) } VGAM::AICc(x) } performance/R/r2_xu.R0000644000176200001440000000211613564746345014157 0ustar liggesusers#' @title Xu' R2 (Omega-squared) #' @name r2_xu #' #' @description Calculates Xu' Omega-squared value, a simple R2 equivalent for linear mixed models. #' #' @param model A linear (mixed) model. #' #' @return The R2 value. #' #' @details \code{r2_xu()} is a crude measure for the explained variance from #' linear (mixed) effects models, which is originally denoted as #' \ifelse{html}{\out{Ω2}}{\eqn{\Omega^2}}. #' #' @references Xu, R. (2003). Measuring explained variation in linear mixed effects models. Statistics in Medicine, 22(22), 3527–3541. \doi{10.1002/sim.1572} #' #' @examples #' model <- lm(Sepal.Length ~ Petal.Length + Species, data = iris) #' r2_xu(model) #' @importFrom stats residuals var #' @importFrom insight get_response model_info #' @export r2_xu <- function(model) { mi <- insight::model_info(model) if (!mi$is_linear) { stop("Xu's R2 is only applicable for linear models.") } .r2_xu <- 1 - stats::var(stats::residuals(model)) / stats::var(insight::get_response(model)) names(.r2_xu) <- "Xu's R2" .r2_xu } performance/NEWS.md0000644000176200001440000001746213616504743013674 0ustar liggesusers# performance 0.4.4 ## General * Removed `logLik.felm()`, because this method is now implemented in the *lfe* package. * Support for `DirichletRegModel` models. ## New functions * `check_itemscale()` to describe various measures of internal consistencies for scales which were built from several items from a PCA, using `parameters::principal_components()`. * `r2_efron()` to compute Efron's pseudo R2. ## Bug fixes * Fixed issue in documentation of `performance_score()`. # performance 0.4.3 ## General * Support for `mixor`, `cpglm` and `cpglmm` models. ## New functions * `performance_aic()` as a small wrapper that returns the AIC. It is a generic function that also works for some models that don't have a AIC method (like Tweedie models). * `performance_lrt()` as a small wrapper around `anova()` to perform a Likelihood-Ratio-Test for model comparison. ## Bug fixes * Fix issues with CRAN checks. ## Changes to functions * `model_performance()` now calculates AIC for Tweedie models. # performance 0.4.2 ## General * Support for `bracl`, `brmultinom`, `fixest`, `glmx`, `glmmadmb`, `mclogit`, `mmclogit`, `vgam` and `vglm` models. * `model_performance()` now supports *plm* models. * `r2()` now supports *complmrob* models. * `compare_performance()` now gets a `plot()`-method (requires package **see**). ## Changes to functions * `compare_performance()` gets a `rank`-argument, to rank models according to their overall model performance. * `compare_performance()` has a nicer `print()`-method now. * Verbosity for `compare_performance()` was slightly adjusted. * `model_performance()`-methods for different objects now also have a `verbose`-argument. ## Minor changes * `check_collinearity()` now no longer returns backticks in row- and column names. ## Bug fixes * Fixed issue in `r2()` for `wbm`-models with cross-level interactions. * `plot()`-methods for `check_heteroscedasticity()` and `check_homogeneity()` now work without requiring to load package *see* before. * Fixed issues with models of class `rlmerMod`. # performance 0.4.0 ## General * `performance()` is an alias for `model_performance()`. ## Deprecated and Defunct * `principal_components()` was removed and re-implemented in the **parameters**-package. Please use `parameters::principal_components()` now. ## Changes to functions * `check_outliers()` now also works on data frames. * Added more methods to `check_outliers()`. * `performance_score()` now also works on `stan_lmer()` and `stan_glmer()` objects. * `check_singularity()` now works with models of class *clmm*. * `r2()` now works with models of class *clmm*, *bigglm* and *biglm*. * `check_overdispersion()` for mixed models now checks that model family is Poisson. ## Bug fixes * Fixed bug in `compare_performance()` that toggled a warning although models were fit from same data. * Fixed bug in `check_model()` for *glmmTMB* models that occurred when checking for outliers. # performance 0.3.0 ## General * Many `check_*()`-methods now get a `plot()`-method. Package **see** is required for plotting. * `model_performance()` gets a preliminary `print()`-method. ## Breaking changes * The attribute for the standard error of the Bayesian R2 (`r2_bayes()`) was renamed from `std.error` to `SE` to be in line with the naming convention of other easystats-packages. * `compare_performance()` now shows the Bayes factor when all compared models are fit from the same data. Previous behaviour was that the BF was shown when models were of same class. ## Changes to functions * `model_performance()` now also works for *lavaan*-objects. * `check_outliers()` gets a `method`-argument to choose the method for detecting outliers. Furthermore, two new methods (Mahalanobis Distance and Invariant Coordinate Selection) were implemented. * `check_model()` now performs more checks for GLM(M)s and other model objects. * `check_model()` gets a `check`-argument to plot selected checks only. * `r2_nakagawa()` now returns r-squared for models with singular fit, where no random effect variances could be computed. The r-squared then does not take random effect variances into account. This behaviour was changed to be in line with `MuMIn::r.squaredGLMM()`, which returned a value for models with singular fit. * `check_distribution()` now detects negative binomial and zero-inflated distributions. Furthermore, attempt to improve accuracy. * `check_distribution()` now also accepts a numeric vector as input. * `compare_performance()` warns if models were not fit from same data. ## New check-functions * `check_homogeneity()` to check models for homogeneity of variances. ## Bug fixes * Fixed issues with `compare_performance()` and row-ordering. * Fixed issue in `check_collinearity()` for zero-inflated models, where the zero-inflation component had not enough model terms to calculate multicollinearity. * Fixed issue in some `check_*()` and `performance_*()` functions for models with binary outcome, when outcome variable was a factor. # performance 0.2.0 ## General * `r2()` now works for more regression models. * `r2_bayes()` now works for multivariate response models. * `model_performance()` now works for more regression models, and also includes the log-loss, proper scoring rules and percentage of correct predictions as new metric for models with binary outcome. ## New performance-functions * `performance_accuracy()`, which calculates the predictive accuracy of linear or logistic regression models. * `performance_logloss()` to compute the log-loss of models with binary outcome. The log-loss is a proper scoring function comparable to the `rmse()`. * `performance_score()` to compute the logarithmic, quadratic and spherical proper scoring rules. * `performance_pcp()` to calculate the percentage of correct predictions for models with binary outcome. * `performance_roc()`, to calculate ROC-curves. * `performance_aicc()`, to calculate the second-order AIC (AICc). ## New check-functions * `check_collinearity()` to calculate the variance inflation factor and check model predictors for multicollinearity. * `check_outliers()` to check models for influential observations. * `check_heteroscedasticity()` to check models for (non-)constant error variance. * `check_normality()` to check models for (non-)normality of residuals. * `check_autocorrelation()` to check models for auto-correlated residuals. * `check_distribution()` to classify the distribution of a model-family using machine learning. ## New indices-functions * `r2_mckelvey()` to compute McKelvey and Zavoinas R2 value. * `r2_zeroinflated()` to compute R2 for zero-inflated (non-mixed) models. * `r2_xu()` as a crude R2 measure for linear (mixed) models. ## Breaking changes * `model_performance.stanreg()` and `model_performance.brmsfit()` now only return one R2-value and its standard error, instead of different (robust) R2 measures and credible intervals. * `error_rate()` is now integrated in the `performance_pcp()`-function. ## Changes to functions * `model_performance.stanreg()` and `model_performance.brmsfit()` now also return the _WAIC_ (widely applicable information criterion). * `r2_nakagawa()` now calculates the full R2 for mixed models with zero-inflation. * `icc()` now returns `NULL` and no longer stops when no mixed model is provided. * `compare_performance()` now shows the Bayes factor when all compared models are of same class. * Some functions get a `verbose`-argument to show or suppress warnings. ## Bug fixes * Renamed `r2_coxnell()` to `r2_coxsnell()`. * Fix issues in `r2_bayes()` and `model_performance()` for ordinal models resp. models with cumulative link (#48). * `compare_performance()` did not sort the `name`-column properly, if the columns `class` and `name` were not in the same alphabetical order (#51). performance/MD50000644000176200001440000002031513620350016013060 0ustar liggesusers06fca95434dcce073c29a0b73ec070fb *DESCRIPTION f519e98eeda022cd60577608df62cf7f *NAMESPACE 417ba318bcadb96a5eb772b5f54a6d2d *NEWS.md 12505916aefba44148712a1daa571352 *R/binned_residuals.R 98f1a6b60b544fddfcff8b6cecb76ba8 *R/check_autocorrelation.R 52ad206cd326f60405ecac95a973360d *R/check_collinearity.R 13d276b62c2c3a885fb6bcd5bdb75a15 *R/check_convergence.R 652ccec46967e2ac884e67f1fac7307e *R/check_distribution.R a37f3c9cfeef13d5ad600dd9bfd3789f *R/check_heteroscedasticity.R 1d931cf5a8fa14dd606b417023a92fef *R/check_homogeneity.R 162939ca3037df2cd7c78f7c9b36f7f7 *R/check_itemscale.R 9531888dc5a6cd8ff183720a93a1a138 *R/check_model.R 0c4f32ed8ecf84800ed196db29827c9e *R/check_model_diagnostics.R 861fb9b1b8984d8206adb1ceeba1365e *R/check_normality.R 78df354ece5266c5fdba3bddad1cac26 *R/check_outliers.R f8f862b8d095f395fd5a9576e98aac52 *R/check_overdispersion.R 0fdc02e70e51ea52cdeaeff5d7901cfc *R/check_singularity.R d73f30ccfe386c5ab8e134fb16c01563 *R/check_zeroinflation.R 5b09267869ba8ceacb08ba59192a5c07 *R/compare_performance.R e8586fd4a2281dcaea6a2648a80fd3ea *R/cronbachs_alpha.R 9b01e7f1a3c3038a63d95b4d4ac06c3b *R/helpers.R 97fd5dfd7eed11d2e58cb23d8c1a9fdd *R/icc.R ab77cc59697e3740651c86701a1ccbda *R/item_difficulty.R c55c6600846e66a6f0198732d76f4850 *R/item_intercor.R bc50b41c5d3e1618c230f8530f79b82d *R/item_reliability.R a701292695eeb1f77b9d8d1562494c73 *R/item_split_half.R 73641652b98d6cad52c7a9b9f8581d05 *R/logLik.R 9ecf754e19be06b191e3a319a3b2b146 *R/looic.R f173705fe69d9533dc400e124728b00b *R/model_performance.R a0c137199b57ebda4f399e6e5ecde8d6 *R/model_performance.bayesian.R c7eef79a5f09f4f2c73a93345a0fa9f4 *R/model_performance.lavaan.R ead416f3af8e24ae08c095d91895dcdb *R/model_performance.lm.R 84343dfc59085462b2f1511ea1e0efc0 *R/model_performance.mixed.R e676c564ad9f2fef8a1eae30f6eec37b *R/performance_accuracy.R 7d3dd7f9978693d6c2bd11f7a094041c *R/performance_aicc.R fb408628fe09b1b0cf3d195f7f412bc5 *R/performance_hosmer.R 1022e2ebeb1857b54f925f41cceaa181 *R/performance_logloss.R 0b66d65521143710b97709233915ead5 *R/performance_lrt.R 52c5c23d6369ee828ef6331668320c7c *R/performance_mse.R 9cc19085d4fe9aec19649002893c93c0 *R/performance_pcp.R 3b50368315e2c2c203a97b16c1275dda *R/performance_rmse.R 0e056991dbeda96ddae71acdb4bb78a3 *R/performance_roc.R 7d9b682415e21fa053d24b9405459f13 *R/performance_rse.R c2c86860f132f36f850b737612f0f5c3 *R/performance_score.R ab48d8e222bdd2f591d071776f8d482e *R/plot-methods.R eb1ab8351ec490c569b42f2826bb99e5 *R/print-methods.R ba61699f7c3139763b11812f556eabbb *R/r2.R 7343259894a3644dc05bcb254c7ac784 *R/r2_bayes.R fdb9fe6763ce1756cb50805914d26aee *R/r2_coxsnell.R fc19df0427b0956bf151e7e59e98255d *R/r2_efron.R 0b920f76fc8a90cd2d82bbe49651603b *R/r2_kl.R 71d78e9d2541d9fa68a76ecaeacc8df6 *R/r2_loo.R 6ee0674ae44d024bce207706659174ac *R/r2_mcfadden.R 681ed0b15536df67c909593c71200a91 *R/r2_mckelvey.R c8e48f534a1a98bf3d7b482ff4146540 *R/r2_nagelkerke.R 9d2fffb3079cf85193d88567acbf9890 *R/r2_nakagawa.R 03d0dddf74a68b9517d95c077aed3ce2 *R/r2_tjur.R 6028f9769e98d18521d481ec271bd349 *R/r2_xu.R ee82b9e9f3e4e43a7d3e8f1769677b33 *R/r2_zeroinflated.R 6d65b82a86039f94f06bfc92fd8425ab *R/residuals.R ba71e10011877a978e5c9eef2df8065c *R/skewness_kurtosis.R fe2de2ae27323e20ea7fe3baabe33cf3 *R/sysdata.rda 6cbef9e11a783e37f776dae1eec671a3 *README.md a69d7a2126ff915669214b0e5aec3098 *build/partial.rdb 85edc7a61be461660cfc38660e398df0 *inst/WORDLIST b50c1d2f4014eaf4d0f7a470d3a73578 *man/binned_residuals.Rd 12ffb075d6c5dbcde39ac65871fb0cb0 *man/check_autocorrelation.Rd 32756380b1f0ff574aa1bedbd1d62df5 *man/check_collinearity.Rd 24769a2c59ce4bc1ac91487ba9830112 *man/check_convergence.Rd c5bcf4edb129df274f8a5abedbf05f59 *man/check_distribution.Rd 3c475570edbc8aea269c6d4d6f863fbc *man/check_heteroscedasticity.Rd 66f1cbb3e7683598cb457f9ed6853735 *man/check_homogeneity.Rd 98d9cbe5926eb8e7dbef0e69cd912927 *man/check_itemscale.Rd b3848d7cc0e4fc56a5b4ea61b8c5f965 *man/check_model.Rd 317931d177abeb006696bba9ba3bf784 *man/check_normality.Rd 5b7bb547ee7168459054080b37a0dd53 *man/check_outliers.Rd 66490dac561367e60285a9329520c95b *man/check_overdispersion.Rd 1c169f002999c9bfb1d80f065d482f9a *man/check_singularity.Rd 9924d3a38b610369bd97b4a5e451b28a *man/check_zeroinflation.Rd 509674947a9ccbb6f6a0705c160f4957 *man/classify_distribution.Rd 51021264e9ff0f21e996094afbb2ecee *man/compare_performance.Rd 28b74ec394684fad1279ffa11cc45152 *man/cronbachs_alpha.Rd 3f677bb47c97752bef0e04beff1fc9a5 *man/figures/logo.png 868d78ce88ce223d116f8fd871597a98 *man/figures/unnamed-chunk-13-1.png bf5acb33c948e94748dca6c74836c7de *man/figures/unnamed-chunk-22-1.png 4f8a2bd1d4b0d8982a04a5f0352ab866 *man/icc.Rd f57dec6bb39eb601e2094d0cf482d0d0 *man/item_difficulty.Rd b303c0d716275de8894a36b9231e2f81 *man/item_intercor.Rd fa8e88f029fbeceab7d129156cc4dd93 *man/item_reliability.Rd e11206d98477983515b60b8fa1a31817 *man/item_split_half.Rd e3f67bddd295b6c89794eb413d79d9cb *man/looic.Rd 57f7e2c5e203fa536dad2ae38c557c54 *man/model_performance.Rd a27b6b97ab14231d9a3dd10c9ac01067 *man/model_performance.lavaan.Rd 7a08a51b2dfc4fa27761f54772ed17f5 *man/model_performance.lm.Rd af2baeb7eab7ed986987159e87572548 *man/model_performance.merMod.Rd d8ffe5e2a1f8658beebeb91c32d99237 *man/model_performance.stanreg.Rd e2a6610ee2fdec861a287798f672fd86 *man/performance_accuracy.Rd 884b34c6f29bb3b14a4335a7d2328df4 *man/performance_aicc.Rd 2a1b153fb57f824ffefea528b1906ba4 *man/performance_hosmer.Rd ee366839d0c6f858ef8761589ee6f63d *man/performance_logloss.Rd 905df94d76b8db79fec912137eaa1e00 *man/performance_lrt.Rd 634d48e1ce59424aa11db75d2aab5bff *man/performance_mse.Rd 4f4ac66b043ec7c89376d6c93c74657b *man/performance_pcp.Rd 9813fd326bc554bd3ef297c6fe4abb3d *man/performance_rmse.Rd 469fe76438ca42d7997db846781a9c97 *man/performance_roc.Rd f7fcda669efaf069d93e2ba43eb40f5d *man/performance_rse.Rd 2232272cde345510d171ea596156a852 *man/performance_score.Rd 586329aa2a15c65f31e7cd7c87fcec39 *man/r2.Rd fd076093700adcb9e47015ed14c6d041 *man/r2_bayes.Rd cc6ba997138e7317de7f873d38061451 *man/r2_coxsnell.Rd 23ab83cc44afa60215ecf24937085515 *man/r2_efron.Rd ceec402f126ad133c792516ef67c74df *man/r2_kullback.Rd 75c1f7abed438363e5570eec4701f2b5 *man/r2_loo.Rd f076e88e8d3ed11a7fee37d9ced5f5dc *man/r2_mcfadden.Rd 401fa0148d8da0836151c71a2a6e0073 *man/r2_mckelvey.Rd 84e5753b5c9da974ddfe88a5d44f1a04 *man/r2_nagelkerke.Rd f964729613968031c5ef94e4a88f6911 *man/r2_nakagawa.Rd 3345569beb68caca8e901feb7b0b8714 *man/r2_tjur.Rd 1de110937c85740d2d4c4ffad809f7be *man/r2_xu.Rd 761aa03abef48c07de706a3a923ea06b *man/r2_zeroinflated.Rd dbd9bab057163c01c320d0b9d3bb9620 *tests/spelling.R 0942b7515a46be595b0a2112f6793b0d *tests/testthat.R 0813b2d165231ff994267e4563585bf3 *tests/testthat/test-backticks.R fd773b45b29cdd1891fdb83e7a9abcee *tests/testthat/test-check_convergence.R 003bee0e896ef4be4362ae876f560d87 *tests/testthat/test-check_overdispersion.R c09ae411a72c72334a4d25bb8489bab1 *tests/testthat/test-check_singularity.R e5ed028ed795c871fec40ce038ecfe38 *tests/testthat/test-check_zeroinflation.R ed774311913b5f577ce828a7d4350d73 *tests/testthat/test-compare_performance.R e7611de70ae1f8fa84ccfa3d7ec09713 *tests/testthat/test-coxph.R cec364aff5b74cb575a6329faac2873c *tests/testthat/test-cronbachs_alpha.R 493b0340b1ecba0582929a2ff4ca3d87 *tests/testthat/test-icc.R 2e0d552c4a0243ea8c9895c19249623d *tests/testthat/test-item_difficulty.R 1d83f13bd407fd923447c3795df91547 *tests/testthat/test-item_intercor.R 92c1fef8b67bfff2f9054fb6f2f8d8ff *tests/testthat/test-item_reliability.R 79d016027b20a105458f1d8086ecdeb6 *tests/testthat/test-item_splithalf.R adaa7c509a0c564b5b6958316905b56a *tests/testthat/test-model_performance-various.R 4f4f68c41cc54f775461f05bb5992429 *tests/testthat/test-model_performance.bayesian.R ce0e4e6ec80135b1a7a9bd276d076198 *tests/testthat/test-model_performance.lm.R 1d97df40cd07743aec9cea1eab99c45d *tests/testthat/test-model_performance.merMod.R da99393458bec60a495a06aa9db16ba2 *tests/testthat/test-r2_coxsnell.R 9a0da4850b9a9fe28858478d35788b5c *tests/testthat/test-r2_kullback.R 35dff9401951d32b74b97d53f07fb1eb *tests/testthat/test-r2_mcfadden.R 80f9b39a21b8d5e039a897b99d4f447c *tests/testthat/test-r2_nagelkerke.R 3e0fa72c0da035fb8c4bf5a05ccfa49c *tests/testthat/test-r2_nakagawa.R 0d377c2c375b48fd7da5bd07141d75ea *tests/testthat/test-r2_tjur.R 05c4f28693bf9fc6d270def06d44eb47 *tests/testthat/test-r2_zeroinflated.R performance/inst/0000755000176200001440000000000013616746412013542 5ustar liggesusersperformance/inst/WORDLIST0000644000176200001440000000320013616746412014727 0ustar liggesusersAGFI AICc Akademiai al analyse Ankerst Archimbaud arXiv Asq autocorrelated Baayen behaviour bigglm biglm Biometrics Biometrika Bolker Bollen Bollen's Breunig brms Bryk Byrne Carvalho CFA CFI Chisq clmm complmrob conceptionally Cronbach's crossvalidation Csaki DBSCAN discriminations doi Dominicy Dordrecht Durbin easystats Efron Efron's ELPD EQS Erlbaum et Fligner Gabry Gazen Gelman geoms GFI ggplot GL GLMM GLMMadaptive GLMMs glmmTMB Gnanadesikan grey Guilford Hastie Herron Hesketh heteroskedasticity HJ Hoaglin Hoboken Holger Hosmer Hox Hrsg https Hurvich ics ICS IFI iforest Iglewicz intra Intra intraclass Intraclass iqr Jackman JM Kettenring kfold Kiado Killeen Kliegl Kullback Laniado lavaan Leibler Lemeshow Ley Leys lfe Lillo linar Liu lme lof LOF LOGLOSS Lomax LOOIC Maddala Magee mahalanobis Mahwah Matuschek mcd McKelvey Michalos mis modelling multicollinearity multiresponse Nagelkerke Nagelkerke's Nakagawa Nakagawa's nd neighbours NFI NNFI Nordhausen Normed overfitted pareto Petrov plm PNFI poisson Postestimation preprint Psychometrika quartile quartiles Rabe Raudenbush repsectively rescaling RFI RL RMR rmse RMSEA Rousseeuw Routledge rsif Scheepers Schielzeth Schielzeth’s Schumacker SEM Shinichi Skrondal Springer SRMR Stata subscale subscales Subscales Technometrics Tibshirani Tily Tjur Tjur's TLI Trochim Tsai Tweedie unadjusted underfitted underfitting Vasishth Vehtari VIF VPC WAIC Windmeijer Witten WMK Xu Zavoina Zavoinas Zhou Zomeren zscore