colorspace/0000755000175400001440000000000013024343611012574 5ustar zeileisuserscolorspace/inst/0000755000175400001440000000000013024341641013552 5ustar zeileisuserscolorspace/inst/CITATION0000644000175400001440000000554413024270417014721 0ustar zeileisuserscitHeader("To cite colorspace in publications use") ## R >= 2.8.0 passes package metadata to citation(). if(!exists("meta") || is.null(meta)) meta <- packageDescription("colorspace") year <- sub("-.*", "", meta$Date) note <- sprintf("R package version %s", meta$Version) citEntry(entry = "Manual", title = "{colorspace}: Color Space Manipulation", author = personList(as.person("Ross Ihaka"), as.person("Paul Murrell"), as.person("Kurt Hornik"), as.person("Jason C. Fisher"), as.person("Achim Zeileis")), year = year, note = note, url = "https://CRAN.R-project.org/package=colorspace", textVersion = paste("Ross Ihaka, Paul Murrell, Kurt Hornik, Jason C. Fisher, Achim Zeileis", sprintf("(%s).", year), "colorspace: Color Space Manipulation.", paste(note, ".", sep = ""), "URL https://CRAN.R-project.org/package=colorspace") ) citEntry(entry = "Article", title = "Escaping {RGB}land: Selecting Colors for Statistical Graphics", author = personList(as.person("Achim Zeileis"), as.person("Kurt Hornik"), as.person("Paul Murrell")), journal = "Computational Statistics \\& Data Analysis", year = "2009", volume = "53", number = "9", pages = "3259--3270", doi = "10.1016/j.csda.2008.11.033", textVersion = paste("Achim Zeileis, Kurt Hornik, Paul Murrell (2009).", "Escaping RGBland: Selecting Colors for Statistical Graphics.", "Computational Statistics & Data Analysis, 53(9), 3259-3270.", "doi:10.1016/j.csda.2008.11.033"), header = "If you use HCL-based color palettes, please cite:" ) citEntry(entry = "Article", title = "Somewhere over the Rainbow: How to Make Effective Use of Colors in Meteorological Visualizations", author = personList(as.person("Reto Stauffer"), as.person("Georg J. Mayr"), as.person("Markus Dabernig"), as.person("Achim Zeileis")), journal = "Bulletin of the American Meteorological Society", year = "2009", volume = "96", number = "2", pages = "203--216", doi = "10.1175/BAMS-D-13-00155.1", textVersion = paste("Reto Stauffer, Georg J. Mayr, Markus Dabernig, Achim Zeileis (2015).", "Somewhere over the Rainbow: How to Make Effective Use of Colors in Meteorological Visualizations.", "Bulletin of the American Meteorological Society, 96(2), 203-216.", "doi:10.1175/BAMS-D-13-00155.1"), header = "If you use HCL-based color palettes in meteorological visualizations, please cite:" ) colorspace/inst/doc/0000755000175400001440000000000013024341641014317 5ustar zeileisuserscolorspace/inst/doc/hcl-colors.R0000644000175400001440000002354213024341641016515 0ustar zeileisusers### R code from vignette source 'hcl-colors.Rnw' ################################################### ### code chunk number 1: preliminaries ################################################### options(prompt = "R> ", continue = "+ ") library("colorspace") library("vcd") library("mvtnorm") library("kernlab") library("KernSmooth") ################################################### ### code chunk number 2: pal ################################################### pal <- function(col, border = "light gray", ...) { n <- length(col) plot(0, 0, type="n", xlim = c(0, 1), ylim = c(0, 1), axes = FALSE, xlab = "", ylab = "", ...) rect(0:(n-1)/n, 0, 1:n/n, 1, col = col, border = border) } ################################################### ### code chunk number 3: pal-q (eval = FALSE) ################################################### ## pal(rainbow_hcl(4, start = 30, end = 300), main = "dynamic") ## pal(rainbow_hcl(4, start = 60, end = 240), main = "harmonic") ## pal(rainbow_hcl(4, start = 270, end = 150), main = "cold") ## pal(rainbow_hcl(4, start = 90, end = -30), main = "warm") ################################################### ### code chunk number 4: pal-q1 ################################################### par(mfrow = c(2, 2), mar = c(0, 0, 3, 0)) pal(rainbow_hcl(4, start = 30, end = 300), main = "dynamic") pal(rainbow_hcl(4, start = 60, end = 240), main = "harmonic") pal(rainbow_hcl(4, start = 270, end = 150), main = "cold") pal(rainbow_hcl(4, start = 90, end = -30), main = "warm") ################################################### ### code chunk number 5: pal-s (eval = FALSE) ################################################### ## pal(sequential_hcl(12, c = 0, power = 2.2)) ## pal(sequential_hcl(12, power = 2.2)) ## pal(heat_hcl(12, c = c(80, 30), l = c(30, 90), power = c(1/5, 2))) ## pal(terrain_hcl(12, c = c(65, 0), l = c(45, 90), power = c(1/2, 1.5))) ## pal(rev(heat_hcl(12, h = c(0, -100), c = c(40, 80), l = c(75, 40), ## power = 1))) ################################################### ### code chunk number 6: pal-s1 ################################################### par(mfrow = c(5, 1), mar = c(0, 0, 0, 0)) pal(sequential_hcl(12, c = 0, power = 2.2)) pal(sequential_hcl(12, power = 2.2)) pal(heat_hcl(12, c = c(80, 30), l = c(30, 90), power = c(1/5, 2))) pal(terrain_hcl(12, c = c(65, 0), l = c(45, 90), power = c(1/2, 1.5))) pal(rev(heat_hcl(12, h = c(0, -100), c = c(40, 80), l = c(75, 40), power = 1))) ################################################### ### code chunk number 7: pal-d (eval = FALSE) ################################################### ## pal(diverge_hcl(7)) ## pal(diverge_hcl(7, c = 100, l = c(50, 90), power = 1)) ## pal(diverge_hcl(7, h = c(130, 43), c = 100, l = c(70, 90))) ## pal(diverge_hcl(7, h = c(180, 330), c = 59, l = c(75, 95))) ################################################### ### code chunk number 8: pal-d1 ################################################### par(mfrow = c(4, 1), mar = c(0, 0, 0, 0)) pal(diverge_hcl(7)) pal(diverge_hcl(7, c = 100, l = c(50, 90), power = 1)) pal(diverge_hcl(7, h = c(130, 43), c = 100, l = c(70, 90))) pal(diverge_hcl(7, h = c(180, 330), c = 59, l = c(75, 95))) ################################################### ### code chunk number 9: seats-data ################################################### seats <- structure(c(226, 61, 54, 51, 222), .Names = c("CDU/CSU", "FDP", "Linke", "Gruene", "SPD")) seats ################################################### ### code chunk number 10: seats-colors ################################################### parties <- rainbow_hcl(6, c = 60, l = 75)[c(5, 2, 6, 3, 1)] names(parties) <- names(seats) ################################################### ### code chunk number 11: seats (eval = FALSE) ################################################### ## pie(seats, clockwise = TRUE, col = parties, radius = 1) ################################################### ### code chunk number 12: seats1 ################################################### par(mar = rep(0.8, 4)) pie(seats, clockwise = TRUE, col = parties, radius = 1) ################################################### ### code chunk number 13: votes-data ################################################### data("Bundestag2005", package = "vcd") votes <- Bundestag2005[c(1, 3:5, 9, 11, 13:16, 2, 6:8, 10, 12), c("CDU/CSU", "FDP", "SPD", "Gruene", "Linke")] ################################################### ### code chunk number 14: votes (eval = FALSE) ################################################### ## mosaic(votes, gp = gpar(fill = parties[colnames(votes)])) ################################################### ### code chunk number 15: votes (eval = FALSE) ################################################### ## mosaic(votes, gp = gpar(fill = parties[colnames(votes)]), ## spacing = spacing_highlighting, labeling = labeling_left, ## labeling_args = list(rot_labels = c(0, 90, 0, 0), ## varnames = FALSE, pos_labels = "center", ## just_labels = c("center", "center", "center", "right")), ## margins = unit(c(2.5, 1, 1, 12), "lines"), ## keep_aspect_ratio = FALSE) ################################################### ### code chunk number 16: votes1 ################################################### mosaic(votes, gp = gpar(fill = parties[colnames(votes)]), spacing = spacing_highlighting, labeling = labeling_left, labeling_args = list(rot_labels = c(0, 90, 0, 0), varnames = FALSE, pos_labels = "center", just_labels = c("center", "center", "center", "right")), margins = unit(c(2.5, 1, 1, 12), "lines"), keep_aspect_ratio = FALSE) ################################################### ### code chunk number 17: bkde-fit ################################################### library("KernSmooth") data("geyser", package = "MASS") dens <- bkde2D(geyser[,2:1], bandwidth = c(0.2, 3), gridsize = c(201, 201)) ################################################### ### code chunk number 18: bkde1 (eval = FALSE) ################################################### ## image(dens$x1, dens$x2, dens$fhat, xlab = "duration", ylab = "waiting time", ## col = rev(heat_hcl(33, c = 0, l = c(30, 90), power = c(1/5, 1.3)))) ################################################### ### code chunk number 19: bkde2 (eval = FALSE) ################################################### ## image(dens$x1, dens$x2, dens$fhat, xlab = "duration", ylab = "waiting time", ## col = rev(heat_hcl(33, c = c(80, 30), l = c(30, 90), power = c(1/5, 1.3)))) ################################################### ### code chunk number 20: bkde3 ################################################### par(mfrow = c(1, 2)) image(dens$x1, dens$x2, dens$fhat, xlab = "duration", ylab = "waiting time", col = rev(heat_hcl(33, c = 0, l = c(30, 90), power = c(1/5, 1.3)))) box() image(dens$x1, dens$x2, dens$fhat, xlab = "duration", ylab = "waiting time", col = rev(heat_hcl(33, c = c(80, 30), l = c(30, 90), power = c(1/5, 1.3)))) box() ################################################### ### code chunk number 21: bkde-fit2 ################################################### library("KernSmooth") geyser2 <- cbind(geyser$duration[-299], geyser$waiting[-1]) dens2 <- bkde2D(geyser2, bandwidth = c(0.2, 3), gridsize = c(201, 201)) ################################################### ### code chunk number 22: bkde4 (eval = FALSE) ################################################### ## image(dens2$x1, dens2$x2, dens2$fhat, xlab = "duration", ylab = "waiting time", ## col = rev(heat_hcl(33, c = 0, l = c(30, 90), power = c(1/5, 1.3)))) ################################################### ### code chunk number 23: bkde5 (eval = FALSE) ################################################### ## image(dens2$x1, dens2$x2, dens2$fhat, xlab = "duration", ylab = "waiting time", ## col = rev(heat_hcl(33, c = c(80, 30), l = c(30, 90), power = c(1/5, 1.3)))) ################################################### ### code chunk number 24: bkde6 ################################################### par(mfrow = c(1, 2)) image(dens2$x1, dens2$x2, dens2$fhat, xlab = "duration", ylab = "waiting time", col = rev(heat_hcl(33, c = 0, l = c(30, 90), power = c(1/5, 1.3)))) box() image(dens2$x1, dens2$x2, dens2$fhat, xlab = "duration", ylab = "waiting time", col = rev(heat_hcl(33, c = c(80, 30), l = c(30, 90), power = c(1/5, 1.3)))) box() ################################################### ### code chunk number 25: arthritis-data ################################################### art <- xtabs(~ Treatment + Improved, data = Arthritis, subset = Sex == "Female") ################################################### ### code chunk number 26: arthritis (eval = FALSE) ################################################### ## set.seed(1071) ## mosaic(art, gp = shading_max, gp_args = list(n = 5000)) ################################################### ### code chunk number 27: arthritis1 ################################################### set.seed(1071) mosaic(art, gp = shading_max, gp_args = list(n = 5000)) ################################################### ### code chunk number 28: svm-data ################################################### library("mvtnorm") set.seed(123) x1 <- rmvnorm(75, mean = c(1.5, 1.5), sigma = matrix(c(1, 0.8, 0.8, 1), ncol = 2)) x2 <- rmvnorm(75, mean = c(-1, -1), sigma = matrix(c(1, -0.3, -0.3, 1), ncol = 2)) X <- rbind(x1, x2) ex1 <- data.frame(class = factor(c(rep("a", 75), rep("b", 75))), x1 = X[,1], x2 = X[,2]) ################################################### ### code chunk number 29: svm-fit ################################################### library("kernlab") fm <- ksvm(class ~ ., data = ex1, C = 0.5) ################################################### ### code chunk number 30: svm (eval = FALSE) ################################################### ## plot(fm, data = ex1) ################################################### ### code chunk number 31: svm1 ################################################### plot(fm, data = ex1) colorspace/inst/doc/hcl-colors.Rnw0000644000175400001440000005067213024341641017066 0ustar zeileisusers\documentclass[nojss]{jss} %% need no \usepackage{Sweave} \SweaveOpts{engine=R, eps=FALSE, echo=FALSE, results=hide, keep.source = TRUE, pdf = TRUE, png = FALSE, resolution = 100} \title{HCL-Based Color Palettes in \proglang{R}} \Plaintitle{HCL-Based Color Palettes in R} \author{Achim Zeileis\\Universit\"at Innsbruck \And Kurt Hornik\\WU Wirtschafts-\\universit\"at Wien \And Paul Murrell\\The University\\of Auckland} \Plainauthor{Achim Zeileis, Kurt Hornik, Paul Murrell} \Keywords{HCL colors, qualitative palette, sequential palette, diverging palette} \Abstract{ The package \pkg{colorspace} provides various functions providing perceptually-based color palettes for coding categorical data (qualitative palettes) and numerical variables (sequential and diverging palettes). We illustrate how these functions can be employed to generate various flavours of these palettes (with different emphases) and how they can be plugged into \proglang{R} graphics functions. } \Address{ Achim Zeileis\\ Department of Statistics\\ Faculty of Economics and Statistics\\ Universit\"at Innsbruck\\ Universit\"atsstra{\ss}e~15\\ 6020 Innsbruck, Austria\\ E-mail: \email{Achim.Zeileis@R-project.org}\\ URL: \url{http://eeecon.uibk.ac.at/~zeileis/}\\ Kurt Hornik\\ Institute for Statistics and Mathematics\\ Department of Finance, Accounting and Statistics\\ WU Wirtschaftsuniversit\"at Wien\\ Augasse 2--6\\ 1090 Wien, Austria\\ E-mail: \email{Kurt.Hornik@R-project.org}\\ URL: \url{http://statmath.wu.ac.at/~hornik/}\\ Paul Murrell\\ Department of Statistics\\ The University of Auckland\\ Private Bag 92019\\ Auckland, New Zealand\\ E-mail: \email{paul@stat.auckland.ac.nz}\\ URL: \url{http://www.stat.auckland.ac.nz/~paul/} } \begin{document} %\VignetteIndexEntry{HCL-Based Color Palettes in R} %\VignetteDepends{colorspace,vcd,MASS,KernSmooth,mvtnorm,kernlab} %\VignetteKeywords{HCL colors, qualitative palette, sequential palette, diverging palette} %\VignettePackage{colorspace} <>= options(prompt = "R> ", continue = "+ ") library("colorspace") library("vcd") library("mvtnorm") library("kernlab") library("KernSmooth") @ \section{Introduction} \label{sec:intro} This is a companion vignette to \cite{color:Zeileis+Hornik+Murrell:2009} providing further technical details on the construction of the palettes as well as \proglang{R} code illustrating the use of varying palettes in practice. The palettes as well as some graphical functions demonstrated are contained in the package \pkg{colorspace}.\footnote{In addition to the discussion here, a graphical user interface for choosing colors based on the ideas of \cite{color:Zeileis+Hornik+Murrell:2009} is provided in the package as \code{choose\_palette()}.} As a simple convenience function we will use the function <>= pal <- function(col, border = "light gray", ...) { n <- length(col) plot(0, 0, type="n", xlim = c(0, 1), ylim = c(0, 1), axes = FALSE, xlab = "", ylab = "", ...) rect(0:(n-1)/n, 0, 1:n/n, 1, col = col, border = border) } @ which displays a set of colors using a sequence of shaded rectangles. In the remainder of this vignette, we first outline how different types of palettes can be constructed and generated using the tools from \pkg{colorspace}. Subsequently, we present a collection of examples illustrating the tools in practice. \pagebreak \section{Color palettes} \label{sec:palettes} \subsection{Qualitative palettes} \label{sec:qualitative} Qualitative palettes are sets of colors for depicting different categories, i.e., for coding a categorical variable. To give the same perceptual weight to each category, chroma and luminance are kept constant and only the hue is varied for obtaining different colors (which are consequently all balanced towards the same gray). In \pkg{colorspace}, qualitative palettes are implemented in the function \begin{Soutput} rainbow_hcl(n, c = 50, l = 70, start = 0, end = 360*(n-1)/n, ...) \end{Soutput} where \code{n} controls the number of colors in the palette. The arguments \code{c} and \code{l} give the fixed chroma and luminance levels, respectively, and \code{start} and \code{end} specify the range of hue angles. The function is named after the base \proglang{R} function \code{rainbow()} which has a similar interface but chooses colors in HSV coordinates. Figure~\ref{fig:pal-q-examples} depicts examples for generating qualitative sets of colors $(H, 50, 70)$ produced by <>= pal(rainbow_hcl(4, start = 30, end = 300), main = "dynamic") pal(rainbow_hcl(4, start = 60, end = 240), main = "harmonic") pal(rainbow_hcl(4, start = 270, end = 150), main = "cold") pal(rainbow_hcl(4, start = 90, end = -30), main = "warm") @ From left to right and top to down, this shows a palette from the full spectrum ($H = 30, 120, 210, 300$) creating a `dynamic' set of colors, a `harmonic' set with $H = 60, 120, 180, 240$, cold colors (from the blue/green part of the spectrum: $H = 270, 230, 190, 150$) and warm colors (from the yellow/red part of the spectrum: $H = 90, 50, 10, 330$), respectively. \setkeys{Gin}{width=0.75\textwidth} \begin{figure}[p!] \begin{center} <>= par(mfrow = c(2, 2), mar = c(0, 0, 3, 0)) <> @ \caption{\label{fig:pal-q-examples} Examples for qualitative palettes. Hue is varied in different intervals for given $C = 50$ and $L = 70$.} \end{center} \end{figure} \subsection{Sequential palettes} \label{sec:sequential} Sequential palettes are used for coding numerical information that ranges in a certain interval where low values are considered to be uninteresting and high values are interesting. Suppose we need to visualize an intensity or interestingness $i$ which (without loss of generality) is scaled to the unit interval. Potentially, all three dimensions of HCL space can be used for coding the intensity, leading to colors from an interval of hues (i.e., differing types of colors), an interval of chroma values (i.e., differing colorfulness) and an interval of luminance (i.e., differing intensity of gray). If we allow chroma and luminance to increase non-linearly via a function of type $i^p$, the resulting formula is: \[ (H_2 - i \cdot (H_1 - H_2), C_{\max} - i^{p_1} \cdot (C_{\max} - C_{\min}), L_{\max} - i^{p_2} \cdot (L_{\max} - L_{\min})). \] Two different ``flavors'' of this formula are readily implemented in \pkg{colorspace}, employing different defaults. For single hue palettes with $H_1 = H_2$ the function \begin{Soutput} sequential_hcl(n, h = 260, c = c(80, 0), l = c(30, 90), power = 1.5, ...) \end{Soutput} is provided where the first element of \code{c} and \code{l} give the starting chroma and luminance coordinate (by default colorful and dark) and the second element the ending coordinate (by default gray and light). The \code{power} argument implements the parameter $p$ from the $i^p$ function (and can be a vector of length 2). Sequential palettes using an interval of hues are provided by \begin{Soutput} heat_hcl(n, h = c(0, 90), c = c(100, 30), l = c(50, 90), power = c(1/5, 1), ...) \end{Soutput} named after the HSV-based \proglang{R} function \code{heat.colors()} and by default starts from a red and going to a yellow hue. The defaults in \code{heat_hcl()} are set differently compared to \code{sequential_hcl()} as to make the default HCL heat colors more similar to the HSV version. The defaults of \code{sequential_hcl()}, on the other hand, are set as to achieve a large contrast on the luminance axis. In addition \code{terrain_hcl()} is a wrapper for \code{heat_hcl()} producing colors similar to the HSV-based \code{terrain.colors()} from base \proglang{R}. Various palettes produced from these functions are shown in Figure~\ref{fig:pal-s-examples} using different pairs of hues as well as different chroma and luminance contrasts. <>= pal(sequential_hcl(12, c = 0, power = 2.2)) pal(sequential_hcl(12, power = 2.2)) pal(heat_hcl(12, c = c(80, 30), l = c(30, 90), power = c(1/5, 2))) pal(terrain_hcl(12, c = c(65, 0), l = c(45, 90), power = c(1/2, 1.5))) pal(rev(heat_hcl(12, h = c(0, -100), c = c(40, 80), l = c(75, 40), power = 1))) @ \setkeys{Gin}{width=.75\textwidth} \begin{figure}[p!] \begin{center} <>= par(mfrow = c(5, 1), mar = c(0, 0, 0, 0)) <> @ \caption{\label{fig:pal-s-examples} Examples for sequential palettes, varying only luminance (first panel), chroma and luminance (second panel), and hue, chroma and luminance (remaining panels).} \end{center} \end{figure} \subsection{Diverging palettes} \label{sec:diverging} Diverging palettes are also used for coding numerical information ranging in a certain interval---however, this interval includes a neutral value. Analogously to the previous section, we suppose that we want to visualize an intensity or interestingness $i$ from the interval $[-1, 1]$ (without loss of generality). Given useful sequential palettes, deriving diverging palettes is easy: two different hues are chosen for adding color to the same amount of `gray' at a given intensity $|i|$. Diverging palettes are implemented in the function \begin{Soutput} diverge_hcl(n, h = c(260, 0), c = 80, l = c(30, 90), power = 1.5, ...) \end{Soutput} which has the same arguments as \code{sequential_hcl()} but takes a pair of hues \code{h}. Figure~\ref{fig:pal-d-examples} shows various examples of conceivable combinations of hue, chroma and luminance. The first palette uses a broader range on the luminance axis whereas the others mostly rely on chroma contrasts. <>= pal(diverge_hcl(7)) pal(diverge_hcl(7, c = 100, l = c(50, 90), power = 1)) pal(diverge_hcl(7, h = c(130, 43), c = 100, l = c(70, 90))) pal(diverge_hcl(7, h = c(180, 330), c = 59, l = c(75, 95))) @ \setkeys{Gin}{width=.8\textwidth} \begin{figure}[t!] \begin{center} <>= par(mfrow = c(4, 1), mar = c(0, 0, 0, 0)) <> @ \caption{\label{fig:pal-d-examples} Examples for diverging palettes with different pairs of hues and decreasing luminance contrasts.} \end{center} \end{figure} \pagebreak \section{Illustrations} \label{sec:illustrations} \subsection{Qualitative palettes: Seats and votes in the German Bundestag} In this section, we show a collection of examples for the various types of palettes applied to statistical graphics. The first example illustrates qualitative palettes and visualizes data from the 2005 election for the German parliament ``Bundestag''. In this election, five parties were able to obtain enough votes to enter the Bundestag, the numbers of seats are given by <>= seats <- structure(c(226, 61, 54, 51, 222), .Names = c("CDU/CSU", "FDP", "Linke", "Gruene", "SPD")) seats @ We choose colors that are rough metaphors for the political parties, using a red hue $H = 0$ for the social democrats SPD, a blue hue $H = 240$ for the conservative CDU/CSU, a yellow hue $H = 60$ for the liberal FDP, a green hue $H = 120$ for the green party ``Die Gr\"unen'' and a purple hue $H = 300$ for the leftist party ``Die Linke''. To obtain rather intense colors, we set chroma to $C = 60$ and luminance to $L = 75$: <>= parties <- rainbow_hcl(6, c = 60, l = 75)[c(5, 2, 6, 3, 1)] names(parties) <- names(seats) @ The distribution of seats is depicted in a pie chart in Figure~\ref{fig:seats}. showing clearly that neither the governing coalition of SPD and Gr\"une nor the opposition of CDU/CSU and FDP could assemble a majority. Given that no party would enter a coalition with the leftists, this lead to a big coalition of CDU/CSU and SPD. <>= pie(seats, clockwise = TRUE, col = parties, radius = 1) @ \setkeys{Gin}{width=.6\textwidth} \begin{figure}[p] \begin{center} <>= par(mar = rep(0.8, 4)) <> @ \caption{\label{fig:seats} Seats in the German parliament.} \end{center} \end{figure} To take a closer look at the regional distribution, we load the \code{Bundestag2005} data set containing a contingency table with the number of votes for each party stratified by province (Bundesland). Then, we re-order the provinces from north to south, first the 10 western provinces (the former Federal Republic of Germany, FRG), then the 6 eastern provinces (the former German Democratic Republic, GDR). <>= data("Bundestag2005", package = "vcd") votes <- Bundestag2005[c(1, 3:5, 9, 11, 13:16, 2, 6:8, 10, 12), c("CDU/CSU", "FDP", "SPD", "Gruene", "Linke")] @ The data can then be visualized using a highlighted mosaic display via <>= mosaic(votes, gp = gpar(fill = parties[colnames(votes)])) @ The annotation for this plot is clearly sub-optimal, hence we use the flexible \code{strucplot()} framework provided by \pkg{vcd} and display the data via <>= mosaic(votes, gp = gpar(fill = parties[colnames(votes)]), spacing = spacing_highlighting, labeling = labeling_left, labeling_args = list(rot_labels = c(0, 90, 0, 0), varnames = FALSE, pos_labels = "center", just_labels = c("center", "center", "center", "right")), margins = unit(c(2.5, 1, 1, 12), "lines"), keep_aspect_ratio = FALSE) @ The output is shown in Figure~\ref{fig:votes} highlighting that the SPD performed better in the north and the CDU/CSU better in the south; furthermore, Die Linke performed particularly well in the eastern provinces and in Saarland. \setkeys{Gin}{width=.8\textwidth} \begin{figure}[p] \begin{center} <>= <> @ \caption{\label{fig:votes} Votes in the German election 2005.} \end{center} \end{figure} \subsection{Sequential palettes: Old Faithful geyser eruptions} To illustrate sequential palettes, a bivariate density estimation for the Old Faithful geyser eruptions data \code{geyser} from \pkg{MASS} is visualized. The Old Faithful geyser is one of the most popular sites in Yellowstone National Park and it is of some interest to understand the relation ship between the duration of a geyser eruption and the waiting time for this eruption. To look at the data, we use a bivariate kernel density estimate provided by the function \code{bkde2D()} from package \pkg{KernSmooth}. <>= library("KernSmooth") data("geyser", package = "MASS") dens <- bkde2D(geyser[,2:1], bandwidth = c(0.2, 3), gridsize = c(201, 201)) @ Subsequently, we look at the estimated kernel density by means of a heatmap (produced via \code{image()}) using two different sequential palettes: first with only gray colors <>= image(dens$x1, dens$x2, dens$fhat, xlab = "duration", ylab = "waiting time", col = rev(heat_hcl(33, c = 0, l = c(30, 90), power = c(1/5, 1.3)))) @ and then using heat colors balanced towards the sam gray levels as above <>= image(dens$x1, dens$x2, dens$fhat, xlab = "duration", ylab = "waiting time", col = rev(heat_hcl(33, c = c(80, 30), l = c(30, 90), power = c(1/5, 1.3)))) @ Figure~\ref{fig:bkde} shows the resulting heatmaps revealing a multi-modal bivariate distribution: short waiting times (around 50 minutes) are typically followed by a long eruption (around 4 minutes) whereas long waiting times (around 80 minutes) can be followed by either a long or short eruption (around 4 minutes). \setkeys{Gin}{width=\textwidth} \begin{figure}[t!] \begin{center} <>= par(mfrow = c(1, 2)) <> box() <> box() @ \caption{\label{fig:bkde} Bivariate density estimation for duration and waiting time for an eruption.} \end{center} \end{figure} Another interesting question in this data set would be ask how long the waiting time for the next eruption is following a short or long eruption respectively. This can be visualized using another bivarate density estimate for the transformed data set matching the previous duration with the following waiting time: <>= library("KernSmooth") geyser2 <- cbind(geyser$duration[-299], geyser$waiting[-1]) dens2 <- bkde2D(geyser2, bandwidth = c(0.2, 3), gridsize = c(201, 201)) @ Again, we look at this density using two heatmaps generated via <>= image(dens2$x1, dens2$x2, dens2$fhat, xlab = "duration", ylab = "waiting time", col = rev(heat_hcl(33, c = 0, l = c(30, 90), power = c(1/5, 1.3)))) @ and <>= image(dens2$x1, dens2$x2, dens2$fhat, xlab = "duration", ylab = "waiting time", col = rev(heat_hcl(33, c = c(80, 30), l = c(30, 90), power = c(1/5, 1.3)))) @ Figure~\ref{fig:bkde2} shows the result that illustrates that long and short waiting times follow long and short eruption durations, resepectively. \setkeys{Gin}{width=\textwidth} \begin{figure}[t!] \begin{center} <>= par(mfrow = c(1, 2)) <> box() <> box() @ \caption{\label{fig:bkde2} Bivariate density estimation for previous duration and following waiting time for an eruption.} \end{center} \end{figure} \subsection{Diverging palettes: Arthritis and SVM classification} Diverging palettes are particularly useful when visualizing residuals or correlations (with natural neutral value 0) or probabilities in 2-class supervised learning (with neutral value 0.5). Examples for both situations are provided here. First, we look at the outcome for the female patients from a double-blind clinical trial investigating a new treatment for rheumatoid arthritis. <>= art <- xtabs(~ Treatment + Improved, data = Arthritis, subset = Sex == "Female") @ For visualizing the data, we use a mosaic display with maximum shading \citep[as derived by][]{color:Zeileis+Meyer+Hornik:2007} via <>= set.seed(1071) mosaic(art, gp = shading_max, gp_args = list(n = 5000)) @ The mosaic rectangles in Figure~\ref{fig:arthritis} signal that the treatment lead to higher improvement compared to the placebo group; this effect is shown to be significant by the shading that codes the size of the Pearon residuals. Positive residuals, corresponding to more observations in the corresponding cell than expected under independence, are depicted in blue, negative residuals in red. Light colors signal significance at 10\% level, full colors significance at 1\% level. The palette implicitly used in this plot is \code{diverge_hcl(5, c = c(100, 0), l = c(50, 90), power = 1)}, it can be modified using the arguments of \code{shading_max()} which has an interface similar to \code{diverge_hcl()}. \setkeys{Gin}{width=.7\textwidth} \begin{figure}[p] \begin{center} <>= <> @ \caption{\label{fig:arthritis} Extended mosaic display for arthritis data.} \end{center} \end{figure} To illustrate the use of diverging palettes in 2-class classification, we generate some artificial date from a mixture of two bivariate normal distributions with different means and covariance matrices. The data are generated using \pkg{mvtnorm} and collected in a data frame \code{ex1}: <>= library("mvtnorm") set.seed(123) x1 <- rmvnorm(75, mean = c(1.5, 1.5), sigma = matrix(c(1, 0.8, 0.8, 1), ncol = 2)) x2 <- rmvnorm(75, mean = c(-1, -1), sigma = matrix(c(1, -0.3, -0.3, 1), ncol = 2)) X <- rbind(x1, x2) ex1 <- data.frame(class = factor(c(rep("a", 75), rep("b", 75))), x1 = X[,1], x2 = X[,2]) @ We fit a support vector machine (SVM) with a radial basis function kernel to this data set, using the function \code{ksvm()} from \pkg{kernlab} <>= library("kernlab") fm <- ksvm(class ~ ., data = ex1, C = 0.5) @ which can subsequently be easily visualized via <>= plot(fm, data = ex1) @ The resulting plot in Figure~\ref{fig:class} shows a heatmap with the fit of the SVM. The circles and triangles show the original observations, solid symbols correspond to the support vectors found. The shading underlying the plot visualizes the fitted decision values: values around 0 are on the decision boundary and are shaded in light gray, while regions that are firmly classified to one or the other class are shaded in full blue and red respectively. The palette used by the \code{plot()} method for \code{ksvm} objects cannot be easily modified---however, the colors employed are equivalent to \code{diverge_hcl(n, c = c(100, 0), l = c(50, 90), power = 1.3)}. \setkeys{Gin}{width=.7\textwidth} \begin{figure}[p] \begin{center} <>= <> @ \caption{\label{fig:class} SVM classification plot.} \end{center} \end{figure} \bibliography{color} \end{document} colorspace/inst/doc/hcl-colors.pdf0000644000175400001440000061436413024341642017076 0ustar zeileisusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 3664 /Filter /FlateDecode /N 64 /First 518 >> stream x[Ys8~_Ij&qT{|Ll̓"67T5@J ]s!6x@fʓF@I/|-=HM½zR̔ D^]TU 7.#~O?{>#NPbBHGebgd+% 1zFdН.?vDD+vT4U̬U9^>s@0ꪨs{8yg9O04{^i?CQ^ I^/uyg<=Vi1+RVVCyzEgg_y>!v ʿ|0!u&䕎[l_eDj5! 9=}CFaCӍi |mǚ$mkϚصV:iX{ U6\RkS>jM=g^OF%]q>D$%N^&*4MKKE3HQHh[Y"G$wX dsOظ) J& ?vK:Y֖ݗzXΎM5CU7iWҝ-- 6x%uhby.~' GOBtyƩwM嫂%˻^Nwlٵ5=ՇfE^j5uI Ǘ*Y Vk{'0|:A^'*b ͠[\7ɨ*e9f $jkV;sUeө|x,;y udQ9qtRӑ/ GUy*h Ɯ8D-D+A:H+EU]ُ㳟FWɸkR #-Һ*b?D#*ԪՇ|,3Ca4H0B(NoMB).`6Y#[q_(Xg6z84EtCLwck ֡f&;J(=1smRs e @u2Za2$yé ?> ]YG71vJ0 LQ~{nӁTVRjS H]̌M|\WVKrҊ/eُrjU GvrM&mUkx3Zxsɵ7^! X w]ԛ G)ž3(k]: /H`kIweCxX$"r*klX]oQ!pXm c4"q{Qmxa(Ib?%hCN 咥w lO ή+ WkBkG!+1kǫ),ӁA(I1V SeX#HP14.3k&!CLhSM> stream GPL Ghostscript 9.19 HCL colors, qualitative palette, sequential palette, diverging palette 2016-12-14T23:11:45+01:00 2016-12-14T23:11:45+01:00 LaTeX with hyperref package HCL-Based Color Palettes in RAchim Zeileis, Kurt Hornik, Paul Murrell endstream endobj 67 0 obj << /Type /ObjStm /Length 2725 /Filter /FlateDecode /N 64 /First 534 >> stream xZmsF~b>&użJb &9/IR|ka+]-|oGZ]ZW.V#i43==$Sֱ Ō7,hfe0в2YLI#0x\T,J*SLKmY4Li=ig3- HH>c&،eY$d3k[a6s2!,s9(r>2!7˘NILZh/JSC31K% TҢ J:杢GS|PBd>z>-Fp1u0&W 0D 3@SS`1@)0h脱pD(gk!Uab2x>&竪f e~gĔc&N~{Iql^3qT.nr܀JcMJ7?#nQgi,Y: vϊ._oM ]" PF#Knʊgebc5SLSD+sR{>e>Vd6i%D]RRbJ:eO%tƵz ply^mtK1t݆?7>ydyu X\{NA~V蠪wr4k!oh%ϋ20n8VϕalXW)GYI0~@-v PO0;k柗 ~V v쐜a'| mm^NQ^oW3vV,X.7-#Iα[FDN Vf7O.jqŴN>{?W\k?\p[V}ve]6MgrY-i 0_ P2nTsӭ0}3'Nqwi |Ha~}QwW[ fCL?tޙQ9+p~/8< nYR91_(ͪ~~Hg-gm풛mZ1Vng'-,dmAIا1oż*B,Ų(j?_=܃-GӶc$>bM&#$ mvD#(GH{d4eLܦLR;k; X B5$ )%5s ) 7)EW!kZH 4=oL-% xH8pw(TL@X,KoŹ(L\Jec-VE}eKF7xn.1V."lq!9l["2H&&knRcRg,z4wius (~jV&m7)KHov Nn8==>Z7_\-ށ{JB%eɳmݴ4ciK|/* 0tUK䧗C~n0f,;)_@Wi-ߦޢJ4N .SoPcՎ6,fM=cs*7EobV#AOO^<"Y/?m s=r.xuFW?w;hwCb5pG}PvD|i׎l9$o^ i!򏽙lҍ4t ![5xYShP9+"wm vϷm{,Բkkٷm˴ڞn|6r̺z~۶T˿VÞV{R#)4HoL7 xȾđ%>X3w һaC{.1CQc*mfK9O$+LNXo>tؠ9AyP+-6<(t(2MG>e;RUTyi>o^vW-AM ܦ"pYƩ_)[]zkPVK uMCWJvRmMAd͠ t<褂:2D Jmyq֒[,Lg$))/ ZD=+ō 4LZͣřP+/i0Wtu[Vma;Hd$#- ;m62QwE\^pM{Rļ=^:ܵV=X(T„W\3)q6n; lk=_嬞?UL\~w|r1pN$)cW_2:8 Ur{f;Ei^ۃU`Ug;Y&+2wz2)b:|SÈl!3yž* +>|.jQ狪|tb~k()?x>6Wvsaա|9PFKQa2_;#y)i^uMXؐ"z*R;{,>|;DC]m8l{d?R=(80mendstream endobj 132 0 obj << /Filter /FlateDecode /Length 4970 >> stream x\[o$u~#~IvZuQٰ#'2[4 %7Kr(^ZAzέN5{RzؚfuթsέZoh7nN>ˇ<_7W0Ó<: j761Ύ_f Ƈ_ow0:| MM?~?>aOMN605f |Bη;X)aCBe#[i=We-LOvQV=0EM[vorY.{3 c7atnvn_RH gx Fgp4?Dpv.f<O^cBgTKtZ7fgC)Lna5W 8ulQ:!vRDpr䜐G=lg28?NP۳ {x{7*VX%4閎ZkΎw=RuxmF}=ۺ3B[i.o:3*xŇ^1QgZ& ^+g[4x8`ʑCAuڻ侽0 kBE`IvfzP EĠͼ`2Z4z2Sݙڎ1 v ߮.|מ2Aq/s~ZлF%$A>m!:Ǣ-޵s( f D4,փ7w mHK_ ?}̘XAa KJ"}8A!ضKE_ Rr`CCe)(-YO3۞XE` U6M ` ն'2.uz|ɖWIUkV>,: i\ d}#^mVOSH@/}p5֡Rdwpu9$ɀ`NRf )D@#xPcnfTKTt`0pH1kT/b(S}QϧHCZe|:t.u"~DWoFp?rCw*] W|X:Ni"zJ0ӯW*,%YBň?Np.9juQޘɆauyEs$(MAEgÚy +y,(KYsRLa͂CW4-W|%f|ig7r,y`1?yӳUetq5plS+THTzCH Rb=;>fUF C_\[ , _s /i1$* AJ.L5TU^WIdZQHjw HT`G3&jD%8ywVL X&v 1L4UP*iɌhr|R uI(w9 slFMSlrؗ}h /sf < u%Mq!`V e)һQ\b%c{:{TyՓm-Eq=%"! )8Upl ~G>U=bKV _]A!`#e?4W[^.KjC O-a7hPu V6OY IKEB X,,_$09qB߶EHnvƓ)ʩ)ut^7:7?>ANP\z@D Tov.AUˁj/K\u~Ƃ>r!J nWeY!$ԘSW'^`];z^:J7daX]Dy@Oc(+Mg5 9{.E&@5p_j\8|RZv%ԹQR|jxeslh{LQ!0;q]W,SiAVqMrw(bleX ګju[Fַ0L= S&0 +kk^aɡb"XeSy1X/ID "Qbb~ &JY/MTC';0l A!MU zo,A(p-!DB#[lR1Й6K@V8C8H) T}2%RJ5`a?DMb{skɇ:E&^cȞh_ e{OA/MsBg86VrY@-p^+R>9D֋d|irޙh3/qL.j9D*Oޓt@ =ufJom3繀1è/4B4 b42M!؈9G"Okcz)ynՌ|#^;nL@^L鐱̊"a_>V`.OJ .j.`Ё&-:T~ S[*U :AZ+YSBv̛=7kUslbnLˠ`MqlG[w[7]b&RvPzsb):8N G"'iB=ݵӧ6mó6|l7mxX}*ϗ8hp ϫBmiyzh6_`׆3y{*}t}Wz}Ђ{Bky\X')޷V+3Lӧx}5ϻ՚58ѣ ʕ@o"Do$D:ДJ۝2%D[rny/M'3u :ÉnՇauOvJ\\ӽ]urƒ GCh]*MBUФy`J& Eb3/HiNb^ru@UTNy儍RdOhòE 9 *7*$w*[Uw=fw ^~ga?!V'"KY_]ܜXCTBD*W.n,@*k$h6פD_{H|}XOqäR:7^ka@e=(lȂ&`?$s6 ˨YHrAf.gkOzC @RfR +,ӗ%QZJƏE8%K_0> v#I0'B5/^I9.sOt*(Y޽ KD>\D @SB:_`_5gQX.D8K%w"A@O~$0 N7ˎLVʱL|R|?_Q%eVRT|5_].`!:Ms+5OQE'u"` a&N1'FPWI>ج᣺Mo7`ۤXy Ewp ,TE&GaHy:h郣\N#`7N"PB/p:T%xK[z+5cf{ (ڤi6yؔMNYS-M"4xVU$ VmxцކwmoWjT3yݮ8GzeU'RWZendstream endobj 133 0 obj << /Filter /FlateDecode /Length 6119 >> stream x=r$7r`b nȇHEr8Ih8;( Q]ݜ|Q0 G3 |F}ٗߙ|~to~>yϗ0:ϓ>>ˇl.Ӎz_^0|,ibƨmVq3S pJQz\XkG씳7 1qta{Ó:%gorJEdۜ/i`ʆ4<s?.OCǙ1#cN` su&|a_X?C)= 蕅SòZy놝wnEt^m 9yp>F{#M0k \E Yrq+Zh xIVe]I`>,)@HuI&I۷|z_Y]W}:DWkj\`–a mpQJK 4043:3C]Fr1@|Rb"Ni[U(Yw@Zώ 5!-8lRyn%6zoCC$j֜9@uS_-ry#|3#u7Ioҙ/L_MK0G$[mY-upS<BI= wtC*0m!7+$sɥF{f[R0NR_V\*F.bTYx߂ =%mCv^DǦl 'd$0D9$:cf:kݻN0SS;V;'ipֶ:l)#&zuܵe찥z7&\2?O8"<еb( d+Csk?'mfĆkibI[btDDX{VZ1kSUwE =Cb̄wW^'//e:f_֭7$&S) Nvϗgߞ?ktPܫFw2˞CIeLo%?M}L7f<*ZTN°H5no>vj"^6٣+Eu0Dž(5|,ػqlwC_ +N`s4ofBWy0[KɃK<[gINp7Tt; |?9l0xU?L/A*ұSM ?Y!bW>,A&l^lI$m1.23M &eٶJ5T5EF"ICHj)CAbry)Кwy!&p{s.=Ffl9dfckM["1)&Hh9'%N}#CDT] 4|O4#nEgwN/>E&ieDY(+9MkXHǦeW^\6-'(N/ő)Yg bٽAwS]wS"u%fݽ,{Y@ W<r;6ׯFM>v!P$Voh@2Pᔔ @io\,EwJ,P?2‰I-{dtU_͢<;#pοJ|Y16X.:ɧϘMULܵ\WrB׋aj斛`*)3̞yӇ9L<2˞+Y4oG k> `Yrn45[QjT/|5qG 1K֎ Dq6ӛљƱyp,c'N 0eAy"bb.Z )h~@INQ}DNƔn=y&-$@S@ vc Vd̘`Ke7fFC=9_Qt KgR1sfgǙԜ3^^fWL\aD`VQp_D<֞DD^7bg!dkZr\Vt^ޞI`1zNɳB'.,gP-OpO ok8mAu;d,b"ei$B3G˧Om>KuM(_ |\עmsWb1Sx ,&`EYF] wN-Rʱ}lu)J wÖyuf/ѯd:߁ert7?>8|F]o5M1s0aeփ.3R5$lL$~+9#75lOks>bm'ږ%X TƘe"jw6GOlQ4(B,>L*luw :h2> HlM|`@lmh60'UAZ߰"qa&YF̆m#( %N,>wY9m+[q~Q9(c*'2o59NJw?4h?>zܞ{}"D.o%,WxӋR§} "g>tCE W=K 2-JWoo-Z D0xlQTOn 炼iʼn-z~Ea '9  {IU{ ݶ. Co8q5'BFݶ)ol0tC_D6_xc/jާxI$雷_H]rS?'-9*0VUgOa+in=5]Tf1{y,M?sa<}ŐTyӚ?MiMQ5Eyr}#hYbOc\~seo/,,wyӚۃ_\j Nߚ'Yaendstream endobj 134 0 obj << /Filter /FlateDecode /Length 5400 >> stream x ߝ<_ɏDNޝHi?Y/ <={}Jlͩn==:y>J͛Yj7]Y0B~Z-5D' vS2ftIm!8[U gXnOy3Ry at|0&Coo+rӖ^ H~J0 y_,mg'^dm<]k>noWkF3E xhfP/Ppc:GܡP!^{^~!gTt@ !19CGA#Dr g%^Іv{@:BMO׸yJH@.>%ҡ'w<וWJG r *!dSWDӃP0,pw24YiKId\3"@#]`\)sRl) OKldE4qV%Tsmja {ko{:ia# .RnjY YPiLEAtI?[`K&^K,h *D|ytoLknD sUp-oF fgq}q תwg?ў4!9haBLq.TZ˲WmYZƏVS"o 09a(şamdTӼZt0%;-i\%"ӻJ R0laN{[bnP cB''fHjc m4f(HD1JP 0!*Coh,ɒ9ZE; ]IB;̡)0r.cL\.%3xQ㸋wF&L/2o,z,y1S|CQ'AQh73KjC)6N'yP}]^ "bЯ\lXɍnpDJ] jG=PF)EZX)nxB$C[I$*'L+*`="{ q y"m!nOƌ5_u9 Ⱦ6Wѭ0U%1(W{*mvl9GBE&,d5o#<, _ץ`f#{W_$}bm Ux.߀x^|m|]OW$[@ݫ\)ЁI!3!۶F5ɊS8QD4uȥ|A!CBA!I{2 իzߎHQI AZMnK$1c0ڌI E`Y+<&Q=Z2|S_M:Qֵdʮxq` |"-N[x,Z$4zQ,ۺ=./K%kQap3XvnsxP\oZbSx9/U+Hl:6w{P)w(y{2(]`1;.LyUֱ(їI dב,> Bƃ+zE)lV>MK}RbF-յ0 I*Ʃ4̘-y]yc0IELLaK*׃(W]`xjD"Y:^rS{'ى]#^GheX=ԟ$vӛ宸. @ {vu2)IP N |jqZ -Z?@T(LVuț;R|x+X `|Iek\MB1˲MkG|:_U?qUDN0ZfcF:dM>A>(<V,M%} v 1i#]m@ź`\.#j O|ݰ F}L5q\pAFp6ÓWJ!hp1Dv͘ʺTu ؋\_wy ˪_7,|HJ3m;j",׈Z\G۝ 1ƛAcϔWbG?uɚ uS}+ep#VƍNּ"ǹ9qI{J|wmxX-{"5us3߬J`BF=8ߨ@zh/zB\g^d0w7xI[]!, bx+-1@w)xn8 ώ"VVh]Jޢ@,QZJ2Ă@yWOzeczc&[{F3.<4]eAIT4QjxJAvgNA م.(rSz_=>WܛJ., *Vm6 64AM҂-2/f^J6u64bN5YChk&Sτ:O{pۧj!bj@lh `lw_ms+Jq1dX2$r(߰jixt򶋩(T}.Nj0줏 &d{J06gCi*4P^ 9my./$Y$rya)AU iBͣ^wMrX1X壓-DGIu;Hn8zhW#*<^>>P ^-MF&w KE߷va"i4Հ|OpGSҊ-H ܎Q`EMS4!Pkw0Ԕ{[e3iIriu eK͠\51d8[qearCތ` C% 8ol\L;lc''"KtjP>ЩwE 9/9ּ_q(;r'-y/ 6bGZ4:#us훦 48o?'Kjи0 /YMr8b`7fI?o;Ru|.Cɺ@B9ɛawM#;ȣBGv#;e,$GFhQ[r|2N/nڽ5XI>oyLKn{ C}G WWUى*z)ޚay6qAckT%J*出~vQ8G˒3NKnRe3{o1hHFYG2Tg 4{m֡$8{FKe% swkk'KӋ=/N>8u!-VґHچcS_t~TAhdՠy.Uxҙ X,m=(o\oK9oCm} ?޸+*\ KMq18> #:עL PD9) )>6;CS8\b`>KZȱC ^zԍUџD_T*xڶ0ǐuoxm{jLƄǚ햩*Ai|.> stream xisO >9BH (bSlkh-|_;z_ffCbZׯ}u뇕J/oL~8U Yexq[(V>[9{rmB˵F+Rw>Vs DR ` cNwh9F#*w$uJQcr-, {àY-aSʥn);$VOk݆P&Y_R(őķr$ۋ@Iz(Yߝ}tq%x˫_YoRʧ+WW߬gW*g^it Wa1w޳g#]V;[}rG{ 4N.s}tB"7V]DOɀFq hI٤ ; 87="@ޓi;e'=j Z{'!rnڠ緓*)ҹ'ȜIR4a΋!ƬP!ޣ.?-.}ȍ9/?(~s^BPk||&ђcIk<]J@>ZiG &&[rllx1ֻ٭&&؄y Xb`ĖN܄y Z+u9u+k05s[W ۑ@GMaƺx @1DV.?TEJ5eǁ#;/܆E'@EJ5 &8GE)/?dWCWEucz+WwX(.u}JsC:?BһL}Ku^ڄ׈#-P!l.b=%߽cߣ3qďثݲa#5@s`uJVϛɉe!F$Abs$kY!9ykh[֔0yk1d{@> ) $dN6!Zw$Xa!x'$5ľ7U-!N7okN&8Oy<:!YKI8u?+nLً0NC4h c?=fh9~{Y\=CbΐN,pq^ChHv2hh-aLEt1j/A1=vH`hiBQg㊇@.'HPmM"l2\7ch}^ &BRi6=JJאTpTmniiu4KPU~N &J2ؐjv Y) lR#q H$0_oOyVt8dV 1ز*Y znh2 K4q/i1ւ@m@2rWdÎr328\kY U3dmԼmS(i 69Ԧ-5`mtPg4~y{Gj0٢.b`%_O;Q`R,g)cjzd=ĕrg( PR0\`M_b6^XAY[kÁ=Ne\cֳ eE^3LY mAr-cO(eA]Xh3H,3arG j=< +Gl[㡕Ѣ536 NK"b,&yӶ()8ļ[kI,7PB=Kǎ&usds5tdE}t8:X4A Tuak'%Pč:bB6J&nAX.<Y ApA6i8Wk CB0#RYnM]mKz^']]^NMn=hSPR~6P 'UO0MX>Y}1pg0VH=u_%IuLJMh'VZ?a]~]|0)|X_aC(~^u쓺˻Id۷;$,Uea&v{xH5ob/s#e- RPw툁6ډ"Wk ڒO8f›eT!;؇rhD4k*Vz^sB,/5z˟ y+j D׾;ll]*a);ɒVOi7f8-Y릀,8H馤ɜ{@pR4#w멪5uUW q8v~ ёf9u J7^=g IOؑs6#4pB0{ K:ˉPF}DaW؇<čY,Lq4eߔe"b[!4pjYqP:ܟ3@?4y9LbN"NtZ.w1=~=B/(vcSɇܭ`Q8 '0y',rޢi>]:,T Y- QCPpB`&R@A-B-yͷ4y8 n ?/}V d\AM{I྽5v]zJc8@ݓ'(x ɈQ@GvnuN%yZctH g@ `wy8o#) p\ \ Sd"Jߍ$ :kyq!Gl |C [:Y,(׍t'^mD=QUG;#"#՜&9,Fޑ{NZldHדYٶ..Ԏe]իe]?9R^MnVL$ŒL?y:͒@۩!ٴl'87$Vٝm.Pi?$fz~rdlU-x[Kcs Tc +m_+/μliڰ=Ú]ƽy*p09{O,=={%$%YAЉ`"yXgrvBCAP݋LG4h&k~׽ҵ9|qqsֹqW$| EN68OQ6E="t#YO: 0!/ys;i uv |jG1xMbjW"KsALG`Y{Ngqz\f&,u!Cd`>Mt9~%7hԜb0It$LR%i6KW X/m;1~Mu!1D4{|R\WpT}APQFF3qD0:AچAFzX"˳ Άendstream endobj 136 0 obj << /Filter /FlateDecode /Length 5443 >> stream x\o$u $q4! 2`K-X2YrDrW=$w%C@Ş:^ՠ+^}#u|~_ǟ@ɐU'ϏU}qq\Z| i:0ᅓWy9VojfWssJaN) (:[o>ֵԭ6qp 'uJ4z/*Ugd}XyJzlHs䷸> Aq_`Sܹ% sZ=!e~My\fvx4ÊoضO6v7kui#:e (w%X($Hf|W9)OS9Em{=nx[O dC9X-z  Y j#8MQڣ4":ԗEONfy,#8#gRuڔi89mZte{|:ؖHØA40rfY=3_)^)$6rqekQkxJv.8\ Fr~N9(HHeaR)UNz'тb `05 4F[duqg&#B\G^7.8Ød<tQаf-Q.KA _::@p)'A6X8z^%ٍh`䴺"JdfȤ0'i*Ĵ9$BM.Hi@}Zy{3{>: _;; S $.DFK *̔Q8 ~BRidFf^VĬ/V("(J\٤ZMe\-iu-L7BrpY&&|N6̰_7\zV/SPEacBle_6|U<\& 4 I)^/kum>yڼڼoVk;(E36.vеi`_&Dc߬k[͟xoU۾6UwNM2Mk n_pPTmM>1xDeP qC~ hE"qŤ݀ԚWA"A-4@4D(}qVHQZ#9zphX-" 9}@2`1Vf#iPM8c_H{%b AȝlS-@iMY nFQeGϼb{k8S1YG`qn6ulVVV%Z>XZ5Ż6xG*4IfQŤ( &D%N?| \Dƚ ěrsHYݭGM=o7 %M }iɴ{^!ވoX &"j)CSzPʐ@,RhqJqVmFBdOVC.h}按|:u}6&Ql`HR|SerHR֋e?cxR] ew^b[ς{/ ] >(]ahq&=Y@Oq"4Dq#Z3N楆(+]c?6$pܜi`4cHeӽMZ@5@yJ횉6hhT  | *ݧw}am^wڼ]wN 󣓟-sb CmYy6iʷr)tS*kGuf'po33f?`*)wY*AyϻDvC$M'NOӃs8qڼ,/j@lb~C֟b>H6EwCr`;F.oߞ-L*& ;ˍ`g}B3B;ĸ/<#2(R"T-mc}.VE} DT]_>`ޢazgUiO1K71y)LwHYy,8mQ @Mx[9M%J7˖I0|`x:}΢G3@ q&ܛWWVNF3*hP?-펶om l-LHN R>LkݛIw>oa#~X0KJE `w*[+UbRTD=e:5eaJQi=qأS(y)]MYըAGf&\2h&}8d K<?BndՄ}%,ۑ,aKT{F_aAMY:г7;3/]$83kwp2Dy{JCVp+ Nw:P}cᾏ)QKq v*`}zrȑ?YoQR =/Loݫ*J$-hop-R '3-.>kr(T2-NpKԿ;Y*7E/Ž C*TྖPi3~FBpY%p|^` )TTbI۩bKR)fȠԛ32!Ϧy< ߲sԄ!kᄀ>Wxj͗@ʲKIۭ0w B\? ֛=U] pkђRx8btGz.Jqq8eo\P8TE?źŜ=YMn4tGZZ h*ye*6^i<ђtU,)fA]Re|/ .XT3bfά-1ՑK,YRV wz͸k=W)n,)V^#,En ng JsdmVYh! !zGA?Ϡ*bR\&- 4Lr3DCBq)"L|D{O/>M0\hEiMSfk]rezVup#4NSSnbf33&*QU02*'1 $Y$;KU^jO`)o ]&Qe% 4Y.}DU+ XH[\αkۛ]XT]";e B #tMRR(<~UWYSPCw$q084F_EJeNRx٢||Y sЅz2-Ep+4CQ-η 68 =PLv'Idv|R>dV~}A ,xR# ~lK_ j>mѺ'6R`1F78vV 0Im S)0_z .=_0I1Z A׀.6XeU'ko0Dc;KʊGA\qLe~xqG;|l E90>N(A#F`KA0Z[%k{^ſ{fThs+ ۡ*ĕ`Dk9M@* ?U'Sb)Pǣ)endstream endobj 137 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4434 >> stream xX TTW}eA"D8šM((8T!$S!SաPfEdA( $tb~!vhy%k[@Mzz{뜽甌1d2eqM:Hdn;r ^]JVfεBmO\݋dANA["C|}oa7nʔI;:NQh P?m >',lԱc#""ƨBx0b]oRPsP`"U])(`KxWKWH 0cg rڲfVps蜰Ԫ #7xz-g2?S3nk,f3f >3Y,c1˙ fɸ13̻f383f3c&0Bƅ,b05ӓaz3}dGSƌeɖȪV ffyyB0($v {`reQw{X/FY=Qg-ZӪg}/^+flV؄ۜ=}vJƇ`@G4H&7NivBh#IZAE*tA (|l5gNbyhRQ{ uP @Y,/m# dhR/C9p=Al8I9|+hLO0W2S$לl:їEv˅š #4̏XjPƙyc{)+~BEVp^W+{Fʠ!2w劲!P p]Q<Œמ&4RDz.dӪJeI? K?`r؇ʃ]ɕ$ZhOWĒ8FETioK ˄A*T`J@,<G(R=Du08d3hI\Ek?^z#p[G <(7>nU(&:H+M}TϣFOuY'Odu0iћ[×M_RlCf={=1gv&nHCL_v}jU\A&n+qD*7* u”88o@sfTTPɎ"Xq}a؈*̄ X8f!=F8I/U+r!_QIRRcSn.w J˓I;HPq8z½"m6Ԑ& :[$(< VڞG=j|3V,] 'CtBZtŐ^*Z䨸 Mc*-ePjo #d7V^@-]/x oc2ʜ5\ZFUM(촀Xqˁ/߄o BT07.P/Jf^|8  o0P5 ;2kL̔l 4j;9k:ardRdg:hv$'jA' Cx1?mPifM;gqVMV]r),]v$=zDFa*J<ŷu#u6\9zzY+ϔ/six!˕ih1~iP?{`S=WHgsuZM %Gg9ᄡ37?lzz~tv7Dá~|"3"ԕͪoKy S̃IdHDlJU[]#3ȱ/O| ~96&Gػg.5 ќzV)=ԑjcg* 9ⶭ>(K7oMr ŹwK*B `K6@r23ˬv'n8OwƵh7%}yȧ==j]&"zJ_sM8В3 I8@ }Jy.򣢵 Z1cyB G+xy lT{bu8 7Ú5Ni"#=xnnғt"Jm}1V_QQTsxڽoI039`x>LcjcNuh߯wt d]"Χg|&q}+@uLIp/M\<}OіK= [Z1y:@6wTRKMiA-҃pRډ}/RK!&11(6WyzzyU62̣E*_….ݸHLJ{71SZ/I{f}ג~B]]#.61U/(ׄIKڵ{v&= {)QUR=M b%:$}['ɦeٻήm/=C"+L9C=6f_5{&Zg0,N۟шd>q00%NٽyKa?3Z.ѭͰ;gi;Sc7wb`Ͽy}dF#gޙs_ ԬgI <&OT>_3ӌ/*]C+~kr ~9O6t~ˍj"Gϥ1#뎳dy"Nj8o#-cP'ppg#WhOM1mU*AKƑ\{ l_D.֑wX)hж ;}hGNtKHQd*꪿2?^iGZ}A-|+ QUw G,GNW:y(E@")#mIMWGm>uޥ# v_QKq UP5VxUc8 -+|r:ODb6u*/Y)46\ s@@:?17X㥉FhS4I)ܶ s_ LD0Dxa Aut d͗_-'[5 5B@|N"ꬭeNL䚍rd]&kDYwlREMJzYY3.endstream endobj 138 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8132 >> stream xy TSJz+uu<+$Sd0$"A0 UЪuZNjZ[[=n^V{9{Q]P"H2gc]XJٖd=гށ3}QMo%ÒG w1qԩG93fn}<k=`)S ÆoI9wcF:fl&ԃQ+Jj5ZEOMޡPC0j5ZO6P(j5zLͥFS[y{|j K-QbjH-&Q˨rj eO9P@JBqT.P;nTwj:LP@ʖ zS}YT_ʎRSR ޤ"~ZR<+~w_vku6g$S$i59\6z4 {jz}K}=iwI7WI?~9xw:πN{KּqӹOdNYs(N.NqNYNUN~dЙv.2cH ߾Сʶ- h_dմږ25{g#vwi ͱPS^Ɏ~6$4@0O/>8G4Mj(ze)jlsYdo`Ėo3o$7ڡ.~è zrzi[t׺B/WN^8n5 4{`+5xAc'?-=|9;e̶m#E#oCIywae5siݤK6ObٷIӲK཯\{ [^AK_xpa@ rxo^|2|}%ZD+F/a-R1FQ]箘C,zcK E/f^?ά+ =gÉC47!8(ttU ްN" KDfw_c~^W{hVB${2>M)Sq9^>Jd8sf[5lպJ![Qwx^m?\zPpU~ZG۶ymN>BMONX&h9!&LpxT,f9޸Ȥ?VaY$z8ctq*2H@"- M7 'xcWVތFyPKn?S!ߓH!2d)]d;>۫mUnhQ:#iݗX$#*>n.rFXFWn7y@,``ly{̢K&~Ijf呯b%Dpk% ,1I͞;h Ylݡ(@Pnd $cYx0xĶ-}^L\6;ډ.4qhZVh,)oݑg39$o{peDX{sDUx9a0 }βx!JN{>w? }Rp࠱#;$ vfF=.߽vizg̨v |6H$Foq^4Dz֘U a6x̘}HNUIO&Rd؞ @WZv`>$|kgeE^tQ:NC$)2OB!!S%&#>W)D6ĵwDVIwDRLB=";:BOWY\(Ee|9J^ԒNԄClE[;e&/"!Ixg㮨FY@s\5pmW!]Y`dK-HI%.[*l1sA,+@ئ.[1FNs쇡|СwY5PQعjs3yYq(dH'Lú4Xq U~jO( ¿ @o;10h33V>ѮƖh򥫤Gd=v5S~dzURv8C44~7of|EʪRCe~jVlwNEKߨZ L{z#\#eL Gٱm{ݱ*OfB4+;xQyjaA ݨ $ILLNq=@94b]3r!!`;iļZsp:ؙpHhBk1y5vϾ}G+*X4!uVX㉏IOU.a?$e:@QQrf:v6Zˠ4[VTRgVB54+}ZO)"0Vמˡي`aJأ=3_3(]x5c!?`#jYfbe!|fnfGË6]i%D9gsL1S,r yO~]>³]K"pNOu +C) JYka<6Tx;wVBw\YC8SiT"7c=^N➘Oh[yE[ " urk}̚h2$jԩ `=#cZ:8kX }Јv}j|2^6hH";l#3mM8uWS$8 L8 hWMsk8w2♐҈JCɞg}S'}qk377TDj.p/`Dar+m8dT1xk/yeL;Z8@n_]23^@4mW$jn%>?d&! ФD3$`0Lvm6'O< 8|8Qg\րS"^I PCC\)K p.!Autv4 ;|n,cvӎ؟w\'6|i~q-EiYײ[_ t_N3 w?^> 4xK&WN>#(zPs??(t]g]fPr)8gHNN38Ic+\U{H4Gk0ʓdQ_7dvH2s9oQE=srhɅj՛PCmnʶ#IM,E#2W] g&v@ _r@3!? (+u<2B4(--VWBD//_&J-jFDyN_SrN$Ui?ѕs[^rEFl!B(k[gЯu\g PamNʶm†՟k;ΈYq`c`+jcpN@syc (ٖ2Sv }^-/o=x]9PHc?O~Id%z6cɬd2C/n#Z}mOTpHHIp}Z.KƈHo|`?C#(:m q%qQE2;-~+k$MUQa+Ō2C/|ԅBCӡp>aLP7 ʴuGTw43㒹$M @"#m H7b_Ϥp]I+˅ S}ë\(qՉ@i̝Ϟ ;YfCan&,:V R,]&KHwDK'a#Zz^>IC&~ [;".Q4jF k8N/(JMOULvtw%ֿfc}5яNaIE.l-xH^8v6. XL|F19{_ Lf>KQ yvҳpSzE6+P&LKS@]%a)<'^x.ISe>I?ZP|${B-ըF(FX6x5i#~XZHgϞ<#lEDe@\dW1TVphݛUrcP@DHX!dOXuB7DzhcCw!쑬xw>/]RFHF;xܞpVA [_kWO6{l"Ki% ڪN Ye/bq~fv.h%A]eJ%Un!u(͠M}KI 7[i#mίНPf,F,%yk9!KJIʎ-Q=HǷ%-ޒآhiQ*j=KW GFib> e49mV?- VD|3 X7.-1Q6;5 DEs ssBx/I+NcQ.ʾ+]Unnf:އyp}Y~軚K7Uv;4E}8OsLP ʆ宁%Vl4 ̇MQsl¹eK3\ldbkjV}0y]|@̯^kfTÏAj5+]> stream xV{PT+"h㭠I0/Dc|Ql@%cy KAy{C^*  Jl43Sڦe8jM:K&ܙ;;GD"Ho ~_¿*|+n!WR( OE"$PNIJVƿ)ۼy*u62X,4VȈ ?pU|B/[-Yܲvmnn :gohe:G R) ssk@UFfVj%A LFHOK >"OD$XE;5."x@!B-'\bJ,¸ |-?p=]?K"$MY<+CK8>,7%ņ|ȇ"(3Ͻ+ XRBPr`7%ogz]h0MuR!KޑKl0VmЏq+NjH6!Cwq=,<Oɰ_HKZH;Ar0jVrB ]=cgpgF6QE +VQZb> h1^'[+{jCDP_j1Fz XuiuG@) $4 Yvф(RhZ/vI.hO ܿz #v-T&JH,AVKj?Lwu ={aY1DN byQʡO# %כj0|ԑX/o>ae8/Y>E$S,g֫N* W/;ܙxBڛ6Xz^:vB@%w(Sy5r<(i5Bc S]udW]5^o6IS-Iq'po8;Ycd J3PP}N܎(C͢H2ʼn!~qx KM*,yJ $1yu2ܐGǒp,ɷW9Kל1ՌőjUC r}X缅Ln79 g@DSEwHbfN}V t@UCAG˭(voZPFt~p {EzΞKͬi:i$Ë`9ΓíL|\\l,2H&hV K~Mo Vi/"xxN xȉ/VЮNSgÑ46$0 :u/CFpdeOfbm)we5R|RS+au`uZ0KN9 #k_"pr9µi=+DZ(* 3EZs NY 4T )DH4sMh&]dpG .)-:Zjvoa^lP6*JD%SIޖo˷0B4qK^w*x|ЂW4ْsL Q der \d0#z3r1&0@H>^u|PT݈_xf>[-OS>pq)]A>3is}x߶#E[SW4D!5nZ6)OKfڤDU@`QO- k`=}*tGab_oD/[[⨾Bٻ?'^؏+W&DN tpᱱ3*aѤ׊8C!31>猿2 #.]Zc:S(kd [qJv/!:{Nэde ٳQ:u+~M?+rͻL{UUr*I9(HqkՌZ<H1z=oj[:GtMQա >RKr˸n2{̱zx cÓ kendstream endobj 140 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 329 >> stream xcd`ab`dddw 641H3a!O/nn߷}O=J19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMU8OB9)槤1000103012)ٽgf|;?̿ܥ;~3>,}} |g|Waq6;7<_s/wt\7Xp9|zaendstream endobj 141 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 996 >> stream xRLgށ2cʶ A26"Ri +A@Wxv8PfXPX@6Mōl+dB;*Y}~>yy/L ;gq[, M/Femlo= UJg T-ӥYfVn[|=oz^TrF|996IoNڎeky#[UsͱZx@oГm5W9o-leџ,7LA \TbӈBĒ[IP n8rIS>_]-0m*&j|aK 1Q7?\jZfja}4ݫ}M>l~lY^&4<^ԥem{|}O_:bFg蹹tMU ܩ}`_˥0.Í[u5eQ79NL2|;8Es1*q^^x7}A@ iT, LD B}^VlB̦#:u& v8捉Eho)Cձ6kYIfkqv2t\ݐ. =Nw_IZ7}r4 m CjVIy4$p~kTǍOpaD@mwF6?: 3nՈRo ,K_3q^"YWGr*'O;w: y^9M2뫁~ I|o=ZmmdJ oVkAV ~E9-c4)Ɯ?|c$#u\y [[ aQuz!7=-)3t)G[z NdF]RY#H[FO[Qk GmspLs&-(T5b[($}7ZD+#}.rWXendstream endobj 142 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6391 >> stream xy TS1׋R章^*-T<<+ "@ )$$B HTk}mUU:NϞ$A{ok)ܛ}o#v!x<^UWn0a0n0҅{\ kf-`DodiDq#B&L>mt㧇KGG%$F !1⬐3eddJL+1:$#^.&5F'd0I:*1&cg019M# Y%#J"bټ- ,-N]"N["sʬU=c[~߆>tWgΚ=|Qw1n|I9L%D81%k׈uDFl MHb3O& 16b!1N,"%b)D,'&+)Jb*XMD &CDѝI/D/b.ћC ]D"@b9ѕ x']ft9ȟ/Z- zrynjw@`{`wc>=b{<\/鹦gk/7h<[o@?]!oEb8g`ZМ ]#4h +~oIO a#(ee @S*~)dQ &I ?.SAqC ~? r@^^A( xk|p?cH{>"=A訾Tq`t^ EL`NnA,MT'5Ծu P'3u9:a_t7dW}aFa`&9l(-< BރE@pGh Ey$GJ7. ~p~T&? W;ٟoSm2Aj![3XƾFnGG0]_&3.]axw*}[9#аcPz#Q.=a 9I/p>zs1C'(\\]7鋀*-ː)BΏ?YPh,zFs/a/MeORfMFQ@MW8;vij`zOD".oNQK@` so_3%3e{ IO180U 34C/Ee~Pm^ %'SdB"HiԇE}Vߓ_(DC');Ew v&6,ݯE3r{8QOĿ3gWq(VɇU‘$[̝'=vʥ*b͆B/#\<p+dJP6KLů+vlTO"4l!5i{J*(o6֘5iϧyKǒl9c(uB DTT( PU'K\®MsS",+ϟ}t *GY@>jJ5j;v<i8Tg-PQI`1xw_+.`` @ c1KnBI>oKs\|n)7qnR\iQL&q6{"\Ii(l֒ FЖ'DSn|JbWV V3oA~|HFCb5)4ϲmTMIH~O]r  CHY+b4_xNr.}О„&kwIҭfjې ! G=~m|=2ZafF8*e^R5+hZ"а;XUstzNՀ6`UZovgZO;jI0GphY~R =N0W=H˃g\^NUԌlBuV`x~$8rϳfׁhhU4vǞZuTig͍FsF~r7{'>N@y4j oc ]0PGNSvܫE2`ʕIxMc.}^#|<_Lȣ˔e4*[Ɉc"vj:.>5Z=$ ձ`;Z6:೏b89m,,5Rzr$@!!>ol2443H#i,ґ"aHY%ـ @'Nx2&XWo)737a\[(K9YŠ LyjUN܊OR(l6_0x?ܼ õ6XL5'1sgJn&m~$jH _\RGD2])cPotfu: PRP>ڪz6}7 󶳲鋖[z8P?S@NPXU7HCo5U5V`Tyйy@23"Z`vUdB}޳1%Lꔇ+]P3~4Ұ7 >].¢ p~^3qO|԰"ze0v.yw+;T_D<HU#kW4K_=U9lcX7y6@9 u⨂l#޲PM8.֞`Pb>U \H[F]^hi';N^:uֆfЏCF \Ç`עDzxc1NG#Hխ/jE~R}xUu}M$`вwn}uG@cPsL;rZ?R)HrkZt@)M 6s5՚@)O C{RHJ/XA~Ѻ%j㺥#CgsøtmS RMuuM @~80]xӛ{-|c@>׭=S%/0@2 =Xw=yZau:ۘ\Avi3PL@q iVD &ˑ*xx(_BrJLSh]9HeHցԅ߁lZWduz7LM4v01FsFӄʍF=V)4K!8 ǟ":7ϫ+:35S$%o0UXr4%wE |ND׆m:X6m x"W @\%v?!1h e=?wm<LJJ-J!knS\_6@YtJO(d7l7B`<~wBȏ/MzU] hd%G3;1uVkMG%$Bno6ڍL;;\ VKEh03[,_󣱆pC N:y tw!>}y,EZtuAF|cƏIj'a룳ͬg5ӫswwTi12e^6RY⦷ oWv8feMJy:Y#IQ3Z&S_-ꖱ 0]=H4 .bz3 FCY #>͞ N`}%S lzSEϘ Vc5RWG ʨ2z% xR eGM1X֬۸Pq\6m-,JʙU*QisEe*@ Jf5ܗ=CZ8ToƊ\!LO,H2"4JrwڀCT4&* e9MV n{P><$*.S2(yIM"Sb֧ݸ?Ch}ތU̖ 0*@k;xp\uޖu;ؗ\}aw62nOq5o\ ^T{*۞/gn|F%U6k!\=߹皸4W@khZPЕW~/p`P9^`W7OFE<<(]M5E kJ-ёaR6Ф+`H Օݡ䰪80P~َ ԫDX="[z/VpPҐ\qMCYn+nn -V<]Ph*.] )Ep{Yt`7nvJ.[~m{Rw|A}?^D]W%GMUeScg\G; L`WMREAo<$+@%(5X bϟSdi`Ar/Y"8-CP4Oب+dut hV&xU Hi OʍTi)ZFjU{-Vc/U7 ηZ ,:!dn*>)S1U/ 56 l5u;ϛ=L25l(Oz{ ?|N* @6.ג_RS[d+(zPkP%IJIb&'jk2'g Nyp>|ZtiNUVn:_HAPY$Ux fUZ &T[-JVyR@2pqE#,O'/qmm`!G, zJ@v'2 e~+d#WJɵgy,lq).ޭoa-N5~R:U\$*WMI-h0ߺdnTG ~RZv+e5II|> MPmT'/?N|r=} 8trU&{1%.jp֗BN:4`78G ߘ|NBdIo:d> stream xcd`ab`dddu 21T~H3a!cO]nn?G ~(Ș[_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*\"s JKR|SR Ab?M?o>҇]ޝ+ڝ͑¾lzٳTR> 7Qޔ=c<ȨߟgxwS?0X_4ѳժ?wk=9jʕ[u_.oߢfZ-Y1wºrxa[+'Woߍss$-<{ ~'Ncu[|>I<<20Fhendstream endobj 144 0 obj << /Filter /FlateDecode /Length 2509 >> stream xZMo$O#x:d0|rsHZ }J*6Xhz|$*VԤ_~8oE{5"C7E?ۉ;y _H8 ZhaȦr|€ns9JwMb ,ID&0>H\G:ɞc͸Č 2 f=pCHǤ#1gv>:9jAXFx)A}*/qhL8ZXCY(U,-.'[ʲmT%pyIr,7R"QdJBZSd\BH!%ws )M.F%5I!|y.UNDسrӧ dfZ?4-͚|lўgRsRJ|)PSW0MPm$lîf((Mɴ9|Uŧny&il7})Qm>飖,xMQm.F-.WT6 `֟&y#ryY4YɃxMw0ALL9O2}ЧrA~SHT}h݉j |ZM6,+TVCYkW+|(PT͎7$1oiJdR2K 9:ziJ-$[Ite 뮟ňg˅h*F.EȦL%RZBږj$]<1Eu@6KTIJ!jo ڌ}P-PȞ RD_(Jc#ӝPX;ε=͎7DBĕr.Ӧ>RTTu3)_MѦ` ,>m>hHY}]*)Y}}l4Κŧ}LRV=,Z}ЧH*yLO% J~V&P bY}ЫYxxe9 @&ZUSA)z ڞgp TȽs XzX<˰*|\_Tt#m/'\}*/\NZլqO7R:1υ[U"HҍqUꏵJWލXf||Hf W8y:!ᖆe*R8u-TP82sfÅRsU;vB-֨~KtTlĠ <b,^Oղc>Di0%Ln/be>cN2h)Tڰ9;.5Px/.V{>_%$%R^4oէE!3~T\oaߧm,׵g3+%o0d+V^)+kRʒH6ıpeV lQV-|VE'yȬAvj:iXv@+-yV/8c-/:i؊Ѡendstream endobj 145 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2934 >> stream xW tSU~!%8yQ(#[PV m&t_4FK mR( PAGQ#3}v- x$9ɽEA E Ǐy;\VȏP_@%<>`2 B EqdI&yvܸI!tC"1(=6*!mlRjK#GcBt[uBf'%CE%Bzэ} OJH6u!ItE 8#)|uj~!jtKbbF'0j 5ZNLER# j45IfQQ)5LBPՊ9>pFF{͈dk<WSǩ-2Vy5Vl\ba6nou 2DŤ(FV 5pVhsLK S w/lYZ&>tpP/RB*fpJ;@v*l1B^rNЗlm<:UaK6Ex[gZcE`)w4B#v@sT,ppEp>reG =5krR.!4drz ݻRsqu챑Srj+ghO!wVQ-#jGXh~dOl|, i Rܽ}=%_x3Wj-j_y^4s36)jpnZ8S|A<Ϋ8}X)")_SI 8 bQ zZ˰MPw>7#VڕfL◽S gNxA+M"#fE R䲚 8 ęx@}Gntm SjlL֒=}ů,"gǁ'Ѽ @S>Gp0(\Ci9X np@1:`OSFf{aʬ^FUC?BoF 5.3FJa^-הH>g+`)SѦޞ#K,|&ZuvtЈ4^頣LlT*s2|rp'o ҙKyC}MKkrݦWLӪemW~Zq8Z~\)rq']fy9|`ҴnX&ۡo20·ELl_^RZ\`3xh`쌥^䒤ZUQr5vj {#!KlIqE-Y^G _V_qyBZS,ܕN9pMQ 5b+-h!)uyC鵸$ 4-|U*&Ο!楘stD4IRaoNߡﲮ²KxiҾ14&h'!gK-[5&Ù*|ދL.c[h~:Ѷ8!2h =L;?">]w^:%T@*Wu JI^b(@(^Ok,ۊ[+ׯす!vTjDhCΪ3. fo߮RVs'.I(l ["g=Z4ɫ81~ Ӭ=ś y9,Ғ#rZ8s/*53$DY 0Z֬2Z"<'E<ɊX楯_?tX;ucmɚ ۴rؽ]-ۜ}(ȣ |~E6^W[,ҡuR4d>!"!ekJ#&f曭\7@̢hAA2sŮ -ʱ As^j~Q)FWݿ|]W2ǰ-x Ld!_}4 ? /W\RЀھՠ8ׅo*!JL M{ o12`+ӾFC@K-Y-smY vDcw*:fNv?D)x't4ڧAs`t^xG݋$>Ul8^(!Ž!$=3a,M)K\:HGu_>W9-ҫF 1^y%6xڭwND8' !8Og:q3.@Cn~g5~UlWjR9u;^V.*\FE@lgxT;7 XE+AAtePd2 vMjhXa䵹͈jqiֲ[끹# ŞL-qG#z_+QzESh4=z 22暼 GUsX&nĹ1vw'F.tuVf.NZp~4ul]V]BR\ZtbmV٧27 'AZz CO6]"<Rzr )&I>E谕gˊ: y$/(ב kLyz?rYNl#%'}{Zh^ ʻՅ7ϯMS2B>kN!!vhw֬\w!ͽ6TDᨰ؛);S@a+֥hf9='EA=xy%E*n%ZP]xy. μ%flKii*Zܩ؏#Uq b(m}}/ P[HQendstream endobj 146 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 331 >> stream xcd`ab`ddp 44H3a!3kc7s7{' ~O+XP_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*@ݧs JKR|SRYBt^}ω33G[7]z}r[~kb}vEly~_d}{O!lYwVWG g/d4mn9.<'yx\Qxendstream endobj 147 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4894 >> stream xX TS־!*8NUXCL $@ ddLdJq85VqhkZ_m j^VsD"tIG ׭`يu.AX5DrU\yFtmɎ3;L49W'G$`JØYJeĉjzOHoJ_E&Pb_&X>CTJ_|"Ρ+]a+" UjEQ47{̘&O;m:EI}L9RoQPKQoS˩JʅORyj>ZHRS)7jN-Qp5P}7(՟@͡R(;JF !Pjq4eMibDϭfX5mvQ]?hNj`F3{O]]8[߈~ :`ց( r:r;A$˪d38j]V~7{BE3h(pMܫF(%~/ tHRSRP,RJgtYoP#?7 L+ߒQpH*ѥ5~Gl>e i *6M<ڍFG&4 } N`o\1TݻgS"bAbxoO>؉"Vovi^NuZ8 W@Tӹ3 ^b8߰ .6&ihWJ~5FI^a 'S5=.w57xDzuʼF27ִ8Aw, p:A29{q\]| 9IgF%:ZK,kF>TS{ eh_.nC q,X]<\iqji'H=S1jzҽL^?8ەO *; XxgeDS/٩lEb:< _p'lFx3D]#7iPb74}C3IM u' S0f1H($2D'ukT`O?>I5e^B-9Kv!BHE;_C*NyO%5]^yy}4c@8oj Z-?X>c*Ӈ=]ף5)pk:}+0AzT̜QT_\!}J;e7c 9XShYk]aѸN}7$hm賝u Yϓ.9{Ǘ;~t֥]z, 6Nk,e E!fh"Wm&ikT2Z,Q9Gc~`2βEWϜHa9 ΧNugNGIK :.9|ԁ?lrodv[^e+b\QX] vdU&oGLiea]eTòuygޜKxcU!Ñ"? }i`fѕ;\ɈO'Xi.u(eeemgcG,QW䣫 =g.$tIԩ-b8Ě撙]2rs6W!#j1 Fb`+Yd? r#ja~Ҳ7ףFyE$R!BʃJCjcsꋽ(h}H:9Z8+:AWM~7؁|]ZJ7{vܯWxxz=ҬkUrJ%Wjk+*j{8X?C;?OE#p0`"(.SI62H*:_P 9C׿ݲ>`cUXR^ބ6x:/ _ ^ʄ^eMkv-=a)!jG/_o'aV/>һ<6淹 #ٴz5 &v_d ZI:WP*kh9RYa4%T.ISB6ns&yY bd7P.BeFPAh6NGG8 a+Fwq ,31r;:Dc. *8!vL\>bxl;v֬pv fybnMmYNV}~9> G8Yf2>w/p]:l{l)6|82"KsTi utHPtlXMx_k&,Z7n:K<֛s)svaXPٿ ƀK>;c2Qb;ʊK2xE釻‹:30wG.*gPFYGQ`bhkf8s4ձmTAʎdD`ꓸ߂Bq0JZx+ ODv]u_t.oR<`G3jy×Xژ- [5HhK}VMzoT)vfdv"꒨M$-MPoFe:Οd7/Wl_m4ԋN łܒ 2mZM!1%k;r, EGM)h(faHh<P'0<}7 c`񵫗ƣ7>h*ykRR9+b#ӐQ=p$Q[ס$4t MMW=%p"};v<Qqw͵\ 'suS^Xgt|afpmS{ }\sK5 uz[q ţ~^!Z0HKآE(j=%~4i|vv.)(BMy<$.=Zo!l.݁_ʾ\mIL|JjJ2"ё7)?0v"x[wQ*N%r2uMÉ6x `D[v`" "kC: mjUrsrҳye#tܴRR= zskrƾ&FnhkkGQ Oendstream endobj 148 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1095 >> stream xO[u<9  MaMXB[ ޶۞'p-!D,3c0j\4jE3k{a89$'|?'_"H̫oj:\Q9N=Gvfu I ;|won-O"uzAթd=mEtEUUe1Jyy]QTmr-$g ,61{j .+3LrTg-*M*FIW^E;ݠ2FAo+j:Q&] %"^Qj5AD#uIb2lD61B:H+X$=tI@oHݎq+tZ,3 "![p@XFG6̪e4k8>_M|ުPb06G&Ip*cڻ&"H6 h}6Ϩ{."\虀h>Ԅv^yFx;ލ_^?~w_v5~qn@_lV 5<«ѫK“6YFo,{&a@+qѣj!ϬTO;;DIk_'bL\˸G頞Ӂm0Y0G8NQjBf-<_r`cJpܰBadfB_u<5 1g  eסԷx.̕ Ll48 t $dLfZT#85h5f>"T-7> stream xSCMMI8(sVM    ^[XnsCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMMI8.CMMI8Computer ModernpQV+N kc}xՋӋ #}[ҩ tg"%K;O[bmnvHgrt{lt^XĴtss{Z^fu mPqU[_\G{ْvCp`  7 רendstream endobj 150 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 355 >> stream x%KPsKIX.0!(CvȃЗ3f۳1/Atxc w"菐eD/ϗ P\šV9: 8*C6y(mSk5%R4*сV]TPY$E2ר[(+ ȊU^:)ֱvPU:e*rCjk  7!G7cԷXׅu֍-j&&ރ]E(~8vz(+3HL]!/b fw+dRӶe%v#0|y'̺ς0endstream endobj 151 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1366 >> stream xUTmPSGGBT$/jajaT AAClBK[Ķ,ZPVBZAQ:-jtc2jcg޽s.a)9".+2lvB@F!I01;n9L2%^ 3dVO$ae>H9s"dޙ;/ZDShChPc4rR -; ڬB 2!< 2T4( \ҫ$,YI|TZ6~7Lx7ƚRjK΅JztKŧcsO8`:&b]FܦGmjU֯FsrD&A2BLVZzjHymEn֦g6ނ?խfbiHF#30GD$+fd6DCaP d:+ޜ\\V -'|<>0gMKm;n%b?&lnOFSAF|ȻG |:mc=o$D apxh/*q5S++kq =]?N vd3! D.H:QΓپ:7<dZ^O/S hwè\{ⅾ:KU 6p~KcCN6*MuI@71x a&)/wZTJ0sown.Fo׿M/DlW_loljLqNdnً~oTRm^{"1]u;3\\Q(@bI LZSPmT{yzmmUw<}endstream endobj 152 0 obj << /Filter /FlateDecode /Length 4461 >> stream x\KsW[͏.'v)&W%-E$eR_vA ntcdgݍߘn ~>{W6N'V~|vqXi)vsIEg\+1lRLmqs~}ӗ['X˭iK5^rs=޷ކSĘdrl!0S%6W;wM͟zjJl͹y)iUbR[͘LW~ħ* %lRsݯ%J)9KG_? 60 &m9)$qMEmɛ S4 S76M&^c%DԕP6WXIk+dO-Ԛ 3W*d.(SRX]B9ߊq:BӰmS$;Q.0͊!PW)O`!ޙ+ `)"-يhmVWqODa*"F2 JFIVe1Wp1@KN]'f%ِFRU.$ۈ+%Z)&< 'H~P +"WJi3N,`\`7D"KG)C(h[ !>1J;CH* JĥnSmH!,L`S#% ;o`öĺRgKZXpq!zTp= LO$!U~> 1P?_,zv.e>g9v'g#5&A=PϿ~'0Ál4״3pI8V!NG:*=)V&.gэp@Qધt~ qDDnF.Rv.:pWZC QQk`@PJ˨TWl鬁4=)rW]<Vl D \=|5] >N)?)3oZMth_~)Vi ޏVeu, @ڂyX$ArޞpDftɄc.E$+¦ԃ Uzj\dy+0#mdB>碮  sűC@2Xanvqn>X+Y5L-AnY&9]}{s2+m٭@{چ/KD!SpYf^9撪,]6O9"W7m2:?+tع:D]8S DJH;lOh+)4~HMR+'I睇.@mOl*bz7Bhk\BJ*BL?Yj^~QSFV}+RMsQ ռݞFB~w$+4-ѠWԼwnb bD9V'8]LiWK JDT+(7+Չ;z/ʦ$zdzYJeA*Sd:HX 8ļ*Cݫ7lN9s L~qPZ9k,E-.Vu܁5WuA-1K@,cgE5)  Ƴ.cvJScV+1YB鹻Zɠ6R7m5ZKDQk ГPE̚X[ig15]ly@ʷylTiP=J*+Km0!*Qij { oE,@Hl)h@Wt4lBz,|M%CucAgdȹzF[; A[s . UmCцhk\|b Xk4Ge&)W=9 ݕBӳgUB$V/벓HA':jjgS{l) 5KI[kڋ7+`L[lw0;"X6FViy;uE?hD峣|vώQRe[kaAi^Sc۪?Uf ޅͩmݳ_oMnxX%Ҳn[S/uø s2C3sC?mŸl觜ǎh1>Jspro(q8rSWw32f`v^ W<^k!(Q.!锫u7nto8 ㋓Q{,t 4z޼AEe6~OϊT`PB-UY*qYEE̳G+1 m}Z<(<;а,|F/MvRm ]OeLat4ǜ=&S xיޟ"". &;$pNԆ0ߡc+'Emq2p/Έ r|"#ps o!q2ό3RN#9͉q z!<$ 7)dé :KK`3z/M6k8UJ{<?"ܒpqXX },cΈq,Lp1e)#AzpFl9#8p֎]0uMat1X)b@:,ܬ#CD6Ә iK:G5pΚa8(/SX8+ƆwO2'S!@ bKzpVԡcR)9 iQshp0~jE9A*BGDN<n^̆wpe1v ,{ &1Eb~p6vZ1={ \[Ll7'f522}f9> ),-S*)2!y91 _L s2ܤ9VHI|psBfN%`)ćVΗS6N$`6}m~GL xpN/9$VN8rPjI79~nNl n CZ<e%A[(:bȵ4{ܔ_A#++So=Z3L8#jtNGLl2pN.:>1Qc^&pI&Xc)O {HanIȉmR>|EJ2aʚaO{L>b)0& 8y={yjEY{fGW Vh}ADb pI'Ϛ #GE&`<8շzLYԈ =r+2qe͇ipF/͉i(D#rbB# ˀKbL'Fs b&aZtC=&p^fDbp:-ap΢#BFɈ2;n) +|}<rmnPu.6on^nӼO"X93//m?]YLWHcWo<7— <O?zw`mw-*cbl.n^n~:|Eռ}}e8M^hS%W"Rqm6 _44&W}s.$|3N..Tl.}-Dpnlg[37aͻwv2fĩK[BOvUxOF9$h‘>D xgo\\q H5ww/x?>[ݽa3qBub{!]yd :_{4߽ٽ_. VRL,fϱc[6|sOýoA\qޕSVךw:::tS6dW?q8o;vSySؿ$gZ,= `ppodaY~_⺩qސph#!$oI{ ?mendstream endobj 153 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3446 >> stream xUV XGvAEgxWAPY Hb0Z(K4n($ QTPc\P 1 Mn_˫^o{=e,0,Z'g&'&cGKJ?S Rd-AulCa`HX/:q^fVAvzjZsTD̄]ocꂿ8$OOU9,e*',]zzzLj  dO9/+ { y C C ’SEG.]>s$7wɞf 81fɼ,e(f02f*h9صBVGqH!$P-̅S#R_u_bG,uwhn6 ~a/%Dxw/4Έ _0/ KDkǶXCs//C0+ݘ^R ǹ !\ *y"!uZ)Qf.N=K%nh-n4M ֔N(^sp r]p Zp3μWsrY@;j8*7si;Iq6GCb,c1-Wͼ:Jq]WntlvJW G[>E A޾JA!)U>krK{x͌Ul෦,*ta2Qz/{M7GU4mU;2DYReHX\xwgρZơK W) JO>/k;Өz^(潛8IyOE}?BI(5^>UGwYb43Qi (li8+I XvFqJAqQ>VP&|t:C﯇beE5Zx-~zï6A,?u10C[1+*! Kojݔ?"!P>: N R# J"$o00 F ypGs]jGw?Ӱ`neAdyM}" oe:Koʒ"Hl"]ȵq~+r-ÉE`zlA*囸Ɋ ъ+*GK;r˭`_3 K[VB=f-oDIEܽk*keͭꗷfԃ Ei6(-hR`U/;5<L+y&y1E,ׯ?"FČ 7>VJ/P) ޻x]i AZbMC]u3@o=cdQ)GV 9fb,^—yapDcl rh> oiK&Wq?=@R+#ku &RC1l[ғ5o d`ʽGU蚀wy; . j-]pOSţsj9G>;vY92]SC /ڭۧ4azUGϢNL]Lq=Hd(nG? đ2 4:MNX~`:~/򬯴,>`*/,x>q&3z  _ n{ I#L|`cV[|Z@D`U(Nҍjspy(^7vȵo[_(+n`^#jnO }yf7, x#5oD'7.0lO ih8],}sԢ4rX-%:6RI/)$6JqѰ/Y`Bm(* P*eY|hlzBl\4|ÿS./ F$Ooϟ$ot%|aȨB!PӖim}ltϬ1uendstream endobj 154 0 obj << /Filter /FlateDecode /Length 1283 >> stream xW[oE~_#Y9s=Sb $*-vIwf1qJ*wu;9Mk4Fb|ծ1U.u h!djgMJ5V.u\}lԑ\R/:=Ez[KEVnӎ caZ qʜZ=<rNր]:X}.-I="fu[^mqLꦇfmfgu-:?w>fu6yq`,;pg3s,+[ܮso=A ,i#0hQ7{<5Ϥ~>:._y޵%v{ոmүCh#ص8c@m.E3C%0~"k= $ѨGfȎzl č`N1Ğ#ozKDt,E;*G>茚5rRhB?+ w&$Eڤexs)hvF\ Km(ϞדEU6lYjwr^(H&9ISN:yqmF k{CvZ}pzϲr5w4Sxpzj6 TfVqT)Qܱ"1aG͌uO6h 6SJ}~h,lVoeEo"9deͽc0o뛢ԷUH{ N< A}H 'W͸CwsXI6GIis`t0<|7zaAJ^'DgnהmeƂUdV@{gj&Q7akz\4嶺x)5B,p^^BsGg J9؇SLyW~ݍM ז?=eaf @S:>ދ³?Jqhă_Wl8:5>RKa-؍H+zQB @l޻S,1en|p)(vJ_Sr')9y_>JVR9oA]ž>9\T!tu`+1^5A*}1 ݿ+endstream endobj 155 0 obj << /Filter /FlateDecode /Length 5546 >> stream x=~?0uJ*jeϰ_wGp0~ԣNWkc;(WھE ᛕtR Ax_;Vo|RL[Tu2`ڸM00 T2ז_|g dĤlt,@l72@j;V'%w}~3&h6zi*l"%BFo]EQ׼2DA&ÎaÍ%„cy˓_ppa=.,I$4%|JbZD@<ֶ؜dY!: CdVV}B2\ ܫڥJ j_?R6rD= rnF5hCsDHw < )a6ekl&̨yOmm <\;qB7,zgy肓<7c:.Ӱ{YS43>Bwe)@ו@{^jSQUl،h c:<Ȓ-aj71s6j .Qsզ_)\Dׇ۲/j`^J +cQ 61kʓ9a3Jz7yv.#c90: JMR8d7h;J-3޿-,5[MF2޳דּ4KQ]ch}mnk6umݦRgmFU*gK2)VSXZg͹1jjj' ò2Ay =G*uD ~@QUH?9_"G(Ǩ413y\{Jn VLl;Vĭj\LظwqE}?tݷU۠nat˖y8O1T:#2=2XAeA. I%4tU{vX4t-?#Ly3cnegW >j6kS!| wOMw^6nӭ&;E}ĂYEPah>[冷6޺|V]]X1)/}}kS|=F6OxT_ewGM#punNe٭'mFlEWܐ5}[:9DMvF1j4/4۷$ !)tupV08zn!jQ"4'-G 'QCM|# :Ǻ.aԞ{ݕqBQ# $f qvS{0d@{J6D_˹N)trVLm!._K Xf|v$غ9C.;ٰY׎/wB\rU3(bI2rcdh7~$iLOO xVZzkŪ6# jm|M3H6aAEɯiѨiuF+r\2'_@{&SVvޥ0"V{rg?Zo062p?s[yR76w-}Qz.0 =سq[]UpƤvAX֞Jł`¿e;m&įVgGhS*,C,$<ltuX.F,/h u7ޮzN @-3<<تE|7Dai/E :.9|q6/zx}r~& P1ݣ/GxRI /s*٩܄+$Z'HL$5e>1_vaDGr*lpOZZp `mxWzDzVqo:.s}/8.6M!#NN#;>(~{8BK+ixi >bʩ;~af|߱-ϼJZ'1ڷljx2pS,w|O侶^x|m /5Y}qWuyu֦8 v}Q?J9MG$QEdK _}4xS5^ɱ?㼴{}N XMV!/\o߷IS94by69dyϸNJɘ-D ;Gl.{uZ0ĦVCa&)o1_ "P$&.IH~˄@)3})R/ *Q4{(Cjv 6Lu!dTh0?sOzhY 9691E 46?+R9ksĿLd Zg0њt1FGDĺ)/#6VOD':=? $ ;l1'IHꔲƵٔv/rC01͚=,ٹ)J{5ߖA݄v ps/F[߉:UWe_SeȊc:J0xDf t+Oj`c,íS81j \4aj1NY FvY0h=Rl \9Z \g1v)$slJP)1) |T74Cdf2MRfaTSӉ;$cؼ:b`)."n^(yKQ緫)Y#3Ȱ=/x{*4JS#Ro.M8v3km`4q3;g=+p0([ t5H1@(XG FT o)Qt8n쮩Tf&`mTN&t~_B,Z0 ]!\ -K\45 J8TDqJ}4+-8cS*Em&߹54wmQg fNMWv{oa|:3ZڂΌ>jf0S/0Aq AZtj0F\N23 k{4& 6|DȜ:»j=/m)찢`;^> эryo2J67%ӗ 2ˌ_o~& a0'K%u lFa uLZN8" h5> ך2.~_c"6 /SaCNSCx]vz.x]sm.TuqzjݲR;9)P֊aae,/r目'º/ w,OC}X:ZVGpS>Xv;\ u՗+#iϲr!ѹ|dUlwpR'] બ=%q8endstream endobj 156 0 obj << /Filter /FlateDecode /Length 3711 >> stream xn#]Gpl#B .6DYC=uLW={Z5uW/ ٧ߛbw˙.ʏ/ zq? :x>󛳧ۥ mjt0>/4ZِZ ^J%`W:#2,ǜ;!sF"h*'HzIiH\pU! U'jJ4"BN9aivi"5q$koS e´ؒέZ{sw!/{wg,4e邌Q~"ezmom=\wxI/\@$e@$,YJˁSxΕ(]7ϖ3lr=Iܓ$Z^`I0i pAŽ6҆].zW \vJwqF}*0ID>Pýֶz=9uQ-stE ڀ[h|bp 8UޓUS2'"ه3jw~ӛ[v"(Qм#ධ}1a]X(8/˕7v IR< *xY _t1n+x|]A]'#[-4lA-W𪂛 >t7]w?{Vq?+`EdzǛ% d|z]MU+(~ *>M/+ed ۪x ^W%]}}ٷ.0 lU -vlۧ*leCSl}W`J2]eV`L'5ttEkPw]A+XW#_+:}pz6fK\(|ana3| !NY z`&IiQ`I; +iIh0JDKưX A)r<0 Q! (zDpy('B~!3&Y+*ŷl&{yfT{²Quo lVwRV';0Ŀv^F+j3"KEr^>$8EARE3UmQ5ڸO4J ^z(=X>#"ȫWRXx.W<*{9k$/h3fF6$ 0$ 17TP_c>nf?s5-{-,{KV<%\6kXXcB΂.Z֘ᖴ7,|t J l%hL!*ɇʡ@*ȸ f ,Vغ/h3dj-8Z; {{ÿཆoxUc%OF_6o(%(eі| ٗC=- ? ~/I *w-扦[N58L25ڥpjLPh| ޲`38j|$1Lϡ,{maFDm!1<ؼa"kG|((OM[F(@&GG)Fz5ZՕtuv#7,m 1\T<^4'wHR6 i]a9`qר=wMqII7ҶIdE rXg))4I(yk3ݎs0JݱzQNij 6>X-ht~ ~Hi9>!cm8NH0&LR刊z V&C ;}A*Ss /qSq.ҿW|aۣu39~VE Bp=sEG"QNq(oMSCk2dKSjgP|%M*S]]VA1^mUj]&N GBI֥pWA1l?곾Կ >"ՃdUeOV 1E}-qU}MW]\Alvu( .L&-u_ɷy\HJ;iG npmׯ '%MdKBZK\{y^V"8ķ2JG[']^@w\Qmrj7e̖3diB7L¤pyU\pal4mm~u$Z=rtXsU8%C'pojI'?@G6i3/>+RJqaW h擖S 4GLA06G;'ceX~.pȨR_r2'ְLy1fj (~~wx!x* Š>˾˥H9Sm˹dgœ$" X' &^> stream xcd`ab`ddt v04qH3a!Skc7s7˚ﷄ ~O XX_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*c8)槤1000103012ԽK2>}wy߯jcws~7yŞ>~nSg>;3wߛgO^-ym̾^];ǂXπ| wt\eXp~`:endstream endobj 158 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1586 >> stream x= PSW_ {Ր4{ (ZTcUZlG, M$|D"HrB (HIGЩvgVֲٝng\z樷o?ǎn\8` Q˚o*4bPכd&;FY ]wt'4P5e#I@Bq~0/`>ɰ;,zc,-jk$0Fx"ˡ:<w4ԏ| n`1 0v̗˳9}MH3 EPGRH/ћS5uh_uq2bvx7.rկ ۗ06a$Tɖ sRU |ڠޖߓD^氯bsRGz;>M*O-6&1Vbǖ~㘬HW, _m3Q!ďy,F\d+1lɳ?+7$앚W[#/%> 1<[2L( }77 ʁoUÞ^BSA 0RJɻK]dfB p%d\'avW W|l6^.܆` EX tF8-E;6^ay'3Nx5=[a u2D %qL$!. D%K(|urkͅc /h~-i؟acmo_3.BU M*|5c0zp!"6rrKN3JAWݲ]2J{eN endstream endobj 159 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3478 >> stream xWyTSw1ԦKݪkRk7 @$!@ &1;!a'("BZ[h[ێשf/FԞ33oNNN~?ɓ05eC-+W. a 6̘ԣ(=falK,lK̬EiVFG$+4(*%3G EQ^ϗ|yaa2~N24K YQyi =jX#nqD/FŊRaO7Hސmʗm-o+JKdd wYasNl>-vc{E^l{[%bo`1Flۊbl 6v:&-t˾4y[#ar)gR:0T{8W<*ؐ+Y4K/nh⢹ -y;q);HўIeR? =%;x&k:bL9ʍ:PUoOW<:Φeto :*Vj^K?m5/pͽԌV@۷?V@v[L5GBhɽ;g~>6Sxðƪ<ڠfQY`s-Gn^ܜzxL="o;v$d EdHRWFLs.]׮l.FISbW~a1Y2<g7F>⪅Z&*FN&ECмBsI2ޯBz%yqgt|v=SDx2q5fqldx ZՀ\2(-ܨk ڠ^2d/u[jUnuژ SsuEuf%*;7вa_'4P;?w({|ْ5eq3 N+䋋d~E_Mu?m'olZVTR?z| =5x"eeQh̏"݌\[u pjzky )dI D] *7xI5j08(Pjy*GL!Hz3GZC c1~h{Ig/ v0,n<b F/'0{Sf\ r -:Rff/)~ JWp4?ʀ*RE\v19z`,C+W`l3YHm$^tE`(Ţd*N;q`:|?eYH;!sovpېW.Q1!_5":XGGQ_[=V0W*EɴrM!ZTwOu{vX.fw e rj-jAIpВb84RɩFF_z%xBnWHfu23Tཾc-Nxukc%qZ9!v`zSUWk-7 {+1I\!lj188!pノhû|i~~]cMl(ũ;45O'+6#"aqb9̩7"6^)(םSiG0[#QD@<:{ͦK/|LF~ N 瑝{SgǾxգ~4$<68Ǭx Ήy)7ƺw~g9L.vUCԐY CDkKArRV1.*.Q>tt: nYC ՐijIpCsļݛng9'p"єN[ -JF; -=q㈗ti*@1 ̯W"|K40;Gl PZM&DP7(Ee}·?7 &.aG&m9_2yMSqʇzLD -v`S`&7A˘Ɉ+܊&_PJ϶cB}תvU&/}^_ ^ȹֿ&/w 0N0zSYedM8\ -XF!)@,RQ* < N5C)PD]Z◴,O5 佶&rg8/FVRD 7jC#5 6+HFjvu;21+OV{]V[\hFiF@GKcI@׽[LT]z:z纙zEN?1u~\%D 0%wŖj xjai|&ܢvXRiaVRA}(z[j| ^tKHUr5xj∷=noHnݫ9++0`9Q5؅ߜ@_y܇G$y9!Cڙxo 3 ź|<=T"Y]zy=/ޔzQ"+] \PH zuU}[];(WЁq<NyQ0vQ#4yN6O)8[0nd+>u?4Z[-n&3CeP Z6rʖNg{%gGD횾NR/,i[;uf~uNۦF/#(eCI1rO\'5]YB(8[!jc2JtB#-ɷoо_\>?rA_"шVk j u}W0&!99P_KxH0hho쳯#>AhK';Mb6iCKQ[#T("k99!jklj,v+46fz4~^W25h9}eAy>b쩁^/3'Lv|?VSE]p ]A-cc7F=M?IG0+)&:h, |KQ4_C.ʆ ^> stream xV{PSg1{&RvZ҂V_@ !!HxIN"A ( (RVխJn[nz;|3?1DLFOk=[ m1uOPbH7 q*Q3]>;(hn|άYA%Z!.F _0ZQb4Bј8RRRڤ@Ahz<%ΨU&) ;!uV)w iJ|nҐ@QԤ]C1y.EteJ 8kEPoP uzjAmRԫkTJ-SaJj5z|1zZ( APߋRDZ8 &cww%$m4K3;sE=vkx-xtL_pE!ױ.+۲#v,4 {$2d\O'Тk76+6C DdDzL5yjŹ[dZn>_bjg8E-1,S1E/Nqd=E;ˑnxLc>8 gݭ*:,t+l᠀Xx۾=Eltaҵy!nΙ`>>X˝#4:?"UVn;X_)Ա+Qe_mF}Lr|f#D!hF-;^Ϻ"ONcm$`(~6nn4ԌZEmy[S H`5)U?"7SNtBa|fXv!z q֍N[ ^|'G W`f! {vi"i{-0p 6vv BtjRRyO',4}xo! g[_ h͗{ u_ d9AEy,snU7uel&c~yal l1ެl3p^a#|4_qpG'}xoI%,ӜM;Gֿ9 5?@T n•n4anmsm1P֙W/ԯk[.8gɃ4TZ_^YR[I0\bݎra. oUUY,:5lJUSZxzL,lc^v-Cwk E^=$pUYXQ\gmU f`n f̖Ea_(KN,yoXhBȹĸAkmV0f `FjGH-zWd;S7RPfad;N5A1 ֆV %ݿ"&inpZ o_eLȘeԌ`;-B[lY0_0C"Z6<2 ki.CjfQ[b\[Pem(藟:gvy_&LQkG\bjt4 g<8O@ߛM詁ďH5<U6@R;ܜl8V!؂!YsB'{OkkDw.+By"¢\ B+gpbA}?2Eyhuf !HsR` dDL!L k7dYryvsQM8L dl%SSs~>1f{NIͫ(:͝[nȆZ|)9VNZ`eE?^ݡNMLLNlwVT87}­ϑci%ɩ& I? $`S5¾k,\2?jq'EΌɛ!>w቗>L?Psϗ hS3 2|Tz拋ڠ.T\/JXs"%Y&[7.=RGkNbٛfoB"+Ͼ;w' pCإgܛW\ZѺNgk>paamhM2l1 cx'„: .]^C9/5ޏ9CޏS?6Iendstream endobj 161 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 745 >> stream xU[HSqggUBcB `JX+晻6L5t3Q^.v z*z^^~|OK 2* R*u$x,PV+\ W,G$A46Bb 5m~ 9mdLXycB̆شf|s`+޸zk,-\-S*4Q ~_7YE˜Z҈YJTJ -CR" )_=)i6&'񐔫G`( = =]н:\hXV.ڥrzj<vVGtp \J4R2OX@JREp[[?M?y漹Wffúȩi [Sp,s? -C:<WU|;`+'uW_>yBAoO'ϥ>SzC$va<Xn`i\&+_}I:::|%@ c󺞔.-<LspHTzmkfMp u9;VB8̮{ ?V8Nbbg/[׀a-+ΤPǛy1rm|(H;c#*,^XBg+ TZOUQendstream endobj 162 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1272 >> stream xURmLSW-;5f{ *M |#CM-J[[*"e"`(h*uSMA]%73v9-=DD$)MQnglx21$_QMCPT-'$iTM%fv-PG*E+bcbIEN2(*N)RqBWl4uDL+-l UEFU *6h,s&Oh"b\3XdrBiӘ AȌ& RkȭIdOdb5H%$"H$sb-qT=DM$Nw5~tO@1CzH@v!37P`hxi;2+08]lιPQf+}J]sd oeŠ Y6|M@>Suxf.DR GF<ӥ;@yebh& Aڶt Q$g}=|D&kLTP ~~u/|ɺW6<ۀݞs!'YKp4~z M_FSn1eN80ãX<MGo ;bֲa=T@Q_/DJ"h lv;+m089;Mw>gP{&..kF&{yi,uW})3 ;+AF4\u5֪=,f`$YrJY9twpszਛ>FE-'D>bUi5}p hS) &3al_& ȦĿ=!endstream endobj 163 0 obj << /Filter /FlateDecode /Length 3025 >> stream xZKo$ϯ,rIv|7q vt[/4;RVh\׻n{#ia#!.VXŏss?Uogb}yut>fh# ѧr張*h;?85~qT1ʕ0x_KX:BZhq\kkai0 %dsXjW8ȹl9 jWFpRz`Up ~(D+<'8YkiITs 3gV;j\Q+Ugv0aqn | tG] M1Rٕrt,R7[S 8?7>x4ooQ|!Th&۬JsZxFƽY,oW- ?6 -, y`T|WVy8c6mq4l42qي@`Alӭ2sO^s'lmToe NЌRyTs @ByߣnSfapJrdCo\o5ui60ꃁ~P84\ﭚ( \(ae&JIa=Ԗ Om{=H|iݻΘeJ 4.L3SꌋL^gI׽h|=H~ʤ'qtɋLI<WcU?;s<{ɫd8䶪櫪dZU>L,Mlg^drgrI&ϲWh)!\I?-JH(9vY6/3yU̻{T'3俫UM(i]%٩ULTU=r[NiQ|Y^3|32_dr3 ]eR_xq~Ԡi %Yb\Sr3!8MfQ`Zۤ XȬ9!?{5dB ,F$C5̀ B=I#܉ #B8"9NCB9L SJ6bwޔ`X Jԝ'eaamrІb,g$ѥ2; !)f9ZҏVdnvǗl_KJezu`[Jf2WUc.C%0)qnY-lQEb U-)AV͵th|8,q% k8E""StXX; O%msळ9PR|kaFK#k-C(kE yIRuH+V7xe2= 27m6r`ߍH?Ǝ6TwHqu xuG7Q :J2}+x8@|*4 9kj[^O)*]bn.H*xM ,܌: T6GKƝZ4M\E>#(7L̞1>0y*vqVE'P¡0T7`y a,8^N<F+.,9n{1:Cd(~6R0"hb `5#y!Q.Vv"7\ ŢKA.@tt]doYdLqUr}JӍøqoϫI1Wh E1:n~I^Fr:#I0$KB $$ q7$i5 ,@[#M,].-P@Ua.C&U%EZ84J [[:~)ҭ㣃^߀4!:!怰eDZL $vz@seZQ4ȸuH쟋3Ea~ri6,7'y8Xٱ0%w(KͮKס2AG1`< NУEKS&7^z!KIV}} ]\9#bl .| NcZuLt&[{B&0у )=T^[A';gK$" -̷)>an.z r[;Jx&}><--Z4Eq7&R#=SRIK_+E6Ӡ݂ה1ɱoUVcGu3]u!C*ʂI:VI`3ցJe!\ۈzK)w*rGy}8ꎔQχL6c|zo3$뛆*.ݲ*Wu;P gɴ܌e&Yg]&M.{3{~d LO6dcDpSU.uuو 7HoƁVU;e}G>$,}騊oN/\\zd3QR U~DdJ 0ѕ#>! =(Y#V(od:{-S^2-["~gEcfzaT_؈ZNvǾmQzZܿ*Z|%Tendstream endobj 164 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 600 /Subtype /Image /Width 1200 /Length 30606 >> stream AdobedC    %,'..+'+*17F;14B4*+=S>BHJNON/;V\UL[FMNKC $$K2+2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKX" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Z( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( AKwtae>ܓYzg3:,aᕁHP_$W?Eo[}WvZ)FW#v Ѓ.EPii6sM6RX!(pa huOVea a իEea a իEea a իEea a իEea a իEea a իEea a իEea a իEea a իEea a իEea a իEea a իEea ԭ8xR'@ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_gULӦSd/{L\VV8 [#@MQ@Q@Q@Q@Q@4)n1 ';xH5wn~?ߟµ5m>=WOftYá+ ݴ=>n€6458혴RFA#biZ|z]V;ǒ]I,ܒOV.}NRmSQe*CrQUTv?{TgQ?1?1Vǚ]ea a իEWGZQ.ea a իEWGZQ.ea a իEWGZQ.ea a իEWGZQ.ea a իEWGZQ.ea a իEWGZQ.eTcW<w _Wƭ~t!LWFWGZQ.2 j? jբiw+ _Wƣ _WƭZ(p2 j? jբiw+ _Wƣ _WƭZ(p2 j? jբiw+ _Wƣ _WƭZ(p2 j? jբiw+ _Wƣ _WƭZ(p2 j? jբiw+ _Wƣ _WƭZ(p2 j? jբiw+ _Wƣ _WƭZ(p2 j? jբiw+ _Wƣ _WƭZ(p0.g.t١7$%Օ i\WU[SmDQEhEPEPEPUI-nA()$gozU~i%4`Ǚu97Z50 pq5Y[֑GAvII'5i0C\ޘ}Vϳ?dր'e[F e7ϱ5Er> R1MFTg8j<7Uk^ ( ( ( ( ( ( ( ( ( ( ( ( |x?2'@ (((((((((((((((a?*լa?*h((((eoIkw FI#={= Fas:.b7\f_IoM1@}{Mбjnxvt6VuvPGqIMNJ Vϳ?d֬PO#zWX R1MFTg8믮Oßk:QEs(((((((n-QL(((( e>_?S({QEQEQEQEQEQEQEQEQEQEQEQEQEQEQE}/0UW+}/0UWE/AEVQEQEQEQEQEQErNC5YNC5@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@>O?ʙOGQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVVKjVKu4QEQEQEQEQEQEQEsbusbgW^(qQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@G|x?P(((((((((((((((+^_`ЫW^_`Ы_(((((zV5'Wb@P>@((ǛϦvmji:j|Wq$(Q*~@(<7Uk^<7Uk^ ( ( ( ( ( ( ( ( ( ( ( ( |x?2'@ (((((((((((((((a?*լa?*h(((((zMy*<<ؐ V_|Q7#OkyLۚ(zNh2 ?T`JU+'s+'sίQ\ ( ( ( ( ( ( ( ( ( ( ( (/)~t!LEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPVWU\WU]QZQEQEQEVw Ѯ6{?xry91Tm>=WOftYá+ ,&WؽE#(u* Y_i??MWw?zI:Q.MJTz@Q@Q@Q@Q@Ph4f4EQEQEQES>t*eQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ektVektPSEPEPEPEPEPw Ѯ6{?xry911*mCj|z5CV#Y%Ǘiz}hhـM Þss=ZSJ"<~gbIf>J#P'NC5֓>coo DCEDnGY@ڢ+aEPEPEPEPHHme: !wJLfror:qf4)5XLh(AEPEPEP2/)=(((((((((((((((׾a?*꫕׾a?*ꫢ +@ ( ( ( eoIkw FI#={Պ(|[X ݰ1wϮ3] i~TjddzV((S}5_ f#}5_ f((((4R@4i2&7T%wPӁCSըJ\PIZ(()}T|x?2((((((3Fhњ(4PEPEPEPEPEPEPYZ]/0UYZ]/0TEQEQEQEQE^Q1$2F{{Mmc 7vt\u4P{ +}:;[H#8$&QEsbusbgW^(qQ@Q@Q@!8sY\iM1[4Hq4-Du8u85`iJj!@޴8Vѐ(4VAES(BOGQEQEQEQEQEQHHtZ)7 MƥԊ ֗:@E-ZwQE(((((׾a?*꫕׾a?*ꫢ +@ ( ( ( ( ( (9O 's׬ 'sנ(((E%!&s@ f٨sPb[ލ 5 lPzzUWUҵ<R+PN))h3@>O?ʣ m ( ( ( 3E%QLIIvh7"uQIK@Q@Q@Q@Q@Q@ektVektPSEPEPEPEPEPEPEP\?+a; Y\?+a; u~5袊QEQEQE{S )M&'+ƣcNsP5j5f5H}=^zZ R+UezZfn$ӳQ+S2hx4sLfCC4Қj萢7&KaؖR7G܏Z%BS*,>@ikDWB (() &ՀI*IJu&i3FE+斛ES0R\MsEuQE0 ( ( ( (2・F u・F ((((+/á]ɧBw2F⣹ =jQ\_ ߟ=?&zm+Էshv_yr&E컎ñ+}iExoa; ֽdxoa; ֽQEQEQEDH犆CCUݸ%t!@ (h((@ HiM43IBiQ&zu.EGޗuH)A@ QMQEQEQEQEVVKjVKu4QEQEQEQEQEV_廇BOQe\Gr${DH.7so@nd NLwbWӠ?Ww??Ww? kE0(({LnLsqH9$ R% jW ;YNC5@Q@Q@Q@4ө#n^J*VSTnj1n A$OZ&4 K/b)zVXxs@1I*-Lr9v ۊMUsVT E- (/txPQH)hE3Fh ӘLh R3TeBԛ"ѻ@ P@fS@Nx ZJZ((((++_F k+_F :( ( ( ( (2M6][PU2K\[JuSJu-Q@:_?_)~u撊Z)(3M&X1YZGnj"Ԏ~(BԻ5N BS@R)WJ2ZzT.Sq#v1cg<: -[KY`:O\Ư ZT}/nHHb>lt*ynЮT`ƻW#qQ܅++iձU2 ?rOy~o$~ЛR͡}ʜk;KĮ 5=.'Vwn$ǂ 5x^mGBeyX2`IhVFPUTY_h4ᾚ3ZXu(PpVQEQEQE(4UVb3zE[>t7@7}ֲ"k.T(*E@n(V/[VTezص@P}ڶNU<&j5txSi!@ (E6"7J*fUn( [PV<泮@嗓U^ig~MRy=(ؗ'M5$皱(Z'{V\-+Bx jdjJMHMH:S0p ))h(((a?*լa?*h(([iuy( 3N2@=Ƞ$ťOj&Ju)@naYZ27*6Ӂk=.l31A$kS(|]ojF6cbpy9uzڴ&j_na}P(2O-:ܚ~*s*n*;#W*$wAwO  |O6]][YP(!` 蠓W3o,ԺkZ8 ݺD; \3Qnd NLwbWӬ MV7,+S" 6P?j2R2`ZZ91_ fk$QD#MFUG@ mQE0(((֣n#u5rTݗ QZU>Ϊf5[;[KՍv]4^l~c]~ք5\CZc%c= VWN{M`+f \Uٔ{SZP}͵Z+{.-H BJ#DhN QKH:!2IuIu1QH%:zS<ۥ&R"sUb*čTPoTꌲj`͝5ΨiyGҚs]4㗵\"b~~b4oj5J"xhk "MAJMDO*%5 52c=Oj`EWY!EPEPEPVWU\WU]QZQEǛI}m3v89kO,N'I-Fއ1t.\_.Ook;²0^Ƕsɠ .,cMBujĀ­E.,P Y&bF x2~5@#*pX`23gql閍6P"cU@ 0EQErNC5YNC5@Q@Q@Q@ 42ǥE (9%MlLu|(1;d{VYϒ J x7J(zq@-+RbACз\PEYJ!N$))-8RRӥBO|2Z((INtt-ҫIҀ)ֳ.'ZsˁP\x'>z`w@ Rj Ut^j#~!>BȭFhue: *(5 QJzO*5:SE8PEPEPEPYZ]/0UYZ]/0TEQETwo' /8(f<`8M$!Bv;z;5wiNYb"^XV-++^ p u{g<KK7vBIib)7 @#oEUea"ql閍6P*(E"T`:(OßkOßk:QEs(((FS =SJ櫹Q 9j̼+:`̋ʚȹLz޸Yd*+fty jvƦɐA1j)Ȩ" aRw"Ll1WU[uVsMJt(M}::ӪRKTHuIG?_)r^S\m mF*S֢n WO֭U'Pt@̸t!M>O?ʀ#J)M%!Hh&PHUPQyZ5Fd@GɪkKI⪴,)7E>2etHii bzmҥ5wh"U&^jiW ˝:tkbd2Œx"uEO"WZ:SDX=+nr6$u"c¥P`lU+Ɠoy-2HCJq[ʹ7p"Ic$22# 7z4F8Q&?ۏVƟ{iվ)@#jԫT{W#:/m֢9 QD#MJUG@+j<7Uk^ ( ( ( ( (uȦqIojLQ`ZpR)hQEQE>t*e>O?ʀEPi)i(-iHh&ZQ ̕OZWaZ҄h@6ъh-hq@< Jj}iӳQNKH)EQEQE#Z#@MQ@Q@Q@.5-_L&/SߎO>jKt;G"2I<99ֹK˯iwo3.$bvة<vzJ_Gºx*b-EIk<`A$g E8 ޥu <`ɏssm &+X }:wV7# AACV 2m|V7u(@p'NC5_ z(QEQEQEQEdS>3Y*B⹥-22}LQr-REJ.)@RD1@SŠ(DQE>_?S)BCRI)H%r4֌1IN5-*6ZhsQ2U¼4jX7eX+Fz JFz-:Qށ\jf@▁OSQN-p54j3h4qLV!J)W\d (( {iB]{iB)|" (((((((MWw?zMWw?z((((((1IKE%PQZ((((S)}T( ( RR@ Hih4֘EHiDE7!LbJmIf5Ez{hujx55"uF(P((_`ЫV_`Ш(((((((OßkOßk:QEs((((() R3Ҋ}wE?Ҋ=\hb0QŠ(((BOGQEihqOpF(Hc8[TRcM4CX2*C֘z3D7bbR@ #<ѓHM7>(jpjPiji04j5")S9Oj+36QEHQE}/0UW+}/0UWE/AEVQEQEQEQEQEQErNC5YNC5@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@>O?ʙOGQEQEQECJi 4۩50QPQ-I$-M-L/L-@-L-L-M-IJ7Z]\y\0.Hۀ Z)CV Ή@O(+}5_ f±G:PqW [TQEQEQEQEQEQEQEQEQEQEQEQES>t*eQ@Q@Q@Zi]G5]1=#&w KtZnz_izCڜ LisPS!*TTKަO@(TkڥZxhNREPYZ]/0UYZ]/0TEQEQEQEQEynЮT`ƻW#qQ܅Q'7 ?zhMgWUkˍ?B5b3cI+ojqCx IVk%1brj[;Y/9S"v]iaؕ>+:D1eX`P'NC5Ή@O+G:Pq7 Y@ڢ+aEPEPEPEPEPEPEPEPEPEPEPEP2/)=(()irk:BcqPjۭ>CU6tE L/Q3 jOސ}o&/M-Qznj,;n>sPOSހ2ԫPZiT*4* ֥jѓ)֚)ֵ͎+(+^_`ЫW^_`Ы_(((()=ih ƅ$s&L䱷^OJU T-QExoa; ֽdxoa; ֽQEQEQEQEQEQEQEQEQEQEQEQE>t*e>O?ʀEPEPEPSM:():i U@d'튚^7e(`ƗwD)p*8 jZCS!:5X^* jU@ p/J}--%-QE#Z#@MQ@Q@Q@Q@Q@yYO ILcn^E"U h 91_ f91_ fEW8Š(((((((((((( e>_?S({QEQES)¯AJ*YD!5VBy2R5L]2ԮqPsTDCpw{RSPSPڞeMJ!YCRWCS)ɢeEB"F,Ruh3c袊 (׾a?*꫕׾a?*ꫢ +@ ( ( ( ( ( (9O 's׬ 'sנ(((((((((((('LP(((JiidUen*(KIj9R@ZnY;t(8*H(\҆ 7hoz&G ѿ5:5QVn:jMUU O*%Ru(ZZ(PYZ]/0UYZ]/0TEQEQEQEQEQEQEW'NC5W'NC5_ z(QEQEQEQEQEQEQEQEQEQEQEQE>_?S)BC((iYUZ\hRuDkꔽM^`9FsPu@%BMO 5^NhBdf*:5V0`isQnpaX587WM+2?5IZ%5Nq֬銓"ʚjWR0%)i+Td)NR]FCCFVWU\WU]QZQEQEQEQEe[t+4hU1UTw!rG J+x; v_mu~mK0TȻ]qXv%pO :(9O 's׬ 'sנ(((((((((((('LP((( 4ө D&J*w(Jj%*ր(D`էJioJ7 JpoZ5Ps@#<ոUH [[+U*Ҥj5RPi(ZBZB(((((_?S)BC((Rz+#5kʽj(Y0e A-]xU*:* #'=)jXޔaSLb4ҁ5b3VAXbqtQtQdY^2SL)D-%-h9Nii]4tK2・F u・F QEhEPEPEPX.&B.Ent&i"C)dbfm eHc9yI|<16\i\2QX=jq,aP$VD#UDQUz@ JHF4?Y߅ ֢9 QBqW @~YNC5@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@>O?ʙOGQEQEQERZ 1@5`N3@^i֯Pt-5M@L)W.)@'jG@~"XQ4IU׊TNtkБVbҦQ@QOS-RE BZB((((( ojiz pJ!x` Ң^:Y3xV\6X_d1bA$p>S]sȅ$Pz MXETf ljzV)uЁƴCV D(ª=PO#,cxZ(RXQUE ?Ww? kE0((((((((((((BOGQEQEQE0T)Zew^Eն -`ѼYFDh:T/#xȠQW>)hP)M)W.)U>b^Y**0s"sSĕ #R.BFU^FiqF2cbQLQRT1K Z(}"Z+̭{iB]{iB)|$QZQEQEQEQEQEQExoa; ֽdxoa; ֽQEQEQEQEQEQEQEQEQEQEQEQE>t*e>O?ʀEPEPEPAJiM""ej´Yh4Thul4SߗG@V.#@T JxJbH(Zv(( 1KEQE#Z#@MQ@Q@Q@Q@Q@Q@Q@r~3]er~3Y@ע+aEPEPEPEPEPEPEPEPEPEPEPEP2/)=(((CҘjJk Ƥo#"RHEs4hYVJJT4hUdLhe)=jlZS.+҈՟.#9]c枩SO Es#THh1F)j3l-fk6KbP1KEo(p*׾a?*꫕׾a?*ꫢ +@ ( ( ( ( ( (9O 's׬ 'sנ(((((((((((('LP(((((PRbF(Rmъm&ߥI1@QRcڌP6҅b\R1EPEPEPYZ]/0UYZ]/0TEQEQEQEQEQEQEW'NC5W'NC5_ z(QEQEQEQEQEQEQEQEQEQEQEQE>_?S)BC((((+M"Ee*i4HEPE>1 D=(OO"*(OO"D=+9D=(OO"*(OO"D=+9D=(OO"*(¥"vRקU}XˮKx` q{Y"8Uك `0?c'QgG"Q@"'Qg]'QgG"Q@"'Qg]'QgH<%kGpd|?,ڵkn"d9="oda.˂.5 A@"'Qg]'QgG"Q@"'Qg]'QgG"Q@"GTd#5sܤMd'^+z6\/cxh'?k????k??訠w?k????k??訠w?k???zgw6DgP25U=]8v08 EM j(aA_G"Z_& (XkW֯4Vqj:ȂUc`WpH +~(((((*e-v-!v^Q @tPEPXxRhuFϕhz ߢ9EGM j(d?֯QA_]Yjz\GjnNLːT(*"_dn4Cbt?®Qd9GuEwYWGE@swYQGuEttQd9GuEwYWGE@swYQGuEttQd9GuE6_ kUI^Et|lE@rz?d,n5q%żrYYA8="_Z .͘;[P3U,?/??s/???,?/??s/???,1hnFM_ZvB&Lڻoda.˂.5 A,KO"D;+ 9D;(KO":(KO"D;+ 9D;(KO":(KO"D;+ 8SZ5\ϟr6z|xwYVdo W {u?ZE"_%Qg]Y%QgG"_E"_%Qg]Y%QgG"_E"_%Qg]YhZ 5ΫMm@EGMjhGNlô,\QA_G"Z_& (TkW֯,4*?5k 0# qj:Ǒ*ʱ0+t$E(((((((((Gjv7dV"\^Ebqs@ Q@Q@Q@Q@Q@HZVԖi$o&<σGCޡ]^ 9ǖ[vQ tQEQEQEQEQHx3@ EqZŝz2_΢m)#CD7rN vTQEQEQEQEQEr8 ұԋΒBGdI@MQ@Q@Q@Q@Q@SLmZqw>jD$eRN ]tW2XU N(z((((((((((((((Gjv7dV"\^Ebqs] QEQEQEQEQYԌEmIfRIc,=O@TW? oPҮETd-(x (((((<;KXRRKM$h|#@Iʊ(((((qiCc$ 8Sں(((((jsimkY..H[ A dcԒI>( ( ( ( (0VpqW#qe_GsoEahkWz2py Y1^3< ݢ(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((Ե,oV-.|5㵏q3[$pp:t s I$=I8'# vV.t~P: 6vRJcL:mY%UJ)l q@W)Yܷz,aHP8 \N ۛxu nkxVx8>ѵWMsl-*Hr]-59N0H>Lzg I▖E[ 9|ϵC.r0X`<:dѮZjsޜ` [},9/ 6Cg>C,!sp,s)$݇\JԷⴴ{В > stream AdobedC    %,'..+'+*17F;14B4*+=S>BHJNON/;V\UL[FMNKC $$K2+2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKX" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Z( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( AKwtae>ܓYzg3:,aᕁHP_$W?Eo[}WvZ)FW#v Ѓ.EPii6sM6RX!(pa huOVea a իEea a իEea a իEea a իEea a իEea a իEea a իEea a իEea a իEea a իEea a իEea a իEea ԭ8xR'@ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_ggj@_gULӦSd/{L\VV8 [#@MQ@Q@Q@Q@Q@4)n1 ';xH5wn~?ߟµ5m>=WOftYá+ ݴ=>n€6458혴RFA#biZ|z]V;ǒ]I,ܒOV.}NRmSQe*CrQUTv?{TgQ?1?1Vǚ]ea a իEWGZQ.ea a իEWGZQ.ea a իEWGZQ.ea a իEWGZQ.ea a իEWGZQ.ea a իEWGZQ.eTcW<w _Wƭ~t!LWFWGZQ.2 j? jբiw+ _Wƣ _WƭZ(p2 j? jբiw+ _Wƣ _WƭZ(p2 j? jբiw+ _Wƣ _WƭZ(p2 j? jբiw+ _Wƣ _WƭZ(p2 j? jբiw+ _Wƣ _WƭZ(p2 j? jբiw+ _Wƣ _WƭZ(p2 j? jբiw+ _Wƣ _WƭZ(p0.g.t١7$%Օ i\WU[SmDQEhEPEPEPUI-nA()$gozU~i%4`Ǚu97Z50 pq5Y[֑GAvII'5i0C\ޘ}Vϳ?dր'e[F e7ϱ5Er> R1MFTg8j<7Uk^ ( ( ( ( ( ( ( ( ( ( ( ( |x?2'@ (((((((((((((((a?*լa?*h((((eoIkw FI#={= Fas:.b7\f_IoM1@}{Mбjnxvt6VuvPGqIMNJ Vϳ?d֬PO#zWX R1MFTg8믮Oßk:QEs((((((((((((|x?S2Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Z#]Ur#]UtRDQEhEPEPEPEPEPEP)ᾚ3Zᾚ3ZQEQEQEQEQEQEQEQEQEQEQEQES>t*eQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ektVektPSEPEPEPEPEPEPEP\?+a; Y\?+a; u~5袊QEQEQEQEQEQEQEQEQEQEQEQE~t!L ep ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2・F u・F ((((*ǥi^J "uv$Hry~ξO[gf֦&wnµt>=.+Hc.v$cI' tR2R2֓>co 's׬_ ĐCEDԮG[TQEQEQEQEQEQEQEQEQEQEQEQES>t*eQ@Q@Q@Q@Q@Q@Q@Q@f4RQ@ E%RREPEPEPYZ]/0UYZ]/0TEQEQEQEQEb4k@Mx9qwr5d/yvg3:,aᕁHV_wqnl`?@:=`"ggp9|օTҴ"wu$ؒY$ƭ2R2sbk5Ϙk$QDQ5Qu~6QEQEQEQEQEQEQEQEQEQEQEQE~t!L ep ( ( ( ( ( ( ( (Ȥ*\hɨuP>eX} EAES((+^_`ЫW^_`Ы_((((*i%bH%e$V([Mmc 7vt\t6VuvPGqIMX (9O 's׬ 'sנ(((((((((((('LP(((((E%4.hh٤74њf}Af4IK@ E ((_`ЫV_`Ш(((((i%bH%e$\-ny}qh VuvPGqIMX+'s+'sίQ\ ( ( ( ( ( ( ( ( ( ( ( (/)~t!LEPEPEPER&u)u_@Ԅni3YaԙFj.;nџzWA4\VZm-;ƒ}2VНbhuQ]Q@Q@Z#]Ur#]UtRDQEhEPEPEPEPEPEP)ᾚ3Zᾚ3ZQEQEQEQEQEQEQEQEQEQEQEQES>t*eQ@Q@Q@Ph( fi4-Q wn{ѻހ& J 8p4QMPҊh((a?*լa?*h((((((+'s+'sίQ\ ( ( ( ( ( ( ( ( ( ( ( (/)~t!LEPEPEPMJƒJ!(%!5eX\fM4MHyjijajij<&ꌸJrPEĠӁNH : :2Z)i<Ze<M9]YQE( {iB]{iB)|" ((((O?ʙOGQEQEQERRPi4ƀ#5D@f]:ɚnU̙hjpz-+Tej[ <M<p54hJZ`4ZZJ(h++_F k+_F :( ( ( ( ( +/á]ɧBw2F⣹ =rOy~o$~ЛԷshv_yr&E컎ñ+}i\?+a; Y\?+a; u~5袊QEQEQEQEQEQEQEQEQEQEQEQE~t!L ep ( ( (=)7dOZCKM5hBj2iXLՓf ZLwnjJ^_5 Θ_4(7M_yH|jVZ,UհjEjd4L <x5IJ -0p5I%-hZGL]01 QVVWU\WU]QZQEQEQEV_4;rT 8ʦX)b=9+R##daVz/$Iܽ4!+Qq8}ϧOFMWD @}=2=>BҬ]:(%ǡǵ^DTEDP+(u* Y_iƵG±$QDcMJUG`#}5_ f((((((((((((S)}T( ( (M4@ơv$jۭWw#zi$i;O%Dd ѿޫyҽ=^"G *TWUҵH+TaMHSR A:ҀEP(PYZ]/0UYZ]/0TEQEQEQEQEkܨ2 X@ ^/$Iܽ4!+Qq8}ϧp##daVziiVP kSJЎڀFMWD @}=2=i2R2T`0PO#ZGo DCE5Uz'sίQ\ ( ( ( ( ( ( ( ( ( ( ( (/)~t!LEPEPMcڔSk444Qfƫu$lUiɝC]JI$y(HDoL2fmDZdө:D0-6?-Q]$Z#]Ur#]UtRDQEhEPEPEPEPEPEP)ᾚ3Zᾚ3ZQEQEQEQEQEQEQEQEQEQEQEQES>t*eQ@Q@%)44ƀ#sVަTn ך,jITeWz֣y)0oZpoz7=sR@zT\tʽLUTnzjb3[SRWՅ@/ZxL^@QK@Q@ektVektPSEPEPEPEPEPEPEP\?+a; Y\?+a; u~5袊QEQEQEQEQEQEQEQEQEQEQEQE~t!L ep ( (n =i -4ej'<25d٬Q U$~ҷZ3jN"9dUI,UwQ7H֐7CJN =[ҠҤҥTUZVhMTjZ6hhTj2jt9"ejUPjzգ )N ӨQ]q*3l(2・F u・F ((\kzeئ.1,IW눸]іΊDExB6*\L€;XIcY"utpYNA4ՄfmkqJU71mgjPEPEPEP)ᾚ3Zᾚ3ZQEQEQEQEQEQEQEQEQEQEQEQES>t*eQ@Q@4ҢsT2t Tgoz1nPi߯5FY=rj*I֕dR+zUD|٠ !)UujNhšze=t QՔոEXX^kU%Z)REPYZ]/0UYZ]/0TEQEQE7#`i'R8YYP]cv'ҳ+YJB+uMJ94ԱKoΑeiՔNF\zNm+JHFfb́dPQ@Q@Q@r~3]er~3Y@ע+aEPEPEPEPEPEPEPEPEPEPEPEP2/)=()-#tiN7Jf꼦?J1fEY޳~՛E\#Oz~X/?Z .o?RY?:!bҷJҫ+fV`JzWSOz,Z.juf*͒)Vc*c"Pa"uNjUVyM /Z+TdQE@QE}/0UW+}/0UWE/AEVQE DiZ2H ++FF\ߺp:vm^J" Or+S(|]ojF6cbpy9uz[ǥ7mu!9$?_ڴ&j_na}U+/á]ɧBw2F⣹ =jVW4+b*d ,b= 儞H.7so]_C392.ev\k{j]5N "I \.kڎksre2(k@ԫ #ֲh+}5_ f±$QD#MJUG@(((((((((((()}T|x?2((RC@ n^JUyzP;e]7^;VkҀ3nd⳥t'ɛ4')%Sjhq@nEXF1 sR)E XfEڭD SVKVS@Gڬ(A@-8R pR Z(++_F k+_F :( ( (m^J" Or(1iSҵ]JeVV tuZ4Km-gn CsI=r'㰿[کX3y}]^q* ڗ۷$~X|1w:~~( ww& 5ʹ.Hʉ<]Bo;?篶ºͦhWWVVT @Xz($=.'Vwn$ǂ 4xj[;Y/9S"v]iaؕ>+j:+ȣMT8Zԫ #ր?Ww?oFI:Q(HQUQ+:TQEs((((((((((((|x?S2Q@#t!)Ҝiҹ yjܽ Q,f7^;V=̜+Jұ.9QVn*;WRtUyJ4:t4ץZ̀ք}+)4\FsUakD2U52tQj/Փ%3VbSPDq/df> c$QS-FhC9zE9zQEuQEek{KuU{KuUKQEQ@yDg&|3;wcf$y4loY ۸zcM\-++^ p u{g<Ể4'[yv,Hz@*`xR ݐhZXM+`C+[R2W# Z(6m.h#oX ܁Ѝ(8Q@)PEP)ᾚ3Zᾚ3ZQEQEQEQEQEQEQEQEQEQEQEQES>t*ef4RffGU9yx(]ukҶnMd/'Js͔JعYDh M#YUZlQy@S{S3S$tFtƜ(1/kVx TLQR@IK@-%-QE#Z#@MQ@Q@Gq}`iݎ3ql Kyd'n㷡c:[z\7pXƚqu/".@a\_.Ook;²0^ǶsɫCwd-d"y+1Q@ʮ\V +:m.h#oX ܁Ң$Qq(UFS 91_ f91_ fEW8Š(((((((((((( e>_?Td┚ZSKzRRV$)945LcPIIҨ\j*ɬΪf5b][Kұc]c& ʜ B1ZR}*4kSV7Rl @aSG *QcRhōju_jtq:\b"bE4Nӊɲ5ZG24F2$jh2&=jAMZ#h$}Q]Q@Z#]Ur#]UtRDQEhEP\-ٹо:q?٣҃(d9 2 vWm^J" Or+/cnv6㑜_Sހ7|=%wn ufAf r{tڡ\}Jo  G펟_(((S}5_ f#}5_ f(((((((((((3@:_?S)BI SI(AHj7@5pՕyrœҀ0,xoaUހ2ڧvT@t8)N*T:Ҁ!XXUX5rL@%LBH@QO)@QK@Q@Q@ektVektPSEPEPE^M{DP!qEqfBC\KwfJ85- wH ˫4`X 1ۥa\jqj{U7MXoqz篩]^q* ڗ۷$~X|1w:~~(((?Ww??Ww? kE0((((((((((3HBsQ*l;L~a*:|xTffBk&@M%@M1:jYHNNa\qU^jMe\'Z͞'TV{sHV[=EmM9QÌqV:V.TJw%ȅ"NV?n*NJɲ?jSzRqҤ!*TʴJ@JV# 1@JkD3N Q]0.QEh (+^_`ЫW^_`Ы_((o ) c+"D#<%JR*@qR*Uj@)@KE-QEQEQE#Z#@MQ@Q@A}7K Ly1w{g=Esm- 1`C)h%[T''n vwKyL 3PҢ~Esm &+X1 ޥu <`ɏsèGuo|z20 E#(u*#΋@o⵨G±G:Q HRUQ ڬ 'sנ(((((R@ ILnf{CPK`j\(Q@:_?_)~uE(.( RbLPHRR@j(Ji@*ZiZڔ'a!@ )hPEPJZ("E%0iZcڀ#-Ij1@  \RbP( ( ( ( ( ( BZB(((((((?Ww??Ww? kE0(((FI+h4iM0 j2k&&z朥ԡzz;İ 8ZST U4S)qE!W e>QW mT)bblZ( BRi=a)zVmQI"EIIŢFVoҤǵ0-(R❂KZP=j%#M-ɸQE((((( {iB]{iB)|" (((((((MWw?zMWw?z(((( 4M5Dƞs@ fKƫPCm ]G7X@ԀjU )iAK@>_?S)BJ(PEPEPEPF(Z((Q@Q@Q@Q@Q@Q@Q@Q@ektVektPSEPEPEPEPEPEPEP\?+a; Y\?+a; u~5袊QEQEQES[:YUzXhCQrH cPSU'7oݽ*=(ԨL=L@K٩ThɩF2DөOhŋKMw$Z(/|xSTUۚMP)hR!ES((iVraqS=(LwJERQZ$ (Q@Q@Q@Q@Q@Q@Z#]Ur#]UtRDQEhEPEPEPY~' M?F kr7\+RMyqWwVF Wp@Xlw ?rOy~o$~ЛR͡}ʜk;KĮ 5K7۵8!<Y$w 5˒apQiurp @p;nƀ5heX`VW#:'?Р 's׬_ QBǩ\*mPEPEPEPEJkSFƀ#sUn,+ph ګ;jPJUK֞@nzը7"Bs@LLL@ J)(~t!L mQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ektVektPSEPEPEPEPEP_廇BOQe\Gr${DH.7so]W.4 ha ͎A'~Yݩm %[LA\ ň# ʏPCnd NLwbWӬ _OVW,W kQ:` q@ \?+a; ַ#:'?Ьo EQBǨ*gWj(qQ@Q@Q@2zS aU jHƠs\6"UdojVLZ4¢/Z,Ո۶j=ZE舫(xDsVH'SR jAV)-QZAKT!!@(W A[d+aQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Z#]Ur#]UtRDQEhEPEPEPHyKEd4)'G2g%}zVU h(S}5_ f#}5_ f(((Hh F{JSTlVe837Z3n,Tj~z6EhQ*I@ƼT)*@(E( ( |x?2'@ (((((((((((((((a?*լa?*h((((v6wXAv*+u57umNX5i*EC(f H5:,RE ajՎt[ UK`F<16\i\2QX=kM:` qI$H"* ud1"/V7u(E8TQ? 'sίQ\ ( ( ( 5ԤsLaqY&UU)ןƴ$Z*X3 ȸN gMknh5JXsZFV:# Ea)\R$x*(XAI#r)V6(ө-u<ͅQV2/)=(((((((((((((((׾a?*꫕׾a?*ꫢ +@ ( ( ( ( ( (9O 's׬ 'sנ(((EQM5UysP{PkQzZ&,%fH*zTSҪTF)􂝊Q@Q@>O?ʙOGQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVVKjVKu4QEQEQEQEQEQEQEsbusbgW^(qQ@Q@Q@Êa)b&D⠑sVTL+FeL5]OjŜaM9aM(ڂ,bƔT#)LDZF(U8V6-uBՙQEl (BOGQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEek{KuU{KuUKQEQ@Q@Q@Q@Q@Q@jkGjkEPEPEPEPHihM+RRb!)Iڧ&( R8 1K@((()}T|x?2(((((((((((((((_`ЫV_`Ш(((((((OßkOßk:QEs((()ȥWVEHFiW,b"+M)SbJD;(J|aiR SWLi QZ((|x?S2Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Z#]Ur#]UtRDQEhEPEPEPY~' M?F kr7\+Rm337f!>vqbOy~o$~ЛR͡}ʜk;KĮ 5k> aWL[#&EwHw!$pG|{`.Ţ AkwqI=1@(eXR0AEe1Od MWw?z1[ǨkIN0nlPEPEPEPEPEPIZ(((((()}T|x?2(((((((((((((((_`ЫV_`Ш(((((/á]ɧBw2F⣹ =rOy~o$~ЛShA1 8k|A:¯&i~pG,L*CHR͡}ʜk;KĮ 5UشA4 sN0 '*vPUe#P'NC5ƅ@m?+#Po q&: Q_ (QEQEQEQEfM_FvJ}.NIu )hI-QE0 ( ( (/)~t!LEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPVWU\WU]QZQEQEQEQERL[hĐ/(~U(( <+ huFO+J0 4 j(aA_G"Z_& (XkW OAL=kV utbrf\~>^A]}S7w|‹K1}c@?{YQGEtTP;GE{YWEEs{YQGEtTP;GE{YWEEs{YQGEtTP5/JD5g*O"hH]ėf@eE.qUCaٳkx"`JOO"D=+9D=(OO"*(OO"D=+9D=(OO"*(OO"xK֏]~YkV5.b(Dɓ6s{UD=+Zé]\,j65r9D=(OO"*(OO"D=+9D=(OO"*(OO"D=+9D=*mGjϹHtH=>NWaT#xm _,#O"'Qg]'QgG"Q@"'Qg]'QgG"Q@"'Qg]'QgT- mgU&]Πdkz=Ӵ[6pa q@ j?5Q@"Z_&EMtP?֯aA_],?5ic" u*4АVQEQEQEQEQEUK2[yn[gB켣AV($ q<:+J0 5Es j?5QJQA_G"Z_& ("ZB]!|PUD;+^i -. ?\s/???,?/??s/???,?/??s/??l)u?i.s,}XˮjKx` q{տD;+gJ6]0v",ڠgTY%QgG"_E"_%Qg]Y%QgG"_E"_%Qg]Y cc!*VmsW"L;g?'v5Né]\,j64YGuEwYWGE@swYQGuEttQd9GuEwYWGE@swYQGuEttQd9GuEwYWGE@qڧk!>"m' :W}FB 1<~r 9D;(KO":(KO"D;+ 9D;(KO":(KO"D;+ 9D;(KO":(д4k;W̚%v: j쎝ٳh#X E"Z_&EGMtQd?֯QA_]Y*?5hTkWAE@`GX u"Uc`WpH +~)EPEPEPEPEPEPEPEPEPExToȭE)n 1B::( ( ( ( ( +7\:,*I3Lx%=ꎇ{x5CJmr -Q<8(((((:f;5.(dDRFʉ>o ((((qiCc$ 8Sڀ:( ( ( ( ( +6{8|ԈH %)7B>q$eCEqj<O>PQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@xToȭE)n 1B:(((((ué Jڒ20 ǂYzހ4Cޡ]^ 9ǖ[vQ tQEQEQEQEQHx3\wgޥ sJHQ19`G򁜓@Q@Q@Q@Q@Q@x_,&JR/:IAq'>u4QEQEQEQEQEs44corֲ\] A$xtVк_P\Z窅SϿ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@cifC40QI(((((( ?j0M!P. R9,,@ =ПJ~`^h21IV$s[PEPEPEPEPMpY+mb88)Pqe_Gsooo0F+8[A,\?J((((+?XmB8M;PdS"`}+B/f֮{afe;xbg-xEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEkXޭ[]\~kkgHu8YR"I{Dž'pNG ڬ]A֡cb/὆4t,m7׎Ƙt۶K3C 8R6+w('XP{gGsfN  '$ppy\jjW ymͱ%ջ=;Տ6>G z)Z(((((((((((((((((((((((((((((((((u-z ճKk˟/xccL+Z57_,lE7Ǝet݃pTҀ+O]K`I'o|"I990cjy+E yWjF @nƘt۶K3C 8R椃F^A5Ͳ+ !"=#s6fMF.q}T--sOkj]`Rx> stream AdobedC    %,'..+'+*17F;14B4*+=S>BHJNON/;V\UL[FMNKC $$K2+2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKX " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Z( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( |};ZkAΥ1\O"hϧ]uq/tx twJUCs< C Eo/tV+.ǚoc MM~W.],lT0ppUF/n.d^=O}xYY̾ @_T>oxx"]i퇓9wx?v|]} TN՞bI@n[.G{-  ƻču [b @g sU5\y[#T#uZeZF;xA=OIW𛯈?Z>%<3u..+U'n7hv:5sImBJoLU/x}c^@Iq$ 9t .^  ;vm/YP] /)wBO@xEfhtY[`3P\xöe6 έ>~u"_|m~~`sccՌfOOiKI0l>ψ8ԯcK,Xz8:mo<-{ڬqd}O~\NWj+!;wۄsۥU~OFvi*̗VYw=OҀ7Y;'ZBQ6yr=ǒpc @@䎄gڴu|I z{杢Z6y [$9?7NOye}[iJ(J=4_[h߱\ƒ|}V[_x S*EHGO~}h>;BsoR9H` A޼>?f Kv z+䷆NIRƞ;N8O*U* =J߉z|fEWa3CBi Icz=X ɽ,4a>4çY͝v1w0ժ(;X-Ta7Sbh%: IEVӬm!%Ulr.l,m?wV Fv6 D ^8zS%Ѵɮ>.g$Ϛ)lqEWG{kBp?L]2ll}KWtPIt ᷖH Dch=chxk'1Պ(^5кKJЩq4>->P_GfRM$v#0 C}fY}06n1zECsimwuorD ci[Ckvh0ׁX* 2XY[}}yՈ(c*"@Ϋݾr&6]p\æ{IqY][-͝덱I t#f&)#EB+H"!H*B+ZiV/+Z[۴( S՚((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((nRoYK3cm9xd]"BeVE'a:sֹm|I&5+^[ r['ڊFIGQY?0?PTQ\_]b;R)v8M/u/UO GM;3'Alc[t̗̗Bb3%j?%jТ3%j?%jТ3%j?%jТ3%j?%jТ3%j?%jТ3%j?%jТ3%j?%jТ3%j?%jТ3%j?%jТ3%j?%jТ3%j?%jТ3%j?%jТ3%j?%jТ3%j?%jТ3%j?%j43;2_ _֥˗F@geA]K?eA]K?աEgeA]K?eA]K?աEgeA]K?eA]K?աEgeA]K?eA]K?աEgeA]K?eA]K?աEgeA]K?eA]K?աEgeA]K?eA]K?աEgeA]K?eA]K?աFEgeA]K?eA]K?u ?jO?+GZc?2O _֣2_ _֫ޔblbNGZu$ Q(gMA]K ]-i8AJ( +4L?+\-MSZi8j?VY)Tb?Ik ?V8+V2-Ie d?%.̙9P93׽tgW`o4Йoc*@(ͦZ\Io#x\wڵO j?u? o_:Sܕjɧj >ժkQ)Wg\;Z?ŸijjX:5q:H)<1?/Bk*imTe'%4QEyHQEQEQEQEQEQEQETi)4$Hw 82{& (9)?o“J٪(QEQEQEQEQEQEQEQEQEQEQEQEQE(f Z)\aER((fLd;"I@X~E&nIP;Fi7hn>;Rdzy$(Q@I7JfM'>RLZMIڂI &HiSH)\vX Q$,FX0(OZJERIIE֧&3c"*| (9__BUy $s\g.?#7\z8Ex>qAM`?&]ّCCk,:Όw$B@+Bo ʲ*;(ΐ֒]]"1sqڬPEexJ ׈V=l`MjPEPEPEPEPEPEPEP!'X]R[5@QE ( ( ( ( ( ( ( ( ( ( ( (C1ER((JJasIBSKCHu&L'֐(ILi(=h*-“rQ4n4B\w4!nh=jғ|ǽ&jy.{O=@_թr!qPoa@ AH\%!c!1bzi`;%&Rb㰦'ڢ2{PW)%EM|֚\E! I=M%P1})_Z)sy֚2wQEYQ@Uw6W wCz SeZ?s݅^2=K)A?uEuA?u^x576 ĜҶ/ AeU{wc?/k'V 9 c&[&ksۋW)Tˮq]MWm$̂Ln]g=G=E67!imD1I<ǭq#~<ߴyo;?L~Z,>o͋j/5`áeG@Q@Q@Q@Q@Q@Q@Q@?kVcxsvaIlQE(((((((((((b(QEQEqM'4SXₒSKHOsL-Hibi&G\1Bs ) ^="?4=>koL1c^[Aaj< Hq?,;( (9C[vmnz6k]Z?bffs٬zX~oFczԢle=,?75]fǔ[9ϽnU GB`f#q(`(((((((Ο,:}\{=_]X^iRظ~M1\g$|+YhnMʲrs U85BMԧ֢fF+R 33сf @2xeGY_&3³%ıQ9%H8kß뵿 O+f(AEPEPEPEPEPEPEPEPEPEP94J)1QH(M@)摢@Nj2ޔ݅FͷH f֣f&͎MF͞(6Gy3Tl~TI p&g'TehLd'}ΥomqHpH6~b1z.ǽ(r{[ Z(+p֢bĒٖOn9q9@"RlS޾`up#NR_3ڐ{ zEuy=ċQJᑀ*rxOQ-,m[<,yҭxd_i" lX6W;qfjM嶝&N${zuޮbW A-CIԝ&F~i8'5dti 2޽ڵwQUeF" PR^)XR++OY=iPMrJu~%2!4{ASf3c* zo??MUYQEgQEswUgl;U⹽ڧZSAYuBdHݪϕ7FS|)Ӣ׹fS|)tקSo i)9sEoVv`f[EWQEQEQEQEQEQEQEQEQExsvaIl7?kVPQ@(((((((((E**FQEO&1ɧ1R) cژM cRirqQHy#hNt ho5 Rp2jmƑB)ֲmr X\CDG'_n@px튼Ic+XCUm0߹>p{ܚn.X.H RNӢ&zΒ) u 0 cY?_kbdĮQE"(seV_al}گV^f. .l]G!A=ȩ~] N 3=v 9黠s>n$iq+%Q!!1C[XKۼ$^>3*U>y8󎿁QVoi-%KgT1=OTe[$VB7GB>^Pk6E2-Ry|ͣvޙ}"€pAsKHt})h ?aE=Z6H =O6AAc+3c: W_֩ʊ(8(c:hfGАXO}P4/*_:Ъtѽ2>ۨGuO^^m? ?wRZϧnڐ"0'']e_Zߕ5QEqQ@Q@Q@Q@Q@Q@Q@Q@Q@?kVbt6aIlBnF@QP---dzEQEQEQER%*c(EPzSiZ@<:i5DN4<⢐#XPԒ*8ZGDQ99J MCH$r՟YIXIkvG_嚼,ipNTՙi^K+xd1`2ttQLS5h!`M-! #A c<ߘ-?(29AdQT/g[0'֟f-,WC[ph6.QESVF}3,ӡc?Ȥ6Weʥ^In^teD{թ$Hi$uDQT"+Hent}IL&$#GpjSy .-0Qtk۞;ѩܘcH@Nv#~yΪQ8e>Y05wpHgT0;\@B0)QEQY3yճZ!Pxo4)X֢g}ѷOjM] TW lU8 Ԋ2@ͲH}jD?JmL)12qRڛ5,c1ZbL?j2j:g~jy(sQ@׏$ivr0bB)b~nr ٷ7[^5ATu6K2mMoڟ .?V pFy?-Y߬ڿ~skkih7٤1dp~HܞmŴI&1 nߦ5M)n-ಫī2x9N4&) LI{+VfbX{^YEy'ηh!M$G5 2T; +^~heϐ7oȮR$H*a>((((( ?"vտ6'ry+?O5uoA s+o |p>5i`CrAʐzm;únsHYpW/u,٘`J3A UEp Ƨ6 qvֲ4&['{Z?'LFjvSwQڋ\ޙڍX2}M34dfj7Q`iwZn>o>Kz`$JTyT@8?+ }9[jӪ@pE"Ԍ)-#PTtQ4C[F>'&THxD Ns<⑼Pp3PT1QFȊC7?J^HU{ KqkIb5b i=qY3}(C.*e~m ֲҼYwB`o؀)9%QBy>ze5M/۰G&I'S3WDh*O K8́VK'Ӧ88xp~-Q)"_4݌[Y<ؠlE%TSzwZ͛^}177MѢz`{`ʆ9"%S ѧB#Eg^x<$QT*!x#Qi Z:Kf[c6r(e8AT2DU MI+ ?l+Hsf ֑Лo#B) RE`(QPZx>Tjz4BAXzp[%Ķi ]8TA׫c}kvd*HòOӮ&1c,c31vT`b'Rf2c`U[}ʩO֙އSES0 (9Mg44@7VW$7`kƟaa?*+H=_Io}Q 6A?ڢF/$7`;T4 +Kj1U<'ֺ'|h?݀Ġ(((((((((N. O+Op#HksJMth{ooI{ǽǽC{Ѽ{&==ލގP6FPyyrz7z.O{Ѽ{;ǽǽrm֗p7]֗(\::SךV sҠ 8tLlj%lNPiT`fC KMi,aHii!QJ{uۭ#Hp*68<2qH(i8i#xrj)X摪BTRzTv4N-g\V` JƲ#FVSGd6<ƻa:&Z-KhFzcUuxA{eun} |3)CZ},ZI$1%P3@(gAy$T1ғe #d~ DW A7=IcLvqf#'n{'?ZڍƮT`=qM3oH[$pc´d{D@%l-`֡Vs_T=|W*A+mDc)d2Qr'A%-ruHq`ǩ>ZȲƲF*GpjVʡU@ xǩcڛs&8X 'SAשr,0QSim5 x5R7~4)Xت8R|Έ[b<}i]ظiI`mA ߈v㡏!M2 'nC[Q@E4QE"}wmn#}>g2.-Jcdc>D9&g(ET01Q2J[>08ڵ,cRcP01LATd♌_J2S0lrƙ_Zj_1:(QEDOyQ ޵WcM_~4U{u PFA`H? 2ƛA OGƛA OV~g>߱}} c*o7Ʋu;-ƭnv cJA~V7mZ("U=M&+1Q@Q@Q@Q@Q@Q@Q@Q@Q@}ksJЬ=րҮM{JX֢HYGzro0{y&Ez|ro3ڏ3ڠ2z FQ;mcFg`,pSOQܟ*A`pAAC}K7ZF# r={tuK̶j8X?<=mqR WҮ]} r)+$d֨]لh4xɈ"ǥK :Yr.ً:OqrCJ(lQEeB"AGM]k <̿#}+RjH-mdr\ h:Lͦ0^s S3l.[b<{x.d@DBjOY;%Qه=G4/6P1*̣ <MMѻ)(FTdq)QenRKb5(4d O& F3ŪzgGjꌚ??A(@QÉgЃB/E1MGjGt_ T'OT*?\'Z}+_wE>:uփ-VRBq@ET((((((((XK(RU m}3ڱ'jPjG47B#B@\.p3@R3R@P2IeO^do_)Eob ŃX<-͸+^x.UWuȭyP88^ٮMEE[s&s:L2zSK޺lEi7QQu%޾+ސ; ,ggGEArO3ڏ0z,KTg+TW#5i= 0I?+fr=E`¨in'IH*$' }*P{pKC,)L"yMSYIjUL+GAO/j}dңJ{TLzED=Wp*nǸiX5~0.5Mou-M$B )t1~sIij亐6sZԮkFuK)Zt0+FG:tqHY=O T:*Fh#!}XzF\EW7f@d;%Qه_ø"IUKq䑙lS; kHF;S v{ֶO̓(R t<r W@+-^3>#K>=A\I8^>&'A'3~gRi'Ҧأ/NnDjz^iI(bROX< 6"Zzo9cR9HM*ZS=i9~ ROJW)J@"P3Gz}ɱ@:3~K֙:J(Q@1];0Ufa+Hw/ &_*VW"Oe_ILUV|UAſV焿/Yc2VRZgn2{}(ER((((}K"k,gˁw;}Fk 1^[qmk2 :ڂ{|U.iǑ=tG#X(;eqduOG%?Bӡ((m?#Jo*gmǎa)kԣ# nQElHQӭ5o֢$W OaQUd+27ҐE;֒(o`Xn M]X;:esu(KT [) Lcyᗨ鞇=VIcX,RHo[a 2L}>AiRUպ[[.-;}|L潎͡M4c ^qO!T&X,2bQqL.[lkmU"Xp~<{7tGi,1m RQp}?kG&֓.-U m.qUG|éBhpy# '$U[nӱF;.&& VX+:XVCi$]֐Y%%Q@(@8" @Sg) KvOAR<.x\?Zz`*AH֤U'7!}jEBz*j@f4SqJ:S2r zSmӨd6bogGkBogGh$(({iBuG :nF*GCUOh^z?:OT?ƀ5şt [?#cxE t\]߿@̻v9sQY[ UڡFH{vbL5D$9cV}J-_NdyO żElך6vH3:;H`G4 Ge6wq5.1 c4~*xxLqt%*'F rC\ Y\dV: oZa+=Fh6DNJ R}p(Z( ( n|Ok[M'Qې:l<&X1k dI;&亖78.%8qm>:;[`3* 'eJ8u5^NZCYUp,ZC=k6.aOyœF[sN;ZU惣MY:43@n݃q<~T[C6U?s5^S4œRJAXʼn'&m8sMVQf)yFAp-R(mN~?֕TdڨgQ8?JdԊݲs>\`&+l6t Ou?^YY\d4;G1~n ҪcwS?n6({sAO cb|Y@ſScwS?nu nSV&O?*ƁX*( ( ( ( ( ( ( ( ( (Ŭi? ƑVf`vaA54&V?kp[ &D)QEQEQEQEQEQEQEGq2+2q{{YTD^`.7asqXՌnGbק#m=9-/zf _(z-671_ ȧZnMIi`""5o4:FeP: zO^*N s!T[S,~ODX^ nb1qdUAf׊f3&m]jsNyO^)t4.AR*zӕ@*EOZrxP>;O LhRiҔ 3'!}izRxƅtւ ӀS$(((q@Nh`sT5OgGjP?iGKERQE=4T[>omȲ *{~P\Mz+#n?Zo(ۯ֛EYM^7d㕕 L^h_mַFOrǎ cѨfaEPEPEPEPEPEPEPwEu\F"tai-5@Xү@Q@cXOZT6Z^uhe pR;zWGl³ÑqUsm$,Jޮ4wbro2yC]8' 3W*Ayqr`#9r#Ӑ;W (AEPT5%ı3;~5~>RXA)" =gnU25*Yw1+Ve}\K+M*V gc^DR\DgME(I;7QQCW9X@JhunYZZn%6屻ʌ.q8j~*qY%&]GxX:uw%q $EPפ [F7ݸ23v)r?Z$^ҍ#r}=?N|c6q=:'!J$9I^ţVpjIS+n#_[te0Nђrp$֐9o,mo^[Cqme8&ũ4y|QskVz촰I$8铁|P!dKD!R:q:V5FQ>ִtcU3L SL>߭hx}JV-U3G:(~XjQi.{U+!*y~Vҗb]B)֬1NĹ=)=MMz҅F)=iM(QL!z p_Zpւ)}i@(€3Nd:QE(((&Ri((j??@-QR0(yBT>:2 6ҋ6$); gy'Ic^ӿ&O"?]];d(45Ŀ^Ԟ~>wVf&#շfcGc(fEPEPEPEPEPEPEPEPEPBqkG31N''&_k_}{?iQElHQEt! R8 Q<3G2 wҪ*5p[̍ļE`u##3֢Ri#N+=#{KM&Hn'=n4)Pt! UM2W!s.1  5Kv1+->d;rʪ^@-KycHVSG{3F#dV zMeyALFcY^c[)̉9ܳmqHsZ2]Im;Jup$F+DE(R1@d.W8=y݄[K0vWh]]WVzP)Jr!aj[Za.?TVGIJTnMpoQϩ?XѰ'u6:oߧ=k74I:b`8#+;CYL=ă`}@^1u'QXA ҦTwd0C{m%k,2 2M4 7K ud!XNI'օ|pjeb=g(!^I?u2VO²p)3Ad*EbUˡU$&w&* 4 TwS|p"d>]]OGX|ˣ˩d]]OF d;=S`QL9KޤsJ~(WKEP ((BhI4E0 (((j??@-QR0(xB Mz]} TݍwL-W6Iآ_Zm?‘X"ijɴ ֯ntQ&"+ɛ;' >?Ed}Y4_?RJG0ZK8KXZ@}N(/hn-h}\ 5koqsu'@ޏwą{U ]wI`,n&|+f88uƃ>H%`W+Oa\ 'ѭbӦPH; rp((((((((TY>T^ȥd{^6G?"0pk:j<֢QTNd9RR*Kf.awI2,>ȊDcК{QEb!bQj0yܠ#z0V$P#rIH)1yS3`@qxڔ,`kC2y"#|LdUT4fdEVn VU aZ`Esciz,4G&H~SFx^ta"!<.rK0N+?Ws$eWh9ǧke-!P3ܾCvP\ڥF,șpFzƧjZY?Bs^) Ac@ ǷAK=ԭ!V"F@#KAٚtBS(?2kkpkp3S)  Z1/=H|v1g N@b2%sA85fTJIE%*o=XJOWZrʸ>ƥG^j #Gr:IU!',C_t/֨ ;p؊ܾ%kun)O+A3~=6(8.|/esq3KĂYRLC+rF3@ ERLKϴK4]"{wlƣyVy.o "ne c 2qNMmQ@Q@Q@Q@Q@R0 =Ze4 e Jm{V7J AHHDhA zkGN-qlgÐOq$=7T;eqduOG%?Bӡ rBII5OcM_# oK嶶xW ȄW#= ișu-Qc5E r*zssZ^Eފ{c#"\Z 4^'c_d j" kd&|wwE, ,f R\U(J (Q@9XEL$ڝץWҧw'ýp+ԵuQ.!*jPOy?YUQ\y Q=>G{g Jd0wc;sVC'j-#ef޲/ XLJ%ӣ,䘴 aI{lCF,zM+ +QtGrQHq'NXmfYWp<{u g:WSS\{ARItI89?C+/fR;ʤDXQ*(ª=-k{(()M$A!)|j-~u6h,qoF8]=az֥n5scxy~B. :)X (:Q@Q@Q@Q@Q@Q@P?iCT]ր:Z(aEP9YS>>CHU%$R݀X_۰Ϧ,LԢaMC(݇}5o̍JB4۰ϦFRQУH.#TXS܊hr3h(((((((((;uΣJo*jB:bֽJ/F܊E$Ny)b}GŷvڼG ^D4er8'=^V0^(QP%Cv.Xk::2:Ҵ&*+o;nDW{gp1ǽ_V 峑GZ#nf}@G*(!U6ؑUs+,HŽ[bb0Ͼy\!reSq۟*"7(lr2:RQ62whw2 zVk /%mRLg8ku6Kp!oH\$slu8kw}%RjSیҴ25p0s>oRxey|Hr8^?~=OW i^exad!@'2 "%.0@ HWCI% rq1Ћ=zVo$!,ag׌b,cR @4+VEU(lD靻Յqm{$KV_$%є?;VӱZVY%j~ERVQHdLa~bөX~jEpZ 22{QJ.YWoR~lB"c&G^GAӏCu5eyRH+:z5ΧInJb:TۅVFMURUIv5C,)ȧcҠ5-fDnơFiC%+cLVjFK֖Vҟ֡J P-GN J:JZ@QEQEQEQECT]֯ Sv_ZhQ@ߎg_UW Jhp} cfH4oR3J. ? ~(MOh47W °3I ? ~*ޫg{hq]Ʃ`ÌQB3%=V(<Т(((((((((ͭZ#S1Vֿ%7aiz4eyj*u"L2KX|[#\0qПaWh{ͼh }x &uXp N+VE+>)Ȗ$ 77 qnC!fD,FJ:lzOTG;@G2nbqv-6I$/#*(p: -Ŭ!{xnX'eq"R2EFSUݾ*eɹ q9I4V vlG𧮧 &f)ߥMZ-}۴E.Yv$z ~P%%-6HĀGQ`z q1(<"bt+{D˄9 }@#VtTJVhj9ʗ|6(8~'zMU .Q1"QFK&yҵڍ-ncFO[7q“ƴ2:sM֪*Mo8h\NCkg<`z:m" M#upGzw(((GV( U&+Xڞw /{vNݝc[7P}>wsS`g8QY6)\Z[DM]#5!AMPTD 89c?5KY1Q!djU9p}62@pjPr**U85,dl})#%KQGJx`jZ(8H (poZ,KH((j??@-QR0(? [ m${ fck#ijY߅iEܽEQ#ih#ii\^K?/ ;oK_Zާmw5H qB3%ާQEgQEQEQEQEQEQEQER3RB$*g~]܄8c O Y(ά?ZU20j3y*e-`⒦u=2HXm41$JcyiSW{E:jmQZ((( Q@s. KĿjٱ̝us޻YYkiF@zt=F hYŸ+znKqm]٘55NPlؒ:)H IT ((((P 89( *§*z^TN@5yǭIPjPr2*Dr1NAJ"h 4ZH )ၨ詰h#ޜ xb)`& E<0>Ԭ1QE ޴)%qN4Z( ??WꆩLtQEHŠ(g*߈,Gf }IskRGMECo}~"ItMTo#Rj/U+ۨƩiG1j&N١Y ~[]n*Fq׊49ghvV- RjNѥXԮ }x@ZmN?ע.%M@}RCE+)^DhhU*}CUqQEQE@׶8aY2=:[` Whm64QE!OPTzT$gGGJ2zrLV=jNzP*%b"?ZJZuCJ6`HNQJL=(i+(b)KSaQGJx`jl1ሧb>a@8x93~jKET(""ɢ[ekAdkͱ+o][?ιzx$]ʿٶ?m~(ͱ+oV;cثc>V¢:}8[HmB%lF~ hhƼWc p-gRYo]F$Lf<--ϱCWiX?tGCʅSY-0+ ( ( ( ( ( ( (8OSZfS?N]Pz" )Ji$L #ޛTuؾ9P{RycުhǽOzZkZ3 hD2>rѿ!4ц"T=f(< (((((((((Rn2?OVj OWo,4‡51OJn1VH#Zh=V!=)6z` >` A__b-ލޥvz9[ҍҥ== `z 0=KQ{p"=) Jc4BPjjZ1=) sRdpj)ZJEZb# QhN z!I?ɩѕ]20YNAI=ah`QEQEQEQEm6-c#Y ~VszoVTG]x8YMjNx4VhQE@Š(aJ J(e`–dҤc ((IQԓH RW9xN[Fݱ0x=<]gM }=2@MJ4R Ddfjt4ꑎCRTU-KQEUTOgGj*LK*FQEr?SȇWqUG &=|1R!IQqUfG?"O*ckZғï55-oE0ӂ&C袊炊((((((((( I3m%-&g226qqo"CRnNa/5/QԿ#[Qv"GZEmQoQE?juQ,wt9S< j:j&(M9oA/Ph&("4oAg(+SX}յf.dmcڵG?եYն !+Ze7lu^M^kK÷7ADP?)U-@.d7d(̠=TҟMBYJ1'8>((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((endstream endobj 167 0 obj << /Filter /FlateDecode /Length 1692 >> stream xXKoG!e~?|I@Z@9 ]B䯧{ff̾[楴" ;BS4 0o[ =& :֖r" 4<0.e1<ׂ2f dAi=.({'=eMܤ1ZvѦb”W=!8r` vš6P^kmXZ ɳ ތӤRU O/,e8gY"N)C&iϳxUdqy/X@=,3B,8H{Ͱ`On5fGbx9*gq'F6$*ьٌf hp+ Y0&Y<ݦG,M VKl(\m]>\p]A8ka5İL:9rᕲgF6d{s0#Xt mpxֽPm&qe]Gq0ȝ2^:҄ՠ׫zMbk͗c`2G1V RWPp%cM3^ߒMMtIUA™mWFy Ft"cr72i5RgލH(/#, 4$Z>}ɕ}OhE<1?n>n ҽi,Ĉ<;vú& ACَc (L{Z9(pp.۞_)kt,W'(7 d'!OGH]C&!u@R]qJ֣;ԣge$yg7m rɝ}oFS)XAfi#Qnjq=v͆v58ɸ/2l@cgp(ӨP`tG?Pן ԵjHsdy4 }jFמ {Ҙoj2~`aKa 0C7n`3<;y5fd kA{+ _ՈUVҸT.I-y !S4j&~2fH2M5Iendstream endobj 168 0 obj << /Type /XRef /Length 178 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 169 /ID [<6c681d28cc9d4d7aaaf5f3c2dd5a7fcf><1b5a7659681391648308498c1afade86>] >> stream xcb&F~0 $8JA (.^w@ƅB(.DbAD%H RD  d\ "Y@dd\ "Xd)d\{"&o|``ۿH`GA$ |&?``4Ȗ -ݦb?c< endstream endobj startxref 202543 %%EOF colorspace/inst/hclwizard/0000755000175400001440000000000013024270417015543 5ustar zeileisuserscolorspace/inst/hclwizard/ui.R0000644000175400001440000003245213024270417016311 0ustar zeileisusers# ------------------------------------------------------------------- # - NAME: ui.R # - AUTHOR: Reto Stauffer # - DATE: 2015-05-01 # ------------------------------------------------------------------- # - DESCRIPTION: This is the shiny guitar tab stuff user interface. # ------------------------------------------------------------------- # - EDITORIAL: 2015-05-01, RS: Created file on thinkreto. # ------------------------------------------------------------------- # - L@ST MODIFIED: 2016-11-16 10:03 on thinkreto # ------------------------------------------------------------------- library("shiny") library("shinyjs") # - Configuration ticks <- FALSE # to show ticks or not to show ticks # Note: these should be set to the config of the # first (automatically loaded) palette. If not, the # functionality will be the same, however, the color # map will be drawn a few times whlie the script sets # the new Sliders. default = list("N" = 7, "H1" = 340, "H2" = 128, "C1" = 45, "C2" = 90, "L1" = 35, "L2" = 95, "P1" = 0.7, "P2" = 1.3, "LEV" = 3) # Take default argument if set if ( nchar(Sys.getenv("hclwizard_Ninit")) > 0 & is.numeric(as.numeric(Sys.getenv("hclwizard_Ninit"))) ) default$N <- as.numeric(Sys.getenv("hclwizard_Ninit")) # Define UI for application that draws a histogram shinyUI(fluidPage( theme = "hclwizard.css", useShinyjs(), # ---------------------------------------------------------------- # ---------------------------------------------------------------- sidebarPanel( # ------------------------------------------------------------- # Copy the line below to make a select box # ------------------------------------------------------------- h3("Base Options"), withTags(div(class="hcl-selectoptions",id="hcl-typ", selectInput("typ", label = h3("Nature of your data"), choices = list( "Diverging" = "dive", "Qualitative" = "qual", "Sequential (single hue)" = "seqs", "Sequential (multiple hues)" = "seqm", #"Multi hue alert" = "alrt", "R default schemes" = "base"), selected = 1) )), # Copy the line below to make a select box withTags(div(class="hcl-selectoptions",id="hcl-PAL", #selectInput("PAL", label = h3("Base color scheme"), # choices = list()) selectizeInput("PAL",label=h3("Base color scheme"), choices = list(), options = list(create = TRUE, render = I('{ option: function(item, escape) { // your own code to generate HTML here for each option item var tmp = item.value var imgname = tmp.toLowerCase().split(" ").join("_"); imgname = "images/pal_"+imgname+".png"; ////console.log( ""+imgname+"" ) return( "" ) } }') ) ) )), # Examples withTags(div(class="hcl-selectoptions",id="hcl-EXAMPLE", selectInput("EXAMPLE", label = h3("Example"), choices = list()) )), # ------------------------------------------------------------- # The checkboxes for additional options # ------------------------------------------------------------- h3("Control Options"), checkboxInput("reverse", "Reverse", value=FALSE, width=NULL), checkboxInput("fixup", "Correct colors", value=TRUE, width=NULL), checkboxInput("desaturate", "Desaturated", value=FALSE, width=NULL), radioButtons("constraint", "Vision", choices = c("Normal","Deutan","Protan","Tritan"), selected="Normal"), width = 2 ), # ---------------------------------------------------------------- # ---------------------------------------------------------------- sidebarPanel( h3("Color Settings"), # ------------------------------------------------------------- # - Show HUE # ------------------------------------------------------------- htmlOutput("colorSliders"), #sliderInput('H1', 'HUE 1', -360, 360, 0, step = NULL, round = TRUE, withTags(div(class="hcl-sliderwrapper", id="H1-wrapper", withTags(span(class="hcl-slider", sliderInput('H1', label=NULL, -360, 360, default$H1, step = NULL, round = TRUE, ticks = ticks, animate = FALSE, width = NULL, sep = ",", pre = NULL, post = NULL) )), withTags(span(class="hcl-slidervalue", textInput('H1val', label="HUE 1", width = NULL), actionButton("H1set","SET") )) )), withTags(div(class="hcl-sliderwrapper", id="H2-wrapper", withTags(span(class="hcl-slider", sliderInput('H2', label=NULL, -360, 360, default$H2, step = NULL, round = TRUE, ticks = ticks, animate = FALSE, width = NULL, sep = ",", pre = NULL, post = NULL) )), withTags(span(class="hcl-slidervalue", textInput('H2val', label="HUE 2", width = NULL), actionButton("H2set","SET") )) )), # ------------------------------------------------------------- # - Show CHOMA # ------------------------------------------------------------- withTags(div(class="hcl-sliderwrapper", id="C1-wrapper", withTags(span(class="hcl-slider", sliderInput('C1', label=NULL, 0, 100, default$C1, step = NULL, round = TRUE, ticks = FALSE, animate = FALSE, width = NULL, sep = ",", pre = NULL, post = NULL) )), withTags(span(class="hcl-slidervalue", textInput('C1val', label="CHROMA 1", width = NULL), actionButton("C1set","SET") )) )), withTags(div(class="hcl-sliderwrapper", id="C2-wrapper", withTags(span(class="hcl-slider", sliderInput('C2', label=NULL, 0, 100, default$C2, step = NULL, round = TRUE, ticks = FALSE, animate = FALSE, width = NULL, sep = ",", pre = NULL, post = NULL) )), withTags(span(class="hcl-slidervalue", textInput('C2val', label="CHROMA 2", width = NULL), actionButton("C2set","SET") )) )), # ------------------------------------------------------------- # - Show LUMINANCE # ------------------------------------------------------------- withTags(div(class="hcl-sliderwrapper", id="L1-wrapper", withTags(span(class="hcl-slider", sliderInput('L1', label=NULL, 0, 100, default$L1, step = NULL, round = TRUE, ticks = FALSE, animate = FALSE, width = NULL, sep = ",", pre = NULL, post = NULL) )), withTags(span(class="hcl-slidervalue", textInput('L1val', label="LUMIN. 1", width = NULL), actionButton("L1set","SET") )) )), withTags(div(class="hcl-sliderwrapper", id="L2-wrapper", withTags(span(class="hcl-slider", sliderInput('L2', label=NULL, 0, 100, default$L2, step = NULL, round = TRUE, ticks = FALSE, animate = FALSE, width = NULL, sep = ",", pre = NULL, post = NULL) )), withTags(span(class="hcl-slidervalue", textInput('L2val', label="LUMIN. 2", width = NULL), actionButton("L2set","SET") )) )), # ------------------------------------------------------------- # - Show POWER # ------------------------------------------------------------- withTags(div(class="hcl-sliderwrapper", id="P1-wrapper", withTags(span(class="hcl-slider", sliderInput('P1', label=NULL, 0, 3, default$P1, step = 0.05, round = FALSE, ticks = FALSE, animate = FALSE, width = NULL, sep = ",", pre = NULL, post = NULL) )), withTags(span(class="hcl-slidervalue", textInput('P1val', label="POWER 1", width = NULL), actionButton("P1set","SET") )) )), withTags(div(class="hcl-sliderwrapper", id="P2-wrapper", withTags(span(class="hcl-slider", sliderInput('P2', label=NULL, 0, 3, default$P2, step = 0.05, round = FALSE, ticks = FALSE, animate = FALSE, width = NULL, sep = ",", pre = NULL, post = NULL) )), withTags(span(class="hcl-slidervalue", textInput('P2val', label="POWER 2", width = NULL), actionButton("P2set","SET") )) )), # ------------------------------------------------------------- # - Show NUMBER OF COLORS # ------------------------------------------------------------- withTags(div(class="hcl-sliderwrapper", id="N-wrapper", withTags(span(class="hcl-slider", sliderInput('N', label=NULL, 2, 40, default$N, step = NULL, round = TRUE, ticks = FALSE, animate = FALSE, width = NULL, sep = ",", pre = NULL, post = NULL) )), withTags(span(class="hcl-slidervalue", textInput('Nval', label="NUMBER", width = NULL), actionButton("Nset","SET") )) )), #withTags(div(class="hcl-sliderwrapper", id="LEV-wrapper", # withTags(span(class="hcl-slider", # sliderInput('LEV', label=NULL, 2, 5, default$LEV, step = NULL, # round = TRUE, ticks = FALSE, animate = FALSE, # width = NULL, sep = ",", pre = NULL, post = NULL) # )), # withTags(span(class="hcl-slidervalue", # textInput('LEVval', label="LEVELS", width = NULL), # actionButton("LEVset","SET") # )) #)), # ------------------------------------------------------------- # Color map plot # ------------------------------------------------------------- # The color map plotOutput("colormap", height="40px", width="100%"), actionButton("closeapp","Return to R"), width = 3 ), mainPanel( # ------------------------------------------------------------- # Main panel which shows the plot. # ------------------------------------------------------------- tabsetPanel(id="maintabs", tabPanel("Example Plot",value="plotexample", withTags(div(class="hcl-main",id="hcl-main-plot", plotOutput("plot") )) ), # ------------------------------------------------------------- # Export panel # ------------------------------------------------------------- tabPanel("Export",value="export", withTags(div(class="hcl-main",id="hcl-main-export", tabsetPanel( # RAW output (rgb,RGB,hex) tabPanel("RAW", withTags(div(class="output-raw", htmlOutput("exportRAW1"), downloadButton("downloadRAW1","Download") )), withTags(div(class="output-raw", htmlOutput("exportRAW2"), downloadButton("downloadRAW2","Download") )), withTags(div(class="output-raw", htmlOutput("exportRAW3"), downloadButton("downloadRAW3","Download") )), withTags(div(class="output-raw", htmlOutput("exportRAW4") )) ), # GrADS style output tabPanel("GrADS", htmlOutput("exportGrADS"), includeHTML("html/GrADS.html") ), # Python output tabPanel("Python", htmlOutput("exportPython"), includeHTML("html/python.html") ), # Matlab output tabPanel("matlab", htmlOutput("exportMatlab"), includeHTML("html/matlab.html") ) ) )) ), # ------------------------------------------------------------- # Show color spectrum # ------------------------------------------------------------- tabPanel("Spectrum",value="spectrum", withTags(div(class="hcl-main",id="hcl-main-spectrum", plotOutput("spectrum") )) ), # ------------------------------------------------------------- # Main panel which shows the help pages. Hidden in the beginning, # displayed on request. # ------------------------------------------------------------- tabPanel("Help Page",value="help", withTags(div(class="hcl-main",id="hcl-main-help", includeHTML("html/help.html") )) ) ), width = 7 ) )) colorspace/inst/hclwizard/server.R0000644000175400001440000004376613024270417017214 0ustar zeileisusers# ------------------------------------------------------------------- # - NAME: server.R # - AUTHOR: Reto Stauffer # - DATE: 2015-05-01 # ------------------------------------------------------------------- # - DESCRIPTION: This is the shiny guitar server script here. # ------------------------------------------------------------------- # - EDITORIAL: 2015-05-01, RS: Created file on thinkreto. # ------------------------------------------------------------------- # - L@ST MODIFIED: 2016-11-16 10:04 on thinkreto # ------------------------------------------------------------------- library("shiny") library("colorspace") library("dichromat") #options( shiny.trace = TRUE ) bpy <- eval(parse(text="colorspace:::bpy")) # Define server logic required to draw a histogram shinyServer(function(input, output, session) { if ( Sys.info()["nodename"] == "sculptor.uberspace.de" ) { delay(0, toggleState("closeapp", condition = F)) } # ---------------------------------------------------------------- # The different slider elements. Used later to show/hide or # set the sliders. # ---------------------------------------------------------------- sliderElements <- c("H1","H2","C1","C2","L1","L2","P1","P2") #,"LEV") # ---------------------------------------------------------------- # Loading PAL palette information and examples # ---------------------------------------------------------------- palettes <- colorspace:::GetPaletteConfig() updateSelectInput(session,"EXAMPLE", choices=colorspace:::example.plots[!colorspace:::example.plots=="Spectrum"]) # ---------------------------------------------------------------- # Helper function. Input: character vectors to show/hide. # ---------------------------------------------------------------- showHideElements <- function(show,hide) { #for ( elem in hide ) hide(elem) #for ( elem in show ) show(elem) for ( elem in hide ) addClass( elem,"hcl-is-hidden") for ( elem in show ) removeClass(elem,"hcl-is-hidden") } # ---------------------------------------------------------------- # Used in different functions: returns the current settings for all # Parameters # ---------------------------------------------------------------- getCurrentPalette <- function() { pal <- list() for ( elem in sliderElements ) { eval(parse(text=sprintf("pal$%s <- as.numeric(input$%s)",elem,elem))) } pal$N <- input$N return(pal) } # ---------------------------------------------------------------- # Change PAL (palettes to chose) whenever the typ changes # ---------------------------------------------------------------- observeEvent(input$typ, { x <- list() for ( i in which(palettes$typ == input$typ) ) x[[sprintf("%s",palettes$name[i])]] <- palettes$name[i] updateSelectInput(session,"PAL",choices = x) }) # ---------------------------------------------------------------- # Change palettes whenever the palette "typ" changes # ---------------------------------------------------------------- observeEvent(input$PAL, { # Getting settings of the choosen color palette idx <- which(palettes$typ==input$typ & palettes$name==input$PAL) if ( length(idx) == 0 ) { return(FALSE); } name <- input$PAL curPAL <- as.list(palettes[idx,]) # In this case we have to set the slider values as # the user selected a new scheme! for ( elem in sliderElements ) { if ( is.na(palettes[idx,elem]) ) next updateSliderInput(session,elem,value=curPAL[[elem]]) } # Show or hide sliders depending on the palette typ configuration showColorSliders(input$typ) showColorMap() }) # ---------------------------------------------------------------- # When the user changes the slider settings # ---------------------------------------------------------------- sliderChanged <- function(elem) { # Load color palette pal <- getCurrentPalette() # Show new color map showColorMap() } observeEvent(input$N, { sliderChanged("N") }) observeEvent(input$H1, { sliderChanged("H1") }) observeEvent(input$H2, { sliderChanged("H2") }) observeEvent(input$C1, { sliderChanged("C1") }) observeEvent(input$C2, { sliderChanged("C2") }) observeEvent(input$L1, { sliderChanged("L1") }) observeEvent(input$L2, { sliderChanged("L2") }) observeEvent(input$P1, { sliderChanged("P1") }) observeEvent(input$P2, { sliderChanged("P2") }) observeEvent(input$LEV, { sliderChanged("LEV") }) # Do the same whenever the example changes observeEvent(input$EXAMPLE, { sliderChanged("EXAMPLE") }) # ---------------------------------------------------------------- # When the user changes the options (like setting visual # constraints or the desaturate option). # ---------------------------------------------------------------- observeEvent(input$reverse, { showColorMap() }); observeEvent(input$fixup, { showColorMap() }); observeEvent(input$desaturate, { showColorMap() }); observeEvent(input$constraint, { showColorMap() }); # ---------------------------------------------------------------- # When the user changes one of the values # ---------------------------------------------------------------- setValueByUser <- function(elem) { value = eval(parse(text=sprintf("input$%sval",elem))) if ( nchar(value) > 0 ) { updateSliderInput(session,elem,value=value) updateTextInput(session, sprintf("%sval",elem), value="") } } observeEvent(input$H1set, { setValueByUser("H1") }) observeEvent(input$H2set, { setValueByUser("H2") }) observeEvent(input$C1set, { setValueByUser("C1") }) observeEvent(input$C2set, { setValueByUser("C2") }) observeEvent(input$L1set, { setValueByUser("L1") }) observeEvent(input$L2set, { setValueByUser("L2") }) observeEvent(input$P1set, { setValueByUser("P1") }) observeEvent(input$P2set, { setValueByUser("P2") }) observeEvent(input$Nset, { setValueByUser("N") }) #observeEvent(input$LEVset, { setValueByUser("LEV") }) # ---------------------------------------------------------------- # Getting currently selected color scheme # ---------------------------------------------------------------- getColors <- function(N=NULL,fun=FALSE) { # Current palette settings curtyp <- input$typ curPAL <- getCurrentPalette() if ( ! is.null(N) ) curPAL$N <- N fixup <- input$fixup # Getting palette function if ( input$typ == "base" ) { pal <- eval(parse(text=tolower(input$PAL))) } else { pal <- colorspace:::GetPalette(curtyp,curPAL$H1,curPAL$H2,curPAL$C1,curPAL$C2, curPAL$L1,curPAL$L2,curPAL$P1,curPAL$P2,input$fixup) } # If fun is set to false: return values if ( ! fun ) { # Remove alpha (base color maps) colors <- pal(curPAL$N) # Add desaturation or constraints if ( input$desaturate ) colors <- desaturate(colors) if ( any(tolower(input$constraint) %in% c("protan","deutan","tritan")) ) colors <- dichromat(colors,tolower(input$constraint)) # Reverse if required if ( input$reverse ) colors <- rev(colors) return(colors) } else { return(pal) } } # ---------------------------------------------------------------- # Show color map # Note that showColorMap also controls the output in the main # panel. Depending on the user view (if the user is on the # export or plotexample tab) we have to update the export # tab or the image. Not both. # ---------------------------------------------------------------- showColorMap <- function() { colors <- getColors() output$colormap <- renderPlot({ par(mar=rep(0,4),xaxt="n",yaxt="n",oma=rep(0,4),bty="n") image(matrix(1:length(colors),ncol=1),col=colors) },width=500,height=5) # Update the export tabs if ( input$maintabs == "export" ) { generateExport() # Show image (plot) } else if ( input$maintabs == "plotexample" & nchar(input$PAL) > 0 ) { plotExample(colors) #showColorMap() # Show spectrum } else if ( input$maintabs == "spectrum" ) { showSpectrum() } # Save color set to parent environment as we use it to generate # the output on the export tabs on demand. colormap <<- colors } # ---------------------------------------------------------------- # Display spectrum # ---------------------------------------------------------------- showSpectrum <- function() { colors <- getColors(100) output$spectrum <- renderPlot( specplot(colors,cex=1.4,plot=TRUE), width=800, height=800 ) } # ---------------------------------------------------------------- # Plotting example # ---------------------------------------------------------------- plotExample <- function(colors) { cmd <- sprintf("output$plot <- renderPlot({colorspace:::Plot%s(colors)},width=800,height=600)",input$EXAMPLE) eval(parse(text=cmd)) } # ---------------------------------------------------------------- # Getting currently selected color scheme and draws the # corresponding color bar using shiny # ---------------------------------------------------------------- showColorSliders <- function(curtyp) { idx <- which(palettes$typ==curtyp & palettes$name==input$PAL) show <- hide <- c() for ( elem in sliderElements ) { if ( is.na(palettes[idx,elem]) ) { hide <- c(hide,sprintf("%s-wrapper",elem)) } else { show <- c(show,sprintf("%s-wrapper",elem)) } showHideElements(show,hide) } } # ---------------------------------------------------------------- # Export colors: generate export content # ---------------------------------------------------------------- generateExport <- function() { # Setting "NA" colors if fixup=FALSE to white and # store the indizes on colors.na. Replacement required # to be able to convert hex->RGB, index required to # create proper output (where NA values should be displayed). colors <- getColors() colors.na <- which(is.na(colors)) colors[is.na(colors)] <- "#ffffff" # -------------------------- # RAW # -------------------------- # Generate RGB coordinates RGB <- attr(hex2RGB(colors),"coords") # Generate output string append <- function(x,new) c(x,new) raw1 <- raw2 <- raw3 <- raw4 <- list() # RGB 0-1 raw1 <- append(raw1,"
") raw1 <- append(raw1,"") raw1 <- append(raw1,"RGB values [0-1]") for ( i in 1:nrow(RGB) ) raw1 <- append(raw1,ifelse(i %in% colors.na, gsub(" "," ",sprintf("%5s %5s %5s","NA","NA","NA")), sprintf("%5.3f %5.3f %5.3f",RGB[i,1],RGB[i,2],RGB[i,3]))) raw1 <- append(raw1,"") # RGB 0-255 raw2 <- append(raw2,"") raw2 <- append(raw2,"RGB values [0-255]") RGB <- round(RGB*255) for ( i in 1:nrow(RGB) ) raw2 <- append(raw2,ifelse(i %in% colors.na, gsub(" "," ",sprintf("%4s %4s %4s","NA","NA","NA")), gsub(" "," ",sprintf("%4d %4d %4d",RGB[i,1],RGB[i,2],RGB[i,3])))) raw2 <- append(raw2,"") # HEX colors raw3 <- append(raw3,"") raw3 <- append(raw3,"HEX colors, no alpha") for ( i in seq_along(colors) ) raw3 <- append(raw3,ifelse(i %in% colors.na, gsub(" "," ",sprintf("%7s","NA")), sprintf("%s",colors[i]))) raw3 <- append(raw3,"") # Color boxes (visual bar) raw4 <- append(raw4,"") raw4 <- append(raw4,"Color Map") for ( col in colors ) raw4 <- append(raw4,sprintf("",col)) raw4 <- append(raw4,"") raw4 <- append(raw4,"
") output$exportRAW1 <- renderText(paste(raw1,collapse="\n")) output$exportRAW2 <- renderText(paste(raw2,collapse="\n")) output$exportRAW3 <- renderText(paste(raw3,collapse="\n")) output$exportRAW4 <- renderText(paste(raw4,collapse="\n")) # ----------------------------- # For GrADS # ----------------------------- gastr <- c() gastr <- append(gastr,"
") gastr <- append(gastr,"** Define colors palette") if ( length(colors.na) > 0 ) gastr <- append(gastr,"** WARNING undefined colors in color map!") for ( i in 1:nrow(RGB) ) { gastr <- append(gastr,ifelse(i %in% colors.na, gsub(" "," ",sprintf("'set rgb %02d %4s %4s %4s'", i+19,"NA","NA","NA")), gsub(" "," ",sprintf("'set rgb %02d %4d %4d %4d'", i+19,RGB[i,1],RGB[i,2],RGB[i,3])))) } gastr <- append(gastr,sprintf("'set ccols %s'",paste(1:nrow(RGB)+19,collapse=" "))) gastr <- append(gastr,sprintf("'set clevs %s'",paste(round(seq(0,100,length=nrow(RGB)-1),1),collapse=" "))) gastr <- append(gastr,"** Open data set via DODS") gastr <- append(gastr,"** Open data set via DODS") gastr <- append(gastr,strftime(Sys.Date()-1,"'sdfopen http://nomads.ncep.noaa.gov:9090/dods/gfs_1p00/gfs%Y%m%d/gfs_1p00_00z_anl'")) output$exportGrADS <- renderText(paste(gastr,collapse="\n")) # ----------------------------- # For Python # ----------------------------- pystr <- c() pystr <- append(pystr,"
") pystr <- append(pystr,"## Define choosen color palette first") pystr <- append(pystr,"## WARNING undefined colors in color map!") pycolors <- sprintf("\"%s\"",colors) if ( length(colors.na) > 0 ) pycolors[colors.na] <- "None" pystr <- append(pystr,sprintf("colors = (%s)", paste(sprintf("%s",pycolors),collapse=","))) pystr <- append(pystr,"
") output$exportPython <- renderText(paste(pystr,collapse="\n")) # ----------------------------- # For Matlab # ----------------------------- RGB <- attr(hex2RGB(colors),"coords") mstr <- c() mstr <- append(mstr,"
") mstr <- append(mstr,"%% Define rgb matrix first (matrix size ncolors x 3)") if ( length(colors.na) > 0 ) mstr <- append(mstr,"%% WARNING undefined colors in color map!") vardef <- "colors = [" for ( i in 1:nrow(RGB) ) { if ( i == 1 ) { pre <- vardef; post <- ";" } else if ( i < nrow(RGB) ) { pre <- paste(rep(" ",nchar(vardef)),collapse=""); post <- ";" } else { pre <- paste(rep(" ",nchar(vardef)),collapse=""); post <- "]" } if ( i %in% colors.na ) { tmp <- sprintf("%s%5s,%5s,%5s%s", pre,"NaN","NaN","NaN",post) } else { tmp <- sprintf("%s%5.3f,%5.3f,%5.3f%s", pre,RGB[i,1],RGB[i,2],RGB[i,3],post) } mstr <- append(mstr,gsub(" "," ",tmp)) } mstr <- append(mstr,"
") output$exportMatlab <- renderText(paste(mstr,collapse="\n")) } # ---------------------------------------------------------------- # Update main tabs (show export output, spectrum, or example plot) # ---------------------------------------------------------------- updateMainTabContent <- function() { # Update the export tabs if ( input$maintabs == "export" ) { generateExport() # Show image (plot) } else if ( input$maintabs == "plotexample" & nchar(input$PAL) > 0 ) { plotExample(colormap) # Spectrum plot } else if ( input$maintabs == "spectrum" ) { showSpectrum() } } observeEvent(input$maintabs, updateMainTabContent() ); # downloadHandler() takes two arguments, both functions. # The content function is passed a filename as an argument, and # it should write out data to that filename. getRGB <- function(int=FALSE) { colors <- getColors() if ( int ) { scale = 255; digits = 0 } else { scale = 1; digits = 3 } RGB <- round(attr(hex2RGB(colors),"coords")*scale,digits) return(RGB) } output$downloadRAW1 <- downloadHandler( file <- "colormap_rgb.txt", content = function(file) { write.table(getRGB(FALSE), file, sep = ",", col.names = TRUE, row.names = FALSE) } ) output$downloadRAW2 <- downloadHandler( file <- "colormap_RGB.txt", content = function(file) { write.table(getRGB(TRUE), file, sep = ",", col.names = TRUE, row.names = FALSE) } ) output$downloadRAW3 <- downloadHandler( file <- "colormap_hex.txt", content = function(file) { write.table(getColors(), file, sep = ",", col.names = FALSE, row.names = FALSE) } ) # ---------------------------------------------------------------- # Return colors at the moment as soon as the user stops the app. # Would be nicer to return a function as from choose_palette, # but I have not found a way yet. # ---------------------------------------------------------------- observeEvent(input$closeapp, stopApp(invisible(getColors(fun=TRUE))) ); # - Configuration ticks <- FALSE # to show ticks or not to show ticks }) colorspace/inst/hclwizard/www/0000755000175400001440000000000013024270417016367 5ustar zeileisuserscolorspace/inst/hclwizard/www/images/0000755000175400001440000000000013024270417017634 5ustar zeileisuserscolorspace/inst/hclwizard/www/images/pal_heat_hcl.png0000644000175400001440000000016713024270417022751 0ustar zeileisusersPNG  IHDR,ScPLTE?jaW~AP,-`BIDATc` 0D6 x~ IENDB`colorspace/inst/hclwizard/www/images/pal_greys.png0000644000175400001440000000016713024270417022333 0ustar zeileisusersPNG  IHDR,ScPLTE&&&KKKqqq4PPIDATc` 0D+xIXXIENDB`colorspace/inst/hclwizard/www/images/pal_set_2.png0000644000175400001440000000016713024270417022216 0ustar zeileisusersPNG  IHDR,ScPLTEOo磳Sƙ֡f퐤IDATc`#Dx=-IENDB`colorspace/inst/hclwizard/www/images/pal_cold.png0000644000175400001440000000016713024270417022123 0ustar zeileisusersPNG  IHDR,ScPLTE8AL\lَତ{IDATc`#XLD#x0ãIENDB`colorspace/inst/hclwizard/www/images/pal_blues.png0000644000175400001440000000016713024270417022314 0ustar zeileisusersPNG  IHDR,ScPLTE?:SXit̵IDATc` 0D+xIXXIENDB`colorspace/inst/hclwizard/www/images/pal_pastel_1.png0000644000175400001440000000016713024270417022712 0ustar zeileisusersPNG  IHDR,ScPLTEῸڨΰaՕIDATc`#Dx=-IENDB`colorspace/inst/hclwizard/www/images/pal_brbg.png0000644000175400001440000000016713024270417022116 0ustar zeileisusersPNG  IHDR,ScPLTE ^ISpfO+t]IDATc`"0XlD#x_MIENDB`colorspace/inst/hclwizard/www/images/pal_viridis.png0000644000175400001440000000016713024270417022653 0ustar zeileisusersPNG  IHDR,ScPLTEsÇ:BwFN]3?IDATc`!0D&+xX甓:IENDB`colorspace/inst/hclwizard/www/images/pal_puor.png0000644000175400001440000000016713024270417022167 0ustar zeileisusersPNG  IHDR,ScPLTEG>zi<mheL񵁾IDATc`$0XlDx;0IENDB`colorspace/inst/hclwizard/www/images/pal_bupu.png0000644000175400001440000000016713024270417022155 0ustar zeileisusersPNG  IHDR,ScPLTEkwrN|{ʧ` IDATc` 0D+xIXXIENDB`colorspace/inst/hclwizard/www/images/pal_warm.png0000644000175400001440000000016713024270417022150 0ustar zeileisusersPNG  IHDR,ScPLTEegϣs۝◚䔯IDATc` 0DVx^IENDB`colorspace/inst/hclwizard/www/images/pal_cm.colors.png0000644000175400001440000000016713024270417023101 0ustar zeileisusersPNG  IHDR,ScPLTEIDATc` 0lDV xRDrIENDB`colorspace/inst/hclwizard/www/images/pal_red_blue.png0000644000175400001440000000016713024270417022763 0ustar zeileisusersPNG  IHDR,ScPLTE1T屠۶@}ͼVnIDATc` 0XlDx>ݮIENDB`colorspace/inst/hclwizard/www/images/pal_plasma.png0000644000175400001440000000016713024270417022457 0ustar zeileisusersPNG  IHDR,ScPLTErNqG:SIDATc` 0DVx^IENDB`colorspace/inst/hclwizard/www/images/pal_terrain_hcl.png0000644000175400001440000000016713024270417023474 0ustar zeileisusersPNG  IHDR,ScPLTE&:~NɸIDATc` 0DVx^IENDB`colorspace/inst/hclwizard/www/images/pal_blue-red_2.png0000644000175400001440000000016713024270417023122 0ustar zeileisusersPNG  IHDR,ScPLTEJoㅕᵻ?j{毹8IDATc` 0D6 x=~aIENDB`colorspace/inst/hclwizard/www/images/pal_reds.png0000644000175400001440000000016713024270417022137 0ustar zeileisusersPNG  IHDR,ScPLTE#8=RWnq͍ᱳN7IDATc` 0D+xIXXIENDB`colorspace/inst/hclwizard/www/images/pal_green-orange.png0000644000175400001440000000016713024270417023553 0ustar zeileisusersPNG  IHDR,ScPLTE8wڳɰwyIDATc` 0DxPU IENDB`colorspace/inst/hclwizard/www/images/pal_dynamic.png0000644000175400001440000000016713024270417022626 0ustar zeileisusersPNG  IHDR,ScPLTEGL̆uẬe͙۝uIDATc`# DF3x?>8` IENDB`colorspace/inst/hclwizard/www/images/pal_harmonic.png0000644000175400001440000000016713024270417023002 0ustar zeileisusersPNG  IHDR,ScPLTE9L\}݆ueǧlIDATc`#XLD#x0ãIENDB`colorspace/inst/hclwizard/www/images/pal_piyg.png0000644000175400001440000000016713024270417022152 0ustar zeileisusersPNG  IHDR,ScPLTE_VW9`f*@IDATc`"XlDf#xu)5IENDB`colorspace/inst/hclwizard/www/images/pal_bpy.png0000644000175400001440000000016713024270417021774 0ustar zeileisusersPNG  IHDR,ScPLTE3P)u=`bMIDATc` 0D+xIXXIENDB`colorspace/inst/hclwizard/www/images/pal_pure_red.png0000644000175400001440000000016713024270417023007 0ustar zeileisusersPNG  IHDR,ScPLTE}5\`֊8IDATc` 0D+xIXXIENDB`colorspace/inst/hclwizard/www/images/pal_set_3.png0000644000175400001440000000016713024270417022217 0ustar zeileisusersPNG  IHDR,ScPLTEkڽxҌˆasIDATc`# DF3x?>8` IENDB`colorspace/inst/hclwizard/www/images/pal_topo.colors.png0000644000175400001440000000016713024270417023463 0ustar zeileisusersPNG  IHDR,ScPLTELML2IDATc`&0LDx|,xIENDB`colorspace/inst/hclwizard/www/images/pal_blue-red_3.png0000644000175400001440000000016713024270417023123 0ustar zeileisusersPNG  IHDR,ScPLTEhsKIDATc` 0D+xIXXIENDB`colorspace/inst/hclwizard/www/images/pal_light_grays.png0000644000175400001440000000016713024270417023516 0ustar zeileisusersPNG  IHDR,ScPLTEGGGiii*iIDATc` 0D+xIXXIENDB`colorspace/inst/hclwizard/www/images/pal_even_darker.png0000644000175400001440000000016713024270417023467 0ustar zeileisusersPNG  IHDR,ScPLTEfP…mjJIDATc`#Dx[KIENDB`colorspace/inst/hclwizard/www/images/pal_greens.png0000644000175400001440000000016713024270417022465 0ustar zeileisusersPNG  IHDR,ScPLTEm0&v>;MP^hsl7IDATc` 0D+xIXXIENDB`colorspace/inst/hclwizard/www/images/pal_yellow-green.png0000644000175400001440000000016713024270417023613 0ustar zeileisusersPNG  IHDR,ScPLTE_3UX|ÝۺqNsIDATc` 0D+xIXXIENDB`colorspace/inst/hclwizard/www/images/pal_blue-red.png0000644000175400001440000000016713024270417022701 0ustar zeileisusersPNG  IHDR,ScPLTE?};wּ" IDATc` 0XlDV3x IENDB`colorspace/inst/hclwizard/www/images/pal_yellow-blue.png0000644000175400001440000000016713024270417023442 0ustar zeileisusersPNG  IHDR,ScPLTEv-12wϾѐF"IDATc`$0D+xPUxyIENDB`colorspace/inst/hclwizard/www/images/pal_heat.colors.png0000644000175400001440000000016713024270417023423 0ustar zeileisusersPNG  IHDR,ScPLTE3fɓ#IDATc` 0D+xIXXIENDB`colorspace/inst/hclwizard/www/images/pal_alt_terrain.png0000644000175400001440000000016713024270417023506 0ustar zeileisusersPNG  IHDR,ScPLTE|d4Sxǝտ@3IDATc` 0DxPU IENDB`colorspace/inst/hclwizard/www/images/pal_alt_heat.png0000644000175400001440000000016713024270417022763 0ustar zeileisusersPNG  IHDR,ScPLTE;SLڄYeށq:IDATc` 0,D6+xzIENDB`colorspace/inst/hclwizard/www/images/pal_prgn.png0000644000175400001440000000016713024270417022150 0ustar zeileisusersPNG  IHDR,ScPLTESLwMh0qamWEIDATc`"0XlD#x_MIENDB`colorspace/inst/hclwizard/www/images/pal_rdbu.png0000644000175400001440000000016713024270417022136 0ustar zeileisusersPNG  IHDR,ScPLTE(Z]|KKܦIDATc`"XlDf#xu)5IENDB`colorspace/inst/hclwizard/www/images/pal_blues_2.png0000644000175400001440000000016713024270417022535 0ustar zeileisusersPNG  IHDR,ScPLTE?Te}Ⱦ✲IDATc` 0D+xIXXIENDB`colorspace/inst/hclwizard/www/images/pal_yellow-red.png0000644000175400001440000000016713024270417023265 0ustar zeileisusersPNG  IHDR,ScPLTE}C"o9ΗX|ݤnp_IDATc` 0D+xIXXIENDB`colorspace/inst/hclwizard/www/images/pal_rainbow.png0000644000175400001440000000016713024270417022643 0ustar zeileisusersPNG  IHDR,ScPLTEIIadIDATc`!DxLPPIENDB`colorspace/inst/hclwizard/www/images/pal_dark_2.png0000644000175400001440000000016713024270417022344 0ustar zeileisusersPNG  IHDR,ScPLTEEq_ŠHõXzIDATc`#Dx=-IENDB`colorspace/inst/hclwizard/www/images/pal_terrain.colors.png0000644000175400001440000000016713024270417024146 0ustar zeileisusersPNG  IHDR,ScPLTEc:v³UIDATc` 0D+xIXXIENDB`colorspace/inst/hclwizard/www/images/pal_oranges.png0000644000175400001440000000016713024270417022640 0ustar zeileisusersPNG  IHDR,ScPLTE3F1[KrfɌڭtIDATc` 0D+xIXXIENDB`colorspace/inst/hclwizard/www/images/pal_purples.png0000644000175400001440000000016713024270417022674 0ustar zeileisusersPNG  IHDR,ScPLTEJ~V2hOkIDATc` 0D+xIXXIENDB`colorspace/inst/hclwizard/www/hclwizard.css0000644000175400001440000000603713024270417021076 0ustar zeileisusers/* Need more space on small screens: remove some paddings */ div.col-sm-2 { padding: 0; } form.well { padding: 0 10px 20px 10px; height: 100%; } div.checkbox { padding: 0px; margin: 0px; } div.form-group.shiny-input-container { margin: 0 0 5px 0; } /* Scale the plot image relative to the main panel */ div#plot > img, div#spectrum > img { width: 100%; max-width: 800px; height: auto; } /* Styling the select option boxes */ div.hcl-selectoptions { margin: 0; padding: 0; } div.hcl-selectoptions h3 { margin: 0px; padding: 0px; font-size: 1em; } /* Styling the color map shown (plotOutput element) */ div#colormap-wrapper { height: 40px; } div#colormap-wrapper div { height: 40px; } div#colormap { width: 100%; height: 40px; border: 1px solid #a9a9a9; } div#colormap img { width: 100%; height: 100%; } div.hcl-sliderwrapper.hcl-is-hidden, .hcl-is-hidden { display: none; } /* Select box styling */ img.select-pal { width: 100%; height: 30px; margin: 0 2px; padding: 0px; } /* Styling hcl-slider and hcl-slidervalue input elements */ div.hcl-sliderwrapper { height: 4em; position: relative; } span.hcl-slider { display: block; float: left; width: 75%; } span.hcl-slidervalue { position: absolute; width: 25%; right: -.5em; top: -.5em; transform: scale(.8); } span.hcl-slidervalue > div > label { display: block; margin: 0; padding: 0; max-width: 100%; white-space: nowrap; overflow: hidden; } span.hcl-slidervalue > div.form-group.shiny-input-container { width: 60%; float: left; } span.hcl-slidervalue > div > input { text-align: right; overflow: visible; } span.hcl-slidervalue > button { position: absolute; width: 40%; top: 20px; right: 0px; padding-left: 1px; padding-right: 1px; } /* Export tab styling */ div#hcl-main-export div.output-raw { width: 25%; height: 100%; float: left; min-width: 150px; padding-bottom: 30px; } div#hcl-main-export div.output-raw a.shiny-download-link { margin-top: 30px; } div#hcl-main-export comment, div#hcl-main-export comment, div#hcl-main-export comment, div#hcl-main-export comment { font-family: Menlo,Monaco,Consolas,"Courier New",monospace; background-color: white; color: #337ab7; display: block; } div#hcl-main-export code, div#hcl-main-export code, div#hcl-main-export code, div#hcl-main-export code { background-color: white; color: black; display: block; } div.tab-content { margin-top:20px; margin-bottom: 40px; } div#hcl-main-export span.output-raw cbox { display: block; width: 100%; height: 22px; } /* Button styling */ button#closeapp { width: 100%; text-align: center; margin-top: 10px; } /* Responsive adjustments depending on screen resolution */ @media screen and (min-width: 768px) and (max-width: 1100px) { span.hcl-slider { width: 100%; } span.hcl-slidervalue { display: none; } } @media screen and (min-width: 1101px) and (max-width: 1500px) { span.hcl-slider { width: 65%; } span.hcl-slidervalue { width: 35%; } } colorspace/inst/hclwizard/html/0000755000175400001440000000000013024270417016507 5ustar zeileisuserscolorspace/inst/hclwizard/html/matlab.html0000644000175400001440000000054213024270417020636 0ustar zeileisusers %% Create surface data [X,Y] = meshgrid(-8:.5:8); R = sqrt(X.^2 + Y.^2) + eps; Z = sin(R)./R; %% Plotting surface surf(X,Y,Z,'EdgeColor','black') %% Adding your color palette and colorbar colormap(colors) colorbar() colorspace/inst/hclwizard/html/python.html0000644000175400001440000000267713024270417020732 0ustar zeileisusers## Note: example as seen on matplotlib webpage (2013-08-26): ## - http://matplotlib.org/examples/pylab_examples/griddata_demo.html ## Only adapted color handling ## Loading necessary python modules for this example from numpy.random import uniform, seed from matplotlib.mlab import griddata import matplotlib.pyplot as plt import numpy as np ## make up data. seed(0) npts = 200 x = uniform(-2,2,npts) y = uniform(-2,2,npts) z = x*np.exp(-x**2-y**2) ## define grid. xi = np.linspace(-2.1,2.1,100) yi = np.linspace(-2.1,2.1,200) ## grid the data. zi = griddata(x,y,z,xi,yi,interp='linear') ## contour the gridded data, plotting dots at the nonuniform data points. CS = plt.contour(xi,yi,zi,len(colors)-1,linewidths=0.5,colors='k') CS = plt.contourf(xi,yi,zi,len(colors)-1,colors=colors, vmax=abs(zi).max(), vmin=-abs(zi).max()) plt.colorbar() # draw colorbar ## plot data points. plt.scatter(x,y,marker='o',c='b',s=5,zorder=10) plt.xlim(-2,2) plt.ylim(-2,2) plt.title('griddata test (%d points)' % npts) plt.show() colorspace/inst/hclwizard/html/GrADS.html0000644000175400001440000000111713024270417020275 0ustar zeileisusers ** - Setting region to load 'set lon -20 40' 'set lat 30 85' ** - Map projection 'set mpdset hires' 'set mproj nps' 'set mpvals -10 30 34 52' ** - Plotting relative humidity on 850 hPa 'set gxout shaded' 'set lev 850' 'd rhprs' 'set gxout contour' 'd rhprs' ** Labeling 'set string 3 l' 'draw string 1 1 NCEP GFS 1 deg analysis: relative humidity 850hPa' colorspace/inst/hclwizard/html/help.html0000644000175400001440000001424013024270417020326 0ustar zeileisusers

