vioplot/0000755000176200001440000000000014077742012011752 5ustar liggesusersvioplot/NAMESPACE0000755000176200001440000000154114027763060013176 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(vioplot,data.frame) S3method(vioplot,default) S3method(vioplot,formula) S3method(vioplot,list) S3method(vioplot,matrix) S3method(vioplot,stats) export(vioplot) import(sm) importFrom(grDevices,boxplot.stats) importFrom(grDevices,dev.flush) importFrom(grDevices,dev.hold) importFrom(grDevices,dev.interactive) importFrom(grDevices,devAskNewPage) importFrom(grDevices,xy.coords) importFrom(graphics,Axis) importFrom(graphics,axis) importFrom(graphics,box) importFrom(graphics,lines) importFrom(graphics,par) importFrom(graphics,plot.new) importFrom(graphics,plot.window) importFrom(graphics,plot.xy) importFrom(graphics,points) importFrom(graphics,polygon) importFrom(graphics,rect) importFrom(graphics,title) importFrom(stats,median) importFrom(stats,na.omit) importFrom(stats,quantile) importFrom(zoo,rollmean) vioplot/LICENSE0000644000176200001440000000012113507646542012761 0ustar liggesusersYEAR: 2004 COPYRIGHT HOLDER: Daniel Adler ORGANIZATION: University of Goettingen vioplot/man/0000755000176200001440000000000014027267745012537 5ustar liggesusersvioplot/man/violin.stats.Rd0000644000176200001440000000220114027267745015456 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/vioplot.stats.R \name{vioplot.stats} \alias{vioplot.stats} \alias{violin.stats} \alias{violinplot.stats} \title{Violin Plot Statistics} \usage{ \method{vioplot}{stats}(x, coef = 1.5, do.conf = TRUE, do.out = TRUE, ...) } \arguments{ \item{x}{a numeric vector for which the violin plot will be constructed \code{NA}s and \code{NaN}s are allowed and omitted).} \item{coef}{this determines how far the plot ‘whiskers’ extend out from the box. If coef is positive, the whiskers extend to the most extreme data point which is no more than coef times the length of the box away from the box. A value of zero causes the whiskers to extend to the data extremes (and no outliers be returned).} \item{do.conf, do.out}{logicals; if FALSE, the conf or out component respectively will be empty in the result.} \item{...}{arguments passed to \code{\link[vioplot]{vioplot}}.} } \description{ This function is typically called by another function to gather the statistics necessary for producing box plots, but may be invoked separately. See: \code{\link[grDevices]{boxplot.stats}} } vioplot/man/vioplot.Rd0000755000176200001440000003032614027267745014531 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/vioplot.R \name{vioplot} \alias{vioplot} \alias{violinplot} \alias{vioplot.matrix} \alias{violin.matrix} \alias{violinplot.matrix} \alias{vioplot.list} \alias{vioplot.data.frame} \alias{vioplot.formula} \alias{vioplot.default} \title{Violin Plot} \usage{ \method{vioplot}{matrix}(x, use.cols = TRUE, ...) \method{vioplot}{list}(x, ...) \method{vioplot}{data.frame}(x, ...) \method{vioplot}{matrix}(x, use.cols = TRUE, ...) \method{vioplot}{formula}( formula, data = NULL, ..., subset, na.action = NULL, add = FALSE, ann = !add, horizontal = FALSE, side = "both", xlab = mklab(y_var = horizontal), ylab = mklab(y_var = !horizontal), names = NULL, drop = FALSE, sep = ".", lex.order = FALSE ) \method{vioplot}{default}( x, ..., data = NULL, range = 1.5, h = NULL, xlim = NULL, ylim = NULL, names = NULL, horizontal = FALSE, col = "grey50", border = par()$fg, lty = 1, lwd = 1, rectCol = par()$fg, lineCol = par()$fg, pchMed = 19, colMed = "white", colMed2 = "grey 75", at, add = FALSE, wex = 1, drawRect = TRUE, areaEqual = FALSE, axes = TRUE, frame.plot = axes, panel.first = NULL, panel.last = NULL, asp = NA, main = "", sub = "", xlab = NA, ylab = NA, line = NA, outer = FALSE, xlog = NA, ylog = NA, adj = NA, ann = NA, ask = NA, bg = NA, bty = NA, cex = NA, cex.axis = NA, cex.lab = NA, cex.main = NA, cex.names = NULL, cex.sub = NA, cin = NA, col.axis = NA, col.lab = NA, col.main = NA, col.sub = NA, cra = NA, crt = NA, csi = NA, cxy = NA, din = NA, err = NA, family = NA, fg = NA, fig = NA, fin = NA, font = NA, font.axis = NA, font.lab = NA, font.main = NA, font.sub = NA, lab = NA, las = NA, lend = NA, lheight = NA, ljoin = NA, lmitre = NA, mai = NA, mar = NA, mex = NA, mfcol = NA, mfg = NA, mfrow = NA, mgp = NA, mkh = NA, new = NA, oma = NA, omd = NA, omi = NA, page = NA, pch = NA, pin = NA, plt = NA, ps = NA, pty = NA, smo = NA, srt = NA, tck = NA, tcl = NA, usr = NA, xaxp = NA, xaxs = NA, xaxt = NA, xpd = NA, yaxp = NA, yaxs = NA, yaxt = NA, ylbias = NA, log = "", logLab = c(1, 2, 5), na.action = NULL, na.rm = T, side = "both", plotCentre = "point" ) } \arguments{ \item{x}{a numeric matrix.} \item{...}{Further arguments to \code{\link[vioplot]{vioplot}}.} \item{use.cols}{logical indicating if columns (by default) or rows (use.cols = FALSE) should be plotted.} \item{formula}{a formula, such as y ~ grp, where y is a numeric vector of data values to be split into groups according to the grouping variable grp (usually a factor).} \item{data}{a data.frame (or list) from which the variables in formula should be taken.} \item{subset}{an optional vector specifying a subset of observations to be used for plotting.} \item{na.action}{a function which indicates what should happen when the data contain NAs. The default is to ignore missing values in either the response or the group.} \item{add}{logical. if FALSE (default) a new plot is created} \item{horizontal}{logical. To use horizontal or vertical violins. Note that log scale can only be used on the x-axis for horizontal violins, and on the y-axis otherwise.} \item{side}{defaults to "both". Assigning "left" or "right" enables one sided plotting of violins. May be applied as a scalar across all groups.} \item{names}{one label, or a vector of labels for the data must match the number of data given} \item{drop, sep, lex.order}{defines groups to plot from formula, passed to \code{split.default}, see there.} \item{range}{a factor to calculate the upper/lower adjacent values} \item{h}{the height for the density estimator, if omit as explained in sm.density, h will be set to an optimum} \item{xlim, ylim}{numeric vectors of length 2, giving the x and y coordinates ranges.} \item{col}{Graphical parameter for fill colour of the violin(s) polygon. NA for no fill colour. If col is a vector, it specifies the colour per violin, and colours are reused if necessary.} \item{border}{Graphical parameters for the colour of the violin border passed to lines. NA for no border. If border is a vector, it specifies the colour per violin, and colours are reused if necessary.} \item{lty, lwd}{Graphical parameters for the violin passed to lines and polygon} \item{rectCol}{Graphical parameters to control fill colour of the box. NA for no fill colour. If col is a vector, it specifies the colour per violin, and colours are reused if necessary.} \item{lineCol}{Graphical parameters to control colour of the box outline and whiskers. NA for no border. If lineCol is a vector, it specifies the colour per violin, and colours are reused if necessary.} \item{pchMed}{Graphical parameters to control shape of the median point. If pchMed is a vector, it specifies the shape per violin.} \item{colMed, colMed2}{Graphical parameters to control colour of the median point. If colMed is a vector, it specifies the colour per violin. colMed specifies the fill colour in all cases unless pchMed is 21:25 in which case colMed is the border colour and colMed2 is the fill colour.} \item{at}{position of each violin. Default to 1:n} \item{wex}{relative expansion of the violin. If wex is a vector, it specifies the area/width size per violin and sizes are reused if necessary.} \item{drawRect}{logical. The box is drawn if TRUE.} \item{areaEqual}{logical. Density plots checked for equal area if TRUE. wex must be scalar, relative widths of violins depend on area.} \item{axes, frame.plot, panel.first, panel.last, asp, line, outer, adj, ann, ask, bg, bty, cin, col.axis, col.lab, col.main, col.sub, cra, crt, csi, cxy, din, err, family, fg, fig, fin, font, font.axis, font.lab, font.main, font.sub, lab, las, lend, lheight, ljoin, lmitre, mai, mar, mex, mfcol, mfg, mfrow, mgp, mkh, new, oma, omd, omi, page, pch, pin, plt, ps, pty, smo, srt, tck, tcl, usr, xaxp, xaxs, xaxt, xpd, yaxp, yaxs, ylbias}{Arguments to be passed to methods, such as graphical parameters (see \code{\link[graphics]{par}})).} \item{main, sub, xlab, ylab}{graphical parameters passed to plot.} \item{ylog, xlog}{A logical value (see log in \code{\link[graphics]{plot.default}}). If ylog is TRUE, a logarithmic scale is in use (e.g., after plot(*, log = "y")). For horizontal = TRUE then, if xlog is TRUE, a logarithmic scale is in use (e.g., after plot(*, log = "x")). For a new device, it defaults to FALSE, i.e., linear scale.} \item{cex}{A numerical value giving the amount by which plotting text should be magnified relative to the default.} \item{cex.axis}{The magnification to be used for y axis annotation relative to the current setting of cex.} \item{cex.lab}{The magnification to be used for x and y labels relative to the current setting of cex.} \item{cex.main}{The magnification to be used for main titles relative to the current setting of cex.} \item{cex.names}{The magnification to be used for x axis annotation relative to the current setting of cex. Takes the value of cex.axis if not given.} \item{cex.sub}{The magnification to be used for sub-titles relative to the current setting of cex.} \item{yaxt}{A character which specifies the y axis type. Specifying "n" suppresses plotting.} \item{log}{Logarithmic scale if log = "y" or TRUE. Invokes ylog = TRUE. If horizontal is TRUE then invokes xlog = TRUE.} \item{logLab}{Increments for labelling y-axis on log-scale, defaults to numbers starting with 1, 2, 5, and 10.} \item{na.rm}{logical value indicating whether NA values should be stripped before the computation proceeds. Defaults to TRUE.} \item{plotCentre}{defaults to "points", plotting a central point at the median. If "line" is given a median line is plotted (subject to side) alternatively.} } \description{ Produce violin plot(s) of the given (grouped) values with enhanced annotation and colour per group. Includes customisation of colours for each aspect of the violin, boxplot, and separate violins. This supports input of data as a list or formula, being backwards compatible with \code{\link[vioplot]{vioplot}} (0.2) and taking input in a formula as used for \code{\link[graphics]{boxplot}}. Interpreting the columns (or rows) of a matrix as different groups, draw a boxplot for each. } \examples{ # box- vs violin-plot par(mfrow=c(2,1)) mu<-2 si<-0.6 bimodal<-c(rnorm(1000,-mu,si),rnorm(1000,mu,si)) uniform<-runif(2000,-4,4) normal<-rnorm(2000,0,3) vioplot(bimodal,uniform,normal) boxplot(bimodal,uniform,normal) # add to an existing plot x <- rnorm(100) y <- rnorm(100) plot(x, y, xlim=c(-5,5), ylim=c(-5,5)) vioplot(x, col="tomato", horizontal=TRUE, at=-4, add=TRUE,lty=2, rectCol="gray") vioplot(y, col="cyan", horizontal=FALSE, at=-4, add=TRUE,lty=2) # formula input data("iris") vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col=c("lightgreen", "lightblue", "palevioletred")) legend("topleft", legend=c("setosa", "versicolor", "virginica"), fill=c("lightgreen", "lightblue", "palevioletred"), cex = 0.5) data("diamonds", package = "ggplot2") palette <- RColorBrewer::brewer.pal(9, "Pastel1") par(mfrow=c(3, 1)) vioplot(price ~ cut, data = diamonds, las = 1, col = palette) vioplot(price ~ clarity, data = diamonds, las = 2, col = palette) vioplot(price ~ color, data = diamonds, las = 2, col = palette) par(mfrow=c(3, 1)) #generate example data data_one <- rnorm(100) data_two <- rnorm(50, 1, 2) #generate violin plot with similar functionality to vioplot vioplot(data_one, data_two, col="magenta") #note vioplox defaults to a greyscale plot vioplot(data_one, data_two) #colours can be customised separately, with axis labels, legends, and titles vioplot(data_one, data_two, col=c("red","blue"), names=c("data one", "data two"), main="data violin", xlab="data class", ylab="data read") legend("topleft", fill=c("red","blue"), legend=c("data one", "data two")) #colours can be customised for the violin fill and border separately vioplot(data_one, data_two, col="grey85", border="purple", names=c("data one", "data two"), main="data violin", xlab="data class", ylab="data read") #colours can also be customised for the boxplot rectange and lines (border and whiskers) vioplot(data_one, data_two, col="grey85", rectCol="lightblue", lineCol="blue", border="purple", names=c("data one", "data two"), main="data violin", xlab="data class", ylab="data read") #these colours can also be customised separately for each violin vioplot(data_one, data_two, col=c("skyblue", "plum"), rectCol=c("lightblue", "palevioletred"), lineCol="blue", border=c("royalblue", "purple"), names=c("data one", "data two"), main="data violin", xlab="data class", ylab="data read") #this applies to any number of violins, given that colours are provided for each vioplot(data_one, data_two, rnorm(200, 3, 0.5), rpois(200, 2.5), rbinom(100, 10, 0.4), col=c("red", "orange", "green", "blue", "violet"), rectCol=c("palevioletred", "peachpuff", "lightgreen", "lightblue", "plum"), lineCol=c("red4", "orangered", "forestgreen", "royalblue", "mediumorchid"), border=c("red4", "orangered", "forestgreen", "royalblue", "mediumorchid"), names=c("data one", "data two", "data three", "data four", "data five"), main="data violin", xlab="data class", ylab="data read") #The areaEqual parameter scales with width of violins #Violins will have equal density area (including missing tails) rather than equal maximum width vioplot(data_one, data_two, areaEqual=TRUE) vioplot(data_one, data_two, areaEqual=TRUE, col=c("skyblue", "plum"), rectCol=c("lightblue", "palevioletred"), lineCol="blue", border=c("royalblue", "purple"), names=c("data one", "data two"), main="data violin", xlab="data class", ylab="data read") vioplot(data_one, data_two, rnorm(200, 3, 0.5), rpois(200, 2.5), rbinom(100, 10, 0.4), areaEqual=TRUE, col=c("red", "orange", "green", "blue", "violet"), rectCol=c("palevioletred", "peachpuff", "lightgreen", "lightblue", "plum"), lineCol=c("red4", "orangered", "forestgreen", "royalblue", "mediumorchid"), border=c("red4", "orangered", "forestgreen", "royalblue", "mediumorchid"), names=c("data one", "data two", "data three", "data four", "data five"), main="data violin", xlab="data class", ylab="data read") } \keyword{graphics} \keyword{plot} \keyword{violin} vioplot/DESCRIPTION0000755000176200001440000000207114077742012013463 0ustar liggesusersPackage: vioplot Title: Violin Plot Version: 0.3.7 Date: 2021-07-27 Authors@R: c(person("Daniel", "Adler", email = "dadler@uni-goettingen.de", role = c("aut", "cph")), person("S. Thomas", "Kelly", email = "tomkellygenetics@gmail.com", role = c("aut", "cre")), person("Tom M.", "Elliott", email = "tom.elliott@auckland.ac.nz", role = c("ctb"))) Description: A violin plot is a combination of a box plot and a kernel density plot. This package allows extensive customisation of violin plots. Depends: sm, zoo License: BSD_3_clause + file LICENSE URL: https://github.com/TomKellyGenetics/vioplot BugReports: https://github.com/TomKellyGenetics/vioplot/issues RoxygenNote: 7.1.1 Suggests: base, ggplot2, RColorBrewer, knitr, rmarkdown, testthat Language: en-GB VignetteBuilder: knitr Encoding: UTF-8 NeedsCompilation: no Packaged: 2021-07-27 06:09:33 UTC; tom Author: Daniel Adler [aut, cph], S. Thomas Kelly [aut, cre], Tom M. Elliott [ctb] Maintainer: S. Thomas Kelly Repository: CRAN Date/Publication: 2021-07-27 08:30:02 UTC vioplot/build/0000755000176200001440000000000014077721435013057 5ustar liggesusersvioplot/build/vignette.rds0000644000176200001440000000055114077721435015417 0ustar liggesusersSAK0Nn2K=ړ'o"$lHҤk}׾u ! {7ֆjty!;K9 §3mT$43BG~(;TN0n+-pЉTޫؤJvF_:ށE_h"(UHps'ms~_֚^^O rDږ;jtܮxM4O_=W*l;E ?~6bqdA($aAs4ѳD?UIvioplot/tests/0000755000176200001440000000000014027267745013126 5ustar liggesusersvioplot/tests/testthat/0000755000176200001440000000000014077742012014754 5ustar liggesusersvioplot/tests/testthat/test_ylog.R0000755000176200001440000002225713671617551017133 0ustar liggesuserslibrary("vioplot") context("log-scale") test_that("plot defaults", { data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) }) ##y-axis log scale (ylog) test_that("log-scale y-axis with ylog TRUE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = T) }) test_that("linear y-axis with ylog FALSE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = F) }) ##y-axis log scale (log=TRUE) test_that("log-scale y-axis with log TRUE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = T) }) test_that("linear y-axis with log FALSE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = F) }) test_that("override with ylog TRUE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = F, ylog=T) }) ##y-axis log scale (log="y") test_that("log-scale y-axis with log='y'", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = 'y') }) test_that("log-scale y-axis with log='xy'", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = 'xy') }) test_that("linear y-axis with log=''", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = '') }) test_that("linear y-axis with log='x'", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = 'x') }) test_that("override with ylog TRUE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = 'x', ylog=T) }) ##y-axis removed test_that("linear scale y-axis with labels removed", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = F, yaxt="n") }) test_that("log-scale y-axis with labels removed", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = T, yaxt="n") }) library("vioplot") context("log-scale") test_that("horizontal: plot defaults", { data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica")) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica")) }) ##x-axis log scale (ylog) test_that("horizontal: log-scale x-axis with ylog TRUE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = T) }) test_that("horizontal: log-scale x-axis with xlog TRUE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica"), main="Sepal Length", xlog = T) }) test_that("horizontal: linear x-axis with ylog FALSE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = F) }) test_that("horizontal: linear x-axis with xlog FALSE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica"), main="Sepal Length", xlog = F) }) ##x-axis log scale (log=TRUE) test_that("horizontal: log-scale x-axis with log TRUE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = T) }) test_that("horizontal: linear x-axis with log FALSE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = F) }) test_that("horizontal: override with ylog TRUE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = F, ylog=T) }) ##x-axis log scale (log="y") test_that("horizontal: log-scale x-axis with log='y'", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = 'y') }) test_that("horizontal: log-scale x-axis with log='xy'", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = 'xy') }) test_that("horizontal: linear x-axis with log=''", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = '') }) test_that("horizontal: linear x-axis with log='x'", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = 'x') }) test_that("horizontal: override with ylog TRUE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = 'x', ylog=T) }) test_that("horizontal: override with xlog TRUE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = 'x', xlog=T) }) ##x-axis removed test_that("horizontal: linear scale x-axis with labels removed", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = F, yaxt="n") }) test_that("horizontal: linear scale x-axis with labels removed", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica"), main="Sepal Length", xlog = F, yaxt="n") }) test_that("horizontal: log-scale x-axis with labels removed", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], horizontal = TRUE, names=c("setosa", "versicolor", "virginica"), main="Sepal Length", xlog = T, yaxt="n") }) vioplot/tests/testthat/test_violin_median.R0000755000176200001440000000514613411056063020757 0ustar liggesuserslibrary("vioplot") context("side option") test_that("plot with left and right side options and median point", { data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="magenta", side ="left") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="magenta", side ="right") }) test_that("plot with both sides and median line", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="magenta", side ="both", plotCentre = "line") }) test_that("plot with left and right side options and median line", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="magenta", side ="left", plotCentre = "line") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="magenta", side ="right", plotCentre = "line") }) test_that("plot with areaEqual options and median line", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="magenta", side ="both", plotCentre = "line", areaEqual = T) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="magenta", side ="left", plotCentre = "line", areaEqual = T) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="magenta", side ="right", plotCentre = "line", areaEqual = T) }) vioplot/tests/testthat/test_violin_formula.R0000755000176200001440000000233613411056063021165 0ustar liggesuserslibrary("vioplot") context("formula input") test_that("plot data list input", { data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length") }) test_that("plot vector formula input", { boxplot(iris$Sepal.Length~iris$Species) vioplot(iris$Sepal.Length~iris$Species) }) test_that("plot column formula with dataframe input", { boxplot(Sepal.Length~Species, data=iris) vioplot(Sepal.Length~Species, data=iris) }) test_that("plot formula with dataframe input and scalar colour", { vioplot(Sepal.Length~Species, data=iris, col="lightblue") }) test_that("plot formula with dataframe input and vector colour", { vioplot(Sepal.Length~Species, data=iris, col=c("lightgreen", "lightblue", "palevioletred")) }) # attach(iris) # iris <- as.matrix(iris[,1:4]) # test_that("plot column formula with matrix input", { # vioplot(Sepal.Length~Species, data=iris) # }) vioplot/tests/testthat/test_violin_customisation.R0000755000176200001440000000651513411056063022424 0ustar liggesuserslibrary("vioplot") context("color custom and vectorised") test_that("plot with defaults and scalar colours", { data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="magenta") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue") }) #Vectorisation test_that("plot with vector colours", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col=c("lightgreen", "lightblue", "palevioletred")) legend("topleft", legend=c("setosa", "versicolor", "virginica"), fill=c("lightgreen", "lightblue", "palevioletred"), cex = 0.5) }) ## Plot colours: Violin Lines and Boxplot test_that("plot with scalar border", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue", border="royalblue") }) test_that("plot with scalar boxplot modifications", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", rectCol="palevioletred", lineCol="violetred") }) test_that("plot with scalar median colour", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", colMed="violet") }) ### Combined customisation test_that("plot with combined scalar customisation", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue", border="royalblue", rectCol="palevioletred", lineCol="violetred", colMed="violet") }) ### Vectorisation test_that("plot with combined vector customisation", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), border=c("darkolivegreen4", "royalblue4", "violetred4"), rectCol=c("forestgreen", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), colMed=c("green", "cyan", "magenta"), pchMed=c(15, 17, 19)) }) vioplot/tests/testthat/test_violin_classes.R0000644000176200001440000000133413671617551021164 0ustar liggesuserslibrary("vioplot") context("different input classes") test_that("input as data.frame", { data(iris) boxplot(as.data.frame(iris)) vioplot(as.data.frame(iris)[sapply(as.list(iris), is.numeric)]) }) test_that("input as list", { data(iris) boxplot(as.list(iris)) vioplot(as.list(iris)[sapply(as.list(iris), is.numeric)]) }) test_that("input as matrix (by col)", { data(iris) boxplot(as.matrix(iris[sapply(as.list(iris), is.numeric)])) vioplot(as.matrix(iris[sapply(as.list(iris), is.numeric)])) }) test_that("input as matrix (by col)", { data(iris) boxplot(as.matrix(iris[sapply(as.list(iris), is.numeric)]), use.cols = FALSE) vioplot(as.matrix(iris[sapply(as.list(iris), is.numeric)]), use.cols = FALSE) }) vioplot/tests/testthat/test_violin_side.R0000755000176200001440000000146113411056063020442 0ustar liggesuserslibrary("vioplot") context("side option") test_that("plot with left and right side options", { data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="magenta", side ="left") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="magenta", side ="right") }) vioplot/tests/testthat/test_violin_names.R0000755000176200001440000000067013411056063020622 0ustar liggesuserslibrary("vioplot") context("names input") test_that("list input", { data(iris) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("a", "b", "c")) }) test_that("naming formulae", { data(iris) vioplot(iris$Sepal.Length~iris$Species, names=c("a", "b", "c")) vioplot(Sepal.Length~Species, data=iris, names=c("a", "b", "c")) }) vioplot/tests/testthat/Rplots.pdf0000644000176200001440000165227313671617551016762 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20200612122221) /ModDate (D:20200612122221) /Title (R Graphics Output) /Producer (R 3.6.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 712 /Filter /FlateDecode >> stream xVMO1W5]WPJ4+8TiZIE~ǞD.K̋ W`5j4Tz)byу2h:;s g>N3dna'n|ܞt>2\al [3Mڈ# z?nulWlwއ1 xZK-Ed9ُkk׸S7-%SK)}ݯV["_|v[.?tG)Nwfc)8G̗ˏ?w)U@bC"ĥl5y$?endstream endobj 9 0 obj << /Type /Page /Parent 3 0 R /Contents 10 0 R /Resources 4 0 R >> endobj 10 0 obj << /Length 4200 /Filter /FlateDecode >> stream xZM^ ?.aZ敺@,JJDRѿs } ę1c>׷/W[ҨwMxt/z|o#!gſ|WWG_-z3^zn<ֳޡu7z ևyku7^oM{ͽ.0{}xigwO?]1?_4Yqӛ#ӷ?>By{Ç2n'O^~S۸.RV+.M%߮5ۣ[H7n0K'X^{$1Vw|ϝ$@k_~WG߼}WaRw㫷~ݫkC'ӽy(NSU\I9/~˘jZVRީ^)Dxadl0|0Bc0S0s2T7StW|5 3Sa"bwؙ[l=6B rG_wAQu !>$ 1Tv_bhwuZ" l; 8HGt'xk|^y*~nPϾ^) ]V^Fd 3Fz wupv_?zla6(j fj|-*3 BtvddVV'M8l[nQA\:n‹Z #eb9"3nc9n¨=vGuE" cDm2%}fv0'"pJyĝxq#zut{cdNJIV=d`X3#ZY@;Bxڙg [4=d[2VQD( :}s#G aw p>@j1ё<G2@e2ҧ n`^˓1z- k npF@**σzUݹ!ਗ਼plg!'qaጀδ`6`0lTm5_oHJ26Z_τ:#cƃg}P1>fYI} s0Az6/x6 )m<;υ\鈍'حxdt൘7A7)x/v+_@@וOE=V;AIt38$|]|bX|Q".>J#ϳV2jZt[0lh/:Ȓ&vI8+db$؊w8QDw kg<,1Ql]v-q/>卶Տő61k'ϓ"0_gY-mWܚ̇`o@S Q=_XKr(&U1GmU+آC+^/Pb({)N;)NŚ.E `1>Kf#4Vu jl vö %ճ%|d>L@|5@(Z5\zz6psՑv1Ql2dM&L}vʆz=Z&)?5;;,?e{||oejaw8JMafp) :oE4 J5;HaEVe08ـECA‹ I'H(LRLhKFF APV+ n%tMP+ I lҢ yBHI K$icvQJ" 6!t{ @v(~ d䣨&.ILuHPD".~tQREAw'!vv^BFMF۰lQ=YhhO1qP-(3h+~O8" nv0R~Mm$U|HD6'I-yH^-ku6';&Ifæ'&*ux f^j8ĊO`1 2lQO,aD'Np?b i/~25+7mI1?e?%M;ua/~ܸ l}##EXRK&|hlzOT{he={ 0нgcjpj<b-Ohuzx-67I7S;$zċG<ٍ?wAcOͦp&ѱɇ)|I3'Ju1mk55\{=mU Ifea: mzDYhף m;"qK`S[ҶǨǴm(35O~?3혶^'/z Aƶ+37:#n=D^z6T=~Mu;٤৯݁*ϵ[ l Yn"B^ooK f2:J8m:wvOcA?isFP6oyfF(myksLAް}lEv<P\_ΠdYR.zhrK63br*3 꿙xu('ѲC6]6mol'ن,^}E\2ݮGy%0y9 G[_v弹mkf4MNmSf%7ԓGnSUӴ>f|۱n~1؟PދϠT}cUr!V5i_ac$ QAxC3^v}r [tI^޳ )\gV'|E|P똑?qh&?UC îLu=m$z7^uO~xey4uW)m<^]ta9AxuSxeǛv;+q' okxT$2g╎AaXxvw]9;4c |d:s&"^gj2"\q;{ Ce_ߨ')ǕJTL.S?Ӄ/U /OUۃoM>ϊnOz<\{Q/l=zb]o|Gzd^zQx>;g=9njG=Uz~[`;35UtsƗЬWEK>@<]z0"ЭGK 3ꧩw?V/=4w%;Su- c$&[wl#ѤCjPo^`˗4"[o/Wio^\zOp/^6N=tvpbjԶ^?GAKo*~%OkWw5~Ȇ'x3UQ~ݲ"X&n)snĿnL_aendstream endobj 11 0 obj << /Type /Page /Parent 3 0 R /Contents 12 0 R /Resources 4 0 R >> endobj 12 0 obj << /Length 4156 /Filter /FlateDecode >> stream xZ^Oqa%PRqbd`#ꞛG9TWWor^5ݪF\;5/zٓpO>_~u_}yC Nz5^zxw{k|c\]t;<{U=4x=pc>#O$8?_4YqWGz珯>=XN;|=9??R˯x4qS*w+v{oOM%߮IH5cj'ݐタwS>V%P-R,8׏b/?K7o_z=,Ul~|_<[:Ճ/+h߁'隆GT+Eo՘0~jdP]2&HAq1"|4n}@5qIiWowmqjnIkw|3bDՁ}>8y؆Taٱ%-xsO܏ % 1Б8OAHrEW  `3Ղ$&uw^_^x^hЋdzG7/=q`zz JC/ :p!nw @O\/ŗ8RY *)!!@OB0 9ކ^Pq?hs-A ,8V׋dVC(Ks/8lc 0yt\x }.|{=P]8_jim栗^Pń}}0O<7v~î|f[|fa3s= I}\LX]VCw<gg[^@5z7|#`Ld2gn;"fK[/\]N=3.Sρ[iǝ/%O8P||D\|ϲ%ڝv>ċ+_f;ȝOVX㑯1Q;g3+`! <~l0^NLL6~sleKoeDzװϩ{|G=$UxeQ |,.0Zce4ii`wmt8 h:Űm#&*SJ.HK5 ˇrsWyac'L>Y lGQ"}vU+@xo.3x/R@guax x% Rrq m. 䖤d%nITRE &:U zb1"f,$k4Y)>`[j'Ol&O|ޏcjyGA=[Τ)rA0Cܮ_'"OL  le)u >%sx$gOA<8Ԉ$|Dvă|zZ| aRyt>0mm 6LL'&̧M+Nj@?p0쐅O4 , x'8Oj=!)VY#E|)KqBn2&6(KIZ!{+C8>W榅%ă XWO4Ջ өO: Iba_wϫ}8=jB Ѝ˱^pG5߹s!rGj-y~w&C&KnYl6HR9ڬ@|oVDx`G1 oxl;^Ϭ|P;C/'߿;E+~k釞aa;r!g<zڭzˍKsKng}\H\'+#Ñψy31|H̏D3_Sg>5,;G>&~|M63`LD~_~Ϧ+8?gHr~w)5~ |NckN?5W'8hzޜ~"jfՋw7Q;yik;v5~8~=>Al/_z]wCv=QOzZ++R%%rf/~(r/M[ <KK fρ.`xvY=pL䞘Bo#2!'K=Ά=h_ʶ_{X ӟ|Ωc{)+ yPbcn&?}yNN;'i8^E[35οG;Y=rz,X[V|c*Xi]F'AN9twYcGv AHhE=RTUUvc툩Sϕ.P9q9&|糝5󑽿|e;GX|5%Tَ-;rۑyrjsgWƏ/O 7~Ä@Q{,B< i]~|> endobj 14 0 obj << /Length 4258 /Filter /FlateDecode >> stream xZ]G߯8K{af X1vW#9E~}{~ܪFk;[^?!\~;k׿_ _}C%^o UqS^_k=mc=^wS׵>౮.ޚý.zOwo{^?{>Gb?ٿh䳰^o'z|n#/|{;˸ǿ=ޞl?"nn?Ҕ$ooQڭa$ēnȨ`}R ={z^?l8ILldݿ7?hm?'zz|=y߼?_?IM<Ϳ^۫^ L ? :i{p^ӘjZV/SSZ5R{]26S !1Իcs: vNNgj_zF7E``v6 /p'[yc#- wz Ӆ` [Py̿H~EAa; 8p$Ƒ|= {|=ޚ/&z3Wb 5Cŵ[g_V}`e&T_ώ/8?ܓ̚Œޫ}>$jN4Gwⲑ-`cVkJlR>`<3 ʹ FzF #GwD< IDGF< >2P,`6M0`3Z#LFXK03RQyTL{ :pz[tN83j±HQy&*Ń|>ጀm0Ra00*C¶7n$%O|ӯgcGb_xp{쿯W R=WJCxn7K=쒎x-fϠx/vǕ/ ʧ+ߊ𝏠$8bk |\b.>KF,^@x x }Y|U+sY5{--L6dɍKc;ߤZnt21vul;y(P Cd"AZ5%e(b~(ozT? `GbcN'EK{L{qnӞN{g7Ƕ- _qk3NEGG9 R4p4R<5Xe])bKQ3V\-J<TtR|z*Bc<%^GmE@jb^_E`?Kf#h෭h%crm-1(fTϖKg B"ŵ׏fC: |Ma!#ĝɚѮ;{_XC „w_"'2fg}xo`ejaw8` WRDXa&"ELVD٠PTd$Dv(F:5 1*iφX(Hxq:$iI mHH;=H2jb"_Iw/D 2")MZ"aARǒ0w*#D߄]HMH"^CnEo2Ql`|D"=N8i#(V. ](Hq$DBKvqQ袉hX5\ݓDS:qQAXOђh2D[}OI0E_T/čO8E$Z0LZ 6@`z<!ja_ZP4x!pCpIȇ„|xJvDnߨ ӈzTL#RR~Mm$È'. f<2~OdA\mG/%/ɫeb#jǓWڀXn:0&xkROb"!+|T '".a)D ̡4,aD'Np?b#/~25+76I0?e?%Mĝ:?Un\>EFk~9~DK{P ^k٣ M{aiOtػ Q_>n "tC`kׯxGΦx&:w<"|ȷnMnW3YPh?3߹Q69|!|">Y|#,L0l'_|&(\w4,go'_&1|[ִ.>&&_ӱ_%Z`/'PY!ɬ]v=֯s}#L8&nzH㮗w%Ǩ6'zN=OL=@ z^v ȉ٤৯݁8^ڭv6YnE y{%}XbG W3aQ8{4[8pOc &挠w1oy}\c==tڜlj9#!;acu;;NV~N/WEX6M=/pgX|!K9NTN>YX!?cC:vzPXM>#lf$"Ufp-3QN8e1$m3lbol'ن,^}E\2{ݮGye`1s1%̾j.yslkf4MN1)j3Sb{ ѢcjcF6K= Oe/pO3 I.Ӵ/ #it z eꞠKmN:۷:,廎9S)3KFQNb%|cDGo3~(FsXN:r(SH_juPfb? j"6L;83`+iक:1rW R 6TLxQXBА}&N hrZh CUf(op>eES;9**D3O/OP+a]O\ƫi@Y}6B]UʵA XR˞EČ/۟+_IxYaqm;Jà0x&f;]9;4c |d:s&b|dDYw:* 'Y||W+>S19NCxOTxY|U77?+b=xRv=ˮ7|F=]lG=w<ǝzI{* ]?-ݎzL*9vh{M,>xb6[zÈ@Q{,xoaP?Mz顑K/1Y2[oH#4z=Gc{?&zPz;7XQzS}|ߠLJ<{}s?]zz8狥ǫ}Sz~Ǐ޷T@5}K죟(֮vk 'NfUQ~ݲ"X&n)sngc#)?I7-WO}Ǘ߼|~/'_廿q endstream endobj 15 0 obj << /Type /Page /Parent 3 0 R /Contents 16 0 R /Resources 4 0 R >> endobj 16 0 obj << /Length 4257 /Filter /FlateDecode >> stream xZˮX߯8KX0ZD"$,qbd`ꞗ#و}o9/x}V4]J5YWO]/y'O=;p?/k ?}yC Nz1^zxw{5>1.*{Oo k|cwǂO>y~?v?OW;agaƽ^_\?c{{ "ow{s?R˯x4ظ?)%߮Ijn #0_tCz[r ~=oi1>xP `_owCx̐iqLp{8n,%=XtLE\iTOwxV^rzqBrG.,&lcT-/;=І뙍r7>8*Y=,bfqR0YN'r_,4c?qrkf/w~mry}4Wu0UB|LW$Ձ q# "Y|I/H8 BOJD I(AB7 gm79-F ,VdRCHKslCL1fq/o끻r8c>/0 XڅY{mO5Pń}`wo/n?Bo_?ZYb3s= I~\LXVf#Qm3޳eW/@Ě>l:c0& e37cp%͗giοo'O_0{z`'(G w>"GgwZ;Eϕ/mΧ+bM| ט(ϳ뙕éW?Dz^NL}L6z9P2}%穧迧[e3KԋKϩ{҃0<߿"Q=xCo2GYoC3/=du*rRTILWS`"tjE8qA= uwoMgKpa/#4ZY*T Ly*a6 Qo҃hS|5X)2S-hC[b4p BR8R X*djIԢNMpYJ#)@%tH,ܸ%uwb,MZe?Tßjv+~?S:Q^)Yj'ßbԹ?Ax?a ܟ= "gܟK1W ?:B0'7'`3~01?1U`>]?Qr4m6}0US91RcBrB|'^?ITNaZOHUF.IQ?QFO9:!57|xTKI A;.8>5YRK'`Ob_'?QW/+ß|N~OXG>@ σs}jFt{|Z5녆=ImܾӞ-}ArGk[.fZ__z۟ζ5G$Tm@ެxic/#Xc̐;^IϬ|P;/'߿;+ϰxp93| lO>Vo\k?1|Ml֪]az#nt81?1c;s#hKb̧e[Ĵĩ|n;} [O/sODTc~!yEY~WBFyزa?K{![S4ʴ/ dS$"sc<{mMlwbO=.k {=ݺ֋MGZ _,{X=n{;s?sEov'΢tX'o,?*Wa31ߕAH<+^hhoƓo*vpERTq;7_M>dZ|AдD7 J٤:L4Y_|KUŧx5%6)&_3O>W@|sr ?Pvgk#{w3_|HgjKګT٤-;k|b5fW~opC/ПxKOFz7d;S0^Q?^zhKw㩧?[$ꧩH$,Z^#CϑnGCjPiE ִ^z҈na=,֫?ۯ?`~?endstream endobj 17 0 obj << /Type /Page /Parent 3 0 R /Contents 18 0 R /Resources 4 0 R >> endobj 18 0 obj << /Length 4281 /Filter /FlateDecode >> stream xZM_GefHĖrqȆ`S=_ {fwvwo>r^UnK5]R[^ۿg!\> Z߇Ͼx}1wdžx3}ۇpbib +zzw~z=6{!"oww~H˯xzjq򧋔KS˟jGiO!K'zM%;)-,/? !Z|ǧWדo~W߽yLjj~W_^?(~A'Tջ#,W>gǜGT璱.r՛TTEI{jZ5R2jA2a@ڱ85d>``Fz~W!`%]ݵlwǹ{L2#+(y!.0ط11Q6_:-c;rc4sR{8 8rcX8`Xvrk9`xPa=p/6p$6%<(jĈvXeC`c(v#lFeQNi`]^08pnX61 mu'fox`8 {tg[gd5r>eOyLDƪckY~ڧq8ܨ /ܖc4>g[<0|94 p:kf8~kqޡ?d짂3a9-Z2dXMCĖQq^HDI#>+鏠' %K[dLx`FEI|@q>|a'/(Tsy 7O_47O_tޘB|i>9&IKp ||9_*; b~IpaZٙ7m06HsplDžJ<>09W؃f|T|\i؄m>0=͞l8#qZ|c=$sj y,{y^$= LXP#}^$t'0s7cpO~j|g]:jD%;7|#2#^(t/hjuخ|"N'sŇ%z_r-[>.Vfmk9v}QbEq||S\O|D\|UW>wrb%0ʧ}[l#XIG>F|{>Kd;حx^0D)?.=^o[ӿށj= )^&ԶXz ,=N~9?뉥zrIk=&z*zV0zWVs쭗Gץ?Kn"tTL'WʖҸ6}j+\ ū+^4X2]\e; JazYсQ8}{'.^{s,%J6SfU aI GGa{MyVe|Tӕh(f]C٨$e/MAqRRkkҦV 'r #I`Mԩ(r*t3T+‰S{bWO5K\&'+0sD)xhCjB*T{*ԽV*Q5Xv?8Jm8[^O^qj6=YzA,[K,eդbj~HGb6-Bwj2MTMzBi^約 A[P3u^=X)%YA)}XMzOf׫I2ϔ~q0j\oaXܟ7 }Z|d60%x20'#aneXrXbҁy>'gČySJ`#Pdmx$Lm<3U'+aS!M!ܟ诰g ßZ RK֥7Coe0Jvb`l_{xaßpPO/. -8ކ?I or, u?~&?!ޑ$L~RFTYuHPq??'Ks^߆?~~l>i_F<ɥ0'?B# eSRLd4ǫFgxD>ǸN~kQcO`6yEhF _'o\G._۟8ԏxfOt.dX\W&"=⹛?xO>@bu /Vo>~&_q6ID|H!/$nm 1|KÓO&Ak &?' ٚ/'Ė_Fc3j8gl|'H3Og$֣ȷv|LkG>﹟^ C/_;ݎχ: Ϗb7;CKr)駩0O=^s9^׌D S/6;'Xlm/IC"Ь5:*&fqY۩w*Yz==r.- vjEi}`kUO~jc 5s㻞'G5r k0/7.7{.qb3~߬+VEX*NS5/F"_E+;QңOfId !`4q"+NC综80^ )`H5j~VTu0'd$OdI٤:}ꎭL܆N3`Vxixb[D'q~]/tVџs$E77rST> GmŚ.MF$)0'FxBL!L/Juh# _4ǖH;ub~@,;~5lc>j`pd i֐N|DLeHPII/q#(_wpLeX)Ӂ55R<.4~xYhM~ya>mًѪeo>jq>KQy㼕_Q9E7eJ?jJÑ??+Bu $;hxxQqIŊoP1b^|||_oAG{gT\|X͇KF2Tŷ p}3nlsb6&k|@| b9_w!F`|dםl}G>Y|#rl||J#*qcy^҃ DzC/Г{75^zDﭦ^UqYc%ԻXmS/xi82'.ݭZzXf/E~x_zΗ42qg=QU%Yb'^VSRF8"X$R[[ =g-~>RҰ(.Xg/O/]?/?:?i_endstream endobj 19 0 obj << /Type /Page /Parent 3 0 R /Contents 20 0 R /Resources 4 0 R >> endobj 20 0 obj << /Length 867 /Filter /FlateDecode >> stream xVM9 W8s$g]A V a5Ӱi3H}I^ٽ_َc+p W6@00 |6_?O7ƢֿBݼ}n+Sc4`,<++H 9b2a-ی5o}C+Fhま.ӜTХ.'LЄ$ iHk~;{sz`)@.,zlʂɂ MHRfT$pI7Ea Ee(n I؛F50Ǹ7<~jos+5^+\IhK~cɡu=r[Ww {!1nu'PQzR9JXV=zDė=x^ÞxL0007QԞzTc< ,KP] ^CnmpIhW]>Q5OKzcR>1$ ao4â@-.|!Z^,P -1{1% uTMSQ+Şjjt=:깭y4c1Yʣ WkKIa=]vӮ ߴk_ߟ~T<#jm,k8.}_>1EB2o/hbm+_|yR0u_vw==. [7o{dvmr44㚊yuK>6W [ܰ+v Wѭ_hU~sK+`g8;|\[ F{!Ϫ^Cudendstream endobj 21 0 obj << /Type /Page /Parent 3 0 R /Contents 22 0 R /Resources 4 0 R >> endobj 22 0 obj << /Length 5353 /Filter /FlateDecode >> stream x[M&q9ʇUF@H8|+! 離{ȕV]f]]]lΦ׷߿jkWMUFZ~}oxowouuO-?fz}﫥]=>}rf}5Z}=|?륎}݇׏}'>1o!c9+ewKM诱^~}vGߦ>[Z{g|ez;ݾƍ\]wzNp_/`q CNݗj>4u< 5 1%lU0 GgQ}xKz&\/N.ZKW,p.J6G,roFARݙ x2`9F>BFRs V77F[Q(Mݒ&< PC%ЖRO.tțNKEOҋew-50Kރ]/'HT4}ܤV0_ݗ-" gqP,, ܳ1jDͲ4ÓQnc8Q-5nE`HBvyjQvrYjј)Rao!uZqJ 2pɖ2&+ 'z{ں#ñ>}]UzP!܂])!䊢2Cʬa)B`aXʑtk*5B(AzK*XfyB+^_Մ0Ь%p%N+ēX$&/6Ʋ-]Њ-_\b #5'bޏM;Ss!D*r<,k傿_6E*onLP}?0XUxxR/02@sӥ/z3}p|JD|C?|+&!ukQ!|Q{SґVuyjot$vB )#Ή Yv'H}Aj7hEfx&|{(QE֩Դ^SmBR# :[$^eKhjS+xJ[!PwuƒGQ1t+ 17 111?ʖUEOxH<`^pz,|OToOxwnXIm4~eb5l{m#!qD|  xmȇU"f) {FzM|ܑ=mG!?ΑosKGݾsݵ:92_y=x7|茁@8[κ cؖSi]3Β%҉ˢtU?\.e0_^~x?ĭ'jgJE8'14+~yv \1_FnZ1]ɰo93y=}a;rP!y4zA3ʇIyAyxJs._Ǐrd债-q.g9Iy9fy^dy-wvnӊ[W3 + A-<F9qlh0Q1,{63,xDgcYl g`/ Oqƛu/Y]ͧ}$Y }i>C3GdڝOYoEBh;!LkO>ЃzQ䫷@?@G \s^ƹ= =ԋ@!s9 +j**< '`g;(Zn 7Vf+;.Ift+&?Kk.x?˦Uq<|zqM|7t+#V9tZjk~&_ғzߒkסibztn"]̶WUٰ`匘v IY)oާ!׻1<߷7۾}.oٻ͜?ғ*So_dMLUa)˳Zq Xev@Tu˲eahź9ךu/%M{ee2;[/ǩn!Yv>21߇L,ӻ7ݭCNs6:.D jgy*b6qTYms9gOcX6p>R3UYml8ƓeoxОOqkڎ+N3^ >΁G>/VcwibG>+<_y,ӎ|¨N Cot=o="=X_q/ꉈ0v!jHȻ^3zDy׮7P^OI$Wʟ1~ 5q:yS?~!+1a^_av;Y;;%KY1Oajڮo?P~Mzy9/~.`;HXyI?f|&P_%x~V*<?L\eI~iqlN?/aKp¾_8Op7)㧢vlD5n[%Yˆ[ [,|Lv䙇15+Y5B+Z/~ JWCeḂWL"hŁ!I ưVy5 œ@ΪO#șۿ(u?TRˢ>5pV4f&G`חk!,0[$)y]#ӈ@",>5i ~c-x?4<q4|{=7N2x$Z)WS_$Hi5}ӑdS!̌C(䞅JO<1}[sHaOۓH#lR4`nY^Ç&J1͡c gowIq4جazSԳsS֐RF^`Ro醈k05e5o{h:ͼ{<ջfͳxN}1lY_(ϙz@Zz-}YӃ_ɾ0*bG|>yYGxa^{7̇g忶^(֫hOw#'hOīB('ZZ ~P˲S*j|HkB3q?^b 0V}#1#||r;1zPyD^׾{OzDL>^xz}~-q=1ڧ}ӣs"~G<'Z E~D=b|Qȇy3gN:!|G=ˮ?kcIk+9|z/S~~=+Ys<ᇪ/3rj 1| 9{\9 ׏G<';╶e<ɏ7~|JcI'72 +Mօ&ĤÆWauu>_OŴbsQukl,; OmUЮʾT7U>wᦊ6oJf#endstream endobj 23 0 obj << /Type /Page /Parent 3 0 R /Contents 24 0 R /Resources 4 0 R >> endobj 24 0 obj << /Length 867 /Filter /FlateDecode >> stream xVM9 W8s$g]A V a5Ӱi3H}I^ٽ_َc+p W6@00 |6_?O7ƢֿBݼ}n+Sc4`,<++H 9b2a-ی5o}C+Fhま.ӜTХ.'LЄ$ iHk~;{sz`)@.,zlʂɂ MHRfT$pI7Ea Ee(n I؛F50Ǹ7<~jos+5^+\IhK~cɡu=r[Ww {!1nu'PQzR9JXV=zDė=x^ÞxL0007QԞzTc< ,KP] ^CnmpIhW]>Q5OKzcR>1$ ao4â@-.|!Z^,P -1{1% uTMSQ+Şjjt=:깭y4c1Yʣ WkKIa=]vӮ ߴk_ߟ~T<#jm,k8.}_>1EB2o/hbm+_|yR0u_vw==. [7o{dvmr44㚊yuK>6W [ܰ+v Wѭ_hU~sK+`g8;|\[ F{!Ϫ^Cudendstream endobj 25 0 obj << /Type /Page /Parent 3 0 R /Contents 26 0 R /Resources 4 0 R >> endobj 26 0 obj << /Length 5353 /Filter /FlateDecode >> stream x[M&q9ʇUF@H8|+! 離{ȕV]f]]]lΦ׷߿jkWMUFZ~}oxowouuO-?fz}﫥]=>}rf}5Z}=|?륎}݇׏}'>1o!c9+ewKM诱^~}vGߦ>[Z{g|ez;ݾƍ\]wzNp_/`q CNݗj>4u< 5 1%lU0 GgQ}xKz&\/N.ZKW,p.J6G,roFARݙ x2`9F>BFRs V77F[Q(Mݒ&< PC%ЖRO.tțNKEOҋew-50Kރ]/'HT4}ܤV0_ݗ-" gqP,, ܳ1jDͲ4ÓQnc8Q-5nE`HBvyjQvrYjј)Rao!uZqJ 2pɖ2&+ 'z{ں#ñ>}]UzP!܂])!䊢2Cʬa)B`aXʑtk*5B(AzK*XfyB+^_Մ0Ь%p%N+ēX$&/6Ʋ-]Њ-_\b #5'bޏM;Ss!D*r<,k傿_6E*onLP}?0XUxxR/02@sӥ/z3}p|JD|C?|+&!ukQ!|Q{SґVuyjot$vB )#Ή Yv'H}Aj7hEfx&|{(QE֩Դ^SmBR# :[$^eKhjS+xJ[!PwuƒGQ1t+ 17 111?ʖUEOxH<`^pz,|OToOxwnXIm4~eb5l{m#!qD|  xmȇU"f) {FzM|ܑ=mG!?ΑosKGݾsݵ:92_y=x7|茁@8[κ cؖSi]3Β%҉ˢtU?\.e0_^~x?ĭ'jgJE8'14+~yv \1_FnZ1]ɰo93y=}a;rP!y4zA3ʇIyAyxJs._Ǐrd债-q.g9Iy9fy^dy-wvnӊ[W3 + A-<F9qlh0Q1,{63,xDgcYl g`/ Oqƛu/Y]ͧ}$Y }i>C3GdڝOYoEBh;!LkO>ЃzQ䫷@?@G \s^ƹ= =ԋ@!s9 +j**< '`g;(Zn 7Vf+;.Ift+&?Kk.x?˦Uq<|zqM|7t+#V9tZjk~&_ғzߒkסibztn"]̶WUٰ`匘v IY)oާ!׻1<߷7۾}.oٻ͜?ғ*So_dMLUa)˳Zq Xev@Tu˲eahź9ךu/%M{ee2;[/ǩn!Yv>21߇L,ӻ7ݭCNs6:.D jgy*b6qTYms9gOcX6p>R3UYml8ƓeoxОOqkڎ+N3^ >΁G>/VcwibG>+<_y,ӎ|¨N Cot=o="=X_q/ꉈ0v!jHȻ^3zDy׮7P^OI$Wʟ1~ 5q:yS?~!+1a^_av;Y;;%KY1Oajڮo?P~Mzy9/~.`;HXyI?f|&P_%x~V*<?L\eI~iqlN?/aKp¾_8Op7)㧢vlD5n[%Yˆ[ [,|Lv䙇15+Y5B+Z/~ JWCeḂWL"hŁ!I ưVy5 œ@ΪO#șۿ(u?TRˢ>5pV4f&G`חk!,0[$)y]#ӈ@",>5i ~c-x?4<q4|{=7N2x$Z)WS_$Hi5}ӑdS!̌C(䞅JO<1}[sHaOۓH#lR4`nY^Ç&J1͡c gowIq4جazSԳsS֐RF^`Ro醈k05e5o{h:ͼ{<ջfͳxN}1lY_(ϙz@Zz-}YӃ_ɾ0*bG|>yYGxa^{7̇g忶^(֫hOw#'hOīB('ZZ ~P˲S*j|HkB3q?^b 0V}#1#||r;1zPyD^׾{OzDL>^xz}~-q=1ڧ}ӣs"~G<'Z E~D=b|Qȇy3gN:!|G=ˮ?kcIk+9|z/S~~=+Ys<ᇪ/3rj 1| 9{\9 ׏G<';╶e<ɏ7~|JcI'72 +Mօ&ĤÆWauu>_OŴbsQukl,; OmUЮʾT7U>wᦊ6oJf#endstream endobj 27 0 obj << /Type /Page /Parent 3 0 R /Contents 28 0 R /Resources 4 0 R >> endobj 28 0 obj << /Length 785 /Filter /FlateDecode >> stream xVKOA ϯ=WPڪm"q@*Hk=%%$۳ ܫpq&@:6gÝ:zNhc L?'.ouq 3>c5dtH4Ww: YrN.'odmڙ #Em↾OQ1X:!V-% c gWjR.&Rh*̓.;㒷k VGE$kј1*2CpeHNZ$%Ο_::oYAŽv9Pk8= jc=R_M`?S֓83a okc$'GqgktEk0]ȌQ+s(JrjQ5gIsf'mC(w-*`ȵX?i;&mR5?-@%aXOW!#5؞߳F_kvlBd7Svf87؟?ik~W[{ɜژϐ¤A]~}Wwߟ~iQŖD'89y+u[uO Ƙ.ay:9O;MckjQ4팂:r. VFoO.{ 4n8%fD7-$7[@N7^l;}m;1UgQv{;:ǽΥ9O_q t:$RMȸaE!Hendstream endobj 29 0 obj << /Type /Page /Parent 3 0 R /Contents 30 0 R /Resources 4 0 R >> endobj 30 0 obj << /Length 5353 /Filter /FlateDecode >> stream x[M&q9ʇUF@H8|+! 離{ȕV]f]]]lΦ׷߿jkWMUFZ~}oxowouuO-?fz}﫥]=>}rf}5Z}=|?륎}݇׏}'>1o!c9+ewKM诱^~}vGߦ>[Z{g|ez;ݾƍ\]wzNp_/`q CNݗj>4u< 5 1%lU0 GgQ}xKz&\/N.ZKW,p.J6G,roFARݙ x2`9F>BFRs V77F[Q(Mݒ&< PC%ЖRO.tțNKEOҋew-50Kރ]/'HT4}ܤV0_ݗ-" gqP,, ܳ1jDͲ4ÓQnc8Q-5nE`HBvyjQvrYjј)Rao!uZqJ 2pɖ2&+ 'z{ں#ñ>}]UzP!܂])!䊢2Cʬa)B`aXʑtk*5B(AzK*XfyB+^_Մ0Ь%p%N+ēX$&/6Ʋ-]Њ-_\b #5'bޏM;Ss!D*r<,k傿_6E*onLP}?0XUxxR/02@sӥ/z3}p|JD|C?|+&!ukQ!|Q{SґVuyjot$vB )#Ή Yv'H}Aj7hEfx&|{(QE֩Դ^SmBR# :[$^eKhjS+xJ[!PwuƒGQ1t+ 17 111?ʖUEOxH<`^pz,|OToOxwnXIm4~eb5l{m#!qD|  xmȇU"f) {FzM|ܑ=mG!?ΑosKGݾsݵ:92_y=x7|茁@8[κ cؖSi]3Β%҉ˢtU?\.e0_^~x?ĭ'jgJE8'14+~yv \1_FnZ1]ɰo93y=}a;rP!y4zA3ʇIyAyxJs._Ǐrd债-q.g9Iy9fy^dy-wvnӊ[W3 + A-<F9qlh0Q1,{63,xDgcYl g`/ Oqƛu/Y]ͧ}$Y }i>C3GdڝOYoEBh;!LkO>ЃzQ䫷@?@G \s^ƹ= =ԋ@!s9 +j**< '`g;(Zn 7Vf+;.Ift+&?Kk.x?˦Uq<|zqM|7t+#V9tZjk~&_ғzߒkסibztn"]̶WUٰ`匘v IY)oާ!׻1<߷7۾}.oٻ͜?ғ*So_dMLUa)˳Zq Xev@Tu˲eahź9ךu/%M{ee2;[/ǩn!Yv>21߇L,ӻ7ݭCNs6:.D jgy*b6qTYms9gOcX6p>R3UYml8ƓeoxОOqkڎ+N3^ >΁G>/VcwibG>+<_y,ӎ|¨N Cot=o="=X_q/ꉈ0v!jHȻ^3zDy׮7P^OI$Wʟ1~ 5q:yS?~!+1a^_av;Y;;%KY1Oajڮo?P~Mzy9/~.`;HXyI?f|&P_%x~V*<?L\eI~iqlN?/aKp¾_8Op7)㧢vlD5n[%Yˆ[ [,|Lv䙇15+Y5B+Z/~ JWCeḂWL"hŁ!I ưVy5 œ@ΪO#șۿ(u?TRˢ>5pV4f&G`חk!,0[$)y]#ӈ@",>5i ~c-x?4<q4|{=7N2x$Z)WS_$Hi5}ӑdS!̌C(䞅JO<1}[sHaOۓH#lR4`nY^Ç&J1͡c gowIq4جazSԳsS֐RF^`Ro醈k05e5o{h:ͼ{<ջfͳxN}1lY_(ϙz@Zz-}YӃ_ɾ0*bG|>yYGxa^{7̇g忶^(֫hOw#'hOīB('ZZ ~P˲S*j|HkB3q?^b 0V}#1#||r;1zPyD^׾{OzDL>^xz}~-q=1ڧ}ӣs"~G<'Z E~D=b|Qȇy3gN:!|G=ˮ?kcIk+9|z/S~~=+Ys<ᇪ/3rj 1| 9{\9 ׏G<';╶e<ɏ7~|JcI'72 +Mօ&ĤÆWauu>_OŴbsQukl,; OmUЮʾT7U>wᦊ6oJf#endstream endobj 31 0 obj << /Type /Page /Parent 3 0 R /Contents 32 0 R /Resources 4 0 R >> endobj 32 0 obj << /Length 11331 /Filter /FlateDecode >> stream x}ˮ,;n|Ί1ۀ( x葻{P1P]E.Zԉ39.-2CR=_w=_׺~ڗϯ|o?O}Mi/_kjfa}}m|Nco}r"sOM^_}ίm*5Q4i흾k-I46wak> FlPPǗa}1ژ̿]Xl_=XϟesJkYbJڰ8uWVjֈd%F6htQ#5J Ot65Yc𝕎6P h뀕аq)=7y9Uf] /SbEWVj(mk)W9Ry+h^>4ӆ2U++-cg+)e5AJPb10/NYk}WoT_SD3 ej֙~.5:wape)٠ҡ8S'`,D`;ھi/8_urJkm4_k\l]׆Ҿs MLܓ6 4F7hu? xo w3 +C억xm϶&m}m>7j@4`۵N#Z ,Zyҙ>L Gy6SgMͭ/@l%mlǸ7< x 8]iҙa%VRژl拴6Dn͇÷VjK_hiB|k]Y6^AeYlڗ&SW@<ǥ ̷m\Xۦ߯"6cv5jNZfdrL+)SLh%Y!;u VEFwvY4%]K׫%$pg7IޞqW'+ʰG8Ed:O-J:*E7-K[(֣s,[g<6ߧ&))ap@!AO?6ZUcOi37bb$ZHI2Z)ϙѓsFBB{8}u![<7Zr6QX-/hJ'y@+>Ѡq,?4<k5mF&y.YK)Ak`Ffؼ$vN08Ќf Y{m[ ~o53xii:hK)$RIP/֟g5yƑ$6ΡB:y{m '5ێևm-}>$Q9x5b5bG6d&__?vY]c &iK$ Fҝ=gBa4S(ѵh(^ێ5u$dme en-}F/-&Y8B_* l|; t B\7D:a 7,e-}hߦ̄>UXeS2^ݠq$ˌmM=,QtHYkkq n):=JCM!O]B6LKG ]'ʮ7ɅZ%2oSjBb&Uk偁RP졦PJ3? gh bD뢕X R mKI^LpLp؀6 [t{\5ȡZJls,REқT5:SBB{ϡky=P4;v RZHITw=Uw5d4(oWȳن{?g qhUŏvr /khJcBZ&{偁BBqVgQk^.5ZU]en4 Zw= <^zwi5ѠP7n$V#>;b0]ʼe -}Ϯ5DU֛9U @'y˚)43楈FfM5}hmA6ZjX{=CO {*=vbSl& s?"EணB:^Ƿ.n/,i/䕡r a ]ZV:(4aQo| ȥt>jqccГ=PZL( #~.4s|||hT>J(Zh:)^yLݹT>ncI24j E%{#~n3rmǀl4dgo[w|r$-= |?ǭ7| :SΪBB?omH?t״bpD@K_Km֓,'y5oPPdn.G!_Qk $Ķ#  -R/s!ԅh:\</K8gGIa;8ġ| b7{帗kF\&y\ [-mt kBAMI$O8Gd j  {蹨7ͺ^]1Ɉk X9>2ZY3'yC 5S0F`ω&#ՎWj2h;=-k~T;nv z7ԎMCMC&OvP14=̛d>m֛)$+'ڭh8Fសة/Wv+R"&Lo a ud L'c8VýŮ9o\mӪqZc9_X(y)Gx_2W?࿶Aj[/BwnM򐂶ڴM9jۡud(ud`HT$QA/{#K5ZG@~i1֑? e8>Z%*UBNHNwIT N r)noz/$E,֎cV-e/y/ 4V- H zZ{!vA^9>8nUڙb{mZ>/0oho/ }Y. AGLA~m0H\Ე n,+ZUGEJϾgjqt=t^9Ĥ`i&Cu=%ne"rx {NZ̧ {B///$*yҦgL'㸮g#keSRTMA۪uiCKYw]kFh"3 Ha?/{#kU$"bG2ɵ6-%jd^:#츟>I$R: $Q9 rt~/GʭIkmD{ZM0h*8(8qg*i?GڡMBևӶ~H $Hi}CKώqgºg5$J977W[!>`c fv_h֟9 דxNd|ZMq?7vEelYjvqWqꫣĥǒV=ʘ$y_GdN+q_PL6/چ 8v/F0M[JPq<gT#fo%08Txtv>8V -ũlv ˳)>o-Y{8# ЩߠSϿo3 9dCjE|H]pCҽT÷T7$Q9N~t^9 #kmV}]5-2|/HAdgM~8ij& ::s|d۬󽛾zW#r8Ծ{l|H%\_GXN֋f7rq_ڭɨGڊ>CժnGxrX2K8^7DvSn{| ?mC>~ZeYeg- HЩ Щ }=&cxtl_e4|'oTwn yK䇪L'n'6lgԝ?%eiTdp:Dݙ$5M9D;;DzxN}{Hug>;֙-hѤs.u.hݙ* )tz\G\Wc>+)/y-3ITB/@/72 9^صǬǤu戊 YnZ ;D;S$Q :yRnHvx.vWaV#^[O-Yԝi#IښЩOM_f?O sC}X?5jX6zR[z.Х%nZw&$Q98b X[MG}6p_mW?Z'.=tn֙Ta/o?[Lp$[S/@^_]dYsBw?ÔEK 6o GjYy$pDt^=O ?{%TUsQS=֙ct<Z0|뇴{(ugoH37HЩ瑀?瑚cy&9{xkΆ%Zj{ j; ugpD`:Щ>8['?O>˓֙# 7LZzm\sY9IHЩoЩo=&C|rb^$|;iBٴtkTke3a7 yr`BTw. ug9ug>e t;Kr8H⊺soB:yG=m0࿶[U?m:{[n̡%~=K'oƑ$3Mu"Ndbi#~c]}@#=He:Pw[Kdg߭oB K`?eDF?_)8q䣺,  {Z"[v_hBO8Hr'm:Etďyr uMno˜ΎnhZ%KugHϚݠSpGn >v>-eE9fiKq|ʥIԝӉVQw)xGnU}@?Oɔ1庿-q%xR]9]!qG9Al),)&6cU1}Aޒ}p?b-4N<}/pYs8ĭyznlCL8:>`6EOKa#gXZ" w4/Rw;̔qD堸uB/nz#kԝ-TƵ|G/yǷG,3K3yHL~/t<y!qGGzn֙mvܟrVKtov۴%Zw$Q9 DbW?࿶ہGn&۝։_{k7^o-4zܧG,N$<=M>8"L[|gn]9wwG%n';]VH>͙pel:k(_q_?࿶^5~VoYe)Zy9 4F;LIb0F:y }p?Ui|{Tg혵ԖexCۆ$Q;G%8D٘NN5a?o읡R'<+S=n'̾ -a:u5ԺsHl3oaS_ߠS_߀?h.<ϥu2ԝ%Oq; ҟf[$n;׳L^_N}p?=H/*~ɵV3 LKe&ˋyr6ԝĪug{A08yrW?࿶ۆcx_k2]ߎi?EK ߝHݙ%Jݙ2zHL)t)t)p4?MF?_Cݠw0Jc;8^0LZB///K6zz+6+(;egx0!hӸo֟/#IsiL@w #~C/v~|l+> s5ҳoY.u.jݙ)8Hrp>:Ź)+\M 0s5e;4ٹZgW]]uNqc9fөoЩo=׷[/~g6ѣ)i-}52|Hݙ%JݙVLp$Rwt\dr38/dl Mc-Zgo0p?u5حѥ% ` $Q9x?N>fL'c8ub*m7M!(xkCmYh7Q$qS\$qv r}p6Av4{\BZhۮu.к3SpDHvXe:Z?J" k+nj{ ճ ug;8~瘳#S5$Q}NqOt{߆>86m>x_}-e֟pD-]L?}uhT$>~Ouf Ӿ~*mG,Gxw0L/@/z)G/4Aq"Di`ІzfRwf)GXn' )Gn'\?&>RiKgG3]/z#k;{Pw,BQ gˀvhu.qӺ37 7L`#~PZy}r;XwFK?ciKxI^yN=z s؏ׯӌ|Gq|}Z4; }9Yun7 {S SN?}as{?i.ڭ~F{`-;O?Rwfq$qGď:mPw^'-9m*}ZKFo9]]~qDtyj:ż3ďtvʼnv(^XO6%pÔYHƑ$' :y{m~XzO٪Oy_@KU jݙOML㜠y_'gV|;'?.oOߋ[պ3K7dz  S|n)>7$sLOA S|n5sLON ]|߿Yzyec珞zPY/|˯|W>|ൖ ^&?\åfmmǖ v‡Qm+.=A2?=iqwt!gQZU#I =@pS2@h@h@SQSXu rJTYImf/X~_ӎO˞Wٕu`?ʞsJ֌3gendstream endobj 33 0 obj << /Type /Page /Parent 3 0 R /Contents 34 0 R /Resources 4 0 R >> endobj 34 0 obj << /Length 130045 /Filter /FlateDecode >> stream x=lKׯ8d̎$@dH2ULET]T_{2s/F~~?V^UU~_ǏzO_~y_???S>T_d߰u~9ˏve=?O<&O}[_?{sb<ß_S4O?J?Ǐ??729uqYwjx?^mY*ќ?+SP'=90=/P =7?}'>|pxLϫ9?7ϖ~a~> ss`z0??G}y90??yyAWv b~~SQ[|>9yA? dxa~_a$,a~^ay^a~a<AKA[b~>-1?o?AObzg 31???y+?yAgb~~% =1?_?AL?|e Akb~>^aAaחzazy{a~>^aAa~a'91=o91?ωk|N_sbz_sb~|5>'91y4>]`oMq:?ZLnSw'<6~?ޟq>=wgy7=xw?;Or'yןXF}3uowu^J _|t/>F~4GMg<9|];|E@'"Ȩ2I+ lO!nn~ZN\Wu[ MO,5!D' }1O[}) ?AI9G;Ln ȁ Ζk'/ymo*%gI|''߼s%ZT zhӱ' '!<=!7$<7~z\#I\3Ԋy^HcN?HѦ.zZI? P{og`ٯv,` ?^V?=vęI{q.w;M5Js_̥F~?L*c{ 0$-?g%8ΐuB>ﻋ"wjh= Bͼ?f^py>=a?oV?=LG +Gڝи}ܫ}z'Eɝ _ϫ[Q*D|Ѽ?S#?x+5lM3Ga!J`3/a2t^/sO UБ#W͈ =E%z{5 8[a j]8;ѥB1!_ %55678!_MC*%Lt&OkI=уB уC"у&C*1у5C9' DO!В`=0TrBeN{;)BG h[DO#U#z"O4^IRDxh$pH/|B "5F UI/*RbY$ʦ!ʴ!¡O+A5c+W\n!?NNѿX}?j[m#_rN{.^ CźsCHG?vXףC fH93ׄձcuޮˮ+3B;N !\wʸ*FI Ϗ:B\u^[?M}=gucI6ؙ1?jq3W)jz,3'S# 2/pʾ#^ݾ& \/Ⱦ?#6d߆ oGȑ}{ Hfɾ7ɾPþdef?˾#{ p~~.6dߏc'+ c]_{qgYw"gN˨a[٘w#Wǻ}?sݾ%vݾVOn5wӟݾEdrXw{3Ⱦ7SU/2)"5߲M@5`XH?oLaI)>jQM|Ѿ_}_4~$& b8o9*UaMâ5{t7Lfes!Mp# RHPfD]/:7>2:?֩58[ftDwsGd4Άrs?#Bqnb2BtlH +C!_&֒Pxԇl GCI}_b~Rށ?E}M3'C/}C6Xdߋ ) /}/*[gJU>aߑ K7=2[طtP:Rj}RI wRz ?N)\2WoHz!C(/CTK(φ:)t 敯$90x<0y0c&ؘ[,s^ܨsx|8yn4݆4P/,?>wAe뤹@T0L3a 6ĥ3G܅6V|\ع#_x?Ǵ/l# \{xw=.C\퍃_Ɛ=x⨞x^Q`w4`{-x8b#}.Z7tqqIrGx'T%70q[}?VIx8e†8;R~zqeRq(`/*g,0GbS}"G`F@PX~q0E&ux3lȶ#;bN8[t`أ;56tZHvН.Wc !D Gʈߛ.sf6j1.s܃[us`oq;#C<%];;}Z7xGY klhۤ;މ}qԽ> n_1W1WӼ ~q:tᎆ>h)tc ]&MXUgXTWXTG"z7XT'XT%zF&N5{ˮAjv,b>jv,qn5]ӔKiʝ\B(C X7I6;D8fhĜw ;S1T!hEڈ 4Rpʉ艞w)D'~=9AP ?'Eޑ2=kDEd nZ1U͎1E~QI ;RDHA$H/!#|*5E I/-RbHeriHlrpq0ud7&X9+Pl,6E%сE%k,* Eٮq~7aFqpe 5_"lֻXe2nKb68Sjrzt6Y] LCkaqH'cN8Jpы^ ~$.9]mG~qۊؤ@+Aغ3).'7&;m=vrc\ ẖ;}$.: 7wQ|:owWHA # s6m'" + I!rѝ=PA0˻0a'~:g'w5ӁJێeg$< H*7 EgEv-N~A"qtQ8=Ma+Ӷj޵߻0{wl21+N)ΑGC6GZ'&Q_4111Y8 z)u>6EXSO,(D7Ī :'s3 B4nfNsEށfѽ/m~Un5r:C$<>R0B122KEtq#M(PItQ%].sK=ÄC уB"у&C.1у5C9%DO0 ~wr2ߩ|'6RO{ =eB珄(1CjH䈞# SD'6xz U)$(WU^{;lL,j&X%M;Rshi)? }2yby+p=M%nk[-%8ҺC»t.*T]wL߭ J}3c?rtےxm."nȻs7ﮄ¯s`P8;-Fש{ E- ljɻ2w&jn3&ޒw:vkRKZ* ITKv;-yĬ Zuon'׽%\-$%\G E5ZrAIeOM'a8Y-91/Z2f-*-iGNՒ=ZraU-1-ܘ]3aQOH-i\DKtyOm#/_f8w[$p%sDģv'v]X"q%KQKytN)5ii%G-sQ zusoioi8%gꂏ op[rvY0a Aug%?JWKe%?8V9~$vp?F>unF_ 3mf 8/}tDo؃yv5Rݠk{27 D*DnNH,jS>#L#ƁPq VĩB`WKa ĥ|Iy yýH.P-y]BHjIࣖ(%N$%ǓPRO\j0Ajɑ穀S- ljI6C>RK'MT⣖O D}@o4IqD<)8㼓N]"!E%Eޑ2{ɑ-'cHՈ3dNΑ*Ev%[N!lCr# 3Qe^#܁`t(1 *`4_A]o{kQ mwq1VvdWhg?vA.V'XsѾ`MNp  J.Jѥuj^q{FZ:XTBA=:-s++`ޮk\|v1-6Z9. j`Hă]ZltYcґ˘ B\==R%=r}\KMQe[%;| %cbc/F;X'caqIǎey/;vp*/93Ǫ`w}1b|bcd/#OlmS1gXefȭ"GKviRpO1o~1Ք#Hͻ|_n=wnhÎ8rI@iɗ9.k$BmP2%Pmn2}֧S6wsᶩ56UҖ` YGl׺8ct_?(;/j?cB?w+t[D5x5B4WEvNtt/{w2hǴMmϻJSEs%n1N Eށ;Խ ;DwVDw=$!_rvK!DLKP TW] %DUK.*T ]!Dz C '/C6>EMTC\ckrzdDOB=N]s"!zڃNIS&tHn"3Tm'rvxG$)";H~DO>v;.k% Ok!PB"%EŒR6 T U]v?2ve^N>q_=49T4GB]hk< ֡zu(_ʌɢD:/=a*us%u/ %/\Ȓ k5tտ,rC}UhY/G;X$DSBdf1VB T}ٳebZݠvA鋤-E ZiyGFq\2hQϑAl2h2ՑAs5AmpVD!-±V.дkݼ,w k8vw2kLR6rAqPyȠdr2h{Z ӫ{@ z"*6>ݠ-6=W2&wc&sȠ7MA7vޤ_GM#7h-pfP;?(; /S v@?-u N[ן~nyt6amx/^( 2R0( ΀Y,#-_E+uQw`ѽ1Pq ![aG8] Dwu>9;ѥrd"cB.PDƅ'$Vk(A&.$&mXh{ѿ{,?q䶿'A* n٫2T@@_+wY9e:ܹFYVQp"d?.窱!kO89|ts?(wENy[vTQ$Oe[f-zḯG2vj#B>#$-N]:SKjz FGl+g:L n0+aW$[V 7'5aSp }YNeA;6URXd{߄Sp  'cG7o{due&yxh셁9I]ܼnR:S1rxc>ݿˎ+V4}NαA&3l7/dfaT=Jֵؚ30{R޳V充4ECMT\cCkrk zDO Bwqy''O] 'EnP zl[ޑ=U;/" $zxFO %=OHAǮ\ؕrѓ^2beH2i螲l2p.teC&tg9T urJe@4%^ }pi !;頇z3Ws]vT-kjιe퇏>bwby*l{ܬ#Tr=1 f=cy3w lbyo ܛZ2SŜz,qW 1}^ݮc1y Tn"bΙ9A1kLY _;ȺKL󼤘Kپ7^:-vn13Om-'#3To86nrja373+,ۙYIp'wK=>n^+3+?gyrSbN,QLYqO@'s@MRf-Hl׀HnNۖ;һ?Åz^wwÝ: 'ԥwxsB=.{޽}~=/=8v{>HjboNjj^MIV{RqGb@ثb62II8SCE?>?_TV&W, _p|%>g$_Ua?zzAT[WdYһK/뗞V_mmYzM`/Ȋ'd8+YxhxJV%+G&+# + +!+_A||||~S+ߪ_[½B_-#og]}78]Aʇ)_ޤ||n|qN?Iz@^c5:~ w{Sm,ɏpZ,7Ԟ:pnhLCgؙ|ct7ڱAv49- ?] ] 8iZjpU}"hEA5- :J+z}Om}bUjxK5DbϷl+.'vx.'?M9}hr͍h; wybwa^2Besb~Zen6"z~"_+?{#:o;'}O~~zmy tךFP6^g%!Ip PmGmkJU=]3}gw<ݟ;L>6!v7<%g^4)<0v_ ;g֩#s{==DZ%۵Z3x?+D%>6?|D츙Qßyi<z;O豮\c-P쳝*V l'^Cu,wu,p b-'ODzE/.?IAV{aHjgl${P'YX`б'7Om]U}=/ݖZOoH/_z7dqYz|'YzH^d1YzMޓȊd7d#YxgxIV<%+ޒ)^W3x?[;__D7W>r N0g9_ve %[Z.ϑS>mNr>mGQƖ ~Ÿ+v ksCR ]*vߥn^<:}y L1T@0bEc4\wX>Ã?1ǒ3 :燕!M+hW,$7nI&v{fs>S!r]pDXye]YŇݙ]R]9]%{ؕǹ[1Y.;"+>[q ;Qg.8vTƽ㘀 K!x/*/o,y>a|5^K`;zeL%d++Zf-naޏ&|Jܒo7d oC;NC&>v$ޗXVNlIlINc:QleBu#,[RZvYǤS]vMy6wai'eqׅuem+^zAnazczt{ؿwn}C/QV:)5Kwr _xB^a^s<"9G#9^[ؿo#gؿ5k#_ ϰ?5'g#naweS>Fna\`^#CL s5^}X;a+Ygw)^v~q~6&УH!_C"G2 D@ic ,1Ǵ27w5UVAC!_x?:7?mÉ}fLZ"g}dcAl$~(/-+J\>vtM?i(vmN>GYp{':gdPL|9e7&ky1 VC+.);=v/xm 7,@:k3ocEU3" k&en+J:^8$4}%h?;á{P-^d}p}1ŧ"=g{lY<*{[SU JV NqjZ>9_|\,4 {C"ZF16 D@ Q̈$=u +~51VXؔXW[,ć{~WMaT Ap):S:BX˓&"`8^|YWEGƋY0lNŝ>P0x}рdf!u~2:7ًΈ]}3 8O }ξNW{f:oN*5hsbӓ﫾xs+]/n$43Ξ[/ˋYxk+7ӗn@}B`;TzIvuh5S*p*+}Bꓦ6$p۽3Fjm0ÛO{HWqi|_{0;~/YSQ+<lR{`5"WړW8=E=d8/͝YZqGk*իWo%?/ ˟EG,FơdE'/BCҫj38,¤dq1Yz]~}+^ԯxRo#Ȋgd;p(%YxkxMV<'+G>@V@V>AVaY Y YqCdKdSd[ƑYF>GVg`W>YM?||ڦ.d6y)Kq*>r>I>8=%<81*0n,25[d/sqo^34?'Ǯ윜c-Ê۝7ٵ]|\ښՎsХYHu5thV>rsGl:d({֒?ɬIdwa=mesξ%٧.[݊]3hX$5RB.EMWɍ۷;7wMpim~{.ܢgvi6VrKgb:y+# 5O4R#L+^uvd~Ǯٓyceg<헲S3O;[.-sҟܳؑ$pSNőݡdqYn*cBFH/Mo[ISP,O?=o5OC?Vz>'Oϫw(}(\o~=nIu}:r=(c~/LcoS{R{G{%{e/OvdM&? ;¦BV26dgN?/˟Ɨ/_:yߍC dȟzD^g(8,$KO[ۥd9YzO~' n%WxGV<xI^=F?ʓ9yD)O# ?D)Og3Oyr>D.)-rW>K"o¿S>JV Hq}OʇY^4-|[IO z{7lQ\Q~{]}[؅ X׾m:yv/۾W,[ΔÎ5zv_>W=Q_||jn%s }V\zsr|k]Z#siFO'ި}-w~f~x&qѾ}s+oYTyq~B/5?+~;ԾVho]+(}["L+]kSѾv)ڷ#*>S\Svz߻](w`jV }G%Ծۛ\SN8rk㵹7]KWb|&IuҜGjt垯Q'80=uԾP!勗?Y{m<"_heվ{R ݺy7-}#w?˧u߮}gPf{ׂ?CWWG/XzC~}qo-[D^\_zv}Kxx@.}G'wxD}Gg(0y9^O#ޒWjߙ5Y9 +_ Ծ3ƑGjߙw|}Iz|kx 4XV!&Z$F _lL~8ӺJ%-L<4_ QDeYS۷}NMW,(IaJW˶pG#nnF۪dzmU3nl+u5iouv=vv&K/=^8{<1xSQ0⑳+ggȊ/=:{%+;{vxg'=p|gw=b*_"+r|1wkΞY|AgF>CO:{>ksΞ/W|#mӛM"_w|,}ӿ>xT ñ?A?o_ܽ{Ŗ_?–j5m`\ECCqAM>Ѓsy;B׶ZrV5|wmd)l;g5\gT %*t\ֹX-\G>!i*4,A]3>xw[*'b} +|BZk#R%"_5(Nҹna:#W*1p>{n᜕Gϐ&sSh EZ# w!=iE\xG;mRٲsJn]GRW5-iy{%3BnT*ܺGϐmgV≅6{ť┚oʨ?ݺyDu Ύ,(_\^0S2OwRHŶ'xacRl;19oF^bh/HWeEc O{1HKbTKg(}Q!nI i=Q97Y^YL] Yzm EV+lba8,AOodkBpq{BpYz+n`̜[6 Wt7E> }Iv+WY:,0|݃ܢ?'1ֽlG#oP.Z8 zCt񲍗tk6;>Qjs6?>ǮmucP=Fɸ.jt(>F͒FjnjO,@%hVsS1P3f!rf&5A,jYfIȚEiX%Yfac,xiY %"kYfwj]&Y,]g,Y{Ild‘5KG,qJȚ%$kݐ3Ol~5nZ2k8B+YdͲ5 k\5KK,.Yg&k8R fɚn^}j6Ynfɚ%GOd^1 O,=-5bJ@*?26X2*YVAZ%ivVQiVaJ͛eUmZU uZ%*}29'RUNCag2UyUY߇:U>؜c`6ڋ%Vaa/yd_?{YR'.!˟-~vfǗ / KO8,=VS^zGơd-YzL^dY YxEV<#+G<$+^OɊɊds=Yq dg7GW#!+_ʗW>5-RGV>M"Y$?ƑB?R }I,Y.)г/OCR=cӔ0VpI_} 'P _ժݯ^wU䘻XxQRqQnrjK/tt^}KN?'aE-S}I(Lh9%'_#.ɭy#. 'OdܹP6;޻&KΝ{ܻF;I.ugE\#}Op>D /KluL:ң~rztBm!LnV^zwBFgxлek5Ϸ5˨أ ]S)Ⱥ>:~yM+ơ5i7|/[æu~8bWekJ<H߇0B8އ]VR #'&wS{bd嗉mD MVXvOeY-|e`?_W^V_,X?ٟߖQQ_edɲ7dk,=[v8pAC/Sv} zzoxAVgo-ne{og.9_|]{ʇ)_~|eVһW8ewO@>cu7!"<7Ӫ.F1ULЯf5+tDJJkŶsp~@1vnqsɗ;Lͮ8{!Wf`;t%JͻF:ۚ8k &;bDŚyT\d֜ ٯ8%DKxCv w1_'qxyϢ߭nϰ?xT}OMyy&[2dC%y%W,a+ܒTNj7g`%w>/l5ٿyjd۾=" []''4bo\%idI%M?nj_zWfMX;: O I-I%퍲퍲퍲kpFI-I-I-&3j7GV0.޷a4rIutܒ=.g{e#ٻa[g/5QOwo/$pv\?9受kWggg!,pa8װK3=%Yz#s y#g'OؿgؿϜkLxԹ'Ɋ+xܒg'WLsK)1{D<_|ɹ&||y&9dAgIsIR^G%VʧM"6=|.uMOc<`O~DmaoX:vtCXQ׏&Kb]'\~r5/n zͣ׷Ym}y`TVYVlwb`> H.~H+Vqyp[%Q>@ ;];'g=lzf{$nOtcrc]X'W}gY{.p--?OW;{LK;gisq{<~G>o3,+yHXoqYcq+#fguS*t>}^ܖ"g?U=oO"Jି>xɟ])dn1vٷ9wy=J7;su{}ٷ#~}zM<'Mz {I2ӳjPk=w{X{rGOQδng;Op-°NأتQZݩZ[rv._*jp$*Ud7rj 5g*k7YXu {=d jd 9MdW3Y}COڗ?6\J?dYzazBސGdYzfzGbL,=%KoIk,'dy%{o-٣xe񌼒=jQs<%+G<&+^ɊdƑ/OoG>CVCV>DVDV>eVSWrFV>GVg`W>پjQWgRKV>\meȧ\W K8Y:;H!10P h}ZOwK~sՊ k*le5 7/\o{wPWc;hrּQ}Νƾl߯zOg&p%&^viv=$znDeg~Vc:xyc#p [m}ż9]Ige$62;׈<8;mF랟<J6fwIrg{w~~p>E9n{'"]Tx4IFndZbؤe{=1):2H}%q3Z" O{\gZo|Ԛz{(&In|3͕\Ɔ&;X3>bGwϗ.l=bϬT-[ZGM[0Fs|yHu]XT D >^,=S{c+ك,{0~EJ{ۢƢdӶ{6%?_۟?/dqm*7= K/65,!KC3,=$K/CO[,&KIɊd qWGd+Yn/WH '3ƑR>Dɟ{Χ)2|l-rm_==Koz?CR>IV =KRW)]|zat/CS>mG"߶oQh[XMt'b0ٌ@;ֺ3@Œd-20UY8k bKznb[v>#FAǽf[A⪶2ۏm:*,W{<8Xëktf:0xPT[vߖThقT+ȲX=TgY%zRƂ_r.~Ȥ`I;zQBԬGDi$OoTwߕLL+!ՙV@C?Ο+Tv.qQ-yxsTz%罽tdJ^l# &͞7jKm{RH[_W*N S .eV,.YX7 RVI~"+DQQn,8/Eo+*"joʼ"vd'Yٙ{d9zL ϛ`2n#5JrVq,WǭpʢmEȚ0 )u9G-;(K=6*^ӽ͗~쾪E}ǃ@ew;դϳ}N1t;Tާ)$oSFjn^N =Q{;=ʑ=;~HػZS_c?9{\RkO^;?t{/g'gk_mObkGgg=pv=['ކ8]zzv'sv=<^:vw-YzQ1?owx`I㍳#MϜ=9{Y_3Ξ/9{>e|19{>g)=g?Fh7Io:{>jSF>l{Ӧo~D>nzQWi8`&yuyL~{ulFf(k"%[;\2NuDFkbK <^XҠyn%KuO-vK\9{^,?L^ccHlr\s=|<2YldyyMϧ]wq]Jf$!{)X>QYrg?ojV e;dE >JA}L||jV Rٰ쐛PPIrShvӰ Y ŕSHVEMԟǪg/dSlYc_gyKN4^'dMեGdU~wdqeK8,'+/6 8YxFV3xHV$+oɊɊ\g# :s>Kq3 |}S+BIYYg#l_i?IO[W> L*y9n6ɟGΗ#nvfzs9_o~7˟xM=7gqz4 QP\׏ &fO[^\w(*u8v;ZJe>V'jyyXcUWO ,>D1ܒx,UāL{WbօB'w٬w٬ٙg2je-Ծ Z(6S^Ѿ~2hߵZlڗW}FĒ^Ѿ+ ˫{ό]YH;6<}m3/ݗ^Ѿ{_yk{Ծwzgoy*{WZ_o%FT#_ۧ6ظG>8v3{\Ӄ}eWĆceվ«}{WU]XѾXZѾw}*lU}UK޾W?w[j޾V/ Ml~[v&fZ8oa9%}'3*aa>dڊja^XH퉋R{:X~upYeW/~uBVvlPmرAGc->jZ_J4jfH^Ѿkf&߇_ŪzBސK+]'Er|[KzL.Ѿd='h_xN<}wxf񎼢}wxJ~}w<}w\R֜Wjߚ rM[s>L Y -9_ʧW15ϔϑg꿹vEK'+W>:lUZw)VFA2DW }J8,лCS5 PJ@Ӫ*0Q&Xvs|wh/+m0;-/ѮV0}52˴ke6:c}i\6Ԭčfyr}7>\_4{΃ۺMivoWe}}*m閰^t[t{(A[tSݪs]#;m~IfX5yM^\4/\ gVw +͞HiGR ['2H:\ I<~r}7&1,7*aDk|7ًdži^9SS6׷OйQ}{p}^l5\q.\_S|Ƌkc97-9s 'oR-?9/Y׵sSGu(4,7E [<,eR#owpp ^>4 >͍Qkdpt >/=Rn¸[y}K Je2=(zs'fb==G5,\|%\== MYpysగC ./^{>9IpW? .oN3^<OG22^ "(UƳCx2i?۰a?2=p:yTV ~=dYgG=w\_,SNвA]nC҅?vX:)e FGuPew]  k'þ 4U)?:2 #8 -twVp/t 1Qgt\Lpt:{Mpt)38VUK{NptAAǒ{UgOpt @ĴPpt DqݍQp1GݗI9Gu*8Wv;Upt V_Gw,Vpt \Oݽ+Svfw1>`w2/!u ig^/-`/ؽ-Q#`㜳ޱ;!\)ߍ F}=`}r|â v6ˊͰ)EO8L]pG=wPC5k}Q=߃xyzYGcYfO5\o+y4{=PfD ~/͞J=}pY ُι_ IsiwԇfOԗ'039apsi®- ߇ 'ioE=sN{}e CskbMp_8?8?rN99sS΋<`p>gb<>g'1K<ܩ]Mb<<Ͻk<ă?/:O곥Zu곧Z>Kj/>[7N}n >{ÞI<0}Qmp>}3< Q3f5f玊J6x]7"j,k*aW[ݓ;ak(o92ׇ>0ׇ>ȅ~>U-ia(}7U~߽d}k>t}Nmv]Z3|S\e}]or}F #닺h4O ԩe}FUIe)/Y_$q}qݼE_nNo7$$j#pr} r} r} f~i#MbIP}[[[^l\Hz7׷9%׷"[=(/oE_= [[kkǒr}[$\V-I/:kToIkyk5ph5y7W@>X|_c{]ÎD^z:z@- e "aOs{209вߜs?ڻ-s}k.)/΍{۰>;[&yq}T{fyj4s;{7{\M{v-@Es{Ӟ/'o͏6-sN9+uN9#;5pxN7G3^qSGwj ^@.@y7G>[2oZ?ӶnyS?U<{q܌[nq܅3玝pf.rޑL挪6wXÑ'G~p;a-$}wbn{u\aV^|@FL.Y;Ƹ.ssj d;txNe}X*rϛ3M\^{c=.oYYЃ#qyDU^!Urr18!98s,o} } }sN}mC_CCߝ{ry {*xp7: ?e .?^=K\elW`w?[i?[y%x9%gK<\elg?K3g<,A)CE3I7a:?Þ1^s2ކd<{x=8ycGyX?b|WisLgǬiC^=0}̲9fE;\,qT;ЫntL\Rbm8ulzHqԕ~(Z9b̃a!e@pU\FZ 7]~k[,wS\ʇVp)+> xhSV}q>7 8i7LNC/\JŔYʻP>qx5<""c"ȿH'-exM-X/"f?ܫw|r(0qK[x7̔%.7obQ^7O(E k{s=PNj2Aaw"fOc_"o6/VK0oιfs6~nx>x{S*9͊EfOg}w.| EϭƹQ L{(>(FۘL{<)n{>ޚ-?pq+忺#0WW\(_:/u΍_]5yRk<\)53p]+Ε7~DM'jK9/sxċ΋xE*UNWM$5xYa[;?oxf$7pf-yT0cʃ)쮅%~Ȫ-kY+wO|;\pQá1{ãsR4 T18Wώy7j~ñ1ógLj^>A78wώ1r/8VHŝsv8~уcxzpt N9=8c{pupxc|p ^9> vMvNN.,:vsλ8?!>LNbK*WX)wM7MykFk)G.-5xr~' 8 >+G&=U9a*& 7O؁$0r8Sx(#F1ތ1_y3Ou#E) ό-I518tNy[#e3F=嵟sI87‰ąf*T}TS sZ8'AN-}L-fSh'n=wc'ݾMf7}>y۹ O΋j{|wt>MiGY܄O3{bf s1?w}f s1xє*|d Mq8?KST쟥).%Fk %0?s_㼸c SL!?^Qa隢 MqrV35E h l`9os4k1)^i "f񦤐- 8YvL`ڲcSؖ1m!%.S'En!E.ϲ9Y9IReI[6)|V$)~I Hœo~{۸,_> X|_l߻1,9kc,X<,y9<77~h`9FCo;zGs~H;1dMDǍũΩ6LL{18sړmߴ7i6^9{o?M'?=1=.j=^;='޹ryqW3w'ֹqL<3pxxyqsS0KOoa}c?{hJ f<x~Gwڟ&3GGO7=fYKW< ?R2u28fw\,>;ݯH G9'=F/ig.:ho}}EwNJ8(ދ6P̱M0pyBɬ?l"+̕9n5,'U=޻^SɬSn\9KECy|23\giF.-l6Tλ3h+3h8]r8k?}.9ڮ9h;}ԢA,oSFWqx0y,hnJuex 9xV -^޷Z[ocJ}{2h1˗mg=Ay?! Δ{<]y˺ʞ߳Jws=s.YXU,S{a~ф9%18-9{p*7Чз1858y4}{"8Ip؛GahÞ {9ipaÞi&8Qpg 68s}p/G<Fp#oW3 xPpKOA_oG<s{gƃ/0 x( gaž1vx4%mS㰷a3`<0yP/c\4Xf`s>ؖX?/*Z2/u8qUi0bNKܑh{mhzGT{eU18,6'MI|RqɃ1:>,° &OG;߬a6$}q\̤M=C&Ƈjqy^78Aehsdaop4$7޴6I6|ˆI1Ѭu̯n"odD޸(}eST{)oJy=[g@΃>[sV(o!:?"yc*K5^px¹#X_+C4qoy3^jx}-_9WwxxăC]5t."W<ڐȕsƳ ][aS "l{. . My 0`֖G3>ߛ"6Rѣ<Œ;F -mU]QU{VMp hc x_Vh>{YV޴jUeˑ=AŲ{]|MUV]іDCުM$YՃ|;剿ǎ{-3EcK9&AzO{YJo3<,QŒaߏYI_+Ǭjǁ2+ ]ʎ[9,B9O]bZd($|4uy}08旬xS#{}yD ¤iy8.Ƴ:hQT {۾-V'whba^̴&2=VL[]9#&xP1)ŇIō"Ls>w7ѼM_>o\)חSeU俐g/򷔔|Dx>*/n"<Qh_|DH/n$ݔ_*Wʿxc1Z Fc?O4w @x xI$䔿OB^bK?&!sP'!}r'!+Z+k+=7o&!W&w:Ή@raqmqٻƛ{m7m5>0" l{uRks ss {s ڸbMynvbbd?9~;~9s[sݻ>99>{:><;=pN{qy9 9$gii/Ǟ={|>|]䋽wNXG+L<)t.y:/ʿ<ꯝ_`΋/΍/#`+Γ7qxyc%';xċE?5t^CU&53>HUt*_47#+;IoOf/弰CI~QQf_ 0%JJTf-^2Z2WJs%hxA\L>l2Z`Zt0{\aL"qex0xǕAoO4dy}(ddɔBG'0{D82R 'OyDgS7QO)oJyo42Lyo;嵊Eyo4JyoOy7{#RJy{GwHyo{ϣ=ØEvy7nrϻu/qR7febQ(Y'(Eq{s=PB^\o0/ _'R^sl~Bkb܏_7r?ow~(J}(J} }%+W|^DwS^E j/.'2ho=ږQF{P]}|Ny- ~(_V{-Ë{\("_V(j,)Yw8yp }s O{NG+=3O۸SsJ<sc/FyA}3 "*hpī.g}d'ao/W{,}f<=uׇ?o<@uYZ:_Z7YvqY۞bV%3`F|m1L臘鞗I'ut˚zyI)zyH:sntHݖAtHV?ئ>LtH'V.tHGm tHwthLnvtxޔwtJyMwtrLTwtHg^wtxLnwtEyǣ.[ ,7/y\!xr7%XN<(oIyoʻ)EA, ޢZ}c9Jpg~r o- D,'~'Sr!G~e nZcr(zKDw-fxެY'{NSb~ nB^\nDWG\gGy\wGy\9Q.{lwOsu{_~t٦~wN}1Yԧz[~Q}tN}uN}}{?=t9/ʻg΍UCyתyR޵=vqs0kU(Z߀鏜m<(oFyתkU<)Z;WwUw^"K #%og'x%ۿO9gkΏxy~O+3x9َNypǨGhᾙk̚}2q=j#玆* 㝵r| -q+h>#'_[9 ^kȠȗ'Q",\|yOcYdDy r< {Gw <|p <|p <'a7ɦ<@<6:ħ ϱ~_=^Z{݆r= A%\A%\A%\9eaK'~;J`d?^BSS_SGGG_SSߝ2Iw߸R>(*Ӟ7nq[W{(;7ʿu`{E8Cy3[_wΏȿtNEMm!$p."?87f613q[%JWff[nzcí*O)qA^hZYMjߜJa?n4G #x 㵌> wd:wuQHMwf RtP4NT7e:ƸXtN7OmM?yt0KDUS/4΃YQ t ^u4)͕+xScI'{ ^r= ^p,@׻afʫui ]k [ b=ܯΏpnPET}*9>>/5|pbagS= {y ?oN{{aqp*ރ_\V&>⯂+stN>Zss;9텝Ş89rN{9!9s[`ki809s+0s;/ӟoM^⏝_;?wNfL2Y;0yMi bGŃdFr4Y=XdwLnG]L3Y?ъ#Q X9 3rb7+G1s;`"8b ,b 9$,~b|>1uWa> USIy"4w,=d1Npl}2D{9s[c6@ssO8?rN?sN9sS`cϝ;g<f֛s#ϬO>KPS`[%sx99M$^4x9͉tGM%^uxĻS3f ΌImNqOL9x+}3< uQ7f5x0L_I߲lCV#e^c[Wbߙ;ݻ%R688.UZZIKH? -2 ,%xV-{Lզ\}kV^RoW w΍wL}v޴2cJJA *0@ -4|ػ[]sS0sc{E99s 'Ώ|߭9s3w`-埦9sc0ss/8e񈭿+8K':xc~x9A3<ȭx *QWr2=hq}x}xAf$6&?ם37)W`֙G&8f+ < ә1k#LWYÎi1ehoYfH -N瞕ɖÖ ;g78=&+è5o=<Ic<^ZGO͊/znxP ;sk=ڛ^=DQpi,eMjXOYlWOOI˪d7#6+IOjI0 aLK艛Ɠr0'W$34c'{JG;LI.OiٕR 2GV{Թ;ro7=i 9F1a?&RxC)Z(c= )iݛ)rо7I:x/1j[y%Y߷b=%f{ss=Lֻ`Fqʣ`Fqʫ`Fqʳ⚟u?$be?9~1Icܯι+j s;>TN}qN}xM}xM}tN}K}vN}wN{`E$b/ӞTTO{9UŌg`;3b^:=uN{[?~us+{Xs7*L9sC`S鏝_;?;gHnȋ3>*ϦLɝg.#{ VpÖi&VOF^:;])2>4ݗGab8OΉjV ת!kfe,f4C/m*"s$"/+y:q~?/e?&oxe?ڴ]ٯι߭F"dsDߺUQmڭs";=K{Gsc$Xu{=^v0=\c}un99IG7WϜ9?_:?uNL9s` '3pxg'ށ</a?0rx k%+sƃ%^:dP7;Vg< fbĻ}xGII\5MW3%.\+5hO@eg\hZc=h2>qm`s>7.m|㣼 j/O5Mw7ue=G}r ::OG}8խ{yUqaOWiD_;#F \~:Zzw'xO*ڇ9z!]#sNmޒ*i--/99x+O?7+x\ic cF|8"cmwz`;=e˿ٓ+ƣ+%=}j-~xyO>xI{{{M=ߧ}?G=7=7#PGyfX]|_ Xj^ d=L^e=uDޖ $"׺Jio"o+~~Ontons5~7ι߭MQ}S0YgGׅ6 m(Sߝ,L{d0͊&=~S{l} MӞ:xޱu=wN{L9s#0s3w_O:?vN?wN OO2qxs;+]ﭜ')猷lKJnSyxuq<Թ<67pޚh'(~޲'v:]qd\<;}؍꾱v4ƌt]s2hf:=]CQ`fCCrƺ>> i~5^T-~ˌEu}2Pve{Ÿ^ߙeœx<Ä#o7Q}q E]k\:|o肜iW\:Qܹ.d U]U~;OKmP/n ®7|yqcxrP><r!Slq?].^n{ŝ}*x+ù\T+xq^~O]^;}>j=#;MOp?7_;N ';N;lj{鴷mpwfif~'VV/Vfl;Nן֥>'T#o.S0Y|+kq+АkǞk^Ǟcֿ@a]D^Ǟ_(O@ù_T˹6O.o܏ePqg>X%sUr">:x>M9:bOXJ#cWiϬDsC0cڲl'iX ΓiW7ΕiWW΋iWwOӮꏝ3pxx9 d3O<3^3~b؉[X99gwb_opv?˃X+}qL:ccs;ϵ* qo+KʃxY#٧D8Q.`\]yPMF$g@V}Ly7LEIyOʻu*~^Lm 7*|D{ryO7MנUJPދ3B '(oɣ|qӯ7ݑBb3UfRd~k^p~ݕ'1C-Sܾqx 6@Hyw4Hyw4y +PmPp=狧PCϷJvnzU7n<1< y[)oOKy/=ܒ[quG}N=|ϳ >}+{T=F-ʻ6=K9O=ͩerR_[JlF?uOvբOkYUM'˦\y =2H'}JIo3lw~mf+sAW΍~6_m?Sps?o=8|~XMM~u?r+59JŔHRb}-p˔࠭n>Էqg`,<ܢ9>柶~߶e}_}{Eۧ/׋ϭ}{}xo8G\_W.\'㕃\_Üe}q"}p`+Y߅mr2\_4Kt><b}Q/(*e?VڣٗV}¹fiϴGOQq7?X_H/z_i>ƸY97;_()(\߂\߂\߂WKxOxO(}oA΋_:{(Ű|+k{﵇4Y+r1fHDyPeDC:~(WQG{tv~s[ S|ԧ\U_;:>;?\_넲ƃ_Ĺp}V{[35~^:紷΅k>u:} 09UG=]s~e[鯝oWs}݇:?]!503rxL9YG=;kJ<ّoչ:?\ߛoxO]W w7{GX}f_$^7{$+M<`O fyh(G(V+Vq>59:i+k-ڵQ>d` {\gΕhLy% <:̤<:S)GGz|ʣ#}ѿwE^GG:yCytoo4ʣ`K!|yL/yDSoy\}Qy#ؒDFoPⱢo~ڹ~,؟x¹~ GL_$^qxǹ~TL%r"G5ρ-?-WKE&jjiMQ:g<{Xfo%^6{,W _;gn-%>޿<煅n1pqʕI< ?oxS6+>-ocmo|(ٙ8QSAv)exS}qoz(Jw-GkciˋL?)okKNG=UЮQ"-?\E7צ_-~9y0p/xߠ/{_o2Dآ{S;}o}oM7>}{(zߏ*_HWK׃iůos>C>={=h}dރ&ebf8eR~)z%q?8~9VtZ~~tj8h[sC}~R>]`&>o{$8!(8UpسjXwa^= {88up_? 9Upw>? ^"U>x 2~DE)$ .L_$^rxQ1cL%;g/x W';HiGуJ߯xĻf$>xx=,O=wx+޻ymKw鰩[aK %̙#N9{L]vաLHVnqSҼMLŮcҜN_;݉u+~Ƒ'?![bh:wpt_r ]uA%ã[ν {zˑy">#])ݮa.(O;3>h9e%uK}nPC{}k ߃^p=PNB9 #\j匔l<'R]x~qd/8 j*fe;>x>U7N}sN}4+ZcZʩT7L{=9եrN{fybc/Ǟ֏i^iϭ{/ӟ89rN9Ko;/Ls OOQ?d5e梽)pl4y.<Ü99jK@-9?g07 wb#̹)ZܶpΓtVvt?K(?O% ?TS)}K$άrzKMh@e?tudԃ>"nHd9"Q]?w (t>OK1?6Y?3OaR*T :y[YOEПo? ? C4TlvfM. nnIfMT=LJSaoK|p+ی~A5ϋ_ުzAU7Nת'X^֐jY/+Ӓ6Oa$}Dv- 2()oՆΡՇnS-{p{v;4x;\pWgCލX ?.⯜ß _?;>؞av90yԟ53^9s~^K爧=l+x#4p|9GόO3>#5r|luRkKg/sy4h޾Rѹn 4s|w[@?Un;G>o?T0*󿲟0 ɇvGDv.Z|+^l9v5l=cXXO5)n%򺷩xkzvĹllʷQm㮁aRKQϽ~!asnga'Ͻ\j?v{5c[8s6k/C{^7{߷ ۫;%g˻ٰ板^ʲ_9=ڹKᏝ9#kpxƹ#39Gp]u]y,v+?d?p=Îd߁GD~kBRlEo3n>Yn m,CWmwV^%?vqv$g_^,ezozڤ;޸^<b46$xqZ{qZEZv,qq[i^^ΜG>L/Pv)2uÜQƙw&Ù̐ _(//C}[fd~Y&')8쭿f"6Dqs\Wl63{#ۋ=f ,jUԴ7ێ7ߎvuc;f1w3}o'^ů{ }6/i^ۼPuyz6˛ru9Hy)fU)E!ǩ S.G2}nWZU=\V{|ĞȴXG2ٳδg2=%O@LǖL.+wd`V/sfdc2eɌd txBf!39Gϲgd;2!ތgڛqO{3f<'3;G>@^io#=o8G>CioH>DfDf>dE^io| +AOoBQ3}dJ~^.1ao˰̧%h>:OOß~. 𗹟?}&<1wulOeIݺuX+4^zy͚(]uZpv+[ANu+v9g`6nט8f-akj;۹9۹]3\[cp鵎w}4YDN{{{w=ۻEJ>Y=MF#`c6Vl0Ӱ4H3^nO?#&0^)ى%~^g3zyTB"*w[⇭7ȣlJyWKQA" ﵗEjû˪"7?+^[-Myl͜82+po>mA`v#vkiZy1Jy^<<<fY/z΢j6NwyX›_ފ#Z@[ V!cފ^c*g5~|5]yX`yYѺӚO}XѧjSl"hME_EVW-N{g]b/5qoު=:ϔzsl0~R^Y!]8הϜg_֏?xogø<L<.g^9x5Qܗ>r?//;HQjBnY_nmKq8ۭf|oOwlfci}lBtkmKT߆|F'1gkxeW¿ɇ<Sӕ rk9eGv&i'Fr:6u\s}FX_Fwh-׷NG5V{m51,ַ?zZ:I}M>Л֥2%y֣h&banޝg= N1< 8ͰG=׷ۦCkOK?6Z~%\/'Oxd=%^9\_ۋCkJ#yvAx xr}{|9'׷W7Gq+ݻ|_w#hs}['_|n +34}|ѹnǜ#5|]Yۺf_/=J>m*ٷ$_7!~̟~n2Qh?5ULطEo[x:&n'Ѵ[Y˶/6iv.frmjp;@?V|8 oG>F/fo?^kM@b㑉bӮVطͬ45Giznd1qG>l={p{6NN>-]vh6oPO_(+ l+q'9ϣa89n@0b_G9!ܟW> 2^[do>j2A?k1[O9Jy8.:'[c;G]]o)aS[1zЊ}S]'GK>0ʸ_3\h>Rֺ}tqZJ{+~ӋCh>88C/vR~aa__[|@F?&$emt|e|ֶ װc6zFo :r7z7F/vo|rf¿g{7Gßm\~c4r(f|x>Q1 9F ^vq1יſmc1G!ǧ xݻ9xMeo9AԪ^w&Y2G;Btt|97 3{ɒY,M7_Y88v.gz G(>S9IP]ϧ<6#S9sTj T ~(G~d|ϗgϣw>n~^n><9@T/jo4o 86-hQoG3\?kn>ߪ\OwS_nu'xa7G^.߳Q:'~ďlz 7cAo~Fo}M0L˿y}^x߄7K=opVݐ6zG\n)즼KywGMCGLKtY[]?uO}Bfyd>Cno#sKЇ̧?oA2_~f>}|2=e {|*5Ys滰̇2_|&m2_?|.}~5ڜٔgفGD~d9}S_lTՖ/[ຑ^pNpqz"{&|Ņ^QUP^4=>u,yZ]uvq[{\Aޛ^-j𚗻cV72{ao5;ïUKSP{u?u՘ҭZ-Ŷx~GyܜE(s ^|Eo'dSfy=ПC_y㸒)rM={J'?ϑ?G%Rn?ՎCr^~Rni?#ROsПx+>O|OA5KOv='s}*X|R.->3>$bm9\kGY| z:~{^C?Xx?W[=>θyWL,ﹽ ?_=hKEU=zAU7wc}+&)j c=*&+zUNV~#Ch>>NCWKMgje,ko9џW>iT'$ߴ&ٗ "V^f/?|_$zE+zGo_De`SZyuwb[w Q6>T]^U V߲߭Ih֪]v=i3^ sԗq=q=v]Z~q\kToy|<,/y8eȍ] Ց#UG.:6b?/zj-\Ku SW;v+(x(0Q~f~{)qc^Zq-d>W 2>4`ao˳*:=Eߕ_8?q9s3p;)=_:?u.SsQK^/O#8G<x5>l|CGK爧ooϝ#;G>|ًΑI٧;ƒId/s[υ"3"ss$3$s$4'CG#_?$WwJ>|kϣ\-}~h_rO 6g|@: zn2iֽ޿ݲ}|֪u;Wm.im1MDǃc(]]&F-wawbR|nK+O'9:l}189qs4 o{|GW+ߤ?p?f+ Ϝ9?tћ>fٕ;vN9spG#9GgnVuǒϛ|~t@tebۭgfnt1vk/o3Ͻ]+gcw=Gxb/~3ia;naTBLB3팲pb34U5ݽO~^2 X)[2i2<.<wzeɈ^VII$_h_h1#蔔uOSׇKn"eGKͩf8:%?.yqOoGw&>)\S!^;o{%2)$_GqIU>EQ?^R67BBCtCyC{(p2euWM뮞7)m7J߸k/r^"#r/)=lЭ} sTyMgq{sی68rXÛayÞVg<-;#xk9c<=zs=//Yo21%u<ɔxЛ08>]oa#:Ts!@\V{G2u<ݥ=i.__a#~ӟ{?2sSLb'忺{H.bL'o+o*!Yrwɇ#_f>M"*8)uaþs?OnKv Q:oexMX쪿_#U{c(l+_oJ vQ{V\Q} g2ݛ08VŁvǏ|8쳰81p4 ϛWax$y^po[H|wwßOFi<"ag>pTϛ ۇ>b[Z><>|"^:7a-b"!7Ǎύo'KE~ȯL9r7Cqk|7Az{fVs}$Cxj37/?^aqrٷ毦Ȗr=i>{IifVӎf/n ^ a̎Z\(GxuM\%p4\/)U754slSU[ =V!תAd=c\NCe-1y39Wf)OK|EͮR^Ź շfͮR_Cm=C{عS7fiͮӞV܄ph*9s._?mO˛_;.˛38Gs~+ϴOc|9͙o5B^[I͙6>^Z{|A {o6 |?$6"rCsȧ_ImLqw?|aqOe?`V e?a6]v pT< [׳zJ~u,婖vZ)Y?RmVnqNyw;]ussnSWlw;zwM1:zsRelg vsћ}ћk:ảXv^LNZU[tX}Bqqi3z~4B]dxO]T+ys8GE]n[y)/Cf*dztG͸2Lgv!\l< 0ۘ(q[FB#EJ*nWDzb<2/@(ZzOL~{-bLSѽxy n&Z(svxfz`îrWcttњ\3yn/YP$nf:h6õ,Z W:gmv3_v/1?:\2x忷}|5g&>Ê>M~{V1P5P9P   v}dCtDsCC_sC\o{ {t{=;.9 8s#m98sKo;?w9s_G{>'Ox:>958Ӕ#p|a`TrΑo >|9g$q|h`qKKֻhe/sk?$uW$_t|䛃#e|9Y?|@O|΅$&9#߱_b@Oع7ݲ:>PQǘ|߽vu%o~l^vkF#1q-oTʶIsk{{b4[KZ=4ܙL6FmPto(~l9Pٻ|@1\87;{vrwUe6Var8s7%]=r 9NjC5闽vʑ>~Z+*z;Ï}sުrޅ=]oaaCOU=ә?jUhUM&ſogx |'^oW[Zuۣu3mGZuUYB߷ډIe8؞pTnRǶ'tbUK08Z7^^(fzb<3߳XKmNJ/ZqszYFXo+&y8l!z>zz>m땙z>9u}F+w!b^Þ6ZӇm{v{Ѫ>}U}V/O~ٸj;8̀rmxS:?5zs|'OO#8G<g29Gsxx9sc#p|9 p8Gs;Od|9Q|mc4rs_9G>1 9Eg'7^CEW;$٧ÛF.oo|#hӿ~?~*Go {0~%㉱ݲڿPam%d;?v{nF\fH+^am ;ֺm֜ 7w^Õ\S=~5['<=.Tqymrqx;rto"]őN:TWTSgA+HwZ<s:x<fOU[A/tZu?&=:'ݝqKw$2<$ʮ?lN\* t~#kE8(֊pb<33 Z)sr+y09apj,9){g9O'Ah* Q;e+cN."is<>;腰nok=> j(M{}6 7_=62*iMR!U{bOs|pJ}%SSL{Ğȴ72q>,N{%Ӟɴw2kO7dY9LH$ӟ^.odk299bZxxEf<#3ޑ#^OɌdc2ss2=sdd#d+d3Α/<""3g>Ff||9Asdd曰G#_}f> ||!eȧo2߆|,u2߇is?[A@Qݲq7(~N_~v~1~cHܮB0~[1#t^*6 if$_AJbގN %{[:gK/8״zߗ|]^LdW:pxmX/^d7V?يuZ]鯍y\|Gpڣ<ӟ)|kQchxuu,Bxg< |ιgz|If[Qҿ-"3s|ʙo77*-1_z.דOӁ6g*w擐 xk[:WW&K~5P,[-|®8fLda j{t#zozuHljbg|>ZeO׏f|v{]'FK7_KYaT[ϳ{{V!Ǟ5* = :zBz5llUʣU}9iU0"o{6&к>9}8x/9٪Dߍlƙ؋sS[cks3{L{wN8?rN9a9sk#^8G8'o8G>3Α4LF|9ȑO3jsk #khs #_lh^?W=цVSc|9݆fG+_nhtC+ȷZ?W>o^5nr?ŲwU>"v ~uc~U^~*M m=y7;KqT׳c4=w\W7Wr;+7yAGa7vwǨ/zwڽ5oQ\w~:Ex^ы4?@u܏-h^ضr TSLgZ\?8u2f(@8WhNQ8rp u^}*ovR|Fd2C9wN$5bɓAG;sa 9G/F_Vfs*C;_};Iӯoyr~%σ/(Z{q?6>U'h{۸>_ndٱ9'G݄6Z~߻qv8~eVV&G=PQ}P O{PNnh}c~+5p}}OW}&O{{ >}5C}6#>48b@f9=N{vnl pk-9Ѵѵ&FÇ?s71>sKpS'9/#3XnG#9Ggso8G>|e~w'2yJ[Α~If(s{K8ٍ`=7'gհ٧䳶K>l(_$6#+͟I>oN}0)󧲟0 W1jᣎ[οoM;ωio3%ݩhO|L4mTь25<~e|Oڟ5x:>ɚkNf'٪ DubK0۪WUQ=7'F>Yy?xOXrMs֊>#1ƨMrW:W~3ރ8KX.}Bocξ>|#|5"2(Q=6+>O{c#,|4gx>=ǟ|AxLUۺp m}x\3zeZ{~d=ZywZn'znwϛ'G}{^I}Xn~~[cnFG3eds?o;Vn g\A3=P{7ˇoXO DV!<<7f7f>8X(7H}vߕj3}EC7U=l6s3O>?s[E$s|I9?no}Ӊ/o35{|MYOw~%hw m!F'ݽ|$7&f']0 췖@qD?﷬?you˩~=%S] ]/|GK<-P`61g]r߃I>(ی/6c=u΃fsܓ7S)'xIsQro;+ ; P՝-|A]q>`gvqGQC2˗,1rqv8˱qgE6-j3_J}<8lܙ1}d-29w'G* OS˓sԗ3y}F}Qfy6ú=-fy6y>EOA2_#3~eGf>}||&#QWa_3߅f>2?i̷O2|)yr?O~k=h8"[wA{j,G/[`0}=o>X] \ 87w׃a7B612Ʌm{}>yhwߎF{ϻIlj{hQ韼Z;wcTSCydI5׸0™k|r}/7o ǣ7ꗝ[;k;|{}[1yd&{_tOxk|$w{w/W}h,ڽ/hѿ"W|}+\_FXߍ{ɰYF<V{lma~?*V/{POkS5zwq9=w*Ãc}j|b?+_ߊV_y|q_U]^v,C>GY}|3$6S~s^$Ѭ.˦Jzaz7KyXsȳY}][;~ 8.es=L}v^KmkjOvq'}O{7/s0Y0ҕLJ9 | cۇ><ʇ#; yyaBTf˥<N'>;=8/܄d;<r=_ӟ̏4?j7Mx?v^>9p#gۇ#3:Ge8~j|8ɉTExi>:97Yp|xO|?%_7+c_~~OSc5A"v Q׳[ˊ~=ƱZ?__C^fwOm>p}wHd9wTNpz=5PwGڧNw7Kf<>qp{g~=J;wߙZ#F] WX`{r{ ߻gk\&R/I8 8Ѷi6~;'owoӃCQ N->?w)w<؟x?d[|x~TxN<\:nSY>+~i\M4Wd:|p4e?^ǛӔ];9~L[<G2#Y|q0ys;>?wf{XrWp)t_΍ΜFI^t~^e"rKy&gp(%;n K}CԷCL}Ӄϻz ϔM ).S]S]b/IB)S5a<G)_[ø<^R/~'rKyGs3JyG!<#9-y|9A拰'7a_3_f>Kf {| ȩ_2߆?|*u2߇ios? nJ,v (nm;aяO;Eֲ_nFvXj6W@i]vi˶1mz?LBme·v.yJy 6sT\6tWT#d޶jGncw4g֒]!<6|#}~vyaƓϋ6~0_ ϛ}N+1%x&|-IMxk^9^@?5 yyMC>]yCU^5sk"w6"/)?5Kv"#5WXZ\ 4_k1|M#Ѷ]k]ѝv}w'*_mk㝯.yMl"_]^BыujXS-їf+Ov/6%ѹ g}ov<_6= (7yڳsy6|8Iz&\_ӟuNvӀ/˛??_gй9pc=χׇ#_ҳ;C p#ΑO>?NC#_r^U-&\4_x?^k^CG>؍=yj>Ѝ YowG>?$nOϥ7IoROe`Vv늲cU1]ςV{_nmۭ㨱vs=m]^vrw\n6uu_}yQӽ!O.w\EUJłr6{1uo0闥ciuӋV7e6ÐLra ?"ߛlkr9 9}^v%\L6E8aȵ'pܘtCnGyy&29єO{Y^\ Owyx32Ւt=1l3_,f&iZ`yzq y,e>>߱'OL\4q<4ςzOtiU4o}Jz>c%\-}x>{7x={sgonl%ي[BqMس.%y&e=o4{\nw4i<$̴ٚgk=< {=ܭ3^ߣ8)?IPgrY^L4;Ѭ2cbe!fV"cn89e{Z3ԇ>(7 DK9٦OajQ9iD۴iGianޝL O1y}rz&9uqN718si9sǟO#3^8G3?D>SҞ|A)ȷL$3| {:״:*G'=K>k.ɇ_Hl,ɷ?I>>Ѭ|=[_G?_Oa?J4w Qݲrw#ݲEݲFH~Lo[Y\ 4nav1{m$<OYl{aYe|nyP {emIcrOdsޜ{9~/GQ權Zޝ9}2{[}[]\inΝy *+{ג ϹoE-1p,ގzcxTM~Aoαv- eCd=cz<gJS||^W36,oͿK>AJAO~ۭn1^=^֡[^ ;ֱ2Џն89֏` ([y&J{͇>yA}^a?ez>6>=?|ȟcكZɝf|I}ޘ->~P:3?(V|X-(Nr?4M#U;{`*5[O_՜[cע]=+[lqSыM8g"ur*{O:UNcEyplFGV<8Vd*;<9y\r*ZV- yCqͩha8qЩhc~>)5aS3Q7;q4G<㸜\Sv(r\|cC:<>\'> Oނ=u=K:"[_:'k:+{://: 4 *:V׿g}z^oZѿssGobcnS6 <۞tOʣ7V.ȹ<ڣIy\NRQRQ NRQRxxߟy<+Gƻ/!όE15;G*]'Q_eH>|M!Oɗk.z\S-;+}N&9W;v㙚-aȗQܖ42FZ^E>h7~b?hyWف?o4ލZvؘ{z{K{}'E=@܆qeZjo9VY{Ǧ!iAGgurԩN9t%NC5p/3&9N_"[*?Zi3+޸Ge {ӧ]g4 \%mt sMO:&.~>8scfs{Iwe,'3VεѺ!~;yߓ'ɜ듧N7z?,]H:c2s2l}o13y{(*lmDn(*qZND~iOKg|GɿO|'S1ݞL֒+⿓?nO;j->?sb7xBLN:~6,cbqĤXωIDZ!ic)I!ωI!Iǡ?&>9MN6>|l<>;OL2{b/6ً׉ְg/şLL^hb{+gwkCOΏ?__;?wx`[s7G#9Gg3?8%KSΑoA2|t#3|CEpf_o=J>j*ٷf:w(fOO43X^D3'&??e?01ٸ뜒Z햝|v ſN:wkI&^M[ryMzNk]Ǟ%&~ˮ:'pGO\_won/_,^@o 7Z,CxBHNZ?k)ڻq먼vf='3{9{ Omؿ6T{==uX_V5V{e+ʕ̹\߆ֹ ]}(;]_+Nn)[ܦr(~NXߎ^Xu "[,vb};Zѿ_SN&s[d!텇"wZq}5r\_br8-w*x\WG|鹾+^{]Z[jpu\Mckr}&NTN\~߻_h3}}{R+ 'FamUm\߻_3k/~߻?OJ=P=R}PP{)L^c=&#z=9uX=}kUy;>LJ}.OBߜC'%|лzXߺ^zY=9?e˱~۪kß8\_LJr}m2rmS=׸$燓c}ox|ģWLGqK{99sU=8[oo3qj>\s}#:x^e}SMַh>|yW'_4K>+Vb+:ٸ{G{x<8D_X-ƓϗZ؏}?^-sSn؏{>hU4iUkx=㣽VXh+}ڛX_lzyz j-~)~-^Q%ZxvxՆ<׆Њ\6<=>S_׆>oCG+9n,x=!!=^gw䰇䰗`Sr[rcrkrs0=999 9 9 ?%<1?O/`>" 3ް,H0Eg7hi}u2$wtBS")HyG'F۸gx#pNw\EޏW1w#~l;px`ՆȻ:H w|K7]$,$;,ո|Uy{-fX]vY۷S+[WyG.w2"o_~s;y1~;Nǔwt:ӱ]+6yv{Dn*{to-Zǫ=w{)nR^ݎ?RfXERX|8Y[0c'$9֙ݏ/ԧԷ`cWg%ɮ-ݠvwX¢ayx] 07Sjx^+vա<{fW4s 'axɅݿs voy ^؝ >ؽtrtF$3= ]ubw6\O =pᚏ/G3nC[ڛ+57yW{[ڛ[{1pGqn׽mD?Y^Ө{r{3Xlf{VQan눽ڛ{Z[Lnˣ!ٖO|1o."S7v϶qX^}CwmKZv. w0]ki(Ly/?|X~d-aes>ڭu/OV'L}tN} >/tN}==qN{L{L{L{L{02469u0y0}0A0s`GWgw_?]>W```>3^Xbgdx$)3 >m(32x)[-txsH<xqzuƓӫ0 f<:Q{О g`<^eO}x{zcpX靐O;-x߮z`z+_&ZNnz+tI?[VY`?]o-tcx{b7e{bڃHhgR/v~l/ҡvI)k5\Rӫs'ybow#]jSE)5[[)?b#nMOͶߏƋkO }ֵ?.I/z8io>^?,{.Ze}){=^j#JvR7;bx(O/MmVxsѿckR{_/=^|qn+u#ҖdoRn,pySux|9^)qn| |t2߃} >oG+!zp_~>|q{P{~/P|Ϗȿig+B_m~*GokN}t. ot.~,>g>s{7Qo1>PۖϏ0cܞהqba??z}=G}>w_Qc}B}^=<?jv[Gn_l^ns)^x5JO|"Uiy-2HUCѮ|vyFwԇۆKQ} Yzj糩ѩzɦpN{bUT+Ν(*z/aڻ`Cb/iO֏={]=?pNa``#WgwOo鏃鯃ϝ3fx' cGO\}tR^Qx]ouu,/72;Y"cuC3' K᪩xعv7Ҝ8'os7Ů=҇3tO'S],EyY]lrAM]~y={kx_wFszFkrKw3÷嗡̇e>Im=yyF+]Q^oH.m?[ibņ~M}_îwux^ 폧/1&gnbԷic=NB}b 3͊D1w{?…= }k^a]+swqGZ{з{5ߑn6nY~p4/tb.'B,.x6R>o=~(.D2c9~'KR^~$i9%"o;W"KۉOV?K[0磝|5)6U}pN}vdq[׀7&}L{ЭnڋiOio=hܖ2Yw^:=f{?ޮ?? sG鯂ςG;Jd,4xԷ_ӟ;g<Rx{1tGO}>g40j>d5pK{Ӗjs}Zn`d@qF$A֚s{蜳ۛe(kݹZxnϲVۻچϬi/k=Zn>k ?Z/aovDgi*}vl"gyb>]X^㵼U1\m,o>_k}o KSZ/`sڃcO,'GiiςiٓiOioiiiϝ_ӟ9 ? ? tNL8:9/O<% cG|x&Z08%gڛL$^ f<<^L{cNg;մ7o:g<Fڛr4]^m|f%6{)v0q=xfe=`^ d=o(ipbkބlӭߺE?Ugm?[0V4~6)J.xr!a*.;;=y5ܩmnooIB<}Sm_tcyEMK.W`?UnɁ[)w{˚ٶ|߱V`{]{|MR|kλVc9^O9VV5Z>ES:&|5C/9ԇ.~\798~3sڳ`ڻaK紧ôiLJO8? ^?;w>|3iꏃ˛ӟJ1` >30x#Wn;>Jtp4 .Se玟 W<\ƓOÖM?:S㵿pxx"\5?~x.I<2oo^nnL-_MW ߗ[3>\ R}}|[/R?^mssp9G(wzg/~_^=;{V^+[0ǣzyWR9KSJͧ,kOY<]XSї[øݕ{^WvfrafKۛڗa ӔۻX?ǻCRiϏ}lQjϿˏӞǽϷo>vAg 쮄[!#cw7}m#ѽ#ǫ{iGgҎ`ByZ֕ZX|V1e%|2߂9|;2P|>t+EL}~K}~K} >w;M}=Nb/l)9MGWg9={9>t|p{J{:<~=M"$&(9Y0]0a0s````s>3^f<#|3 fc,Ox{v1l~KRog+֦| |?0F>pOxlx6D?-1흍vtyY϶o]adV*>4eo?>~{ۡ7JnǁRŒ{I}-.~]E-E}[i^x{n?l%%-͸ß ս:vm/O}۾]&~͞Ylz9{ov~Rn6Ϯoٓ;D'\^}9<>nGlȕv{kِ@vdEv$~Roӳ#/[|ze-c}2]v2~*/[-7ۗ}vIyY㉴ˏi/'ؓ` -;~I{x|{-=L{i y ˎӞb:G82f}gU6K+z 46I}ڔ7'ml73^x&~KO-z-OWbfx.mHt{I}G`ƣˋ0^]^~Il(KԷ(=~hf?$7""Y/,o_k?Q,ߐ+ "Q}5H\ִԎj6V=>^ɝ+sYp{ci.no,y:;㶝馥`tOSyj%1.<~wevYCN`qd8gvA0`E${! Ι\SEkc "G;2$x<^~ n"3.̮ >"9. "WOyt^<^ل6%;d/9gvd?+{Q6GW6)4+x<+;d2O}fKӶg=)f)&4{)qfO%{&dי};ߒg]U>`m+=كvNo=yvkC.'{M1}wR8Iu23}2qu|9Jy,Gwd>Ǘ/'0e~Ζr?^>;'C_ЧSr[=  7  {,N{=j^ӞaZi-a\RioL{ )0)'Q Ly.\S ?ϔG*OoS_C |/ȣH~DM'lBplBof~e<x1Aߌ]3#t{W;H<{s2㝒x;#3>Ȍ׏g<t8Ngù^8^: 89~]?fݦofS+=~Ц?鱛D1=iBnwiѬdUb4.o*w׭|Rݖʙ/n{YQknzOqyl7kXsy53nc,xi9xLo_\cw=8MyDbNGgf{1#,R|]L?xa΍}n#t'gU/7|Y^>KJWy1_}=?o09߷~ƣ~ƫp<9sʫ<)`·O9߂9G1s0{EzT_OԷ~׊[/=x'E0Ipy#Wg=ǘ09i0m0q0up1P?~IGǟՏX?~iǟ׏x~''ިx~UgiP0!4 f<xs7yd0MG7>]يm*yr0ꍢowyGj;Wo}}k=PQ4 \OT;jR1=ʿ.ZVҳ -;ڼ[XuzwOGӰ/e.7 84v@6kKwҟ1wk^`trhKy.7{}2kј9oj|ck~s{n_|i>>7lW`n5oTl` l0jG.Gwn?Fv N;[ƃgdQjUv~T0:׀]ލ'K-^q) l0{0 ^0Jvxp W~>_y@<<o;=vb80n^vԃNAn/n<[2+vۯOעRn⒔5YmJ&_gg ݞDn[ ZClyËkv㜿w7ϰn88^a#;0C* -X{0!L} ?]L}^ d[7GWgwii/iOioiiӞ_ӟ8 ? ? ?tNLLLLL>@0`78gb L0`CO9gxl|'x~ċ'ox4/gx8t+J<>3`=3ؙ끁zbڂꞀntܬzWF뭻=zk<;29wMuɞ,mf^H||Z#K` OnH2x>lO^~?=vw^oOuĸN3l][-5^9kK;}Z^㻼S%wGI|#wm  |_0 ]vcIVdX#eZ3m -Dz)`rDfes>sCs{1{p]G9i}m}q}u}y}}}j#O7#ט*^N{Wawc6_^|im/6Z?ܱQ|v* oӟ ϯwo~Ͽ\ٓV燙.ܞWO/7wWa-֛L f?-m?7aj7oS3&x~LpWp0:ك\?7 mkS^7>Cxb=x {X?~}[x[ |CϛOa+yq;x~\? {L{ށ7^a{?ß߀g.?)|=SGxWT0/{s /n(KyiSw&f~6 = {Y|Oyy}V6N~sjy>}9&`ʣ~U?yW_·`Η`Χ`ηj59=L}qN} S`sڃ`ڋ`ړ`ڛ`ڣ6ii*zL{XQ= ==wN{LLLL(*,.09i0m0q0u0s`O3px$J0`;%͍2^ f<<ޜXpI{ssO1e j`t93?Kȷp}`=k{>ÛחH;;[~~r~?#x{/OOe/߸e- yhx=4(xX⌌W0[91l>)`{|̗OC7眏S|.2~GD_{xTߜSg19 "$9Q0U0Y0s````cÛ_ ~^'*xO]?5~o\^'B|=~e\R|_[^Z|_{:grxs|W'5#npc/Ovp #ǯW]}s'h>a!1=ʿ͖|eEzN.!|7Ǹxw82+V fҝ ݌/?+9,y^<_x'N+\؏ gO^nK}ʨͰ(w|:`w)>[`_7[iw7s(0nr{ܰ?08/'qnr3n|r_Op?^/=ir?/_^~|z![N=)}e{?^~|z""T| w~!ߏlo+{[y|o~}|gwM6゚}Y[|9ߵx}}⛷`~߳\:o0g|}9ۻus93#]yS/)-9k0s0{0!L} 9>S_`ڃ`ڋ`7GWgw>i/Ӟ^Ӟ8^2_fg?vkןBp4.2ߛ+/|.jm;Hx<ӧm#Aer=²\O,;_Cyt],o[3,2Xn>Yßl#"'/?6ORF~cN[ .{{ϻԯ۝X]ߞ=>9~;v+2߇טwC?7+ / _}JO?~>׻}^K1^3?i{y߮=~lw>;=~y!xz:~7>un߽>Etn>Wگkd~kn|}>_'ioښ~k63c+7w?>{2g~z[zW??z+ö,կx2޳53g,V߭_qNSs~?G%ߏaT~߰K{|a`ǰ@& frǰ$ck-{}9)`{L}t?c y;yȿ gW*#_$-/ - QoLU޷gQ_*F'0o0o3q>`ǃ⑭c{}.x6\+'s-7sC{]Ի2|xFfx}Y"77mQ~Af>j|X~Op|E7/{k$3 眿\v O0߷YsvY3l~9S`sڃf;E0I0퍱أ`ګ`ڳ`ڻ`C紗۫^O{L{LL$&(*9]0a0e0s````{/3fH0`3w9gx*V0`k3 f<'Ec'o3mx}wM$b3^/(zC>feӞ?֨1=ʿ̸ [ӄ[vry1o<\q=ooypx[}ꯏϷYIcK[3|o9ה\{/V;eo,\SߖQ_=*>/Wr_ioԸ6F6x_הz|_>^\S=o,秧=y{#,_&|sn?E^o-UIV"o:}o**{_yy_՗N1^|DєxuX[,#,x;ݻNjKۋ{fx'7󔔿o/)[zzz%ַ8SQiݟ [#7o{+ vgA~ϰ>{a{9^vE3myX - <իOys>X#/OoKs>s|>>0>bEoG`s0jOW߸kugigu5忺[3忺_]Aw'M9 ^"n"9iwU՟;/K\_x#C4 ."P'xQ.4 ~^/ 7{{x5IWkLCioퟜ~Ɍ(z`y9_ha²1GVD}B[ÒzVgzCI?aQz9 n¾* ^0k KjR岯}}fzۛ5m|~Ƽ37o;a3Xbq# ^0G,C~,} x}  ߌ|<ˇq_<>~!}x`?wh?aLJoϛo?֭<>?|Qn\Υ{֔m]fm(F}ۓ ^} oOG.0㍏ӻ~${N{--yX=z#Gt_^c7%G荦< F+oVI[{p+&u6Ϋ(c2%O男%|]K0b.dUspΩ/Kx7L} A0Ep~ٛGcǞmiӞ=vN{L{<>L\ޜ$x}(}9]0ep0s`aW7ۇ8geUo;áϖzam 'Gܥxܴwvg3W| ՗wwuC>27?yGVF}|^pi'| F~sp+O F=c0;uQ_S3oSm})o^/kgI+<_~"/n))7_W/og0Hog:w7n)_R|9)˥Gy|?:/~>Y|,~U-n?mSauh{B$y_{m}@w_Rs(;?*)([b?1w֛(rM?Izko}o7A@֣7W}4i_|7a;d9-sW<)/+L' s·9_9`J[0cT`~x;o>S_1WV} >S_SצqK7c^=k{>}>{\S=vN{7x5/wmrp7JoRf_e`WOm Ę_[zgj'?lQ?k29_};^Oc e+x=^>rOqM{pz}|gt0{Oz`Wqܟ/q>o_F&7F=jpK`<>OdW ~w/-5_~mԯ!7ꍁq+ү<*>O \!]o|'=yJ뀹n珢m|3߇>S_OΩo`k09L{"$&(*9]0a0e0i0m0q0s`````G) _g ? tNS~V5k_{;VWsù7v_o|`Q'8E0Kѿ/L}pg(sQ9`#=x<.Q?``_#9OWzx-֓o$\s?;x>mo 87LMs* xzU+zbn/ڏO b?<<~b a~xŴ️>wr5l_|~Lwn}\wG%~.E.O6+l?B>|9cB3ͥss>s>쏾>폾>>={? o = =sN{L{L{L{L{L{L{<> "$9Q0U0Y0]0a0)9m0q0u0y0}0` O3f<~L0猇/ϴƌ[ڏ5^ ~~  ^i?Fx1x3sƫg'ݟxx/GǣxJq2i?WY/?i?-+#+cz_oY {m|)_oY1{</1PUdKOhi9^|A(o̯Թ?` ;_~)k+'¾˴yw~Ϫ~q?> Y0C0.JZT?Q2Mys?]-{|`27k*CwNVw5؛`_g3>~v0WD[Ώd,՝zn1`ԃ._rg+7o_퇟|r/WDӕ{w2 ee)ۧ~Uy!8^ sc(b/oKE1O^m+qsd-| Xֲ;o.. .\{x3zcYa/6c%<-R^*Ly1)~0Ӳl9߂99_`eS/`%>U`0x7iW`30 {L{2-\s#<r# .9L?߁`[01\r#x)˽[x?̿ה|sz z<\/̨1SR DwE_-g!ſGm~yUEP"jR.ȿ}~7|^Dɪ\%>QMO/^"ϧc5^aX}+#>+-Ƕ(}!hw=s ?g)uk{=v||uLO$V] !*{}^_gW/vQ39~9~U'G߭'wU7*-R9~#S?Mr<o>~_19~oi-{lWǯ~wn~vU9~+ǯ}p_;?grO9=ǯx~~}~r~u39~3/]?y/2~sƯ1< Y0_ }`gOsHc`|\/t1?a?o#xOGo"ߋ2r~79~?{+zc[##y]| @G.Fs<Z`,JLy|2?sd?'W?_=s[_/ΩO3ǯVw99x^8= = rN{L{L{L{468?y0}0A0`.W͏?9?t~g5>xD機gtVz`Oۿ\^od|}s 7>__MӶyy&|?MӱOb5GΧ]m}Ds}eοF|_0c}9v0#e,"`9?ޟ?e̷99_<1=L}qN} Sg`ڃ=qN{L{L{|Zj]r%y$̭vzwFDY?y#"iz2K0s[01xϝ3ރM|b,|fOSsC0%|Ɠ[`k09TzLzL2C`%pTo9SER=2?XpT:^SςwS/w<^_^'zL|O,?& =1g kX[FvϷ0zgcf?㳟՟o" eWGkG!MثÿKf}rSZ0ϧgs=<_7Q5xXܟ/__p8ϋyܙGe; ypq-ُ1^Ao{ fn~M~Op^>|_e/wp^b/0yxc<Oo0[pïzq#2n_ۧ^aߏlSy`rY!3'{~q?yXgr;ap|//_Eտ7W֐e>G3~}տki} /,w[58> {q=87w#}w 2ޭ)ekqy}d,թǭzXM6ϨMFN^[?|}g>@`qK~ԫzǧҟH6^ϧϧ _Q6'?O0~s,Ɂ_OY{m^̇;,bHz zY!hys~{A8y'Yqo0a^6Ş`.xsX#0O9p,\>;OߜW0^^xPxQxRxSxd3`K0㩱[01xnPs0|f>r|f>3߁̗ΙO̷`cpIޏs 7y?73y?W5y?wSg~TOV=z <şzzzI'ћ`?wջ5/?7"'/W:??-|y8,^|nϷչ@Q<*eU|k`\Q^v1k  77rzjmy3X!>~l~~ڇٻ|Eռeԃ h9{/p`zQO(s-ήOw'~38r?~٢I-Iҟo(\ҟx>@gSzKOkև"x=O^c|?#!x?x?UKO s?y'?_~?uݯq?y})Eȩ+/OөgQS"sQ9E^?}-+DϿ7| 3./c^=^vQI /Ooe<9^`ws0 LW0Lwxf3oG`+g`;0!x fux f3` '`0 \ӟ|ҟGSo5 GihSSW=.O]swC"S[ckߢU!zğMGGԫDςdz[O%GKn[wϗq>nO|b||Zu Ę-[9;v|ka^ɹzeRFeJ?nK0QowYc?jwp]׭' ^2·yÏ]eﲍ?'{~3qooz xx߾1rW 6OWGWp|P;Tw' ^o>Dp_ W3ޢ\q;xdE}刺LozxkWG{c/:7֗gU9G7|әw)ss?h-˺y%7p|fwG=<w/sߪ>)}e\߃yyvD:C/u}y_`Oؐ = L{i}}}}9^`w09Ls+ 3^O7`#W`309%x fv| f>3;S/'ΩG+`0s!0z Lz LS9S/So:SKKK/Nx'z{)S:z~yw}2M'|˶Jeb?nֶ]?VZvq311gWJn6e|69`>2^¯ͯKb~>|k0.[~y}9vԏrx^xez%~G_ONkx"qzԟ{>=Y_`9ɒ7>y6.fv^keˈ<\4}N}3Q/my]sxv+OpsQqX"p~yGJ~E5e=goş 'gaH9fSKy|;ߋ?LF=qOM%}(qK>)H>(X|W/$oy4Xk|#a}5ߛm(^iO;8(s<49^O955^5Ww0L:o`s+ O7`#0Xx f<3:g<3^Ι`0 9 |f>3_%oVΙ3ڥ'ڥ7ڥGڥWڥgDS/GɗϢEρGTKѓΩ7-^S6wL= ~ҟzepM~>zyl׫sF|C|~X'u ĘꝢ{[,zbhe;A|x]UstSwm,yn/ƃK%}zχBgqz`]4=Yo\/Sy`ce<[K]ƒ;5x=a_ߌ{|}p|9~p$d 9O.9w]/g5xxo}?\'7ezx>38o\kO1txyzS|x ȩ{'ԧ7BcKr~N=s?6LqN# O7`#0s30xi,w|S/'ƥ7ƥGƥWƥgƥw̟DS柢ci}'ԃ?D/'-4=jK7ѳ`Vy`o^ax2^tr>`2_20ou?Q13ʟ[=:Sɑ*'=wZ6ִukl!?̷w_?ߧ{^ӽgk̨oWyY/tzY+gs1;7l+aUz|~yCڣUO{ՈՈ|\>v< ~ï{mۿYae>G~5Εk}8ڶ?6}oo='^iE!#~^m~gm9^s;?o`f"ץo0iR4^8g<ϴlj5Q3wV^5x=Jx.i5_8g>O3߀ch?b<C%=[!E1T8^P.bz9 x=>#ߩSks>ROGQ= bWsUGѳ濢wURlCW-'z,|',[V:Sf (oY f o-5' oLʯ"}1K+s+};{mg}}M-X߰B2,K=m?4g:ϯeOo烫x~%q 0 x4&qSLOc^/jnﱷHK !q\ǎWo6?ٝ;ף<_~#֏ܯ`SO?b+iy`g%?M/yQ+8<O>^^L=|=x+?y̗%*7ߎd9F=ף_o{˥9^xM/g}}ԳD/f}7~_oN==ޟƛ,#_v/c꿷<3n}=3a}54~}=KXaoX xx#c<6oxx'D鏇_g2xxBF!#WȈwdC2%48-xMF<'#G> #_O7d#2Up32|IF> |KF>&#_^CdOGCgb!Cߌ7z*8z FFRԋ&D< xD=xEKoD/#RO#^Ro#R#R#S#^S#s>x2:e ̌Nk?|n4Vj8=i\o >1OD-Q⼟UKWp ,v.lA?WD<߄׳xxDY{ĻzW/KKF-3]O>zcMe "'`w0}^+-xD/ߏWOG=`r| 35xG>woKp =~W;xcCY>8/ߗb9_G2_gYa?yZc+=`1>Ztj_m`&bO0 xhxixjxk^ xs;?/`S?:`;xa,xf<3^w`S0-95xf>3_8g>3߀W`3w`C0%| f>v| f>3߃ Ω'`0 z9xf1^SOSěz\%LՃΩST.=..=kF.xHiEMUzuUͣ vc'ׇv@Q<߲-zF}fU6|욟ʿoƷO6҈oNE>]opxk~#wz|b̧1Wxe~{Ooߣ?m70c|lbOƧ ?s{5,=3s^92޷d>~^lv~ƾ^T>3m?n_{#2Y'?Z#d~GhGdALJk{'{|o<ʒ/g~FGy=? Q"<5qx#lšrc3ma2rMQt?=2ڇK.ڇg _S2m><3ߞd~4. ׳^Uzx^^=7yZhYS?K+F~^oX^_ ӽ_1I~=+ϛݗnG3}ӗt};6ş??o}1>o}1~;A>V]އ5~F95l2ibo0ǃ] x2!# uxnqӸm(9L/W0 9 xf<4x f<3ނ3^``0 9 |f>t| f>3߂3_` 6DO7#ΩW3`qqq)[`1k揢{`Awы`I7ԣ#cƫzLkL;`i-x+z}Sxn\%oXOX|[N dw;㎘ouV94-46~?/sXq?GW)wz^fT}|rj"V^^d5Ws~W`S;{i…3 {&|3_ڏ=s?>|9~-oywr1o}o/_Ծky?\M7~߹^>_*o}%o}ユ?Uy \-w%O_M?neK0s>7-]yFv>+x_ _“M,z|+|ӟivUb=4aQޡן(oןhGS◥~?v'|?aמo$OJY+>vqH/.f9>|_vFާ]Bb/0m/a~ }gf?M'pצ۾q_/ޗ++^++X`x~ӿg<3ށ3^O`cc`sp58g||~Gx3n9%x3nKÙ3ߟqg\N[??WSπ?z ܿ/sn{SOKoKKwC0UOoS=~?z}2s`XEƙoY , yst[.;{=#6f)BV`Oaw>L~'^??8y羟_v^_q!g?wyԊrO>!{C|c-}(x~-php}^+|}=-8i|jnGKO|+E9ۂyֿG9Ks7{+[pY?G+RF}^r~?LӥQn9^Пʸ ;o\q;ɨ/M2^>z0"<8s=>BWSƋo*G3=r/<+W/=uUSnme}e[9|ǃ0^6#,Ƨ`[ 23Eƻ/x=%/ |Zyr^+ȖJO~+)g({_2}_}_2;7}oyoG|R{6P5 ~$ǛsG;% x/?_OߜW0x;|ꛐO3ހW`3w`C0%9-x f3_K>O/C9CxO̷`rrrrSO7J?nS8JEIz9)01kDρ,~tNh_L'ћ`GQ~>zLkRS6DOFzq0mQ[ai+/D\@Q8zʙYV|kY?6(=*~_ήle<=m\Es{W&.ػhw| .b99xp{Ω7S]Tg;G]T/ػwQzkkٯ:xҟᅰo 3W_Ϧw(y\8[Uޱ~} -OnpP?oz5=73C~;/ iD|B~^[X3gw:7Wq683[wG^|̸o5>Xџ9 Fy|_₹~o|[L>׃b ޱݽ^6'{[jz3oٷ+X/4?(/?|ߗYMx| G\ĿS3 ;/6_ԋxk%og|o3?Z}?O_?>o~(L/^cz}x/|}Ϩ25^<9>|s9f~^s9y˼i^fYXL`O7`#0s30x ft| f>3߂ݞ3`#+3/QK3?5zX50z_ zI/7ԣDg-޵'ze/PoϨ_uע-޷x/0 d>17|5Z@Q<m|Xs?ߪ#'<>M;sٳOO濳K˸g9}f<<}ɸf|{q7xf[~>)o_Ga>7^-W~sQ/t):?b^pO}1}~XS*״wp)i7icigKz?YzEsi}x˴|-ߦ_;O1>bVQ5yI{="GM?v>p{}c[EM2{-E!ԷG_N>OK_2Ap7? e_zg*Kxw7[쿤}?Mz;yn^ߝ/{lN{iO0}xs9o9`g0;`,?o`# [6'?H7x~U!S+c'7GWgwʇ6%_>?>#8Ӌ]|ʼxxzHp?\l㽔!c</soׁ>vpqp[ XoF`}7#_WG]0Opܷ+_N1!sGya?<^~Jop?9WkUxjկi/xۑJviϴs[~{g﵃U>|_$io0am`^?Ӟ`ڻg0Nj|x!`W&dK_ӟ70xQ+^|xf?9zxͷMdb̌V#63_Q/ÒϿoY3[VKs~l~~^^ W׷=I%?qEVOyXƣe SJqmd1z瀹_\So/nyqpxj\3n盩7gxw=g ·;8sxoWy-?x zOg+۪?#5L`G>zspx~wI=cxj\2G}XMWpx{zy}%rizxX^?t7qM}W/-/2g?-k+~x8o%8ouGxy[xq{=ꍷs>ޏwxC1?"==Nj2׋/O׋oߗMQϪtD|^D@vfó(G=oPҽf 1^3>/e;8kdx Ozg r}ƹ?58Yk3wcfW S[<;=%+8ਏ\}޲zq^%8 GC-Qq^ﳄsi3;w ?q#xG~sqM6_;M{QSਗC?}?43 _%~^-53ҟ~FߵXpnV!|"|#y|$녧?O/>UQzgwQӟ~(+ovZ>o0>o'M~_0ϴvHk~eO8"L{r L{N?io0ü˼Ӽ۴n)Oo`# ?`0 9 xf<3^:g<3ނ`s` 0 9 |f3+_++++_++=~ş ^Gf'K~ϢSDo9s\w-j`gS/!ݣ'KH V/?^/I._X!I/L-a91eon6^-;~j&;߲D ݝ>;wQE+wS(+|a2m/f4q~L?p''~`Ka"gΧ*,{{W3%-]lzYzdpڻz{կW{zqΪkx]|N{:{N-+ƓjzMxs/>g)z֋dJkGwG߷L{/$~ߓ~P.<_dl<[!lS| 1>nٱT_eK|_>}¿L{mOL{Zc!7aGp9oe<9^g0~՟70q_/ޗ+AR6~{jb9x;p{/͗ΙOS4{j>w|_{^WGoKKKxM.bzi%nv[/r{s;w>]Q}ZWciogGo?g۸^{M{z e>`^ d>a3ZvNg [2ʟ[;M[zo=|˚s5w|>~ϖisnf_|DS\1_?O+o_Oԣ q9?C<zJ<,6X/7F>C9.OUï Q6x_?aK_/8?bp[ X MFpzIp .CG< Cs}j_7QO:8Ӄ7a|g\;Mp>|Np`p >y7ܿ1& RV~*y \~rpy5y#x"{|9OW.Xxt;jUȧleW$~To0a^vO mWC/9_rϬ{Z xBd2+ ?9?L,џsx`?`0 Ȅ+0xXxYxZx[x\xm$` 0s05|f>s|f>3_O̷Ι`s0=z9zLqNSKΩ}Ss{҃6E/'So= ^-/zx?d絨Ϣ^.~>zLm?Tx~D[~3[^|-6ߪU.3cf?ηt[G @rzV'xcp ^O329XS"T~wo;]oZG.q3F>G}X/;<ԿkG|^mpGW>y`p %8֏~opޑ˃[gϩڕ Q8x>7;gG|qG?z8/}i s>*Yr Sp1pzop =h|P^o|VE⍟+EyH?2+~z{c9_"$ƛ/<%^N7+rY=ƛSaЇoC^xs-̒O8?7ا{ql?&?K>6DM/YV]G|_>׫^Ӟ={ޖd<9^Os9xc42^``Km*ߺW09xfW3_;g>3߃ ` `0 zLrNSokΩ>ԃ*f^5= 5G= ^x!zLmG-E~^ěGitb̌VNد?=Ox.ˣ:H³g>qp0P?xY_8xe~k辕Ecz<|~"^ 7<2ߜW\39!ꝿkzf%;c8/W?~\gƓ|γ|@{ίzx?kI>fI^y~zҟ|h3Z=r?_}Vy~*gFſO=~*ߟ}>So}biOiO0=m)t/3}x.:m(dzsw"`BLzh_g[3Lf3Xj7`#+d)9ٴw`ٟx:;M$gW^U~Fei/|cuGΙgwʇʗ]S0-\ҟO|ӟP~ӟP=ٸ?z9x?1To1Tg5ytՋғқңnԫ'Ի>R[3#?dd}^~?2ߘ2^!Mg q)*3^8oϷiRڋ9~_?WU;H{a,w>{b`8>^PtΛb?  ٿm3G?~p%&2?XXXvߏwnp[Z`;FS /0xD>g{^6ZDy8<#ރw;x[}>3:mcp?+Mn}~5֛V|zEˡ=D~G"`_o?b= 3_G> |88ups0}p 'CoS? z(8Rp)0Vp1kC9xz18dpM?GCzJ=z_?SOxzsS{烜/[W7|g (om?YWOyB;[vyjOܿe{lp}E0.`Oݬ0噏Ӿz_>eA}d/xn<&w-өy|xf=g<2L'&xz=/7SI/'-lRO6xe훿Kv٤x>o}e ^_f?rqK~_^߬_sqf./ׇr1/OE_rx:Vd[%G'e;.Z=x\ܞ̇Vߡ\R_W5_\<ޜ/~=ޝ/g?|x ?xZm?(CQ?&<ޟ&V/},oL(|maU>| o=Ÿ ڏ*vN{oi/0Y}\\\\x9&_ϗb+\Lwxfoϗ3^bCaq11\x|n3/g>w˙/b[p99.^?_NgϗSS/cΩs{҃ҋғ/DopS ~].EG[ޓw% ;gf?ηοNڛ י]n7Zp>KϹxJO0.~h??x .֨@o g|`= b>]>^~g?8젂m .djѯooS n Rz+Xџol#ނZމ[׻<ޟ ^bG39ϟO} Wg{r{7<~)]p?Q>{7ӻizF}鴷xvxKJ{/O4 ^ϫcoֽ/^~_O"L{B L{E}s&m0a9{+/M˟o~k;g<qK{> <޵j״wzB H<ϴqO{צ\޵iw|b\Ms+{7w*̧)n`s#nCTOػqNbzL=~N=bz U{`b \ћߢW-w٪oGN=ݣ*Cnio\ޥyI<:_~I<c91o5;r`V|u hwg/$cH}jke~^c{='쳛'챫d?57?*`]U=Ob{ {7O2>O/?pK{,~a'a\O{O}{Liic۬k)o}Mi__L{}洇wN{lG.o}>3N3>#|6o+,^hO;x(sWW>;̇!ؚOE5OG#?؏؏pM{GsL{G=z9x=c_{^OGoKKI= C0~#h[~>ϧW_d`H>[+sboYK&*ڭ?߲ðj%,'e<xv)Spns<9^ V~/`Sp[gú5^7#0UH{".=Zx f< i0.i'#%7`!ςأK>3_G|\^ f>b]b]OSoOWW b!z*=10Z{&~Az2x~zz5=TL=<>z:=^ߩ׃+r>g9ڶ_3cf?Ϸ=iYg6'[~5L~_ηc݇q]tv6*~~_'Ygn_4CwWo׋;?w{'|Y޲Eׯxr}/~bU|ߡ\/,fk}8WL}e\/=o>yp~hL}H+я&x (׋|v^z[xy;wsQ|d/#_꿷[y`>τ|}'cOarYcbVL= Pl8KOW3S3_׋_bl_ӟŌ`Ɠzśzţzūzųz;k%ϋb3wy1%^|| 3߃/^ϋ7b3)׋Sol|Oz\QcѫߢgԻϗUz9'D[~?z,|',~casT13[exO;?(AowՃ_ zwg<^K;_x|a#?x¡</޻07\cZM {o sj8?/e>E9֨[S9Ks= R_Cf^Q4ս>^5ֿQ5Xqz!8я"x{Of^cU#8[o,z_x?_ ~K~^c}QKGp|՛+ L=y#1?rf K^nzc+-?G_sdpIOsoj_^m2z_Gߛүԯ֯ؽ:+?" ֣z_W0L3K3oG`+0s;0!x fux f3` 'f/7`#0 || f>WW>WW>W/zL=zL=ҽ_1 zLӣWK`)0c`5'SY=^x%zLiNsUg{=Szi0v\=7 >o޷Htu|.|'v4\f (o5{*|Y?ou{>-kz~-=Vy { f+xY}Hħk8 _`Q~߼~e  n߆[aV Ӈ}GpxN'>_Or'<W^`Q xXxYxZx[6~r<9^'0 LWg0xf38g3 xxv91 <ASp,۬qiOQ~JV%կxdYy2!++Ȼ^򰗼%O{^vdYs_|,+>gwz{_" o_k=z{=VA|gJ>Iox1g_w7=Kؗ ۧ kodz<>E1/b'xyc' &y`so/v8|> endobj 36 0 obj << /Length 753 /Filter /FlateDecode >> stream xVMOA ϯ·ww *P[&RJS@Ig<*B/l{9XuEm-l'p:SFcN)] +V vlD؀ QID|h sPp֣!|APDK/Uf}C%lTGJX (Xg{sc&+_S}17 Yѥh!hoHƉCK"81f1{NSbJORURCO7IcD -wܥ`) ShhѥhxTF<\FK L3K?ŗ-:5׀E#|GcߒyU/^[мm6]:lOo +hSݞw vgNIKƖmHxA@Ub/i #1y> endobj 38 0 obj << /Length 4239 /Filter /FlateDecode >> stream xZM^ ?.aۙk j+M. ) J$c!H hy3Ox}s}zUU/ztIwN׫g?oy㏯񗏮<B5_{|= #oC x/TMzq=z2w{ͽa{c[^ws;>c^?z:W>焈=|v7?=By{2n'G^~S۸.RV+.M%߮5ۣ[H̗nyc}<և~nqB+ɂ^ 9~gW݋^}w{Ͽ}t/?iݑ+ib΋sG>ǝտTcwWFJ0^.)Իcs:L ?zF"bf`v6L$^ N;8}FZA6(Nۇd0#vw_G+ R̖RÎq$_Ow_拯ջB+Gl͑xqժ}ЅmeΏ$f01z]x}#F؟Xld FQ5^6S[kV 0+#됭&s_ ?o*`Bt# *`y/v^oJ)3{Ή ,wt̙tFL9;2QRy>2P,>Mp`sZ#l`XKp3RQyTL{ :v4 plgOՄc;# q= I$8N8F(q gv# ma2$lzFR:Z~&<6(Sl |~7k6hm׫o?\cد硐>ϋ<lnOAa_+xA3oPHiA.JGl46MYA'`'QV켓r<%mU$X+8g] d m~(o~,Y;ytVx]مgݦ?ce&Ϫom[X g>$-}+:r(R44R<5Xe]C1!̏9j+R]ME%8]zROE|<#E Kq"Hv*u)ZY7mE ߶bАKPÌem8P,-%a B"֋Ǘ\Ma!OddMGot>?W66.LS%rsF5Mȇ?zx*&)L<>_S 0d%!#|p<q= %/ɫebF$vǓWڀr# ܬu$DOb"!+|T ǓX0 "tA͡4 @%L~\GQ:ףtmZ/:ju~XK<,{ Zkj2^mo MR$bxvog /'=_xˁGΦNv.6=v>P#_``;xc=[[/&|wnM L>,6h|&(\wt,go'_&L>e`ɷi]|L|~M>h^|OBeCY/hwDXzCh+g1qȮsR;Xm11mʌz_g==L=@;x~>o ˆ^Coпm=  MNc[OSgԭ|MkynzH< [/ԓH<97УHDWl"m6tz905C/?ˡɯm|DMHlCσϩއͦqGϫ_@Sݎ9m6:ynw nKVB;Dn--t=Ҧ9z4®>C Ҵ'Nc|ӧmplڜ[Q1 q==tڜisF6C7l}]l=8|:Oz;T73(wv;YA;.^mn&ctjkp;}3a]jFw:NUtûMی#mbHNo`VV͌\ nGo&a]8 gl?ƐD {FM(j_XlUMWuyIc+HT;f(#]߇V]lt_/پՉ4d:fϧS2)X; QNb%|cO|(/m4)_[')ne|QJLg||Q]dچig$L5JڴqpJ6rW R 6TLxQXBА}&N0b5h CUf(op>eES}sTE3"TgO/OP+a]OǍW`3@Y}6B]UʵA|.?iCnx&^ghwT&^F|dיW>+u{@s|1@P|#R6_~w*V{zejr{𭂿yY״Y'+U`|O;v9ꅭ]O oQ}+Qϸ=q笇{$tA ЋcғFDuMң:~2*SoKv Ʃn=>_,=^ =?~/XbDvu[l8q^-,e2vK?&oi+wHTQJ?}_ۯ䧏Nendstream endobj 39 0 obj << /Type /Page /Parent 3 0 R /Contents 40 0 R /Resources 4 0 R >> endobj 40 0 obj << /Length 4240 /Filter /FlateDecode >> stream xZK^ .aۙP[&R) JBI=Ǟ!H8s3Ox}}}zUU/ztIwNכ?׼ǷGO!\O>;>G>_?"/7Pn׫BUTדǻ-Xz)Z汮.<{5u7hSX<{{nq~ÿ޾ǿo~ {o+&F> ;z@ǟBy{/˝eߞ? v{oO >n_vrb_viJ,*Pm=J5|<6wևYʝ|=0[>NS [h%Ypo/w? !Z?R>xg߼͇_O?yx_ֆN{Pic#\piY[H5zzj]L[:6PLa _MKwHp\D Lچċ!ɖcgGoH 1}޵Ea3`6Pyڙבjp?T#mӝ?k;y.[s$^\A=zt_/,3tzv[ymGxy3.#O]_pF؉n~N\6X՚G/RfTόѕNؑuV9Z/[7fmFDt wFrn /j%b=ċcU:sɋ n&M/%ݶɈٹ )?G_wNō1"=Vw;1*ɃBV$Ycd(kqf!kg9pcl!o#[E J5NQs6ՀI1zWMjPHEA?`t W' ߰N O|7?^r#6`~ RO<]ҁbxݤxyv>f>|1_W>5XVL|%!;_WЕ(wuX5bE&ǃo[(훏@Tvp8VR;k-,ś"o[1h%aƲ6 Zb(fTϖKg0xjpzPUGצb'k2qg&G?+xh\V. _D&:; ۻ7YL-{[•I"}l."EA&ATfGT١4lت Q<h(Hxq:$iI mHH;=H2jjE$md5_"jep!)MZ"a O)IcI; p~bl.JI\$R~&$nnEo2Ql`|D"=N8i#(V. ](Hq$DBKvqQ袉h-j@' mMq)fu⢂6c9%efwmeI`S$͎')<T/O8E$xV-?x?aՆ Q RԒʰ㉎yc"$!&)9x&CLD|pM<ȇ&_j߯|x꒐iA>8Ȃ@/%/ɫebF$vǓWڀr# ܬu$DOb"!+|T ǓX0 "tA͡4 @%L~\GQ:ףtmZ/:ju~XK<,{ Zkj2^mo MR$bxvog /'=_xˁGΦNv.6=v>P#_``;xc=[[/&|wnM L>,6h|&(\wt,go'_&L>e`ɷi]|L|~M>h^|OBeCY/hwDXzCh+g1qȮsR;Xm11mʌz_g==L=@;x~>o ˆ^Coпm=  MNc[OSgԭ|MkynzH< [/ԓH<97УHDWl"m6tz905C/?ˡɯm|DMHlCσϩއͦqGϫ_@Sݎ9m6:ynw nSVB;Dn--t=Ҧ9z4®>C Ҵ'Nc|ӧmplڜ[Q1 q==tڜisF6C7l}]l=8|:Oz;T73(wv;YA;.^mn&ctjkp;}3a]jFw:NUtûMی#mbHNo`VV͌\ nGo&a]8 gl?ƐD {FM(j_XlUMWuyIc+HT;f(#]߇V]lt_/پՉ4d:fϧS2)X; QNb%|cO|(/m4)_[')ne|QJLg||Q]dچig$L5JڴqpJ6rW R 6TLxQXBА}&N0b5h CUf(op>eES}sTE3"TgO/OP+a]OǍW`3@Y}6B]UʵA|.?iCnx&^ghwT&^F|dיW>+u{@s|1@P|7*GqlR)~3T/>KUS[|"ۓiO>Wv>r [Oe>QWqz;Yy~[gQOޮnG=fbnp*O[Y8-e.6MnW?2~#FRG(E~_};O*Pendstream endobj 41 0 obj << /Type /Page /Parent 3 0 R /Contents 42 0 R /Resources 4 0 R >> endobj 42 0 obj << /Length 4243 /Filter /FlateDecode >> stream xZ]߯8KXdf%PR81MTu c$^ s3=sn>+;UV4]%59]o_^/]?y;p>ך=> ׿}C%^ UqS^^O~41};)~^oM{w k|c=pc=}=}Nرbٿh0^^O~=g "oww'n/!m.RV+.M%]%jGi'ݐyg|R =?xz?LXILjbٿ}7oxhm?J/}7~~==Ljl_<[:CtBU;r%S#Kmlӊ?{HտETcwW&J^v ƔEw nꘜSAᦓ>棑䆸 Ln!/p'yc, wz s 0g%vwG+" R QGb,ӝ0?n[Dw],Rߕco-xqFժ}0ٱ2b$f0q'pDZG2/V#pb_>zMl`ZQP3lj 3`J:d"N ylZa"Q!:lCV$_dCŜsEnc9syqs:z{X"mxoI|QF|E$Nɷ4_/9Bxp/nda/X,zPI)`EU2{;Z\YȀƍvpɵ3ϜA1h~طdP!`t+*w3T O]$x @HDGFr=$[ˌ` E(qPʘ&a(~-OX"TTޟ" 9!ਗ਼lW!pDCJe20e" 3qFeHVƉ$C׺Z~&<~)6i>5'$9-z5b2}s>YYss(ȎpKGUxBB= x<_ (m>@;ŗ\'A\GK:Z,ϐ[`uSQSo|GH6bk |\b.=JF,^x t }YzU+sYx--~L5bɉCKc[ߔZNt*1v ul;u(3P d"Z5%e(b~(ozT?Ώ`GbǬ\O:J+ xxqn3xSgշm~hqpHQ=_M3O VY#"?pLxrTW#cFbx\D#d>8Q8rwlv R;k-Y7mG A߶cѐPƲ6 Zf,dUϖgjPMhjz n>a4vSjA3! t`\Χd K04!b|`'m򩘉G>0|m$U|HD6'lZ򢑼Z&>0';&ʉ$hց/(IJ]LBBW'".a%B(R'D0 n"r|Op?bա >X܄p|R OOMq>Q"ҧʉ O}D`|~z':_>R ^>^t^7u?H t/?@AXKX&l5~<\~H< /H<9LoG˯"D.?m]NHL,oy0בتO/̦qՏWluӗ@SVB;dm--zڋ%fyht~bg29Jgߞ81;̧OltЏyFPo1 FQcu|gd3=yyb+}?/vJ^lUMڈWu{f|ILWwP~þs>@'蒼g;Lr[H,]9) -Kh'1m׋;qO~(£_h)_['i2D? Vo&\=q.2mę#C/xw%mb,R'PxJa_ǿz"/JzQ(c?4LX/ðվ(?Oczѹp)fzzLzq׋fS%z1`=pe"뉑yx> vƿÅ(kףюPzv-xC/V'qo:buq׽+{_I,,>iDX|#mQ̟Wa0>|d+_ho&+4Ǩ(u&•Jwsy|1@Pz7*GJzRg*fGީX_z顗Ɨ[~s}S"SY+]`zOz@\zaizqԨGgq笇\?[gdQOޮnG=~Uts/ۡY5ٯ0~~|b6-maBۏ{,B70_蟦QX嗘O~($OӏQHlFʇޱ~B?A~Q},_~҄n~|ߠLJ<{}s?]~~q᧫oˏWz}Ϗ-o8j~ G?Q]y#NīTeEL@Rngc=s~(,7o$aRO}</>wU,endstream endobj 43 0 obj << /Type /Page /Parent 3 0 R /Contents 44 0 R /Resources 4 0 R >> endobj 44 0 obj << /Length 4366 /Filter /FlateDecode >> stream xZMG?b!鞯k ElCC >UeMCݙ驮x}~/_A*Q.z=/z|ųGC_˯pw >|-z5&TMzy=x2w{=^0qw=1iE1ws c=}Opblb⿟/,#|n#6S~{;˸gOq.RV_.M%gWIoo{(0$jf)w0[\%;)-,7/ÛH_)_xo~x돿~~/~7kA'ӽz(~áTջ#,Wоe΋sQKb-Rީ^)l7f !1wWtX9)[i[TD_9A8xz{b$t>ZDtD$C(`b Fi#dadZ`bAawAgm;#x&ldIeO"Axp6B6m8# 36 %.3 !aY F 'NkXgԣxLqPxp-W~2&c끝X>8lnOAa_<;u6Kt\GK:ZϠώ،/ 늧+ފ$Ďt38$x]|bX|Q=#.>R#V2jZt[0lhdɅKcߤZ.t217vul;y(Q; І\I3rm@6.;AіߏF[QH1s'+";1_\g;`v^qkg>$ZVo{ /y^ O z^Mx&:7]m{ x`Gvo,&h|&H\wt,g/'_&L>pɷh]|L|̓e|.р6$3_06g>"xWτmmixuoi[cc֔_g>=zvL[/p|5ޠcz+cZc~1XPދT#cVt!f5i_ac$ PA|y}ȁlyOP%yzLt]HNAGNp%bm$|QWv>r O;e>Q#}+[ߑϸ~=v̇?ۭ3__ȧDo׏|K#> endobj 46 0 obj << /Length 4262 /Filter /FlateDecode >> stream xZKbUڂH(Dl) Ă&؈S/V a[gO:U37wϮW[ҨwMxt~vzŋ?>yw:>/kqx}<"/b(P7gn<Ƴޡq7x {]<ƵEx=w k|xOwo{=>6<Ǐt7o^=>C‰=銉?_4YXqӗz<~^wGl~],_>{+fO >n_>H[믘]K~/]%j٣[̗n0K'zs{\c'1VW߾mb?+g<߾0ث믟zZt/_i+hd΋sQ]jbV!yToRM9c@cE-TTV`xad,0|0Bc0S0r2T7Sx&|4 3C;r`ñ3#طxl>^Zay`{x0%vwG+ R6H5;Ɩ|< x5_&x3Wb gkĵԳW>pJ4Cg/?'7W}<}g c D7x4٘G/RfT˄0'DW:aG!Mhl~T#F-dQ^&)jwSxqr1 @ǜO7yqᩛ5vGuE bX"m$gf(##[&c = 4D{vbT !XdՏ k&3!g" p!r3Gn-2-~pbAi"lyP0|\@xzD#bpaw p>@h1G2@E2ҧ n`^˓1z- k npF@(*σzU9!࡚mg!'qac?D e|>ጀδ`6`0lde5o\HJ268ӯgc`S1A wӿf %0Fl^ xyȘ皏Q|vcjRkB/ _п*?AM?9/x'l>7?^r#6`~ RO<]ҁbxݤx~v̇ "3Wk[/GkgԕpseuXD@3Yi#uOg^{}Y\ 'R"ßu {~EKW\)d}KJǮPMjaFf#p.ڄNRk"GkUjv4?&3QQMÆ#b{B  SQBfTЖJ8Ș:@KQn!Mٔc8EK#%U,4xTx6a$.)mRKihr[I֛Lj0&[/8&6Q1uvmjSQ5KKG S15KI[*8R}wjah%TT[ot) [ʖ:݃I8K=qAOтhI5I2ā'ؔNpR0kz^/ZƯ~A<67Ն?)fŚ$ٍ?y%xޙ]xZx7ؽxdk7)haE<667#޺;`+^91gƳ ѐfs,}'f`wxkg01|Dǰ4|EgE>|Gǒ&JR}%mS |+JǴm9?usڪ;s<hǴM=AY+l 7Gx>m~\zMNc[OhSgԭ|k|'znxA/L^ă˩'xroʡGK"YZ.=۬.rajl^&CO_ۡx< 6KݥتSO/7WRms,uӻjn%n<",MamcE'b H0a'>桰Mi ]bIig?8m:ezvPfDJlf??D<43B5&n[8mfEeAZV/P_n'KJm'"q֫KD{R-؏ ng#X"VHݩ՝ѷItBd IICjXԞhV!l#ɰˢd4T$[ch޴Ḥ_#yn~dk2IzRb"I?%nQlՊ`&5:41kdq_M/ކt\MO|,Һb">WslQGRT{\IHu҆4 H_A)BCQQ ٲv򤟭NQI<{=]/⃢^G?T&kے7L,dy >an@2ۍI։wX2ED@|Q-;JW\>qVD2lô39/ J66NZ\yJ!j>i/Jm|QHi<4LY /ޯ(_Oc|ѹqef'||ь|qfT%z2`=@XF`qU|}Z7ޏFk*E\ XR˟nKznE"~zDd5W>E{$tA EЋғFDuMң:Wzxѥwp7}r&롧[oKW{z-o_@5} 죞(V"l| z9gUY,>p ^)#.Ŀ `-E~Oe|e?R"?~_k~i㿆Eendstream endobj 47 0 obj << /Type /Page /Parent 3 0 R /Contents 48 0 R /Resources 4 0 R >> endobj 48 0 obj << /Length 4266 /Filter /FlateDecode >> stream xZK^ .aۙP[&RMS JBI=ǞWBPy-q>fc/^\r^ϯ_xo<B?|Wk}~럏x}~D^poㅪ\/'?Xw[汞}S׵>c]]tyzknu|ևyts8GOy<{"_OWLw?|v׏?<#(|{;˸= ޞ|?"nnҔXU~{vkxm5;z_a[>NS [h%Ypo͛/w? !Z?R>xWϾy?~&5{7˯^}lmd_iݑ+i2O~sYO_C1;իU#%/v ƔFw fձ9&vNf Nj_zF"bf`v6L$^ N;8}FZA6(!ۇd0K TW-wiH1<o_}=ܙϫw1O~Wޏؚ# ׫U8za ׳h/8?“̛`U_Owabc5NtGwⲑ-"E;_5C!}y/_ß PæV<;g+AR`)ֈ+oo>QEwɆ,|pilbTˍN&Ny'y:JtWHбVpF Ce(wQhQ?*Yi3v<(x*F1D#P[HTRo6ۊ@m !_˖`7lkqYR=[R/!͇KW♫EPõhx1.Fyl]+W.l^ /3c;mxdZOܙ59{~܀u~;?4v/+Wh/|r^lzJ=2>%lcW&"vŚ8JmBQҚFUMOIbTTӰ""2DQl@a#ŅTPY*&U&l%RN!TkiPscԨ~1zHSeiJA?! 0f?`V cvJґ !t{ @()~I d&J1M͂tPD.~tSBw&jJv^rKEFRQ۰lJ=YhO1qP-T3+~pR8 nvSZ"쎧h50iyVm @ Oh/.i `8<>&M!qaB>8,È7jlB>4@!OS1i|Ha "Iȇ'9 &,xOZR&V>lOBwk~~DKP ^k MOJt Q#^In "tdv6 o{9ȉՉnRteƻ'x lloGuk v>vV䟙ςBC΍|@'⣝7txm& `K|([ɗ?ODkeӦ&_3_%ӆPYd ]v=֯Gv=pxv-!wV=-mzLF5^Yiz3>SЎiϛzQol[0>mA?.=xS>CS:Fqu-;z{kz[`c_=֋xp9$OтM9(zzU$"[˥gFN=Drik;v'?f:[sa\@jclN~l|}۫X061&/b"HMpai3(SaWؼC@RiكMMN>6 H$٦yB D o!c Ny}6i3iĦ{߃Z8$n7Ix9Bg%䶓@LHf=FOrz,>Vf$NN>ۤZc!Jц$y֡um5Q ,|IHjv4P!셣p˦d T$`h޴Ic^#ynydIJHzQr&Ec>%n6Q՚` 6:41kYdVҦQOjCMMӦ'}lҺDTcB/>S٢3uʋϑX Ui4濂DS2QQx}lP;y6x("HAQcN|>QbcEf/J6Q@&~nXd:&6QH()_TR 8_Tk"aڙ9/8 6mR "!m.CT// |"^(4dF<4LY /վ(?Oc|ypf'||ь|qfT%z1`=DXFbqU4@Y}6n]UA|.?i/I؄x&^ghwT&^\|dיW>+|@s1@P|7*G!lR)~3 )|ŧ &'Hl'_f=|Ti=|v=ˮ7| F=]lG=w<zI* ]?-ݎzxə*9&i{M  ^ M=axK[o#ӐWw` ;x)㏺i1I_s;6Shҡ57yC/jKOխ7ՇKԫdOݿ.Kwӗ[/wzZxo[ww`}ŚׄH9Ź^N{ՙk¬7a 0_ o&)?5+K}W? 1)[Oן_Z~ϻendstream endobj 49 0 obj << /Type /Page /Parent 3 0 R /Contents 50 0 R /Resources 4 0 R >> endobj 50 0 obj << /Length 4244 /Filter /FlateDecode >> stream xZK_ >]¢3ck j+M. HS {=/Bx-Jnj}||'W}|z}{~ܪFk;k^'pO>;>G>~D^poWㅪ\/'?Zw[汞}S׵>c]]tyzknu|ևyts8GO}>{"OWL_4YqWz_?8~],_`_6no)w+v{oĒ߮5ۣ[HWnyg}<և~nqB+ɂo~ 9~g|7o_<7o>z{|W/^x6t2ݫ88tzwJ'?9Vp_B1;իU#%/v ƔFw fձ9&vNf Nj=W# r130Uzk&/p'[yc#- wz UC2CqhgC#)fqaG8;a [D_w]Sߕ#HvzjN^XfB2Gxy3.#O]_pF؉n~N\6X՚G/RfTόѕNؑuV9Z/[7fmFDt wFrn /j%b=ċcU:sɋ n&M/%ݶɈٹ )?G_wNō1"=Vw;1*ɃBV$Ycd(kqf!kg9pcl!o#[E J5N?hm׫o?\cد硐>ϋ<lnOAa_+xA3oPHiA.JGl46MYA'`'QV켓r<%mU$X+8g] d m~(o~,Y;ytVx]مgݦ?ce&Ϫom[X g>$-}+:r(R44R<5Xe]C1!̏9j+R]ME%8]zROE|<#E Kq"Hv*u)ZY7mE ߶bАKPÌem8P,-%a B"Ǘ\Ma!OddMG^pu+xh\Vp)?%;;,?}M{/S ^Vp%%mk_7[ Hf+lPl(Ud$Dv(F:5 ."*i, ^\N: EEabF[24N`LZ w/DlZ`HJ`HBJRX&N\eR_ IkhFLTh&/$E5QtHvObEH$qEꤤ- RE; QP;]\7hb7چ-e.PDBDSxEXhIDD[}ā'Ipj/k~~DKP ^k MOt Q#^>n "t v6 o{9ԉnsƻ'x lloGukv>vV䟙ςBC΍ɝ|@C1'C7t&xm6|0%L>MKɧ ?V5i_X֯ ؋iCz@`pH2.Qohs}#zEL8&nv^wz =F=mCQ~UwhǴM=Ak 7G޶^aaשw q!)C7_zO=ֽ [z_?O=-[dEZtM1#؎uՏɥ^|gvO3 I./#it z eģꞠKmN:۷:,]njT}J&kǒ7IldyOE8zPvc9k;?mL9"Q~/A㛉,׃O/L0ߑ]I6NZ\xJ!_Ն>i/J|QHi#\aȿjLe ΧLqhF >8 TE3j0ve"i#1}lƿÃ(kvϣFJ?h/'u;+;޴ہ_I,,S19NCxOT5,>UMnU77?+b=6s Li.G_vm5ꑽze;G8uKTQQovcƃ̬׌W]_Ck_-=`8vm [zÈ@Q{,B7S0_QXߥSOԭH$OSHlFʇ#߱zD=AzQ},_z҈n>XzToP^={}s?]zz8狥ǫ}SzǏ޷T@5}K죟(֮vk 'NjګTeELýRngc=s~(,7o$aRO}</>w&W endstream endobj 51 0 obj << /Type /Page /Parent 3 0 R /Contents 52 0 R /Resources 4 0 R >> endobj 52 0 obj << /Length 4283 /Filter /FlateDecode >> stream xZ^Oqaf%PR!1!؈~fcCX99_>+;UV4]%59]]E^_<Ǐt믾}|{O+&w/,̸oj#].wq/{I˯x{jq򷋔KSrooWIooQڭa$KI7$k;xŸ{sǔZ)g?|wHȁ>z^|/ä&.`篾~քN{PNwGZ}΋rY]jdVYE5SSZ5QdL0|(Bc0wWt@̜ 7?zF"b00Uz"Hyc, wz s 0gC#)Ɓ#1Nk;y.HvzjA>^XfBXy1=ɢfܽ wq'+a~\4l,QjͣF)BFZU6όb(]#됍& "^68!n*`iFDrpFr[m|1sΉcQ:u:ŅnsE" cdM2%};GA8%|k =:`#`CDa'G @%IV}ˠf*(kqe!7%ኀm(RKf!aZ' E_kXW`Q<8An0& Ոx1g=fzh"ϡ ;-U9 !70#_0O`>7`<_re 6[?q'.ko>CnR<^l=;+_ @וOEM=V;!I؈+ghq;D*zE\z7-G*gUṰg.`1^t%'-Ml}Sj9qVЩ\)Ա[q2@*@ kgbrT ]%Q8?:Yvr=(\/*/! 3Ϻxƺ:MU6mS`g~RpoN#FG9 |9l4r<5Xe]1aQ v\-J<q:r9>x:FG 0q"߱QۑHtr g9l·1}ێDC.C ˶P7LkqYV=[R/#- C"֋o4'" }3! fLM;,w&k>~«#[8{~u~;?4v.+WAϾ= ?}Ŧݭ׻;.9d4}XK`e`WSZXafEL*`W&jDR G3Sj540BDUnϨ60Ըqu)J(,S*&ڒIIyPzjm56_h֔2tP Wƴhè (f?`V &Rĭ#Ci@QR&, GMb,SmCJѭBRLRҶ )R]ah}3z9nJGmKV{O1X(|D˪fʼNif=`|VT/č'L|VCHGȇ&_:"y||iA>8%/%khb#*knr@Hbk;ZuI:$yZ|+>Q!TV!:xy\ŭ'HZJw-/}`GF ''|be $/[#u OE>V`q+zP g?ĩxc>6~Bxc^׊Gj#~3w3ϿB]bO즟{!>t?]|~->Ayp/ybu|v["|ȷnn=W3YPh?39QSyT0Bxwaa:ako ˎ†`|c~+?g;Ə8_~O?ֽ5[~DO?mcc_?xp9$OӛrQ$"HD6;~905/S?᧩m|ZVwu$\@/nDZ91[ws=vǫ\06A1&/b"H0I|ڋ%H \;d "&ξiqbmz8PH3H"=&mb'HMw?Rql?"<P]xqx]qf%;_b&38FjW<{(2>6iݎLTc~B/~^Mguʋ#Inӌ/#i O؏zz]߇IV l4^ij}i~E~8O'>U?QbeMfC/J6SDM(FsXd:&($@HC/UGCO\/5L0qoN  J ԉ!$-7AeeEHۺ^  DV0La+φ2X^t.\yv`I^4Bhzb*)U^ 5\zb$z'^uO}XB@5_[XhǭkJv<+^yœ7I&t1:Oe╽/*_B4Z",׶Hd+°L&x]ypw>hC/ 47IϕoGn:U g;߹<ԘzbZzAbl=Qc鍊S^~虊ԥw`֔O=KUSxB ĬSϕ.0m'G= .G_vj#{w3_ztC^2^Bo׏zxs?z*9MҬH?@>~0!GOC_!{g/O^~hKwL?[($M_~QOGIԠ >/?iBTT?X~TU_%ߓ>u>n.?_n՚Gǫ}~߷_@5K죟(&l@)rUg~ ~#X~` Sfo݄Mxw4aXƯ,_Y,hn ?y/_\z?ktendstream endobj 53 0 obj << /Type /Page /Parent 3 0 R /Contents 54 0 R /Resources 4 0 R >> endobj 54 0 obj << /Length 4290 /Filter /FlateDecode >> stream xZM_GsF"T*@llB~ge~vhgv~r^5ݪF\;/z!\?;Zx}?>D^pCS^rfk5?,I@J<7߾o@ z'ѳo?O?zŇMp{5>WϟLA ? :a-8/~ayDu.)]E&Ua@yۯV jZ1 1]=1^ܱ8Q.:F8߭F.XèWowmqlu8elHUAD1}}ݝ 1̐b2A?&qzx^ &D8#𫘅ftt9._|.}OxL3\JdzXnW1&k?x k43w>1RA:΃r*2 Uu'fcS-;8X-ܟp s O܏ %a 18"y /":Wf8Y3%Gdt`V9y}|#&! HwTsy E' ^/dB'\8Q'Kb|Ai|R ZOB 0 9_q?D8 h>n%8f `X/I !-q_p 3K``k:z"xpz˹^`vʱ_ =RKk۞j| _6ϋ 3.֓ρamǝ/%O8P||D\|ϲ%ڝv>ăȟ+_f;ȝOVX㑯P;g3+S`#\ <~l0mlzdl| sleKSOOˮg^aS?iϥax>Eƣz*d_zx^zZce4ii`wmt8 fIuaB^T']Ѕ.Ԅ* /EUjQu*.,m2+Lӧ?! P_Z ظ ff.0#*Rlf+sgƭ #KfJrF&1C302Ee* L*(f Ɯ'qL-{yPm`7pbpg4M7sJ\@yP2 P)38? ącdJQ2)u J&1 a ܟ< I͑ "D~ZD%RJ}`OdkO|>Zg`a:wbfzrxq%h' dagnbd„LN~Ze'ԑ 2SrB&n2&6)[edp? q87Xq|K$͕ OĂM'O~%^ W߇?9N~nO8XG>@ 86?!q{jFt{o퇒\BՔW niܾ v9ϣY -y~wNf/*O:eߚ-l#I*6dlF Y|LoVIx`G1 o,xlf͔gdwN> x /N>B"de/\gX<|O'v+7pc` |Ml֙]az#t8119ƑhKb̧e[Ĵĩ|n;} [Oz8C,CI zQ=St-s*kw^?O,_m=ȖC;"Di|sQ+WH[VޭIYzN'穧ɯqtux]&s~5zw D5=9 /Xr!~I_3o~L͗Ssu"šC͉3+6ZkїưXD܈%Ӧ&Smh bv'$NL۰(RWŤc45w||MWXo#|WgLo+IbeMձ%з<1^ r:a'G9)X)Dܘ<5qϳjݍT-fqͱwcm9X _9vNK9-2Ť.[=)c Ҧama0cRs$v3aflmUs C쉉!fNMnSb9::G1/utNL?j6eitq-%Ccuq<1k.v?;\ZBOz룆 {"\wr<5ΤSǖRV ɘP}a$q|~ԐS&F&|a5O8 C#KcpGUh` >|avKTOE_4#Bh|Ti/04Eul]O\qUz8Zm,h/23iك|c$.ͯFX "S@\8k/c#˟߮/#f;Q6ma?0]ن;ijⅆf<\bV<3^U#b=xA[lt MOY|?HqWgF\|C~ԧ_,>UǃoUǶ1xR{o3g> .Gdo8?{X3W#qz;5̇?{P3_^ȧlnG>yXpkkuݟ^?@-=a&[o#͎W!O=x~zG5C#~^b3O=eQ"P?M=F"aM:+z|t=zPJS/jғFDuM mУʚ7mJ̷Kv[v4wnrnm=m¡ǫpKw|o_k]T^w.(<ߣ=ʴJja|o2 ,E Ք~W@ec/zp?׾~58o'o' ہ"O!?~?߾p} Ͼ9sendstream endobj 55 0 obj << /Type /Page /Parent 3 0 R /Contents 56 0 R /Resources 4 0 R >> endobj 56 0 obj << /Length 753 /Filter /FlateDecode >> stream xVMOA ϯ·ww *P[&RJS@Ig<*B/l{9XuEm-l'p:SFcN)] +V vlD؀ QID|h sPp֣!|APDK/Uf}C%lTGJX (Xg{sc&+_S}17 Yѥh!hoHƉCK"81f1{NSbJORURCO7IcD -wܥ`) ShhѥhxTF<\FK L3K?ŗ-:5׀E#|GcߒyU/^[мm6]:lOo +hSݞw vgNIKƖmHxA@Ub/i #1y> endobj 58 0 obj << /Length 4240 /Filter /FlateDecode >> stream xZK^ .aۙP[&R) JBI=Ǟ!H8s3Ox}}}zUU/ztIwNכ?׼ǷGO!\O>;>G>_?"/7Pn׫BUTדǻ-Xz)Z汮.<{5u7hSX<{{nq~ÿ޾ǿo~ {o+&F> ;z@ǟBy{/˝eߞ? v{oO >n_vrb_viJ,*Pm=J5|<6wևYʝ|=0[>NS [h%Ypo/w? !Z?R>xg߼͇_O?yx_ֆN{Pic#\piY[H5zzj]L[:6PLa _MKwHp\D Lچċ!ɖcgGoH 1}޵Ea3`6Pyڙבjp?T#mӝ?k;y.[s$^\A=zt_/,3tzv[ymGxy3.#O]_pF؉n~N\6X՚G/RfTόѕNؑuV9Z/[7fmFDt wFrn /j%b=ċcU:sɋ n&M/%ݶɈٹ )?G_wNō1"=Vw;1*ɃBV$Ycd(kqf!kg9pcl!o#[E J5NQs6ՀI1zWMjPHEA?`t W' ߰N O|7?^r#6`~ RO<]ҁbxݤxyv>f>|1_W>5XVL|%!;_WЕ(wuX5bE&ǃo[(훏@Tvp8VR;k-,ś"o[1h%aƲ6 Zb(fTϖKg0xjpzPUGצb'k2qg&G?+xh\V. _D&:; ۻ7YL-{[•I"}l."EA&ATfGT١4lت Q<h(Hxq:$iI mHH;=H2jjE$md5_"jep!)MZ"a O)IcI; p~bl.JI\$R~&$nnEo2Ql`|D"=N8i#(V. ](Hq$DBKvqQ袉h-j@' mMq)fu⢂6c9%efwmeI`S$͎')<T/O8E$xV-?x?aՆ Q RԒʰ㉎yc"$!&)9x&CLD|pM<ȇ&_j߯|x꒐iA>8Ȃ@/%/ɫebF$vǓWڀr# ܬu$DOb"!+|T ǓX0 "tA͡4 @%L~\GQ:ףtmZ/:ju~XK<,{ Zkj2^mo MR$bxvog /'=_xˁGΦNv.6=v>P#_``;xc=[[/&|wnM L>,6h|&(\wt,go'_&L>e`ɷi]|L|~M>h^|OBeCY/hwDXzCh+g1qȮsR;Xm11mʌz_g==L=@;x~>o ˆ^Coпm=  MNc[OSgԭ|MkynzH< [/ԓH<97УHDWl"m6tz905C/?ˡɯm|DMHlCσϩއͦqGϫ_@Sݎ9m6:ynw nSVB;Dn--t=Ҧ9z4®>C Ҵ'Nc|ӧmplڜ[Q1 q==tڜisF6C7l}]l=8|:Oz;T73(wv;YA;.^mn&ctjkp;}3a]jFw:NUtûMی#mbHNo`VV͌\ nGo&a]8 gl?ƐD {FM(j_XlUMWuyIc+HT;f(#]߇V]lt_/پՉ4d:fϧS2)X; QNb%|cO|(/m4)_[')ne|QJLg||Q]dچig$L5JڴqpJ6rW R 6TLxQXBА}&N0b5h CUf(op>eES}sTE3"TgO/OP+a]OǍW`3@Y}6B]UʵA|.?iCnx&^ghwT&^F|dיW>+u{@s|1@P|7*GqlR)~3T/>KUS[|"ۓiO>Wv>r [Oe>QWqz;Yy~[gQOޮnG=fbnp*O[Y8-e.6MnW?2~#FRG(E~_};O*Pendstream endobj 59 0 obj << /Type /Page /Parent 3 0 R /Contents 60 0 R /Resources 4 0 R >> endobj 60 0 obj << /Length 777 /Filter /FlateDecode >> stream xVMo0 WCrږ-6K,R$(Y vi/I>$ g`9<@kyhQw|gu`pd6@}|SNK0S8Sĭ,;W: a6-x Lpdww.cY V=@4=y_endstream endobj 61 0 obj << /Type /Page /Parent 3 0 R /Contents 62 0 R /Resources 4 0 R >> endobj 62 0 obj << /Length 4271 /Filter /FlateDecode >> stream xZK^G .X^fƞ׶*@*ĢbACTIK}αՐHMˢiW{|q}w~ܪFk;͋/7go>B?Oך<?9yLJ!rK^rz2w{ͽa{c[^ws;>c^?{6{7_.!bat??ٿh䳰^g'zOg_?~8>.wqǿ=3ޞ|vrbןviJ,vDFbtD;,Nc}{G\-')-,/w? !Z\)_O^y}_gIM</7/ L ?:MU;r%yӟƜGV+ӲjLNjH & %c1廀z|ulN 櫑*ݵ C-<`b뱑b;zk f!m83C#)fqaG8;a [D_w]Sߕ#HvzjN^XfB2 Ώ$f01z]x}#F؟Xld FQ5^6S[kV 0+#됭&s_ ?o*`Bt# *`y/v^oJ)3{Ή ,wt̙tFL9;2QRy>2P,>Mp`sZ#l`XKp3RQyTL{ :v4 plgOՄc;# q= I$8N8F(q gv# ma2$lzFR:Z~&<6(Sl |~7k6?hm׫o?\cد硐>ϋ<lnOAa_+xA3oPHiA.JGl46MYA'`'QV켓r<%mU$X+8g] d m~(o~,Y;ytVx]مgݦ?ce&Ϫom[X g>$-}+:r(R44R<5Xe]C1!̏9j+R]ME%8]zROE|<#E Kq"Hv*u)ZY7mE ߶bАKPÌem8P,-%a B"֫W\Ma!OddMghם=lxNj㡅{sYa»/|r^7ldJ20;5l WR&uЊm"ņRMORIdbSӰ"b2Fl ŅꤓPY&)&l%#M# Tki pMH~&zP_ 6iъ&':A>|:l\dK0j1 <6TL#Rx}|6aɪKB>Gx" zhh$PO^]kʍ$pa_`rǓXD"OuؿL~b)zDSi' [\=^~dcjpj<b-Ohuzx-67I7S;$zċG<ٍ?wAcOͦp&ѱɇ)|I3'Ju1mk55\{=mU Ifea: mzDYhף m;"qK`S[ҶǨǴm(35O~?3혶^'/z Aƶ+37:#n=D^z6T=~Mu;٤৯݁*ʇڭv6Mn"B^/oK f2:J8m:wvOcA?isFP6oyfF(myksLAް}lEv<P\_ΠdYR.zhrK63br*3 꿙xu('ѲC6]6mol'ن,^}E\2ݮGy%0y9 G[_v弹mkf4MNmSf%7ԓGnSUӴ>f|۱n~1؟PދϠT}cUr!V5i_ac$ QAxC3^v}r [tI^޳ )\gV'|E|P똑?qh&?UC îLu=m$z7^uO~xey4uW)m<^]ta9AxuSxeǛv;+q' okxT$2g╎AaXxvw]9;4c |d:s&"^gj2"\q;{ Ce_ߨ')ǕJTL.S?Ӄ/U /OUۃoM>ϊnOz<\{Q/l=zb]o|Gzd^zQx>;g=9njG=Uz~[`;35UtsƗЬWEK>@<]z0"ЭGK 3ꧩw?V/=4w%;Su- c$&[wl#ѤCjPo^`˗4"[o/Wio^\zOp/^6N=tvpbjԶ^񣠥7G?PM~'?odÉ(j p[\[X7yO_a?Kk\|)\_=/_}o.?֘H?~/W^|endstream endobj 63 0 obj << /Type /Page /Parent 3 0 R /Contents 64 0 R /Resources 4 0 R >> endobj 64 0 obj << /Length 762 /Filter /FlateDecode >> stream xVMO@ﯘ#^_Aj+Dq@K13%~y pAF;q'l)͔i_uu ~)r+MN;AmzX n ^'b8,)%SukjV.0{a> endobj 66 0 obj << /Length 4250 /Filter /FlateDecode >> stream xZK^ .aڂJD Ҕ%<D~ϱ BW{|r}w~ܪFk;_׼'p'Zǧ]#^㿯\b(x*n*ݖygCnuX~nޚ{]4)a=ݽu78\?go7Ͼ~|𗄈=E#z=}uw~zO!=org'n/mo)w+v{ oĒoWIooQڭa$+IId}zs{$1Vw߼mrO+߼xo^_0ػ/_|táTջ#-WȜ?uyd ?-TTV`"0]26S !1wWt9) :ૉn n]0x1;r-i!׻Vؠ:ll*C;/1:R_nbGjv#zz5_|Mpg><]y?bkċk7g_V}e.T_n+/O2oW}=݅;:bI ;/߉F0`Z^`3ljQ! ;j2G+eB -ԈH7nΨ [vb7MV[_́2Sxqr @ǜyN7yqas"sⅱD6ޒ>3;W8%k =:ñ@CDn'F@@%yP$2{Cb-,D@zc!ʹ ƈzF#cH;|8 pH`#cQ 2^P7 F0wQ=–78# HD\owKΐ vFTM83ד8ʰqDJc2l>pF@jgm0RKf6*C¶7n$%O|ӯgc`S1A wӿf 3J`}P1>fYI} s0Az6/x6 )m<;υ\鈍'حxdt൘7A7)x/v+_@@וOE=V;AIt38$|]|bX|Q".>J#ϳV2jZt[0lh/:Ȓ&vI8+db$؊w8QDw kg<,1Ql]v-q/>卶Տő61k'ϓ"0_gY-mWܚ̇`o@S Q=_XKr(&U1GmU+آC+^/Pb({)N;)NŚ.E `1>Kf#4Vu jl vö %ճ%|d>L@|5@(Z5\zb6psՑ)b dɚLܙ Ogʆz=Zח&)?%;;,?}M{/S ^Vp%%mk_7[ Hf+lPl(Ud$Dv(F:5 ."*i, ^\N: EEabF[24N`LZ w/DlZ`HJ`HBJRX&N\eR_ IkhFLTh&/$E5QtHvObEH$qEꤤ- RE; QP;]\7hb7چ-e.PDBDSxEXhIDD[}ā'Ipj/SЎiϛzol[0>mA?.=xS>CS:nu-;z{~z[`c=-֋xp9$O!M9(zzU$"ȥg ݶFN=Drik;v'?fS:[sai\@Tc@NM~b~۫RΦ05v/"vK8]O~ Pl!>4Ӧza'i<c88:6g5xh3ʟ;V%/g>bU6U]_8FҘ NʈG=;e!=A=0uou"'Y廎9L9֎%oضE&_p6 pr։w}GrD_TR7Y8_Tkaڙ#/8S 6mR "!m.CT// |"^*(4dF<4LX /Ðվ(?Oc|ypf||ь|qfS%z1`=DXFbqU4،P~`qGPyr-m_,OE3/]wP- 0T6er\)T_?L;==RT5=V> endobj 68 0 obj << /Length 4254 /Filter /FlateDecode >> stream xZ]߯8KX03ڂH(Dl) 1wǂ>{yヿ$?]1?_4YqW{z_=Xv;],w{$7=5ĸ"nnҔ\*Tm=J5|>dO,N>c|=sǔZ)Hȁ>}~7/ygӏä&.`|gkBҽz(NwGZ?uydu mZgɳjLNjD  1]-_1s*T7(tG|4ۍ9Ddñ3#Էxl>^Z!Qu`n!Q!6P̿H~EAaAxfCYl4YQ qS!M 5"2[3*Ė]罘Mt(j䋙wsN xm1g!/.usnwT\/1w/^K$m-39 ˆ)?G_Nō1"=V;9*7H[u5S|GX+ 8޸.v37?81UԠ4u<xbZ@xzF#cЁ;~ Hd#cQ2QPӄ0 Epѯ=TZB\Pb߃@Ձ;Ґ3dt²]8d(0Z_τǺ"ӏ1! w$0G_F,7Zvt:ltñ?lϗF ,SUO96U@mU;آñ+^/Qcp ')Nǚ.G bq&|hзA42Ԁl uô 1eճ%2bl> (0\-o||1Q8\umm (v2dM&L}vec=^- ዔ?%;; ?}M{( ^+C" )bn:oE4Q Jj8D"rr3xŵƂNBfQ0іL4Mԃ"S&V+n󥚨tBM0<~W6ԤE+F-(@{, x2OܛR76_ EkՍFTh&/$E5tHvObl I+G7ً.II8zw[awh륺)Totn ,eDBl)>NTc\)Z-Sfi+~:I|IBOtS4}y)'^$O8M$Z&-x~Ҫx v񥩥zLHB>&)9F5Mȇ?x|*f)L>!>>_s 0d%!#|p>Qq= h$I'ɽr" ڬu` J|kR'1ix>IKD tA4 D%L}ē9܏XuG/|~DOf%77#iSSrD9OԷrmS68^dO,xToׁ>e;DWM+A݇ˏ0&Ɵ<}4=_-C7_Bx_+moƫx$# u=G<~K: vo|ns 'x 07#ߺ5;u[+_bgA|DN= 1ߡ'8Ko#M+b6Sz0L=MKbSn ?V5KX֯KaTV= 1xH2q]O7D^ף ۮw"xwꩍ]occb;茶zN=~8~>o `|c~+?g;ƏC7_~O?ֽ [~_?O?mcc?-xp9$OCӛrQ$"HD66;t~905/S?᧩m|D̦vu$i\@/n91t<;ǫRΦ05Av/"vKxb~=] @ٷ'N'?=vlbEKvf$"]fp꿙xQNxFcHÞe{;!>$*ˡl_Q-,lQ^IL^?ΜyvG[_v9kfigf,V;3%fPOj?ZtL{UM3~}}lǺՏ٥^ Oe/pO3?bU6U_F8$*v3/; $/i\gV'$}qFNp}~J&k˒7ILdy mD4rw}cƣL;!Q~C/A㛉,CO\/L0qH ]I ԉ!$-;eؗeECEź^ g .V0_o&O2X^t.\yJ`7G^4Bhzb*T^ 5\zb$z'^uOp! ʚ-,h#Ե^]K;Ћ/u{I\tǛa9|Eu2ovAW/c!O-߈k|T$2gAaX|&f;<;4|7M1j#7|Ʉpҷǝh_L=P- 1Te鍊R^~虊ѥw*V{z襪ejr> endobj 70 0 obj << /Length 4275 /Filter /FlateDecode >> stream xZK_ >]¢3ck j+M. HSH=ǞH(;s3/^\r^ϯ^/]?y;p}5_}|= #oC x/TMzy=z2w{ͽa{c[^ws;>c^?z:[7?9!bOmtE#z=}u}wzOO!=orgO^~S۸.RV.M%߮5ۣ[HWn0K'ys{$1Vw߾mr>+߼xo__0ػ^|t?iݑ+ib΋:<:vH5zzjn<%|0Bc0S0s2T7StWn n 6O30Uzk&/p'[yc#- wz UC2CqhgC#)fqaG8;a [D_Gzla6(j fj|-*3 BtvddVV'M8l[nQA\:n‹Z #eb9"3nc9n¨=vGuE" cDm2%}fv0'"pJyĝxq#zut{cdNJIV=d`X3#ZY@;Bxڙg [4=d[2VQD( :}s#G aw p>@j1ё<G2@e2ҧ n`^˓1z- k npF@**σzUݹ!ਗ਼plg!'qaጀδ`6`0lTm5_oHJ26Z_τ:#cƃ(9bjCŤ?~`g=&y(" [:rDo׊GY O|7?^r#6`~ RO<]ҁbxݤxyv>f>|1_W>5XVL|%!;_WЕ(wuX5bE&ǃo[(훏@Tvp8 Hv*u)ZY7mE ߶bАKPÌem8P,-%a B"Ǘ\Ma!OddMGhם{~lxNj㡅{}Ya»H9Ltvx/akw'I"A>SD"쎧hՂ0iyVm @ O/E- `8<>&B!qaB>8,È7iB>4@!OS1|Ha Hȇ'. &,mOH-yH^-ku6';&Ifæ'&*ux f^j8ĊO`1 2lQO,aD'Np?b i/~25+7mI1?e?%M;ua/~ܸ l}##EXRK&|hlzOT{he={ 0нxZⱟf_]xx-6g)OhMckkD{*zAˮ'u\@^ѮG=ۮwEv=㮗wmCQiPfk:9m]g1mySO_6zmƧW?ǥgouGzxJ𗶞">nE|Suo–^Su {@z.D1D0)E"RO/DdlֻȩzY=M~mn#'lj^Gbz|N=>l6>z^v iIO_sq{Uw[ l Yn"B^ڭMfnK f2:J8m:wvOcA?isFP6oyfF(myksLAް}lEv<P\_ΠdYR.zhrK63br*3 꿙xu('ѲC6]6mol'ن,^}E\2ݮGy%0y9 G[_v弹mkf4MNmSf%7ԓGnSUӴ>f|۱n~1؟PދϠT}cUr!V5i_ac$ QAxC3^v}r [tI^޳ )\gV'|E|P똑?qh&?UC îLu=m$z7^uO~xey4uW)m<^]ta9AxuSxeǛv;+q' okxT$2g╎AaXxvw]9;4c |d:s&"^gj2"\q;{ CeoTJ|Rg*&GAX=?Ӄ/U /OUۃoM>ϊnOz<\{Q/l=zb]o|Gzd^zQx>;g=9njG=Uz~[`;35UtsƗЬWEK>@<]z0"ЭGK 3ꧩw?V/=4w%;Su- c$&[wl#ѤCjPo^`˗4"[o/Wio^\zOp/^6N=tvpbjԶ^?GAKo*~%OkWw5~Ȇ'x5UQnYg,po{[X7yK_a!'=jLcx/>3endstream endobj 71 0 obj << /Type /Page /Parent 3 0 R /Contents 72 0 R /Resources 4 0 R >> endobj 72 0 obj << /Length 753 /Filter /FlateDecode >> stream xVMOA ϯ·ww *P[&RJS@Ig<*B/l{9XuEm-l'p:SFcN)] +V vlD؀ QID|h sPp֣!|APDK/Uf}C%lTGJX (Xg{sc&+_S}17 Yѥh!hoHƉCK"81f1{NSbJORURCO7IcD -wܥ`) ShhѥhxTF<\FK L3K?ŗ-:5׀E#|GcߒyU/^[мm6]:lOo +hSݞw vgNIKƖmHxA@Ub/i #1y> endobj 74 0 obj << /Length 3636 /Filter /FlateDecode >> stream xKWi]5%PRqbkZ{U}"|[ks咖o_-?.XֺTמӺ^tų۶n۶_7˶떖/ ikkICVԖ˳Gi=&޵ux =𮽎ճ}l/u_6G^q;1`ߍ1/=1^}{oӒ2R<X>?ayn(^{?eۯx{>0Go/Gx{9*kɔo?ηru|T{큭3>޵ݿHR,w/ݷOdq?]|W/~xOYa+=sgo~~Wo^w[L~Lֺ g3]<3ܗ)cm;:68¶ͰǾ ttaXf~zxka.n qDm[58Npf-;Ճ9)p-9i;$LCie?TSp"cHޞ׌qy=u_ۺy}m6SX;D}wo}0) z\y0~,OLf\ym~۱F_f󅉭 9ͯocfI0j6g)ͪ6ץ[&aTBJ7I|zBYDb]Oɲer1:b nQGeQ ٻĉxm3a0#\O'7iF<z!\OYxțE<ȈГex#xp=qI#{(F䣅 ɟh0b.`J#I l'T'~$^x='G"OjEMjSo5DKO/X!,1ͮ'kA DR0M#i}'V{\he>硿Wy}bG5Śo#xX)z<$ңXzKΧŊEx+ނg<bųX.OOH]t]tX~).z:V.z:Z.z:^| /z:X&x#qgrәg+f>+_|.W=z@\zD7ĪGUOq>!q鬧墧 _t{bՃbՋ_G ]tb_s?< vS7ۺQFVn egNݷ[|$ ߼*<]`>L+; \!L[r(}ngZQ3EN.?C*~\_Rv^7 >3< þ'7\u±;W5ߛUޝH9Y9((^3|XyX8n3yg\خy0;38lw>K5پ~vTŹZ -ٙQiV.ܜo&nuw$eÞe};La9mvWv;\e:,-Œ'LqT.a̮g;Θf;dgfdnvfJ|0W fKsF}܎M/V.-WX?f?c9W-g/eY)9t yb=]뇗\O^]Rwtf\e~E}|qFNp|U6XV !~msnn9 }h&vp>g.c`XgGrH[,=3zE"vI Ilcക.ж܉-JW-x3k2R'FQ'I[m([U` *$bpƇ}X'a~aV _Kd?Nyz'gXks>Ě/oCk=z<$ңXz zKbCIx+gb{B,? ~#WbY;P, ~*ߊbbX x XF|^z@zAz"xz^ X8_⬗ĪĪĪǂg&V='8AEIYU/zW.~qYO;vl&_U۱{Tm=vkte_n#磶ݪ4{U`!?.o$)`"~z7Nlendstream endobj 75 0 obj << /Type /Page /Parent 3 0 R /Contents 76 0 R /Resources 4 0 R >> endobj 76 0 obj << /Length 3459 /Filter /FlateDecode >> stream xZK_1KXd2ӏ-(HĖ@,qm96ג ,{ϭofqT/p|qJG3#txH 7Ϗ?_>;>pu'-񿇯>_pSj>0%\Ǔ_Y:Ϋ}@ /jS;s2ʙ4'tV>熗ӿ>߷^?{#D% +nx$˛??_X:/~yOKzT՞隅 2kޱO=Wg fwKv; "[B>釷 t5kuu|28 SO<iy,l`[oBC}A,A\O \-{0O`_ "QY>H$| a\7MH._E"|=X=DTAU# zͅDn ⴤj 5Q،O oąo|~J!q/z1֮/lJߟ-Ff|55*v|GIr'ܿjOtw7X6b~[jqßp{@<4GJw`z]!P(KOqz g}QrOtk`sL= xzz878Q;ezT N"w'>H4i$U6`&nXJud!BE2>!)#2"ˇo3ohylጳSK#gs. E+ǡ>1b{sƄg_u/9M0as ϢT\i, &8&Mx:G(NtORT\i/\02ïz+#&{.^p6`af7_/<"M:6e45h(P - RHc!;|3FqŲ0HEO*Si|ro&m39OMє|>EhEO"SD=D=_/a'Cܮ{>Al+zj_-60 nN~`-Z!-I8\;?ɵ)qIO&\Ow~hR|:D¨O"O"e AۖOv~CWL L/]5bS{m Z$jx"98R$GսŃD]\8}O$*x%|hVf5߀[vD>_[CYBz`^1'^X\>X=>miBW= MV\(OQo!x1_Q->4.;:V\c(_|I+20|[ }hU>&_3K艭|O !1>D8o7Ĵ~D_ -Cb q/eLOY%lƴC{jC4~KO_HoG+ƛNϏ`z饞|z͡OXC5z#EܘCIC7Q"(ի(Dgo].vz4:]+OjUSrz|CuiIvjG `iӷ@oڕj[1^,|'iu>0!qc(L^=/]_Í Qt}cB?B&ʵh ҐONA "xdL,l&.p!x^h>oS]gj_Fi=2PhZ)v"zNꝁ7$7R`b@H(MGGb|$O>K]>.*}eJ=_OSOM'h|O|~@]h_W?o֯\?9~!r/iBF 3gVfr~rZ>!@OזMot"HG8P| RjC~U/ޯhzG1E"Dz㌥w#Dӕ87brՓ4/T&oUxJ8_:=]8hzwڦKfzxGz0ڸ Ey߸X%?*[|X7(;ߠLK=8/?yo^}E# endstream endobj 77 0 obj << /Type /Page /Parent 3 0 R /Contents 78 0 R /Resources 4 0 R >> endobj 78 0 obj << /Length 4215 /Filter /FlateDecode >> stream xZ^Oqtm J"$, 1MyTu͎-aHs.3=sx}qǗOWwЫʭziԻKjs^?~E߿۟>>w:ſ|W < 1[rP7<Ƴޡq{<{]{1i;Naxt9~#߽yO||?&?]1gaƽ^O_^?S{;bAEޞw? `6nKSro$R(0%5Xʝ|ǝTTVM.) 193BuM'|4棑䆸 LDdñ3#Էxl>^Z!Qu`ja#` !#vwG+" R qƁ#1Nk;y.HvzjA>^XfBXy1=ɢfܽ.DZGXXa~N6l,QjͣF)BFZU6όb(]#됍& "^68!n*`iFDrpFr[m|1AŜsEnc9syqs:z{X"mxoI|QF|E$Nɷ4_/9Bxp/nda/X,zPI)`EU2{;Z\YȀƍvpɵ3ϜA1h~طdP!`t+*w3T O]$x @HDGFr=$[ˌ` E(qPʘ&a(~-OX"TTޟ" 9!ਗ਼lW!pDCJe20e" 3qFeHVƉ$C׺Z~&<~)6i>5'$9}P1>f9|լ^^9d#^*G|#$ x] b>|H1_@X#^TKO``r<ҾB,ZL?ڋD򡥱oJ-' : ;:b:@C(]a2W``BC\ d ]~7b=G0#1cN'_We7\e'hBv y \J"b&=kU7,&`VTIj8 "D$r2x<=R5ѱ]KxqḺH$Ud"g"j 0C4͗ٯ&4l;-)$VX$b"i܇YDe"^CF<6d&E.|(&E{M`XTM&X?z^$&JEФhꜤ70q>l)&-x~Ҫx zv `zLCB>&)4FKȇ?x|*f)L>!*>_s 0d !#|p>Qp= ?RK.ɫ[bm#jɫaZNHj:ĚuI'tyw>] S(N OSxQĪ}ݜOЏHܧFZ`$-}vJnr;u>UN\m}##׋ >6a2 ϗuzSuѩOtgXd}H 1m1}}585x̧BhzZh#~3^moƓ6n~P_ⱟs7\g/ܯ'=_|#ϒNv3nX6=v>P#_Oʹ||勩?33eS:M ܡ'.Ko#M+b6Sz0L=MKbSn ?V5KX֯KaTV= 1x1q]O7D^ף uۮw"른_vH11zS_g='VL?@ \?7eTo0m?m3ouG~|J!/m?E~F~Χ4-Ư붱caE<~'GozS?D^~Ȧofdr"Fveg94~Sل.V=<~z}`6y~T48&fSCvxUG g Y#j¬?OxlHx|/R!~3Nl}Zz퐕qs쟀/Ϧ&f^Ǘ2PqM3y'!䳀}&.6o0ϟX) Ccv^ \/ߘXvȘ71zID!fpMocCa!iOqb᥍v}ӱwbؾtP?]xqPqwv(#)+QCx!(q !NSF[L[B6;l_^o}4[<ף~ ώ,j)oslLK;4q?Yv(Ix/~v2&f8?u; 7= !/K\>'1?~6Uϥ_F84$*0/P NWf&qMp}~ %k˒7?Ldy lkD4wscƣ !Q~^C/.㣄}w׋j6LC8􂇖~&)+ub et~z{zQN'21B!31Cw1 V[ 4 W}SE3!Tơg BO\/EK'FbqU4!^F;\UA XR+Ew s?׹_]~*&n2a񍸶GE"3&_gbAW|aO|d_{V>rיLW>+v΍y{ CeKoTun߸.?_nǫ}W~ǯn߷-@5K죟(_h~t@ :`{E\ϻ0WVo xHG>yo^\~5O㿄Bچendstream endobj 79 0 obj << /Type /Page /Parent 3 0 R /Contents 80 0 R /Resources 4 0 R >> endobj 80 0 obj << /Length 3601 /Filter /FlateDecode >> stream xMﯘ%,2ނH(Dl) Ă8alD~Ωscɐ>oG:U-on?<}sOmuomklu(ۛ߷׼oOO===٧_DZ/)oo2/oȩ5oⅭᦾ}={=‡i^W{IXm]s\W{m^j|hexǀ0Ox `Şgsl_mx{?ay_Q_jox{91g^knz6joooPjޞ빷 zjR5?k}/^=j=p=jCFK[A`߾_1p觏rl|ܞapWo~߼Уӽzjɏ \A{C]ÜsEu~|EcfJ@,/r ~DZ zNNxky짷fRabsg /kΓqI[ȩ>59)pTM9 |CN>6iݸgjd ^?._=7n3>x?&/Ӥ~xIޙf8cyf2qgo5 2p{s/l6L65Os2ܬYas]e',0+VS醝D7̗b0oRGdBȜF-37-[!{ћXyܛ/+e"C8u?q:U7ds͑E ߋ枩nd{{ '[!#pNj?gY}r/>:N{ǰcb`çB %q|E<; ~r]!3Wngzƹ?@t9Hy@ \A~rE=" 1XL C-FHb(F8Bì# i4#t^;3V0 pba~3Dt f=tk5T>Zkc;|]+xoKkZK ^-ҋXzKobQ,:_zKbŃX"V<o+ŊWYx $xX~$_gⰻᆋ,aÉQ/_68XIbqőbGZ jqő~#9.ܹ8Rȼ#1/-VZ_YqfX\o~*ŪHW"7**"*&qUqLMo~qU|zb ^xXŪh"_:Pvq3UU2?0݌bm?xNm w1AH3, vKFgT]Cg^ weYD+ JK*dAZKz}g+e$F ƐrMtl ^$ Lg13-vn mJu2"Cֶ0i[?`^+VR}g$a&]hIT/X2[,xFx?eu|A ܫz"w= m !`\Xb+ٯ r =p'ԭF<$=a~' !d٠ H \Ot-\Yg"`O9{ɳaؑ/m#u=UBO7OX]OXh4$e8yPyz O'~$x=n'G&/EMfS粧zeW,۔?bb*DfUa4ïy;]Ml:a軬z^zXbGkĚO[^%zbA,/=7(^ҳwAx+ĊbūX,V/F,?.?.?/馧o˯㦧+oW>|&7=]0xKicuqӪUOzCzD|zJ\ozUMOW'V=(VIݟzT\nzUMOW,V=-N7=]OW=/.7=]_b/(n[P}$LY0K<}rzn~3x;$ 5ֻ }<4U5}ՙ#37i*@覯*cV}rg1\!tNʛܭ3*OÚpnx8WϚsM]1zjW21A!|2Osae=tl]Bd{87Oiю2:7wv(SwK7 G6QSi؃cXvbߎ8䨬0?a_پ4|r<|X)L^: atiCCnq(E jdηd?0&W77߯%Z}3S~c=VOW?9[959_HSKV*c=Co'Ƕf8i5UCN?*>Xo8~8>nl~M ?E?_g7S }B(8/ 8O&FvHX<֙#W _ K\uė;_ 1l5rno`  1eIowb ? 4?bGKQߙowm5kɁ7nORO/N3?i9 l +~zX ^bGkĚOkZK ^-KғXzKb5xY,+^Ċ'Mx ^*V< $xX~$_gC2xX~+Ηb/'bQWb3]ʇbKX6xcX> endobj 82 0 obj << /Length 3423 /Filter /FlateDecode >> stream xZK_1Kx[$J"9 eaya`r~GU5 {n}3]Szp<9KNC%?7×WO>ͷu!OLJ}OW>S8^|:Ϊo9f/}Bgvf1)=}K:{gfswoSDĞa{aŭ^_y?:gtuE^~_yy?=Gw<=V?)~yOOUKT՞R=嚅$5'Ohz%x-,w/~woQ GG/^}O~zٓOY*/߼| LA ? eE᧟ƜZsHuƻNJ o,pvrPA[>3%Yp]gL3ot*`^pCT錛 ud6{$0y\β=]gE\ޟһaTf/ngd7vg_hS@L)~_g㙼?t͎n󙽿zO9VYlt6|X7{=fogv@9eoyb, p ]-]]V QH7{۸"J|{>I'/"E͎_l|C"O<_DIi>|'af O_pAijJucaz 1e?kt:q?A (7p.wㅱ xo D˗O|$5_$2gO .sߏpˮ^@D5zZҭALk.$rg%wU *Db3>Q*i|V`|X7BӚop42clyWȷ{8*/X\?gߏhO_YnfF_֞Ox~"_)~ qO8=}%@<tjN+4 ûCr1P)z+wG=Mq N11nPOHLӃH"IDߪGQU$RzCBrz;^FLO#P*C61vòT# w/jwHqzȼ}CC g]&^>"=66vóp0a5 *R\G/=8]x9G` œ >;Pؚ_bau~a_/\~(n#kF.}CV"1_ꂊۨUc8.]R`Q=N$_o QFv/ Ds哪(m)l>b| VWܶ|!ϧ.Q">"ĝ'6=ï).=E=|$S^CO)bů!n= F|BLz6W_4-F37 2_POM|jy6u˧t8b)];?k秄.VS ;?%tͺ]_|JqP9e˧w~J0SJi˧v~Jmd秄zya,>O8<kn= E"~(/AUۜj'Umt][O'=1&F*/A'~CLGL4^1YBV#N!1.iyެSُc~ccω!s!^y'/$ 7T#gBR |]zG0=|RϿhz P攦zI_fz=z`MqdN"n)Z$ /MvzȩG* SY[uz F23;=M~NoNx0P(l<%Q)Ood7/` f|tT-cѮT|D'1.|㙷rOWa΀4NO 7c8nS\8lF>t*NFq|p;q378S/yLGGlxµ=U¨?²p8Smc⻅+i0S.m2Ne||+8o|J װE/=31eoKSo,7HPv8uVzm4y d'/|"_w/Aqa!Qz?.=O~F(޾`)uB}  =$b3@tbƋSXxM\]>px܈擄^o NGA!jJǠ1h>` (|4:[$ C7u#F*ֳPhwi[| H!|"I$g~T;C~yT|*|+\ZĜ e[4']? ή_t{~үoxo7W}}qV WuTgnjկ,_/ =ߢNbzDA{38Jf^b_TbzDyw1 FKϑ8/GN >M(WzQ1)A<"^%oagoMӥoKklz*{z k6/vDG tGNGZjooW 彯C A9o~_?endstream endobj 83 0 obj << /Type /Page /Parent 3 0 R /Contents 84 0 R /Resources 4 0 R >> endobj 84 0 obj << /Length 4130 /Filter /FlateDecode >> stream xZIW?;ڇ}'OWwF> 3zB䧇? )|Ͽ;q]G v{ o=n{Jnn)5 ~{L0%5X->.1>{1c%QB+ło?A ~yIx_~דGT سztMT`džNwGX}΋rG<ƄU%Z1A˜ /P}( .wKJFzk3#PpKX;p ,$] vw>62y1rAq|x/&<ݦ'95|/v+030w/ON7`NJB9GH+޳eWK/ Ě=қl>c0& e37cpC%⭗giSoMCO^4m'(G w>"GgwZ;Eϕ/Χ+bM| ט(ϳW?D~|[~ /_?Y~&^nÍ9P2}%S鷲ckXo=`xEƣ~*d<Ïި_f>_~x^~_~Xͱ240ֻZ:_fYVbضWe)qP%XZ^g +|ac'L>Y lGQ"}nNVkg>uv<Ə?RI QKfoF1\G0EeQrZ֓lrfO b*QŰ],fsP;6LUB(e1]XiUchC5{FU>`*U*mG/\+e%F5,wnlcY) 6_0ˉr*afAI^Q'L`ֵ,$.OҖ%%YYY\1xEW^]\t51!r!뻳 q>QGwqyne׫220] ͡ LW0]9>_|~Sc?>608z=E:%͜O]'{?J<Z&cB<88q|Je`/Om)ă'A<8< F$A<#\'iaχ Je\+OTV̷'`b3~01:O'Lwm >` S*X<#k%d;OjUl SqB:0d>E|KgBl2&6JIⵇ!ɛ!C8>R.%ă X\WOtq} zԧlcu?q] >agqySM|g9 {*~;w7]hV5jm5#I*_u6H\&xK3x!f㵙+C{?)zKo8SY/Ǒ~O."qS/㭷ܸt10׿?fm=w||D| p=:ϟ1ȇ3%1ySò]cbĩ|n;} N'MG,C ]C~9_"N?Eoϩ~]~s?9^| [~.GHz_mVl?[*[~zc:SoWǁסqz.ϮU/xb7Xkq2#)ɜ3k~C5gz{l]~ szQg\Tb5[W&k/.ޤb6Gb':tlY=.Gbò7[+9@~3&RFW'K]_V:Fitk!w]48VJ 31}[х L !'7=]^_KɻD)K[Jqt5_Hs2dtMS6}Nqσo]ďy'_q?h+"?X?B?PڲuN3'-l}Q8_['?e!W㫄}׋jKm@C/p#xS&OYCH([O<~=]abE'C/TIa;ӏr)xzU`} =za]mJ쟊 h& =8 TiC/4E^6'F`qUD{>\k {=I֫~z7ƺo:<buq}~M>p'_BԿb/>|T~un$gbvw|$/hoƓo*g#|R4q;izдD/Ko4O=Rܨi땲t&i?C/U/KOU[U-=z?zM|<\id뽎3#_7|>O3W6#qz;̇\?G3_rڑOӲ-ay^f>}{W?@>xOd ~DQ 3w?/?4w%;Su- c֓ӯQwIߣ5*hE O^~҄na|u~TYWmn?]~~OWv5xk6*i{ɮ' Y!nQ>VYe,^Y#y~;:q6}mSC!xG_>~^\z_5nT ߐendstream endobj 85 0 obj << /Type /Page /Parent 3 0 R /Contents 86 0 R /Resources 4 0 R >> endobj 86 0 obj << /Length 3543 /Filter /FlateDecode >> stream xK%+j UYY[m ٖbc }ND[ #^tljyo>ӧqmg[ZnYz(ۛ߷oyOmxJ{Ji{_cgoiS>2/oȩ5opS߾^Ӟ1h{Vj/ ?g{C{VCuv^۱4گ_c;˘Wof~߾,X?mK|z|탶n/~K{/;c@XE~~q{^x}t oQK~{Rc=ױ =TO{ߋo_HrItv,?7@A ?~c_|_z`ǯ|շ_zt秆_01~!,gPe9:?s^Qj﵍Lɰm 1J{N_\ t+0lKma%p봗.p޻[b:wT>Ǐ|yڃ 3A \gϹ;k{c撹:+R|fǏтJqu'8ðD91'_siR0titf8`fK|y=3VX2uese1_5y_TaNh28c=Ogwߡ80r=UV-}.\H<0b#Y`$eWba%n`3݂pS?/ |t+|(V+obkybb bzUUzF|bCbKbS|UzMzNo~AqŪ'Ū7g=*>o~Y]qŪ/V8qfw,7Xt3p<&q;y61Xzw"}\G;+Z-M~TAfa4\Yrb9ز2#ò|>dzbxv&z՘_SFD*ZVb8_;"\O\orGZ9P%-=ă]A< ;/zc C\TI G=![|?̴)~бu=j'[f{GZIk*eHY^l[Y:bg \BO5OJLYsG]T-ӟ SyR0aHO^.2ʠ?Boz#~*7WMJ?Ax|z^ =&:hb3|˺^+xoKkZ^bX-KԓXzKbU,=;/bŋX$Vx+^Ŋg],?~!7b8LozZ~(_MOo|{iMG󦧕g+f>+_|.>z4YoUf=#V!yӪUzM|=AYOQqiճV,V=-N7=z\|UϋMOk?< ~S7=Q' e>y>'ьt3߷?wd~β'Sr?TjOMoȶɾߩJԭ t~z%󔝟CLFO=YΥ:SaiܭF7>~eT"l札T|Wt~m y0qU-iS|PUT>ӎ/IS #mY}[1~~xϼSa2'l,zGK~mOF $?4F `b6Igf+#bCٳW|9׋<<#VX !|5kZK -KԓXzKb5xY,3^Ċ'Mx *V< $xX~$_gC2xX~+{AbX(x+X.xCXT|V_endstream endobj 87 0 obj << /Type /Page /Parent 3 0 R /Contents 88 0 R /Resources 4 0 R >> endobj 88 0 obj << /Length 3352 /Filter /FlateDecode >> stream xˮE+zh4YFH8ၣ( I%⣪(K {n>vmO+pU)0_9tQ!ko//>/x@zȌzkn={{(l]{Ovҭ ]{O7khkݍk~}}?&?]1?_8ʽ^8ϯ?Ƿ߽oABf7_>R>{g?^OQM2//|g!t_0kB72sHKM|rjVGѲյޭQRldtpaCs oa 8,;p'b&'`iW0G`t 2 !4=̣^WJ-0svzDދiV/(TVOz3?hHz%WW(V1ze iK9zbhz1?H/zu'/`7#xί!g0 ;21M7$񙝟oa"1pc`5Ll\?{`OxyEGv~R59)ܝFu~BJ>Kqa~ -~B'Ԍ6jE y6_4&@BBt;?>:MqNJr1 skh^Ռ|`'62B"6|SfSf"Kq{6i.2OP^*ܦnc8Ip;f .K\Pv3b);|wT3KUM3*gT^U\O،,D\r!}Ff'q=_OꢔTxJPYOO ]x>SB7_'9z1;.j)YU7#|<%䃏|~)!|<%C#|<%Oȇt\xjOpA䯇K"?Vxj')Bzx|S/ӵ)#>42DOtDb=#(DD'Jie>ҩOt>'B>~ԏx">_#pd$}v oXOBgtۘH6\lwQszЙ^iNOyt,;=B!›^ˑ ^! gz o=c{lz+GN2~20BA6 W -7,ꕰ3aY]F`dVgKFVO'거׮TeWxh~,fWm 0_NIԯ`4?#]ߑx2$+9x_vĶg${%r<М_Dc~|0)z(Iv=WΘsW~SÒxeOE_HmΏuzg\Sw~_:~,fss)W zUyJ\^+㍸1fě2S/2w}֣ ^Sej$,2S>fzֻMɷg4p\7; K1fԓR=S:O6uLMyCuƩ/HSmJ)xj*#RZ+Y7SZxs^usgEyB+!<:_ra6…m:]apg[Os[x~qǹ& xd$25Wga̟;qw|`$> L> endobj 90 0 obj << /Length 753 /Filter /FlateDecode >> stream xVMOA ϯ·ww *P[&RJS@Ig<*B/l{9XuEm-l'p:SFcN)] +V vlD؀ QID|h sPp֣!|APDK/Uf}C%lTGJX (Xg{sc&+_S}17 Yѥh!hoHƉCK"81f1{NSbJORURCO7IcD -wܥ`) ShhѥhxTF<\FK L3K?ŗ-:5׀E#|GcߒyU/^[мm6]:lOo +hSݞw vgNIKƖmHxA@Ub/i #1y> endobj 92 0 obj << /Length 4240 /Filter /FlateDecode >> stream xZK^ .aۙP[&R) JBI=Ǟ!H8s3Ox}}}zUU/ztIwNכ?׼ǷGO!\O>;>G>_?"/7Pn׫BUTדǻ-Xz)Z汮.<{5u7hSX<{{nq~ÿ޾ǿo~ {o+&F> ;z@ǟBy{/˝eߞ? v{oO >n_vrb_viJ,*Pm=J5|<6wևYʝ|=0[>NS [h%Ypo/w? !Z?R>xg߼͇_O?yx_ֆN{Pic#\piY[H5zzj]L[:6PLa _MKwHp\D Lچċ!ɖcgGoH 1}޵Ea3`6Pyڙבjp?T#mӝ?k;y.[s$^\A=zt_/,3tzv[ymGxy3.#O]_pF؉n~N\6X՚G/RfTόѕNؑuV9Z/[7fmFDt wFrn /j%b=ċcU:sɋ n&M/%ݶɈٹ )?G_wNō1"=Vw;1*ɃBV$Ycd(kqf!kg9pcl!o#[E J5NQs6ՀI1zWMjPHEA?`t W' ߰N O|7?^r#6`~ RO<]ҁbxݤxyv>f>|1_W>5XVL|%!;_WЕ(wuX5bE&ǃo[(훏@Tvp8VR;k-,ś"o[1h%aƲ6 Zb(fTϖKg0xjpzPUGצb'k2qg&G?+xh\V. _D&:; ۻ7YL-{[•I"}l."EA&ATfGT١4lت Q<h(Hxq:$iI mHH;=H2jjE$md5_"jep!)MZ"a O)IcI; p~bl.JI\$R~&$nnEo2Ql`|D"=N8i#(V. ](Hq$DBKvqQ袉h-j@' mMq)fu⢂6c9%efwmeI`S$͎')<T/O8E$xV-?x?aՆ Q RԒʰ㉎yc"$!&)9x&CLD|pM<ȇ&_j߯|x꒐iA>8Ȃ@/%/ɫebF$vǓWڀr# ܬu$DOb"!+|T ǓX0 "tA͡4 @%L~\GQ:ףtmZ/:ju~XK<,{ Zkj2^mo MR$bxvog /'=_xˁGΦNv.6=v>P#_``;xc=[[/&|wnM L>,6h|&(\wt,go'_&L>e`ɷi]|L|~M>h^|OBeCY/hwDXzCh+g1qȮsR;Xm11mʌz_g==L=@;x~>o ˆ^Coпm=  MNc[OSgԭ|MkynzH< [/ԓH<97УHDWl"m6tz905C/?ˡɯm|DMHlCσϩއͦqGϫ_@Sݎ9m6:ynw nSVB;Dn--t=Ҧ9z4®>C Ҵ'Nc|ӧmplڜ[Q1 q==tڜisF6C7l}]l=8|:Oz;T73(wv;YA;.^mn&ctjkp;}3a]jFw:NUtûMی#mbHNo`VV͌\ nGo&a]8 gl?ƐD {FM(j_XlUMWuyIc+HT;f(#]߇V]lt_/پՉ4d:fϧS2)X; QNb%|cO|(/m4)_[')ne|QJLg||Q]dچig$L5JڴqpJ6rW R 6TLxQXBА}&N0b5h CUf(op>eES}sTE3"TgO/OP+a]OǍW`3@Y}6B]UʵA|.?iCnx&^ghwT&^F|dיW>+u{@s|1@P|7*GqlR)~3T/>KUS[|"ۓiO>Wv>r [Oe>QWqz;Yy~[gQOޮnG=fbnp*O[Y8-e.6MnW?2~#FRG(E~_};O*Pendstream endobj 93 0 obj << /Type /Page /Parent 3 0 R /Contents 94 0 R /Resources 4 0 R >> endobj 94 0 obj << /Length 777 /Filter /FlateDecode >> stream xVMo0 WCrږ-6K,R$(Y vi/I>$ g`9<@kyhQw|gu`pd6@}|SNK0S8Sĭ,;W: a6-x Lpdww.cY V=@4=y_endstream endobj 95 0 obj << /Type /Page /Parent 3 0 R /Contents 96 0 R /Resources 4 0 R >> endobj 96 0 obj << /Length 4271 /Filter /FlateDecode >> stream xZK^G .X^fƞ׶*@*ĢbACTIK}αՐHMˢiW{|q}w~ܪFk;͋/7go>B?Oך<?9yLJ!rK^rz2w{ͽa{c[^ws;>c^?{6{7_.!bat??ٿh䳰^g'zOg_?~8>.wqǿ=3ޞ|vrbןviJ,vDFbtD;,Nc}{G\-')-,/w? !Z\)_O^y}_gIM</7/ L ?:MU;r%yӟƜGV+ӲjLNjH & %c1廀z|ulN 櫑*ݵ C-<`b뱑b;zk f!m83C#)fqaG8;a [D_w]Sߕ#HvzjN^XfB2 Ώ$f01z]x}#F؟Xld FQ5^6S[kV 0+#됭&s_ ?o*`Bt# *`y/v^oJ)3{Ή ,wt̙tFL9;2QRy>2P,>Mp`sZ#l`XKp3RQyTL{ :v4 plgOՄc;# q= I$8N8F(q gv# ma2$lzFR:Z~&<6(Sl |~7k6?hm׫o?\cد硐>ϋ<lnOAa_+xA3oPHiA.JGl46MYA'`'QV켓r<%mU$X+8g] d m~(o~,Y;ytVx]مgݦ?ce&Ϫom[X g>$-}+:r(R44R<5Xe]C1!̏9j+R]ME%8]zROE|<#E Kq"Hv*u)ZY7mE ߶bАKPÌem8P,-%a B"֫W\Ma!OddMghם=lxNj㡅{sYa»/|r^7ldJ20;5l WR&uЊm"ņRMORIdbSӰ"b2Fl ŅꤓPY&)&l%#M# Tki pMH~&zP_ 6iъ&':A>|:l\dK0j1 <6TL#Rx}|6aɪKB>Gx" zhh$PO^]kʍ$pa_`rǓXD"OuؿL~b)zDSi' [\=^~dcjpj<b-Ohuzx-67I7S;$zċG<ٍ?wAcOͦp&ѱɇ)|I3'Ju1mk55\{=mU Ifea: mzDYhף m;"qK`S[ҶǨǴm(35O~?3혶^'/z Aƶ+37:#n=D^z6T=~Mu;٤৯݁*ʇڭv6Mn"B^/oK f2:J8m:wvOcA?isFP6oyfF(myksLAް}lEv<P\_ΠdYR.zhrK63br*3 꿙xu('ѲC6]6mol'ن,^}E\2ݮGy%0y9 G[_v弹mkf4MNmSf%7ԓGnSUӴ>f|۱n~1؟PދϠT}cUr!V5i_ac$ QAxC3^v}r [tI^޳ )\gV'|E|P똑?qh&?UC îLu=m$z7^uO~xey4uW)m<^]ta9AxuSxeǛv;+q' okxT$2g╎AaXxvw]9;4c |d:s&"^gj2"\q;{ Ce_ߨ')ǕJTL.S?Ӄ/U /OUۃoM>ϊnOz<\{Q/l=zb]o|Gzd^zQx>;g=9njG=Uz~[`;35UtsƗЬWEK>@<]z0"ЭGK 3ꧩw?V/=4w%;Su- c$&[wl#ѤCjPo^`˗4"[o/Wio^\zOp/^6N=tvpbjԶ^񣠥7G?PM~'?odÉ(j p[\[X7yO_a?Kk\|)\_=/_}o.?֘H?~/W^|endstream endobj 97 0 obj << /Type /Page /Parent 3 0 R /Contents 98 0 R /Resources 4 0 R >> endobj 98 0 obj << /Length 762 /Filter /FlateDecode >> stream xVMO@ﯘ#^_Aj+Dq@K13%~y pAF;q'l)͔i_uu ~)r+MN;AmzX n ^'b8,)%SukjV.0{a> endobj 100 0 obj << /Length 4250 /Filter /FlateDecode >> stream xZK^ .aڂJD Ҕ%<D~ϱ BW{|r}w~ܪFk;_׼'p'Zǧ]#^㿯\b(x*n*ݖygCnuX~nޚ{]4)a=ݽu78\?go7Ͼ~|𗄈=E#z=}uw~zO!=org'n/mo)w+v{ oĒoWIooQڭa$+IId}zs{$1Vw߼mrO+߼xo^_0ػ/_|táTջ#-WȜ?uyd ?-TTV`"0]26S !1wWt9) :ૉn n]0x1;r-i!׻Vؠ:ll*C;/1:R_nbGjv#zz5_|Mpg><]y?bkċk7g_V}e.T_n+/O2oW}=݅;:bI ;/߉F0`Z^`3ljQ! ;j2G+eB -ԈH7nΨ [vb7MV[_́2Sxqr @ǜyN7yqas"sⅱD6ޒ>3;W8%k =:ñ@CDn'F@@%yP$2{Cb-,D@zc!ʹ ƈzF#cH;|8 pH`#cQ 2^P7 F0wQ=–78# HD\owKΐ vFTM83ד8ʰqDJc2l>pF@jgm0RKf6*C¶7n$%O|ӯgc`S1A wӿf 3J`}P1>fYI} s0Az6/x6 )m<;υ\鈍'حxdt൘7A7)x/v+_@@וOE=V;AIt38$|]|bX|Q".>J#ϳV2jZt[0lh/:Ȓ&vI8+db$؊w8QDw kg<,1Ql]v-q/>卶Տő61k'ϓ"0_gY-mWܚ̇`o@S Q=_XKr(&U1GmU+آC+^/Pb({)N;)NŚ.E `1>Kf#4Vu jl vö %ճ%|d>L@|5@(Z5\zb6psՑ)b dɚLܙ Ogʆz=Zח&)?%;;,?}M{/S ^Vp%%mk_7[ Hf+lPl(Ud$Dv(F:5 ."*i, ^\N: EEabF[24N`LZ w/DlZ`HJ`HBJRX&N\eR_ IkhFLTh&/$E5QtHvObEH$qEꤤ- RE; QP;]\7hb7چ-e.PDBDSxEXhIDD[}ā'Ipj/SЎiϛzol[0>mA?.=xS>CS:nu-;z{~z[`c=-֋xp9$O!M9(zzU$"ȥg ݶFN=Drik;v'?fS:[sai\@Tc@NM~b~۫RΦ05v/"vK8]O~ Pl!>4Ӧza'i<c88:6g5xh3ʟ;V%/g>bU6U]_8FҘ NʈG=;e!=A=0uou"'Y廎9L9֎%oضE&_p6 pr։w}GrD_TR7Y8_Tkaڙ#/8S 6mR "!m.CT// |"^*(4dF<4LX /Ðվ(?Oc|ypf||ь|qfS%z1`=DXFbqU4،P~`qGPyr-m_,OE3/]wP- 0T6er\)T_?L;==RT5=V> endobj 102 0 obj << /Length 4254 /Filter /FlateDecode >> stream xZ]߯8KX03ڂH(Dl) 1wǂ>{yヿ$?]1?_4YqW{z_=Xv;],w{$7=5ĸ"nnҔ\*Tm=J5|>dO,N>c|=sǔZ)Hȁ>}~7/ygӏä&.`|gkBҽz(NwGZ?uydu mZgɳjLNjD  1]-_1s*T7(tG|4ۍ9Ddñ3#Էxl>^Z!Qu`n!Q!6P̿H~EAaAxfCYl4YQ qS!M 5"2[3*Ė]罘Mt(j䋙wsN xm1g!/.usnwT\/1w/^K$m-39 ˆ)?G_Nō1"=V;9*7H[u5S|GX+ 8޸.v37?81UԠ4u<xbZ@xzF#cЁ;~ Hd#cQ2QPӄ0 Epѯ=TZB\Pb߃@Ձ;Ґ3dt²]8d(0Z_τǺ"ӏ1! w$0G_F,7Zvt:ltñ?lϗF ,SUO96U@mU;آñ+^/Qcp ')Nǚ.G bq&|hзA42Ԁl uô 1eճ%2bl> (0\-o||1Q8\umm (v2dM&L}vec=^- ዔ?%;; ?}M{( ^+C" )bn:oE4Q Jj8D"rr3xŵƂNBfQ0іL4Mԃ"S&V+n󥚨tBM0<~W6ԤE+F-(@{, x2OܛR76_ EkՍFTh&/$E5tHvObl I+G7ً.II8zw[awh륺)Totn ,eDBl)>NTc\)Z-Sfi+~:I|IBOtS4}y)'^$O8M$Z&-x~Ҫx v񥩥zLHB>&)9F5Mȇ?x|*f)L>!>>_s 0d%!#|p>Qq= h$I'ɽr" ڬu` J|kR'1ix>IKD tA4 D%L}ē9܏XuG/|~DOf%77#iSSrD9OԷrmS68^dO,xToׁ>e;DWM+A݇ˏ0&Ɵ<}4=_-C7_Bx_+moƫx$# u=G<~K: vo|ns 'x 07#ߺ5;u[+_bgA|DN= 1ߡ'8Ko#M+b6Sz0L=MKbSn ?V5KX֯KaTV= 1xH2q]O7D^ף ۮw"xwꩍ]occb;茶zN=~8~>o `|c~+?g;ƏC7_~O?ֽ [~_?O?mcc?-xp9$OCӛrQ$"HD66;t~905/S?᧩m|D̦vu$i\@/n91t<;ǫRΦ05Av/"vKxb~=] @ٷ'N'?=vlbEKvf$"]fp꿙xQNxFcHÞe{;!>$*ˡl_Q-,lQ^IL^?ΜyvG[_v9kfigf,V;3%fPOj?ZtL{UM3~}}lǺՏ٥^ Oe/pO3?bU6U_F8$*v3/; $/i\gV'$}qFNp}~J&k˒7ILdy mD4rw}cƣL;!Q~C/A㛉,CO\/L0qH ]I ԉ!$-;eؗeECEź^ g .V0_o&O2X^t.\yJ`7G^4Bhzb*T^ 5\zb$z'^uOp! ʚ-,h#Ե^]K;Ћ/u{I\tǛa9|Eu2ovAW/c!O-߈k|T$2gAaX|&f;<;4|7M1j#7|Ʉpҷǝh_L=P- 1Te鍊R^~虊ѥw*V{z襪ejr> endobj 104 0 obj << /Length 4275 /Filter /FlateDecode >> stream xZK_ >]¢3ck j+M. HSH=ǞH(;s3/^\r^ϯ^/]?y;p}5_}|= #oC x/TMzy=z2w{ͽa{c[^ws;>c^?z:[7?9!bOmtE#z=}u}wzOO!=orgO^~S۸.RV.M%߮5ۣ[HWn0K'ys{$1Vw߾mr>+߼xo__0ػ^|t?iݑ+ib΋:<:vH5zzjn<%|0Bc0S0s2T7StWn n 6O30Uzk&/p'[yc#- wz UC2CqhgC#)fqaG8;a [D_Gzla6(j fj|-*3 BtvddVV'M8l[nQA\:n‹Z #eb9"3nc9n¨=vGuE" cDm2%}fv0'"pJyĝxq#zut{cdNJIV=d`X3#ZY@;Bxڙg [4=d[2VQD( :}s#G aw p>@j1ё<G2@e2ҧ n`^˓1z- k npF@**σzUݹ!ਗ਼plg!'qaጀδ`6`0lTm5_oHJ26Z_τ:#cƃ(9bjCŤ?~`g=&y(" [:rDo׊GY O|7?^r#6`~ RO<]ҁbxݤxyv>f>|1_W>5XVL|%!;_WЕ(wuX5bE&ǃo[(훏@Tvp8 Hv*u)ZY7mE ߶bАKPÌem8P,-%a B"Ǘ\Ma!OddMGhם{~lxNj㡅{}Ya»H9Ltvx/akw'I"A>SD"쎧hՂ0iyVm @ O/E- `8<>&B!qaB>8,È7iB>4@!OS1|Ha Hȇ'. &,mOH-yH^-ku6';&Ifæ'&*ux f^j8ĊO`1 2lQO,aD'Np?b i/~25+7mI1?e?%M;ua/~ܸ l}##EXRK&|hlzOT{he={ 0нxZⱟf_]xx-6g)OhMckkD{*zAˮ'u\@^ѮG=ۮwEv=㮗wmCQiPfk:9m]g1mySO_6zmƧW?ǥgouGzxJ𗶞">nE|Suo–^Su {@z.D1D0)E"RO/DdlֻȩzY=M~mn#'lj^Gbz|N=>l6>z^v iIO_sq{Uw[ l Yn"B^ڭMfnK f2:J8m:wvOcA?isFP6oyfF(myksLAް}lEv<P\_ΠdYR.zhrK63br*3 꿙xu('ѲC6]6mol'ن,^}E\2ݮGy%0y9 G[_v弹mkf4MNmSf%7ԓGnSUӴ>f|۱n~1؟PދϠT}cUr!V5i_ac$ QAxC3^v}r [tI^޳ )\gV'|E|P똑?qh&?UC îLu=m$z7^uO~xey4uW)m<^]ta9AxuSxeǛv;+q' okxT$2g╎AaXxvw]9;4c |d:s&"^gj2"\q;{ CeoTJ|Rg*&GAX=?Ӄ/U /OUۃoM>ϊnOz<\{Q/l=zb]o|Gzd^zQx>;g=9njG=Uz~[`;35UtsƗЬWEK>@<]z0"ЭGK 3ꧩw?V/=4w%;Su- c$&[wl#ѤCjPo^`˗4"[o/Wio^\zOp/^6N=tvpbjԶ^?GAKo*~%OkWw5~Ȇ'x5UQnYg,po{[X7yK_a!'=jLcx/>3endstream endobj 105 0 obj << /Type /Page /Parent 3 0 R /Contents 106 0 R /Resources 4 0 R >> endobj 106 0 obj << /Length 4158 /Filter /FlateDecode >> stream xZKfG[ . f$&-bĂXDi$}αա"v}TǾ7�~ۻ'ٻc66yJ~ʋ^|'m;7/z$Gq 7/a]kؓYo{}׺YZ|L~g}d _?|[p D'ۇ>E?}߮Z^/]KqOi&x{?o폥';&QiX>ͳkIDl,?~蟿7Wޯ~:[=~wlf $NOu?5dϡMݛLfj%"#M{zy3Ŧʰ2ıQB>TLLџ֧Ԓ2~./I$ԦЁSv!&8 "?#֑L-pV_@2m#z~2:Q|zz מJiuG 8fN^YHB2 Ώdfr1z-Syx$#OS_p L7\v:YDͫkTzIW}k 3E!2(YXi|5 U ~3%`&Ѝ TS tUn^FT^<FII=̋*-aʨ="ˈRM [3*q"G{,`ċ;㮣+= 4]Zie I"doiC`" q3Ё Y 7JW<0gW@lU&/L*_A@]13Q=x# KfF<ۘˌaLFqdFfa2,[#82T4_&# 3M{p?=O:CFg;!R5$C\Oy2F&Hu|>.d6`4mTmXH:6ڠ_ό#cpƃ3s9P)>fŮsJs0/A^v6Q~/H{ uKit>.\ڍGKZϠ,ޫluS5goՕGPqF b>|I1_7X#6_O `\|Bi?|y6_F<|_'ņ,rqt-YA`7QK~tDhR;UvHб^pf C^(*~*o~*U;y|VxݕP=Wݦ?NW# <^r4Y.I@8η"AE/ߊ؊%[z)&UuGU[(؄ȥ[ը[(V[1%Coʼn|G"XK׭h,g+w1~;@CnA S`7lkqRxRo!_܇[w♻E0uo__qwa:6] <*3{KO vZ^ _dݷ;wo>[exZх;)iDXm\E6{dcT2١:V(ry.! +!؍ik= 2"Yhh')!4Dm <'enmu*O)E_xg-6Nīa'@`W1_ZP64 <8!E|\dCiŒ|| e?W[HΗuCxo #f/'=x=GΦn!#N>Pȕ/qO]6 88V>+ g;7&wm_(|h q6( Gt W/>S.;:PS4/i20|[oZ7Ӧ_3_U؛iCz@`pH(Uohs}#zE]L9&V=vS/5]O}}zKۇ̬|?usfs%yKO_>z~3+37C"5ts壧OrMky=z\z0ZzI$^CzQ$"֫HD6[vˍz*zikv?fS:sai@Tk@NMM~j};HػvrZZ_v/"v.Ҧ9ztn1CNKGMie;<&c88:[6g-Eh3<6o͞Q:}eٜP iWH_.ұm ]^~A/+ ll4氻sHgm ӷԘq(Rwagqg%lC:zP||f"Uf [x)u*'ѲC->]6h˜(|Ň,QKZ}ƧlU^ L^?gN,_XlUMW ysHT;f3_?(^]Rt(ſթd6ggS2X?NQNb|-sO|(/m;)_)au|ѼjLg||Ѽ]dڦeRD&_p#}88i-DB C|iQ'_4**D UlE%QX*1xXZr9^LҔͿ?Ϥ. N>1|`$4(ݘzH2PWN;]N3_,>0m 0LXeiq\Lk\?;S<,=> endobj 108 0 obj << /Length 4234 /Filter /FlateDecode >> stream xZK^ .P[&Ri J${= %gc>>>ﯟ_^?]A*Q.z/z|#!ÿ|WG_-z9^zxeY{={]<ֵEz^w k}zOwo{ͽ><׏tw)!bOet??ٿh䳰^/_O=8>.wq=+ޞ|vrb_viJ,vDFbtD[,Nc}{sǖDPJy}o*߾#}6=Cwlzw$J7y#o~iy[h3zzj]L[ALaXb_MKwH>D LچԊ!ɖcgFkؘ1}޵ a3t6PyڙבLp?6#mӝ?ׁ|5ÝzTw9/X1W/pJBBg_p~'7ѫ}1$jeSe.Z5yB/Ej6_KZ@(]Yil5U ~S!`@ApgT)W{~V/HsNL8fXc<0frϹQy{X"mxoI|oi~^s5q^܈s^pX!"cu#LB"ɪ k&3xDX3 hG\;cx a}K*L9[TDr. p1z{D1:H-f\":2!Xfc0BW#T4 ]Tdy2Fe2a- HEy0R1Qс;Ҡ3dt±;_51C|y/(\ß PæV<[񂴏g+AR`)ֈ+oo>QEwɆ,|pilbTˍN&Ny'y:JtWڭ"AZ56?K rT []hKGyGfqx󤣴몼.?6.7~V} lۢf`&':A>|:l\dK0j1 <6TL#Rx}|6aɪKB>Gx" zhh$PO^]kʍ$pa_`rǓXk~~DKP ^k MOt Q#^>n "tu6 o{9ԉnsƻ'x lloGukv>vV䟙ςBC΍ɝ|@C1'C7t&xm6|0%L>MKɧ ?V5i_X֯ ؋iCz@`pH2.Qohs}#zEL8&nv^wz =F=mCQ~UwhǴM=Ak 7G޶^aaשw q!)C7_zO=ֽ [z7O=-[dEa]J`1s1%̿j.ysۆriR33,LiKn'ݦ<i}>cFbr?AslGSbǪgCj҆4 H3]A)7C|g>@'蒼gSzN$|1#'~x>UI1ڱdrv(k3~@&~nXN:Nu(SH_juPfb? j"6L;"qg~9ҦVA$-;eȗeEOdR:_3qڈ)Ec7@|i,/:웣O/O4>0||L~D/ ]zHh:t7M1j#E|dDYw*,QqO>R+eJ]|b!_^&*|̟ݞ|MxRQh^z/6wף|wzs:%Վz(vw;1vfkƫ/ۡY5ٯ0|zxb6-maD[=^!g/OS^zhKw㩧?[$ꧩH$M^#CϑOGIԠ >/=iDTT_,=7(S߈>un.=M_nmzjվm^GAKo*~%OkWw5~Ȇ'x9UQ~ݲ"X&n)snĿnv*E^}|}~?<՘H?~?YOsendstream endobj 109 0 obj << /Type /Page /Parent 3 0 R /Contents 110 0 R /Resources 4 0 R >> endobj 110 0 obj << /Length 4211 /Filter /FlateDecode >> stream xZK^ [^=-J4>PT9A"gc>>>S_>y|u۳e4Vrz~W۷GϏ_<狏xCxOxRy/4M{reٮ0zuX~a^z{]-_^<{zaq~ÿ_}~㷿O?=%_L,7_ٕ|w/?nEޞoze^~S۸߮ZVޮ͈n5EeH7m0KR'X^{$ _Ig;ME߽vV_{O.{0.]s^q㑷l?9)^>[uځlWؠ|}]-?lAMeXXMKWU!|AnLޮچԒ/Kg 4&zI׫V :l|~'brWv_nWu$S ܠm:Ц [hH1<t'_#~_ϫWqOuG8fN^XHB2 Ώ$0cj~I#F؟Wq&t ̉WG/WZ׺g"BtePjrGfJ}[B7PN1)W{ SyqW+'f49'^&p,Y6Vhə FM9K,L{/"DoRޒ>7;W8%_g5 ܼ=:ñ@ ٥ۉP !Xd5B Q@j1<G2@g2ҧ n"˓17# HDE\oWKΐ FTM8v0ד8ʰqDAxp12l>F@jgm0RK=lTmXoHJ:6ڠ_τ#cpƃ}9P)>fَ}Js0A7lk#'^r6 )m<;υ\鈍'حxdt൸7A7I?Ǖ/ ʧb+ߊ+흏$bk |\b.>KF,Q@d9ҾD,I?&F7gL̃D-y'y:JmWڭ"Az56?K rT _]hѶqT8f$}+:= |)b`)z{e]C1!̏;j+RCME&DF`D\@"d>ȡ({)N;)NŚ.E `1>Kf'4Vu jRa[K̒ٓz >\2& \-9Co~|>[Qv1OFMG?+$z;n>0]8&:;[wo[%xZх+)iDXm\E6{MdcRT١84lت M<(Hxq$iI mII;=H2ȵ pMI~&vPX 6iEARǓ0it*'ܻ(% H DMvXH|EfMQTEd$:AXdNDk/! r](H2zZaw%(4߯hb7چe.PDHdI$qP+$DK]y?' Gx" zhhPOQ]Shƍ$pa_`z ,Q6h|(\wt,gєOM|oUi]|L|~M>Wq`/ !ɬz_GY4?z3嘸zG[uCYvV=-mzzLۇ2^Yiz3>SЖM=Ak W#Oo[0~ЏK0;zxJ񗶞">Ŷ"z4aKv=v rhA^ă˩'xz oʡGK"D.=|.7ra$C/?ˡɯm|&MHlCσϩއͦq5Fϫ_@Sݎ9m66nw aC?{"k~7_Dkɱ]Msp]c3 iLc-N1vx 8(ppt6m[Qc6{zD=輵9isF6C7ls]|*u5lvDo/gPHv,z\)]`c 4\D:ku^;;}K.5vb*ݦ} 17hUag`gFZ\.ReaW> gl?ƐD{FM;S(&3'E]hk}x,&uˉ13r̔6ERh1lj6njc;}T?ޯ.=3h?-x>(_XlUMW yMcHT;]F(mȉ,dZܱ~,xĶ/JvnjP_ha7SNScæ?ʔ {E:u|3zIEvi{O;"239ҦVA$;uȗeEOtQ_9f\{ȿLu gR&_t8%p7G_4'B >0 ||\~JC]zH_A_?u(m<^]la9AxmӘxeǛv;`+q'O7ڵm<3JǠ0,XBG}3,\f?F|dיW>u|g9|`Z|A`n>#R7_~w^yveY {𭁿yY״Y'U`|O;v9ꅯ]O Q}+Qϸ;q笇{$tA-ڹKO:խ7-K ԫ7O=y.GKwח[/wzz;|xoj[񣠥7G?P]~'?`dÉ(?nygq{&nsn4nv*-ocׯϫTIxg?_|ΧO endstream endobj 111 0 obj << /Type /Page /Parent 3 0 R /Contents 112 0 R /Resources 4 0 R >> endobj 112 0 obj << /Length 753 /Filter /FlateDecode >> stream xVMOA ϯ·ww *P[&RJS@Ig<*B/l{9XuEm-l'p:SFcN)] +V vlD؀ QID|h sPp֣!|APDK/Uf}C%lTGJX (Xg{sc&+_S}17 Yѥh!hoHƉCK"81f1{NSbJORURCO7IcD -wܥ`) ShhѥhxTF<\FK L3K?ŗ-:5׀E#|GcߒyU/^[мm6]:lOo +hSݞw vgNIKƖmHxA@Ub/i #1y> endobj 114 0 obj << /Length 3636 /Filter /FlateDecode >> stream xKWi]5%PRqbkZ{U}"|[ks咖o_-?.XֺTמӺ^tų۶n۶_7˶떖/ ikkICVԖ˳Gi=&޵ux =𮽎ճ}l/u_6G^q;1`ߍ1/=1^}{oӒ2R<X>?ayn(^{?eۯx{>0Go/Gx{9*kɔo?ηru|T{큭3>޵ݿHR,w/ݷOdq?]|W/~xOYa+=sgo~~Wo^w[L~Lֺ g3]<3ܗ)cm;:68¶ͰǾ ttaXf~zxka.n qDm[58Npf-;Ճ9)p-9i;$LCie?TSp"cHޞ׌qy=u_ۺy}m6SX;D}wo}0) z\y0~,OLf\ym~۱F_f󅉭 9ͯocfI0j6g)ͪ6ץ[&aTBJ7I|zBYDb]Oɲer1:b nQGeQ ٻĉxm3a0#\O'7iF<z!\OYxțE<ȈГex#xp=qI#{(F䣅 ɟh0b.`J#I l'T'~$^x='G"OjEMjSo5DKO/X!,1ͮ'kA DR0M#i}'V{\he>硿Wy}bG5Śo#xX)z<$ңXzKΧŊEx+ނg<bųX.OOH]t]tX~).z:V.z:Z.z:^| /z:X&x#qgrәg+f>+_|.W=z@\zD7ĪGUOq>!q鬧墧 _t{bՃbՋ_G ]tb_s?< vS7ۺQFVn egNݷ[|$ ߼*<]`>L+; \!L[r(}ngZQ3EN.?C*~\_Rv^7 >3< þ'7\u±;W5ߛUޝH9Y9((^3|XyX8n3yg\خy0;38lw>K5پ~vTŹZ -ٙQiV.ܜo&nuw$eÞe};La9mvWv;\e:,-Œ'LqT.a̮g;Θf;dgfdnvfJ|0W fKsF}܎M/V.-WX?f?c9W-g/eY)9t yb=]뇗\O^]Rwtf\e~E}|qFNp|U6XV !~msnn9 }h&vp>g.c`XgGrH[,=3zE"vI Ilcക.ж܉-JW-x3k2R'FQ'I[m([U` *$bpƇ}X'a~aV _Kd?Nyz'gXks>Ě/oCk=z<$ңXz zKbCIx+gb{B,? ~#WbY;P, ~*ߊbbX x XF|^z@zAz"xz^ X8_⬗ĪĪĪǂg&V='8AEIYU/zW.~qYO;vl&_U۱{Tm=vkte_n#磶ݪ4{U`!?.o$)`"~z7Nlendstream endobj 115 0 obj << /Type /Page /Parent 3 0 R /Contents 116 0 R /Resources 4 0 R >> endobj 116 0 obj << /Length 3459 /Filter /FlateDecode >> stream xZK_1KXd2ӏ-(HĖ@,qm96ג ,{ϭofqT/p|qJG3#txH 7Ϗ?_>;>pu'-񿇯>_pSj>0%\Ǔ_Y:Ϋ}@ /jS;s2ʙ4'tV>熗ӿ>߷^?{#D% +nx$˛??_X:/~yOKzT՞隅 2kޱO=Wg fwKv; "[B>釷 t5kuu|28 SO<iy,l`[oBC}A,A\O \-{0O`_ "QY>H$| a\7MH._E"|=X=DTAU# zͅDn ⴤj 5Q،O oąo|~J!q/z1֮/lJߟ-Ff|55*v|GIr'ܿjOtw7X6b~[jqßp{@<4GJw`z]!P(KOqz g}QrOtk`sL= xzz878Q;ezT N"w'>H4i$U6`&nXJud!BE2>!)#2"ˇo3ohylጳSK#gs. E+ǡ>1b{sƄg_u/9M0as ϢT\i, &8&Mx:G(NtORT\i/\02ïz+#&{.^p6`af7_/<"M:6e45h(P - RHc!;|3FqŲ0HEO*Si|ro&m39OMє|>EhEO"SD=D=_/a'Cܮ{>Al+zj_-60 nN~`-Z!-I8\;?ɵ)qIO&\Ow~hR|:D¨O"O"e AۖOv~CWL L/]5bS{m Z$jx"98R$GսŃD]\8}O$*x%|hVf5߀[vD>_[CYBz`^1'^X\>X=>miBW= MV\(OQo!x1_Q->4.;:V\c(_|I+20|[ }hU>&_3K艭|O !1>D8o7Ĵ~D_ -Cb q/eLOY%lƴC{jC4~KO_HoG+ƛNϏ`z饞|z͡OXC5z#EܘCIC7Q"(ի(Dgo].vz4:]+OjUSrz|CuiIvjG `iӷ@oڕj[1^,|'iu>0!qc(L^=/]_Í Qt}cB?B&ʵh ҐONA "xdL,l&.p!x^h>oS]gj_Fi=2PhZ)v"zNꝁ7$7R`b@H(MGGb|$O>K]>.*}eJ=_OSOM'h|O|~@]h_W?o֯\?9~!r/iBF 3gVfr~rZ>!@OזMot"HG8P| RjC~U/ޯhzG1E"Dz㌥w#Dӕ87brՓ4/T&oUxJ8_:=]8hzwڦKfzxGz0ڸ Ey߸X%?*[|X7(;ߠLK=8/?yo^}E# endstream endobj 117 0 obj << /Type /Page /Parent 3 0 R /Contents 118 0 R /Resources 4 0 R >> endobj 118 0 obj << /Length 4160 /Filter /FlateDecode >> stream xZˮ%Gܟ%,hwUfHfFb``aXz=?`1wn:]쓮ϯt}u}*~jr^noqz}ݟ~ٛs?s?|G_z9}J?!=tz`=}cpok=౮㮺ݚý.Z{^ ~Gݗ_>]t̟/x/xWz__ozG]p x?cןaԻWKWƒ_ӟj'>O!{kgzp?|$ o$ >}6W㯕>V')~yd=x+-?o~7y/͔՛ \Vs5L<`>Qk2 p0nޮgfw` tqM '$e$X$쾊\^+$,4d뀈On'–qQnLqŅ7 {߯qc,HŔc#{w2n,Z݉4)r8k`q0O75GTbz03|W|GAl7Vok6U O>'#ppug]OXQoZezԺY]R";]>W-dg$#W%M]B U VNZ=UvDĽn@a!y+bʭ)0Uѡ?MUƇ-f?ui[)l8 ävHi76[Rz: DR >YJ[}\]Vp5*&TȰգuO_>x~W6=%о}{5n_$w[xo>_e L=߿"`{^a6!cԾOG}h,p(#4 oOd! Fެ K,h2m 1"Ҙ Ddę*hDE"~ FD[Ԝd24 M[ 3KDbdDi @Q_=/aO H ]0d'#rbvQO eb#:ecHٳPy  '_~ՈA/:?O)$3”MR-gAS+ g.!q:uiS]o01115+G=cYg'N ѫl@Oc b[ gz;l"ּq>Ӷޒ&&KCs̗SId`z8COodG=:^E>/=Cw5[P/[O᥷h4zly6x6B7A h6j}8ߌ¤$Vp g+Χ6L#r14clHlS908x~ԇ&Ĭ;ՊI}H+k$xExR]p0_ʀ+zZƱEXm\GZ#Ԓ-\b.~[uJoZ؛zdweYJrulw}cb]ϋ&lG~[A_a6yk۞DV._JQٶ?R&yǃ%rƒpxdgśzx!ثx䳅JEwk¸g(HG)EX|u,nffK qj*NjO"|R%X ]J{g*6_|U؋oU5pX|N5C!zBzCGWǮgwk==Ow]mG&NK1U߷ ^ f=z ,1+3;߶1K~+i)K[o1m1{Կ`{gǩ[S/+rIԛ'NS2Ы![Z֭wwS3M>K]z!V#{zݾ<׶'z؏~G@Mih닫pjUB6[ޓ?kIl叿ⷬx6endstream endobj 119 0 obj << /Type /Page /Parent 3 0 R /Contents 120 0 R /Resources 4 0 R >> endobj 120 0 obj << /Length 4279 /Filter /FlateDecode >> stream xZKq_q^H _[I!`8H& 眪e dޙz:U33=}矞e\>\OMz_?zo/__~vzH|=wظ?"վKWƒﮒjzwO/#1!tCFze_X?^?l8I7Bɂ d@|/nPck`9 S*2{SАIJò"zU[N2Ɲd1ёX3vo/ 8uWVVꕸɎ]qu0 rr3[ l!6%DXB9ĉڰEM|IKʽ\8n?$)6IMO0h~"m|ȇǿ %wV8BF(;,LJ yEHԜ7gNiBe[~ ,!h(/af3*U 31Xj䡄tj$a졘y⡉pQ"t+IazB_O/۪a87gmGoT)s4a=¶l80=0Q[$*-S3hY#Kf)d*0CQzǺzlSj`AFj#D2.u2AE~KP 0թ!C֩2ATJqpA:LC r֩I$EJH"0 kK+52IYioA#Uu-H,AQx>q=$onoA^50Y)Fۯ!ejpѝXH"ƍa]$0S- @ +k>@Cs?F9Dl{b2~ -?YwՍ /ю'׎7~c)WvƳя|1_;HTz[XW #M^|P=_s>|S|TśW"Hz]h!i|Z:,7| W94<|w=;nz"=z*ף֭reUjYRO>k!n~ba%(`yMgrZe|HbxZZ0LjF|sKj#%őG[pH-呟ɺ %\`o9{T8\S $1>tXb##ϟ+yh?/{a][vwX~-ާOW1ScwCchpcQZ"e-d0? \2HPS?g0p%.6vzd>0Ghcy O "#,VA$*21*%M^3"Zė%Yhhlbf\'R #Jk`bD~ SFbB##8B~Z(Q ՉG+C_ddG̞uZklh8yFD bvq(4l~J!_ll?ʞX!Pe7frQT_΃Py1(p> b W2 0/Z` _)beccx~_݄+Sy>ֺRFK_ciO W68RvE&wRV*X˄ZnlJ,|D~ mшc7 6*H:Qcj# _И PXEaFBOEd#aB1@}rQh_|wQHJ@PrhHH7"=vFb#|wqpaU_*_$.#m ج \3qf}?v8PR(q*vB@"Q[j۞eoE,)nĵ "fcԎ$*OhGu_xxe"0❃3`| C#GBUn5|&0gâ&\`b򉸂_| #X|$+!|f7&y!1ySboo׶~D|oi v f}D^zq8q^>g.!q:uiS]o01115+G=cYg'N ѫl@Oc b[ gz;l"ּq>ݶޒ&&KCs̗SId`z8COodG=:^E>/=Cw5[X/[Oc㥷h4zly6x6B'A h6j}8VⲺXju;qV0VKxrWv3mCPJ8)tE#PndC gdAnŚr1)-a|6jM ` ͇H,zS Ťƃ&/6$bEr"FE}#2R0:򉍴mvf+f^C>Tt3jj&6l#LJbeIp p2|jC4"7iC3m͆;%3 [}hBZS[klOԇ4AK \Q[0'x< e[ԉՆ|uĬU9I-{<.VkO!퇽U6y jǓZ|DbO{WCZCEk_-҄Ls9]EHwƈxb C[ݳe$z+zTkus`._4ak?@=K>u^{;eM_;zϰ4wRʶI7;ӎkœ&=+m# ^eƫ&-xV*]ƕ4,?EDOtD:M)Gӯ#_gq+5{/5],>` WS1>^|{+'\| ={E0RBM>U؋oUm?Z]8,>'f|Ol!jBg=!g!lq#r+c3zԻpp~Ƕߣ^㡘uvyYϧ}鿩77 =BL5 E3 q>m=DL3o%M=x)u-M=xco1K1^lx~zN5"_ CO2?d>wz&^e>znH<>zoeY9jKYHu{ym=O~c9>S~|'lˍpɏ5[2ѓ>❬ʟ~w?5yRl$,u7|ś?{ׯ޼7.U׌\endstream endobj 121 0 obj << /Type /Page /Parent 3 0 R /Contents 122 0 R /Resources 4 0 R >> endobj 122 0 obj << /Length 4256 /Filter /FlateDecode >> stream xZˮIEeFkZ+qm0ܲF01Y'wUecŊ_??YuɥԤWOi*C~~ы}<⯭a}'{[3eg{aǣ=_{~WǏ_Ϳ yyϿ|U$.g']^.R^/<]2Jf򾟞_zGbC<醌YX}=c=^{$)d m$ ?}W:o?޼wf2w77ֆN{PA'Tk -W~_|?%8/{ m/{"!z{O`buc0a 0  X 7c;p9x#_@L'V<>V>79A|zW7T œ>'1Uh03|W-|GAl7Vok6U O>'#ppug]OXQoZezԺY]R";]g-dg$#W%M]B U VNZ=UvDĽn@a!y+bʭ)0Uѡ?MUƇ-f?ui[)l8 ävHi76[Rz: DR >YJ[}\]VpS*&T$>xlzK硍{l*Ivyoa{xn>_e L=="`{oa6!cԾRG}h,p(#C oOd! F^•"MA4FY3<8XMPĜ7zψhk_Lf}6!i1ariHY샌(5 1Ke3,NA< 揌bDN. iLlDU_0T'l Ibsu1{_j5ݓ¯񺿲1Eǡа)dvQIBB ({b@!;t E6Rq%  ;;6CaSƠ $Rb(\jL<_Ɉ'`_`L>j)jSW/ޏUN_؏vdO!KF[J- >Gu=)_لJuKZ/b/ jeƻ 1+ %&F#3_hp6X#٨ 6r+F_p钍 EFE!**BzEa#!/߈$i\[cwÅW U~wpk_ʷ5N/`6b2z~ގ5 ~HzBAP1ڲWlި.{(fLlv#o1.v QجxF8rc+Yx!h 3_6'&ͿV>rg3;7@ $oO#I^&_|&C661ɛϓ/6k|Kl||L\%{Hۮf1'b#Y~g=ݬwaUQ/#N?%z+ׇYY_998=qҭ^eԷx[okz8W83H!f5歗󡧈61YzzczOb? ԋĹzrx#&;ta|*xY2o;QzxzyX=zM_/-Gig[ϳ#@A ZyEV+ǭ?mr՝V G'ӭɎZZ-1_Oʹ mgC)즗AXC %ħ u["mCkm¢XķXې;,֫.66t4"uN1/4rؐnCE:p!p(K$jkVJ'6Ҷٙy9 {`-PޫEnM8۰0)%1ʰ 5ӈ$G XA:6[| 0 o 1kNGn9}RpI/-p=^Gcl&Ojkp1rN+>^ iz`9t/>ؗ&dCϑ}@/B [7Fꞵ,%Cxj3K[h2L[F>Wb\̡ݴ|kô }9LClױZlhTmknj 3⻄;ړ۶5 tn㩙U;Qty=xF&ݮ[ ܽ7xVO͆M[䘟&AZoa1Ҟ݈RY/ԇ|ʷ9H ې8;O^zj!>1W'N|>E]p֣\k[]'tX [Q_yxP,~؃Mi/kڶ{էRTOԶG|v (\+4Yh+i*3^5laƳRQ0|a/&*|#ґoJv>*~>[{*gaH='ߨ |nR^q)r!g_ TPOU%[U6c |.~M'@x}zs8q9q=Zzhzi8zj]om?ucQR̾uvYϧ}鿩77 =BL5 E3 q>m=DL3JzR['dzb5.=xqA;ԋzA8&ԣ79*qֳu]E]w~S/R&ȡտ8ޅ^/ϵo='? /oSu>r?z-$kk;؟5ubm#_y3x﻾x_~>?~endstream endobj 123 0 obj << /Type /Page /Parent 3 0 R /Contents 124 0 R /Resources 4 0 R >> endobj 124 0 obj << /Length 712 /Filter /FlateDecode >> stream xVMO1W5]WPJ4+8TiZIE~ǞD.K̋ W`5j4Tz)byу2h:;s g>N3dna'n|ܞt>2\al [3Mڈ# z?nulWlwއ1 xZK-Ed9ُkk׸S7-%SK)}ݯV["_|v[.?tG)Nwfc)8G̗ˏ?w)U@bC"ĥl5y$?endstream endobj 125 0 obj << /Type /Page /Parent 3 0 R /Contents 126 0 R /Resources 4 0 R >> endobj 126 0 obj << /Length 4200 /Filter /FlateDecode >> stream xZM^ ?.aZ敺@,JJDRѿs } ę1c>׷/W[ҨwMxt/z|o#!gſ|WWG_-z3^zn<ֳޡu7z ևyku7^oM{ͽ.0{}xigwO?]1?_4Yqӛ#ӷ?>By{Ç2n'O^~S۸.RV+.M%߮5ۣ[H7n0K'X^{$1Vw|ϝ$@k_~WG߼}WaRw㫷~ݫkC'ӽy(NSU\I9/~˘jZVRީ^)Dxadl0|0Bc0S0s2T7StW|5 3Sa"bwؙ[l=6B rG_wAQu !>$ 1Tv_bhwuZ" l; 8HGt'xk|^y*~nPϾ^) ]V^Fd 3Fz wupv_?zla6(j fj|-*3 BtvddVV'M8l[nQA\:n‹Z #eb9"3nc9n¨=vGuE" cDm2%}fv0'"pJyĝxq#zut{cdNJIV=d`X3#ZY@;Bxڙg [4=d[2VQD( :}s#G aw p>@j1ё<G2@e2ҧ n`^˓1z- k npF@**σzUݹ!ਗ਼plg!'qaጀδ`6`0lTm5_oHJ26Z_τ:#cƃg}P1>fYI} s0Az6/x6 )m<;υ\鈍'حxdt൘7A7)x/v+_@@וOE=V;AIt38$|]|bX|Q".>J#ϳV2jZt[0lh/:Ȓ&vI8+db$؊w8QDw kg<,1Ql]v-q/>卶Տő61k'ϓ"0_gY-mWܚ̇`o@S Q=_XKr(&U1GmU+آC+^/Pb({)N;)NŚ.E `1>Kf#4Vu jl vö %ճ%|d>L@|5@(Z5\zz6psՑv1Ql2dM&L}vʆz=Z&)?5;;,?e{||oejaw8JMafp) :oE4 J5;HaEVe08ـECA‹ I'H(LRLhKFF APV+ n%tMP+ I lҢ yBHI K$icvQJ" 6!t{ @v(~ d䣨&.ILuHPD".~tQREAw'!vv^BFMF۰lQ=YhhO1qP-(3h+~O8" nv0R~Mm$U|HD6'I-yH^-ku6';&Ifæ'&*ux f^j8ĊO`1 2lQO,aD'Np?b i/~25+7mI1?e?%M;ua/~ܸ l}##EXRK&|hlzOT{he={ 0нgcjpj<b-Ohuzx-67I7S;$zċG<ٍ?wAcOͦp&ѱɇ)|I3'Ju1mk55\{=mU Ifea: mzDYhף m;"qK`S[ҶǨǴm(35O~?3혶^'/z Aƶ+37:#n=D^z6T=~Mu;٤৯݁*ϵ[ l Yn"B^ooK f2:J8m:wvOcA?isFP6oyfF(myksLAް}lEv<P\_ΠdYR.zhrK63br*3 꿙xu('ѲC6]6mol'ن,^}E\2ݮGy%0y9 G[_v弹mkf4MNmSf%7ԓGnSUӴ>f|۱n~1؟PދϠT}cUr!V5i_ac$ QAxC3^v}r [tI^޳ )\gV'|E|P똑?qh&?UC îLu=m$z7^uO~xey4uW)m<^]ta9AxuSxeǛv;+q' okxT$2g╎AaXxvw]9;4c |d:s&"^gj2"\q;{ Ce_ߨ')ǕJTL.S?Ӄ/U /OUۃoM>ϊnOz<\{Q/l=zb]o|Gzd^zQx>;g=9njG=Uz~[`;35UtsƗЬWEK>@<]z0"ЭGK 3ꧩw?V/=4w%;Su- c$&[wl#ѤCjPo^`˗4"[o/Wio^\zOp/^6N=tvpbjԶ^?GAKo*~%OkWw5~Ȇ'x3UQ~ݲ"X&n)snĿnL_aendstream endobj 127 0 obj << /Type /Page /Parent 3 0 R /Contents 128 0 R /Resources 4 0 R >> endobj 128 0 obj << /Length 4169 /Filter /FlateDecode >> stream xZˮ]Cd5%PR&؈~֪ꗍ`[w?jժUuN>+;UV4]%59]]^/\>y;p?|w/G>ÿ7\{ ;XPד]w[澞jK\ׇKIw0~qo޼|oy<+&gxrX/zjΛ=\~Â#\*zw_͇#a%]Is}ɯ'z\ sdžsUD*ُ߿} />+g<߿g2Ap߬ i*"Q`ľmΛ|XVi-SS~"ca"0dLfzc5S.w{c2S^LBp?8y]D6@/3Lv@\Ɓ@<GgQ cgȨ 02M^Fc# ,42ܕ@aa2FȒ`I!$nsFF',R.CF'?d&j W.i! '&$!gôüHއMxNy&ڍv|"Ul6އџk=mV~`g=_q:bx8o,GVU63jm@v]v-q/卶Տő6kPLpRTx*26)PlpX܊"d>6ފD '[کX׭h=P[f#ʭ8e+fUCQÎP-AΒd˲yDilzϋ硍{}YiZ N Apkxo_%j|X}<Ғ6id)%h6t01фS¼V/$i`ʳ!K7OdfWE-m$W_M5rЪDliK[ʖ5ߔ mM#hSnS6&ҧ,3Æ^Jy4m$Oic?,#sYdy,-QƔ4Iۮw/{/)U\.bS@_Z>N2Lf|Fབo4wi=mL|:d|0 < N^u'O2&+Yv$?H.{ m6GV֙ <D[g~(%Uɔ&G8o3~5ne\:xSZ9TG~hBlQ*DF:1/:)pE Χm:т8ޘ(xM꼞G܍_7QH||B^֭ *+I ~)m>ML/c7|P>`m+ڬϸ0s7Y|(KڬߓOy0?Vt s`n6q:cY/hwDжYWQ$]6Ӫf]zj9eFCzN[u{zvL[/|ol[0>m!їaSz"1v3Ϩ[ocb5s̿v=~b=ؽ~/Hz!zً^\zm] Sc;2zƧS/f[z~y$6~y LcDNmz|nw nKS$Hn!_,>,mͺv)K>&ؔMatK7sm Cڰ9%q P&ΊӧF5+_6{>r$3NlǬڡ4O3gz;hԢ WCsF?]>[Zޒp,I󠏚lm6C ^5_}C:Niprz-&y/+^^9u G9ᔖ턎 Y2k^)粕;_Sg:Snf]Km2{rpUq5Ł7INaeWk൘aLoėZAF9.V#u:Ӷ|a|2l/밑O;}ǿh _nrTuRu2Vj]hq/lC\'y8l$wr Ґ >t2(o&?U7]I~zr{=4ǽ_ڐ{dŋvO.,e6rA{ /ٮLU5.U77_-b=63\9AOi.Gi{zs0둭wף|wu^^_ GYovcƃzjkƫ/ۡYrǡ'kSO'٩Gg3S3ꧩw_ք|v~%{H[Oԭ/OSlFʇ#qP?NSHM軨IJbQo,J>%z[zwD/^6':tS_,=^S;z~|-h}VT_Os[+l8Zb(nYg̰y[>*-ki'X=!ߔ=I}{fs̎S "O_J~?1endstream endobj 129 0 obj << /Type /Page /Parent 3 0 R /Contents 130 0 R /Resources 4 0 R >> endobj 130 0 obj << /Length 4240 /Filter /FlateDecode >> stream xZK^ .aۙP[&R) JBI=Ǟ!H8s3Ox}}}zUU/ztIwNכ?׼ǷGO!\O>;>G>_?"/7Pn׫BUTדǻ-Xz)Z汮.<{5u7hSX<{{nq~ÿ޾ǿo~ {o+&F> ;z@ǟBy{/˝eߞ? v{oO >n_vrb_viJ,*Pm=J5|<6wևYʝ|=0[>NS [h%Ypo/w? !Z?R>xg߼͇_O?yx_ֆN{Pic#\piY[H5zzj]L[:6PLa _MKwHp\D Lچċ!ɖcgGoH 1}޵Ea3`6Pyڙבjp?T#mӝ?k;y.[s$^\A=zt_/,3tzv[ymGxy3.#O]_pF؉n~N\6X՚G/RfTόѕNؑuV9Z/[7fmFDt wFrn /j%b=ċcU:sɋ n&M/%ݶɈٹ )?G_wNō1"=Vw;1*ɃBV$Ycd(kqf!kg9pcl!o#[E J5NQs6ՀI1zWMjPHEA?`t W' ߰N O|7?^r#6`~ RO<]ҁbxݤxyv>f>|1_W>5XVL|%!;_WЕ(wuX5bE&ǃo[(훏@Tvp8VR;k-,ś"o[1h%aƲ6 Zb(fTϖKg0xjpzPUGצb'k2qg&G?+xh\V. _D&:; ۻ7YL-{[•I"}l."EA&ATfGT١4lت Q<h(Hxq:$iI mHH;=H2jjE$md5_"jep!)MZ"a O)IcI; p~bl.JI\$R~&$nnEo2Ql`|D"=N8i#(V. ](Hq$DBKvqQ袉h-j@' mMq)fu⢂6c9%efwmeI`S$͎')<T/O8E$xV-?x?aՆ Q RԒʰ㉎yc"$!&)9x&CLD|pM<ȇ&_j߯|x꒐iA>8Ȃ@/%/ɫebF$vǓWڀr# ܬu$DOb"!+|T ǓX0 "tA͡4 @%L~\GQ:ףtmZ/:ju~XK<,{ Zkj2^mo MR$bxvog /'=_xˁGΦNv.6=v>P#_``;xc=[[/&|wnM L>,6h|&(\wt,go'_&L>e`ɷi]|L|~M>h^|OBeCY/hwDXzCh+g1qȮsR;Xm11mʌz_g==L=@;x~>o ˆ^Coпm=  MNc[OSgԭ|MkynzH< [/ԓH<97УHDWl"m6tz905C/?ˡɯm|DMHlCσϩއͦqGϫ_@Sݎ9m6:ynw nSVB;Dn--t=Ҧ9z4®>C Ҵ'Nc|ӧmplڜ[Q1 q==tڜisF6C7l}]l=8|:Oz;T73(wv;YA;.^mn&ctjkp;}3a]jFw:NUtûMی#mbHNo`VV͌\ nGo&a]8 gl?ƐD {FM(j_XlUMWuyIc+HT;f(#]߇V]lt_/پՉ4d:fϧS2)X; QNb%|cO|(/m4)_[')ne|QJLg||Q]dچig$L5JڴqpJ6rW R 6TLxQXBА}&N0b5h CUf(op>eES}sTE3"TgO/OP+a]OǍW`3@Y}6B]UʵA|.?iCnx&^ghwT&^F|dיW>+u{@s|1@P|7*GqlR)~3T/>KUS[|"ۓiO>Wv>r [Oe>QWqz;Yy~[gQOޮnG=fbnp*O[Y8-e.6MnW?2~#FRG(E~_};O*Pendstream endobj 131 0 obj << /Type /Page /Parent 3 0 R /Contents 132 0 R /Resources 4 0 R >> endobj 132 0 obj << /Length 4240 /Filter /FlateDecode >> stream xZK^ .aۙP[&R) JBI=Ǟ!H8s3Ox}}}zUU/ztIwNכ?׼ǷGO!\O>;>G>_?"/7Pn׫BUTדǻ-Xz)Z汮.<{5u7hSX<{{nq~ÿ޾ǿo~ {o+&F> ;z@ǟBy{/˝eߞ? v{oO >n_vrb_viJ,*Pm=J5|<6wևYʝ|=0[>NS [h%Ypo/w? !Z?R>xg߼͇_O?yx_ֆN{Pic#\piY[H5zzj]L[:6PLa _MKwHp\D Lچċ!ɖcgGoH 1}޵Ea3`6Pyڙבjp?T#mӝ?k;y.[s$^\A=zt_/,3tzv[ymGxy3.#O]_pF؉n~N\6X՚G/RfTόѕNؑuV9Z/[7fmFDt wFrn /j%b=ċcU:sɋ n&M/%ݶɈٹ )?G_wNō1"=Vw;1*ɃBV$Ycd(kqf!kg9pcl!o#[E J5NQs6ՀI1zWMjPHEA?`t W' ߰N O|7?^r#6`~ RO<]ҁbxݤxyv>f>|1_W>5XVL|%!;_WЕ(wuX5bE&ǃo[(훏@Tvp8VR;k-,ś"o[1h%aƲ6 Zb(fTϖKg0xjpzPUGצb'k2qg&G?+xh\V. _D&:; ۻ7YL-{[•I"}l."EA&ATfGT١4lت Q<h(Hxq:$iI mHH;=H2jjE$md5_"jep!)MZ"a O)IcI; p~bl.JI\$R~&$nnEo2Ql`|D"=N8i#(V. ](Hq$DBKvqQ袉h-j@' mMq)fu⢂6c9%efwmeI`S$͎')<T/O8E$xV-?x?aՆ Q RԒʰ㉎yc"$!&)9x&CLD|pM<ȇ&_j߯|x꒐iA>8Ȃ@/%/ɫebF$vǓWڀr# ܬu$DOb"!+|T ǓX0 "tA͡4 @%L~\GQ:ףtmZ/:ju~XK<,{ Zkj2^mo MR$bxvog /'=_xˁGΦNv.6=v>P#_``;xc=[[/&|wnM L>,6h|&(\wt,go'_&L>e`ɷi]|L|~M>h^|OBeCY/hwDXzCh+g1qȮsR;Xm11mʌz_g==L=@;x~>o ˆ^Coпm=  MNc[OSgԭ|MkynzH< [/ԓH<97УHDWl"m6tz905C/?ˡɯm|DMHlCσϩއͦqGϫ_@Sݎ9m6:ynw nSVB;Dn--t=Ҧ9z4®>C Ҵ'Nc|ӧmplڜ[Q1 q==tڜisF6C7l}]l=8|:Oz;T73(wv;YA;.^mn&ctjkp;}3a]jFw:NUtûMی#mbHNo`VV͌\ nGo&a]8 gl?ƐD {FM(j_XlUMWuyIc+HT;f(#]߇V]lt_/پՉ4d:fϧS2)X; QNb%|cO|(/m4)_[')ne|QJLg||Q]dچig$L5JڴqpJ6rW R 6TLxQXBА}&N0b5h CUf(op>eES}sTE3"TgO/OP+a]OǍW`3@Y}6B]UʵA|.?iCnx&^ghwT&^F|dיW>+u{@s|1@P|7*GqlR)~3T/>KUS[|"ۓiO>Wv>r [Oe>QWqz;Yy~[gQOޮnG=fbnp*O[Y8-e.6MnW?2~#FRG(E~_};O*Pendstream endobj 133 0 obj << /Type /Page /Parent 3 0 R /Contents 134 0 R /Resources 4 0 R >> endobj 134 0 obj << /Length 4240 /Filter /FlateDecode >> stream xZK^ .aۙP[&R) JBI=Ǟ!H8s3Ox}}}zUU/ztIwNכ?׼ǷGO!\O>;>G>_?"/7Pn׫BUTדǻ-Xz)Z汮.<{5u7hSX<{{nq~ÿ޾ǿo~ {o+&F> ;z@ǟBy{/˝eߞ? v{oO >n_vrb_viJ,*Pm=J5|<6wևYʝ|=0[>NS [h%Ypo/w? !Z?R>xg߼͇_O?yx_ֆN{Pic#\piY[H5zzj]L[:6PLa _MKwHp\D Lچċ!ɖcgGoH 1}޵Ea3`6Pyڙבjp?T#mӝ?k;y.[s$^\A=zt_/,3tzv[ymGxy3.#O]_pF؉n~N\6X՚G/RfTόѕNؑuV9Z/[7fmFDt wFrn /j%b=ċcU:sɋ n&M/%ݶɈٹ )?G_wNō1"=Vw;1*ɃBV$Ycd(kqf!kg9pcl!o#[E J5NQs6ՀI1zWMjPHEA?`t W' ߰N O|7?^r#6`~ RO<]ҁbxݤxyv>f>|1_W>5XVL|%!;_WЕ(wuX5bE&ǃo[(훏@Tvp8VR;k-,ś"o[1h%aƲ6 Zb(fTϖKg0xjpzPUGצb'k2qg&G?+xh\V. _D&:; ۻ7YL-{[•I"}l."EA&ATfGT١4lت Q<h(Hxq:$iI mHH;=H2jjE$md5_"jep!)MZ"a O)IcI; p~bl.JI\$R~&$nnEo2Ql`|D"=N8i#(V. ](Hq$DBKvqQ袉h-j@' mMq)fu⢂6c9%efwmeI`S$͎')<T/O8E$xV-?x?aՆ Q RԒʰ㉎yc"$!&)9x&CLD|pM<ȇ&_j߯|x꒐iA>8Ȃ@/%/ɫebF$vǓWڀr# ܬu$DOb"!+|T ǓX0 "tA͡4 @%L~\GQ:ףtmZ/:ju~XK<,{ Zkj2^mo MR$bxvog /'=_xˁGΦNv.6=v>P#_``;xc=[[/&|wnM L>,6h|&(\wt,go'_&L>e`ɷi]|L|~M>h^|OBeCY/hwDXzCh+g1qȮsR;Xm11mʌz_g==L=@;x~>o ˆ^Coпm=  MNc[OSgԭ|MkynzH< [/ԓH<97УHDWl"m6tz905C/?ˡɯm|DMHlCσϩއͦqGϫ_@Sݎ9m6:ynw nSVB;Dn--t=Ҧ9z4®>C Ҵ'Nc|ӧmplڜ[Q1 q==tڜisF6C7l}]l=8|:Oz;T73(wv;YA;.^mn&ctjkp;}3a]jFw:NUtûMی#mbHNo`VV͌\ nGo&a]8 gl?ƐD {FM(j_XlUMWuyIc+HT;f(#]߇V]lt_/پՉ4d:fϧS2)X; QNb%|cO|(/m4)_[')ne|QJLg||Q]dچig$L5JڴqpJ6rW R 6TLxQXBА}&N0b5h CUf(op>eES}sTE3"TgO/OP+a]OǍW`3@Y}6B]UʵA|.?iCnx&^ghwT&^F|dיW>+u{@s|1@P|7*GqlR)~3T/>KUS[|"ۓiO>Wv>r [Oe>QWqz;Yy~[gQOޮnG=fbnp*O[Y8-e.6MnW?2~#FRG(E~_};O*Pendstream endobj 135 0 obj << /Type /Page /Parent 3 0 R /Contents 136 0 R /Resources 4 0 R >> endobj 136 0 obj << /Length 4169 /Filter /FlateDecode >> stream xZˮ]Cd5%PR&؈~֪ꗍ`[w?jժUuN>+;UV4]%59]]^/\>y;p?|w/G>ÿ7\{ ;XPד]w[澞jK\ׇKIw0~qo޼|oy<+&gxrX/zjΛ=\~Â#\*zw_͇#a%]Is}ɯ'z\ sdžsUD*ُ߿} />+g<߿g2Ap߬ i*"Q`ľmΛ|XVi-SS~"ca"0dLfzc5S.w{c2S^LBp?8y]D6@/3Lv@\Ɓ@<GgQ cgȨ 02M^Fc# ,42ܕ@aa2FȒ`I!$nsFF',R.CF'?d&j W.i! '&$!gôüHއMxNy&ڍv|"Ul6އџk=mV~`g=_q:bx8o,GVU63jm@v]v-q/卶Տő6kPLpRTx*26)PlpX܊"d>6ފD '[کX׭h=P[f#ʭ8e+fUCQÎP-AΒd˲yDilzϋ硍{}YiZ N Apkxo_%j|X}<Ғ6id)%h6t01фS¼V/$i`ʳ!K7OdfWE-m$W_M5rЪDliK[ʖ5ߔ mM#hSnS6&ҧ,3Æ^Jy4m$Oic?,#sYdy,-QƔ4Iۮw/{/)U\.bS@_Z>N2Lf|Fབo4wi=mL|:d|0 < N^u'O2&+Yv$?H.{ m6GV֙ <D[g~(%Uɔ&G8o3~5ne\:xSZ9TG~hBlQ*DF:1/:)pE Χm:т8ޘ(xM꼞G܍_7QH||B^֭ *+I ~)m>ML/c7|P>`m+ڬϸ0s7Y|(KڬߓOy0?Vt s`n6q:cY/hwDжYWQ$]6Ӫf]zj9eFCzN[u{zvL[/|ol[0>m!їaSz"1v3Ϩ[ocb5s̿v=~b=ؽ~/Hz!zً^\zm] Sc;2zƧS/f[z~y$6~y LcDNmz|nw nKS$Hn!_,>,mͺv)K>&ؔMatK7sm Cڰ9%q P&ΊӧF5+_6{>r$3NlǬڡ4O3gz;hԢ WCsF?]>[Zޒp,I󠏚lm6C ^5_}C:Niprz-&y/+^^9u G9ᔖ턎 Y2k^)粕;_Sg:Snf]Km2{rpUq5Ł7INaeWk൘aLoėZAF9.V#u:Ӷ|a|2l/밑O;}ǿh _nrTuRu2Vj]hq/lC\'y8l$wr Ґ >t2(o&?U7]I~zr{=4ǽ_ڐ{dŋvO.,e6rA{ /ٮLU5.U77_-b=63\9AOi.Gi{zs0둭wף|wu^^_ GYovcƃzjkƫ/ۡYrǡ'kSO'٩Gg3S3ꧩw_ք|v~%{H[Oԭ/OSlFʇ#qP?NSHM軨IJbQo,J>%z[zwD/^6':tS_,=^S;z~|-h}VT_Os[+l8Zb(nYg̰y[>*-ki'X=!ߔ=I}{fs̎S "O_J~?1endstream endobj 137 0 obj << /Type /Page /Parent 3 0 R /Contents 138 0 R /Resources 4 0 R >> endobj 138 0 obj << /Length 4169 /Filter /FlateDecode >> stream xZˮ]Cd5%PR&؈~֪ꗍ`[w?jժUuN>+;UV4]%59]]^/\>y;p?|w/G>ÿ7\{ ;XPד]w[澞jK\ׇKIw0~qo޼|oy<+&gxrX/zjΛ=\~Â#\*zw_͇#a%]Is}ɯ'z\ sdžsUD*ُ߿} />+g<߿g2Ap߬ i*"Q`ľmΛ|XVi-SS~"ca"0dLfzc5S.w{c2S^LBp?8y]D6@/3Lv@\Ɓ@<GgQ cgȨ 02M^Fc# ,42ܕ@aa2FȒ`I!$nsFF',R.CF'?d&j W.i! '&$!gôüHއMxNy&ڍv|"Ul6އџk=mV~`g=_q:bx8o,GVU63jm@v]v-q/卶Տő6kPLpRTx*26)PlpX܊"d>6ފD '[کX׭h=P[f#ʭ8e+fUCQÎP-AΒd˲yDilzϋ硍{}YiZ N Apkxo_%j|X}<Ғ6id)%h6t01фS¼V/$i`ʳ!K7OdfWE-m$W_M5rЪDliK[ʖ5ߔ mM#hSnS6&ҧ,3Æ^Jy4m$Oic?,#sYdy,-QƔ4Iۮw/{/)U\.bS@_Z>N2Lf|Fབo4wi=mL|:d|0 < N^u'O2&+Yv$?H.{ m6GV֙ <D[g~(%Uɔ&G8o3~5ne\:xSZ9TG~hBlQ*DF:1/:)pE Χm:т8ޘ(xM꼞G܍_7QH||B^֭ *+I ~)m>ML/c7|P>`m+ڬϸ0s7Y|(KڬߓOy0?Vt s`n6q:cY/hwDжYWQ$]6Ӫf]zj9eFCzN[u{zvL[/|ol[0>m!їaSz"1v3Ϩ[ocb5s̿v=~b=ؽ~/Hz!zً^\zm] Sc;2zƧS/f[z~y$6~y LcDNmz|nw nKS$Hn!_,>,mͺv)K>&ؔMatK7sm Cڰ9%q P&ΊӧF5+_6{>r$3NlǬڡ4O3gz;hԢ WCsF?]>[Zޒp,I󠏚lm6C ^5_}C:Niprz-&y/+^^9u G9ᔖ턎 Y2k^)粕;_Sg:Snf]Km2{rpUq5Ł7INaeWk൘aLoėZAF9.V#u:Ӷ|a|2l/밑O;}ǿh _nrTuRu2Vj]hq/lC\'y8l$wr Ґ >t2(o&?U7]I~zr{=4ǽ_ڐ{dŋvO.,e6rA{ /ٮLU5.U77_-b=63\9AOi.Gi{zs0둭wף|wu^^_ GYovcƃzjkƫ/ۡYrǡ'kSO'٩Gg3S3ꧩw_ք|v~%{H[Oԭ/OSlFʇ#qP?NSHM軨IJbQo,J>%z[zwD/^6':tS_,=^S;z~|-h}VT_Os[+l8Zb(nYg̰y[>*-ki'X=!ߔ=I}{fs̎S "O_J~?1endstream endobj 139 0 obj << /Type /Page /Parent 3 0 R /Contents 140 0 R /Resources 4 0 R >> endobj 140 0 obj << /Length 4169 /Filter /FlateDecode >> stream xZˮ]Cd5%PR&؈~֪ꗍ`[w?jժUuN>+;UV4]%59]]^/\>y;p?|w/G>ÿ7\{ ;XPד]w[澞jK\ׇKIw0~qo޼|oy<+&gxrX/zjΛ=\~Â#\*zw_͇#a%]Is}ɯ'z\ sdžsUD*ُ߿} />+g<߿g2Ap߬ i*"Q`ľmΛ|XVi-SS~"ca"0dLfzc5S.w{c2S^LBp?8y]D6@/3Lv@\Ɓ@<GgQ cgȨ 02M^Fc# ,42ܕ@aa2FȒ`I!$nsFF',R.CF'?d&j W.i! '&$!gôüHއMxNy&ڍv|"Ul6އџk=mV~`g=_q:bx8o,GVU63jm@v]v-q/卶Տő6kPLpRTx*26)PlpX܊"d>6ފD '[کX׭h=P[f#ʭ8e+fUCQÎP-AΒd˲yDilzϋ硍{}YiZ N Apkxo_%j|X}<Ғ6id)%h6t01фS¼V/$i`ʳ!K7OdfWE-m$W_M5rЪDliK[ʖ5ߔ mM#hSnS6&ҧ,3Æ^Jy4m$Oic?,#sYdy,-QƔ4Iۮw/{/)U\.bS@_Z>N2Lf|Fབo4wi=mL|:d|0 < N^u'O2&+Yv$?H.{ m6GV֙ <D[g~(%Uɔ&G8o3~5ne\:xSZ9TG~hBlQ*DF:1/:)pE Χm:т8ޘ(xM꼞G܍_7QH||B^֭ *+I ~)m>ML/c7|P>`m+ڬϸ0s7Y|(KڬߓOy0?Vt s`n6q:cY/hwDжYWQ$]6Ӫf]zj9eFCzN[u{zvL[/|ol[0>m!їaSz"1v3Ϩ[ocb5s̿v=~b=ؽ~/Hz!zً^\zm] Sc;2zƧS/f[z~y$6~y LcDNmz|nw nKS$Hn!_,>,mͺv)K>&ؔMatK7sm Cڰ9%q P&ΊӧF5+_6{>r$3NlǬڡ4O3gz;hԢ WCsF?]>[Zޒp,I󠏚lm6C ^5_}C:Niprz-&y/+^^9u G9ᔖ턎 Y2k^)粕;_Sg:Snf]Km2{rpUq5Ł7INaeWk൘aLoėZAF9.V#u:Ӷ|a|2l/밑O;}ǿh _nrTuRu2Vj]hq/lC\'y8l$wr Ґ >t2(o&?U7]I~zr{=4ǽ_ڐ{dŋvO.,e6rA{ /ٮLU5.U77_-b=63\9AOi.Gi{zs0둭wף|wu^^_ GYovcƃzjkƫ/ۡYrǡ'kSO'٩Gg3S3ꧩw_ք|v~%{H[Oԭ/OSlFʇ#qP?NSHM軨IJbQo,J>%z[zwD/^6':tS_,=^S;z~|-h}VT_Os[+l8Zb(nYg̰y[>*-ki'X=!ߔ=I}{fs̎S "O_J~?1endstream endobj 141 0 obj << /Type /Page /Parent 3 0 R /Contents 142 0 R /Resources 4 0 R >> endobj 142 0 obj << /Length 4169 /Filter /FlateDecode >> stream xZˮ]Cd5%PR&؈~֪ꗍ`[w?jժUuN>+;UV4]%59]]^/\>y;p?|w/G>ÿ7\{ ;XPד]w[澞jK\ׇKIw0~qo޼|oy<+&gxrX/zjΛ=\~Â#\*zw_͇#a%]Is}ɯ'z\ sdžsUD*ُ߿} />+g<߿g2Ap߬ i*"Q`ľmΛ|XVi-SS~"ca"0dLfzc5S.w{c2S^LBp?8y]D6@/3Lv@\Ɓ@<GgQ cgȨ 02M^Fc# ,42ܕ@aa2FȒ`I!$nsFF',R.CF'?d&j W.i! '&$!gôüHއMxNy&ڍv|"Ul6އџk=mV~`g=_q:bx8o,GVU63jm@v]v-q/卶Տő6kPLpRTx*26)PlpX܊"d>6ފD '[کX׭h=P[f#ʭ8e+fUCQÎP-AΒd˲yDilzϋ硍{}YiZ N Apkxo_%j|X}<Ғ6id)%h6t01фS¼V/$i`ʳ!K7OdfWE-m$W_M5rЪDliK[ʖ5ߔ mM#hSnS6&ҧ,3Æ^Jy4m$Oic?,#sYdy,-QƔ4Iۮw/{/)U\.bS@_Z>N2Lf|Fབo4wi=mL|:d|0 < N^u'O2&+Yv$?H.{ m6GV֙ <D[g~(%Uɔ&G8o3~5ne\:xSZ9TG~hBlQ*DF:1/:)pE Χm:т8ޘ(xM꼞G܍_7QH||B^֭ *+I ~)m>ML/c7|P>`m+ڬϸ0s7Y|(KڬߓOy0?Vt s`n6q:cY/hwDжYWQ$]6Ӫf]zj9eFCzN[u{zvL[/|ol[0>m!їaSz"1v3Ϩ[ocb5s̿v=~b=ؽ~/Hz!zً^\zm] Sc;2zƧS/f[z~y$6~y LcDNmz|nw nKS$Hn!_,>,mͺv)K>&ؔMatK7sm Cڰ9%q P&ΊӧF5+_6{>r$3NlǬڡ4O3gz;hԢ WCsF?]>[Zޒp,I󠏚lm6C ^5_}C:Niprz-&y/+^^9u G9ᔖ턎 Y2k^)粕;_Sg:Snf]Km2{rpUq5Ł7INaeWk൘aLoėZAF9.V#u:Ӷ|a|2l/밑O;}ǿh _nrTuRu2Vj]hq/lC\'y8l$wr Ґ >t2(o&?U7]I~zr{=4ǽ_ڐ{dŋvO.,e6rA{ /ٮLU5.U77_-b=63\9AOi.Gi{zs0둭wף|wu^^_ GYovcƃzjkƫ/ۡYrǡ'kSO'٩Gg3S3ꧩw_ք|v~%{H[Oԭ/OSlFʇ#qP?NSHM軨IJbQo,J>%z[zwD/^6':tS_,=^S;z~|-h}VT_Os[+l8Zb(nYg̰y[>*-ki'X=!ߔ=I}{fs̎S "O_J~?1endstream endobj 143 0 obj << /Type /Page /Parent 3 0 R /Contents 144 0 R /Resources 4 0 R >> endobj 144 0 obj << /Length 4169 /Filter /FlateDecode >> stream xZˮ]Cd5%PR&؈~֪ꗍ`[w?jժUuN>+;UV4]%59]]^/\>y;p?|w/G>ÿ7\{ ;XPד]w[澞jK\ׇKIw0~qo޼|oy<+&gxrX/zjΛ=\~Â#\*zw_͇#a%]Is}ɯ'z\ sdžsUD*ُ߿} />+g<߿g2Ap߬ i*"Q`ľmΛ|XVi-SS~"ca"0dLfzc5S.w{c2S^LBp?8y]D6@/3Lv@\Ɓ@<GgQ cgȨ 02M^Fc# ,42ܕ@aa2FȒ`I!$nsFF',R.CF'?d&j W.i! '&$!gôüHއMxNy&ڍv|"Ul6އџk=mV~`g=_q:bx8o,GVU63jm@v]v-q/卶Տő6kPLpRTx*26)PlpX܊"d>6ފD '[کX׭h=P[f#ʭ8e+fUCQÎP-AΒd˲yDilzϋ硍{}YiZ N Apkxo_%j|X}<Ғ6id)%h6t01фS¼V/$i`ʳ!K7OdfWE-m$W_M5rЪDliK[ʖ5ߔ mM#hSnS6&ҧ,3Æ^Jy4m$Oic?,#sYdy,-QƔ4Iۮw/{/)U\.bS@_Z>N2Lf|Fབo4wi=mL|:d|0 < N^u'O2&+Yv$?H.{ m6GV֙ <D[g~(%Uɔ&G8o3~5ne\:xSZ9TG~hBlQ*DF:1/:)pE Χm:т8ޘ(xM꼞G܍_7QH||B^֭ *+I ~)m>ML/c7|P>`m+ڬϸ0s7Y|(KڬߓOy0?Vt s`n6q:cY/hwDжYWQ$]6Ӫf]zj9eFCzN[u{zvL[/|ol[0>m!їaSz"1v3Ϩ[ocb5s̿v=~b=ؽ~/Hz!zً^\zm] Sc;2zƧS/f[z~y$6~y LcDNmz|nw nKS$Hn!_,>,mͺv)K>&ؔMatK7sm Cڰ9%q P&ΊӧF5+_6{>r$3NlǬڡ4O3gz;hԢ WCsF?]>[Zޒp,I󠏚lm6C ^5_}C:Niprz-&y/+^^9u G9ᔖ턎 Y2k^)粕;_Sg:Snf]Km2{rpUq5Ł7INaeWk൘aLoėZAF9.V#u:Ӷ|a|2l/밑O;}ǿh _nrTuRu2Vj]hq/lC\'y8l$wr Ґ >t2(o&?U7]I~zr{=4ǽ_ڐ{dŋvO.,e6rA{ /ٮLU5.U77_-b=63\9AOi.Gi{zs0둭wף|wu^^_ GYovcƃzjkƫ/ۡYrǡ'kSO'٩Gg3S3ꧩw_ք|v~%{H[Oԭ/OSlFʇ#qP?NSHM軨IJbQo,J>%z[zwD/^6':tS_,=^S;z~|-h}VT_Os[+l8Zb(nYg̰y[>*-ki'X=!ߔ=I}{fs̎S "O_J~?1endstream endobj 145 0 obj << /Type /Page /Parent 3 0 R /Contents 146 0 R /Resources 4 0 R >> endobj 146 0 obj << /Length 4169 /Filter /FlateDecode >> stream xZˮ]Cd5%PR&؈~֪ꗍ`[w?jժUuN>+;UV4]%59]]^/\>y;p?|w/G>ÿ7\{ ;XPד]w[澞jK\ׇKIw0~qo޼|oy<+&gxrX/zjΛ=\~Â#\*zw_͇#a%]Is}ɯ'z\ sdžsUD*ُ߿} />+g<߿g2Ap߬ i*"Q`ľmΛ|XVi-SS~"ca"0dLfzc5S.w{c2S^LBp?8y]D6@/3Lv@\Ɓ@<GgQ cgȨ 02M^Fc# ,42ܕ@aa2FȒ`I!$nsFF',R.CF'?d&j W.i! '&$!gôüHއMxNy&ڍv|"Ul6އџk=mV~`g=_q:bx8o,GVU63jm@v]v-q/卶Տő6kPLpRTx*26)PlpX܊"d>6ފD '[کX׭h=P[f#ʭ8e+fUCQÎP-AΒd˲yDilzϋ硍{}YiZ N Apkxo_%j|X}<Ғ6id)%h6t01фS¼V/$i`ʳ!K7OdfWE-m$W_M5rЪDliK[ʖ5ߔ mM#hSnS6&ҧ,3Æ^Jy4m$Oic?,#sYdy,-QƔ4Iۮw/{/)U\.bS@_Z>N2Lf|Fབo4wi=mL|:d|0 < N^u'O2&+Yv$?H.{ m6GV֙ <D[g~(%Uɔ&G8o3~5ne\:xSZ9TG~hBlQ*DF:1/:)pE Χm:т8ޘ(xM꼞G܍_7QH||B^֭ *+I ~)m>ML/c7|P>`m+ڬϸ0s7Y|(KڬߓOy0?Vt s`n6q:cY/hwDжYWQ$]6Ӫf]zj9eFCzN[u{zvL[/|ol[0>m!їaSz"1v3Ϩ[ocb5s̿v=~b=ؽ~/Hz!zً^\zm] Sc;2zƧS/f[z~y$6~y LcDNmz|nw nKS$Hn!_,>,mͺv)K>&ؔMatK7sm Cڰ9%q P&ΊӧF5+_6{>r$3NlǬڡ4O3gz;hԢ WCsF?]>[Zޒp,I󠏚lm6C ^5_}C:Niprz-&y/+^^9u G9ᔖ턎 Y2k^)粕;_Sg:Snf]Km2{rpUq5Ł7INaeWk൘aLoėZAF9.V#u:Ӷ|a|2l/밑O;}ǿh _nrTuRu2Vj]hq/lC\'y8l$wr Ґ >t2(o&?U7]I~zr{=4ǽ_ڐ{dŋvO.,e6rA{ /ٮLU5.U77_-b=63\9AOi.Gi{zs0둭wף|wu^^_ GYovcƃzjkƫ/ۡYrǡ'kSO'٩Gg3S3ꧩw_ք|v~%{H[Oԭ/OSlFʇ#qP?NSHM軨IJbQo,J>%z[zwD/^6':tS_,=^S;z~|-h}VT_Os[+l8Zb(nYg̰y[>*-ki'X=!ߔ=I}{fs̎S "O_J~?1endstream endobj 147 0 obj << /Type /Page /Parent 3 0 R /Contents 148 0 R /Resources 4 0 R >> endobj 148 0 obj << /Length 3963 /Filter /FlateDecode >> stream xZ.qO1d3"8aHt,,bGI  d n$K@{ĹjΗ7|a ?/hfqOߌcџ_,t,5ւ f)oHoNMypZ,.QUuގ' SrJp&`㹿E1ր-mq\rj\q9wĸu<aX߁s~{8cI1.`~ܞϯ1絷zxz q,x{;懠oBx1=LN3^qy+oq/20̟?xʨ7av he >Z<8%@3bȖxx Q q3%Oʛ>l-lr@5m$_.;0"!x}й3 /uso\/x/^k&}9a4VDj?Z]ċ;c+= 6d${nvra+%6lH[fd+TQ<$B$wnt0Kny Wdc߅D T1pP)`t*;w42T Ϙ]$M7t`<7_Jc qi7.rz!7/W_`uS5WoPv#$ qF b>|H1_@X#^[O``J~Bljyy\?.DʥoI-' :]:@K(S{?E3k1׿J q*)PĚOUވ~*܏U;J+ xxqn3xSW~hqpv$謗c]M3OK^Y#"?rLxvTuWm#1o۱Q/Qcr 'u)oZnG bq-.|hзA46ԀXǶP7LkqVxRo#_< C":ߣt(:sm [)}_/+/?}|ky>}xa»1O>O`QF{} l NJbkpv ^鈿Q$6m:T&#DVf\ĜW[H(,QL@=(2ȵ RMEz|&vP^LI^$-(@{< EӀV &$& 5  qe7,󅚔 M$;ƱHНd"qSPҝT9@,#Dn&ݡ|9L>cj8@G$ y & a>Mɧj/ڢHw?&0qHl{){ MzUHp"R$@`=ȇ&D&ƅ|>/Li7 L>0~ȇT#$->!>1_w||"Y|$' >a#t!Q-zLSTW o@l@MxAɃOM |R7 NQ5OE\'J0 :1QQO iD'`EQM}OЏLݬ&Fy`T>_$LM>Q2֧Ɖ+m,}D`|~z':_>ڢ ^'1-}kP+O aL\ߜ?y N 5_gZkn]rv<ߊW[I+ uGs~\|q`ozgS7_0@'X(/X'خ||m|勩?+e􀘇K/|hlQK6K/=S.;PS4K/?KO1|[޴n=&f^scYkvbo'Q!ɪCO=Q֯s|#zEܮz<&zH\>>N%CYPfk9٩?g,/p|zM~gWpw!IC7?E~f;~.фm ؁F r"\o?^~H?*MݎDn?Dzik6&J80בk,?=~MZ=~Muȉ٤ԧ0݁-A;+i1a߼Hym}<]XbGNWg(~>#Y<3#f9Ŷ)1ERb`,yF~T?߯nFS{3h__\1˟;V(gq6Ī}ƫ=_Fe*N܏vw_?(^]R鴿QSqE~о<#'>8%e$zQ2OEy p=pg9k;~<60Q렶'EmZĴ*,p5~d@Yi CH([aw"u/-?ԋ懊 =х  K%ĉ]liڿLu g.\qo= .=< 4IEwiZr^1HG{F&'Ћ/ {I "x!l7~k4&^=M/>XJbe.dɲ'q뇏Df,20( lwߍ䃉|aO&3wǨ(u嫉 go'߹?}Eendstream endobj 149 0 obj << /Type /Page /Parent 3 0 R /Contents 150 0 R /Resources 4 0 R >> endobj 150 0 obj << /Length 3953 /Filter /FlateDecode >> stream xZˮ%Gܟ%l]Y-d̕X 5Y/dsGUeEFF9JW׷_^ߏ]Uo˒U.r}?w~:wk׿_\}3x9// ~B3{lޮ_|RV1$.Nա-_]{8[4uNؕq[x.=?~\SI ׻+a!EƊRF\8Z̕/Vy;43p"Ncx`~Xdŧt[1x=VO+c|N51nb m)'}|vDK"rof a~`^e "\#|fg= w%<3{ŹwS*i >pgr?+b !n=>/0 KEwRɷʛ1N,m90D65grr2 ⏼ju@ޜrεrSr1!aH} |j8:"8mx3ި-fA1x&nt,B5Ngl )|2$`ƎVc `, 0 ' 0i2qm0 ]`<&HFF`ı1ޏċw.ԔȰFܘw(A32J/#1 p $왊1>2(\/2R8+d(&"* [3^-c(F\Cy/cK̏|?2v(b 2bJډ [`^9pcra>סIwϒGm"n%R#~`cc K$pߠ# =oDXʇ7|h2_W>z|3!Վ|-^Aw>CWɏ{.=)z^T[O 9zSkQ-|֫zQ~K SKXR󡥩)׷ : } uj+qXO>13j1ֿJ q9*_]5Q8?:YYgz(\(*/ 3Ϻͅ:v_4_i{"};FNG~$= ; F3ʺcBX&Xu;6VOGW^nLJ@2OF0qb#'ۑBXhc.c@혡WG ḱZ!b:ˮS-6Tsm7bi { []EUI>ԪIbz`T3 bFWΟMo>^\oz҄8y}o߽~և+A醱P_^$4edvsn`#M̆8zJeCLRf\tǍ|<渲,,Ydm#q ,7r%KYi[xZeeXz{ 'NYlɈ'1˚Ef=.QǴi8eUhX1^#xEO>?\C,>`Y~)l=Za6mELbmMOl[/I2ML)ṁ6edΗ67 d6ԐIbޣ1|jfئT F\x=:&?~-@uIؐ4 3kN%m+e!}%/no ᴸՈ'on, "OAzx#e*!baVm6yKu/ʰՑ(h/oMi= 6Jj D\Fզ> N1+0FSo>n3V&DmW|~->!1y0uS'_{O>ww|[ґ/':ŝoۀW1|0@8V+%z@LL/8SozYKY?q`;N PS/Yraꭦh[kK֯ʃպm ,If &?W!F]Q4]iCbY/QOz̨Pzs NM?xLWHgRq~'9ݜl-;~8~<~j=$'z#ޔÏ6/6?v~L,ovq`˯7﷟GbO/̶q5W9ȉ٦x;Tg2˟wŁH[-3l֝5NQ^a) ysfDv?GCOAA<jæ=`<+NH85"c))3=S;/G :])Bv̻x޼Y~>;'o\)b(C{NqWj_=o)gdyG?u6!l5[_C9RzyGAvSEW>G9)- -*◣dֺe/w1>OY.K3(r 0zWs_*eU 9@kv`ogs;L,aӾB`ǟono~J;n>>g|S!m> {3;ڹ^?Rv'D3lu%4b?a߹_~YhJ__Ox[ އ*N\vUCgfiv2+5Z_QN0AoZAF9.^#tm!_ly n#4>w$V}'h_7G95:0oty;6ž2V/ H\hKi/0\~y40Իx !~&2mcsdRp>i 9ƕ±'F_mDžc5K @p^]byxCW )k?,_~r`-{}",'Bveɒ1ȅ2&_-y N3P8rO&Vq#GMʍc|6|7㋩'[/H ӭ'_]1/=2W+=3u",3vqꡙfΗfߥEl^sOe=q>q9_]O Y|gqg_u%ՎzjnG=~Oz*9ЬLt= ۵'ovv+;E0 i5a+~Su- cԧۯQ(RHMh臦²BY~?%~{~ݶ/_~Ntl=>X~jۯ[G?P~~RR1@Sw ?Ov+Gv[v߀+ ?4ݏ>'.ď> endobj 152 0 obj << /Length 686 /Filter /FlateDecode >> stream xVMo0 Wꃖku@ b`!N&CG#/v^H>=R$ +oޠBV"jހZv^[[ %RP>w߄  Vf*4ԃ`&!%4yd/(;Ko3`c \GDhtt^CƳGҐ0#GL v\!RVץiy.Մ"hLIG]h4ԶbYE)㜓HZ&|ݬ eMύG*"F=0եeE4=`/0Gc>yNͳG])9&d*U29jn4o~'*~ж5OW9jA|y_\ZM4 .ӼFX԰kc9~jh/z"73v&'(ֆ+|TbG%P'+ ct=3<^_Sp|8n7i~qo>yl_㦈 ̅KR#r4њv6'8ۍ Þ Op1 t_{~.Zv="r}]`*L)6܂rU 6ݒj%gۮQQQgvv O Gfx)9endstream endobj 153 0 obj << /Type /Page /Parent 3 0 R /Contents 154 0 R /Resources 4 0 R >> endobj 154 0 obj << /Length 4239 /Filter /FlateDecode >> stream xZˮdG߯ȡ=;bjDd $pI Fʶj;2.͠nu8d}yKn~ϷWrVS|+#[O__~uvꗿ_G_߮ۗK _v%vҫ?8_ ~#}O/ w[s˺AYoo~x?>?'|z?'<;W;rygjS]W;_|>dLN,ÂCz|^/_c}X8NR}tg?OWȥ /cϾ{o~ϿV+<52| g _}Wc ]׼?2 \q}` qE0eB8޾̋6J% ğ'u_% !,ދDc9_F+hX1:,W=[nk݇>^Qan0c .#@BN#etVr~VB%ZOӁSmmU]^]pXtxl]c/_ ?4òO.D3'__L[f!a7h#tcn7DYa?d, KC*צJ3QG0lX$sK_/m-++,|nEi`{LҔ&_&qf|1z>9 }xFIX"!ue(MaQtM²W*Rf6uY!vz~R C"߉qƘ=JLUp*2 Sakeܙ̾` /헼;sCF{8s0x'F xc% r.c=灎J8/p?$UaOdmN<ц?:MSx^/vh #ހ:r#^A׎^m= H9򩏠7 9oF ~ >ŸS>j3/;H^>cg:۲}Om[-dzG u9*C,4Ղxg1߮5..EzV*]Bg qGl(>oYϋ2qiاϣ~.Qgx {z~!#/=?d-;,Co??d ~IB ~ee>2iȨ[f!\oC_Z/d=[Y!f^?d`22aX}e&P ШRPQзס~A*y(Uu5xnЖ*=߆wj/_Ny Ceؾ}f!ZGc HU(O@ }tSQ1~w<,_REBb .y.[T&r٘V8†n"w0숭ܖklB|YVm2f5T2<ʖMK0c[טF7;jcݏ4Aile<0$+2EjA:eMcl AKTg5ڝ*cj육H"lGVSbxp Wsj]9_Yy<EGZ>9P]:RXMSoDȩB˟숌2jp}^? I[ KQV߯} 7A6$Vs~T(ScUaat>u+L<ۊ쑍pV߫~Vߒ-ho[p!Q0~|XUcd*u$?Ubk_oiRgۿ)p%mԟ W/*^z[Շ<|aMyGs׈TǘaV۟3:L눇C/'7]IGw;"$|Wv g>| >X)vw|v7|JL7փV >zݰ+Ǵf z!x֓ޓУWmz`=wGPzweധ#Gzz4[[#ܝ^~_W'؝z~O7ěGEWuJBѬv)Ie7y[|I(bW4p2\Tѻ)l5ow40>áRM麰]uKkCH7Np /HbtR{X)Nk7¿`nW3/A ƌZ,T!.W(W *3UU߂t _ד>[ LZε,> U .5ޡQ#XxaqN\n˥>K/S20-wMK `9d,t.JjRJ S[T'@GT픧TM߭ n<\%~KS*}^rR`j}ˣ̺L OrKNgr\e⾥ WD״  u>Uf:;lGSt@E*_r^n>tl@JV1 oZDQ2+_p9/eьg ԷEM;zG|?G;`ְk)Ծ{zc*ݧ0ԟx6a5yoMJҢ}Yw|Y/QUTHWEno4U|qFe]hUZ^lqlכ1nϛ!~v;v>/ہ|cF|l{kd{0{`Jn?eߔo툇reaxVXx|T;y|x_aUf;em|Zݏ|[Xmz=kۋgnn_/Ղ/'ZEMG4iUMWo>ixY|͗|Jn]c\b{<|Ngؔ ׹z~/Wzx3ozӳ~9zI{X/Ǹ+G=}=u?2rzz[/(>? O?7oZ?Z^Y}CY񕤭V^֌ol=6~lF~_fc{@7kL =7e[Źzr>a9cq֫#2m=;WkBgn=Z߷[o_`endstream endobj 155 0 obj << /Type /Page /Parent 3 0 R /Contents 156 0 R /Resources 4 0 R >> endobj 156 0 obj << /Length 4180 /Filter /FlateDecode >> stream xZK&W_QK{1y?FH3tK,,iV'#"VyɌ̪|}~O/t}vzvY:{ϮzIwJ:_g^K>߾dpKŧjc5f|{CzY\U\w^Wyn&|k?_,f׿r~g6a]O߾5ϖﺏgOut<;m;!rkwf.j[z>Uu0k?>Z簿{ .?ˏPj_|Om'o޽^?F؊o]la_=Yxb|;+ޏcl^L:9|763hV̝[ɶI`Dޜ?x-̞eǤw }i?&a>ox Ij* D(O2߄lo+ir\ajlɩmnCnaɬNMǶ40--&hցX2t3l c67cc!8 9MZMni'<v4lJ[8n[&kn] b%3&O|.0 ӏJDTᆼΉC´x!4܏Q^d?^FPoi /* 緰|YX)8M0/m! R k"ҿ9ί3^ baVwyp}0 o/"!.#5ºX y`[FM~ c>ce?|鿱_㴇=$Þ6Mɇ uOy8O[Hyw tmdfQf|? |+ح<}z<"^L*^<툷<=3^ rLJ3f ~_@OS7_^gswz𡩐4{; u>_J&T>0%ކ0Ml<3䝜k&[zf*^oD3a|A:4i=<~=~4aG6H&yGMV4o2OeɯK&y e]fy3wby3k|.sd7B&xE2̮|2pL3/uq#eŏw8?\&fxlSLLrk,2ݡ>]#zWշk宾!ٵy_dܻo}j]86 zD^1z8_|$1_>V gj=賗Ο|5_Vgkxl.eYE]~kZR$*VSHTR8LB&C 0d 3ΨhMo~?|UA!*桠j'X @w~7`(XJc, Xٱ'+rK?fbc=p?#"@7kbڔ82z13' b 2LP;ϻÄbh`ojZYqGE?Wo-H:o*Ĵ_-LWUnL(~2rt4V.Y FfpF]K M .;SGmROuFP*L_rFחjej?#3; F{A:w/L0ƿm';_W0΍eH[9B̊{ctq?Q, b>[V*z r AN.~-|#{kz|=Ms~sBy.oy#M7_, 4Z͇?^WSßE3O_1xX^AFyhM;_@̓OW7F{p!M PX|'|ᎊ 3^oN+ӨbAџO75EGAXL X̠||WU>!t:ϧ5ٲ3Gv\ȿgަ\z;X2ug< VGBzqt zjv 75zt O길CIIZCzqyz7QwwSY/u\xzwe9:3*63*6j>KOazR۴~fr*T5Uo%c(o[TqsI=o) MeVnYxNa5zdF`' C}EH>Y~SU𫂯v| 7 V9؉AVGx+sA&7sgdm5,$V UGt[+ GR$.EyY^ hK6Qቬt5icE.w/KWt٫2ʠK}<0Y'ܟ@6WEEOP5=J/~_ =ՠ7f(g^"$^"$oCVoĺBr-SԲ#74%L`}:??LO#Ē+xy!^)Oژ9 ֯u;'IwF򦳱T^rRat/,`ï($G,wCRa` G::%rUC u1\+Lu2ꢜIo-w&n/ Ul6w0o ӱ_}ì,_o3*ֲ{{G|Z0r|o+Ե86M/8+xn,ZNjMcoyB{63xx2>b;`?FL{7('LK|V `5v[̷\.z~(=Gk칓a|米? E4d~|?l+/;eq2|fnvVa_wW9=߷x_wxQ{GyxİORVye0_zTT8_`䓖Sl'&_Lg-ߋZV·'E;cO[L| \|,-<5{{x|L&̗/U^+xG [g>3q_%!|N[دUVv9K}*CIu]z/='et{Twzh{;>Ro詝\ZK|zmAku/]g׃PA\УmWe =;лۙOzy~Coxz|wZGc燿` G=0Oˆ/Qo W|EGF/ fU+pVl/[ʭZ%_[ |3[0L/N1ɫ7oßMendstream endobj 157 0 obj << /Type /Page /Parent 3 0 R /Contents 158 0 R /Resources 4 0 R >> endobj 158 0 obj << /Length 4279 /Filter /FlateDecode >> stream xZKub"wV@H8"ᅤ(JI9[3ϴaB>=vۗtpk~(Zo5ȷ2ҽۻnq7_~rݯ뺝~ÿvߗv%ݾ?$pח~Վoo_l=j?>+>X>z>X?q~><]z}y7aoĸpכ| x{Y:7?>/zS_zgjS]W;^||ʳjS]糝‰bXFX̅D`Ń"r)8#B=h]N^=ML/>_rx!re8{GLr_ 0!sƉr7c량=%T;Ŕ%Ӻ,`)CJ°%O㞺pO)3'> X 4\?ۮ<ȄRڸ&6l 1_II4܉q ,E#r@zO f |s<,zfWаbt nYZ{p1Bqֺ&$arǓ8r] FFʬ(JJrZ&ӓ۪ ҽ:ٺ^/4KNl>͜|}1mPݤҍ]#<9gɳ(l.\* Da}:,}YD:β<14_dh73;{i4-ƃ4hNR4tL ( .SFi¨Kgo2 GUѕ4ð "[\eN<;7Qg OVa: C\K<80o/|dU[Uxi]Mݙ~>62HiKԅc>1R\,ixp~s8tTJyi$ Ķ{"ks: <6\$84oJzx 3@y# v2OCTۗo?Dk( [|[a3*?S#B_$wٿQ1~w<,忤e*F-<\~]{XL..*1#ɭq q*ɉEd`[Ma!-Mل یeQkdx-1`/aƶٯ1 3nv29ie ْfy.#aHVd&-tV1Ƅ4lXjDQa;Ur9$9C "88E#*C x1պ2sܧڃm):xB-}r 6@ub7`3ވjS5;!?3e\VO {0,_σ#nVwlHjO:*P@V+|Vy+2#ርW.% [[fVB`6ybgbu 򟚹 ZEjff 7Ƌ>)#~oHdonSm5 eI|v7pw|R|4dn:fn)_|Fy1>\[D4Bźr>| e>;V|O3ĶEAӜƳ7tK:QQgCw]Q/˞E=eX\YoW߿3e Į_ėIMC/COzް}=g5bwo'!1}xS?c|a75B2ޛ-[A䫇gt@[O? {OvCg^ei[BaaߩӞPO׶emq`#oo=4swzz5l~a\`w꡻><%=*JV8f[LIR,K2DۭD꥙#BޅpOe~I_e\jJׅ=誋e^]{.*}Eq c~ѯGz{0JNxtp v,],]#vx z5]0fLby qB$"\N@OpPlwR>JeЪw}'_fQ!hb\ot:=G94F\L/2%sK rԽ C2O˫T˫&*0UA-|{M%NyH1ݚ˙6-_<4%.ַ<ʬzہ$-tV],7oU_,[ kEtM{݀!ې=^XSeC-hʁ}Hȿr]@kG|9 ^hT?&M(Q]@bK.5L9`Zz7ʏ989 ^K^7]-~wXSrXڄn֤>摿5)1JfnifD%V;W9L’SC!_9Nٳrm8V_}GZfxIJw[o^sCэu7cܶ7C.v`@;γہ}^njZ׶`^Wl)+ʎaxVXx|T;y|x_aUf;em|Zݏ|[Xmz=kۋo3yL{zU/j~v|Ssyv|Ujl)^V[̧t|K|\5<5 c{MYz0zAq뉮g!~wzg=g?=!Ӯi};]oirc[k/c]/? {g=@C`SzCC`5,߷Y=G$m=b߭Vnf|i@=j@7kL =7e[Ź =9gXom=:cܶꈷL[ώiM̭]JO[or7xo^vLz^z?Ư~%_'ot7z=M>>*J|ۭ;EWv)-B-~|*\u&T4C~{~{.o$endstream endobj 159 0 obj << /Type /Page /Parent 3 0 R /Contents 160 0 R /Resources 4 0 R >> endobj 160 0 obj << /Length 4279 /Filter /FlateDecode >> stream xZKub"wV@H8"ᅤ(JI9[3ϴaB>=vۗtpk~(Zo5ȷ2ҽۻnq7_~rݯ뺝~ÿvߗv%ݾ?$pח~Վoo_l=j?>+>X>z>X?q~><]z}y7aoĸpכ| x{Y:7?>/zS_zgjS]W;^||ʳjS]糝‰bXFX̅D`Ń"r)8#B=h]N^=ML/>_rx!re8{GLr_ 0!sƉr7c량=%T;Ŕ%Ӻ,`)CJ°%O㞺pO)3'> X 4\?ۮ<ȄRڸ&6l 1_II4܉q ,E#r@zO f |s<,zfWаbt nYZ{p1Bqֺ&$arǓ8r] FFʬ(JJrZ&ӓ۪ ҽ:ٺ^/4KNl>͜|}1mPݤҍ]#<9gɳ(l.\* Da}:,}YD:β<14_dh73;{i4-ƃ4hNR4tL ( .SFi¨Kgo2 GUѕ4ð "[\eN<;7Qg OVa: C\K<80o/|dU[Uxi]Mݙ~>62HiKԅc>1R\,ixp~s8tTJyi$ Ķ{"ks: <6\$84oJzx 3@y# v2OCTۗo?Dk( [|[a3*?S#B_$wٿQ1~w<,忤e*F-<\~]{XL..*1#ɭq q*ɉEd`[Ma!-Mل یeQkdx-1`/aƶٯ1 3nv29ie ْfy.#aHVd&-tV1Ƅ4lXjDQa;Ur9$9C "88E#*C x1պ2sܧڃm):xB-}r 6@ub7`3ވjS5;!?3e\VO {0,_σ#nVwlHjO:*P@V+|Vy+2#ርW.% [[fVB`6ybgbu 򟚹 ZEjff 7Ƌ>)#~oHdonSm5 eI|v7pw|R|4dn:fn)_|Fy1>\[D4Bźr>| e>;V|O3ĶEAӜƳ7tK:QQgCw]Q/˞E=eX\YoW߿3e Į_ėIMC/COzް}=g5bwo'!1}xS?c|a75B2ޛ-[A䫇gt@[O? {OvCg^ei[BaaߩӞPO׶emq`#oo=4swzz5l~a\`w꡻><%=*JV8f[LIR,K2DۭD꥙#BޅpOe~I_e\jJׅ=誋e^]{.*}Eq c~ѯGz{0JNxtp v,],]#vx z5]0fLby qB$"\N@OpPlwR>JeЪw}'_fQ!hb\ot:=G94F\L/2%sK rԽ C2O˫T˫&*0UA-|{M%NyH1ݚ˙6-_<4%.ַ<ʬzہ$-tV],7oU_,[ kEtM{݀!ې=^XSeC-hʁ}Hȿr]@kG|9 ^hT?&M(Q]@bK.5L9`Zz7ʏ989 ^K^7]-~wXSrXڄn֤>摿5)1JfnifD%V;W9L’SC!_9Nٳrm8V_}GZfxIJw[o^sCэu7cܶ7C.v`@;γہ}^njZ׶`^Wl)+ʎaxVXx|T;y|x_aUf;em|Zݏ|[Xmz=kۋo3yL{zU/j~v|Ssyv|Ujl)^V[̧t|K|\5<5 c{MYz0zAq뉮g!~wzg=g?=!Ӯi};]oirc[k/c]/? {g=@C`SzCC`5,߷Y=G$m=b߭Vnf|i@=j@7kL =7e[Ź =9gXom=:cܶꈷL[ώiM̭]JO[or7xo^vLz^z?Ư~%_'ot7z=M>>*J|ۭ;EWv)-B-~|*\u&T4C~{~{.o$endstream endobj 161 0 obj << /Type /Page /Parent 3 0 R /Contents 162 0 R /Resources 4 0 R >> endobj 162 0 obj << /Length 4279 /Filter /FlateDecode >> stream xZKub"wV@H8"ᅤ(JI9[3ϴaB>=vۗtpk~(Zo5ȷ2ҽۻnq7_~rݯ뺝~ÿvߗv%ݾ?$pח~Վoo_l=j?>+>X>z>X?q~><]z}y7aoĸpכ| x{Y:7?>/zS_zgjS]W;^||ʳjS]糝‰bXFX̅D`Ń"r)8#B=h]N^=ML/>_rx!re8{GLr_ 0!sƉr7c량=%T;Ŕ%Ӻ,`)CJ°%O㞺pO)3'> X 4\?ۮ<ȄRڸ&6l 1_II4܉q ,E#r@zO f |s<,zfWаbt nYZ{p1Bqֺ&$arǓ8r] FFʬ(JJrZ&ӓ۪ ҽ:ٺ^/4KNl>͜|}1mPݤҍ]#<9gɳ(l.\* Da}:,}YD:β<14_dh73;{i4-ƃ4hNR4tL ( .SFi¨Kgo2 GUѕ4ð "[\eN<;7Qg OVa: C\K<80o/|dU[Uxi]Mݙ~>62HiKԅc>1R\,ixp~s8tTJyi$ Ķ{"ks: <6\$84oJzx 3@y# v2OCTۗo?Dk( [|[a3*?S#B_$wٿQ1~w<,忤e*F-<\~]{XL..*1#ɭq q*ɉEd`[Ma!-Mل یeQkdx-1`/aƶٯ1 3nv29ie ْfy.#aHVd&-tV1Ƅ4lXjDQa;Ur9$9C "88E#*C x1պ2sܧڃm):xB-}r 6@ub7`3ވjS5;!?3e\VO {0,_σ#nVwlHjO:*P@V+|Vy+2#ርW.% [[fVB`6ybgbu 򟚹 ZEjff 7Ƌ>)#~oHdonSm5 eI|v7pw|R|4dn:fn)_|Fy1>\[D4Bźr>| e>;V|O3ĶEAӜƳ7tK:QQgCw]Q/˞E=eX\YoW߿3e Į_ėIMC/COzް}=g5bwo'!1}xS?c|a75B2ޛ-[A䫇gt@[O? {OvCg^ei[BaaߩӞPO׶emq`#oo=4swzz5l~a\`w꡻><%=*JV8f[LIR,K2DۭD꥙#BޅpOe~I_e\jJׅ=誋e^]{.*}Eq c~ѯGz{0JNxtp v,],]#vx z5]0fLby qB$"\N@OpPlwR>JeЪw}'_fQ!hb\ot:=G94F\L/2%sK rԽ C2O˫T˫&*0UA-|{M%NyH1ݚ˙6-_<4%.ַ<ʬzہ$-tV],7oU_,[ kEtM{݀!ې=^XSeC-hʁ}Hȿr]@kG|9 ^hT?&M(Q]@bK.5L9`Zz7ʏ989 ^K^7]-~wXSrXڄn֤>摿5)1JfnifD%V;W9L’SC!_9Nٳrm8V_}GZfxIJw[o^sCэu7cܶ7C.v`@;γہ}^njZ׶`^Wl)+ʎaxVXx|T;y|x_aUf;em|Zݏ|[Xmz=kۋo3yL{zU/j~v|Ssyv|Ujl)^V[̧t|K|\5<5 c{MYz0zAq뉮g!~wzg=g?=!Ӯi};]oirc[k/c]/? {g=@C`SzCC`5,߷Y=G$m=b߭Vnf|i@=j@7kL =7e[Ź =9gXom=:cܶꈷL[ώiM̭]JO[or7xo^vLz^z?Ư~%_'ot7z=M>>*J|ۭ;EWv)-B-~|*\u&T4C~{~{.o$endstream endobj 163 0 obj << /Type /Page /Parent 3 0 R /Contents 164 0 R /Resources 4 0 R >> endobj 164 0 obj << /Length 4279 /Filter /FlateDecode >> stream xZKub"wV@H8"ᅤ(JI9[3ϴaB>=vۗtpk~(Zo5ȷ2ҽۻnq7_~rݯ뺝~ÿvߗv%ݾ?$pח~Վoo_l=j?>+>X>z>X?q~><]z}y7aoĸpכ| x{Y:7?>/zS_zgjS]W;^||ʳjS]糝‰bXFX̅D`Ń"r)8#B=h]N^=ML/>_rx!re8{GLr_ 0!sƉr7c량=%T;Ŕ%Ӻ,`)CJ°%O㞺pO)3'> X 4\?ۮ<ȄRڸ&6l 1_II4܉q ,E#r@zO f |s<,zfWаbt nYZ{p1Bqֺ&$arǓ8r] FFʬ(JJrZ&ӓ۪ ҽ:ٺ^/4KNl>͜|}1mPݤҍ]#<9gɳ(l.\* Da}:,}YD:β<14_dh73;{i4-ƃ4hNR4tL ( .SFi¨Kgo2 GUѕ4ð "[\eN<;7Qg OVa: C\K<80o/|dU[Uxi]Mݙ~>62HiKԅc>1R\,ixp~s8tTJyi$ Ķ{"ks: <6\$84oJzx 3@y# v2OCTۗo?Dk( [|[a3*?S#B_$wٿQ1~w<,忤e*F-<\~]{XL..*1#ɭq q*ɉEd`[Ma!-Mل یeQkdx-1`/aƶٯ1 3nv29ie ْfy.#aHVd&-tV1Ƅ4lXjDQa;Ur9$9C "88E#*C x1պ2sܧڃm):xB-}r 6@ub7`3ވjS5;!?3e\VO {0,_σ#nVwlHjO:*P@V+|Vy+2#ርW.% [[fVB`6ybgbu 򟚹 ZEjff 7Ƌ>)#~oHdonSm5 eI|v7pw|R|4dn:fn)_|Fy1>\[D4Bźr>| e>;V|O3ĶEAӜƳ7tK:QQgCw]Q/˞E=eX\YoW߿3e Į_ėIMC/COzް}=g5bwo'!1}xS?c|a75B2ޛ-[A䫇gt@[O? {OvCg^ei[BaaߩӞPO׶emq`#oo=4swzz5l~a\`w꡻><%=*JV8f[LIR,K2DۭD꥙#BޅpOe~I_e\jJׅ=誋e^]{.*}Eq c~ѯGz{0JNxtp v,],]#vx z5]0fLby qB$"\N@OpPlwR>JeЪw}'_fQ!hb\ot:=G94F\L/2%sK rԽ C2O˫T˫&*0UA-|{M%NyH1ݚ˙6-_<4%.ַ<ʬzہ$-tV],7oU_,[ kEtM{݀!ې=^XSeC-hʁ}Hȿr]@kG|9 ^hT?&M(Q]@bK.5L9`Zz7ʏ989 ^K^7]-~wXSrXڄn֤>摿5)1JfnifD%V;W9L’SC!_9Nٳrm8V_}GZfxIJw[o^sCэu7cܶ7C.v`@;γہ}^njZ׶`^Wl)+ʎaxVXx|T;y|x_aUf;em|Zݏ|[Xmz=kۋo3yL{zU/j~v|Ssyv|Ujl)^V[̧t|K|\5<5 c{MYz0zAq뉮g!~wzg=g?=!Ӯi};]oirc[k/c]/? {g=@C`SzCC`5,߷Y=G$m=b߭Vnf|i@=j@7kL =7e[Ź =9gXom=:cܶꈷL[ώiM̭]JO[or7xo^vLz^z?Ư~%_'ot7z=M>>*J|ۭ;EWv)-B-~|*\u&T4C~{~{.o$endstream endobj 165 0 obj << /Type /Page /Parent 3 0 R /Contents 166 0 R /Resources 4 0 R >> endobj 166 0 obj << /Length 4279 /Filter /FlateDecode >> stream xZKub"wV@H8"ᅤ(JI9[3ϴaB>=vۗtpk~(Zo5ȷ2ҽۻnq7_~rݯ뺝~ÿvߗv%ݾ?$pח~Վoo_l=j?>+>X>z>X?q~><]z}y7aoĸpכ| x{Y:7?>/zS_zgjS]W;^||ʳjS]糝‰bXFX̅D`Ń"r)8#B=h]N^=ML/>_rx!re8{GLr_ 0!sƉr7c량=%T;Ŕ%Ӻ,`)CJ°%O㞺pO)3'> X 4\?ۮ<ȄRڸ&6l 1_II4܉q ,E#r@zO f |s<,zfWаbt nYZ{p1Bqֺ&$arǓ8r] FFʬ(JJrZ&ӓ۪ ҽ:ٺ^/4KNl>͜|}1mPݤҍ]#<9gɳ(l.\* Da}:,}YD:β<14_dh73;{i4-ƃ4hNR4tL ( .SFi¨Kgo2 GUѕ4ð "[\eN<;7Qg OVa: C\K<80o/|dU[Uxi]Mݙ~>62HiKԅc>1R\,ixp~s8tTJyi$ Ķ{"ks: <6\$84oJzx 3@y# v2OCTۗo?Dk( [|[a3*?S#B_$wٿQ1~w<,忤e*F-<\~]{XL..*1#ɭq q*ɉEd`[Ma!-Mل یeQkdx-1`/aƶٯ1 3nv29ie ْfy.#aHVd&-tV1Ƅ4lXjDQa;Ur9$9C "88E#*C x1պ2sܧڃm):xB-}r 6@ub7`3ވjS5;!?3e\VO {0,_σ#nVwlHjO:*P@V+|Vy+2#ርW.% [[fVB`6ybgbu 򟚹 ZEjff 7Ƌ>)#~oHdonSm5 eI|v7pw|R|4dn:fn)_|Fy1>\[D4Bźr>| e>;V|O3ĶEAӜƳ7tK:QQgCw]Q/˞E=eX\YoW߿3e Į_ėIMC/COzް}=g5bwo'!1}xS?c|a75B2ޛ-[A䫇gt@[O? {OvCg^ei[BaaߩӞPO׶emq`#oo=4swzz5l~a\`w꡻><%=*JV8f[LIR,K2DۭD꥙#BޅpOe~I_e\jJׅ=誋e^]{.*}Eq c~ѯGz{0JNxtp v,],]#vx z5]0fLby qB$"\N@OpPlwR>JeЪw}'_fQ!hb\ot:=G94F\L/2%sK rԽ C2O˫T˫&*0UA-|{M%NyH1ݚ˙6-_<4%.ַ<ʬzہ$-tV],7oU_,[ kEtM{݀!ې=^XSeC-hʁ}Hȿr]@kG|9 ^hT?&M(Q]@bK.5L9`Zz7ʏ989 ^K^7]-~wXSrXڄn֤>摿5)1JfnifD%V;W9L’SC!_9Nٳrm8V_}GZfxIJw[o^sCэu7cܶ7C.v`@;γہ}^njZ׶`^Wl)+ʎaxVXx|T;y|x_aUf;em|Zݏ|[Xmz=kۋo3yL{zU/j~v|Ssyv|Ujl)^V[̧t|K|\5<5 c{MYz0zAq뉮g!~wzg=g?=!Ӯi};]oirc[k/c]/? {g=@C`SzCC`5,߷Y=G$m=b߭Vnf|i@=j@7kL =7e[Ź =9gXom=:cܶꈷL[ώiM̭]JO[or7xo^vLz^z?Ư~%_'ot7z=M>>*J|ۭ;EWv)-B-~|*\u&T4C~{~{.o$endstream endobj 167 0 obj << /Type /Page /Parent 3 0 R /Contents 168 0 R /Resources 4 0 R >> endobj 168 0 obj << /Length 4180 /Filter /FlateDecode >> stream xZK&W_QK{1y?FH3tK,,iV'#"VyɌ̪|}~O/t}vzvY:{ϮzIwJ:_g^K>߾dpKŧjc5f|{CzY\U\w^Wyn&|k?_,f׿r~g6a]O߾5ϖﺏgOut<;m;!rkwf.j[z>Uu0k?>Z簿{ .?ˏPj_|Om'o޽^?F؊o]la_=Yxb|;+ޏcl^L:9|763hV̝[ɶI`Dޜ?x-̞eǤw }i?&a>ox Ij* D(O2߄lo+ir\ajlɩmnCnaɬNMǶ40--&hցX2t3l c67cc!8 9MZMni'<v4lJ[8n[&kn] b%3&O|.0 ӏJDTᆼΉC´x!4܏Q^d?^FPoi /* 緰|YX)8M0/m! R k"ҿ9ί3^ baVwyp}0 o/"!.#5ºX y`[FM~ c>ce?|鿱_㴇=$Þ6Mɇ uOy8O[Hyw tmdfQf|? |+ح<}z<"^L*^<툷<=3^ rLJ3f ~_@OS7_^gswz𡩐4{; u>_J&T>0%ކ0Ml<3䝜k&[zf*^oD3a|A:4i=<~=~4aG6H&yGMV4o2OeɯK&y e]fy3wby3k|.sd7B&xE2̮|2pL3/uq#eŏw8?\&fxlSLLrk,2ݡ>]#zWշk宾!ٵy_dܻo}j]86 zD^1z8_|$1_>V gj=賗Ο|5_Vgkxl.eYE]~kZR$*VSHTR8LB&C 0d 3ΨhMo~?|UA!*桠j'X @w~7`(XJc, Xٱ'+rK?fbc=p?#"@7kbڔ82z13' b 2LP;ϻÄbh`ojZYqGE?Wo-H:o*Ĵ_-LWUnL(~2rt4V.Y FfpF]K M .;SGmROuFP*L_rFחjej?#3; F{A:w/L0ƿm';_W0΍eH[9B̊{ctq?Q, b>[V*z r AN.~-|#{kz|=Ms~sBy.oy#M7_, 4Z͇?^WSßE3O_1xX^AFyhM;_@̓OW7F{p!M PX|'|ᎊ 3^oN+ӨbAџO75EGAXL X̠||WU>!t:ϧ5ٲ3Gv\ȿgަ\z;X2ug< VGBzqt zjv 75zt O길CIIZCzqyz7QwwSY/u\xzwe9:3*63*6j>KOazR۴~fr*T5Uo%c(o[TqsI=o) MeVnYxNa5zdF`' C}EH>Y~SU𫂯v| 7 V9؉AVGx+sA&7sgdm5,$V UGt[+ GR$.EyY^ hK6Qቬt5icE.w/KWt٫2ʠK}<0Y'ܟ@6WEEOP5=J/~_ =ՠ7f(g^"$^"$oCVoĺBr-SԲ#74%L`}:??LO#Ē+xy!^)Oژ9 ֯u;'IwF򦳱T^rRat/,`ï($G,wCRa` G::%rUC u1\+Lu2ꢜIo-w&n/ Ul6w0o ӱ_}ì,_o3*ֲ{{G|Z0r|o+Ե86M/8+xn,ZNjMcoyB{63xx2>b;`?FL{7('LK|V `5v[̷\.z~(=Gk칓a|米? E4d~|?l+/;eq2|fnvVa_wW9=߷x_wxQ{GyxİORVye0_zTT8_`䓖Sl'&_Lg-ߋZV·'E;cO[L| \|,-<5{{x|L&̗/U^+xG [g>3q_%!|N[دUVv9K}*CIu]z/='et{Twzh{;>Ro詝\ZK|zmAku/]g׃PA\УmWe =;лۙOzy~Coxz|wZGc燿` G=0Oˆ/Qo W|EGF/ fU+pVl/[ʭZ%_[ |3[0L/N1ɫ7oßMendstream endobj 169 0 obj << /Type /Page /Parent 3 0 R /Contents 170 0 R /Resources 4 0 R >> endobj 170 0 obj << /Length 4180 /Filter /FlateDecode >> stream xZK&W_QK{1y?FH3tK,,iV'#"VyɌ̪|}~O/t}vzvY:{ϮzIwJ:_g^K>߾dpKŧjc5f|{CzY\U\w^Wyn&|k?_,f׿r~g6a]O߾5ϖﺏgOut<;m;!rkwf.j[z>Uu0k?>Z簿{ .?ˏPj_|Om'o޽^?F؊o]la_=Yxb|;+ޏcl^L:9|763hV̝[ɶI`Dޜ?x-̞eǤw }i?&a>ox Ij* D(O2߄lo+ir\ajlɩmnCnaɬNMǶ40--&hցX2t3l c67cc!8 9MZMni'<v4lJ[8n[&kn] b%3&O|.0 ӏJDTᆼΉC´x!4܏Q^d?^FPoi /* 緰|YX)8M0/m! R k"ҿ9ί3^ baVwyp}0 o/"!.#5ºX y`[FM~ c>ce?|鿱_㴇=$Þ6Mɇ uOy8O[Hyw tmdfQf|? |+ح<}z<"^L*^<툷<=3^ rLJ3f ~_@OS7_^gswz𡩐4{; u>_J&T>0%ކ0Ml<3䝜k&[zf*^oD3a|A:4i=<~=~4aG6H&yGMV4o2OeɯK&y e]fy3wby3k|.sd7B&xE2̮|2pL3/uq#eŏw8?\&fxlSLLrk,2ݡ>]#zWշk宾!ٵy_dܻo}j]86 zD^1z8_|$1_>V gj=賗Ο|5_Vgkxl.eYE]~kZR$*VSHTR8LB&C 0d 3ΨhMo~?|UA!*桠j'X @w~7`(XJc, Xٱ'+rK?fbc=p?#"@7kbڔ82z13' b 2LP;ϻÄbh`ojZYqGE?Wo-H:o*Ĵ_-LWUnL(~2rt4V.Y FfpF]K M .;SGmROuFP*L_rFחjej?#3; F{A:w/L0ƿm';_W0΍eH[9B̊{ctq?Q, b>[V*z r AN.~-|#{kz|=Ms~sBy.oy#M7_, 4Z͇?^WSßE3O_1xX^AFyhM;_@̓OW7F{p!M PX|'|ᎊ 3^oN+ӨbAџO75EGAXL X̠||WU>!t:ϧ5ٲ3Gv\ȿgަ\z;X2ug< VGBzqt zjv 75zt O길CIIZCzqyz7QwwSY/u\xzwe9:3*63*6j>KOazR۴~fr*T5Uo%c(o[TqsI=o) MeVnYxNa5zdF`' C}EH>Y~SU𫂯v| 7 V9؉AVGx+sA&7sgdm5,$V UGt[+ GR$.EyY^ hK6Qቬt5icE.w/KWt٫2ʠK}<0Y'ܟ@6WEEOP5=J/~_ =ՠ7f(g^"$^"$oCVoĺBr-SԲ#74%L`}:??LO#Ē+xy!^)Oژ9 ֯u;'IwF򦳱T^rRat/,`ï($G,wCRa` G::%rUC u1\+Lu2ꢜIo-w&n/ Ul6w0o ӱ_}ì,_o3*ֲ{{G|Z0r|o+Ե86M/8+xn,ZNjMcoyB{63xx2>b;`?FL{7('LK|V `5v[̷\.z~(=Gk칓a|米? E4d~|?l+/;eq2|fnvVa_wW9=߷x_wxQ{GyxİORVye0_zTT8_`䓖Sl'&_Lg-ߋZV·'E;cO[L| \|,-<5{{x|L&̗/U^+xG [g>3q_%!|N[دUVv9K}*CIu]z/='et{Twzh{;>Ro詝\ZK|zmAku/]g׃PA\УmWe =;лۙOzy~Coxz|wZGc燿` G=0Oˆ/Qo W|EGF/ fU+pVl/[ʭZ%_[ |3[0L/N1ɫ7oßMendstream endobj 171 0 obj << /Type /Page /Parent 3 0 R /Contents 172 0 R /Resources 4 0 R >> endobj 172 0 obj << /Length 4180 /Filter /FlateDecode >> stream xZK&W_QK{1y?FH3tK,,iV'#"VyɌ̪|}~O/t}vzvY:{ϮzIwJ:_g^K>߾dpKŧjc5f|{CzY\U\w^Wyn&|k?_,f׿r~g6a]O߾5ϖﺏgOut<;m;!rkwf.j[z>Uu0k?>Z簿{ .?ˏPj_|Om'o޽^?F؊o]la_=Yxb|;+ޏcl^L:9|763hV̝[ɶI`Dޜ?x-̞eǤw }i?&a>ox Ij* D(O2߄lo+ir\ajlɩmnCnaɬNMǶ40--&hցX2t3l c67cc!8 9MZMni'<v4lJ[8n[&kn] b%3&O|.0 ӏJDTᆼΉC´x!4܏Q^d?^FPoi /* 緰|YX)8M0/m! R k"ҿ9ί3^ baVwyp}0 o/"!.#5ºX y`[FM~ c>ce?|鿱_㴇=$Þ6Mɇ uOy8O[Hyw tmdfQf|? |+ح<}z<"^L*^<툷<=3^ rLJ3f ~_@OS7_^gswz𡩐4{; u>_J&T>0%ކ0Ml<3䝜k&[zf*^oD3a|A:4i=<~=~4aG6H&yGMV4o2OeɯK&y e]fy3wby3k|.sd7B&xE2̮|2pL3/uq#eŏw8?\&fxlSLLrk,2ݡ>]#zWշk宾!ٵy_dܻo}j]86 zD^1z8_|$1_>V gj=賗Ο|5_Vgkxl.eYE]~kZR$*VSHTR8LB&C 0d 3ΨhMo~?|UA!*桠j'X @w~7`(XJc, Xٱ'+rK?fbc=p?#"@7kbڔ82z13' b 2LP;ϻÄbh`ojZYqGE?Wo-H:o*Ĵ_-LWUnL(~2rt4V.Y FfpF]K M .;SGmROuFP*L_rFחjej?#3; F{A:w/L0ƿm';_W0΍eH[9B̊{ctq?Q, b>[V*z r AN.~-|#{kz|=Ms~sBy.oy#M7_, 4Z͇?^WSßE3O_1xX^AFyhM;_@̓OW7F{p!M PX|'|ᎊ 3^oN+ӨbAџO75EGAXL X̠||WU>!t:ϧ5ٲ3Gv\ȿgަ\z;X2ug< VGBzqt zjv 75zt O길CIIZCzqyz7QwwSY/u\xzwe9:3*63*6j>KOazR۴~fr*T5Uo%c(o[TqsI=o) MeVnYxNa5zdF`' C}EH>Y~SU𫂯v| 7 V9؉AVGx+sA&7sgdm5,$V UGt[+ GR$.EyY^ hK6Qቬt5icE.w/KWt٫2ʠK}<0Y'ܟ@6WEEOP5=J/~_ =ՠ7f(g^"$^"$oCVoĺBr-SԲ#74%L`}:??LO#Ē+xy!^)Oژ9 ֯u;'IwF򦳱T^rRat/,`ï($G,wCRa` G::%rUC u1\+Lu2ꢜIo-w&n/ Ul6w0o ӱ_}ì,_o3*ֲ{{G|Z0r|o+Ե86M/8+xn,ZNjMcoyB{63xx2>b;`?FL{7('LK|V `5v[̷\.z~(=Gk칓a|米? E4d~|?l+/;eq2|fnvVa_wW9=߷x_wxQ{GyxİORVye0_zTT8_`䓖Sl'&_Lg-ߋZV·'E;cO[L| \|,-<5{{x|L&̗/U^+xG [g>3q_%!|N[دUVv9K}*CIu]z/='et{Twzh{;>Ro詝\ZK|zmAku/]g׃PA\УmWe =;лۙOzy~Coxz|wZGc燿` G=0Oˆ/Qo W|EGF/ fU+pVl/[ʭZ%_[ |3[0L/N1ɫ7oßMendstream endobj 173 0 obj << /Type /Page /Parent 3 0 R /Contents 174 0 R /Resources 4 0 R >> endobj 174 0 obj << /Length 4279 /Filter /FlateDecode >> stream xZKub"wV@H8"ᅤ(JI9[3ϴaB>=vۗtpk~(Zo5ȷ2ҽۻnq7_~rݯ뺝~ÿvߗv%ݾ?$pח~Վoo_l=j?>+>X>z>X?q~><]z}y7aoĸpכ| x{Y:7?>/zS_zgjS]W;^||ʳjS]糝‰bXFX̅D`Ń"r)8#B=h]N^=ML/>_rx!re8{GLr_ 0!sƉr7c량=%T;Ŕ%Ӻ,`)CJ°%O㞺pO)3'> X 4\?ۮ<ȄRڸ&6l 1_II4܉q ,E#r@zO f |s<,zfWаbt nYZ{p1Bqֺ&$arǓ8r] FFʬ(JJrZ&ӓ۪ ҽ:ٺ^/4KNl>͜|}1mPݤҍ]#<9gɳ(l.\* Da}:,}YD:β<14_dh73;{i4-ƃ4hNR4tL ( .SFi¨Kgo2 GUѕ4ð "[\eN<;7Qg OVa: C\K<80o/|dU[Uxi]Mݙ~>62HiKԅc>1R\,ixp~s8tTJyi$ Ķ{"ks: <6\$84oJzx 3@y# v2OCTۗo?Dk( [|[a3*?S#B_$wٿQ1~w<,忤e*F-<\~]{XL..*1#ɭq q*ɉEd`[Ma!-Mل یeQkdx-1`/aƶٯ1 3nv29ie ْfy.#aHVd&-tV1Ƅ4lXjDQa;Ur9$9C "88E#*C x1պ2sܧڃm):xB-}r 6@ub7`3ވjS5;!?3e\VO {0,_σ#nVwlHjO:*P@V+|Vy+2#ርW.% [[fVB`6ybgbu 򟚹 ZEjff 7Ƌ>)#~oHdonSm5 eI|v7pw|R|4dn:fn)_|Fy1>\[D4Bźr>| e>;V|O3ĶEAӜƳ7tK:QQgCw]Q/˞E=eX\YoW߿3e Į_ėIMC/COzް}=g5bwo'!1}xS?c|a75B2ޛ-[A䫇gt@[O? {OvCg^ei[BaaߩӞPO׶emq`#oo=4swzz5l~a\`w꡻><%=*JV8f[LIR,K2DۭD꥙#BޅpOe~I_e\jJׅ=誋e^]{.*}Eq c~ѯGz{0JNxtp v,],]#vx z5]0fLby qB$"\N@OpPlwR>JeЪw}'_fQ!hb\ot:=G94F\L/2%sK rԽ C2O˫T˫&*0UA-|{M%NyH1ݚ˙6-_<4%.ַ<ʬzہ$-tV],7oU_,[ kEtM{݀!ې=^XSeC-hʁ}Hȿr]@kG|9 ^hT?&M(Q]@bK.5L9`Zz7ʏ989 ^K^7]-~wXSrXڄn֤>摿5)1JfnifD%V;W9L’SC!_9Nٳrm8V_}GZfxIJw[o^sCэu7cܶ7C.v`@;γہ}^njZ׶`^Wl)+ʎaxVXx|T;y|x_aUf;em|Zݏ|[Xmz=kۋo3yL{zU/j~v|Ssyv|Ujl)^V[̧t|K|\5<5 c{MYz0zAq뉮g!~wzg=g?=!Ӯi};]oirc[k/c]/? {g=@C`SzCC`5,߷Y=G$m=b߭Vnf|i@=j@7kL =7e[Ź =9gXom=:cܶꈷL[ώiM̭]JO[or7xo^vLz^z?Ư~%_'ot7z=M>>*J|ۭ;EWv)-B-~|*\u&T4C~{~{.o$endstream endobj 175 0 obj << /Type /Page /Parent 3 0 R /Contents 176 0 R /Resources 4 0 R >> endobj 176 0 obj << /Length 4279 /Filter /FlateDecode >> stream xZKub"wV@H8"ᅤ(JI9[3ϴaB>=vۗtpk~(Zo5ȷ2ҽۻnq7_~rݯ뺝~ÿvߗv%ݾ?$pח~Վoo_l=j?>+>X>z>X?q~><]z}y7aoĸpכ| x{Y:7?>/zS_zgjS]W;^||ʳjS]糝‰bXFX̅D`Ń"r)8#B=h]N^=ML/>_rx!re8{GLr_ 0!sƉr7c량=%T;Ŕ%Ӻ,`)CJ°%O㞺pO)3'> X 4\?ۮ<ȄRڸ&6l 1_II4܉q ,E#r@zO f |s<,zfWаbt nYZ{p1Bqֺ&$arǓ8r] FFʬ(JJrZ&ӓ۪ ҽ:ٺ^/4KNl>͜|}1mPݤҍ]#<9gɳ(l.\* Da}:,}YD:β<14_dh73;{i4-ƃ4hNR4tL ( .SFi¨Kgo2 GUѕ4ð "[\eN<;7Qg OVa: C\K<80o/|dU[Uxi]Mݙ~>62HiKԅc>1R\,ixp~s8tTJyi$ Ķ{"ks: <6\$84oJzx 3@y# v2OCTۗo?Dk( [|[a3*?S#B_$wٿQ1~w<,忤e*F-<\~]{XL..*1#ɭq q*ɉEd`[Ma!-Mل یeQkdx-1`/aƶٯ1 3nv29ie ْfy.#aHVd&-tV1Ƅ4lXjDQa;Ur9$9C "88E#*C x1պ2sܧڃm):xB-}r 6@ub7`3ވjS5;!?3e\VO {0,_σ#nVwlHjO:*P@V+|Vy+2#ርW.% [[fVB`6ybgbu 򟚹 ZEjff 7Ƌ>)#~oHdonSm5 eI|v7pw|R|4dn:fn)_|Fy1>\[D4Bźr>| e>;V|O3ĶEAӜƳ7tK:QQgCw]Q/˞E=eX\YoW߿3e Į_ėIMC/COzް}=g5bwo'!1}xS?c|a75B2ޛ-[A䫇gt@[O? {OvCg^ei[BaaߩӞPO׶emq`#oo=4swzz5l~a\`w꡻><%=*JV8f[LIR,K2DۭD꥙#BޅpOe~I_e\jJׅ=誋e^]{.*}Eq c~ѯGz{0JNxtp v,],]#vx z5]0fLby qB$"\N@OpPlwR>JeЪw}'_fQ!hb\ot:=G94F\L/2%sK rԽ C2O˫T˫&*0UA-|{M%NyH1ݚ˙6-_<4%.ַ<ʬzہ$-tV],7oU_,[ kEtM{݀!ې=^XSeC-hʁ}Hȿr]@kG|9 ^hT?&M(Q]@bK.5L9`Zz7ʏ989 ^K^7]-~wXSrXڄn֤>摿5)1JfnifD%V;W9L’SC!_9Nٳrm8V_}GZfxIJw[o^sCэu7cܶ7C.v`@;γہ}^njZ׶`^Wl)+ʎaxVXx|T;y|x_aUf;em|Zݏ|[Xmz=kۋo3yL{zU/j~v|Ssyv|Ujl)^V[̧t|K|\5<5 c{MYz0zAq뉮g!~wzg=g?=!Ӯi};]oirc[k/c]/? {g=@C`SzCC`5,߷Y=G$m=b߭Vnf|i@=j@7kL =7e[Ź =9gXom=:cܶꈷL[ώiM̭]JO[or7xo^vLz^z?Ư~%_'ot7z=M>>*J|ۭ;EWv)-B-~|*\u&T4C~{~{.o$endstream endobj 177 0 obj << /Type /Page /Parent 3 0 R /Contents 178 0 R /Resources 4 0 R >> endobj 178 0 obj << /Length 4180 /Filter /FlateDecode >> stream xZK&W_QK{1y?FH3tK,,iV'#"VyɌ̪|}~O/t}vzvY:{ϮzIwJ:_g^K>߾dpKŧjc5f|{CzY\U\w^Wyn&|k?_,f׿r~g6a]O߾5ϖﺏgOut<;m;!rkwf.j[z>Uu0k?>Z簿{ .?ˏPj_|Om'o޽^?F؊o]la_=Yxb|;+ޏcl^L:9|763hV̝[ɶI`Dޜ?x-̞eǤw }i?&a>ox Ij* D(O2߄lo+ir\ajlɩmnCnaɬNMǶ40--&hցX2t3l c67cc!8 9MZMni'<v4lJ[8n[&kn] b%3&O|.0 ӏJDTᆼΉC´x!4܏Q^d?^FPoi /* 緰|YX)8M0/m! R k"ҿ9ί3^ baVwyp}0 o/"!.#5ºX y`[FM~ c>ce?|鿱_㴇=$Þ6Mɇ uOy8O[Hyw tmdfQf|? |+ح<}z<"^L*^<툷<=3^ rLJ3f ~_@OS7_^gswz𡩐4{; u>_J&T>0%ކ0Ml<3䝜k&[zf*^oD3a|A:4i=<~=~4aG6H&yGMV4o2OeɯK&y e]fy3wby3k|.sd7B&xE2̮|2pL3/uq#eŏw8?\&fxlSLLrk,2ݡ>]#zWշk宾!ٵy_dܻo}j]86 zD^1z8_|$1_>V gj=賗Ο|5_Vgkxl.eYE]~kZR$*VSHTR8LB&C 0d 3ΨhMo~?|UA!*桠j'X @w~7`(XJc, Xٱ'+rK?fbc=p?#"@7kbڔ82z13' b 2LP;ϻÄbh`ojZYqGE?Wo-H:o*Ĵ_-LWUnL(~2rt4V.Y FfpF]K M .;SGmROuFP*L_rFחjej?#3; F{A:w/L0ƿm';_W0΍eH[9B̊{ctq?Q, b>[V*z r AN.~-|#{kz|=Ms~sBy.oy#M7_, 4Z͇?^WSßE3O_1xX^AFyhM;_@̓OW7F{p!M PX|'|ᎊ 3^oN+ӨbAџO75EGAXL X̠||WU>!t:ϧ5ٲ3Gv\ȿgަ\z;X2ug< VGBzqt zjv 75zt O길CIIZCzqyz7QwwSY/u\xzwe9:3*63*6j>KOazR۴~fr*T5Uo%c(o[TqsI=o) MeVnYxNa5zdF`' C}EH>Y~SU𫂯v| 7 V9؉AVGx+sA&7sgdm5,$V UGt[+ GR$.EyY^ hK6Qቬt5icE.w/KWt٫2ʠK}<0Y'ܟ@6WEEOP5=J/~_ =ՠ7f(g^"$^"$oCVoĺBr-SԲ#74%L`}:??LO#Ē+xy!^)Oژ9 ֯u;'IwF򦳱T^rRat/,`ï($G,wCRa` G::%rUC u1\+Lu2ꢜIo-w&n/ Ul6w0o ӱ_}ì,_o3*ֲ{{G|Z0r|o+Ե86M/8+xn,ZNjMcoyB{63xx2>b;`?FL{7('LK|V `5v[̷\.z~(=Gk칓a|米? E4d~|?l+/;eq2|fnvVa_wW9=߷x_wxQ{GyxİORVye0_zTT8_`䓖Sl'&_Lg-ߋZV·'E;cO[L| \|,-<5{{x|L&̗/U^+xG [g>3q_%!|N[دUVv9K}*CIu]z/='et{Twzh{;>Ro詝\ZK|zmAku/]g׃PA\УmWe =;лۙOzy~Coxz|wZGc燿` G=0Oˆ/Qo W|EGF/ fU+pVl/[ʭZ%_[ |3[0L/N1ɫ7oßMendstream endobj 179 0 obj << /Type /Page /Parent 3 0 R /Contents 180 0 R /Resources 4 0 R >> endobj 180 0 obj << /Length 4180 /Filter /FlateDecode >> stream xZK&W_QK{1y?FH3tK,,iV'#"VyɌ̪|}~O/t}vzvY:{ϮzIwJ:_g^K>߾dpKŧjc5f|{CzY\U\w^Wyn&|k?_,f׿r~g6a]O߾5ϖﺏgOut<;m;!rkwf.j[z>Uu0k?>Z簿{ .?ˏPj_|Om'o޽^?F؊o]la_=Yxb|;+ޏcl^L:9|763hV̝[ɶI`Dޜ?x-̞eǤw }i?&a>ox Ij* D(O2߄lo+ir\ajlɩmnCnaɬNMǶ40--&hցX2t3l c67cc!8 9MZMni'<v4lJ[8n[&kn] b%3&O|.0 ӏJDTᆼΉC´x!4܏Q^d?^FPoi /* 緰|YX)8M0/m! R k"ҿ9ί3^ baVwyp}0 o/"!.#5ºX y`[FM~ c>ce?|鿱_㴇=$Þ6Mɇ uOy8O[Hyw tmdfQf|? |+ح<}z<"^L*^<툷<=3^ rLJ3f ~_@OS7_^gswz𡩐4{; u>_J&T>0%ކ0Ml<3䝜k&[zf*^oD3a|A:4i=<~=~4aG6H&yGMV4o2OeɯK&y e]fy3wby3k|.sd7B&xE2̮|2pL3/uq#eŏw8?\&fxlSLLrk,2ݡ>]#zWշk宾!ٵy_dܻo}j]86 zD^1z8_|$1_>V gj=賗Ο|5_Vgkxl.eYE]~kZR$*VSHTR8LB&C 0d 3ΨhMo~?|UA!*桠j'X @w~7`(XJc, Xٱ'+rK?fbc=p?#"@7kbڔ82z13' b 2LP;ϻÄbh`ojZYqGE?Wo-H:o*Ĵ_-LWUnL(~2rt4V.Y FfpF]K M .;SGmROuFP*L_rFחjej?#3; F{A:w/L0ƿm';_W0΍eH[9B̊{ctq?Q, b>[V*z r AN.~-|#{kz|=Ms~sBy.oy#M7_, 4Z͇?^WSßE3O_1xX^AFyhM;_@̓OW7F{p!M PX|'|ᎊ 3^oN+ӨbAџO75EGAXL X̠||WU>!t:ϧ5ٲ3Gv\ȿgަ\z;X2ug< VGBzqt zjv 75zt O길CIIZCzqyz7QwwSY/u\xzwe9:3*63*6j>KOazR۴~fr*T5Uo%c(o[TqsI=o) MeVnYxNa5zdF`' C}EH>Y~SU𫂯v| 7 V9؉AVGx+sA&7sgdm5,$V UGt[+ GR$.EyY^ hK6Qቬt5icE.w/KWt٫2ʠK}<0Y'ܟ@6WEEOP5=J/~_ =ՠ7f(g^"$^"$oCVoĺBr-SԲ#74%L`}:??LO#Ē+xy!^)Oژ9 ֯u;'IwF򦳱T^rRat/,`ï($G,wCRa` G::%rUC u1\+Lu2ꢜIo-w&n/ Ul6w0o ӱ_}ì,_o3*ֲ{{G|Z0r|o+Ե86M/8+xn,ZNjMcoyB{63xx2>b;`?FL{7('LK|V `5v[̷\.z~(=Gk칓a|米? E4d~|?l+/;eq2|fnvVa_wW9=߷x_wxQ{GyxİORVye0_zTT8_`䓖Sl'&_Lg-ߋZV·'E;cO[L| \|,-<5{{x|L&̗/U^+xG [g>3q_%!|N[دUVv9K}*CIu]z/='et{Twzh{;>Ro詝\ZK|zmAku/]g׃PA\УmWe =;лۙOzy~Coxz|wZGc燿` G=0Oˆ/Qo W|EGF/ fU+pVl/[ʭZ%_[ |3[0L/N1ɫ7oßMendstream endobj 181 0 obj << /Type /Page /Parent 3 0 R /Contents 182 0 R /Resources 4 0 R >> endobj 182 0 obj << /Length 3995 /Filter /FlateDecode >> stream xZKlE:91 Q&AԐ 0 2:Uڻ;?>yǗo~c֫GQgzy|~}H?'˷_ݟ[s|`k؋Os2]-=rmWW*Z<רtϼ[Z0_c ە`UsY\˼`2v.<Ն`vwWwnX ^{ b5Սnpnƒ%]U(›9.3<9S-WZ0Sq;c~O^RئbN\!Уz2{9rt9?~\>@䱚ȟk8,Ce⵷7Ao-`3괛tYAqh=xS!KQl&|HVYx+M daߤ-%yuϽ* l?$9·Ki5GJCӴO9pjJB ҰɔQpeoQMt4-0l« Sx'|DO1{慆kc.U|Maim<̾b oSA&{:K0yF t[]$i>ߨͥx[=@e x[<*WЄuy4|=+4Ro4fpieqHk< wЎ/c~ jq > 9of~ >˹j3o;HQo|Ǯ|K >űoV7>^#n5̐ρw=tr@3\-gZC2RDҫR*d|{9o y+8e2yQq>oeVa?(F ~c~!#/=?d9,;,Co??d {e ¤y!s?ݲ2hCF|?2 az2 8iibYg7NCyGD`kHazLM*fRgÔ(PM[ԣ6b %h.Q_ՈjwzS`f6@v`58ǫRdT͋KdKPd W.%OgRtRyZl@uHb5nf\jQr3;!? m\QO |06^c wI6$VKyT(Kc5aanʺ&BŠU(b8bGo%a{,\!6/CL,.ASS3W@ [-Sl[AB~Tu!V2x\bg</MmRbm5}Q|2ݍ ~{Q|[oXXN,U/.P~$2 kUa}7oR'! ð*U*]+0|oK-boVC>(ƃB<_a!AEfH *u(jSG|"V~Uoj7٫I*`b _i_u~o϶W2-GuHۨ^_|x9!lU@éTGvr=Z?Ǟfo|\aQǟ+:LtC/'oHo񸪻;O<#-x_1-8{<x|:jʒt '_-|;hmα>i>tͮ1>bSn|[OuiE>r%ʦ>* rcڍ]ӌ~zQ4'c ݒo(W{׳!e~;bwV/E=eXg2ןL]s9=q4IzxWx!So^#Wv=g/md=Mtzk=nz i!i[- CЋ+:'ߦ {OvCc^ei[ޝ俻^g@==_;z{֣ǁOCr>{yUBr*[GB8'jXvnK2DۭLK3GÅM pOz׽aĩ¡atCÎH\OKt:v`[8~p缥 K:3,ᔈGed8Lj`̘fy qB$"\N@OpPlwR?q}*ҁG9>kePQړY}?<][|FFzaa('&܈k{<9ô24u5ⴳ]ry ryD?"Or$)O<<{v9s&VybH^|)^oy4%S[m=`b|_RuZ_Tx?Mr=vi/0d |||r;t@U]*_r^nG3pې덁FcA)޴*u$Vr"_꒣VN(?Ėq}v.a}V}iXmI*%<5g~*]Xfc۲h[.!ƃ`+[їjMXrs?$Y"{67Ǵ&K>8oH| Xnhd]/FP`~[1n;[!yN;pvsځs_fqӱ`콃?_;9d1o|x!WN'`ջoPXjGN<;|8@o_E>Gg{|1"7F=AKKEK=|Ҍv|ӠK}v|rg-|6ߵ_V>kef)*=77t q X9=æW=PW DW!~׻}q竞|g\6ϟ_Ӯi{;]oizǴǷ􇿌u=+쵟:'Ɵ7z]ǧ+{Z=G;;~tЎqK'bZ]Z񫗣<_.[Ώ^?P_e[u~zr=abvqѫ3e:zvքޝ1^|~_~a_E?q,>p<|0*Wϊ2h5?.4S>Z-[~YOAzcEKS>/_}_7>Ozvendstream endobj 183 0 obj << /Type /Page /Parent 3 0 R /Contents 184 0 R /Resources 4 0 R >> endobj 184 0 obj << /Length 3995 /Filter /FlateDecode >> stream xZKlE:91 Q&AԐ 0 2:Uڻ;?>yǗo~c֫GQgzy|~}H?'˷_ݟ[s|`k؋Os2]-=rmWW*Z<רtϼ[Z0_c ە`UsY\˼`2v.<Ն`vwWwnX ^{ b5Սnpnƒ%]U(›9.3<9S-WZ0Sq;c~O^RئbN\!Уz2{9rt9?~\>@䱚ȟk8,Ce⵷7Ao-`3괛tYAqh=xS!KQl&|HVYx+M daߤ-%yuϽ* l?$9·Ki5GJCӴO9pjJB ҰɔQpeoQMt4-0l« Sx'|DO1{慆kc.U|Maim<̾b oSA&{:K0yF t[]$i>ߨͥx[=@e x[<*WЄuy4|=+4Ro4fpieqHk< wЎ/c~ jq > 9of~ >˹j3o;HQo|Ǯ|K >űoV7>^#n5̐ρw=tr@3\-gZC2RDҫR*d|{9o y+8e2yQq>oeVa?(F ~c~!#/=?d9,;,Co??d {e ¤y!s?ݲ2hCF|?2 az2 8iibYg7NCyGD`kHazLM*fRgÔ(PM[ԣ6b %h.Q_ՈjwzS`f6@v`58ǫRdT͋KdKPd W.%OgRtRyZl@uHb5nf\jQr3;!? m\QO |06^c wI6$VKyT(Kc5aanʺ&BŠU(b8bGo%a{,\!6/CL,.ASS3W@ [-Sl[AB~Tu!V2x\bg</MmRbm5}Q|2ݍ ~{Q|[oXXN,U/.P~$2 kUa}7oR'! ð*U*]+0|oK-boVC>(ƃB<_a!AEfH *u(jSG|"V~Uoj7٫I*`b _i_u~o϶W2-GuHۨ^_|x9!lU@éTGvr=Z?Ǟfo|\aQǟ+:LtC/'oHo񸪻;O<#-x_1-8{<x|:jʒt '_-|;hmα>i>tͮ1>bSn|[OuiE>r%ʦ>* rcڍ]ӌ~zQ4'c ݒo(W{׳!e~;bwV/E=eXg2ןL]s9=q4IzxWx!So^#Wv=g/md=Mtzk=nz i!i[- CЋ+:'ߦ {OvCc^ei[ޝ俻^g@==_;z{֣ǁOCr>{yUBr*[GB8'jXvnK2DۭLK3GÅM pOz׽aĩ¡atCÎH\OKt:v`[8~p缥 K:3,ᔈGed8Lj`̘fy qB$"\N@OpPlwR?q}*ҁG9>kePQړY}?<][|FFzaa('&܈k{<9ô24u5ⴳ]ry ryD?"Or$)O<<{v9s&VybH^|)^oy4%S[m=`b|_RuZ_Tx?Mr=vi/0d |||r;t@U]*_r^nG3pې덁FcA)޴*u$Vr"_꒣VN(?Ėq}v.a}V}iXmI*%<5g~*]Xfc۲h[.!ƃ`+[їjMXrs?$Y"{67Ǵ&K>8oH| Xnhd]/FP`~[1n;[!yN;pvsځs_fqӱ`콃?_;9d1o|x!WN'`ջoPXjGN<;|8@o_E>Gg{|1"7F=AKKEK=|Ҍv|ӠK}v|rg-|6ߵ_V>kef)*=77t q X9=æW=PW DW!~׻}q竞|g\6ϟ_Ӯi{;]oizǴǷ􇿌u=+쵟:'Ɵ7z]ǧ+{Z=G;;~tЎqK'bZ]Z񫗣<_.[Ώ^?P_e[u~zr=abvqѫ3e:zvքޝ1^|~_~a_E?q,>p<|0*Wϊ2h5?.4S>Z-[~YOAzcEKS>/_}_7>Ozvendstream endobj 185 0 obj << /Type /Page /Parent 3 0 R /Contents 186 0 R /Resources 4 0 R >> endobj 186 0 obj << /Length 3995 /Filter /FlateDecode >> stream xZKlE:91 Q&AԐ 0 2:Uڻ;?>yǗo~c֫GQgzy|~}H?'˷_ݟ[s|`k؋Os2]-=rmWW*Z<רtϼ[Z0_c ە`UsY\˼`2v.<Ն`vwWwnX ^{ b5Սnpnƒ%]U(›9.3<9S-WZ0Sq;c~O^RئbN\!Уz2{9rt9?~\>@䱚ȟk8,Ce⵷7Ao-`3괛tYAqh=xS!KQl&|HVYx+M daߤ-%yuϽ* l?$9·Ki5GJCӴO9pjJB ҰɔQpeoQMt4-0l« Sx'|DO1{慆kc.U|Maim<̾b oSA&{:K0yF t[]$i>ߨͥx[=@e x[<*WЄuy4|=+4Ro4fpieqHk< wЎ/c~ jq > 9of~ >˹j3o;HQo|Ǯ|K >űoV7>^#n5̐ρw=tr@3\-gZC2RDҫR*d|{9o y+8e2yQq>oeVa?(F ~c~!#/=?d9,;,Co??d {e ¤y!s?ݲ2hCF|?2 az2 8iibYg7NCyGD`kHazLM*fRgÔ(PM[ԣ6b %h.Q_ՈjwzS`f6@v`58ǫRdT͋KdKPd W.%OgRtRyZl@uHb5nf\jQr3;!? m\QO |06^c wI6$VKyT(Kc5aanʺ&BŠU(b8bGo%a{,\!6/CL,.ASS3W@ [-Sl[AB~Tu!V2x\bg</MmRbm5}Q|2ݍ ~{Q|[oXXN,U/.P~$2 kUa}7oR'! ð*U*]+0|oK-boVC>(ƃB<_a!AEfH *u(jSG|"V~Uoj7٫I*`b _i_u~o϶W2-GuHۨ^_|x9!lU@éTGvr=Z?Ǟfo|\aQǟ+:LtC/'oHo񸪻;O<#-x_1-8{<x|:jʒt '_-|;hmα>i>tͮ1>bSn|[OuiE>r%ʦ>* rcڍ]ӌ~zQ4'c ݒo(W{׳!e~;bwV/E=eXg2ןL]s9=q4IzxWx!So^#Wv=g/md=Mtzk=nz i!i[- CЋ+:'ߦ {OvCc^ei[ޝ俻^g@==_;z{֣ǁOCr>{yUBr*[GB8'jXvnK2DۭLK3GÅM pOz׽aĩ¡atCÎH\OKt:v`[8~p缥 K:3,ᔈGed8Lj`̘fy qB$"\N@OpPlwR?q}*ҁG9>kePQړY}?<][|FFzaa('&܈k{<9ô24u5ⴳ]ry ryD?"Or$)O<<{v9s&VybH^|)^oy4%S[m=`b|_RuZ_Tx?Mr=vi/0d |||r;t@U]*_r^nG3pې덁FcA)޴*u$Vr"_꒣VN(?Ėq}v.a}V}iXmI*%<5g~*]Xfc۲h[.!ƃ`+[їjMXrs?$Y"{67Ǵ&K>8oH| Xnhd]/FP`~[1n;[!yN;pvsځs_fqӱ`콃?_;9d1o|x!WN'`ջoPXjGN<;|8@o_E>Gg{|1"7F=AKKEK=|Ҍv|ӠK}v|rg-|6ߵ_V>kef)*=77t q X9=æW=PW DW!~׻}q竞|g\6ϟ_Ӯi{;]oizǴǷ􇿌u=+쵟:'Ɵ7z]ǧ+{Z=G;;~tЎqK'bZ]Z񫗣<_.[Ώ^?P_e[u~zr=abvqѫ3e:zvքޝ1^|~_~a_E?q,>p<|0*Wϊ2h5?.4S>Z-[~YOAzcEKS>/_}_7>Ozvendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R 9 0 R 11 0 R 13 0 R 15 0 R 17 0 R 19 0 R 21 0 R 23 0 R 25 0 R 27 0 R 29 0 R 31 0 R 33 0 R 35 0 R 37 0 R 39 0 R 41 0 R 43 0 R 45 0 R 47 0 R 49 0 R 51 0 R 53 0 R 55 0 R 57 0 R 59 0 R 61 0 R 63 0 R 65 0 R 67 0 R 69 0 R 71 0 R 73 0 R 75 0 R 77 0 R 79 0 R 81 0 R 83 0 R 85 0 R 87 0 R 89 0 R 91 0 R 93 0 R 95 0 R 97 0 R 99 0 R 101 0 R 103 0 R 105 0 R 107 0 R 109 0 R 111 0 R 113 0 R 115 0 R 117 0 R 119 0 R 121 0 R 123 0 R 125 0 R 127 0 R 129 0 R 131 0 R 133 0 R 135 0 R 137 0 R 139 0 R 141 0 R 143 0 R 145 0 R 147 0 R 149 0 R 151 0 R 153 0 R 155 0 R 157 0 R 159 0 R 161 0 R 163 0 R 165 0 R 167 0 R 169 0 R 171 0 R 173 0 R 175 0 R 177 0 R 179 0 R 181 0 R 183 0 R 185 0 R ] /Count 90 /MediaBox [0 0 504 504] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 188 0 R /F2 189 0 R /F3 190 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 187 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 188 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 189 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 187 0 R >> endobj 190 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 187 0 R >> endobj xref 0 191 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000472377 00000 n 0000473126 00000 n 0000473264 00000 n 0000473297 00000 n 0000000212 00000 n 0000000292 00000 n 0000001075 00000 n 0000001156 00000 n 0000005429 00000 n 0000005511 00000 n 0000009740 00000 n 0000009822 00000 n 0000014153 00000 n 0000014235 00000 n 0000018565 00000 n 0000018647 00000 n 0000023001 00000 n 0000023083 00000 n 0000024022 00000 n 0000024104 00000 n 0000029530 00000 n 0000029612 00000 n 0000030551 00000 n 0000030633 00000 n 0000036059 00000 n 0000036141 00000 n 0000036998 00000 n 0000037080 00000 n 0000042506 00000 n 0000042588 00000 n 0000053993 00000 n 0000054075 00000 n 0000184195 00000 n 0000184277 00000 n 0000185102 00000 n 0000185184 00000 n 0000189496 00000 n 0000189578 00000 n 0000193891 00000 n 0000193973 00000 n 0000198289 00000 n 0000198371 00000 n 0000202810 00000 n 0000202892 00000 n 0000207227 00000 n 0000207309 00000 n 0000211648 00000 n 0000211730 00000 n 0000216047 00000 n 0000216129 00000 n 0000220485 00000 n 0000220567 00000 n 0000224930 00000 n 0000225012 00000 n 0000225837 00000 n 0000225919 00000 n 0000230232 00000 n 0000230314 00000 n 0000231163 00000 n 0000231245 00000 n 0000235589 00000 n 0000235671 00000 n 0000236505 00000 n 0000236587 00000 n 0000240910 00000 n 0000240992 00000 n 0000245319 00000 n 0000245401 00000 n 0000249749 00000 n 0000249831 00000 n 0000250656 00000 n 0000250738 00000 n 0000254447 00000 n 0000254529 00000 n 0000258061 00000 n 0000258143 00000 n 0000262431 00000 n 0000262513 00000 n 0000266187 00000 n 0000266269 00000 n 0000269765 00000 n 0000269847 00000 n 0000274050 00000 n 0000274132 00000 n 0000277748 00000 n 0000277830 00000 n 0000281255 00000 n 0000281337 00000 n 0000282162 00000 n 0000282244 00000 n 0000286557 00000 n 0000286639 00000 n 0000287488 00000 n 0000287570 00000 n 0000291914 00000 n 0000291996 00000 n 0000292830 00000 n 0000292913 00000 n 0000297237 00000 n 0000297321 00000 n 0000301649 00000 n 0000301733 00000 n 0000306082 00000 n 0000306166 00000 n 0000310398 00000 n 0000310482 00000 n 0000314790 00000 n 0000314874 00000 n 0000319159 00000 n 0000319243 00000 n 0000320069 00000 n 0000320153 00000 n 0000323863 00000 n 0000323947 00000 n 0000327480 00000 n 0000327564 00000 n 0000331798 00000 n 0000331882 00000 n 0000336235 00000 n 0000336319 00000 n 0000340649 00000 n 0000340733 00000 n 0000341518 00000 n 0000341602 00000 n 0000345876 00000 n 0000345960 00000 n 0000350203 00000 n 0000350287 00000 n 0000354601 00000 n 0000354685 00000 n 0000358999 00000 n 0000359083 00000 n 0000363397 00000 n 0000363481 00000 n 0000367724 00000 n 0000367808 00000 n 0000372051 00000 n 0000372135 00000 n 0000376378 00000 n 0000376462 00000 n 0000380705 00000 n 0000380789 00000 n 0000385032 00000 n 0000385116 00000 n 0000389359 00000 n 0000389443 00000 n 0000393480 00000 n 0000393564 00000 n 0000397591 00000 n 0000397675 00000 n 0000398434 00000 n 0000398518 00000 n 0000402831 00000 n 0000402915 00000 n 0000407169 00000 n 0000407253 00000 n 0000411606 00000 n 0000411690 00000 n 0000416043 00000 n 0000416127 00000 n 0000420480 00000 n 0000420564 00000 n 0000424917 00000 n 0000425001 00000 n 0000429354 00000 n 0000429438 00000 n 0000433692 00000 n 0000433776 00000 n 0000438030 00000 n 0000438114 00000 n 0000442368 00000 n 0000442452 00000 n 0000446805 00000 n 0000446889 00000 n 0000451242 00000 n 0000451326 00000 n 0000455580 00000 n 0000455664 00000 n 0000459918 00000 n 0000460002 00000 n 0000464071 00000 n 0000464155 00000 n 0000468224 00000 n 0000468308 00000 n 0000475992 00000 n 0000476251 00000 n 0000476336 00000 n 0000476436 00000 n trailer << /Size 191 /Info 1 0 R /Root 2 0 R >> startxref 476541 %%EOF vioplot/tests/testthat/test_violin_na_handle.R0000755000176200001440000000236313411056063021431 0ustar liggesuserslibrary("vioplot") context("NA handling for vector or formula input") test_that("plot data list input", { data(iris) iris[2,3]<-NA boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length") }) test_that("plot vector formula input", { boxplot(iris$Sepal.Length~iris$Species) vioplot(iris$Sepal.Length~iris$Species) }) test_that("plot column formula with dataframe input", { boxplot(Sepal.Length~Species, data=iris) vioplot(Sepal.Length~Species, data=iris) }) test_that("plot formula with dataframe input and scalar colour", { vioplot(Sepal.Length~Species, data=iris, col="lightblue") }) test_that("plot formula with dataframe input and vector colour", { vioplot(Sepal.Length~Species, data=iris, col=c("lightgreen", "lightblue", "palevioletred")) }) # iris <- as.matrix(iris) # test_that("plot column formula with matrix input", { # vioplot(Sepal.Length~Species, data=iris) # }) vioplot/tests/testthat/test_violin_unequal_groups.R0000755000176200001440000000117413411056063022570 0ustar liggesuserslibrary("vioplot") context("unequal group size") data(iris) table(iris$Species) identical(as.numeric(table(iris$Species)), c(50, 50, 50)) index <- sample(1:3,150,replace=T) while(identical(as.numeric(table(index)), c(50, 50, 50))) index <- sample(1:3,150,replace=T) table(index) iris$Species <- factor(names(table(iris$Species))[index]) test_that("list input", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"]) }) test_that("formulae input", { vioplot(iris$Sepal.Length~iris$Species) vioplot(Sepal.Length~Species, data=iris) }) vioplot/tests/testthat/test_violin_area.R0000755000176200001440000000410513411056063020424 0ustar liggesuserslibrary("vioplot") context("controlling area") test_that("plot defaults", { data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) }) ##Violin Plot Area test_that("equal area with areaEqual TRUE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", areaEqual = TRUE) }) test_that("equal width with areaEqual FALSE", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Width)", areaEqual = FALSE) }) test_that("equal area with areaEqual with vector colours", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = TRUE, col=c("lightgreen", "lightblue", "palevioletred"), rectCol=c("green", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), border=c("darkolivegreen4", "royalblue4", "violetred4")) }) test_that("equal area with areaEqual and wex scaling", { vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = TRUE, col=c("lightgreen", "lightblue", "palevioletred"), rectCol=c("green", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), border=c("darkolivegreen4", "royalblue4", "violetred4"), wex=1.25) }) vioplot/tests/testthat.R0000755000176200001440000000007214027267745015113 0ustar liggesuserslibrary(testthat) library(vioplot) test_check("vioplot") vioplot/vignettes/0000755000176200001440000000000014077721435013770 5ustar liggesusersvioplot/vignettes/violin_split.Rmd0000755000176200001440000001641114027763472017157 0ustar liggesusers--- title: "Split Violin Plots" author: "Tom Kelly" date: "`r Sys.Date()`" output: rmarkdown::html_vignette fig_width: 6 fig_height: 3 fig_align: 'center' fig_keep: 'last' vignette: > %\VignetteIndexEntry{vioplot: Split Violin Plots} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ##Violin Plots Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits: - Greater flexibility for plotting variation than boxplots - More familiarity to boxplot users than density plots - Easier to directly compare data types than existing plots As shown below for the `iris` dataset, violin plots show distribution information that the boxplot is unable to. ###General Set up ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} library("vioplot") ``` We set up the data with two categories (Sepal Width) as follows: ```{r, message=FALSE} data(iris) summary(iris$Sepal.Width) table(iris$Sepal.Width > mean(iris$Sepal.Width)) iris_large <- iris[iris$Sepal.Width > mean(iris$Sepal.Width), ] iris_small <- iris[iris$Sepal.Width <= mean(iris$Sepal.Width), ] ``` ###Boxplots First we plot Sepal Length on its own: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} boxplot(Sepal.Length~Species, data=iris, col="grey") ``` An indirect comparison can be achieved with par: ```{r, fig.align = 'center', fig.height = 6, fig.width = 6, fig.keep = 'last'} { par(mfrow=c(2,1)) boxplot(Sepal.Length~Species, data=iris_small, col = "lightblue") boxplot(Sepal.Length~Species, data=iris_large, col = "palevioletred") par(mfrow=c(1,1)) } ``` ### Violin Plots First we plot Sepal Length on its own: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris) ``` An indirect comparison can be achieved with par: ```{r, fig.align = 'center', fig.height = 6, fig.width = 6, fig.keep = 'last'} { par(mfrow=c(2,1)) vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line") vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line") par(mfrow=c(1,1)) } ``` ### Split Violin Plots A more direct comparision can be made with the `side` argument and `add = TRUE` on the second plot: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", add = T) title(xlab = "Species", ylab = "Sepal Length") legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width") ``` #### Custom axes labels Custom axes labels are supported for split violin plots. However, you must use these arguments on the *first* call of `vioplot`. ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right", xlab = "Iris species", ylab = "Length", main = "Sepals", names=paste("Iris", levels(iris$Species))) vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", add = T) legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Width") ``` Note that this is disabled for the second `vioplot` call to avoid overlaying labels. ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", add = T, xlab = "Iris species", ylab = "Length", main = "Sepals", names=paste("Iris", levels(iris$Species))) legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Width") ``` #### Median The line median option is more suitable for side by side comparisions but the point option is still available also: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "point", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "point", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T) title(xlab = "Species", ylab = "Sepal Length") legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width") ``` It may be necessary to include a `points` command to fix the median being overwritten by the following plots: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "point", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "point", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T) points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_large[grep(species, iris_large$Species),]$Sepal.Length))), pch = 21, col = "palevioletred4", bg = "palevioletred2") title(xlab = "Species", ylab = "Sepal Length") legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width") ``` Similarly points could be added where a line has been used previously: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T) points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_large[grep(species, iris_large$Species),]$Sepal.Length))), pch = 21, col = "palevioletred4", bg = "palevioletred2") points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_small[grep(species, iris_small$Species),]$Sepal.Length))), pch = 21, col = "lightblue4", bg = "lightblue2") title(xlab = "Species", ylab = "Sepal Length") legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width") ``` Here it is aesthetically pleasing and intuitive to interpret categorical differences in mean and variation in a continuous variable. #### Sources These extensions to `vioplot` here are based on those provided here: * https://gist.github.com/mbjoseph/5852613 These have previously been discussed on the following sites: * https://mbjoseph.github.io/posts/2018-12-23-split-violin-plots/ * http://tagteam.harvard.edu/hub_feeds/1981/feed_items/209875 * [https://www.r-bloggers.com/split-violin-plots/](https://www.r-bloggers.com/2013/06/split-violin-plots/) vioplot/vignettes/backup/0000755000176200001440000000000013507674421015234 5ustar liggesusersvioplot/vignettes/backup/violin_split.Rmd0000644000176200001440000001374313507652103020414 0ustar liggesusers--- title: "Split Violin Plots" author: "Tom Kelly" date: "`r Sys.Date()`" output: rmarkdown::html_vignette fig_width: 6 fig_height: 3 fig_align: 'center' fig_keep: 'last' vignette: > %\VignetteIndexEntry{vioplot: Split Violin Plots} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ##Violin Plots Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits: - Greater flexbility for plotting variation than boxplots - More familiarity to boxplot users than density plots - Easier to directly compare data types than existing plots As shown below for the `iris` dataset, violin plots show distribution information that the boxplot is unable to. ###General Set up ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} library("vioplot") ``` We set up the data with two categories (Sepal Width) as follows: ```{r, message=FALSE} data(iris) summary(iris$Sepal.Width) table(iris$Sepal.Width > mean(iris$Sepal.Width)) iris_large <- iris[iris$Sepal.Width > mean(iris$Sepal.Width), ] iris_small <- iris[iris$Sepal.Width <= mean(iris$Sepal.Width), ] ``` ###Boxplots First we plot Sepal Length on its own: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} boxplot(Sepal.Length~Species, data=iris, col="grey") ``` An indirect comparison can be achieved with par: ```{r, fig.align = 'center', fig.height = 6, fig.width = 6, fig.keep = 'last'} { par(mfrow=c(2,1)) boxplot(Sepal.Length~Species, data=iris_small, col = "lightblue") boxplot(Sepal.Length~Species, data=iris_large, col = "palevioletred") par(mfrow=c(1,1)) } ``` ### Violin Plots First we plot Sepal Length on its own: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris) ``` An indirect comparison can be achieved with par: ```{r, fig.align = 'center', fig.height = 6, fig.width = 6, fig.keep = 'last'} { par(mfrow=c(2,1)) vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line") vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line") par(mfrow=c(1,1)) } ``` ### Split Violin Plots A more direct comparison can be made with the `side` argument and `add = TRUE` on the second plot: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", add = T) title(xlab = "Species", ylab = "Sepal Length") legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width") ``` ### median The line median option is more suitable for side by side comparisons but the point option is still available also: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "point", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "point", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T) title(xlab = "Species", ylab = "Sepal Length") legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width") ``` It may be necessary to include a `points` command to fix the median being overwritten by the following plots: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "point", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "point", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T) points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_large[grep(species, iris_large$Species),]$Sepal.Length))), pch = 21, col = "palevioletred4", bg = "palevioletred2") title(xlab = "Species", ylab = "Sepal Length") legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width") ``` Similarly points could be added where a line has been used previously: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T) points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_large[grep(species, iris_large$Species),]$Sepal.Length))), pch = 21, col = "palevioletred4", bg = "palevioletred2") points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_small[grep(species, iris_small$Species),]$Sepal.Length))), pch = 21, col = "lightblue4", bg = "lightblue2") title(xlab = "Species", ylab = "Sepal Length") legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width") ``` Here it is aesthetically pleasing and intuitive to interpret categorical differences in mean and variation in a continuous variable. #### Sources These extensions to `vioplot` here are based on those provided here: * https://gist.github.com/mbjoseph/5852613 These have previously been discussed on the following sites: * https://mbjoseph.github.io/posts/2018-12-23-split-violin-plots/ * http://tagteam.harvard.edu/hub_feeds/1981/feed_items/209875 * https://www.r-bloggers.com/split-violin-plots/ vioplot/vignettes/backup/violin_ylog.Rmd0000644000176200001440000001121113507661566020234 0ustar liggesusers--- title: "Controlling y-axis Plotting" author: "Tom Kelly" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{vioplot: Controlling y-axis Plotting} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- While boxplots have become the _de facto_ standard for plotting the distribution of data this is a vast oversimplification and may not show everything needed to evaluate the variation of data. This is particularly important for datasets which do not form a Gaussian "Normal" distribution that most researchers have become accustomed to. While density plots are helpful in this regard, they can be less aesthetically pleasing than boxplots and harder to interpret for those familiar with boxplots. Often the only ways to compare multiple data types with density use slices of the data with faceting the plotting panes or overlaying density curves with colours and a legend. This approach is jarring for new users and leads to cluttered plots difficult to present to a wider audience. ##Violin Plots Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits: - Greater flexbility for plotting variation than boxplots - More familiarity to boxplot users than density plots - Easier to directly compare data types than existing plots As shown below for the `iris` dataset, violin plots show distribution information that the boxplot is unable to. ```{r} library("vioplot") ``` ```{r, message=FALSE} data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) ``` ##Violin y-axis ###Logarithmic scale However the existing violin plot packages (such as \code{\link[vioplot]{vioplot}}) do not support log-scale of the y-axis. This has been amended with the `ylog` argument. ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = T) ``` This can also be invoked with the `log="y"` argument compatible with `boxplot`: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = T) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = "y") ``` Log axis can also be passed to horizontal plots: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = "", horizontal = TRUE) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = "y", horizontal = TRUE) ``` ###custom y-axes The y-axes can also be removed with `yaxt="n"` to enable customised y-axes: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = T, yaxt="n") ``` Thus custom axes can be added to violin plots. As shown on a linear scale: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n") axis(2, at=1:10, labels=1:10) ``` As well as for on a log scale: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n", log="y", ylim=c(log(4), log(9))) axis(2, at=log(1:10), labels=1:10) ``` vioplot/vignettes/backup/violin_split.html0000755000176200001440000462432313320630501020636 0ustar liggesusers Split Violin Plots vioplot/vignettes/backup/violin_area.html0000755000176200001440000537227213320630501020417 0ustar liggesusers Controlling Violin Plot Area

While boxplots have become the de facto standard for plotting the distribution of data this is a vast oversimplification and may not show everything needed to evaluate the variation of data. This is particularly important for datasets which do not form a Guassian “Normal” distribution that most researchers have become accustomed to.

While density plots are helpful in this regard, they can be less aesthetically pleasing than boxplots and harder to interpret for those familiar with boxplots. Often the only ways to compare multiple data types with density use slices of the data with faceting the plotting panes or overlaying density curves with colours and a legend. This approach is jarring for new users and leads to cluttered plots difficult to present to a wider audience.

Violin Plots

Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits:

  • Greater flexbility for plotting variation than boxplots
  • More familiarity to boxplot users than density plots
  • Easier to directly compare data types than existing plots

As shown below for the iris dataset, violin plots show distribution information that the boxplot is unable to.

data(iris)
boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"))

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"))

Violin Plot Area

However there are concerns that existing violin plot packages (such as ) scales the data to the most aesthetically suitable width rather than maintaining proportions comparable across data sets. Consider the differing distributions shown below:

par(mfrow=c(3, 1))
par(mar=rep(2, 4))
plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length: setosa", col="green")
plot(density(iris$Sepal.Length[iris$Species=="versicolor"]), main="Sepal Length: versicolor", col="blue")
plot(density(iris$Sepal.Length[iris$Species=="virginica"]), main="Sepal Length: virginica", col="palevioletred4")

par(mfrow=c(1, 1))

Comparing datasets

Neither of these plots above show the relative distribtions on the same scale, even if we match the x-axis of a density plot the relative heights are obscured and difficult to compare.

par(mfrow=c(3, 1))
par(mar=rep(2, 4))
xaxis <- c(3, 9)
yaxis <- c(0, 1.25)
plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length: setosa", col="green", xlim=xaxis, ylim=yaxis)
plot(density(iris$Sepal.Length[iris$Species=="versicolor"]), main="Sepal Length: versicolor", col="blue", xlim=xaxis, ylim=yaxis)
plot(density(iris$Sepal.Length[iris$Species=="virginica"]), main="Sepal Length: virginica", col="palevioletred4", xlim=xaxis, ylim=yaxis)

par(mfrow=c(1, 1))

This can somewhat be addressed by overlaying density plots:

par(mfrow=c(1, 1))
xaxis <- c(3, 9)
yaxis <- c(0, 1.25)
plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length", col="green", xlim=xaxis, ylim=yaxis)
lines(density(iris$Sepal.Length[iris$Species=="versicolor"]), col="blue")
lines(density(iris$Sepal.Length[iris$Species=="virginica"]), col="palevioletred4")
legend("topright", fill=c("green", "blue", "palevioletred4"), legend=levels(iris$Species), cex=0.5)

This has the benefit of highlighting the differnt distributions of the data subsets. However, notice here that a figure legend become necessary, plot axis limits need to be defined to display the range of all distribution curves, and the plot quickly becomes cluttered if the number of factors to be compared becomes much larger.

Area control in Violin plot

Therefore the areaEqual parameter has been echod to customise the violin plot to serve a similar purpose:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", areaEqual = T)

If we compare this to the original vioplot functionality (defaulting to areaEqual = FALSE) the differences between the two are clear.

par(mfrow=c(2,1))
par(mar=rep(2, 4))
vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Width)", areaEqual = F)
vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T)

par(mfrow=c(1,1))

Note that areaEqual is considering the full area of the density distribution before removing the outlier tails. We leave it up to the users discretion which they elect to use. The areaEqual functionality is compatible with all of the customisation used in discussed in the main vioplot vignette

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), rectCol=c("green", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), border=c("darkolivegreen4", "royalblue4", "violetred4"))

The violin width can further be scaled with wex, which maintains the proportions across the datasets if areaEqual = TRUE:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), rectCol=c("green", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), border=c("darkolivegreen4", "royalblue4", "violetred4"), wex=1.25)

Comparing distributions

Notice the utility of areaEqual for cases where different datasets have different underlying distributions:

vioplot(rnorm(200, 3, 0.5), rpois(200, 2.5),  rbinom(100, 10, 0.4), rlnorm(200, 0, 0.5), rnbinom(200, 10, 0.9), rlogis(20, 0, 0.5), areaEqual = F, main="Equal Width", xlab="distribution", ylab="data value", names=c("normal", "poisson", "binomial", "log-normal", "neg-binomial", "logistic"))

vioplot(rnorm(200, 3, 0.5), rpois(200, 2.5),  rbinom(100, 10, 0.4), rlnorm(200, 0, 0.5), rnbinom(200, 10, 0.9), rlogis(20, 0, 0.5), areaEqual = T, main="Equal Area", xlab="distribution", ylab="data value", names=c("normal", "poisson", "binomial", "log-normal", "neg-binomial", "logistic"))

vioplot/vignettes/backup/violin_area.Rmd0000644000176200001440000001714213507652102020165 0ustar liggesusers--- title: "Controlling Violin Plot Area" author: "Tom Kelly" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{vioplot: Controlling Violin Plot Area} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- While boxplots have become the _de facto_ standard for plotting the distribution of data this is a vast oversimplification and may not show everything needed to evaluate the variation of data. This is particularly important for datasets which do not form a Gaussian "Normal" distribution that most researchers have become accustomed to. While density plots are helpful in this regard, they can be less aesthetically pleasing than boxplots and harder to interpret for those familiar with boxplots. Often the only ways to compare multiple data types with density use slices of the data with faceting the plotting panes or overlaying density curves with colours and a legend. This approach is jarring for new users and leads to cluttered plots difficult to present to a wider audience. ##Violin Plots Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits: - Greater flexibility for plotting variation than boxplots - More familiarity to boxplot users than density plots - Easier to directly compare data types than existing plots As shown below for the `iris` dataset, violin plots show distribution information that the boxplot is unable to. ```{r} library("vioplot") ``` ```{r, message=FALSE} data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) ``` ##Violin Plot Area However there are concerns that existing violin plot packages (such as \code{\link[vioplot]{vioplot}}) scales the data to the most aesthetically suitable width rather than maintaining proportions comparable across data sets. Consider the differing distributions shown below: ```{r, echo=FALSE, message=FALSE} par(mar=rep(1,4)) ``` ```{r} par(mfrow=c(3, 1)) par(mar=rep(2, 4)) plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length: setosa", col="green") plot(density(iris$Sepal.Length[iris$Species=="versicolor"]), main="Sepal Length: versicolor", col="blue") plot(density(iris$Sepal.Length[iris$Species=="virginica"]), main="Sepal Length: virginica", col="palevioletred4") par(mfrow=c(1, 1)) ``` ```{r, echo=FALSE, message=FALSE} par(mar=c(5, 4, 4, 2) + 0.1) ``` #Comparing datasets Neither of these plots above show the relative distributions on the same scale, even if we match the x-axis of a density plot the relative heights are obscured and difficult to compare. ```{r, echo=FALSE, message=FALSE} par(mar=rep(2,4)) ``` ```{r} par(mfrow=c(3, 1)) par(mar=rep(2, 4)) xaxis <- c(3, 9) yaxis <- c(0, 1.25) plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length: setosa", col="green", xlim=xaxis, ylim=yaxis) plot(density(iris$Sepal.Length[iris$Species=="versicolor"]), main="Sepal Length: versicolor", col="blue", xlim=xaxis, ylim=yaxis) plot(density(iris$Sepal.Length[iris$Species=="virginica"]), main="Sepal Length: virginica", col="palevioletred4", xlim=xaxis, ylim=yaxis) par(mfrow=c(1, 1)) ``` ```{r, echo=FALSE, message=FALSE} par(mar=c(5, 4, 4, 2) + 0.1) ``` This can somewhat be addressed by overlaying density plots: ```{r} par(mfrow=c(1, 1)) xaxis <- c(3, 9) yaxis <- c(0, 1.25) plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length", col="green", xlim=xaxis, ylim=yaxis) lines(density(iris$Sepal.Length[iris$Species=="versicolor"]), col="blue") lines(density(iris$Sepal.Length[iris$Species=="virginica"]), col="palevioletred4") legend("topright", fill=c("green", "blue", "palevioletred4"), legend=levels(iris$Species), cex=0.5) ``` This has the benefit of highlighting the different distributions of the data subsets. However, notice here that a figure legend become necessary, plot axis limits need to be defined to display the range of all distribution curves, and the plot quickly becomes cluttered if the number of factors to be compared becomes much larger. ##Area control in Violin plot Therefore the `areaEqual` parameter has been added to customise the violin plot to serve a similar purpose: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", areaEqual = T) ``` If we compare this to the original vioplot functionality (defaulting to `areaEqual = FALSE`) the differences between the two are clear. ```{r, echo=FALSE, message=FALSE} par(mar=rep(2, 4)) ``` ```{r} par(mfrow=c(2,1)) par(mar=rep(2, 4)) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Width)", areaEqual = F) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T) par(mfrow=c(1,1)) ``` ```{r, echo=FALSE, message=FALSE} par(mar=c(5, 4, 4, 2) + 0.1) ``` Note that `areaEqual` is considering the full area of the density distribution before removing the outlier tails. We leave it up to the users discretion which they elect to use. The `areaEqual` functionality is compatible with all of the customisation used in discussed in [the main vioplot vignette](violin_customisation.html) ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), rectCol=c("green", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), border=c("darkolivegreen4", "royalblue4", "violetred4")) ``` The violin width can further be scaled with `wex`, which maintains the proportions across the datasets if `areaEqual = TRUE`: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), rectCol=c("green", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), border=c("darkolivegreen4", "royalblue4", "violetred4"), wex=1.25) ``` ## Comparing distributions Notice the utility of `areaEqual` for cases where different datasets have different underlying distributions: ```{r} vioplot(rnorm(200, 3, 0.5), rpois(200, 2.5), rbinom(100, 10, 0.4), rlnorm(200, 0, 0.5), rnbinom(200, 10, 0.9), rlogis(20, 0, 0.5), areaEqual = F, main="Equal Width", xlab="distribution", ylab="data value", names=c("normal", "poisson", "binomial", "log-normal", "neg-binomial", "logistic")) vioplot(rnorm(200, 3, 0.5), rpois(200, 2.5), rbinom(100, 10, 0.4), rlnorm(200, 0, 0.5), rnbinom(200, 10, 0.9), rlogis(20, 0, 0.5), areaEqual = T, main="Equal Area", xlab="distribution", ylab="data value", names=c("normal", "poisson", "binomial", "log-normal", "neg-binomial", "logistic")) ``` vioplot/vignettes/backup/violin_formulae.html0000755000176200001440000547060213320630501021315 0ustar liggesusers Customising Violin Plots

Since boxplots have become the de facto standard for plotting the distribution of data most users are familiar with these and the formula input for dataframes. However this input is not available in the standard vioplot package. Thus it has been restored here for enhanced backwards compatibility with boxplot.

As shown below for the iris dataset, violin plots show distribution information taking formula input that boxplot implements but vioplot is unable to. This demonstrates the customisation demonstrated in the main vioplot vignette using vioplot syntax with the formula method commonly used for boxplot, t.test, and lm.

data(iris)
boxplot(Sepal.Length~Species, data = iris)

Whereas performing the same function does not work with vioplot.

library("vioplot")
vioplot(Sepal.Length~Species, data = iris)
Error in min(data) : invalid 'type' (language) of argument

Plot Defaults

vioplot(Sepal.Length~Species, data = iris)

Another concern we see here is that the vioplot defaults are not aesthetically pleasing, with a rather glaring colour scheme unsuitable for professional or academic usage. Thus the plot default colours have been changed as shown here:

vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length")

Plot colours: Violin Fill

Plot colours can be further customised as with the original vioplot package using the col argument:

vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="lightblue")

Vectorisation

However the vioplot function is unable to colour each violin separately, thus this is enabled with a vectorised col in vioplot:

vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col=c("lightgreen", "lightblue", "palevioletred"))
legend("topleft", legend=c("setosa", "versicolor", "virginica"), fill=c("lightgreen", "lightblue", "palevioletred"), cex = 0.5)

Plot colours: Violin Lines and Boxplot

Colours can also be customised for the violin fill and border separately using the col and border arguments:

vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="lightblue", border="royalblue")

Similarly, the arguments lineCol and rectCol specify the colors of the boxplot outline and rectangle fill. For simplicity the box and whiskers of the boxplot will always have the same colour.

vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", rectCol="palevioletred", lineCol="violetred")

The same applies to the colour of the median point with colMed:

vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", colMed="violet")

### Combined customisation

These can be customised colours can be combined:

vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="lightblue", border="royalblue", rectCol="palevioletred", lineCol="violetred", colMed="violet")

Vectorisation

These color and shape settings can also be customised separately for each violin:

vioplot(Sepal.Length~Species, data = iris, main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), border=c("darkolivegreen4", "royalblue4", "violetred4"), rectCol=c("forestgreen", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), colMed=c("green", "cyan", "magenta"), pchMed=c(15, 17, 19))

vioplot/vignettes/backup/violin_ylog.html0000755000176200001440000350530213320630501020447 0ustar liggesusers Controlling y-axis Plotting

While boxplots have become the de facto standard for plotting the distribution of data this is a vast oversimplification and may not show everything needed to evaluate the variation of data. This is particularly important for datasets which do not form a Guassian “Normal” distribution that most researchers have become accustomed to.

While density plots are helpful in this regard, they can be less aesthetically pleasing than boxplots and harder to interpret for those familiar with boxplots. Often the only ways to compare multiple data types with density use slices of the data with faceting the plotting panes or overlaying density curves with colours and a legend. This approach is jarring for new users and leads to cluttered plots difficult to present to a wider audience.

Violin Plots

Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits:

  • Greater flexbility for plotting variation than boxplots
  • More familiarity to boxplot users than density plots
  • Easier to directly compare data types than existing plots

As shown below for the iris dataset, violin plots show distribution information that the boxplot is unable to.

data(iris)
boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"))

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"))

Violin y-axis

Logarithmic scale

However the existing violin plot packages (such as ) do not support log-scale of the y-axis. This has been ammended with the ylog argument.

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = T, ylim=c(log(1), log(10)))

This can also be invoked with the log="y" argument compatble with boxplot:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = T, ylim=c(log(1), log(10)))
vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = "y", ylim=c(log(1), log(10)))

custom y-axes

The y-axes can also be removed with yaxt="n" to enable customised y-axes:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n")

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = T, yaxt="n", ylim=c(log(1), log(10)))

Thus custom axes can be added to violin plots. As shown on a linear scale:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n")
axis(2, at=1:10, labels=1:10)

As well as for on a log scale:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n", log="y", ylim=c(log(4), log(9)))
axis(2, at=log(1:10), labels=1:10)

vioplot/vignettes/backup/violin_customisation.html0000755000176200001440000547574413320630501022420 0ustar liggesusers Customising Violin Plots

While boxplots have become the de facto standard for plotting the distribution of data this is a vast oversimplification and may not show everything needed to evaluate the variation of data. This is particularly important for datasets which do not form a Guassian “Normal” distribution that most researchers have become accustomed to.

While density plots are helpful in this regard, they can be less aesthetically pleasing than boxplots and harder to interpret for those familiar with boxplots. Often the only ways to compare multiple data types with density use slices of the data with faceting the plotting panes or overlaying density curves with colours and a legend. This approach is jarring for new users and leads to cluttered plots difficult to present to a wider audience.

Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits:

  • Greater flexbility for plotting variation than boxplots
  • More familiarity to boxplot users than density plots
  • Easier to directly compare data types than existing plots

As shown below for the iris dataset, violin plots show distribution information that the boxplot is unable to.

data(iris)
boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"))
library("vioplot")
vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"))

Plot Defaults

However as we can see here the plot defaults are not aesthetically pleasing, with a rather glaring colour scheme unsuitable for professional or academic usage. Thus the plot default colours have been changed as shown here:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length")

Plot colours: Violin Fill

Plot colours can be further customised as with the original vioplot package using the col argument:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue")

Vectorisation

However the vioplot function is unable to colour each violin separately, thus this is enabled with a vectorised col in vioplot:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col=c("lightgreen", "lightblue", "palevioletred"))
legend("topleft", legend=c("setosa", "versicolor", "virginica"), fill=c("lightgreen", "lightblue", "palevioletred"), cex = 0.5)

Plot colours: Violin Lines and Boxplot

Colours can also be customised for the violin fill and border separately using the col and border arguments:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue", border="royalblue")

Similarly, the arguments lineCol and rectCol specify the colors of the boxplot outline and rectangle fill. For simplicity the box and whiskers of the boxplot will always have the same colour.

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", rectCol="palevioletred", lineCol="violetred")

The same applies to the colour of the median point with colMed:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", colMed="violet")

### Combined customisation

These can be customised colours can be combined:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue", border="royalblue", rectCol="palevioletred", lineCol="violetred", colMed="violet")

Vectorisation

These color and shape settings can also be customised separately for each violin:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), border=c("darkolivegreen4", "royalblue4", "violetred4"), rectCol=c("forestgreen", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), colMed=c("green", "cyan", "magenta"), pchMed=c(15, 17, 19))

This should be sufficient to customise the violin plot but further examples are given in the areaEqual vioplot vignette including how violin plots are useful for comparing variation when data does not follow the same distribution. This document also compares the violin plot with other established methods to plot data variation.

vioplot/vignettes/backup/violin_customisation.Rmd0000644000176200001440000001453413507651667022177 0ustar liggesusers--- title: "Customising Violin Plots" author: "Tom Kelly" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{vioplot: Customising Violin Plots} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- While boxplots have become the _de facto_ standard for plotting the distribution of data this is a vast oversimplification and may not show everything needed to evaluate the variation of data. This is particularly important for datasets which do not form a Gaussian "Normal" distribution that most researchers have become accustomed to. While density plots are helpful in this regard, they can be less aesthetically pleasing than boxplots and harder to interpret for those familiar with boxplots. Often the only ways to compare multiple data types with density use slices of the data with faceting the plotting panes or overlaying density curves with colours and a legend. This approach is jarring for new users and leads to cluttered plots difficult to present to a wider audience. Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits: - Greater flexbility for plotting variation than boxplots - More familiarity to boxplot users than density plots - Easier to directly compare data types than existing plots As shown below for the `iris` dataset, violin plots show distribution information that the boxplot is unable to. ```{r} library("vioplot") ``` ```{r, message=FALSE, eval=FALSE} data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) library("vioplot") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) ``` ```{r, message=FALSE, echo=FALSE} data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="magenta") ``` ## Plot Defaults However as we can see here the plot defaults are not aesthetically pleasing, with a rather glaring colour scheme unsuitable for professional or academic usage. Thus the plot default colours have been changed as shown here: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length") ``` ## Plot colours: Violin Fill Plot colours can be further customised as with the original vioplot package using the `col` argument: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue") ``` ### Vectorisation However the `vioplot` (0.2) function is unable to colour each violin separately, thus this is enabled with a vectorised `col` in `vioplot` (0.3): ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col=c("lightgreen", "lightblue", "palevioletred")) legend("topleft", legend=c("setosa", "versicolor", "virginica"), fill=c("lightgreen", "lightblue", "palevioletred"), cex = 0.5) ``` ## Plot colours: Violin Lines and Boxplot Colours can also be customised for the violin fill and border separately using the `col` and `border` arguments: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue", border="royalblue") ``` Similarly, the arguments `lineCol` and `rectCol` specify the colours of the boxplot outline and rectangle fill. For simplicity the box and whiskers of the boxplot will always have the same colour. ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", rectCol="palevioletred", lineCol="violetred") ``` The same applies to the colour of the median point with `colMed`: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", colMed="violet") ``` ### Combined customisation These can be customised colours can be combined: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue", border="royalblue", rectCol="palevioletred", lineCol="violetred", colMed="violet") ``` ### Vectorisation These colour and shape settings can also be customised separately for each violin: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), border=c("darkolivegreen4", "royalblue4", "violetred4"), rectCol=c("forestgreen", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), colMed=c("green", "cyan", "magenta"), pchMed=c(15, 17, 19)) ``` This should be sufficient to customise the violin plot but further examples are given in [the areaEqual vioplot vignette](violin_area.html) including how violin plots are useful for comparing variation when data does not follow the same distribution. This document also compares the violin plot with other established methods to plot data variation. vioplot/vignettes/violin_ylog.Rmd0000755000176200001440000001031614027267745016776 0ustar liggesusers--- title: "Controlling y-axis Plotting" author: "Tom Kelly" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{vioplot: Controlling y-axis Plotting} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- While boxplots have become the _de facto_ standard for plotting the distribution of data this is a vast oversimplification and may not show everything needed to evaluate the variation of data. This is particularly important for datasets which do not form a Gaussian "Normal" distribution that most researchers have become accustomed to. While density plots are helpful in this regard, they can be less aesthetically pleasing than boxplots and harder to interpret for those familiar with boxplots. Often the only ways to compare multiple data types with density use slices of the data with faceting the plotting panes or overlaying density curves with colours and a legend. This approach is jarring for new users and leads to cluttered plots difficult to present to a wider audience. ##Violin Plots Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits: - Greater flexibility for plotting variation than boxplots - More familiarity to boxplot users than density plots - Easier to directly compare data types than existing plots As shown below for the `iris` dataset, violin plots show distribution information that the boxplot is unable to. ```{r} library("vioplot") ``` ```{r, message=FALSE} data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) ``` ##Violin y-axis ###Logarithmic scale However the existing violin plot packages (such as \code{\link[vioplot]{vioplot}}) do not support log-scale of the y-axis. This has been amended with the `ylog` argument. ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = T, ylim=c(log(1), log(10))) ``` This can also be invoked with the `log="y"` argument compatible with `boxplot`: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = T, ylim=c(log(1), log(10))) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = "y", ylim=c(log(1), log(10))) ``` ###custom y-axes The y-axes can also be removed with `yaxt="n"` to enable customised y-axes: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = T, yaxt="n", ylim=c(log(1), log(10))) ``` Thus custom axes can be added to violin plots. As shown on a linear scale: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n") axis(2, at=1:10, labels=1:10) ``` As well as for on a log scale: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n", log="y", ylim=c(log(4), log(9))) axis(2, at=log(1:10), labels=1:10) ``` vioplot/vignettes/violin_area.Rmd0000755000176200001440000001714114027267745016737 0ustar liggesusers--- title: "Controlling Violin Plot Area" author: "Tom Kelly" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{vioplot: Controlling Violin Plot Area} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- While boxplots have become the _de facto_ standard for plotting the distribution of data this is a vast oversimplification and may not show everything needed to evaluate the variation of data. This is particularly important for datasets which do not form a Gaussian "Normal" distribution that most researchers have become accustomed to. While density plots are helpful in this regard, they can be less aesthetically pleasing than boxplots and harder to interpret for those familiar with boxplots. Often the only ways to compare multiple data types with density use slices of the data with faceting the plotting panes or overlaying density curves with colours and a legend. This approach is jarring for new users and leads to cluttered plots difficult to present to a wider audience. ##Violin Plots Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits: - Greater flexibility for plotting variation than boxplots - More familiarity to boxplot users than density plots - Easier to directly compare data types than existing plots As shown below for the `iris` dataset, violin plots show distribution information that the boxplot is unable to. ```{r} library("vioplot") ``` ```{r, message=FALSE} data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) ``` ##Violin Plot Area However there are concerns that existing violin plot packages (such as \code{\link[vioplot]{vioplot}}) scales the data to the most aesthetically suitable width rather than maintaining proportions comparable across data sets. Consider the differing distributions shown below: ```{r, echo=FALSE, message=FALSE} par(mar=rep(1,4)) ``` ```{r} par(mfrow=c(3, 1)) par(mar=rep(2, 4)) plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length: setosa", col="green") plot(density(iris$Sepal.Length[iris$Species=="versicolor"]), main="Sepal Length: versicolor", col="blue") plot(density(iris$Sepal.Length[iris$Species=="virginica"]), main="Sepal Length: virginica", col="palevioletred4") par(mfrow=c(1, 1)) ``` ```{r, echo=FALSE, message=FALSE} par(mar=c(5, 4, 4, 2) + 0.1) ``` #Comparing datasets Neither of these plots above show the relative distribtions on the same scale, even if we match the x-axis of a density plot the relative heights are obscured and difficult to compare. ```{r, echo=FALSE, message=FALSE} par(mar=rep(2,4)) ``` ```{r} par(mfrow=c(3, 1)) par(mar=rep(2, 4)) xaxis <- c(3, 9) yaxis <- c(0, 1.25) plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length: setosa", col="green", xlim=xaxis, ylim=yaxis) plot(density(iris$Sepal.Length[iris$Species=="versicolor"]), main="Sepal Length: versicolor", col="blue", xlim=xaxis, ylim=yaxis) plot(density(iris$Sepal.Length[iris$Species=="virginica"]), main="Sepal Length: virginica", col="palevioletred4", xlim=xaxis, ylim=yaxis) par(mfrow=c(1, 1)) ``` ```{r, echo=FALSE, message=FALSE} par(mar=c(5, 4, 4, 2) + 0.1) ``` This can somewhat be addressed by overlaying density plots: ```{r} par(mfrow=c(1, 1)) xaxis <- c(3, 9) yaxis <- c(0, 1.25) plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length", col="green", xlim=xaxis, ylim=yaxis) lines(density(iris$Sepal.Length[iris$Species=="versicolor"]), col="blue") lines(density(iris$Sepal.Length[iris$Species=="virginica"]), col="palevioletred4") legend("topright", fill=c("green", "blue", "palevioletred4"), legend=levels(iris$Species), cex=0.5) ``` This has the benefit of highlighting the different distributions of the data subsets. However, notice here that a figure legend become necessary, plot axis limits need to be defined to display the range of all distribution curves, and the plot quickly becomes cluttered if the number of factors to be compared becomes much larger. ##Area control in Violin plot Therefore the `areaEqual` parameter has been added to customise the violin plot to serve a similar purpose: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", areaEqual = T) ``` If we compare this to the original vioplot functionality (defaulting to `areaEqual = FALSE`) the differences between the two are clear. ```{r, echo=FALSE, message=FALSE} par(mar=rep(2, 4)) ``` ```{r} par(mfrow=c(2,1)) par(mar=rep(2, 4)) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Width)", areaEqual = F) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T) par(mfrow=c(1,1)) ``` ```{r, echo=FALSE, message=FALSE} par(mar=c(5, 4, 4, 2) + 0.1) ``` Note that `areaEqual` is considering the full area of the density distribution before removing the outlier tails. We leave it up to the users discretion which they elect to use. The `areaEqual` functionality is compatible with all of the customisation used in discussed in [the main vioplot vignette](violin_customisation.html) ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), rectCol=c("green", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), border=c("darkolivegreen4", "royalblue4", "violetred4")) ``` The violin width can further be scaled with `wex`, which maintains the proportions across the datasets if `areaEqual = TRUE`: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), rectCol=c("green", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), border=c("darkolivegreen4", "royalblue4", "violetred4"), wex=1.25) ``` ## Comparing distributions Notice the utility of `areaEqual` for cases where different datasets have different underlying distributions: ```{r} vioplot(rnorm(200, 3, 0.5), rpois(200, 2.5), rbinom(100, 10, 0.4), rlnorm(200, 0, 0.5), rnbinom(200, 10, 0.9), rlogis(20, 0, 0.5), areaEqual = F, main="Equal Width", xlab="distribution", ylab="data value", names=c("normal", "poisson", "binomial", "log-normal", "neg-binomial", "logistic")) vioplot(rnorm(200, 3, 0.5), rpois(200, 2.5), rbinom(100, 10, 0.4), rlnorm(200, 0, 0.5), rnbinom(200, 10, 0.9), rlogis(20, 0, 0.5), areaEqual = T, main="Equal Area", xlab="distribution", ylab="data value", names=c("normal", "poisson", "binomial", "log-normal", "neg-binomial", "logistic")) ``` vioplot/vignettes/violin_formulae.Rmd0000755000176200001440000001011014027267745017626 0ustar liggesusers--- title: "Customising Violin Plots with Formula Input" author: "Tom Kelly" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{vioplot: Customising Violin Plots with Formula Input} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- Since boxplots have become the _de facto_ standard for plotting the distribution of data most users are familiar with these and the formula input for dataframes. However this input is not available in the standard `vioplot` package. Thus it has been restored here for enhanced backwards compatibility with `boxplot`. As shown below for the `iris` dataset, violin plots show distribution information taking formula input that `boxplot` implements but `vioplot` is unable to. This demonstrates the customisation demonstrated in [the main vioplot vignette using vioplot syntax](violin_customisation.html) with the formula method commonly used for `boxplot`, `t.test`, and `lm`. ```{r} library("vioplot") ``` ```{r, message=FALSE, eval=FALSE} data(iris) boxplot(Sepal.Length~Species, data = iris) ``` ```{r, message=FALSE, echo=FALSE} data(iris) boxplot(Sepal.Length~Species, data = iris, main = "Sepal Length") ``` Whereas performing the same function does not work with `vioplot` (0.2). ```{r, message=FALSE, eval=FALSE} devtools::install_version("vioplot", version = "0.2") library("vioplot") vioplot(Sepal.Length~Species, data = iris) ``` ``` Error in min(data) : invalid 'type' (language) of argument ``` ## Plot Defaults ```{r, message=FALSE, eval=FALSE} vioplot(Sepal.Length~Species, data = iris) ``` ```{r, message=FALSE, echo=FALSE} vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="magenta") ``` Another concern we see here is that the `vioplot` defaults are not aesthetically pleasing, with a rather glaring colour scheme unsuitable for professional or academic usage. Thus the plot default colours have been changed as shown here: ```{r} vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length") ``` ## Plot colours: Violin Fill Plot colours can be further customised as with the original vioplot package using the `col` argument: ```{r} vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="lightblue") ``` ### Vectorisation However the `vioplot` (0.2) function is unable to colour each violin separately, thus this is enabled with a vectorised `col` in `vioplot` (0.3): ```{r} vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col=c("lightgreen", "lightblue", "palevioletred")) legend("topleft", legend=c("setosa", "versicolor", "virginica"), fill=c("lightgreen", "lightblue", "palevioletred"), cex = 0.5) ``` ## Plot colours: Violin Lines and Boxplot Colours can also be customised for the violin fill and border separately using the `col` and `border` arguments: ```{r} vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="lightblue", border="royalblue") ``` Similarly, the arguments `lineCol` and `rectCol` specify the colours of the boxplot outline and rectangle fill. For simplicity the box and whiskers of the boxplot will always have the same colour. ```{r} vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", rectCol="palevioletred", lineCol="violetred") ``` The same applies to the colour of the median point with `colMed`: ```{r} vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", colMed="violet") ``` ### Combined customisation These can be customised colours can be combined: ```{r} vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="lightblue", border="royalblue", rectCol="palevioletred", lineCol="violetred", colMed="violet") ``` ### Vectorisation These colour and shape settings can also be customised separately for each violin: ```{r} vioplot(Sepal.Length~Species, data = iris, main="Sepal Length", col=c("lightgreen", "lightblue", "palevioletred"), border=c("darkolivegreen4", "royalblue4", "violetred4"), rectCol=c("forestgreen", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), colMed=c("green", "cyan", "magenta"), pchMed=c(15, 17, 19)) ``` vioplot/vignettes/violin_customisation.Rmd0000755000176200001440000001453314027267745020732 0ustar liggesusers--- title: "Customising Violin Plots" author: "Tom Kelly" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{vioplot: Customising Violin Plots} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- While boxplots have become the _de facto_ standard for plotting the distribution of data this is a vast oversimplification and may not show everything needed to evaluate the variation of data. This is particularly important for datasets which do not form a Gaussian "Normal" distribution that most researchers have become accustomed to. While density plots are helpful in this regard, they can be less aesthetically pleasing than boxplots and harder to interpret for those familiar with boxplots. Often the only ways to compare multiple data types with density use slices of the data with faceting the plotting panes or overlaying density curves with colours and a legend. This approach is jarring for new users and leads to cluttered plots difficult to present to a wider audience. Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits: - Greater flexibility for plotting variation than boxplots - More familiarity to boxplot users than density plots - Easier to directly compare data types than existing plots As shown below for the `iris` dataset, violin plots show distribution information that the boxplot is unable to. ```{r} library("vioplot") ``` ```{r, message=FALSE, eval=FALSE} data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) library("vioplot") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) ``` ```{r, message=FALSE, echo=FALSE} data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="magenta") ``` ## Plot Defaults However as we can see here the plot defaults are not aesthetically pleasing, with a rather glaring colour scheme unsuitable for professional or academic usage. Thus the plot default colours have been changed as shown here: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length") ``` ## Plot colours: Violin Fill Plot colours can be further customised as with the original vioplot package using the `col` argument: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue") ``` ### Vectorisation However the `vioplot` (0.2) function is unable to colour each violin separately, thus this is enabled with a vectorised `col` in `vioplot` (0.3): ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col=c("lightgreen", "lightblue", "palevioletred")) legend("topleft", legend=c("setosa", "versicolor", "virginica"), fill=c("lightgreen", "lightblue", "palevioletred"), cex = 0.5) ``` ## Plot colours: Violin Lines and Boxplot Colours can also be customised for the violin fill and border separately using the `col` and `border` arguments: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue", border="royalblue") ``` Similarly, the arguments `lineCol` and `rectCol` specify the colors of the boxplot outline and rectangle fill. For simplicity the box and whiskers of the boxplot will always have the same colour. ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", rectCol="palevioletred", lineCol="violetred") ``` The same applies to the colour of the median point with `colMed`: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", colMed="violet") ``` ### Combined customisation These can be customised colours can be combined: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue", border="royalblue", rectCol="palevioletred", lineCol="violetred", colMed="violet") ``` ### Vectorisation These color and shape settings can also be customised separately for each violin: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), border=c("darkolivegreen4", "royalblue4", "violetred4"), rectCol=c("forestgreen", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), colMed=c("green", "cyan", "magenta"), pchMed=c(15, 17, 19)) ``` This should be sufficient to customise the violin plot but further examples are given in [the areaEqual vioplot vignette](violin_area.html) including how violin plots are useful for comparing variation when data does not follow the same distribution. This document also compares the violin plot with other established methods to plot data variation. vioplot/R/0000755000176200001440000000000014027267745012165 5ustar liggesusersvioplot/R/vioplot.stats.R0000644000176200001440000000216114027267745015141 0ustar liggesusers#' Violin Plot Statistics #' #' This function is typically called by another function to gather the statistics necessary #' for producing box plots, but may be invoked separately. See: \code{\link[grDevices]{boxplot.stats}} #' #' @aliases violin.stats violinplot.stats #' @rdname violin.stats #' @param x a numeric vector for which the violin plot will be constructed \code{NA}s and \code{NaN}s are allowed and omitted). #' @param coef this determines how far the plot ‘whiskers’ extend out from the box. If coef is positive, the #' whiskers extend to the most extreme data point which is no more than coef times the length of the box away #' from the box. A value of zero causes the whiskers to extend to the data extremes (and no outliers be returned). #' @param do.conf,do.out logicals; if FALSE, the conf or out component respectively will be empty in the result. #' @param ... arguments passed to \code{\link[vioplot]{vioplot}}. #' @importFrom grDevices boxplot.stats #' @export vioplot.stats <- function(x, coef = 1.5, do.conf = TRUE, do.out = TRUE, ...){ boxplot.stats(x, coef = coef, do.conf = do.conf, do.out = do.out) } vioplot/R/vioplot.R0000755000176200001440000007105314027267745014015 0ustar liggesusers#' Violin Plot #' #' Produce violin plot(s) of the given (grouped) values with enhanced annotation and colour per group. Includes customisation of colours for each aspect of the violin, boxplot, and separate violins. This supports input of data as a list or formula, being backwards compatible with \code{\link[vioplot]{vioplot}} (0.2) and taking input in a formula as used for \code{\link[graphics]{boxplot}}. #' #' @name vioplot #' @aliases violinplot #' @param x for specifying data from which the boxplots are to be produced. Either a numeric vector, or a single list containing such vectors. Additional unnamed arguments specify further data as separate vectors (each corresponding to a component boxplot). NAs are allowed in the data. #' @param ... additional data vectors or formula parameters. For the formula method, named arguments to be passed to the default method. #' @param formula a formula, such as y ~ grp, where y is a numeric vector of data values to be split into groups according to the grouping variable grp (usually a factor). #' @param data a data.frame (or list) from which the variables in formula should be taken. #' @param use.cols logical indicating if columns (by default) or rows (use.cols = FALSE) should be plotted. #' @param subset an optional vector specifying a subset of observations to be used for plotting. #' @param drop,sep,lex.order defines groups to plot from formula, passed to \code{split.default}, see there. #' @param range a factor to calculate the upper/lower adjacent values #' @param h the height for the density estimator, if omit as explained in sm.density, h will be set to an optimum #' @param xlim,ylim numeric vectors of length 2, giving the x and y coordinates ranges. #' @param yaxt A character which specifies the y axis type. Specifying "n" suppresses plotting. #' @param ylog,xlog A logical value (see log in \code{\link[graphics]{plot.default}}). If ylog is TRUE, a logarithmic scale is in use (e.g., after plot(*, log = "y")). For horizontal = TRUE then, if xlog is TRUE, a logarithmic scale is in use (e.g., after plot(*, log = "x")). For a new device, it defaults to FALSE, i.e., linear scale. #' @param log Logarithmic scale if log = "y" or TRUE. Invokes ylog = TRUE. If horizontal is TRUE then invokes xlog = TRUE. #' @param logLab Increments for labelling y-axis on log-scale, defaults to numbers starting with 1, 2, 5, and 10. #' @param names one label, or a vector of labels for the data must match the number of data given #' @param col Graphical parameter for fill colour of the violin(s) polygon. NA for no fill colour. If col is a vector, it specifies the colour per violin, and colours are reused if necessary. #' @param border Graphical parameters for the colour of the violin border passed to lines. NA for no border. If border is a vector, it specifies the colour per violin, and colours are reused if necessary. #' @param lty,lwd Graphical parameters for the violin passed to lines and polygon #' @param rectCol Graphical parameters to control fill colour of the box. NA for no fill colour. If col is a vector, it specifies the colour per violin, and colours are reused if necessary. #' @param lineCol Graphical parameters to control colour of the box outline and whiskers. NA for no border. If lineCol is a vector, it specifies the colour per violin, and colours are reused if necessary. #' @param pchMed Graphical parameters to control shape of the median point. If pchMed is a vector, it specifies the shape per violin. #' @param colMed,colMed2 Graphical parameters to control colour of the median point. If colMed is a vector, it specifies the colour per violin. colMed specifies the fill colour in all cases unless pchMed is 21:25 in which case colMed is the border colour and colMed2 is the fill colour. #' @param drawRect logical. The box is drawn if TRUE. #' @param areaEqual logical. Density plots checked for equal area if TRUE. wex must be scalar, relative widths of violins depend on area. #' @param at position of each violin. Default to 1:n #' @param add logical. if FALSE (default) a new plot is created #' @param wex relative expansion of the violin. If wex is a vector, it specifies the area/width size per violin and sizes are reused if necessary. #' @param horizontal logical. To use horizontal or vertical violins. Note that log scale can only be used on the x-axis for horizontal violins, and on the y-axis otherwise. #' @param main,sub,xlab,ylab graphical parameters passed to plot. #' @param cex A numerical value giving the amount by which plotting text should be magnified relative to the default. #' @param cex.axis The magnification to be used for y axis annotation relative to the current setting of cex. #' @param cex.names The magnification to be used for x axis annotation relative to the current setting of cex. Takes the value of cex.axis if not given. #' @param cex.lab The magnification to be used for x and y labels relative to the current setting of cex. #' @param cex.main The magnification to be used for main titles relative to the current setting of cex. #' @param cex.sub The magnification to be used for sub-titles relative to the current setting of cex. #' @param na.action a function which indicates what should happen when the data contain NAs. The default is to ignore missing values in either the response or the group. #' @param na.rm logical value indicating whether NA values should be stripped before the computation proceeds. Defaults to TRUE. #' @param side defaults to "both". Assigning "left" or "right" enables one sided plotting of violins. May be applied as a scalar across all groups. #' @param plotCentre defaults to "points", plotting a central point at the median. If "line" is given a median line is plotted (subject to side) alternatively. #' @param axes,frame.plot,panel.first,panel.last,asp,line,outer,adj,ann,ask,bg,bty,cin,col.axis,col.lab,col.main,col.sub,cra,crt,csi,cxy,din,err,family,fg,fig,fin,font,font.axis,font.lab,font.main,font.sub,lab,las,lend,lheight,ljoin,lmitre,mai,mar,mex,mfcol,mfg,mfrow,mgp,mkh,new,oma,omd,omi,page,pch,pin,plt,ps,pty,smo,srt,tck,tcl,usr,xaxp,xaxs,xaxt,xpd,yaxp,yaxs,ylbias Arguments to be passed to methods, such as graphical parameters (see \code{\link[graphics]{par}})). #' @keywords plot graphics violin #' @import sm #' @importFrom zoo rollmean #' @importFrom stats median na.omit quantile #' @importFrom graphics Axis axis box lines par plot.new plot.window plot.xy points polygon rect title #' @importFrom grDevices boxplot.stats dev.flush dev.hold dev.interactive devAskNewPage xy.coords #' @export #' @examples #' #' # box- vs violin-plot #' par(mfrow=c(2,1)) #' mu<-2 #' si<-0.6 #' bimodal<-c(rnorm(1000,-mu,si),rnorm(1000,mu,si)) #' uniform<-runif(2000,-4,4) #' normal<-rnorm(2000,0,3) #' vioplot(bimodal,uniform,normal) #' boxplot(bimodal,uniform,normal) #' #' # add to an existing plot #' x <- rnorm(100) #' y <- rnorm(100) #' plot(x, y, xlim=c(-5,5), ylim=c(-5,5)) #' vioplot(x, col="tomato", horizontal=TRUE, at=-4, add=TRUE,lty=2, rectCol="gray") #' vioplot(y, col="cyan", horizontal=FALSE, at=-4, add=TRUE,lty=2) #' #' # formula input #' data("iris") #' vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", #' col=c("lightgreen", "lightblue", "palevioletred")) #' legend("topleft", legend=c("setosa", "versicolor", "virginica"), #' fill=c("lightgreen", "lightblue", "palevioletred"), cex = 0.5) #' #' data("diamonds", package = "ggplot2") #' palette <- RColorBrewer::brewer.pal(9, "Pastel1") #' par(mfrow=c(3, 1)) #' vioplot(price ~ cut, data = diamonds, las = 1, col = palette) #' vioplot(price ~ clarity, data = diamonds, las = 2, col = palette) #' vioplot(price ~ color, data = diamonds, las = 2, col = palette) #' par(mfrow=c(3, 1)) #' #' #generate example data #' data_one <- rnorm(100) #' data_two <- rnorm(50, 1, 2) #' #' #generate violin plot with similar functionality to vioplot #' vioplot(data_one, data_two, col="magenta") #' #' #note vioplox defaults to a greyscale plot #' vioplot(data_one, data_two) #' #' #colours can be customised separately, with axis labels, legends, and titles #' vioplot(data_one, data_two, col=c("red","blue"), names=c("data one", "data two"), #' main="data violin", xlab="data class", ylab="data read") #' legend("topleft", fill=c("red","blue"), legend=c("data one", "data two")) #' #' #colours can be customised for the violin fill and border separately #' vioplot(data_one, data_two, col="grey85", border="purple", names=c("data one", "data two"), #' main="data violin", xlab="data class", ylab="data read") #' #' #colours can also be customised for the boxplot rectange and lines (border and whiskers) #' vioplot(data_one, data_two, col="grey85", rectCol="lightblue", lineCol="blue", #' border="purple", names=c("data one", "data two"), #' main="data violin", xlab="data class", ylab="data read") #' #' #these colours can also be customised separately for each violin #' vioplot(data_one, data_two, col=c("skyblue", "plum"), rectCol=c("lightblue", "palevioletred"), #' lineCol="blue", border=c("royalblue", "purple"), names=c("data one", "data two"), #' main="data violin", xlab="data class", ylab="data read") #' #' #this applies to any number of violins, given that colours are provided for each #' vioplot(data_one, data_two, rnorm(200, 3, 0.5), rpois(200, 2.5), rbinom(100, 10, 0.4), #' col=c("red", "orange", "green", "blue", "violet"), #' rectCol=c("palevioletred", "peachpuff", "lightgreen", "lightblue", "plum"), #' lineCol=c("red4", "orangered", "forestgreen", "royalblue", "mediumorchid"), #' border=c("red4", "orangered", "forestgreen", "royalblue", "mediumorchid"), #' names=c("data one", "data two", "data three", "data four", "data five"), #' main="data violin", xlab="data class", ylab="data read") #' #' #The areaEqual parameter scales with width of violins #' #Violins will have equal density area (including missing tails) rather than equal maximum width #' vioplot(data_one, data_two, areaEqual=TRUE) #' #' vioplot(data_one, data_two, areaEqual=TRUE, #' col=c("skyblue", "plum"), rectCol=c("lightblue", "palevioletred"), #' lineCol="blue", border=c("royalblue", "purple"), names=c("data one", "data two"), #' main="data violin", xlab="data class", ylab="data read") #' #' vioplot(data_one, data_two, rnorm(200, 3, 0.5), rpois(200, 2.5), rbinom(100, 10, 0.4), #' areaEqual=TRUE, col=c("red", "orange", "green", "blue", "violet"), #' rectCol=c("palevioletred", "peachpuff", "lightgreen", "lightblue", "plum"), #' lineCol=c("red4", "orangered", "forestgreen", "royalblue", "mediumorchid"), #' border=c("red4", "orangered", "forestgreen", "royalblue", "mediumorchid"), #' names=c("data one", "data two", "data three", "data four", "data five"), #' main="data violin", xlab="data class", ylab="data read") #' @export #' @usage NULL vioplot <- function(x, ...) { UseMethod("vioplot") } #' Draw a Violin plot for each Column (Row) of a Matrix #' #' Interpreting the columns (or rows) of a matrix as different groups, draw a boxplot for each. #' #' @aliases violin.matrix violinplot.matrix #' @param x a numeric matrix. #' @param use.cols logical indicating if columns (by default) or rows (use.cols = FALSE) should be plotted. #' @param ... Further arguments to \code{\link[vioplot]{vioplot}}. #' @rdname vioplot #' @export vioplot.matrix <- function (x, use.cols = TRUE, ...) { groups <- if (use.cols) { split(c(x), rep.int(1L:ncol(x), rep.int(nrow(x), ncol(x)))) } else split(c(x), seq(nrow(x))) if (length(nam <- dimnames(x)[[1 + use.cols]])) names(groups) <- nam invisible(vioplot(groups, ...)) } #' @rdname vioplot #' @export vioplot.list <- function (x, ...){ ind <- sapply(x, is.numeric) if(all(!ind)){ stop(paste("elements are not numeric: ", names(x)[!sapply(x, is.numeric)])) } if(any(!ind)){ warning(paste("some elements are not numeric: ", names(x)[!sapply(x, is.numeric)])) x <- x[sapply(x, is.numeric)] } invisible(vioplot.default(x, ...)) } #' @rdname vioplot #' @export vioplot.data.frame <- vioplot.list #' @rdname vioplot #' @export vioplot.matrix <- vioplot.matrix #' @rdname vioplot #' @export vioplot.formula <- function (formula, data = NULL, ..., subset, na.action = NULL, add = FALSE, ann = !add, horizontal = FALSE, side = "both", xlab = mklab(y_var = horizontal), ylab = mklab(y_var = !horizontal), names=NULL, drop = FALSE, sep = ".", lex.order = FALSE) { if (missing(formula) || (length(formula) != 3L)){ stop("'formula' missing or incorrect") } if(add && side != "both"){ if(!is.null(names)) warning("Warning: names can only be changed on first call of vioplot (when add = FALSE) ") if(!missing(xlab)) warning("Warning: x-axis labels can only be changed on first call of vioplot (when add = FALSE) ") if(!missing(ylab)) warning("Warning: y-axis labels can only be changed on first call of vioplot (when add = FALSE) ") } if (missing(xlab) || missing(ylab)){ mklab <- function(y_var){ if(y_var){ names(mf)[response] } else { paste(names(mf)[-response], collapse = " : ") } } } m <- match.call(expand.dots = FALSE) if (is.matrix(eval(m$data, parent.frame()))) m$data <- as.data.frame(data) m$... <- m$drop <- m$sep <- m$lex.order <- NULL m$xlab <- m$ylab <- m$add <- m$ann <- m$horizontal <- NULL m$names <- m$side <- NULL m$na.action <- na.action m[[1L]] <- quote(stats::model.frame.default) mf <- eval(m, parent.frame()) response <- attr(attr(mf, "terms"), "response") if(add){ xlab <- ylab <- NA } vioplot(split(mf[[response]], mf[-response], drop = drop, sep = sep, lex.order = lex.order), xlab = xlab, ylab = ylab, names = names, add = add, ann = ann, horizontal = horizontal, side = side, ...) } #' @rdname vioplot #' @export vioplot.default <- function (x, ..., data = NULL, range = 1.5, h = NULL, xlim = NULL, ylim = NULL, names = NULL, horizontal = FALSE, col = "grey50", border = par()$fg, lty = 1, lwd = 1, rectCol = par()$fg, lineCol = par()$fg, pchMed = 19, colMed = "white", colMed2 = "grey 75", at, add = FALSE, wex = 1, drawRect = TRUE, areaEqual=FALSE, axes = TRUE, frame.plot = axes, panel.first = NULL, panel.last = NULL, asp = NA, main="", sub="", xlab=NA, ylab=NA, line = NA, outer = FALSE, xlog = NA, ylog=NA, adj=NA, ann = NA, ask=NA, bg=NA, bty=NA, cex=NA, cex.axis=NA, cex.lab=NA, cex.main=NA, cex.names=NULL, cex.sub=NA, cin=NA, col.axis=NA, col.lab=NA, col.main=NA, col.sub=NA, cra=NA, crt=NA, csi=NA,cxy=NA, din=NA, err=NA, family=NA, fg=NA, fig=NA, fin=NA, font=NA, font.axis=NA, font.lab=NA, font.main=NA, font.sub=NA, lab=NA, las=NA, lend=NA, lheight=NA, ljoin=NA, lmitre=NA, mai=NA, mar=NA, mex=NA, mfcol=NA, mfg=NA, mfrow=NA, mgp=NA, mkh=NA, new=NA, oma=NA, omd=NA, omi=NA, page=NA, pch=NA, pin=NA, plt=NA, ps=NA, pty=NA, smo=NA, srt=NA, tck=NA, tcl=NA, usr=NA, xaxp=NA, xaxs=NA, xaxt=NA, xpd=NA, yaxp=NA, yaxs=NA, yaxt=NA, ylbias=NA, log="", logLab=c(1,2,5), na.action = NULL, na.rm = T, side = "both", plotCentre = "point") { #assign graphical parameters if not given for(ii in 1:length(names(par()))){ if(is.na(get(names(par())[ii])[1])) assign(names(par()[ii]), unlist(par()[[ii]])) } if(add && side != "both"){ if(!is.null(names)) warning("Warning: names can only be changed on first call of vioplot (when add = FALSE) ") if(!is.na(xlab)) warning("Warning: x-axis labels can only be changed on first call of vioplot (when add = FALSE) ") if(!is.na(ylab)) warning("vy-axis labels can only be changed on first call of vioplot (when add = FALSE) ") if(!missing(main)) warning("Warning: main title can only be changed on first call of vioplot (when add = FALSE) ") if(!missing(sub)) warning("Warning: subtitle can only be changed on first call of vioplot (when add = FALSE) ") } if(!is.list(x)){ datas <- list(x, ...) } else{ datas <- lapply(x, unlist) if(is.null(names)){ names <- names(datas) } } datas <- lapply(datas, function(x){ if(all(x == unique(x)[1]) & length(x) > 100){ unique(x)[1] } else { x } }) if(is.character(log)) if("y" %in% unlist(strsplit(log, ""))) log <- TRUE if(is.na(xlog) | (horizontal == TRUE & (log == FALSE | log == ""))) xlog <- FALSE log <- ifelse(log == TRUE, "y", "") if(log == 'x' | log == 'xy' | xlog == TRUE){ if(horizontal | log == "xy"){ log <- TRUE } else { log <- FALSE ylog <- FALSE } xlog <- FALSE } if(log == TRUE | ylog == TRUE){ ylog <- TRUE log <- "y" } else { log <- "" } if(ylog){ #check data is compatible with log scale if(all(unlist(datas) <= 0)){ ylog <- FALSE warning("log scale cannot be used with non-positive data") } else { #log-scale data datas <- datas #lapply(datas, function(x) log(unlist(x))) } } if(is.null(na.action)) na.action <- na.omit lapply(datas, function(data) data <- data[!sapply(data, is.infinite)]) if(na.rm) datas <- lapply(datas, na.action) n <- length(datas) #if(is.list(datas)) datas <- as.data.frame(datas) if (missing(at)) at <- 1:n upper <- vector(mode = "numeric", length = n) lower <- vector(mode = "numeric", length = n) q1 <- vector(mode = "numeric", length = n) q2 <- vector(mode = "numeric", length = n) q3 <- vector(mode = "numeric", length = n) med <- vector(mode = "numeric", length = n) base <- vector(mode = "list", length = n) height <- vector(mode = "list", length = n) area_check <- vector(mode = "list", length = n) baserange <- c(Inf, -Inf) args <- list(display = "none") radj <- ifelse(side == "right", 0, 1) ladj <- ifelse(side == "left", 0, 1) boxwex <- wex if (!(is.null(h))) args <- c(args, h = h) if(plotCentre == "line") med.dens <- rep(NA, n) if(areaEqual){ for (i in 1:n) { data <- unlist(datas[[i]]) data.min <- min(data, na.rm = na.rm) data.max <- max(data, na.rm = na.rm) q1[i] <- quantile(data, 0.25) q2[i] <- quantile(data, 0.5) q3[i] <- quantile(data, 0.75) med[i] <- median(data) iqd <- q3[i] - q1[i] upper[i] <- min(q3[i] + range * iqd, data.max) lower[i] <- max(q1[i] - range * iqd, data.min) est.xlim <- c(min(lower[i], data.min), max(upper[i], data.max)) smout <- do.call("sm.density", c(list(data, xlim = est.xlim), args)) if(plotCentre == "line"){ med.dat <- do.call("sm.density", c(list(data, xlim=est.xlim, eval.points=med[i], display = "none"))) med.dens[i] <- med.dat$estimate } Avg.pos <- mean(smout$eval.points) xt <- diff(smout$eval.points[smout$eval.points1){ warning("wex may not be a vector if areaEqual is TRUE") print("using first element of wex") wex<-wex[i] } wex <-unlist(area_check)/max(unlist(area_check))*wex } for (i in 1:n) { data <- unlist(datas[[i]]) data.min <- min(data, na.rm = na.rm) data.max <- max(data, na.rm = na.rm) q1[i] <- quantile(data, 0.25) q2[i] <- quantile(data, 0.5) q3[i] <- quantile(data, 0.75) med[i] <- median(data) iqd <- q3[i] - q1[i] upper[i] <- min(q3[i] + range * iqd, data.max) lower[i] <- max(q1[i] - range * iqd, data.min) est.xlim <- c(min(lower[i], data.min), max(upper[i], data.max)) smout <- do.call("sm.density", c(list(data, xlim = est.xlim), args)) hscale <- 0.4/max(smout$estimate) * ifelse(length(wex)>1, wex[i], wex) base[[i]] <- smout$eval.points height[[i]] <- smout$estimate * hscale t <- range(base[[i]]) baserange[1] <- min(baserange[1], t[1]) baserange[2] <- max(baserange[2], t[2]) if(plotCentre == "line"){ med.dat <- do.call("sm.density", c(list(data, xlim=est.xlim, eval.points=med[i], display = "none"))) med.dens[i] <- med.dat$estimate *hscale } } if (!add) { if (is.null(xlim)) { xlim <- if (n == 1){ at + c(-0.5, 0.5) } else { range(at) + min(diff(at))/2 * c(-1, 1) } } else { xlim.default <- if (n == 1){ at + c(-0.5, 0.5) } else { range(at) + min(diff(at))/2 * c(-1, 1) } print(paste0("Using c(", xlim[1],",", xlim[2], ") as input for xlim, note that default values for these dimensions are c(", xlim.default[1],",", xlim.default[2], ")")) } if (is.null(ylim)) { ylim <- baserange } } if (is.null(names)) { label <- 1:n } else { label <- names } boxwidth <- 0.05 * ifelse(length(boxwex)>1, boxwex[i], boxwex) if (!add){ plot.new() if(!horizontal){ plot.window(xlim, ylim, log = log, asp = asp, bty = bty, cex = cex, xaxs = xaxs, yaxs = yaxs, lab = lab, mai = mai, mar = mar, mex = mex, mfcol = mfcol, mfrow = mfrow, mfg = mfg, xlog = xlog, ylog = ylog) } else { plot.window(ylim, xlim, log = ifelse(log == "y", "x", ""), asp = asp, bty = bty, cex = cex, xaxs = xaxs, yaxs = yaxs, lab = lab, mai = mai, mar = mar, mex = mex, mfcol = mfcol, mfrow = mfrow, mfg = mfg, xlog = ylog, ylog = xlog) } } panel.first if (!horizontal) { if (!add) { plot.window(xlim, ylim, log = log, asp = asp, bty = bty, cex = cex, xaxs = xaxs, yaxs = yaxs, lab = lab, mai = mai, mar = mar, mex = mex, mfcol = mfcol, mfrow = mfrow, mfg = mfg, xlog = xlog, ylog = ylog) xaxp <- par()$xaxp yaxp <- par()$yaxp if(yaxt !="n"){ if(ylog){ #log_axis_label <- log_axis_label[log_axis >= exp(par("usr")[3])] #log_axis <- log_axis[log_axis >= exp(par("usr")[3])] #log_axis_label <- log_axis_label[log_axis <= exp(par("usr")[4])] #log_axis <- log_axis[log_axis <= exp(par("usr")[4])] Axis(unlist(datas), side = 2, cex.axis = cex.axis, col.axis = col.axis, font.axis = font.axis, mgp = mgp, tck = tck, tcl = tcl, las = las) # xaxp = xaxp, yaxp = yaxp disabled for log if(is.null(cex.names)) cex.names <- cex.axis if(xaxt !="n"){ Axis(1:length(datas), at = at, labels = label, side = 1, cex.axis = cex.names, col.axis = col.axis, font.axis = font.axis, mgp = mgp, tck = tck, tcl = tcl, las = las) # xaxp = xaxp, yaxp = yaxp disabled for log } } else { Axis(unlist(datas), side = 2, cex.axis = cex.axis, col.axis = col.axis, font.axis = font.axis, mgp = mgp, yaxp = yaxp, tck = tck, tcl = tcl, las = las) if(is.null(cex.names)) cex.names <- cex.axis if(xaxt !="n"){ Axis(1:length(datas), at = at, labels = label, side = 1, cex.axis = cex.names, col.axis = col.axis, font.axis = font.axis, mgp = mgp, xaxp = xaxp, tck = tck, tcl = tcl, las = las) } } } } if (frame.plot) { box(lty = lty, lwd = lwd) } for (i in 1:n) { polygon(c(at[i] - radj*height[[i]], rev(at[i] + ladj*height[[i]])), c(base[[i]], rev(base[[i]])), col = ifelse(length(col)>1,col[1+(i-1)%%length(col)], col), border = ifelse(length(border)>1, border[1+(i-1)%%length(border)], border), lty = lty, lwd = lwd, xpd = xpd, lend = lend, ljoin = ljoin, lmitre = lmitre) if (drawRect) { lines(at[c(i, i)], c(lower[i], upper[i]), lwd = lwd, lty = lty, col = ifelse(length(lineCol)>1, lineCol[1+(i-1)%%length(lineCol)], lineCol), lend = lend, ljoin = ljoin, lmitre = lmitre) rect(at[i] - radj*ifelse(length(boxwidth)>1, boxwidth[i], boxwidth)/2, q1[i], at[i] + ladj*ifelse(length(boxwidth)>1, boxwidth[i], boxwidth)/2, q3[i], col = ifelse(length(rectCol)>1, rectCol[1+(i-1)%%length(rectCol)], rectCol), border = ifelse(length(lineCol)>1, lineCol[1+(i-1)%%length(lineCol)], lineCol), xpd = xpd, lend = lend, ljoin = ljoin, lmitre = lmitre) if(plotCentre == "line"){ lines(x = c(at[i] - radj*med.dens[i], at[i], at[i] + ladj*med.dens[i]), y = rep(med[i],3)) } else { points(at[i], med[i], pch = ifelse(length(pchMed)>1, pchMed[1+(i-1)%%length(pchMed)], pchMed), col = ifelse(length(colMed)>1, colMed[1+(i-1)%%length(colMed)], colMed), bg = ifelse(length(colMed2)>1, colMed2[1+(i-1)%%length(colMed2)], colMed2), cex = cex, lwd = lwd, lty = lty) } } } } else { if(log == "y" || ylog == TRUE){ log <- "x" xlog <- TRUE ylog <- FALSE } if (!add) { plot.window(ylim, xlim, log = log, asp = asp, bty = bty, cex = cex, xaxs = xaxs, yaxs = yaxs, lab = lab, mai = mai, mar = mar, mex = mex, mfcol = mfcol, mfrow = mfrow, mfg = mfg, xlog = xlog, ylog = ylog) xaxp <- par()$xaxp yaxp <- par()$yaxp if(yaxt !="n"){ if(xlog){ #log_axis_label <- log_axis_label[log_axis >= exp(par("usr")[3])] #log_axis <- log_axis[log_axis >= exp(par("usr")[3])] #log_axis_label <- log_axis_label[log_axis <= exp(par("usr")[4])] #log_axis <- log_axis[log_axis <= exp(par("usr")[4])] Axis(unlist(datas), side = 1, cex.axis = cex.names, col.axis = col.axis, font.axis = font.axis, mgp = mgp, tck = tck, tcl = tcl, las = las) # xaxp = xaxp, yaxp = yaxp disabled for log if(is.null(cex.names)) cex.names <- cex.axis if(xaxt !="n"){ Axis(1:length(datas), at = at, labels = label, side = 2, cex.axis = cex.axis, col.axis = col.axis, font.axis = font.axis, mgp = mgp, tck = tck, tcl = tcl, las = las) # xaxp = xaxp, yaxp = yaxp disabled for log } } else { Axis(unlist(datas), side = 1, cex.axis = cex.names, col.axis = col.axis, font.axis = font.axis, mgp = mgp, xaxp = xaxp, tck = tck, tcl = tcl, las = las) if(is.null(cex.names)) cex.names <- cex.axis if(xaxt !="n"){ Axis(1:length(datas), at = at, labels = label, side = 2, cex.axis = cex.axis, col.axis = col.axis, font.axis = font.axis, mgp = mgp, yaxp = yaxp, tck = tck, tcl = tcl, las = las) } } } } if (frame.plot) { box(lty = lty, lwd = lwd) } for (i in 1:n) { polygon(c(base[[i]], rev(base[[i]])), c(at[i] - radj*height[[i]], rev(at[i] + ladj*height[[i]])), col = ifelse(length(col)>1,col[1+(i-1)%%length(col)], col), border = ifelse(length(border)>1, border[1+(i-1)%%length(border)], border), lty = lty, lwd = lwd, xpd = xpd, lend = lend, ljoin = ljoin, lmitre = lmitre) if (drawRect) { lines(c(lower[i], upper[i]), at[c(i, i)], lwd = lwd, lty = lty, col = ifelse(length(lineCol)>1, lineCol[1+(i-1)%%length(lineCol)], lineCol), lend = lend, ljoin = ljoin, lmitre = lmitre) rect(q1[i], at[i] - radj*ifelse(length(boxwidth)>1, boxwidth[i], boxwidth)/2, q3[i], at[i] + ladj*ifelse(length(boxwidth)>1, boxwidth[i], boxwidth)/2, col = ifelse(length(rectCol)>1, rectCol[1+(i-1)%%length(rectCol)], rectCol), border = ifelse(length(lineCol)>1, lineCol[1+(i-1)%%length(lineCol)], lineCol), xpd = xpd, lend = lend, ljoin = ljoin, lmitre = lmitre) if(plotCentre == "line"){ lines(y = c(at[i] - radj*med.dens[i], at[i], at[i] + ladj*med.dens[i]), x = rep(med[i],3)) } else { points(med[i], at[i], pch = ifelse(length(pchMed)>1, pchMed[1+(i-1)%%length(pchMed)], pchMed), col = ifelse(length(colMed)>1, colMed[1+(i-1)%%length(colMed)], colMed), , bg = ifelse(length(colMed2)>1, colMed2[1+(i-1)%%length(colMed2)], colMed2), cex = cex, lwd = lwd, lty = lty) } } } } panel.last if (ann) { title(main = main, sub = sub, xlab = xlab, ylab = ylab, line = line, outer = outer, xpd = xpd, cex.main = cex.main, col.main = col.main, font.main = font.main) } invisible(list(upper = upper, lower = lower, median = med, q1 = q1, q3 = q3)) } vioplot/NEWS.md0000644000176200001440000000411314077720322013047 0ustar liggesusers# vioplot 0.3.7 (2021) Updates maintainer contact details. # vioplot 0.3.6 (2021) Bug fixes. - allow plotting repeated non-unique values over threshold number with checks # vioplot 0.3.5 (2020) Bug fixes. - allow reuse of vector inputs - correct graphical paramters: xaxt, xlim - correct log scales (xlog) for horizontal violins - document axes labels for split violins # vioplot 0.3.4 (2019) Bug fixes. - avoids altering base plotting parameters `par()` - resolves issues calling log inputs without an explicit `log` parameter as text # vioplot 0.3.3 (2019) Minor release with improvements to passing parameters. - improved passing of base R plotting parameters - resolves issues with variable names and factor levels in formula inputs # vioplot 0.3.2 (2019) Minor release with improvements to passing parameters. - improved handling for formula input: levels for names and variable names for axes labels - improved passing of graphical parameters to title, and axis - axes for log-scale are automatically generated and horizontal plots are supported Examples for formula input added for convenience (this method is recommended). # vioplot 0.3.1 (2019) Minor release with continuous integration testing, improved vignettes, and License. Compatible with GitHub and CRAN Release. # vioplot 0.3.0 (2018) ## Major changes - formula inputs vioplot is now compatible with all inputs of boxplot or beanplot, including formula inputs (implemented as S3 methods). - plot customisation Various features of violins can be tweaked with plotting parameters, such as colours and shapes of aspects of the violin. These can be applied to all violins with a single (scalar) input or applied separately to each violin with multiple (vector) inputs - defaults This version is fully compatible with inputs to vioplot 0.2. The only difference in behaviour changing the default colour from a glaring magenta to a monochrome grey (more appropriate in a wider range of professional settings). Code written for previous versions should run without breaking or changes in behaviour apart from the default colour. vioplot/MD50000644000176200001440000000621214077742012012263 0ustar liggesusers1cd821a41be2d93a75a7587fbaaa115b *DESCRIPTION b0353042d8325f070abcc2c7300342b8 *LICENSE 17e754df894297e5c555f4e80c32ab80 *NAMESPACE 89875796d0630146a3aafe698f17146c *NEWS.md d3b0cf1eafe04dcd695ec3e48abe4f92 *R/vioplot.R d114d815b71036acfbe54e486da76cd3 *R/vioplot.stats.R 2ac52506553a1da85b501672ad347190 *build/vignette.rds a7418a387026debb02c88278ce40172a *inst/CITATION 203b242b4a9521f975c30c735a0fca45 *inst/COPYRIGHT b3acfff1e90c94b7f89b139ad723cce9 *inst/doc/violin_area.R 278eab2d23325e33e86e7e76dc0c1e90 *inst/doc/violin_area.Rmd 02384ba3fe94b78f883fcf40a9c46c84 *inst/doc/violin_area.html a6c01ad2c1eeb46ccdb9e99a4c7cc52a *inst/doc/violin_customisation.R 61bbd69de37fa4eadb80ecb65e92ebb1 *inst/doc/violin_customisation.Rmd 737889d6b97fd8dee519f331fa9b1237 *inst/doc/violin_customisation.html 9b6cefdf921ecd5baf9afbdf43756684 *inst/doc/violin_formulae.R d3ee832b7905a0b7346ad1041e85dfdb *inst/doc/violin_formulae.Rmd ec66de45c93f3f875c94887c085fe3c7 *inst/doc/violin_formulae.html 1d8684154f5ae2e814d7bd991fc17e24 *inst/doc/violin_split.R 199645abc86916d44342b548285d067a *inst/doc/violin_split.Rmd eff3761ebca9c579e0d52be550b22ec8 *inst/doc/violin_split.html 9f7b64627cf6e2d012c12c8dc7609b30 *inst/doc/violin_ylog.R a41c73ae1df957ee84c4ef8b91e2b36a *inst/doc/violin_ylog.Rmd ddcf6a4dc613a1b7f3f5adce3ad19845 *inst/doc/violin_ylog.html 7cf9a11c319c7c5250eb717164f98de3 *man/violin.stats.Rd 93d80332587f560d6575090cbe84ef07 *man/vioplot.Rd faccc5d00425006d9beb9babf4752e44 *tests/testthat.R 916800299d215db4a2d296bf06a9999c *tests/testthat/Rplots.pdf b3e870b5983833f905cb9b0a73520364 *tests/testthat/test_violin_area.R 4464bb0ca1cbedcd2d05d706f65768a5 *tests/testthat/test_violin_classes.R 737539ba9e124f0e0afe268f2981fe89 *tests/testthat/test_violin_customisation.R 32cbdc763f82e46543e055986e6ef0ae *tests/testthat/test_violin_formula.R 85993975a25f4baab807622ba6846ab0 *tests/testthat/test_violin_median.R 9078f2684fba82c384ca17dfa8d38d14 *tests/testthat/test_violin_na_handle.R 70f97529f03d7ffc9e9394752077783e *tests/testthat/test_violin_names.R a38e20901a1dba8f1721f19a4f7e7f9f *tests/testthat/test_violin_side.R f6c59f7fedeed3f7a4df9f3ab8f41eac *tests/testthat/test_violin_unequal_groups.R 5960eb19992dcae212abf234f23db83a *tests/testthat/test_ylog.R f534a569ab6e49235d90a12ff588157e *vignettes/backup/violin_area.Rmd ed82e28a7e639a71348d27caf368d27b *vignettes/backup/violin_area.html 214df39d790c0b9b7fe85e658b261a34 *vignettes/backup/violin_customisation.Rmd f7440770801b4ebb6ac7626e818acc12 *vignettes/backup/violin_customisation.html c4232529d703937acda2edbca88b77ea *vignettes/backup/violin_formulae.html 13f450a14224e623ca331c75bd1edabc *vignettes/backup/violin_split.Rmd 41127ffeefdeb4fadc1c0d9029d14052 *vignettes/backup/violin_split.html 8944fe4605b90795412173ef430e957a *vignettes/backup/violin_ylog.Rmd ad4c189d29867f0a5c820e708f2e0e90 *vignettes/backup/violin_ylog.html 278eab2d23325e33e86e7e76dc0c1e90 *vignettes/violin_area.Rmd 61bbd69de37fa4eadb80ecb65e92ebb1 *vignettes/violin_customisation.Rmd d3ee832b7905a0b7346ad1041e85dfdb *vignettes/violin_formulae.Rmd 199645abc86916d44342b548285d067a *vignettes/violin_split.Rmd a41c73ae1df957ee84c4ef8b91e2b36a *vignettes/violin_ylog.Rmd vioplot/inst/0000755000176200001440000000000014077721435012735 5ustar liggesusersvioplot/inst/doc/0000755000176200001440000000000014077721435013502 5ustar liggesusersvioplot/inst/doc/violin_area.R0000644000176200001440000001243214077721430016112 0ustar liggesusers## ----------------------------------------------------------------------------- library("vioplot") ## ---- message=FALSE----------------------------------------------------------- data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) ## ---- echo=FALSE, message=FALSE----------------------------------------------- par(mar=rep(1,4)) ## ----------------------------------------------------------------------------- par(mfrow=c(3, 1)) par(mar=rep(2, 4)) plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length: setosa", col="green") plot(density(iris$Sepal.Length[iris$Species=="versicolor"]), main="Sepal Length: versicolor", col="blue") plot(density(iris$Sepal.Length[iris$Species=="virginica"]), main="Sepal Length: virginica", col="palevioletred4") par(mfrow=c(1, 1)) ## ---- echo=FALSE, message=FALSE----------------------------------------------- par(mar=c(5, 4, 4, 2) + 0.1) ## ---- echo=FALSE, message=FALSE----------------------------------------------- par(mar=rep(2,4)) ## ----------------------------------------------------------------------------- par(mfrow=c(3, 1)) par(mar=rep(2, 4)) xaxis <- c(3, 9) yaxis <- c(0, 1.25) plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length: setosa", col="green", xlim=xaxis, ylim=yaxis) plot(density(iris$Sepal.Length[iris$Species=="versicolor"]), main="Sepal Length: versicolor", col="blue", xlim=xaxis, ylim=yaxis) plot(density(iris$Sepal.Length[iris$Species=="virginica"]), main="Sepal Length: virginica", col="palevioletred4", xlim=xaxis, ylim=yaxis) par(mfrow=c(1, 1)) ## ---- echo=FALSE, message=FALSE----------------------------------------------- par(mar=c(5, 4, 4, 2) + 0.1) ## ----------------------------------------------------------------------------- par(mfrow=c(1, 1)) xaxis <- c(3, 9) yaxis <- c(0, 1.25) plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length", col="green", xlim=xaxis, ylim=yaxis) lines(density(iris$Sepal.Length[iris$Species=="versicolor"]), col="blue") lines(density(iris$Sepal.Length[iris$Species=="virginica"]), col="palevioletred4") legend("topright", fill=c("green", "blue", "palevioletred4"), legend=levels(iris$Species), cex=0.5) ## ----------------------------------------------------------------------------- vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", areaEqual = T) ## ---- echo=FALSE, message=FALSE----------------------------------------------- par(mar=rep(2, 4)) ## ----------------------------------------------------------------------------- par(mfrow=c(2,1)) par(mar=rep(2, 4)) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Width)", areaEqual = F) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T) par(mfrow=c(1,1)) ## ---- echo=FALSE, message=FALSE----------------------------------------------- par(mar=c(5, 4, 4, 2) + 0.1) ## ----------------------------------------------------------------------------- vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), rectCol=c("green", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), border=c("darkolivegreen4", "royalblue4", "violetred4")) ## ----------------------------------------------------------------------------- vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), rectCol=c("green", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), border=c("darkolivegreen4", "royalblue4", "violetred4"), wex=1.25) ## ----------------------------------------------------------------------------- vioplot(rnorm(200, 3, 0.5), rpois(200, 2.5), rbinom(100, 10, 0.4), rlnorm(200, 0, 0.5), rnbinom(200, 10, 0.9), rlogis(20, 0, 0.5), areaEqual = F, main="Equal Width", xlab="distribution", ylab="data value", names=c("normal", "poisson", "binomial", "log-normal", "neg-binomial", "logistic")) vioplot(rnorm(200, 3, 0.5), rpois(200, 2.5), rbinom(100, 10, 0.4), rlnorm(200, 0, 0.5), rnbinom(200, 10, 0.9), rlogis(20, 0, 0.5), areaEqual = T, main="Equal Area", xlab="distribution", ylab="data value", names=c("normal", "poisson", "binomial", "log-normal", "neg-binomial", "logistic")) vioplot/inst/doc/violin_formulae.R0000644000176200001440000000530214077721432017014 0ustar liggesusers## ----------------------------------------------------------------------------- library("vioplot") ## ---- message=FALSE, eval=FALSE----------------------------------------------- # data(iris) # boxplot(Sepal.Length~Species, data = iris) ## ---- message=FALSE, echo=FALSE----------------------------------------------- data(iris) boxplot(Sepal.Length~Species, data = iris, main = "Sepal Length") ## ---- message=FALSE, eval=FALSE----------------------------------------------- # devtools::install_version("vioplot", version = "0.2") # library("vioplot") # vioplot(Sepal.Length~Species, data = iris) ## ---- message=FALSE, eval=FALSE----------------------------------------------- # vioplot(Sepal.Length~Species, data = iris) ## ---- message=FALSE, echo=FALSE----------------------------------------------- vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="magenta") ## ----------------------------------------------------------------------------- vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length") ## ----------------------------------------------------------------------------- vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="lightblue") ## ----------------------------------------------------------------------------- vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col=c("lightgreen", "lightblue", "palevioletred")) legend("topleft", legend=c("setosa", "versicolor", "virginica"), fill=c("lightgreen", "lightblue", "palevioletred"), cex = 0.5) ## ----------------------------------------------------------------------------- vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="lightblue", border="royalblue") ## ----------------------------------------------------------------------------- vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", rectCol="palevioletred", lineCol="violetred") ## ----------------------------------------------------------------------------- vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", colMed="violet") ## ----------------------------------------------------------------------------- vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="lightblue", border="royalblue", rectCol="palevioletred", lineCol="violetred", colMed="violet") ## ----------------------------------------------------------------------------- vioplot(Sepal.Length~Species, data = iris, main="Sepal Length", col=c("lightgreen", "lightblue", "palevioletred"), border=c("darkolivegreen4", "royalblue4", "violetred4"), rectCol=c("forestgreen", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), colMed=c("green", "cyan", "magenta"), pchMed=c(15, 17, 19)) vioplot/inst/doc/violin_split.R0000644000176200001440000001202314077721434016335 0ustar liggesusers## ---- fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'---- library("vioplot") ## ---- message=FALSE----------------------------------------------------------- data(iris) summary(iris$Sepal.Width) table(iris$Sepal.Width > mean(iris$Sepal.Width)) iris_large <- iris[iris$Sepal.Width > mean(iris$Sepal.Width), ] iris_small <- iris[iris$Sepal.Width <= mean(iris$Sepal.Width), ] ## ---- fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'---- boxplot(Sepal.Length~Species, data=iris, col="grey") ## ---- fig.align = 'center', fig.height = 6, fig.width = 6, fig.keep = 'last'---- { par(mfrow=c(2,1)) boxplot(Sepal.Length~Species, data=iris_small, col = "lightblue") boxplot(Sepal.Length~Species, data=iris_large, col = "palevioletred") par(mfrow=c(1,1)) } ## ---- fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'---- vioplot(Sepal.Length~Species, data=iris) ## ---- fig.align = 'center', fig.height = 6, fig.width = 6, fig.keep = 'last'---- { par(mfrow=c(2,1)) vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line") vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line") par(mfrow=c(1,1)) } ## ---- fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'---- vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", add = T) title(xlab = "Species", ylab = "Sepal Length") legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width") ## ---- fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'---- vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right", xlab = "Iris species", ylab = "Length", main = "Sepals", names=paste("Iris", levels(iris$Species))) vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", add = T) legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Width") ## ---- fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'---- vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", add = T, xlab = "Iris species", ylab = "Length", main = "Sepals", names=paste("Iris", levels(iris$Species))) legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Width") ## ---- fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'---- vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "point", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "point", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T) title(xlab = "Species", ylab = "Sepal Length") legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width") ## ---- fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'---- vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "point", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "point", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T) points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_large[grep(species, iris_large$Species),]$Sepal.Length))), pch = 21, col = "palevioletred4", bg = "palevioletred2") title(xlab = "Species", ylab = "Sepal Length") legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width") ## ---- fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'---- vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T) points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_large[grep(species, iris_large$Species),]$Sepal.Length))), pch = 21, col = "palevioletred4", bg = "palevioletred2") points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_small[grep(species, iris_small$Species),]$Sepal.Length))), pch = 21, col = "lightblue4", bg = "lightblue2") title(xlab = "Species", ylab = "Sepal Length") legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width") vioplot/inst/doc/violin_split.Rmd0000755000176200001440000001641114027763472016671 0ustar liggesusers--- title: "Split Violin Plots" author: "Tom Kelly" date: "`r Sys.Date()`" output: rmarkdown::html_vignette fig_width: 6 fig_height: 3 fig_align: 'center' fig_keep: 'last' vignette: > %\VignetteIndexEntry{vioplot: Split Violin Plots} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ##Violin Plots Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits: - Greater flexibility for plotting variation than boxplots - More familiarity to boxplot users than density plots - Easier to directly compare data types than existing plots As shown below for the `iris` dataset, violin plots show distribution information that the boxplot is unable to. ###General Set up ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} library("vioplot") ``` We set up the data with two categories (Sepal Width) as follows: ```{r, message=FALSE} data(iris) summary(iris$Sepal.Width) table(iris$Sepal.Width > mean(iris$Sepal.Width)) iris_large <- iris[iris$Sepal.Width > mean(iris$Sepal.Width), ] iris_small <- iris[iris$Sepal.Width <= mean(iris$Sepal.Width), ] ``` ###Boxplots First we plot Sepal Length on its own: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} boxplot(Sepal.Length~Species, data=iris, col="grey") ``` An indirect comparison can be achieved with par: ```{r, fig.align = 'center', fig.height = 6, fig.width = 6, fig.keep = 'last'} { par(mfrow=c(2,1)) boxplot(Sepal.Length~Species, data=iris_small, col = "lightblue") boxplot(Sepal.Length~Species, data=iris_large, col = "palevioletred") par(mfrow=c(1,1)) } ``` ### Violin Plots First we plot Sepal Length on its own: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris) ``` An indirect comparison can be achieved with par: ```{r, fig.align = 'center', fig.height = 6, fig.width = 6, fig.keep = 'last'} { par(mfrow=c(2,1)) vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line") vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line") par(mfrow=c(1,1)) } ``` ### Split Violin Plots A more direct comparision can be made with the `side` argument and `add = TRUE` on the second plot: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", add = T) title(xlab = "Species", ylab = "Sepal Length") legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width") ``` #### Custom axes labels Custom axes labels are supported for split violin plots. However, you must use these arguments on the *first* call of `vioplot`. ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right", xlab = "Iris species", ylab = "Length", main = "Sepals", names=paste("Iris", levels(iris$Species))) vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", add = T) legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Width") ``` Note that this is disabled for the second `vioplot` call to avoid overlaying labels. ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", add = T, xlab = "Iris species", ylab = "Length", main = "Sepals", names=paste("Iris", levels(iris$Species))) legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Width") ``` #### Median The line median option is more suitable for side by side comparisions but the point option is still available also: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "point", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "point", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T) title(xlab = "Species", ylab = "Sepal Length") legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width") ``` It may be necessary to include a `points` command to fix the median being overwritten by the following plots: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "point", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "point", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T) points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_large[grep(species, iris_large$Species),]$Sepal.Length))), pch = 21, col = "palevioletred4", bg = "palevioletred2") title(xlab = "Species", ylab = "Sepal Length") legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width") ``` Similarly points could be added where a line has been used previously: ```{r, fig.align = 'center', fig.height = 3, fig.width = 6, fig.keep = 'last'} vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2") vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T) points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_large[grep(species, iris_large$Species),]$Sepal.Length))), pch = 21, col = "palevioletred4", bg = "palevioletred2") points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_small[grep(species, iris_small$Species),]$Sepal.Length))), pch = 21, col = "lightblue4", bg = "lightblue2") title(xlab = "Species", ylab = "Sepal Length") legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width") ``` Here it is aesthetically pleasing and intuitive to interpret categorical differences in mean and variation in a continuous variable. #### Sources These extensions to `vioplot` here are based on those provided here: * https://gist.github.com/mbjoseph/5852613 These have previously been discussed on the following sites: * https://mbjoseph.github.io/posts/2018-12-23-split-violin-plots/ * http://tagteam.harvard.edu/hub_feeds/1981/feed_items/209875 * [https://www.r-bloggers.com/split-violin-plots/](https://www.r-bloggers.com/2013/06/split-violin-plots/) vioplot/inst/doc/violin_ylog.Rmd0000755000176200001440000001031614027267745016510 0ustar liggesusers--- title: "Controlling y-axis Plotting" author: "Tom Kelly" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{vioplot: Controlling y-axis Plotting} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- While boxplots have become the _de facto_ standard for plotting the distribution of data this is a vast oversimplification and may not show everything needed to evaluate the variation of data. This is particularly important for datasets which do not form a Gaussian "Normal" distribution that most researchers have become accustomed to. While density plots are helpful in this regard, they can be less aesthetically pleasing than boxplots and harder to interpret for those familiar with boxplots. Often the only ways to compare multiple data types with density use slices of the data with faceting the plotting panes or overlaying density curves with colours and a legend. This approach is jarring for new users and leads to cluttered plots difficult to present to a wider audience. ##Violin Plots Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits: - Greater flexibility for plotting variation than boxplots - More familiarity to boxplot users than density plots - Easier to directly compare data types than existing plots As shown below for the `iris` dataset, violin plots show distribution information that the boxplot is unable to. ```{r} library("vioplot") ``` ```{r, message=FALSE} data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) ``` ##Violin y-axis ###Logarithmic scale However the existing violin plot packages (such as \code{\link[vioplot]{vioplot}}) do not support log-scale of the y-axis. This has been amended with the `ylog` argument. ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = T, ylim=c(log(1), log(10))) ``` This can also be invoked with the `log="y"` argument compatible with `boxplot`: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = T, ylim=c(log(1), log(10))) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = "y", ylim=c(log(1), log(10))) ``` ###custom y-axes The y-axes can also be removed with `yaxt="n"` to enable customised y-axes: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = T, yaxt="n", ylim=c(log(1), log(10))) ``` Thus custom axes can be added to violin plots. As shown on a linear scale: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n") axis(2, at=1:10, labels=1:10) ``` As well as for on a log scale: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n", log="y", ylim=c(log(4), log(9))) axis(2, at=log(1:10), labels=1:10) ``` vioplot/inst/doc/violin_split.html0000644000176200001440000072122214077721434017110 0ustar liggesusers Split Violin Plots

Split Violin Plots

Tom Kelly

2021-07-27

##Violin Plots

Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits:

  • Greater flexibility for plotting variation than boxplots
  • More familiarity to boxplot users than density plots
  • Easier to directly compare data types than existing plots

As shown below for the iris dataset, violin plots show distribution information that the boxplot is unable to.

###General Set up

library("vioplot")

We set up the data with two categories (Sepal Width) as follows:

data(iris)
summary(iris$Sepal.Width)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   2.000   2.800   3.000   3.057   3.300   4.400
table(iris$Sepal.Width > mean(iris$Sepal.Width))
## 
## FALSE  TRUE 
##    83    67
iris_large <- iris[iris$Sepal.Width > mean(iris$Sepal.Width), ]
iris_small <- iris[iris$Sepal.Width <= mean(iris$Sepal.Width), ]

###Boxplots

First we plot Sepal Length on its own:

An indirect comparison can be achieved with par:

Violin Plots

First we plot Sepal Length on its own:

An indirect comparison can be achieved with par:

Split Violin Plots

A more direct comparision can be made with the side argument and add = TRUE on the second plot:

vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right")
vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", add = T)
title(xlab = "Species", ylab = "Sepal Length")
legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width")

Custom axes labels

Custom axes labels are supported for split violin plots. However, you must use these arguments on the first call of vioplot.

vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right", xlab = "Iris species", ylab = "Length", main = "Sepals", names=paste("Iris", levels(iris$Species)))
vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", add = T)
legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Width")

Note that this is disabled for the second vioplot call to avoid overlaying labels.

vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right")
vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", add = T, xlab = "Iris species", ylab = "Length", main = "Sepals", names=paste("Iris", levels(iris$Species)))
## Warning in vioplot.formula(Sepal.Length ~ Species, data = iris_small, col = "lightblue", : Warning: names can only be changed on first call of vioplot (when add = FALSE)
## Warning in vioplot.formula(Sepal.Length ~ Species, data = iris_small, col = "lightblue", : Warning: x-axis labels can only be changed on first call of vioplot (when add = FALSE)
## Warning in vioplot.formula(Sepal.Length ~ Species, data = iris_small, col = "lightblue", : Warning: y-axis labels can only be changed on first call of vioplot (when add = FALSE)
## Warning in vioplot.default(x, ...): Warning: names can only be changed on first call of vioplot (when add = FALSE)
## Warning in vioplot.default(x, ...): Warning: main title can only be changed on first call of vioplot (when add = FALSE)
legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Width")

Median

The line median option is more suitable for side by side comparisions but the point option is still available also:

vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "point", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2")
vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "point", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T)
title(xlab = "Species", ylab = "Sepal Length")
legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width")

It may be necessary to include a points command to fix the median being overwritten by the following plots:

vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "point", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2")
vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "point", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T)
points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_large[grep(species, iris_large$Species),]$Sepal.Length))), pch = 21, col = "palevioletred4", bg = "palevioletred2")
title(xlab = "Species", ylab = "Sepal Length")
legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width")

Similarly points could be added where a line has been used previously:

vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2")
vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T)
points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_large[grep(species, iris_large$Species),]$Sepal.Length))), pch = 21, col = "palevioletred4", bg = "palevioletred2")
points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_small[grep(species, iris_small$Species),]$Sepal.Length))), pch = 21, col = "lightblue4", bg = "lightblue2")
title(xlab = "Species", ylab = "Sepal Length")
legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width")

Here it is aesthetically pleasing and intuitive to interpret categorical differences in mean and variation in a continuous variable.

Sources

These extensions to vioplot here are based on those provided here:

These have previously been discussed on the following sites:

vioplot/inst/doc/violin_area.html0000644000176200001440000111060614077721430016660 0ustar liggesusers Controlling Violin Plot Area

Controlling Violin Plot Area

Tom Kelly

2021-07-27

While boxplots have become the de facto standard for plotting the distribution of data this is a vast oversimplification and may not show everything needed to evaluate the variation of data. This is particularly important for datasets which do not form a Gaussian “Normal” distribution that most researchers have become accustomed to.

While density plots are helpful in this regard, they can be less aesthetically pleasing than boxplots and harder to interpret for those familiar with boxplots. Often the only ways to compare multiple data types with density use slices of the data with faceting the plotting panes or overlaying density curves with colours and a legend. This approach is jarring for new users and leads to cluttered plots difficult to present to a wider audience.

##Violin Plots

Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits:

  • Greater flexibility for plotting variation than boxplots
  • More familiarity to boxplot users than density plots
  • Easier to directly compare data types than existing plots

As shown below for the iris dataset, violin plots show distribution information that the boxplot is unable to.

library("vioplot")
## Loading required package: sm
## Package 'sm', version 2.2-5.6: type help(sm) for summary information
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
data(iris)
boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"))

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"))

##Violin Plot Area

However there are concerns that existing violin plot packages (such as ) scales the data to the most aesthetically suitable width rather than maintaining proportions comparable across data sets. Consider the differing distributions shown below:

par(mfrow=c(3, 1))
par(mar=rep(2, 4))
plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length: setosa", col="green")
plot(density(iris$Sepal.Length[iris$Species=="versicolor"]), main="Sepal Length: versicolor", col="blue")
plot(density(iris$Sepal.Length[iris$Species=="virginica"]), main="Sepal Length: virginica", col="palevioletred4")

par(mfrow=c(1, 1))

#Comparing datasets

Neither of these plots above show the relative distribtions on the same scale, even if we match the x-axis of a density plot the relative heights are obscured and difficult to compare.

par(mfrow=c(3, 1))
par(mar=rep(2, 4))
xaxis <- c(3, 9)
yaxis <- c(0, 1.25)
plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length: setosa", col="green", xlim=xaxis, ylim=yaxis)
plot(density(iris$Sepal.Length[iris$Species=="versicolor"]), main="Sepal Length: versicolor", col="blue", xlim=xaxis, ylim=yaxis)
plot(density(iris$Sepal.Length[iris$Species=="virginica"]), main="Sepal Length: virginica", col="palevioletred4", xlim=xaxis, ylim=yaxis)

par(mfrow=c(1, 1))

This can somewhat be addressed by overlaying density plots:

par(mfrow=c(1, 1))
xaxis <- c(3, 9)
yaxis <- c(0, 1.25)
plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length", col="green", xlim=xaxis, ylim=yaxis)
lines(density(iris$Sepal.Length[iris$Species=="versicolor"]), col="blue")
lines(density(iris$Sepal.Length[iris$Species=="virginica"]), col="palevioletred4")
legend("topright", fill=c("green", "blue", "palevioletred4"), legend=levels(iris$Species), cex=0.5)

This has the benefit of highlighting the different distributions of the data subsets. However, notice here that a figure legend become necessary, plot axis limits need to be defined to display the range of all distribution curves, and the plot quickly becomes cluttered if the number of factors to be compared becomes much larger.

##Area control in Violin plot

Therefore the areaEqual parameter has been added to customise the violin plot to serve a similar purpose:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", areaEqual = T)

If we compare this to the original vioplot functionality (defaulting to areaEqual = FALSE) the differences between the two are clear.

par(mfrow=c(2,1))
par(mar=rep(2, 4))
vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Width)", areaEqual = F)
vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T)

par(mfrow=c(1,1))

Note that areaEqual is considering the full area of the density distribution before removing the outlier tails. We leave it up to the users discretion which they elect to use. The areaEqual functionality is compatible with all of the customisation used in discussed in the main vioplot vignette

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), rectCol=c("green", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), border=c("darkolivegreen4", "royalblue4", "violetred4"))

The violin width can further be scaled with wex, which maintains the proportions across the datasets if areaEqual = TRUE:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), rectCol=c("green", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), border=c("darkolivegreen4", "royalblue4", "violetred4"), wex=1.25)

Comparing distributions

Notice the utility of areaEqual for cases where different datasets have different underlying distributions:

vioplot(rnorm(200, 3, 0.5), rpois(200, 2.5),  rbinom(100, 10, 0.4), rlnorm(200, 0, 0.5), rnbinom(200, 10, 0.9), rlogis(20, 0, 0.5), areaEqual = F, main="Equal Width", xlab="distribution", ylab="data value", names=c("normal", "poisson", "binomial", "log-normal", "neg-binomial", "logistic"))

vioplot(rnorm(200, 3, 0.5), rpois(200, 2.5),  rbinom(100, 10, 0.4), rlnorm(200, 0, 0.5), rnbinom(200, 10, 0.9), rlogis(20, 0, 0.5), areaEqual = T, main="Equal Area", xlab="distribution", ylab="data value", names=c("normal", "poisson", "binomial", "log-normal", "neg-binomial", "logistic"))

vioplot/inst/doc/violin_area.Rmd0000755000176200001440000001714114027267745016451 0ustar liggesusers--- title: "Controlling Violin Plot Area" author: "Tom Kelly" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{vioplot: Controlling Violin Plot Area} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- While boxplots have become the _de facto_ standard for plotting the distribution of data this is a vast oversimplification and may not show everything needed to evaluate the variation of data. This is particularly important for datasets which do not form a Gaussian "Normal" distribution that most researchers have become accustomed to. While density plots are helpful in this regard, they can be less aesthetically pleasing than boxplots and harder to interpret for those familiar with boxplots. Often the only ways to compare multiple data types with density use slices of the data with faceting the plotting panes or overlaying density curves with colours and a legend. This approach is jarring for new users and leads to cluttered plots difficult to present to a wider audience. ##Violin Plots Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits: - Greater flexibility for plotting variation than boxplots - More familiarity to boxplot users than density plots - Easier to directly compare data types than existing plots As shown below for the `iris` dataset, violin plots show distribution information that the boxplot is unable to. ```{r} library("vioplot") ``` ```{r, message=FALSE} data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) ``` ##Violin Plot Area However there are concerns that existing violin plot packages (such as \code{\link[vioplot]{vioplot}}) scales the data to the most aesthetically suitable width rather than maintaining proportions comparable across data sets. Consider the differing distributions shown below: ```{r, echo=FALSE, message=FALSE} par(mar=rep(1,4)) ``` ```{r} par(mfrow=c(3, 1)) par(mar=rep(2, 4)) plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length: setosa", col="green") plot(density(iris$Sepal.Length[iris$Species=="versicolor"]), main="Sepal Length: versicolor", col="blue") plot(density(iris$Sepal.Length[iris$Species=="virginica"]), main="Sepal Length: virginica", col="palevioletred4") par(mfrow=c(1, 1)) ``` ```{r, echo=FALSE, message=FALSE} par(mar=c(5, 4, 4, 2) + 0.1) ``` #Comparing datasets Neither of these plots above show the relative distribtions on the same scale, even if we match the x-axis of a density plot the relative heights are obscured and difficult to compare. ```{r, echo=FALSE, message=FALSE} par(mar=rep(2,4)) ``` ```{r} par(mfrow=c(3, 1)) par(mar=rep(2, 4)) xaxis <- c(3, 9) yaxis <- c(0, 1.25) plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length: setosa", col="green", xlim=xaxis, ylim=yaxis) plot(density(iris$Sepal.Length[iris$Species=="versicolor"]), main="Sepal Length: versicolor", col="blue", xlim=xaxis, ylim=yaxis) plot(density(iris$Sepal.Length[iris$Species=="virginica"]), main="Sepal Length: virginica", col="palevioletred4", xlim=xaxis, ylim=yaxis) par(mfrow=c(1, 1)) ``` ```{r, echo=FALSE, message=FALSE} par(mar=c(5, 4, 4, 2) + 0.1) ``` This can somewhat be addressed by overlaying density plots: ```{r} par(mfrow=c(1, 1)) xaxis <- c(3, 9) yaxis <- c(0, 1.25) plot(density(iris$Sepal.Length[iris$Species=="setosa"]), main="Sepal Length", col="green", xlim=xaxis, ylim=yaxis) lines(density(iris$Sepal.Length[iris$Species=="versicolor"]), col="blue") lines(density(iris$Sepal.Length[iris$Species=="virginica"]), col="palevioletred4") legend("topright", fill=c("green", "blue", "palevioletred4"), legend=levels(iris$Species), cex=0.5) ``` This has the benefit of highlighting the different distributions of the data subsets. However, notice here that a figure legend become necessary, plot axis limits need to be defined to display the range of all distribution curves, and the plot quickly becomes cluttered if the number of factors to be compared becomes much larger. ##Area control in Violin plot Therefore the `areaEqual` parameter has been added to customise the violin plot to serve a similar purpose: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", areaEqual = T) ``` If we compare this to the original vioplot functionality (defaulting to `areaEqual = FALSE`) the differences between the two are clear. ```{r, echo=FALSE, message=FALSE} par(mar=rep(2, 4)) ``` ```{r} par(mfrow=c(2,1)) par(mar=rep(2, 4)) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Width)", areaEqual = F) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T) par(mfrow=c(1,1)) ``` ```{r, echo=FALSE, message=FALSE} par(mar=c(5, 4, 4, 2) + 0.1) ``` Note that `areaEqual` is considering the full area of the density distribution before removing the outlier tails. We leave it up to the users discretion which they elect to use. The `areaEqual` functionality is compatible with all of the customisation used in discussed in [the main vioplot vignette](violin_customisation.html) ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), rectCol=c("green", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), border=c("darkolivegreen4", "royalblue4", "violetred4")) ``` The violin width can further be scaled with `wex`, which maintains the proportions across the datasets if `areaEqual = TRUE`: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), rectCol=c("green", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), border=c("darkolivegreen4", "royalblue4", "violetred4"), wex=1.25) ``` ## Comparing distributions Notice the utility of `areaEqual` for cases where different datasets have different underlying distributions: ```{r} vioplot(rnorm(200, 3, 0.5), rpois(200, 2.5), rbinom(100, 10, 0.4), rlnorm(200, 0, 0.5), rnbinom(200, 10, 0.9), rlogis(20, 0, 0.5), areaEqual = F, main="Equal Width", xlab="distribution", ylab="data value", names=c("normal", "poisson", "binomial", "log-normal", "neg-binomial", "logistic")) vioplot(rnorm(200, 3, 0.5), rpois(200, 2.5), rbinom(100, 10, 0.4), rlnorm(200, 0, 0.5), rnbinom(200, 10, 0.9), rlogis(20, 0, 0.5), areaEqual = T, main="Equal Area", xlab="distribution", ylab="data value", names=c("normal", "poisson", "binomial", "log-normal", "neg-binomial", "logistic")) ``` vioplot/inst/doc/violin_formulae.html0000644000176200001440000103775414077721433017601 0ustar liggesusers Customising Violin Plots with Formula Input

Customising Violin Plots with Formula Input

Tom Kelly

2021-07-27

Since boxplots have become the de facto standard for plotting the distribution of data most users are familiar with these and the formula input for dataframes. However this input is not available in the standard vioplot package. Thus it has been restored here for enhanced backwards compatibility with boxplot.

As shown below for the iris dataset, violin plots show distribution information taking formula input that boxplot implements but vioplot is unable to. This demonstrates the customisation demonstrated in the main vioplot vignette using vioplot syntax with the formula method commonly used for boxplot, t.test, and lm.

library("vioplot")
data(iris)
boxplot(Sepal.Length~Species, data = iris)

Whereas performing the same function does not work with vioplot (0.2).

devtools::install_version("vioplot", version = "0.2")
library("vioplot")
vioplot(Sepal.Length~Species, data = iris)
Error in min(data) : invalid 'type' (language) of argument

Plot Defaults

vioplot(Sepal.Length~Species, data = iris)

Another concern we see here is that the vioplot defaults are not aesthetically pleasing, with a rather glaring colour scheme unsuitable for professional or academic usage. Thus the plot default colours have been changed as shown here:

vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length")

Plot colours: Violin Fill

Plot colours can be further customised as with the original vioplot package using the col argument:

vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="lightblue")

Vectorisation

However the vioplot (0.2) function is unable to colour each violin separately, thus this is enabled with a vectorised col in vioplot (0.3):

vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col=c("lightgreen", "lightblue", "palevioletred"))
legend("topleft", legend=c("setosa", "versicolor", "virginica"), fill=c("lightgreen", "lightblue", "palevioletred"), cex = 0.5)

Plot colours: Violin Lines and Boxplot

Colours can also be customised for the violin fill and border separately using the col and border arguments:

vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="lightblue", border="royalblue")

Similarly, the arguments lineCol and rectCol specify the colours of the boxplot outline and rectangle fill. For simplicity the box and whiskers of the boxplot will always have the same colour.

vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", rectCol="palevioletred", lineCol="violetred")

The same applies to the colour of the median point with colMed:

vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", colMed="violet")

### Combined customisation

These can be customised colours can be combined:

vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="lightblue", border="royalblue", rectCol="palevioletred", lineCol="violetred", colMed="violet")

Vectorisation

These colour and shape settings can also be customised separately for each violin:

vioplot(Sepal.Length~Species, data = iris, main="Sepal Length", col=c("lightgreen", "lightblue", "palevioletred"), border=c("darkolivegreen4", "royalblue4", "violetred4"), rectCol=c("forestgreen", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), colMed=c("green", "cyan", "magenta"), pchMed=c(15, 17, 19))

vioplot/inst/doc/violin_ylog.html0000644000176200001440000037527114077721435016741 0ustar liggesusers Controlling y-axis Plotting

Controlling y-axis Plotting

Tom Kelly

2021-07-27

While boxplots have become the de facto standard for plotting the distribution of data this is a vast oversimplification and may not show everything needed to evaluate the variation of data. This is particularly important for datasets which do not form a Gaussian “Normal” distribution that most researchers have become accustomed to.

While density plots are helpful in this regard, they can be less aesthetically pleasing than boxplots and harder to interpret for those familiar with boxplots. Often the only ways to compare multiple data types with density use slices of the data with faceting the plotting panes or overlaying density curves with colours and a legend. This approach is jarring for new users and leads to cluttered plots difficult to present to a wider audience.

##Violin Plots

Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits:

  • Greater flexibility for plotting variation than boxplots
  • More familiarity to boxplot users than density plots
  • Easier to directly compare data types than existing plots

As shown below for the iris dataset, violin plots show distribution information that the boxplot is unable to.

library("vioplot")
data(iris)
boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"))

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"))

##Violin y-axis

###Logarithmic scale

However the existing violin plot packages (such as ) do not support log-scale of the y-axis. This has been amended with the ylog argument.

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = T, ylim=c(log(1), log(10)))
## Warning in plot.window(xlim, ylim, log = log, asp = asp, bty = bty, cex = cex, :
## nonfinite axis limits [GScale(-inf,0.362216,2, .); log=1]

## Warning in plot.window(xlim, ylim, log = log, asp = asp, bty = bty, cex = cex, :
## nonfinite axis limits [GScale(-inf,0.362216,2, .); log=1]

This can also be invoked with the log="y" argument compatible with boxplot:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = T, ylim=c(log(1), log(10)))
vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = "y", ylim=c(log(1), log(10)))

###custom y-axes

The y-axes can also be removed with yaxt="n" to enable customised y-axes:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n")

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = T, yaxt="n", ylim=c(log(1), log(10)))
## Warning in plot.window(xlim, ylim, log = log, asp = asp, bty = bty, cex = cex, :
## nonfinite axis limits [GScale(-inf,0.362216,2, .); log=1]

## Warning in plot.window(xlim, ylim, log = log, asp = asp, bty = bty, cex = cex, :
## nonfinite axis limits [GScale(-inf,0.362216,2, .); log=1]

Thus custom axes can be added to violin plots. As shown on a linear scale:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n")
axis(2, at=1:10, labels=1:10)

As well as for on a log scale:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n", log="y", ylim=c(log(4), log(9)))
axis(2, at=log(1:10), labels=1:10)

vioplot/inst/doc/violin_ylog.R0000644000176200001440000000526314077721435016165 0ustar liggesusers## ----------------------------------------------------------------------------- library("vioplot") ## ---- message=FALSE----------------------------------------------------------- data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) ## ----------------------------------------------------------------------------- vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = T, ylim=c(log(1), log(10))) ## ----------------------------------------------------------------------------- vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = T, ylim=c(log(1), log(10))) vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", log = "y", ylim=c(log(1), log(10))) ## ----------------------------------------------------------------------------- vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", ylog = T, yaxt="n", ylim=c(log(1), log(10))) ## ----------------------------------------------------------------------------- vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n") axis(2, at=1:10, labels=1:10) ## ----------------------------------------------------------------------------- vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length", yaxt="n", log="y", ylim=c(log(4), log(9))) axis(2, at=log(1:10), labels=1:10) vioplot/inst/doc/violin_customisation.html0000644000176200001440000073524414077721432020665 0ustar liggesusers Customising Violin Plots

Customising Violin Plots

Tom Kelly

2021-07-27

While boxplots have become the de facto standard for plotting the distribution of data this is a vast oversimplification and may not show everything needed to evaluate the variation of data. This is particularly important for datasets which do not form a Gaussian “Normal” distribution that most researchers have become accustomed to.

While density plots are helpful in this regard, they can be less aesthetically pleasing than boxplots and harder to interpret for those familiar with boxplots. Often the only ways to compare multiple data types with density use slices of the data with faceting the plotting panes or overlaying density curves with colours and a legend. This approach is jarring for new users and leads to cluttered plots difficult to present to a wider audience.

Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits:

  • Greater flexibility for plotting variation than boxplots
  • More familiarity to boxplot users than density plots
  • Easier to directly compare data types than existing plots

As shown below for the iris dataset, violin plots show distribution information that the boxplot is unable to.

library("vioplot")
data(iris)
boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"))
library("vioplot")
vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"))

Plot Defaults

However as we can see here the plot defaults are not aesthetically pleasing, with a rather glaring colour scheme unsuitable for professional or academic usage. Thus the plot default colours have been changed as shown here:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length")

Plot colours: Violin Fill

Plot colours can be further customised as with the original vioplot package using the col argument:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue")

Vectorisation

However the vioplot (0.2) function is unable to colour each violin separately, thus this is enabled with a vectorised col in vioplot (0.3):

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col=c("lightgreen", "lightblue", "palevioletred"))
legend("topleft", legend=c("setosa", "versicolor", "virginica"), fill=c("lightgreen", "lightblue", "palevioletred"), cex = 0.5)

Plot colours: Violin Lines and Boxplot

Colours can also be customised for the violin fill and border separately using the col and border arguments:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue", border="royalblue")

Similarly, the arguments lineCol and rectCol specify the colors of the boxplot outline and rectangle fill. For simplicity the box and whiskers of the boxplot will always have the same colour.

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", rectCol="palevioletred", lineCol="violetred")

The same applies to the colour of the median point with colMed:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", colMed="violet")

### Combined customisation

These can be customised colours can be combined:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue", border="royalblue", rectCol="palevioletred", lineCol="violetred", colMed="violet")

Vectorisation

These color and shape settings can also be customised separately for each violin:

vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), border=c("darkolivegreen4", "royalblue4", "violetred4"), rectCol=c("forestgreen", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), colMed=c("green", "cyan", "magenta"), pchMed=c(15, 17, 19))

This should be sufficient to customise the violin plot but further examples are given in the areaEqual vioplot vignette including how violin plots are useful for comparing variation when data does not follow the same distribution. This document also compares the violin plot with other established methods to plot data variation.

vioplot/inst/doc/violin_formulae.Rmd0000755000176200001440000001011014027267745017340 0ustar liggesusers--- title: "Customising Violin Plots with Formula Input" author: "Tom Kelly" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{vioplot: Customising Violin Plots with Formula Input} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- Since boxplots have become the _de facto_ standard for plotting the distribution of data most users are familiar with these and the formula input for dataframes. However this input is not available in the standard `vioplot` package. Thus it has been restored here for enhanced backwards compatibility with `boxplot`. As shown below for the `iris` dataset, violin plots show distribution information taking formula input that `boxplot` implements but `vioplot` is unable to. This demonstrates the customisation demonstrated in [the main vioplot vignette using vioplot syntax](violin_customisation.html) with the formula method commonly used for `boxplot`, `t.test`, and `lm`. ```{r} library("vioplot") ``` ```{r, message=FALSE, eval=FALSE} data(iris) boxplot(Sepal.Length~Species, data = iris) ``` ```{r, message=FALSE, echo=FALSE} data(iris) boxplot(Sepal.Length~Species, data = iris, main = "Sepal Length") ``` Whereas performing the same function does not work with `vioplot` (0.2). ```{r, message=FALSE, eval=FALSE} devtools::install_version("vioplot", version = "0.2") library("vioplot") vioplot(Sepal.Length~Species, data = iris) ``` ``` Error in min(data) : invalid 'type' (language) of argument ``` ## Plot Defaults ```{r, message=FALSE, eval=FALSE} vioplot(Sepal.Length~Species, data = iris) ``` ```{r, message=FALSE, echo=FALSE} vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="magenta") ``` Another concern we see here is that the `vioplot` defaults are not aesthetically pleasing, with a rather glaring colour scheme unsuitable for professional or academic usage. Thus the plot default colours have been changed as shown here: ```{r} vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length") ``` ## Plot colours: Violin Fill Plot colours can be further customised as with the original vioplot package using the `col` argument: ```{r} vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="lightblue") ``` ### Vectorisation However the `vioplot` (0.2) function is unable to colour each violin separately, thus this is enabled with a vectorised `col` in `vioplot` (0.3): ```{r} vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col=c("lightgreen", "lightblue", "palevioletred")) legend("topleft", legend=c("setosa", "versicolor", "virginica"), fill=c("lightgreen", "lightblue", "palevioletred"), cex = 0.5) ``` ## Plot colours: Violin Lines and Boxplot Colours can also be customised for the violin fill and border separately using the `col` and `border` arguments: ```{r} vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="lightblue", border="royalblue") ``` Similarly, the arguments `lineCol` and `rectCol` specify the colours of the boxplot outline and rectangle fill. For simplicity the box and whiskers of the boxplot will always have the same colour. ```{r} vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", rectCol="palevioletred", lineCol="violetred") ``` The same applies to the colour of the median point with `colMed`: ```{r} vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", colMed="violet") ``` ### Combined customisation These can be customised colours can be combined: ```{r} vioplot(Sepal.Length~Species, data = iris, main = "Sepal Length", col="lightblue", border="royalblue", rectCol="palevioletred", lineCol="violetred", colMed="violet") ``` ### Vectorisation These colour and shape settings can also be customised separately for each violin: ```{r} vioplot(Sepal.Length~Species, data = iris, main="Sepal Length", col=c("lightgreen", "lightblue", "palevioletred"), border=c("darkolivegreen4", "royalblue4", "violetred4"), rectCol=c("forestgreen", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), colMed=c("green", "cyan", "magenta"), pchMed=c(15, 17, 19)) ``` vioplot/inst/doc/violin_customisation.R0000644000176200001440000001014514077721431020103 0ustar liggesusers## ----------------------------------------------------------------------------- library("vioplot") ## ---- message=FALSE, eval=FALSE----------------------------------------------- # data(iris) # boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) # library("vioplot") # vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) ## ---- message=FALSE, echo=FALSE----------------------------------------------- data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="magenta") ## ----------------------------------------------------------------------------- vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length") ## ----------------------------------------------------------------------------- vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue") ## ----------------------------------------------------------------------------- vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col=c("lightgreen", "lightblue", "palevioletred")) legend("topleft", legend=c("setosa", "versicolor", "virginica"), fill=c("lightgreen", "lightblue", "palevioletred"), cex = 0.5) ## ----------------------------------------------------------------------------- vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue", border="royalblue") ## ----------------------------------------------------------------------------- vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", rectCol="palevioletred", lineCol="violetred") ## ----------------------------------------------------------------------------- vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", colMed="violet") ## ----------------------------------------------------------------------------- vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue", border="royalblue", rectCol="palevioletred", lineCol="violetred", colMed="violet") ## ----------------------------------------------------------------------------- vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), border=c("darkolivegreen4", "royalblue4", "violetred4"), rectCol=c("forestgreen", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), colMed=c("green", "cyan", "magenta"), pchMed=c(15, 17, 19)) vioplot/inst/doc/violin_customisation.Rmd0000755000176200001440000001453314027267745020444 0ustar liggesusers--- title: "Customising Violin Plots" author: "Tom Kelly" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{vioplot: Customising Violin Plots} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- While boxplots have become the _de facto_ standard for plotting the distribution of data this is a vast oversimplification and may not show everything needed to evaluate the variation of data. This is particularly important for datasets which do not form a Gaussian "Normal" distribution that most researchers have become accustomed to. While density plots are helpful in this regard, they can be less aesthetically pleasing than boxplots and harder to interpret for those familiar with boxplots. Often the only ways to compare multiple data types with density use slices of the data with faceting the plotting panes or overlaying density curves with colours and a legend. This approach is jarring for new users and leads to cluttered plots difficult to present to a wider audience. Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits: - Greater flexibility for plotting variation than boxplots - More familiarity to boxplot users than density plots - Easier to directly compare data types than existing plots As shown below for the `iris` dataset, violin plots show distribution information that the boxplot is unable to. ```{r} library("vioplot") ``` ```{r, message=FALSE, eval=FALSE} data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) library("vioplot") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica")) ``` ```{r, message=FALSE, echo=FALSE} data(iris) boxplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length") vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="magenta") ``` ## Plot Defaults However as we can see here the plot defaults are not aesthetically pleasing, with a rather glaring colour scheme unsuitable for professional or academic usage. Thus the plot default colours have been changed as shown here: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length") ``` ## Plot colours: Violin Fill Plot colours can be further customised as with the original vioplot package using the `col` argument: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue") ``` ### Vectorisation However the `vioplot` (0.2) function is unable to colour each violin separately, thus this is enabled with a vectorised `col` in `vioplot` (0.3): ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col=c("lightgreen", "lightblue", "palevioletred")) legend("topleft", legend=c("setosa", "versicolor", "virginica"), fill=c("lightgreen", "lightblue", "palevioletred"), cex = 0.5) ``` ## Plot colours: Violin Lines and Boxplot Colours can also be customised for the violin fill and border separately using the `col` and `border` arguments: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue", border="royalblue") ``` Similarly, the arguments `lineCol` and `rectCol` specify the colors of the boxplot outline and rectangle fill. For simplicity the box and whiskers of the boxplot will always have the same colour. ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", rectCol="palevioletred", lineCol="violetred") ``` The same applies to the colour of the median point with `colMed`: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", colMed="violet") ``` ### Combined customisation These can be customised colours can be combined: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main = "Sepal Length", col="lightblue", border="royalblue", rectCol="palevioletred", lineCol="violetred", colMed="violet") ``` ### Vectorisation These color and shape settings can also be customised separately for each violin: ```{r} vioplot(iris$Sepal.Length[iris$Species=="setosa"], iris$Sepal.Length[iris$Species=="versicolor"], iris$Sepal.Length[iris$Species=="virginica"], names=c("setosa", "versicolor", "virginica"), main="Sepal Length (Equal Area)", areaEqual = T, col=c("lightgreen", "lightblue", "palevioletred"), border=c("darkolivegreen4", "royalblue4", "violetred4"), rectCol=c("forestgreen", "blue", "palevioletred3"), lineCol=c("darkolivegreen", "royalblue", "violetred4"), colMed=c("green", "cyan", "magenta"), pchMed=c(15, 17, 19)) ``` This should be sufficient to customise the violin plot but further examples are given in [the areaEqual vioplot vignette](violin_area.html) including how violin plots are useful for comparing variation when data does not follow the same distribution. This document also compares the violin plot with other established methods to plot data variation. vioplot/inst/COPYRIGHT0000755000176200001440000000307514077720415014235 0ustar liggesusersCopyright (c) 2004, Daniel Adler All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Goettingen nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. vioplot/inst/CITATION0000755000176200001440000000117714077720415014100 0ustar liggesuserscitHeader("To cite the enhanced vioplot package in publications use:") citEntry(entry = "Manual", title = "vioplot: violin plot", author = personList(as.person("Daniel Adler"),as.person("S. Thomas Kelly")), year = "2020", note = "R package version 0.3.7", url = "https://github.com/TomKellyGenetics/vioplot", textVersion = paste("Daniel Adler and S. Thomas Kelly (2021). vioplot: violin plot. R package version 0.3.7", "https://github.com/TomKellyGenetics/vioplot") ) citFooter(paste("Please also acknowledge the original package: \n citation(", "vioplot", ")", sep="\""))

Violin Plots

Therefore violin plots are a powerful tool to assist researchers to visualise data, particularly in the quality checking and exploratory parts of an analysis. Violin plots have many benefits:

  • Greater flexbility for plotting variation than boxplots
  • More familiarity to boxplot users than density plots
  • Easier to directly compare data types than existing plots

As shown below for the iris dataset, violin plots show distribution information that the boxplot is unable to.

General Set up

We set up the data with two categories (Sepal Width) as follows:

data(iris)
summary(iris$Sepal.Width)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   2.000   2.800   3.000   3.057   3.300   4.400
table(iris$Sepal.Width > mean(iris$Sepal.Width))
## 
## FALSE  TRUE 
##    83    67
iris_large <- iris[iris$Sepal.Width > mean(iris$Sepal.Width), ]
iris_small <- iris[iris$Sepal.Width <= mean(iris$Sepal.Width), ]

Boxplots

First we plot Sepal Length on its own:

boxplot(Sepal.Length~Species, data=iris, col="grey")

An indirect comparision can be achieved with par:

par(mfrow=c(2,1))
boxplot(Sepal.Length~Species, data=iris_small, col = "lightblue")
boxplot(Sepal.Length~Species, data=iris_large, col = "palevioletred")

par(mfrow=c(1,1))

Violin Plots

First we plot Sepal Length on its own:

vioplot(Sepal.Length~Species, data=iris)

An indirect comparision can be achieved with par:

par(mfrow=c(2,1))
vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line")
vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line")

par(mfrow=c(1,1))

Split Violin Plots

A more direct comparision can be made with the side argument and add = TRUE on the second plot:

vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right")
vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", add = T)
title(xlab = "Species", ylab = "Sepal Length")
legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width")

median

The line median option is more suitable for side by side comparisions but the point option is still available also:

vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "point", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2")
vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "point", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T)
title(xlab = "Species", ylab = "Sepal Length")
legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width")

It may be necessary to include a points command to fix the median being overwritten by the following plots:

vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "point", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2")
vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "point", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T)
points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_large[grep(species, iris_large$Species),]$Sepal.Length))), pch = 21, col = "palevioletred4", bg = "palevioletred2")
title(xlab = "Species", ylab = "Sepal Length")
legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width")

Similarly points could be added where a line has been used previously:

vioplot(Sepal.Length~Species, data=iris_large, col = "palevioletred", plotCentre = "line", side = "right", pchMed = 21, colMed = "palevioletred4", colMed2 = "palevioletred2")
vioplot(Sepal.Length~Species, data=iris_small, col = "lightblue", plotCentre = "line", side = "left", pchMed = 21, colMed = "lightblue4", colMed2 = "lightblue2", add = T)
points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_large[grep(species, iris_large$Species),]$Sepal.Length))), pch = 21, col = "palevioletred4", bg = "palevioletred2")
points(1:length(levels(iris$Species)), as.numeric(sapply(levels(iris$Species), function(species) median(iris_small[grep(species, iris_small$Species),]$Sepal.Length))), pch = 21, col = "lightblue4", bg = "lightblue2")
title(xlab = "Species", ylab = "Sepal Length")
legend("topleft", fill = c("lightblue", "palevioletred"), legend = c("small", "large"), title = "Sepal Width")

Here it is aesthetically pleasing and intuitive to interpret categorical differences in mean and variation in a continuous variable.