Authors

Jason C. Fisher, Reto Stauffer, Achim Zeileis

Graphical User Interface for Choosing HCL Color Palettes

Description

A graphical user interface (GUI) for viewing, manipulating, and choosing HCL color palettes.

Details

Computes palettes based on the HCL (hue-chroma-luminance) color model (as implemented by polarLUV). The GUIs interface the palette functions rainbow_hcl for qualitative palettes, sequential_hcl for sequential palettes with a single hue, heat_hcl for sequential palettes with multiple hues, and diverge_hcl for diverging palettes (composed from two single-hue sequential palettes).

Two different GUIs are implemented and can be selected using the function input argument gui ("tcltk" or "shiny"). Both GUIs allows for interactive modification of the arguments of the respective palette-generating functions, i.e., starting/ending hue (wavelength, type of color), minimal/maximal chroma (colorfulness), minimal maximal luminance (brightness, amount of gray), and a power transformations that control how quickly/slowly chroma and/or luminance are changed through the palette. Subsets of the parameters may not be applicable depending on the type of palette chosen. See rainbow_hcl and Zeileis et al. (2009) for a more detailed explanation of the different arguments. Stauffer et al. (2015) provide more examples and guidance.

Optionally, active palette can be illustrated by using a range of examples such as a map, heatmap, scatter plot, perspective 3D surface etc.

To demonstrate different types of deficiencies, the active palette may be desaturated (emulating printing on a grayscale printer) and, if the dichromat package is available, collapsed to emulate different types of color-blindness (without red-green or green-blue contrasts).

Value

Returns a palette-generating function with the selected arguments. Thus, the returned function takes an integer argument and returns the corresponding number of HCL colors by traversing HCL space through interpolation of the specified hue/chroma/luminance/power values.

HCL and HSV Color Palettes

Description

Color palettes based on the HCL and HSV color spaces.

Details

All functions compute palettes based on either the HCL (polarLUV) or the HSV (HSV) color space.

rainbow_hcl computes a rainbow of colors (qualitative palette) defined by different hues given a single value of each chroma and luminance. It corresponds to rainbow which computes a rainbow in HSV space.

sequential_hcl gives a sequential palette starting at the full color HCL(h, c[1], l[1]) through to a light color HCL(h, c[2], l[2]) by interpolation.

diverge_hcl and diverge_hsv, compute a set of colors diverging from a neutral center (gray or white, without color) to two different extreme colors (blue and red by default). This is similar to cm.colors. For the diverging HSV colors, two hues h are needed, a maximal saturation s and a fixed value v. The saturation is then varied to obtain the diverging colors. For the diverging HCL colors, again two hues h are needed, a maximal chroma c and two luminances l. The colors are then created by an interpolation between the full color HCL(h[1], c, l[1]), a neutral color HCL(h, 0, l[2]) and the other full color HCL(h[2], c, l[1]).

The palette heat_hcl gives an implementation of heat.colors in HCL space. By default, it goes from a red to a yellow hue, while simultaneously going to lighter colors (i.e., increasing luminance) and reducing the amount of color (i.e., decreasing chroma). The terrain_hcl palette simply calls heat_hcl with different parameters, providing colors similar in spirit to terrain.colors. The lighter colors are not strictly HCL colors, though.

Value

A character vector with (s)RGB codings of the colors in the palette.

Color Spectrum Plot

Description

Visualization of color palettes (given as hex codes) in RGB and/or HCL coordinates.

Details

The function specplot transforms a given color palette in hex codes into their RGB (sRGB) or HCL (polarLUV) coordinates. As the hues for low-chroma colors are not (or poorly) identified, by default a smoothing is applied to the hues (fix = TRUE). Also, to avoid jumps from 0 to 360 or vice versa, the hue coordinates are shifted suitably.

By default (plot = TRUE) the resulting RGB and HCL coordinates are visualized by simple line plots along with the color palette x itself.

Value

specplot invisibly returns a list with components

RGB

a matrix of sRGB coordinates,

HCL

a matrix of HCL coordinates,

hex

original color palette x.

References

Zeileis A, Hornik K, Murrell P (2009). Escaping RGBland: Selecting Colors for Statistical Graphics. Computational Statistics & Data Analysis, 53, 3259–3270. doi: 10.1016/j.csda.2008.11.033 Preprint available from https://eeecon.uibk.ac.at/~zeileis/papers/Zeileis+Hornik+Murrell-2009.pdf.

Stauffer R, Mayr GJ, Dabernig M, Zeileis A (2015). Somewhere over the Rainbow: How to Make Effective Use of Colors in Meteorological Visualizations. Bulletin of the American Meteorological Society, 96(2), 203–216. doi: 10.1175/BAMS-D-13-00155.1

colorspace/inst/hclwizard/prepareStaticContent.R0000644000175400001440000001310113024270417022023 0ustar zeileisusers# ------------------------------------------------------------------- # - NAME: prepareStaticContent.R # - AUTHOR: Reto Stauffer # - DATE: 2016-10-23 # ------------------------------------------------------------------- # - DESCRIPTION: # ------------------------------------------------------------------- # - EDITORIAL: 2016-10-23, RS: Created file on pc24-c707. # ------------------------------------------------------------------- # - L@ST MODIFIED: 2016-11-03 17:09 on thinkreto # ------------------------------------------------------------------- library("colorspace") library("dichromat") # ------------------------------------------------------------------- # Make bpy accessible # ------------------------------------------------------------------- # Make hidden function available bpy <- colorspace:::bpy # ------------------------------------------------------------------- # Create color maps # ------------------------------------------------------------------- # Remove existing palettes imgdir <- "www/images" files <- list.files(imgdir,"pal_.*.png") if ( length(files) > 0 ) { for ( f in files ) file.remove(sprintf("%s/%s",imgdir,f)) } # Loading defined color palettes from colorspace package palettes <- colorspace:::GetPaletteConfig() names(palettes) <- tolower(names(palettes)) names(palettes)[names(palettes)=='typ'] <- "type" # Required for do.call GetPalette <- colorspace:::GetPalette N <- 7 # Default number of colors for the palettes idx <- which(! names(palettes) %in% c('name')) for ( i in 1:nrow(palettes) ) { args <- as.list(palettes[i,idx]) name <- gsub(" ","_",tolower(palettes$name[i])) img <- sprintf("%s/pal_%s.png",imgdir,name) cat(sprintf(" * Drawing: %s\n",img)) if ( args$type == "base" ) { pal <- eval(parse(text=tolower(palettes$name[i]))) } else { pal <- do.call("GetPalette",args) } # Draw color map png(file=img,width=300,height=1) par(bty="n",mar=rep(0,4),oma=rep(0,4)) image(matrix(1:7,ncol=1),col=pal(N)) dev.off() } # ------------------------------------------------------------------- # Snippet from: # http://yihui.name/en/2012/10/build-static-html-help/ # Create static html from Rd files. # ------------------------------------------------------------------- static_help = function(pkg, methods, links = tools::findHTMLlinks()) { pkgRdDB = tools:::fetchRdDB(file.path(find.package(pkg), 'help', pkg)) force(links); topics = names(pkgRdDB) for (p in topics) { if ( ! is.null(methods) ) { if ( ! p %in% methods ) next } message(sprintf("Create static html help page for %s::%s",pkg,p)) content = pkgRdDB[[p]] tools::Rd2HTML(pkgRdDB[[p]], sprintf("tmp_%s.html",p), package = pkg, Links = links, no_links = is.null(links)) } } cat(" * Create static help pages using Rd2HTML\n") static_help("colorspace","choose_palette") static_help("colorspace","rainbow_hcl") static_help("colorspace","specplot") # ------------------------------------------------------------------- # Parsing html content and create new static help page for # the hclwizard. # ------------------------------------------------------------------- # Reading help page content getHTMLcontent <- function(file) { # Helper function to extract the different sections extract <- function(html,sec) { r <- regmatches(html,regexpr(sprintf("

%s

.*?(?=

)",sec),html,perl=TRUE)) r <- gsub("#LB#","\n",r) r } title <- function(html) { r <- regmatches(html,regexpr("

.*

",html)) r <- gsub("#LB#","\n",r) r } if ( ! file.exists(file) ) stop(sprintf("Cannot find %s",file)) # Read content ... html <- gsub("\\n","",paste(readLines(file),collapse="#LB#")) # Remove hyperrefs html <- gsub("","",html,perl=TRUE) html <- gsub(")>","",html,perl=TRUE) reto <<- html html <- gsub("Author\\Ws\\W","Authors",html) # ... and parse content res <- list() res[['Title']] <- title(html) for ( sec in c("Description","Usage","Arguments","Details", "Value","Authors","References","See Also") ) { res[[sec]] <- extract(html,sec) } res } # Reading content cat(" * Reading html content\n") content1 <- getHTMLcontent("tmp_choose_palette.html") content2 <- getHTMLcontent("tmp_rainbow_hcl.html") content3 <- getHTMLcontent("tmp_specplot.html") # Create output file outfile <- "html/help.html" if ( file.exists("html/help.html") ) file.remove(outfile) cat(" Add authors on top\n") write(content1[["Authors"]], file=outfile, append=TRUE) # Create new help page content for ( sec in c("Title","Description","Details","Value") ) { cat(sprintf(" Appending %s\n",sec)) write(content1[[sec]], file=outfile, append=TRUE) } for ( sec in c("Title","Description","Details","Value") ) { cat(sprintf(" Appending %s\n",sec)) write(content2[[sec]], file=outfile, append=TRUE) } for ( sec in c("Title","Description","Details","Value") ) { cat(sprintf(" Appending %s\n",sec)) write(content3[[sec]], file=outfile, append=TRUE) } write(content1[["References"]], file=outfile, append=TRUE) # Remove temporary rendered html pages cat(" * Remove temporary files\n") file.remove("tmp_choose_palette.html") file.remove("tmp_rainbow_hcl.html") file.remove("tmp_specplot.html") colorspace/tests/0000755000175400001440000000000013024270417013741 5ustar zeileisuserscolorspace/tests/Examples/0000755000175400001440000000000013024270417015517 5ustar zeileisuserscolorspace/tests/Examples/colorspace-Ex.Rout.save0000644000175400001440000003731113024270417022040 0ustar zeileisusers R version 3.3.2 (2016-10-31) -- "Sincere Pumpkin Patch" Copyright (C) 2016 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > pkgname <- "colorspace" > source(file.path(R.home("share"), "R", "examples-header.R")) > options(warn = 1) > library('colorspace') > > base::assign(".oldSearch", base::search(), pos = 'CheckExEnv') > cleanEx() > nameEx("HLS") > ### * HLS > > flush(stderr()); flush(stdout()) > > ### Name: HLS > ### Title: Create HLS Colors > ### Aliases: HLS > ### Keywords: color > > ### ** Examples > > # A rainbow of full-intensity hues > HLS(seq(0, 360, length=13)[-13], 0.5, 1) H L S [1,] 0 0.5 1 [2,] 30 0.5 1 [3,] 60 0.5 1 [4,] 90 0.5 1 [5,] 120 0.5 1 [6,] 150 0.5 1 [7,] 180 0.5 1 [8,] 210 0.5 1 [9,] 240 0.5 1 [10,] 270 0.5 1 [11,] 300 0.5 1 [12,] 330 0.5 1 > > > > cleanEx() > nameEx("HSV") > ### * HSV > > flush(stderr()); flush(stdout()) > > ### Name: HSV > ### Title: Create HSV Colors > ### Aliases: HSV > ### Keywords: color > > ### ** Examples > > # A rainbow of full-intensity hues > HSV(seq(0, 360, length=13)[-13], 1, 1) H S V [1,] 0 1 1 [2,] 30 1 1 [3,] 60 1 1 [4,] 90 1 1 [5,] 120 1 1 [6,] 150 1 1 [7,] 180 1 1 [8,] 210 1 1 [9,] 240 1 1 [10,] 270 1 1 [11,] 300 1 1 [12,] 330 1 1 > > > > cleanEx() > nameEx("LAB") > ### * LAB > > flush(stderr()); flush(stdout()) > > ### Name: LAB > ### Title: Create LAB Colors > ### Aliases: LAB > ### Keywords: color > > ### ** Examples > > ## Show the LAB space > set.seed(1) > x <- RGB(runif(1000), runif(1000), runif(1000)) > y <- as(x, "LAB") > head(x) R G B [1,] 0.2655087 0.5308088 0.871805 > head(y) L A B [1,] 76.00763 -4.987872 -28.84153 > plot(y) > > > > cleanEx() > nameEx("LUV") > ### * LUV > > flush(stderr()); flush(stdout()) > > ### Name: LUV > ### Title: Create LUV Colors > ### Aliases: LUV > ### Keywords: color > > ### ** Examples > > ## Show the LUV space > set.seed(1) > x <- RGB(runif(1000), runif(1000), runif(1000)) > y <- as(x, "LUV") > head(x) R G B [1,] 0.2655087 0.5308088 0.871805 > head(y) L U V [1,] 76.00763 -25.7427 -45.3886 > plot(y) > > > > cleanEx() > nameEx("RGB") > ### * RGB > > flush(stderr()); flush(stdout()) > > ### Name: RGB > ### Title: Create RGB Colors > ### Aliases: RGB > ### Keywords: color > > ### ** Examples > > # Create a random set of colors > set.seed(1) > RGB(R = runif(20), G = runif(20), B = runif(20)) R G B [1,] 0.26550866 0.93470523 0.82094629 [2,] 0.37212390 0.21214252 0.64706019 [3,] 0.57285336 0.65167377 0.78293276 [4,] 0.90820779 0.12555510 0.55303631 [5,] 0.20168193 0.26722067 0.52971958 [6,] 0.89838968 0.38611409 0.78935623 [7,] 0.94467527 0.01339033 0.02333120 [8,] 0.66079779 0.38238796 0.47723007 [9,] 0.62911404 0.86969085 0.73231374 [10,] 0.06178627 0.34034900 0.69273156 [11,] 0.20597457 0.48208012 0.47761962 [12,] 0.17655675 0.59956583 0.86120948 [13,] 0.68702285 0.49354131 0.43809711 [14,] 0.38410372 0.18621760 0.24479728 [15,] 0.76984142 0.82737332 0.07067905 [16,] 0.49769924 0.66846674 0.09946616 [17,] 0.71761851 0.79423986 0.31627171 [18,] 0.99190609 0.10794363 0.51863426 [19,] 0.38003518 0.72371095 0.66200508 [20,] 0.77744522 0.41127443 0.40683019 > > > > cleanEx() > nameEx("USSouthPolygon") > ### * USSouthPolygon > > flush(stderr()); flush(stdout()) > > ### Name: USSouthPolygon > ### Title: Polygon for County Map of US South States: Alabama, Georgia, and > ### South Carolina > ### Aliases: USSouthPolygon > ### Keywords: datasets > > ### ** Examples > > ## generate color palette > pal <- diverge_hcl(9) > n <- length(pal) > > ## draw shaded polygons > plot(0, 0, type = "n", xlab = "", ylab = "", xaxt = "n", yaxt = "n", bty = "n", + xlim = c(-88.5, -78.6), ylim = c(30.2, 35.2), asp = 1) > polygon(USSouthPolygon, col = pal[cut(na.omit(USSouthPolygon$z), breaks = 0:n/n)]) > > > > cleanEx() > nameEx("XYZ") > ### * XYZ > > flush(stderr()); flush(stdout()) > > ### Name: XYZ > ### Title: Create XYZ Colors > ### Aliases: XYZ > ### Keywords: color > > ### ** Examples > > ## Generate white in XYZ space > XYZ(95.047, 100.000, 108.883) X Y Z [1,] 95.047 100 108.883 > > > > cleanEx() > nameEx("choose_palette") > ### * choose_palette > > flush(stderr()); flush(stdout()) > > ### Name: choose_palette > ### Title: Graphical User Interface for Choosing HCL Color Palettes > ### Aliases: choose_palette hclwizard > ### Keywords: misc > > ### ** Examples > > if(interactive()) { + ## Using tcltk GUI + ## Analog to: hclwizard(gui="tcltk") + pal <- choose_palette() + ## Using shiny GUI + ## Analog to: choose_palette(gui = "shiny") + pal <- hclwizard() + + ## use resulting palette function + filled.contour(volcano, color.palette = pal, asp = 1) + } > > > > cleanEx() > nameEx("color-class") > ### * color-class > > flush(stderr()); flush(stdout()) > > ### Name: color-class > ### Title: Class "color" > ### Aliases: color-class RGB-class sRGB-class XYZ-class HSV-class HLS-class > ### LAB-class LUV-class polarLAB-class polarLUV-class [,color-method > ### coerce,color,RGB-method coerce,color,sRGB-method > ### coerce,color,XYZ-method coerce,color,LAB-method > ### coerce,color,polarLAB-method coerce,color,HSV-method > ### coerce,color,HLS-method coerce,color,LUV-method > ### coerce,color,polarLUV-method coords,color-method plot,color-method > ### show,color-method > ### Keywords: classes > > ### ** Examples > > x = RGB(runif(1000),runif(1000),runif(1000)) > plot(as(x, "LUV")) > > > > cleanEx() > nameEx("coords") > ### * coords > > flush(stderr()); flush(stdout()) > > ### Name: coords > ### Title: Extract the numerical coordinates of a color > ### Aliases: coords > ### Keywords: color > > ### ** Examples > > x <- RGB(1, 0, 0) > coords(as(x, "HSV")) H S V [1,] 360 1 1 > > > > cleanEx() > nameEx("desaturate") > ### * desaturate > > flush(stderr()); flush(stdout()) > > ### Name: desaturate > ### Title: Desaturate Colors by Chroma Removal in HCL Space > ### Aliases: desaturate > ### Keywords: color > > ### ** Examples > > ## rainbow of colors and their desaturated counterparts > rainbow_hcl(12) [1] "#E495A5" "#DB9D85" "#C7A76C" "#ABB065" "#86B875" "#5CBD92" "#39BEB1" [8] "#4CB9CC" "#7DB0DD" "#ACA4E2" "#CD99D8" "#E093C3" > desaturate(rainbow_hcl(12)) [1] "#ABABAB" "#ABABAB" "#ABABAB" "#ABABAB" "#ABABAB" "#ABABAB" "#ABABAB" [8] "#ABABAB" "#ABABAB" "#ABABAB" "#ABABAB" "#ABABAB" > > ## convenience demo function > wheel <- function(col, radius = 1, ...) + pie(rep(1, length(col)), col = col, radius = radius, ...) > > ## compare base and colorspace palettes > ## (in color and desaturated) > par(mar = rep(0, 4), mfrow = c(2, 2)) > ## rainbow color wheel > wheel(rainbow_hcl(12)) > wheel(rainbow(12)) > wheel(desaturate(rainbow_hcl(12))) > wheel(desaturate(rainbow(12))) > > > > graphics::par(get("par.postscript", pos = 'CheckExEnv')) > cleanEx() > nameEx("hex") > ### * hex > > flush(stderr()); flush(stdout()) > > ### Name: hex > ### Title: Convert Colors To Hexadecimal Strings > ### Aliases: hex > ### Keywords: color > > ### ** Examples > > hsv = HSV(seq(0, 360, length = 7)[-7], 1, 1) > hsv H S V [1,] 0 1 1 [2,] 60 1 1 [3,] 120 1 1 [4,] 180 1 1 [5,] 240 1 1 [6,] 300 1 1 > hex(hsv) [1] "#FF0000" "#FFFF00" "#00FF00" "#00FFFF" "#0000FF" "#FF00FF" > barplot(rep(1,6), col = hex(hsv)) > > > > cleanEx() > nameEx("hex2RGB") > ### * hex2RGB > > flush(stderr()); flush(stdout()) > > ### Name: hex2RGB > ### Title: Convert Hexadecimal Color Specifications To RGB Objects > ### Aliases: hex2RGB > ### Keywords: color > > ### ** Examples > > hex2RGB(c("#FF0000","#00FF00", "#0000FF50")) R G B [1,] 1 0 0 [2,] 0 1 0 [3,] 0 0 1 > > > > cleanEx() > nameEx("mixcolor") > ### * mixcolor > > flush(stderr()); flush(stdout()) > > ### Name: mixcolor > ### Title: Compute the convex combination of two colors > ### Aliases: mixcolor > ### Keywords: color > > ### ** Examples > > mixcolor(0.5, RGB(1, 0, 0), RGB(0, 1, 0)) R G B [1,] 0.5 0.5 0 > > > > cleanEx() > nameEx("polarLAB") > ### * polarLAB > > flush(stderr()); flush(stdout()) > > ### Name: polarLAB > ### Title: Create polarLAB Colors > ### Aliases: polarLAB > ### Keywords: color > > ### ** Examples > > ## Show the polarLAB space > set.seed(1) > x <- RGB(runif(1000), runif(1000), runif(1000)) > y <- as(x, "polarLAB") > head(x) R G B [1,] 0.2655087 0.5308088 0.871805 > head(y) L C H [1,] 76.00763 29.26965 260.1883 > plot(y) > > > > cleanEx() > nameEx("polarLUV") > ### * polarLUV > > flush(stderr()); flush(stdout()) > > ### Name: polarLUV > ### Title: Create polarLUV Colors > ### Aliases: polarLUV > ### Keywords: color > > ### ** Examples > > ## Show the polarLUV space > set.seed(1) > x <- RGB(runif(1000), runif(1000), runif(1000)) > y <- as(x, "polarLUV") > head(x) R G B [1,] 0.2655087 0.5308088 0.871805 > head(y) L C H [1,] 76.00763 52.18057 240.4397 > plot(y) > > > > cleanEx() > nameEx("rainbow_hcl") > ### * rainbow_hcl > > flush(stderr()); flush(stdout()) > > ### Name: rainbow_hcl > ### Title: HCL and HSV Color Palettes > ### Aliases: rainbow_hcl diverge_hcl diverge_hsv heat_hcl sequential_hcl > ### terrain_hcl > ### Keywords: color > > ### ** Examples > > ## convenience demo functions > wheel <- function(col, radius = 1, ...) + pie(rep(1, length(col)), col = col, radius = radius, ...) > > pal <- function(col, border = "light gray") + { + n <- length(col) + plot(0, 0, type="n", xlim = c(0, 1), ylim = c(0, 1), axes = FALSE, xlab = "", ylab = "") + rect(0:(n-1)/n, 0, 1:n/n, 1, col = col, border = border) + } > > ## qualitative palette > wheel(rainbow_hcl(12)) > > ## a few useful diverging HCL palettes > par(mar = rep(0, 4), mfrow = c(4, 1)) > pal(diverge_hcl(7)) > pal(diverge_hcl(7, h = c(246, 40), c = 96, l = c(65, 90))) > pal(diverge_hcl(7, h = c(130, 43), c = 100, l = c(70, 90))) > pal(diverge_hcl(7, h = c(180, 70), c = 70, l = c(90, 95))) > pal(diverge_hcl(7, h = c(180, 330), c = 59, l = c(75, 95))) > pal(diverge_hcl(7, h = c(128, 330), c = 98, l = c(65, 90))) > pal(diverge_hcl(7, h = c(255, 330), l = c(40, 90))) > pal(diverge_hcl(7, c = 100, l = c(50, 90), power = 1)) > > ## sequential palettes > pal(sequential_hcl(12)) > pal(heat_hcl(12, h = c(0, -100), l = c(75, 40), c = c(40, 80), power = 1)) > pal(terrain_hcl(12, c = c(65, 0), l = c(45, 95), power = c(1/3, 1.5))) > pal(heat_hcl(12, c = c(80, 30), l = c(30, 90), power = c(1/5, 1.5))) > > ## compare base and colorspace palettes > ## (in color and desaturated) > par(mar = rep(0, 4), mfrow = c(2, 2)) > ## rainbow color wheel > wheel(rainbow_hcl(12)) > wheel(rainbow(12)) > wheel(desaturate(rainbow_hcl(12))) > wheel(desaturate(rainbow(12))) > > ## diverging red-blue colors > pal(diverge_hsv(7)) > pal(diverge_hcl(7, c = 100, l = c(50, 90))) > pal(desaturate(diverge_hsv(7))) > pal(desaturate(diverge_hcl(7, c = 100, l = c(50, 90)))) > > ## diverging cyan-magenta colors > pal(cm.colors(7)) > pal(diverge_hcl(7, h = c(180, 330), c = 59, l = c(75, 95))) > pal(desaturate(cm.colors(7))) > pal(desaturate(diverge_hcl(7, h = c(180, 330), c = 59, l = c(75, 95)))) > > ## heat colors > pal(heat.colors(12)) > pal(heat_hcl(12)) > pal(desaturate(heat.colors(12))) > pal(desaturate(heat_hcl(12))) > > ## terrain colors > pal(terrain.colors(12)) > pal(terrain_hcl(12)) > pal(desaturate(terrain.colors(12))) > pal(desaturate(terrain_hcl(12))) > > > > graphics::par(get("par.postscript", pos = 'CheckExEnv')) > cleanEx() > nameEx("readRGB") > ### * readRGB > > flush(stderr()); flush(stdout()) > > ### Name: readRGB > ### Title: Read RGB Color Descriptions > ### Aliases: readRGB > ### Keywords: color > > ### ** Examples > > ## Not run: > ##D rgb <- readRGB("pastel.rgb") > ##D hsv <- readRGB("pastel.rgb", "HSV") > ## End(Not run) > > > > cleanEx() > nameEx("readhex") > ### * readhex > > flush(stderr()); flush(stdout()) > > ### Name: readhex > ### Title: Read Hexadecimal Color Descriptions > ### Aliases: readhex > ### Keywords: color > > ### ** Examples > > ## Not run: > ##D rgb <- readhex("pastel.txt") > ##D hsv <- readhex("pastel.txt", "HSV") > ## End(Not run) > > > > cleanEx() > nameEx("sRGB") > ### * sRGB > > flush(stderr()); flush(stdout()) > > ### Name: sRGB > ### Title: Create sRGB Colors > ### Aliases: sRGB > ### Keywords: color > > ### ** Examples > > # Create a random set of colors > set.seed(1) > sRGB(R = runif(20), G = runif(20), B = runif(20)) R G B [1,] 0.26550866 0.93470523 0.82094629 [2,] 0.37212390 0.21214252 0.64706019 [3,] 0.57285336 0.65167377 0.78293276 [4,] 0.90820779 0.12555510 0.55303631 [5,] 0.20168193 0.26722067 0.52971958 [6,] 0.89838968 0.38611409 0.78935623 [7,] 0.94467527 0.01339033 0.02333120 [8,] 0.66079779 0.38238796 0.47723007 [9,] 0.62911404 0.86969085 0.73231374 [10,] 0.06178627 0.34034900 0.69273156 [11,] 0.20597457 0.48208012 0.47761962 [12,] 0.17655675 0.59956583 0.86120948 [13,] 0.68702285 0.49354131 0.43809711 [14,] 0.38410372 0.18621760 0.24479728 [15,] 0.76984142 0.82737332 0.07067905 [16,] 0.49769924 0.66846674 0.09946616 [17,] 0.71761851 0.79423986 0.31627171 [18,] 0.99190609 0.10794363 0.51863426 [19,] 0.38003518 0.72371095 0.66200508 [20,] 0.77744522 0.41127443 0.40683019 > > > > cleanEx() > nameEx("specplot") > ### * specplot > > flush(stderr()); flush(stdout()) > > ### Name: specplot > ### Title: Color Spectrum Plot > ### Aliases: specplot > ### Keywords: misc > > ### ** Examples > > ## spectrum of the (in)famous RGB rainbow palette > specplot(rainbow(100)) > > ## spectrum of HCL-based palettes: qualitative/sequential/diverging > specplot(rainbow_hcl(100)) > specplot(sequential_hcl(100)) > specplot(diverge_hcl(100)) > > ## return computed RGB and HCL coordinates > res <- specplot(rainbow(10), plot = FALSE) > print(res) $RGB R G B [1,] 1.0 0.0 0.0 [2,] 1.0 0.6 0.0 [3,] 0.8 1.0 0.0 [4,] 0.2 1.0 0.0 [5,] 0.0 1.0 0.4 [6,] 0.0 1.0 1.0 [7,] 0.0 0.4 1.0 [8,] 0.2 0.0 1.0 [9,] 0.8 0.0 1.0 [10,] 1.0 0.0 0.6 $HCL H C L [1,] 12.17395 179.04076 53.24059 [2,] 39.43554 109.90223 72.26076 [3,] 102.90782 109.54965 93.60562 [4,] 126.52223 133.56847 88.07440 [5,] 132.97247 118.65166 88.19667 [6,] 192.16714 72.09794 91.11330 [7,] 259.85512 127.32455 47.90415 [8,] 267.22822 132.04235 33.81769 [9,] 291.97946 133.06241 51.90335 [10,] 346.98811 133.87809 55.65064 $hex [1] "#FF0000FF" "#FF9900FF" "#CCFF00FF" "#33FF00FF" "#00FF66FF" "#00FFFFFF" [7] "#0066FFFF" "#3300FFFF" "#CC00FFFF" "#FF0099FF" > > > > cleanEx() > nameEx("writehex") > ### * writehex > > flush(stderr()); flush(stdout()) > > ### Name: writehex > ### Title: Write Hexadecimal Color Descriptions > ### Aliases: writehex > ### Keywords: color > > ### ** Examples > > set.seed(1) > x <- RGB(runif(10), runif(10), runif(10)) > writehex(x, "random.txt") [1] "random.txt" > > > > ### *