gridBase/0000755000176000001440000000000012302562265012025 5ustar ripleyusersgridBase/inst/0000755000176000001440000000000012302520733012774 5ustar ripleyusersgridBase/inst/doc/0000755000176000001440000000000012302520733013541 5ustar ripleyusersgridBase/inst/doc/gridBase.Rnw0000644000176000001440000005015012302520733015752 0ustar ripleyusers\documentclass[a4paper]{article} %\VignetteIndexEntry{gridBase} \newcommand{\grid}{{\tt grid}} \newcommand{\gridBase}{{\tt gridBase}} \newcommand{\lattice}{{\tt lattice}} \newcommand{\R}{{\tt R}} \setlength{\parindent}{0in} \setlength{\parskip}{.1in} \newcommand{\aside}[1]{\begin{list}{} {\setlength{\leftmargin}{1in} \setlength{\rightmargin}{1in} \setlength{\itemindent}{0in}} \item {\sc Aside:} {\it #1} \end{list}} \title{Integrating Grid Graphics Output \\ with Base Graphics Output} \author{Paul Murrell} \begin{document} \maketitle @ The \grid{} graphics package\cite{Rnews:Murrell:2002} is much more powerful than the standard \R{} graphics system (hereafter ``base graphics'') when it comes to combining and arranging graphical elements. It is possible to create a greater variety of graphs more easily with \grid{} (see, for example, Deepayan Sarkar's \lattice{} package\cite{Rnews:Sarkar:2002}). However, there are very many plots based on base graphics (e.g., biplots), that have not been implemented in \grid{}, and the task of reimplementing these in \grid{} is extremely daunting. It would be nice to be able to combine the ready-made base plots with the sophisticated arrangement features of grid. This document describes the \gridBase{} package which provides some support for combining grid and base graphics output. \section*{Annotating base graphics using \grid{}} The \gridBase{} package has one function, \verb|baseViewports()|, that supports adding \grid{} output to a base graphics plot. This function creates a set of \grid{} viewports that correspond to the current base plot. This allows simple annotations such as adding lines and text using \grid{}'s units to locate them relative to a wide variety of coordinate systems, or something more complex involving pushing further \grid{} viewports. {\tt baseViewports()} returns a list of three grid viewports. The first corresponds to the base ``inner'' region. This viewport is relative to the entire device; it only makes sense to push this viewport from the ``top level'' (i.e., only when no other viewports have been pushed). The second viewport corresponds to the base ``figure'' region and is relative to the inner region; it only makes sense to push it after the ``inner'' viewport has been pushed. The third viewport corresponds to the base ``plot'' region and is relative to the figure region; it only makes sense to push it after the other two viewports have been pushed in the correct order. A simple application of this facility involves adding text to the margins of a base plot at an arbitrary orientation. The base function \verb|mtext()| allows text to be located in terms of a number of lines away from the plot region, but only at rotations of 0 or 90 degrees. The base \verb|text()| function allows arbitrary rotations, but only locates text relative to the user coordinate system in effect in the plot region (which is inconvenient for locating text in the margins of the plot). By contrast, the \grid{} function \verb|grid.text()| allows arbitrary rotations and can be used in any \grid{} viewport. In the following code we first create a base plot, leaving off the tick labels. <>= library(grid) library(gridBase) <>= midpts <- barplot(1:10, axes=FALSE) axis(2) axis(1, at=midpts, labels=FALSE) @ Next we use \verb|baseViewports()| to create grid viewports that correspond to the base plot and we push those viewports. <>= vps <- baseViewports() pushViewport(vps$inner, vps$figure, vps$plot) @ Finally, we draw rotated labels using \verb|grid.text()| (and pop the viewports to clean up after ourselves). <>= grid.text(c("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"), x=unit(midpts, "native"), y=unit(-1, "lines"), just="right", rot=60) popViewport(3) <>= <> <> <> @ The next example is a bit more complicated because it involves embedding \grid{} viewports within a base graphics plot. The dataset is a snapshot of wind speed, wind direction, and temperature at several weather stations in the South China Sea, south west of Japan\footnote{Obtained from the CODIAC web site: {\tt http://www.joss.ucar.edu/codiac/codiac-www.html}. The file {\tt chinasea.txt} is in the {\tt gridBase/doc} directory.}. \grid{} is used to produce novel plotting symbols for a standard base plot. First of all, we need to define the novel plotting symbol. This consists of a dot at the data location, with a thermometer extending ``below'' and an arrow extending ``above''. The thermometer is used to encode temperature and the arrow is used to indicate wind speed (both scaled to [0, 1]). <>= novelsym <- function(speed, temp, width=unit(3, "mm"), length=unit(0.5, "inches")) { grid.rect(height=length, y=0.5, just="top", width=width, gp=gpar(fill="white")) grid.rect(height=temp*length, y=unit(0.5, "npc") - length, width=width, just="bottom", gp=gpar(fill="grey")) grid.lines(x=0.5, y=unit.c(unit(0.5, "npc"), unit(0.5, "npc") + speed*length), arrow=arrow(length=unit(3, "mm"), type="closed"), gp=gpar(fill="black")) grid.points(unit(0.5, "npc"), unit(0.5, "npc"), size=unit(2, "mm"), pch=16) } @ Now we read in the data and generate a base plot, but plot no points. <>= chinasea <- read.table(system.file("doc", "chinasea.txt", package="gridBase"), header=TRUE) plot(chinasea$lat, chinasea$long, type="n", xlab="latitude", ylab="longitude", main="China Sea Wind Speed/Direction and Temperature") @ Now we use \verb|baseViewports()| to align a \grid{} viewport with the plot region, and draw the symbols by creating a \grid{} viewport per $(x, y)$ location (we rotate the viewport to represent the wind direction). <>= speed <- 0.8*chinasea$speed/14 + 0.2 temp <- chinasea$temp/40 vps <- baseViewports() pushViewport(vps$inner, vps$figure, vps$plot) for (i in 1:25) { pushViewport(viewport(x=unit(chinasea$lat[i], "native"), y=unit(chinasea$long[i], "native"), angle=chinasea$dir[i])) novelsym(speed[i], temp[i]) popViewport() } popViewport(3) <>= <> <> <> @ \section*{Embedding base graphics plots in \grid{} viewports} \gridBase{} provides several functions for adding base graphics output to \grid{} output. There are three functions that allow base plotting regions to be aligned with the current \grid{} viewport; this makes it possible to draw one or more base graphics plots within a \grid{} viewport. The fourth function provides a set of graphical parameter settings so that base {\tt par()} settings can be made to correspond to some of\footnote{Only {\tt lwd}, {\tt lty}, {\tt col} are available yet. More should be available in future versions.} the current \grid{} graphical parameter settings. The first three functions are \verb|gridOMI()|, \verb|gridFIG()|, and \verb|gridPLT()|. They return the appropriate \verb|par()| values for setting the base ``inner'', ``figure'', and ``plot'' regions, respectively. The main usefulness of these functions is to allow you to create a complex layout using \grid{} and then draw a base plot within relevant elements of that layout. The following example uses this idea to create a \lattice{} plot where the panels contain dendrograms drawn using base graphics functions\footnote{Recall that \lattice{} is built on \grid{} so the panel region in a \lattice{} plot is a \grid{} viewport.}. First of all, we create a dendrogram and cut it into four subtrees\footnote{the data and cluster analysis are copied from the example in {\tt help(plot.dendrogram)}.}. <>= data(USArrests) hc <- hclust(dist(USArrests), "ave") dend1 <- as.dendrogram(hc) dend2 <- cut(dend1, h=70) @ Now we create some dummy variables which correspond to the four subtrees. <<>>= x <- 1:4 y <- 1:4 height <- factor(round(unlist(lapply(dend2$lower, attr, "height")))) @ Next we define a \lattice{} panel function to draw the dendrograms. The first thing this panel function does is push a viewport that is smaller than the viewport \lattice{} creates for the panel; the purpose is to ensure there is enough room for the labels on the dendrogram. The \verb|space| variable contains a measure of the length of the longest label. The panel function then calls \verb|gridPLT()| and makes the base plot region correspond to the viewport we have just pushed. Finally, we call the base \verb|plot()| function to draw the dendrogram (and pop the viewport we pushed)\footnote{The {\tt grid.rect()} call is just to show the extent of the extra viewport we pushed.}. <<>>= space <- max(unit(rep(1, 50), "strwidth", as.list(rownames(USArrests)))) dendpanel <- function(x, y, subscripts, ...) { pushViewport(viewport(y=space, width=0.9, height=unit(0.9, "npc") - space, just="bottom")) grid.rect(gp=gpar(col="grey", lwd=5)) par(plt=gridPLT(), new=TRUE, ps=10) plot(dend2$lower[[subscripts]], axes=FALSE) popViewport() } @ Finally, we draw a \lattice{} xyplot, using \lattice{} to set up the arrangement of panels and strips and our panel function to draw a base dendrogram in each panel. <>= library(lattice) plot.new() print(xyplot(y ~ x | height, subscripts=TRUE, xlab="", ylab="", strip=function(...) { strip.default(style=4, ...) }, scales=list(draw=FALSE), panel=dendpanel), newpage=FALSE) @ The \verb|gridPLT()| function is useful for embedding just the plot region of a base graphics function (i.e., without labels and axes; another example of this usage is given in the next section). If labelling and axes are to be included it will make more sense to use \verb|gridFIG()|. The \verb|gridOMI()| function has pretty much the same effect as \verb|gridFIG()| except that it allows for the possibility of embedding multiple base plots at once. In the following code, a \lattice{} plot is placed alongside base diagnostic plots arranged in a 2-by-2 array. We use the data from page 93 of ``An Introduction to Generalized Linear Models'' (Annette Dobson, 1990). <<>>= counts <- c(18,17,15,20,10,20,25,13,12) outcome <- gl(3,1,9) treatment <- gl(3,3) @ We create two regions using \grid{} viewports; the left region is for the \lattice{} plot and the right region is for the diagnostic plots. There is a middle column of 1cm to provide a gap between the two regions. % Save and restore settings so that vignette building will work(?) <>= oldpar <- par(no.readonly=TRUE) <>= pushViewport(viewport(layout=grid.layout(1, 3, widths=unit(rep(1, 3), c("null", "cm", "null"))))) @ We draw a \lattice{} plot in the left region. <>= pushViewport(viewport(layout.pos.col=1)) library(lattice) bwplot <- bwplot(counts ~ outcome | treatment) print(bwplot, newpage=FALSE) popViewport() @ We draw the diagnostic plots in the right region. Here we use \verb|gridOMI()| to set the base inner region and \verb|par(mfrow)| and \verb|par(mfg)| to insert multiple plots\footnote{We use {\tt par(mfrow)} to specify the 2-by-2 array and {\tt par(mfg)} to start at position $(1,1)$ in the array.}. <>= pushViewport(viewport(layout.pos.col=3)) glm.D93 <- glm(counts ~ outcome + treatment, family=poisson()) par(omi=gridOMI(), mfrow=c(2, 2), new=TRUE) par(cex=0.5, mar=c(5, 4, 1, 2)) par(mfg=c(1, 1)) plot(glm.D93, caption="", ask=FALSE) popViewport(2) <>= <> <> <> @ \includegraphics[width=5in]{gridBase-multiplot} % Save and restore settings so that vignette building will work(?) <>= par(oldpar) @ Notice that because there is only ever one current \grid{} viewport, it only makes sense to use one of \verb|gridOMI()|, \verb|gridFIG()|, or \verb|gridPLT()|. In other words, it only makes sense to align either the inner region, or the figure region, or the plot region with the current \grid{} viewport. @ \section*{A more complex example} We will now look at a reasonably complex example involving embedding base graphics within grid viewports which are themselves embedded within a base plot. This example is motivated by the following problem\footnote{This description is from an email to R-help from Adam Langley, 18 July 2003}: \begin{quote} I am looking at a way of plotting a series of pie charts at specified locations on an existing plot. The size of the pie chart would be proportion to the magnitude of the total value of each vector (x) and the values in x are displayed as the areas of pie slices. \end{quote} First of all, we construct some fake data, consisting of four $(x, y)$ values, and four $(z_1, z_2)$ values : <<>>= x <- c(0.88, 1.00, 0.67, 0.34) y <- c(0.87, 0.43, 0.04, 0.94) z <- matrix(runif(4*2), ncol=2) @ Before we start any plotting, we save the current \verb|par()| settings so that at the end we can ``undo'' some of the complicated settings that we need to apply. <<>>= oldpar <- par(no.readonly=TRUE) @ Now we do a standard base plot of the $(x, y)$ values, but do not plot anything at these locations (we're just setting up the user coordinate system). <>= plot(x, y, xlim=c(-0.2, 1.2), ylim=c(-0.2, 1.2), type="n") @ Now we make use of \verb|baseViewports|. This will create a list of grid viewports that correspond to the inner, figure, and plot regions set up by the base plot. By pushing these viewports, we establish a grid viewport that aligns exactly with the plot region created by the base plot, including a (grid) ``native'' coordinate system that matches the (base) user coordinate system\footnote{ The {\tt grid.segments} call is just drawing some dashed lines to show that the pie charts we end up with are centred correctly at the appropriate $(x, y)$ locations.}. <>= vps <- baseViewports() pushViewport(vps$inner, vps$figure, vps$plot) grid.segments(x0=unit(c(rep(0, 4), x), rep(c("npc", "native"), each=4)), x1=unit(c(x, x), rep("native", 8)), y0=unit(c(y, rep(0, 4)), rep(c("native", "npc"), each=4)), y1=unit(c(y, y), rep("native", 8)), gp=gpar(lty="dashed", col="grey")) @ Before we draw the pie charts, we need to perform a couple of calculations to determine their size. In this case, we specify that the largest pie will be 1\verb|"| in diameter and the others will be a proportion of that size based on $\sum_i{z_{.i}} / {\mathrm{max}}\left( \sum_i{z_{.i}} \right)$ <<>>= maxpiesize <- unit(1, "inches") totals <- apply(z, 1, sum) sizemult <- totals/max(totals) @ We now enter a loop to draw a pie at each $(x, y)$ location representing the corresponding $(z_1, z_2)$ values. The first step is to create a grid viewport at the $(x, y)$ location, then we use \verb|gridPLT()| to set the base plot region to correspond to the grid viewport. With that done, we can use the base \verb|pie| function to draw a pie chart within the grid viewport\footnote{We draw a {\tt grid.rect} with a dashed border just to show the extent of each grid viewport. It is crucial that we again call {\tt par(new=TRUE)} so that we do not move on to a new page.}. <>= for (i in 1:4) { pushViewport(viewport(x=unit(x[i], "native"), y=unit(y[i], "native"), width=sizemult[i]*maxpiesize, height=sizemult[i]*maxpiesize)) grid.rect(gp=gpar(col="grey", fill="white", lty="dashed")) par(plt=gridPLT(), new=TRUE) pie(z[i,], radius=1, labels=rep("", 2)) popViewport() } @ Finally, we clean up after ourselves by popping the grid viewports and restoring the initial \verb|par| settings. <>= popViewport(3) par(oldpar) @ The final plot is shown below. <>= <> <> <> <> @ \section*{Problems and limitations} The functions provided by the \gridBase{} package allow the user to mix output from two quite different graphics systems and there are limits to how much the systems can be combined. It is important that users are aware that they are mixing two not wholly compatible systems (which is why these functions are provided in a separate package) and it is of course important to know what the limitations are: \begin{itemize} \item The \gridBase{} functions attempt to match \grid{} graphics settings with base graphics settings (and vice versa). This is only possible under certain conditions. For a start, it is only possible if the device size does not change. If these functions are used to draw into a window, then the window is resized, the base and \grid{} settings will almost certainly no longer match and the graph will become a complete mess. This also applies to copying output between devices of different sizes. \item It is not possible to embed base graphics output within a \grid{} viewport that is rotated. \item There are certain base graphics functions which modify settings like \verb|par(omi)| and \verb|par(fig)| themselves (e.g., \verb|coplot()|). Output from these functions may not embed properly within \grid{} viewports. \item \grid{} output cannot be saved and restored so any attempts to save a mixture of \grid{} and base output are likely to end in disappointment. \end{itemize} \section*{Summary} The functions in the \gridBase{} package provide a simple mechanism for combining base graphics output with \grid{} graphics output for static, fixed-size plots. This is not a full integration of the two graphics systems, but it does provide a useful bridge between the existing large body of base graphics functions and the powerful new features of \grid{}. \subsubsection*{Availability} The \grid{} package is now part of the base distribution of \R{} (from \R{} version 1.8.0). \\ Additional information on \grid{} is available from:\\ {\tt http://www.stat.auckland.ac.nz/~paul/grid/grid.html}. \\ The \gridBase{} package is available from \verb|CRAN| (e.g., {\tt http://cran.us.r-project.org}). \bibliographystyle{plain} \bibliography{gridBase} \end{document} We use the Plant Weight Data from ``An Introduction to Generalized Linear Models'' (Annette Dobson, 1990). <<>>= ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14) trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69) group <- gl(2,10,20, labels=c("Ctl","Trt")) weight <- c(ctl, trt) @ We create two regions using \grid{} viewports; the left region is for the \lattice{} plot and the right region is for the diagnostic plots. There is a middle column of 1cm to provide a gap between the two regions. % Save and restore settings so that vignette building will work(?) <>= oldpar <- par(no.readonly=TRUE) <>= pushViewport(viewport(layout=grid.layout(1, 3, widths=unit(rep(1, 3), c("null", "cm", "null"))))) @ We draw a \lattice{} plot in the left region. <>= pushViewport(viewport(layout.pos.col=1)) library(lattice) bwplot <- bwplot(weight ~ group) print(bwplot, newpage=FALSE) popViewport() @ We draw the diagnostic plots in the right region. Here we use \verb|gridOMI()| to set the base inner region and \verb|par(mfrow)| and \verb|par(mfg)| to insert multiple plots\footnote{We use {\tt par(mfrow)} to specify the 2-by-2 array and {\tt par(mfg)} to start at position $(1,1)$ in the array.}. <>= pushViewport(viewport(layout.pos.col=3)) lm.D9 <- lm(weight ~ group) par(omi=gridOMI(), mfrow=c(2, 2), new=TRUE) par(cex=0.5) par(mfg=c(1, 1)) plot(lm.D9, caption="", ask=FALSE) popViewport(2) gridBase/inst/doc/changes.txt0000644000176000001440000000147112302520704015713 0ustar ripleyusers FROM gridBase_0.4-6 TO gridBase_0.4-7 ------------------------------------- 1. Changed to ONLY using Imports for 'grid' and 'graphics' (no longer Depends on these) (to satisfy stricter R CMD check) FROM gridBase_0.4-5 TO gridBase_0.4-6 ------------------------------------- 1. Changed to using Imports from 'grid' in NAMESPACE rather than just Depending on 'grid'. Ditto for 'graphics'. This allows other packages to Import 'gridBase' without having to attach 'gridBase' to the search path. (Thanks to Martin Maechler for the suggestion and patches) FROM gridBase_0.4 TO gridBase_0.4-1 ----------------------------------- 1. Updated demo(gridBase) Was using very old gridOMI() behaviour which actually set par(omi) rather than just returning a value to use in a call to par() gridBase/inst/doc/gridBase.R0000644000176000001440000003242712302520733015414 0ustar ripleyusers### R code from vignette source 'gridBase.Rnw' ################################################### ### code chunk number 1: gridBase.Rnw:81-84 ################################################### library(grid) library(gridBase) ################################################### ### code chunk number 2: basesetup (eval = FALSE) ################################################### ## midpts <- barplot(1:10, axes=FALSE) ## axis(2) ## axis(1, at=midpts, labels=FALSE) ## ################################################### ### code chunk number 3: baseviewport (eval = FALSE) ################################################### ## vps <- baseViewports() ## pushViewport(vps$inner, vps$figure, vps$plot) ## ################################################### ### code chunk number 4: gridtext (eval = FALSE) ################################################### ## grid.text(c("one", "two", "three", "four", "five", ## "six", "seven", "eight", "nine", "ten"), ## x=unit(midpts, "native"), y=unit(-1, "lines"), ## just="right", rot=60) ## popViewport(3) ## ################################################### ### code chunk number 5: gridBase.Rnw:110-114 ################################################### midpts <- barplot(1:10, axes=FALSE) axis(2) axis(1, at=midpts, labels=FALSE) vps <- baseViewports() pushViewport(vps$inner, vps$figure, vps$plot) grid.text(c("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"), x=unit(midpts, "native"), y=unit(-1, "lines"), just="right", rot=60) popViewport(3) ################################################### ### code chunk number 6: plotsymbol (eval = FALSE) ################################################### ## novelsym <- function(speed, temp, ## width=unit(3, "mm"), ## length=unit(0.5, "inches")) { ## grid.rect(height=length, y=0.5, ## just="top", width=width, ## gp=gpar(fill="white")) ## grid.rect(height=temp*length, ## y=unit(0.5, "npc") - length, ## width=width, ## just="bottom", gp=gpar(fill="grey")) ## grid.lines(x=0.5, ## y=unit.c(unit(0.5, "npc"), unit(0.5, "npc") + speed*length), ## arrow=arrow(length=unit(3, "mm"), type="closed"), ## gp=gpar(fill="black")) ## grid.points(unit(0.5, "npc"), unit(0.5, "npc"), size=unit(2, "mm"), ## pch=16) ## } ## ################################################### ### code chunk number 7: baseplot (eval = FALSE) ################################################### ## chinasea <- read.table(system.file("doc", "chinasea.txt", ## package="gridBase"), ## header=TRUE) ## plot(chinasea$lat, chinasea$long, type="n", ## xlab="latitude", ylab="longitude", ## main="China Sea Wind Speed/Direction and Temperature") ## ################################################### ### code chunk number 8: gridsym (eval = FALSE) ################################################### ## speed <- 0.8*chinasea$speed/14 + 0.2 ## temp <- chinasea$temp/40 ## vps <- baseViewports() ## pushViewport(vps$inner, vps$figure, vps$plot) ## for (i in 1:25) { ## pushViewport(viewport(x=unit(chinasea$lat[i], "native"), ## y=unit(chinasea$long[i], "native"), ## angle=chinasea$dir[i])) ## novelsym(speed[i], temp[i]) ## popViewport() ## } ## popViewport(3) ## ################################################### ### code chunk number 9: gridBase.Rnw:184-188 ################################################### novelsym <- function(speed, temp, width=unit(3, "mm"), length=unit(0.5, "inches")) { grid.rect(height=length, y=0.5, just="top", width=width, gp=gpar(fill="white")) grid.rect(height=temp*length, y=unit(0.5, "npc") - length, width=width, just="bottom", gp=gpar(fill="grey")) grid.lines(x=0.5, y=unit.c(unit(0.5, "npc"), unit(0.5, "npc") + speed*length), arrow=arrow(length=unit(3, "mm"), type="closed"), gp=gpar(fill="black")) grid.points(unit(0.5, "npc"), unit(0.5, "npc"), size=unit(2, "mm"), pch=16) } chinasea <- read.table(system.file("doc", "chinasea.txt", package="gridBase"), header=TRUE) plot(chinasea$lat, chinasea$long, type="n", xlab="latitude", ylab="longitude", main="China Sea Wind Speed/Direction and Temperature") speed <- 0.8*chinasea$speed/14 + 0.2 temp <- chinasea$temp/40 vps <- baseViewports() pushViewport(vps$inner, vps$figure, vps$plot) for (i in 1:25) { pushViewport(viewport(x=unit(chinasea$lat[i], "native"), y=unit(chinasea$long[i], "native"), angle=chinasea$dir[i])) novelsym(speed[i], temp[i]) popViewport() } popViewport(3) ################################################### ### code chunk number 10: gridBase.Rnw:220-225 ################################################### data(USArrests) hc <- hclust(dist(USArrests), "ave") dend1 <- as.dendrogram(hc) dend2 <- cut(dend1, h=70) ################################################### ### code chunk number 11: gridBase.Rnw:229-233 ################################################### x <- 1:4 y <- 1:4 height <- factor(round(unlist(lapply(dend2$lower, attr, "height")))) ################################################### ### code chunk number 12: gridBase.Rnw:248-260 ################################################### space <- max(unit(rep(1, 50), "strwidth", as.list(rownames(USArrests)))) dendpanel <- function(x, y, subscripts, ...) { pushViewport(viewport(y=space, width=0.9, height=unit(0.9, "npc") - space, just="bottom")) grid.rect(gp=gpar(col="grey", lwd=5)) par(plt=gridPLT(), new=TRUE, ps=10) plot(dend2$lower[[subscripts]], axes=FALSE) popViewport() } ################################################### ### code chunk number 13: gridBase.Rnw:266-273 ################################################### library(lattice) plot.new() print(xyplot(y ~ x | height, subscripts=TRUE, xlab="", ylab="", strip=function(...) { strip.default(style=4, ...) }, scales=list(draw=FALSE), panel=dendpanel), newpage=FALSE) ################################################### ### code chunk number 14: gridBase.Rnw:290-294 ################################################### counts <- c(18,17,15,20,10,20,25,13,12) outcome <- gl(3,1,9) treatment <- gl(3,3) ################################################### ### code chunk number 15: gridBase.Rnw:302-304 ################################################### oldpar <- par(no.readonly=TRUE) ################################################### ### code chunk number 16: regions (eval = FALSE) ################################################### ## pushViewport(viewport(layout=grid.layout(1, 3, ## widths=unit(rep(1, 3), c("null", "cm", "null"))))) ## ################################################### ### code chunk number 17: lattice (eval = FALSE) ################################################### ## pushViewport(viewport(layout.pos.col=1)) ## library(lattice) ## bwplot <- bwplot(counts ~ outcome | treatment) ## print(bwplot, newpage=FALSE) ## popViewport() ## ################################################### ### code chunk number 18: diagnostic (eval = FALSE) ################################################### ## pushViewport(viewport(layout.pos.col=3)) ## glm.D93 <- glm(counts ~ outcome + treatment, family=poisson()) ## par(omi=gridOMI(), mfrow=c(2, 2), new=TRUE) ## par(cex=0.5, mar=c(5, 4, 1, 2)) ## par(mfg=c(1, 1)) ## plot(glm.D93, caption="", ask=FALSE) ## popViewport(2) ## ################################################### ### code chunk number 19: multiplot ################################################### pushViewport(viewport(layout=grid.layout(1, 3, widths=unit(rep(1, 3), c("null", "cm", "null"))))) pushViewport(viewport(layout.pos.col=1)) library(lattice) bwplot <- bwplot(counts ~ outcome | treatment) print(bwplot, newpage=FALSE) popViewport() pushViewport(viewport(layout.pos.col=3)) glm.D93 <- glm(counts ~ outcome + treatment, family=poisson()) par(omi=gridOMI(), mfrow=c(2, 2), new=TRUE) par(cex=0.5, mar=c(5, 4, 1, 2)) par(mfg=c(1, 1)) plot(glm.D93, caption="", ask=FALSE) popViewport(2) ################################################### ### code chunk number 20: gridBase.Rnw:346-348 ################################################### par(oldpar) ################################################### ### code chunk number 21: gridBase.Rnw:375-379 ################################################### x <- c(0.88, 1.00, 0.67, 0.34) y <- c(0.87, 0.43, 0.04, 0.94) z <- matrix(runif(4*2), ncol=2) ################################################### ### code chunk number 22: gridBase.Rnw:386-388 ################################################### oldpar <- par(no.readonly=TRUE) ################################################### ### code chunk number 23: plot1 (eval = FALSE) ################################################### ## plot(x, y, xlim=c(-0.2, 1.2), ylim=c(-0.2, 1.2), type="n") ## ################################################### ### code chunk number 24: plot2 (eval = FALSE) ################################################### ## vps <- baseViewports() ## pushViewport(vps$inner, vps$figure, vps$plot) ## grid.segments(x0=unit(c(rep(0, 4), x), ## rep(c("npc", "native"), each=4)), ## x1=unit(c(x, x), rep("native", 8)), ## y0=unit(c(y, rep(0, 4)), ## rep(c("native", "npc"), each=4)), ## y1=unit(c(y, y), rep("native", 8)), ## gp=gpar(lty="dashed", col="grey")) ## ################################################### ### code chunk number 25: gridBase.Rnw:427-431 ################################################### maxpiesize <- unit(1, "inches") totals <- apply(z, 1, sum) sizemult <- totals/max(totals) ################################################### ### code chunk number 26: plot3 (eval = FALSE) ################################################### ## for (i in 1:4) { ## pushViewport(viewport(x=unit(x[i], "native"), ## y=unit(y[i], "native"), ## width=sizemult[i]*maxpiesize, ## height=sizemult[i]*maxpiesize)) ## grid.rect(gp=gpar(col="grey", fill="white", lty="dashed")) ## par(plt=gridPLT(), new=TRUE) ## pie(z[i,], radius=1, labels=rep("", 2)) ## popViewport() ## } ## ################################################### ### code chunk number 27: plot4 (eval = FALSE) ################################################### ## popViewport(3) ## par(oldpar) ## ################################################### ### code chunk number 28: complex ################################################### plot(x, y, xlim=c(-0.2, 1.2), ylim=c(-0.2, 1.2), type="n") vps <- baseViewports() pushViewport(vps$inner, vps$figure, vps$plot) grid.segments(x0=unit(c(rep(0, 4), x), rep(c("npc", "native"), each=4)), x1=unit(c(x, x), rep("native", 8)), y0=unit(c(y, rep(0, 4)), rep(c("native", "npc"), each=4)), y1=unit(c(y, y), rep("native", 8)), gp=gpar(lty="dashed", col="grey")) for (i in 1:4) { pushViewport(viewport(x=unit(x[i], "native"), y=unit(y[i], "native"), width=sizemult[i]*maxpiesize, height=sizemult[i]*maxpiesize)) grid.rect(gp=gpar(col="grey", fill="white", lty="dashed")) par(plt=gridPLT(), new=TRUE) pie(z[i,], radius=1, labels=rep("", 2)) popViewport() } popViewport(3) par(oldpar) ################################################### ### code chunk number 29: gridBase.Rnw:544-549 ################################################### ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14) trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69) group <- gl(2,10,20, labels=c("Ctl","Trt")) weight <- c(ctl, trt) ################################################### ### code chunk number 30: gridBase.Rnw:557-559 ################################################### oldpar <- par(no.readonly=TRUE) ################################################### ### code chunk number 31: regions (eval = FALSE) ################################################### ## pushViewport(viewport(layout=grid.layout(1, 3, ## widths=unit(rep(1, 3), c("null", "cm", "null"))))) ## ################################################### ### code chunk number 32: lattice (eval = FALSE) ################################################### ## pushViewport(viewport(layout.pos.col=1)) ## library(lattice) ## bwplot <- bwplot(weight ~ group) ## print(bwplot, newpage=FALSE) ## popViewport() ## ################################################### ### code chunk number 33: diagnostic (eval = FALSE) ################################################### ## pushViewport(viewport(layout.pos.col=3)) ## lm.D9 <- lm(weight ~ group) ## par(omi=gridOMI(), mfrow=c(2, 2), new=TRUE) ## par(cex=0.5) ## par(mfg=c(1, 1)) ## plot(lm.D9, caption="", ask=FALSE) ## popViewport(2) ## gridBase/inst/doc/chinasea.txt0000644000176000001440000001655007732444644016105 0ustar ripleyusersDate Time Date2 Time2 CSEId name id lat long elev press temp dew rhum shum speed dir u v rain snow sflux lflux isr osr ilr olr rad skin co2 inpar outpar 2001/07/01 00:00 2001/07/01 00:00 CAMP 46759 Hengchun 22.00000 120.74000 22.10 1006.80 28.90 25.40 81.00 20.29 4.70 90.00 -4.70 0.00 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46762 Lanyu 22.04000 121.55000 324.00 974.10 27.10 25.50 91.00 21.10 7.60 90.00 -7.60 0.00 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46754 Tawu 22.36000 120.90000 8.10 1009.80 27.90 25.40 86.00 20.23 0.90 30.00 -0.45 -0.78 0.60 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46744 Kaohsiung 22.57000 120.31000 2.30 1007.50 31.20 24.00 66.00 18.63 4.60 160.00 -1.57 4.32 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46766 Taitung 22.75000 121.15000 9.00 1009.90 30.80 21.80 59.00 16.24 0.50 320.00 0.32 -0.38 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46741 Tainan 23.00000 120.20000 13.80 1006.50 30.50 26.20 78.00 21.29 0.10 0.00 0.00 -0.10 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46761 Chengkung 23.10000 121.37000 33.50 1006.10 30.60 24.30 69.00 19.00 1.30 200.00 0.44 1.22 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46730 Tungchitao 23.26000 119.66000 45.00 1003.20 30.10 23.90 69.00 18.60 3.20 80.00 -3.15 -0.56 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46755 Yushan 23.49000 120.95000 3845.00 644.80 8.60 -2.70 45.00 4.84 14.00 130.00 -10.72 9.00 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46748 Chiayi 23.50000 120.42000 26.90 1004.50 29.30 24.40 75.00 19.14 0.70 40.00 -0.45 -0.54 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46753 Alishan 23.51000 120.80000 2413.00 764.30 18.40 9.50 56.00 9.72 0.90 10.00 -0.16 -0.89 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46735 Penghu 23.57000 119.56000 10.70 1007.00 31.20 26.40 76.00 21.54 1.30 100.00 -1.28 0.23 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46765 Jiyuehtan 23.88000 120.90000 1015.00 899.60 24.70 20.00 75.00 16.33 0.10 0.00 0.00 -0.10 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46699 Hualien 23.98000 121.60000 16.10 1007.90 29.70 22.40 65.00 16.89 5.80 230.00 4.44 3.73 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46749 Taichung 24.15000 120.68000 84.00 998.40 29.30 24.50 75.00 19.38 0.50 190.00 0.09 0.49 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46777 Wuchi 24.26000 120.52000 7.20 1005.50 29.50 24.20 73.00 18.89 1.70 40.00 -1.09 -1.30 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46706 Suao 24.60000 121.86000 24.90 1006.10 31.30 21.50 56.00 16.01 5.10 170.00 -0.89 5.02 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46708 Ilan 24.77000 121.75000 7.20 1007.60 30.50 24.30 70.00 18.97 1.50 50.00 -1.15 -0.96 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46757 Hsinchu 24.83000 121.01000 26.90 1005.20 29.20 25.10 79.00 19.96 0.30 90.00 -0.30 0.00 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46692 Taipei 25.03000 121.52000 8.00 1007.60 29.80 22.90 67.00 17.42 0.30 240.00 0.26 0.15 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46694 Keelung 25.13000 121.73000 26.70 1005.20 30.30 24.80 72.00 19.60 2.20 40.00 -1.41 -1.69 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46693 Chutzehu 25.16000 121.54000 607.00 941.80 25.00 22.10 84.00 17.76 0.60 340.00 0.21 -0.56 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46690 Tanshui 25.17000 121.43000 19.00 1006.00 29.30 25.80 81.00 20.80 0.70 280.00 0.69 -0.12 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46691 Anpu 25.18000 121.52000 837.60 918.20 24.10 22.30 90.00 18.44 2.90 350.00 0.50 -2.86 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 2001/07/01 00:00 2001/07/01 00:00 CAMP 46695 Pengchiayu 25.63000 122.07000 99.00 997.20 28.20 24.80 82.00 19.76 13.10 150.00 -6.55 11.34 0.00 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 -999.99 gridBase/inst/doc/gridBase.pdf0000644000176000001440000043163012302562265015771 0ustar ripleyusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 3290 /Filter /FlateDecode /N 62 /First 489 >> stream xZiWH>}R-s@tНaˠJ6 9FH*zv_I<$GQ!!QB=K%Hd^R ы6'+4 H!*B 7"bt= MXk2rK$ clgd|Gd{M|yhI8Z+ |^`d67I:,tF}KuZ =s^r2ͮopi$S3#~X$/"Fdb,T\,$vS X(,,l;n/ Rd~6J)(0BQryv{sS:+(oQ#q:OoY24[BdZq5'l|weٜJPS;4b'SʁU$.NWs"c) H``~3cr2pr{ot"&T?O8šxcQOh/8u8Vw 砉WG#gl\9llL 砅s gcq0y:Mswl?t_B'w7)T5'74C:O,"f=j98I'ŷچUĮ؇mu!#Xq*ą&N%*anЕ[ii"o"M7Ub56+=n8hmTݝΝy)ޠL>JeTL)XL<@ER VF@\TEoj)|8VB_-A!/l;@vt5:)mo U7 . Jp[YOW<7nvkg;`qMw.^˵NL<i F/%6z r&SOԢ d5<uhdix6m`Y#ɂq3G:UsVF\aI}Vy+E>2i~*Ml[LFd;C4p̳n c?5ЏLH\O-#\sǹ9QAy:Xx?hv3>Od$yȨ'u=>sA^[HFVWX8Y MVv$T/UH]\w6+qy|Ww"肝0G-G(ZH;ÜuroO[_9aʸ.U 7[RZAkJ7t+ [T6:uQBݢu'vXOJӼ,ؒn;i'EiZtmG& Z0[TS)y<|dbII>UrJ7$Rzww~'RNEiMѪv,(:e&MƻClʓ2"{v`mE5ImICY%N?n1[t*yv?tG^@f9^Pdz,͆*ȁ=q3r䕵]Be93Ɍ"{ Diq;_HX2>t2&p+eҷZ(Fe3[|ILD ȕ:.nG 'hQ/="YU `%?4(wQNec{erxP#Kޱ4vmCj]xxLxyY\90~},ݐ|%Oq^*nqY *~u:xk~YWX,o1:I(L$f0a#,fqC `f$ [;OT$[>(sAXuxP 7UZZweIWW*[ukK%7& Ì(wTASHSMELۈy1q#xCTTh~Q}V]%h!t@Y^õQXY)Q^P5^\=.:3/V>|UVU_W10e] X}f^8[jɦ9"$i&Zm 3&ӛ|צcx :dP>(JdV-7.EyT\:!aZL@Zl? GbاP6]Th:'ftQ4$U:)XSmb7&>>qĻT6ʾ)|\Y!^~qw2vy:?f OaI0ZY-ge>+>HoQƹm"뭵)W7_U}ga \B3CߔL{m_Qzn nߊ \G$=T=wT+ĐS.Yucn: >W&H%WݲTwmM7RiuYI.9MV <[ LPG=Z۳ڮ2Z Y!_>0's!X>z|+ SQeŀb29r WnvpϹ\jA(xp>a毮6FK1WT7$Z R6IzQ\ V kR za?NzXٯ:`^P"2qyT(v){ls׫;?sT U m3E{SQeCPz 1N;mOvsyƁov3E.R4mƈٕzqysH]Irm/;*Oh'SMU/'u7\'ߞꋮ_g]n/Fd> stream xڭZIoFr IbNid&31rImI(>oNL[T+JZ۶nN3jmy-Z5icNPVw܄<~8qFVg|)ܬ?]{TUW%e_{3KV[PSN(XQZtJҊE%{#S7<qucZ Dm_zOENA¸{*NJEkW]9PԪ|1 ܨ^vu\ "3f̕MDb6TN]{ں~[J~YEp4ϙjw [Vp8M6N^~ sn%`Vo~SܿM(pC FӀ-W%v䣰"Lk NQ}\j^|e߭%I 1oe5| OѺמ>17 ]D#<f|8 ;R$X7Fp0|6*[)LokK$YΈ85&Vǀ+MJg^Z>8B^S 원i;]7B7Um+'&Bp,Ga?~FJ:+oAp.![J7o:)LP'$dO1>+bB?zi5[bE_~HI?<{nZo4 q*g '3ğ1Op!E@z oICaʕt5cN#JI JۘC5 [׃Qֺ2ycQU4-h$sm`L-QK]FY}u\NBkلl,ɯtL R(g|>{#XH9/w}O5+z#*5ޫ`nG;8P+?$É${IohT8@/ToK/HQ]-Dkٮkۨ?]wQ%(HT]F?tGD~IN)j'Bڼ.կߋrtbR)wmJE]I2l(p YEÈ&pRYlR3h̩P4pE·Ϲ]XH0'n: O. @tfV)fxɊfyJC?^@JR4hE$gj]ljq_9e)qh V1'CӱYxnhXO1/{|3f Y?AAr_Uî$Z/4~K5X[Dsncp>l=*zb8y5i(5_Շ$GRz%$1CL6r{uE6i+jJ>,ا\/%O -hhD<Ǔ->dԂ2&\ꌉE,FO4_Xl )cԙ90ɲ:%86t`p5b=R伴6/ĉ‡/q7>[x]֧^j x(:*'jB0߆z8{dӒi'>s~dPGb0?fJzơ i9R܉I16?Oaie9mR byq&ߎn$ov3GD-F~Dt "EvكpwvsjQ û3qv(h.ɳ/6kON҆*aqЪ".4;$h @'I|bOqE!j!6r OEv(zDŽafر)w4#\Cfe%;+Ӡ+Ҡ;oLZp^ g~'"? S\E8??LaFQP:^υ~Ă>>쟲tha&bU}^)z'K{=‡4uQ+?xA~pهڭuG&l+b+[\jhK zZ|_l& oăf,ϟ*:[wRŖ͸6wFX5Ayg?F~@rX鰒IoYE4ojn}7#9?}$"M>,/k'x? vW٧[bDuxC.~?A-' },&jWm͒qt鸧0s+r]_r !%g*%)?#arr1uS?6g-9?:endstream endobj 65 0 obj << /Filter /FlateDecode /Length1 985 /Length2 3779 /Length3 532 /Length 4442 >> stream xy L\ EH85(oBP˿K(oߐ .u (oӥH!z^oH F 閽Cg_#+*eRRJVP$~dg~x,hlUVYx@ KMEeFDF3OɊ;|\ss{^1 g>z&ڟq˸TFVʌC3:rOK̳K0Wxk*W-RS-|MFW$ aqӪ5ɔB0 zZ yƧrE :m^ SU/k7#1hED R)mN> 15{U!~+UBse{wO:Y:FsX3.{']-WRFiV^ro2<[*PW`= >4ByS0B]Rջ8k3keUO>V$N B2*N[2^jv!Ac%C{նB|Vđ ^vʸNyEt oW09CxXڗzYWb}O qk3Ax~8^WAv5*㥇7 ZD#l'VNmDRfD=eln.VP>9qMQVDcr)EJ[]G,&n$UpH h2e}b婫i4rnY(X[ڣG!l\^M[贽p&sY,s.OgH}&Y6;[3>uEʅ;!= TiCwXDiS;WӮUXե U]2-5}@64 dncu7RZ LG9:LAE ց~]J 88XTYvҤ V?bb6A *T].V7耮Avh5BvNo{EXQ7Gev #s>ȧ&n14wjlMf{)'8n(uQtU '%K>wYqUGiAX{]N*;cWE} ~SEmN{i݉-Y@늽JlK|pdJb7OEĐiYF,nE)_T8Vx 8[{Rq]+qXR<<ˑQ/ȨV)SVmY剐h,C:eh`xq,<"v_}WH^1'ܗ84!OEʻEKK|u9*~Sl4겜Ӄsf<nYj-)ٺͦtlv[jꉢn};q)>PDҩ&MA}!aZcWIq B ^ZȏUKvqzӍ4B V&JXayvbνk]lCEq2.Ml‘O =>dorz/l"sv.4U"Kޞ9Ss-C6Zb"܅LС˝ [RXENl\P] I֍3ST 7Ybļ :?Q@X)3:jf`𷰵Q 2g]$DE6&2?BظĆ7'9w [?1`%^W|I|%vkf(Jg$Ε ǽbPȄʍ{g*\\eAZ}jЀwf~nO5׻]Y¦%d|7̰ RF2M*D~@ RwJN# E+HI[k." w FHO-.m 3g7Uba-uCU;usw=|[=`n<`9Vxُa_-H iK<*rubEB\Ƚ-\O7k|,ѣ]5[n,KnviD^O[=hA`/˓9ӧV"6&X.q0nQ|?, kn;2IbS Ӣy.UExųu ]PM9)z> stream xRi<}VB Y"%CI1Z6l2Œ1΍Hv&KvI 5Y)e,e3{||O﹮/qybf2(U@BTm <IHh2HAѪDEhz8` UV$m DNhK}).h &څDK"&x<`;`vG<(Y6@ad*K`Ȁ!J?i%O4ɝ 8A)#BcD]hzPypwM2Ճ&&DDSjzY5 #X&?)2ÒNwGԟ!}APnc+s?jf,|w !a{, _K$Bao?%ڛXN@$ӏ"89$(rh7 _^0%@@NBt/DwЭr@z6@z0oWItcgE*20 (K 5oǏF{lCD_%}L'h94 4$v|C*8|piJk{#nO!ni;SW2|.g|t=6wq(֡p˫NY]>˛wm72Z{/-\LK Luqaq~eGHz&;(7ɲ7~_OFnxR0bq f 7_7 d],Rۓi›,M,Kwڣv`uҳ 5>cmP #E"Sk?&Ҋ1-{',кްۦ>W&Sԯ'oG1k6%5**r{dg" %_Lw`V<9WyYzac_uE]ZgywK,vR8NYbLg[ϣDn*ʖ4_-ib/ņ[1R'Z.q5ZNÃ8{A!2>M57'S\iѡ K<^FsbsliU;[ƞTHIySdewƜ 0o$1B?7YbtpU8*iyuN7l6Պ"7ݭI)O(W*r>=B(0~DugQ*OuT,:?L)|pO562jُ5^G6Xhj*db^~UgKctc楷G^7}0 ;˘KEIdSK2TI9Z#ݧN {mfy|9pTjS(~CڂS7 s":[v%S>G"gVfqWjf.`0fE\ԃJMCMLZ¸јnndF[_ٵ-jzq=yL6B [{?5 ;T]xһsƌj#+[ڃ3H=}tsr~JKBZ#Ơ+OL2.(άtΟ1J[6Z(Rl=zY0!dBZ)pFF6Flj2&"~%?O;g6MѐO GW+OCW8`ێVnŞ:V|W ç2U9TtQ޼˙58cTB3MqUnn6\,OWNh,UFAl(zwJ FҼ_΅8NiigHB6ŔtQO;ӧd"0/,R*>h[eǔ<ڙ+_S_'CC%Jv $0!!&in]Hu[TA99~m3zJ\9{}5㦱E4'RcͰ)hH#WͯAzߘ"B<|)I:p&,;;zBO89@Ɩy'|`EVtyv2-ϖ⢴Sab7 myZ_e럛0_,;c64A J![9uaGӂƅr0d*c!-U[&C̗_/=9e#f-o{8@bkU|<} s]_o,-% BK\1jvᡔS:U}^Yhg(܈zNd\~®,TaXupMCYhQ^>N1uG4RN H֊>YUȴdn}Oai |kaģ$2Arf4}e`endstream endobj 67 0 obj << /Filter /FlateDecode /Length1 1836 /Length2 12604 /Length3 532 /Length 13620 >> stream xeT]h =@={p][Р-ȩN;?uǥkgUEAB(nkDSff0301 SP8 mmD <fnn8Osw075sPP3`nd`3p2ZrXTĺN VVp(.@cxffhjn-acg3tpII IX&j@Z3?٨kOsv:l6s:nr@csg9*d`en `wQ hhdd01r+1 _c6Nv1펃@ ̠y?jۘX9"v'3ll@@{ 0u@AghؿAV6'=a6& hWGdPv#[kk?vO,`'ANAg, 9GAj@@smgV=OkrCT28A CeJ!%h}R8?'@+@UPC!n%鿮 (n7\\l&_r܇T/-/_>dBuFdeB_r !/Y9 +dWY +d@-;wBaa[7Oz?!?' FP& Wlx,RC| gʡhM[z#ă[}٪x@>:$v}!pRovFq!~`GxѼp{05^Y4}9tH%zA֫؛!a%4D5;,-t5)rs:"vʶ6/M+ͨUySH(}`F(`8ZU ӛę sE֩AJm_VϬHz2ж2 呻S&ї|JS~ R`F 3m>vIB9›>[S(" )4 (80]qgRRF{SMf i%\R?-h݄@ K0?&K=a5t)2aG#Mye@혧[9okU΁ة0I_.ag5o!P9p ;mBq ;L3,Gf$%8J, [P8S1!Y ^ Ri*zɠ_q[oOڼ'Rb&#qPd4C1=1%qDw:.N&n^xkQU!(͗Ytz,E>9Qk0"gQhn 2I9>.Kze1dO12v' 6?Ue|`P E;<Ҩ"|/Ep9{..`o f*Cv2.0 Cp8ҍ_Xzi!+j0bYRCUoէ3,M> X13>&L_61 dG.&VZJUc7ʈQ[xr=/KD5i1M?M{K8T|w*,;Pê.gT0l?v?ǾRWz9Qk=0!=2^w}23cPi 9q} ]!~~"Yxb~5Ez|1ue^"/K1!i,0{jy wX:+IĒ䡴]ƛIB.F,<\;3F<ڋ%5 Ӧݹ:G$@'j U I 쓡zHA啜ďpl1j6pb" oڎzpW38som4zZ.nPx`s.Bx_x@h] &E4j_3 G53&Ļ|2[~Vbԋ \UfU~XŞbps:/cGN{_R|5esDI8Fj[qe45*57LWd-{1k ?.{T2dcܷqG@IP1 Ӽ8vʖJ"PDN)I ?CNic^/hwb7 c7ٷjqŻ V X<޶(5_{J"םC |ExM]9ev/hrvۙv|t(& l顤\{ۛZF|mnhR~Oߕa|äivK-Y| ;Ӎg[a= ^ߐwI,Ѩ)x x!B=_J{7թD~sQw E$[tNFxvjƤIstV0̶/R&6rW@ =H &j s+hΰ4(`?N ?E#BCv \@w`OWWfK6bx #}'pLTYsgR ѯ)BJԝPF0.7>B~q?طc*-&T0Վͱ\G΀Au+4JUXpdn7O/>J/ yՁ qbpa `E4$yy]vzɝ2:PJus K1HYJŃu1D"ʧEկi'q Rz5l5ɩۧ%}?Q% &*hϪЖ)UN>kCC&= ˘1*xDR\`=%3G8tjwhVW띅b(Fb3xHWS6HKI}_z'A)i KuXKt ^'r &X%s.)TSl c~x ^Xɗ D|iӭR9aytz=?l ,@oU,gz8/ܹ&+$ZLZ 2_rlb©OˡV̷h/eh>b7q .+cv76_v"rڪS\2 +E ֘Iug kܛdaU1,R{{&([ s!X{4Hjdg.Ȟh1NfbB^}#tl57#9Ṇ.TjN%n߫;(e%әf>ő [tb1/go]5ڿꗞ0ޙH>?(O" 0e9\vЫ^e2Li؇-"L_yEƂSwqtqv$+9>^vXxE(&+  GHɟKOExFౠ)7vT+kX݌Ti,־4m rƵGyn/ȑs}lGLRiFv>) A;S"!uhf`/t(W)Fzu>4>g&~oXLon sUxsܮ|Jy<Ӌ21-~sh.3$2#[p+jpjxyXTJj ]BP)86oe% Εzzr,s?V-^>$.,\=ƽ%ku({\{3p~$8t:,_q T㐈0#FĎewHjT# KEj5oXWġ6ii\!Ư 'Z5dLbS4w*x&85Z;Smܚ{.н(̤ K`zqaxSD}y~O`0 *J m`4|f]8) NN'vLj+YcQU4#uBW_t\7w .K TyS#Wl3:<^~jϭ Yxg1ҠI܉۳b\rY]B8>r+KmWp?P=f}9xIw~cw*BՉpئ?{8*ƀL$x؁ Z1ZpZ2TF"ϸs.0S=w c:E?9'39'8KNLWc,BMa"c7f Ɍk:D$qe;Np7 ṣcCq_4sXcWYWP(oay ԯS8,2}v_^~B}}a#paQ,QW1sG #10nwNPi% @Ɵv5?+,|BCT.&)؜uCZS@I%U@G1̘Eź.Ca4U{]pkBxzGJςlTδ\Ķte>V+D+hO9 LAl3aV{R_'~Cl'E03TkӐ {:~~A(Âx,3R2U~?hd#XCհFlC45"\5PLC`SrȻLĄ:̃.Nvi* KuyM֫tL1cWCZnOkQE8wTCu]2ssDԌlubBg<"O vEQ*WS Pq#u>a~7U8nR|!\|?>4i7Mn|J!_5mi\.SfoBu]n* J()pY`y@Mh +j{UO kd *p?•gGӨcz9]:FK󡣔M9)26HlQLi!zgyzy{f+Kʬ。l\]nyZ5AO$%X'"MCc4izgƀaZߍ[ pT:":tu#X˖ N?v-YX.mb٘8Fo|)sdIqjH2N!:FЪfjn'`ȸMUTاo.}Mgfnlŗ)3k̢ý+n`U]#Gc yg L##JHML[ %P< mJsjeԸ2^ncByI'mߡj9m-se{݃; ehxf$RĈ1|%zl * i)i-6"){ϭP?ϓHX&BVwz/X#kRB`Z:-U\d h3aXo JBTMRA*ݙ"ԋ 5 b=iAo\u{?@Ff+D{;lj^ϯv`CF<bHv)ZD f۴aj`v"y[MffK n*l\P*ܜ Q%rQ"%Y[YYz2j5? hQA{u{!S+Kr6|%Έ555Z%:Q7oŮ hg[G.BKkH6t.Bp ;r "jɂ.(a[u4׳1^)|w߭(VΣİS Ui^y"*ԋ(M{"4VhWo \ѝ)Jݳoِz _h6s56#isuD#["d<$âLx)5iE94šK{H|O7`ELh@Δ aqG1Flz;M`hДZ'S t\d~#wkV<,Z cX.Zkz_ JPK3W0n9(ŸUrN!+z>vd{]\ C˥ 9txGjoơWtPoQ]4hc s] @~G${~/+lH GF:J{^;3c@G$O*2 ư!b7hJp}u*/ d6*Իq#aY6 nyfI,kYZ7l#s"͟۸4r%1d7dmW;\d=nƥ&WޤF><dE=~qySBރ> 9ǨP5:xlةAkX)EKiYt:KS̀D,7\pL*M3gsa\VQI5=e^I.Ցw3@ jc^xbvv`?cs^֒*&t6^2 n@V!"*m[+"`GmA^ΓLAp_-xl:>Z,8}ݑ4Ǐe@=~57BR߾ 0߀sn[Iňz~hFtKN~"U]|kyb \e|ᜅxkx<&_ ^gb cr<| ;?ˆ!Z#f50z_w6?h;X=,G =WbH3)[ aHD~{J4xٳK1X#V-LA!X^ xK /UtTӓ{^58 ɸ, B&^]_EM#4oϡ+@}]2UIQdN]#'u8aVu&рlot%JF"Q$ETA gj$δ!*BPc{vU JkJߢkW?˂;c+ Nm\x,G@}]#ސ|f41_E{2 %&MOt>/E^ef^➯I"<ͭb]0f'9s`9_:Qʃ&G ioblsGXnuTɸWp.}G[{u/Y[+ef#/Zs'ul t+HP־vN4z`|fbJ\mzٵEDʔ l 'gpjlAe&0y,Uk&9gJ$buXbDDZz[D Damѝ [6:6ECw+$.eιGwSy"v4Z< ?F9!SvL 'G/0pqs8ۯ,Lu@ƥ%mƜIZ^.rTA|3G3Y({J `XҚ++?>kknw6Y&0lhb!À 7 +򎦂6bk?xu,ҢVDE-)|➔ ލ8`zTP,_YyYlZTpEQoUSl?T?^`oǠvC9ރ>Z}cز< 0} }^sZ볌pN|Uծ;ԹRF@<9h1TCH=j6]q@7lSe} $2ݣetP5 yex;43>YRpYgJ @0UuvX?#=iaox{OXwq8%Vræ6sͮDZ!c|n^>pٺbEX^XkRvXdGN#C~#>Goܠ;7)ুs^fTʟsrW3n_{|WH{rv;d3ݒO!$r +,'5M8G2cAv{``LYbou0CM<Jn6w9Ƴ2;.;Ojر(ͼ]n_(nNUln0[XY#JI0W,R]8@&5My>n?##L-c¨+It]pI$ºzŗIzRj9R=iuڲg\_7#t@7upic~?|-NG@ "x@Bw`\5궞EiIi<-&Q|RB1M/#¹G>}V|Ory7INl٫wkYU!gݡd:O$ܣE\mڍ}0S _J/;}yjYtx-hRWlyhSVMxa6iQ|نj4#FP;Ωz_^W{.uؔٛƭINYBpÐc"lGCѤ8T_؆~vf+puVKj2,FtG.RDOIZ02C7[@ VW%p,?YDK1[M7>aXX`ˇ\ u3[D%Ó,K7A!>]-brf?K\aN$0]&.[ VE'*>bD[ G PҖFcn)uJ:}׼LI+~YTE#+۝ s.> 44PW qN(,sƫl@xBKׇ\Y Zfá]*z= "<>1˅]jJ!]?S%)[jP<Ŝ'`CP4+m<(^̅6+`FN#l!~ [ >W JK@)Ivg,Utcb{.M(^P3A&&XE,eNx 6,FCsNF+efT[Ca\(/G 3{lzF~ LjoeC,YU6"TfԵ{fvHC*2(V?eR8x{1/X#[FYlbCHb~L- 0eb]D9aɻRR%B {֖1ggw}RZs)'Fd3(%<'4vW;Hj23$M7ȰRw㋹ݱm~1z|p9`2T6@YbIrH BeW"oyG3gJ.}h=_7b}|ca!쒸8-n6 Ft}2A$ D|4v}R@MKq T'%o72cZG %3޴i eGpٹRK],? ͻ;曷)`PN>_\ ֧AkiET k4:iy`²$5 be(Mhdq=Tݱߤ7(R?܄(։. ]Ӥe$FB+yu(n9lS&-cAco>bƴCNLT4qjeeAo[WgF΋2;FIĉ "S}w&f_bw.8a> {ReÄ^o@_ ?d&b".\%%|C>YRR*3`18HKRs( U>YAjCVd l4,[ ׊-1 @=DY1i Zx%pbS8^>՜&3EEsaF`(l1A])o."3ig% |0^ {WjR"7+> stream xe\֠Z\ w .%Xq N+R(^)R(-.E s~4I!kd=], qgr2@.K^ 6wsȚ@!!n r r>g;I$jgiۂ`5, gK;@7 [q+;Kw" 𯰕~9j>0 V`o&qvmfvu<NWgw_+y.P0l; w_Oib 2a'l;$ts4w''tvtVI7H&~H&(`b `UT~o&!?$Z 63.9ouM  ki~SaaJ I90+?f¬\@i0 ?zFnX_?oϖkv^;7츁,={[f0ll)j4@. ^ڦ9Vg#d1ޱhTٕeN<{i-OsBkl㮧no+tU#ϗ|c 2r5dPVz =z3BuxpS]K#x׼p㟭M؇;wx$5j~J^wH=U\vơ>=J!P]8vݾ`=棿$ `I%/uhfJ*D,;@:.=BoHW]fօlVk BXHEݬ(CMl:yw .b|R{MiUJ W E:m~o̩NPfLD(ҳ덴©WP_~=fo)?Y^USAbgt.}{XC MOڈ/EJz;Ӎ/I4+ oڸK|86;zQ #| *4&u*|t~mF>(܍21][3OuBgYٞa? vjzx{$ڸ|Zs^;}pХ)r[P Ң=u$b;eŽ}[X-;=O ުCh_yD>dGj"^#ٽjܯ*7{{_{#ssYpڍ Q_Q5'ގ Ȋ_\}9;4lVA;s0*s=%Ǝ!8BvAFwl$&Ҿ}֟Mm2Siė<#!,mhm N{*)cmOx&KYz{_őh @էS~ĜDz;8 Suia4_S<^TT>C7W1k|IDĽV`;[=Y&~=}9?Z@tíw3' W5J֣^$O!AC Ud!5YMiFz $E~NBBu!ګ; !QȬq'yz~2g}{SX_Ck!dOG]:c4{M%ތߘI]i)x$j2ZPsbGU95I%uK8!)#2My۹@4d=8I$XTcv{/%=j:r k z)6_.B@7525ل;kT-Ni!Dfgc 9'rBmwr]`RYm-)IM?y$0 50\)_V[t PO1CP՚*[?r/.iЍqN*ZZT1;-aTG?}6n̻" 1s$([/J 6=iwg :x{7-SN'_/>},R5c^ IN)$?ǔKi- ,}(-NV$9C\׀>@*o &0P N_Xm냯.hKRz$KIPIYdMpr @f}[?d pcG;-b/嵤!,o >܉6f.8e1%:Yd>CNqihzx?qsYC}Ac$Eufk0A*Jxx@xph+k'BAVʙYj:7TQoL-}+ўVzfm/~SV@}>EpT=s8Vk rn_AFwRi)yMCn;Qo6}e'rf9M=RhfǧU> q 1Y4FN ht*hM_X-I.jђ+蟓2mdǛω7[%+#Q3%:+(ǩT!||&#ŔQJI^՟ usz6x^3 ȰD;3XЦ6o?vY+Vd~jpGHg&ïO=Z55K } |bD"SߞZiGSC{hJEV* _ %)<#R0>)>CjB`k)L:dN8.iF|諟 Q{bk6^I%<_ucY"X:l|6c]yuGld#T6wh,H7cUR:f6rҒNuV7, !Ͷ+F#IRZbjeUp:Bƌk~S*Z`SbbrֵA,89PyO~= iVl+]ۺ}t{%SdqчmXb9:áERa ̍߻LDMGXOI! uWa-a#e İ/tX9"DiX@ϛu81E\V49?66Q돃%G H}&Z#q"x f]/JiAN 2ov,jy N,Lf{gE $:ʷlq&-Tnqzw6ۨi=Qz%P[L,&'4*$VAŠ{x v|~ȑ`c#JRgS"% F?r,6T$:slnRff:欟m=Ix8- $K~ hRkK8eHȏlFY!Nf`;SL0 5%jN7>%E|H {"%|l&2yipe\h>4 mR?W$ßQwǹg_k4z@193@{w͐BMDze҄MO#q,Uw3 @I680RFANubC21Cq|ATb1Tkrӻ}Ò+.Y+-[*vC-sňݣfj2ӋvF1ᄶTc1ߺ3Il8y ~8ָ2[ja5Zig, %=4\%A?s W|r mI-3fv @.Ry]j[u\A ۴= E7W*tS>q1L2;/ĶlCkt| S>~Jh]m-٢#.ZOј%M&#Mzʴv{zw&d _5 ``&,VՇ Tև뤲*zEma6AKN;sunOMSBt:ϛ%K%Fm0rCe\'RJ/d ABsن>˪y\BU>fsCtue)e'fw¯b5p+EZTD̎h KKZTVeѩ_b*Ӏ &+O]2AʴGշL‚4Z*V% NL8Sex8TNsn\'32jE*zd4>arzO )8 {Ru%+y]J>7ӕn מ`YqF_vk <}gUuxOe tIDujύ <ۧRZs*vW>437IxI5 H4|UHq}'x֤ey*ASNx*߱w 5p:{?㸃63Br&GKƙv>J!s> U]I{cЉdLPd#A<Zo#s |Ů>Ȫ ,`&؁I]6cЙ|Ophws8.0,JE %&YZcM3%;K0)&..Ofo~~gw ukBȌiNcOÕx;[%t>0.ʶ"(s뷉1لسjIj,*.t(a0v$\4c[TH)B' ~try{ڶ) meyr!l^:Qo3/ːS Gkg+H >:U}ls ͘ #:?;*)HlX$*UDXN.S? T[Ӳ|5- '0Lԩzۂ۶'cM̞&m60 \҇gyUtF_(CEpátThܰ[ h%?/ EŲsDH@Nzv/z8R1kл;Ò'5{FîpyM;ajԲ἞i$9#sw%b~dZ9 .oE+P";<óAk0vm=>n0^j8,mKp8 \Sf<Fd}7R"' T7 'w3 жFЭqVxy@XS6X;> Ag!./A2yߴԿ' gp¼E􈌥v<ǿī /2=PnAYcEx"vj4 =:SSx4cv[KgCtxtD\XX 4Y ,XĩA9z3uYQ#<ꨆ͗|b-śF(i4ҵ#Q=ýhr;_?Xy~$&rC' RV/_:ibJs6!v"umE"sG=([xS <5_հ$b_\|9=`N /(P7v=II&ȝzl٠F !seuKwM٫C |_MzFRb]( L:@ A ms(6a({ܙev[&~ģQ}S[ [^Ӛ-?YRkOEК8݂rtXU5rQ/-+QTofd9p6P[$OPͼfb 'n'B0|@[TiS4r#ԂGI@32SBA"IyeC ] U"w Z{z*"sP!.kxKxjP^1 =ӠW ϕZ͂E%U\v_aXdzP4?(yR$[cq\:wu<=ˆr>qJ/?ݒaOFo_ޘ6/^-Ʌq' X:͡NPH&endstream endobj 69 0 obj << /Filter /FlateDecode /Length1 1120 /Length2 5101 /Length3 532 /Length 5809 >> stream xg<[# DF-̌k3 c1-B :!D5D^h˙9<ϗֽzֺ &Bb8!\a>ȠaP | !!P Byxx Y2(G4|,{P[B@U(հ"Z(K8 B pjœahW![b08{"E5 (簕㿧\ahgl(clHv 6 Z Aj( #?\5CU]004PeC#Y34 6(n)A?rpwci "aÐVݶ?>QSy1#1^Cf@#0 bLi# PBlg`‘V0w ąDaK-yF ?N~> H?I@ iM<@_=Yo,&_cE!]C5ĺ\C^ bï!q #닼X_5:^Cb!?؟wo^[5Q^|<@Nn>VG(~ -]h6m[fI81 ~#5o865QjM DopN͖$%]JvNZOST媫jg-^NJ#QY]m>ٞXԝ OL3h6rlNЗKB0h^ϸbo EջPf\Z) Y2<=({a䒮hQtna4M1B%c1N,8Y--D!o| *{^~4'%:lz=H6(q\ncf}А5NufdEAۀ41D/X,]eg%5˥iA$=KM3%Vt/syčpkzHVw O K;0ѥij;?3Y Xm$)",A&65f|߳x?W^""SN*R^.M!$kveYRlD@⁾9uHfΤ8fZO'=eb3? -Knq߯o' ]t/ȗeݑ.fs%[46ɃnGQ{ ΁_h8V(9FfZ ʳ;>{/;s/ϲQ!.f+, R>0Ux%V`c+k#w&#E5og= "\BnqFEij}@,%muDž:sHc0t.XY XZMyFv"f5bysq[1:%{8K&y;K)_!o%DN i>Z,ÉMT~? O2]Fq[7`ts]/[lC 귊&b''?LABķ7ݵ$PY S `JNj(Ϥ ]ᰮZjTt[Ò86!f2c75~PM*ӹBU bz,>+}[V+-,KEUd;Ux+S5&_J*y?*]ųjrS"[?kM"u:ݎss9!:^+*,Mwѫ'Fõ',_HM4g@?{'?Z9;gN9&`ivb}|nDtۓ:Q5 {Gr-'R#M M:dT `W}p:*:ۢJx ?esj#с<2›F4ZBp{n*|@倁~!b v.I& f#?\ =?m&e#;agn%dmC%/-;;ç8]L BpGm֫狾y:f2%Y+ Ӂcw9!2fڑSEѠPFmn*\|r^Z@8B$Cv_zr;s[e?԰3)md U۝tQEXTX![ۻ1/F 0E9% wZ ń޼禈*fxb'vtU\? סDJցIO>vT IM]CSdy",M4e:1[@gGN1Udˁqo;u̕9ѣ3iN:V{ e{/n"nB{`] ֟0$g3#j΄ޒtwiJ_>-+wm+TjAhp' bvv?Ej܅ܲ?@TAMyVBQ ?$s3""ŇR:ybr~.A= 7zT2@SNMG(Ԗ:D p鱵~^QOE6uے4./?lZWԕ7%{Xs٥E<,I$|F8G='qgSq2oNϺwν6O/uy'FZNꡡnA5}7oj0kT%D^0/qS'9SMƷ1??/pC4o#4HҪB)7TZQe1C_|e\4@>~ޡIiqSlhjL r߄uB+4VK[il/jJG)O{IWtK_agk܃D^Hf?3g]B9Wzf3|i%7*n"A .㼤P)r6.WRցۉO0x;P-^c&gǕWb2|U^sK'@udvDFNf!dlr^H/N>B#'5Rv mK&\buWj׹)敺O=]P+|ѳΥj"U!^O-rUO &>AuPUr. ̑gCM IB\kt+ysʿtu9>-'?>G.;0.OLj1WH9Y3qF: G:ZְZ1gHg[ya]'6 M>RI=\l~"5;dtKtbv0M'XrWx9`ԃIrҖ"Ԗyע{[W5Sp= e).V*ȮyD2ً aqɗE"a&1;/%櫌;xG%DIg4Qơ_/v.8V>hWݤZ0RN5űϸuYW"kQU؍ .V.ǨN9K=zv, S9P 6)xw9(3ԋmOYL(Xn;SJtA?e_~ّ? +?wL jq{W. |TtIrLpO:dNZ8dX.o fxė18>L}9Ա=HڈmF?d;x50Bc~h۞%V>d~.Fak"Nm|Ze%ںF|yFݷg/FL &kYl %[)yJtIŻ V Q Qy ag;-T/t(V<5~FCt JFq[T\I9YfqߜV޺A4h;m VLr'R!gΏTRKRu]/Fʒ3IqҼrb\/dK$.4^?"b(KX >1yiZN>'_m=?d K\7!'G!(BuAFych@hq]" ꑧ֐|8w'S[eh.o\3A;J4 AqzeXr1_Zbt|?[#QÂs)~3D 4SiCŭ8&UJl9#:{ܡvYt82# OÇOX"`P4E}endstream endobj 70 0 obj << /Filter /FlateDecode /Length1 782 /Length2 1580 /Length3 532 /Length 2144 >> stream xTi<N(IzKS#̃1-XuljyL̘E7YbHBz,I)#0*Т:9t~y<}=MD]@F8C ;Cx@9O̡IL`G`?D+œ @yL3yG6L~+SÕ@bb2AY`- =o^~!?I~tFwˏ`ǢTw9;Bܵt2IeDZa#G/a&gfNtH3y.Aγ0á/ IǗOY0, ) q8 d4$B @gR@J ,d d |XyBh4@Qkߡ@Qb ff]!02Ƅp`&oa$>tI0w&\*i,%eF-ؗ8Qq龭cP8$;ȗuN-c ҺWx' d} )⦂佹5]^.ݴ+ZmFRp,Q7"Ϳ 0Ȋ2}ma*{&X|I_HSZ~U*2Z{}I w :PW@n0iڛ1x?aEdw'E ӫgL ^ fd3~AFd2閡#ұc⻊{ebͶ*]UHT H/NJ'yk Nt[T}tK<&ZP^U}Cl:0~lрᩝsa ȭeBZ}M K;[V L6G}AYR?` hu>nۇmDOWۗQX=~-omUZ4[Hd=m_:õHhY\tGO2.z WΎx˜qŕ]VkZN_%$VVHmKWPbuR:bV_w xs41a|[.l}[dqkI=0 v o>bX]#ySyttRsk}EJ]g"چO/mƁVKQti ݃cAvgse##sɈV>=˰#2 ӾнM3\Oc'LYZJ}̑qʣ7^VbBayJˢӆtJbGN5K-ʫ# 5uזeMl_2OʧhfLk6ໟ'tؚk~R|\2uH}xX5c'>yagڣX٩̪ݔۓ@{2thYЦvW6go]/˹m"Cl+mOowoLAAkh=WZƖsqq"FR\PA\-' 0$,7Pk˷ #"[W jܿ%xjgpY oᇔd>yԼcϦrorCG],[;Iā}:@Ѻ  ~ n7,Th2>Sݾt",3Dì7NBlWfcE$Gt^g76ΐ iM6 :41|_#Zhb)̱KH{ *uhS grhwy' -^i57 /HYd5YǽR4mfFgMx`.s:UGo-?r-}0j;= [_,Mi+N$PmQG5&sKdz]O醶*'5K}bcw ]I> O0c8jendstream endobj 71 0 obj << /Type /ObjStm /Length 1867 /Filter /FlateDecode /N 62 /First 519 >> stream xYr8}߯ǤląT|$ެ$Zm_A]8yH >}Ѐӄ$i(5@%ȩҔ$TWJ'>MJ! 5)g5J1{R=AAR(QH(1 $`)P(8J )ijR)ԓ lsI `ߕOiJd +-= Lʳ$fʔH*F)eȚ*KjYgdOl`;;EVǫ`FzِܷaW)|=WrvOYU Yӳӟ*HCzv 9PCΫj=.Gèz>Y8+!{=-w7_*utSEYy5!Y:~ʫt )>|ăA^&1pvr‚;pj'_O~Y:N~e?~$DQɜ'=Ty7bʈheAn}Y{ov1lzDUt;eOf@1gEjeU'%1nF8a\%Y;稬qE 4\ ˫u5q-߄laydzxC p4Pƻltg lMYJ2 \[#f=JW0@sK&0d}b'H %J,`QX\.Xv:8}, ˯f3/h\mKòb_[3,8ClJqDt] =9!ЛihAȌC^.ډdvb|X :؉S"~8}{YqQns^Pt 8"K[ ,Q_ZXi&!lޤTJҵG Yƫ8Zv1vs`CaY5,ۨm}݌A6?bCcVm>1zM"YUMI8}Q9~yʗjB_x ^ҧ8=ŎD&nD!v=h 3tLU؆ll37y) I)lr )%{W%rQvCa( ., j}utۛ+`qnm;-Hj*QMW/ UDua,y մǃZ|5OD0S21EӦ}+#F3nW9כm=YO@ֻc@l+]xu#i5ƀ*rW>ՈL8!>|wgQ9=/E0l]I5CX%dZ_s;E!u/@6y` bZ-b[On +> b0m̐ě.xNxy5o]֢pJRf4+Om k_dlendstream endobj 134 0 obj << /Filter /FlateDecode /Length 1073 >> stream xڥVKo0 WVkd؀0`u7ͣ[k״~$Erbvp)Qz??yuMre&DXdRed~=ɠZA |K7U+V{T 7Ѽ%nLgYΒ+wp2= a(Fť=48@NUCOhJ)$Qh%YhT\P5Nga*>h~U *٣/"ucʢ ԑȐ $/DQR~u⚢@w vGӶ*8I8\p©\Hi-tp閡vH0m,2F¾FΕ|3|_ౠ wsǰQ5).60 p<;*Qٷ_ڎ2a ,1Bx2V*hӇf!eR8s W!/unrõw^p ckp] y7 1zĜC,Uʽ^iqC|j ^xd]ǑCUFHcp瞟0bY%<5Dx>+V]&P.>p #y A=TXg 3 kW s252NPHSc/UZ~YJ\$;Pׄ}73[t)+iWySVڳƫk<@-n&@Jn+E6āHbpPOh{)_ȥr!d$w[an2gDk0 qPWkۧ7fW4&ΑaZ$PO?Y8endstream endobj 135 0 obj << /Filter /FlateDecode /Length1 1920 /Length2 11534 /Length3 532 /Length 12620 >> stream xUXͶpkp&AӸw .%8!k.{ssƬ5)UMl@6N @F @TNEVU 22#QR: ,lm @< 77 l`syX(vnfN4$qAƆ69C's5@(#@rp0" c'')S[&v3rpK>%i`E[+7 I<l..le%ohOahma9vN  j'2pߣRNV6fV 7#ǿ E 'cs3 Y0}URעװ'mrph332315 vXؘ\ W23^S[ dl21g_AÿCl&;CO,&CGp- sSZ[A6B`;p![?!N`' `N_@eMm,kjWX)f#/W0`UEY퟇8jV ?m lG<,!b'xr?^הCr\E\S{kPCx>c2r04r@\q[`& 3/?/OhcdWd`)le_ Vv!X/d` 5\B?~0` nc,`; Y86-,,L*"bb`aep4;;$zwaS my,JMs_ݳGw\rG!TƂL6p0OR3O2"w GݴvCRLy X~2^p/q|Y7qa8Oq$i=MY}$ц Ŏ䛫t<.;*u_s;[WN&7˺`)v]F 6!JQ&4oXczBt㕰슦P"Rxs_JS/niOxSVNsG\_:MY!,'4ob74k?|)2+/gg`e  _EI9$rۋP#nl"[- i t5ߵV=z[UiQ [?~e˾cfN;1hb#OW}"Q _lˎ¤i 1Mh^W1*I,щ6.zaqRِ/~o}n=t L_nS;i$ SVz"2rĽg9{h>}חە+ +z0{hM`};~_="wr1,$=XXTQ %jƜa]7C[P ܜ4yjsҘU(:MYm*H m8p@ jX#Gd2_8SF֛mc Ⱥ^s#n=[\'JCa2!ГDyٯ+ `9աC[\ac\(-D+KYVy(6+?/&P;my7SߴgY˫%dȬ.=рRϦj F5 'ԏyM|c;NHm.g7?o8xhrbe Gm J9lLDz?]c{"WHXxrd:p%e9(h3\b3ZmodH?@<`Ǎ.Wt;%1sjPM(tv~fȡƎ玤ubx3omRW",'v܁l*ӷF,f' ݾaYK[E}= 582\!Nczp/g9?PkQiG6B[{_4"{f ֠nG,՞~0>p:"@?:B,]aiۂ/Pധ_PqYb{~E*X|]ghG=l2>=6Sd+vҊL_Ejc WR1:]6^K-\ǀ%"];l<$ɲSa\s=TE\iMZ1"$ ߬|IEՎ*o݉NzRoer=7 V ±s()yWS*< N! 6|qu]m"iq"/,Ptrɶo1C!6.bFh2]cػ?ͷT'(vT/1BXx7l8H:-?{)pS0YSSX?/)b','_*ݯߞ?D&An*kaTlI%m%< gMC?55fU)}d6='*|zJ,!ȿޥ򙄶HW0FNÎ o40Xܾ^\###w ×ofot٨v;%,Aes5hqbj!nrƲ9Xs(+g^^l2qek仄n#\u"N6*ݻÖ7S$[kn^Njbc9m3vA"EοAW88 6;H E'vrIqѴ$)ց*8rOٝL?si$$.2!;+WѹH9˝G޳((Y;jf \ԡR Y(@ǥejnA#_M%tV77LBjȱlv1jA?pejsP?۩MZU8YAa*(2!-|>LeyN,ײ[' fDç:XhTm]BO޶SӁLbLӫǟB7y zd\#[01sZ]=u t"2 ߁` QMs^m5iN",Zg+7\,~k='&F=V0&QWhM^JO{N@nvc>.؉t#}C$$)o"$>˰jP%k?iY㲔@`wWDh=Lf9A< gR]z9:hfW~M՞+kon&8r$!lU޶I=g71Bs}w#~e%e"5iq1:Y2@%|K⏁_zҜBētzv+w/c^qFv dBjaOl%hisKJKT9\V}FJf~%@Zg귪.C,` ACzͿ x_ ucnq@x13\9|rBklYIw.Sl Z,#yϲӔnܯ0ﮉKq !r_#y9>\ Auhpf;=ӭgZUbE ?; 2rGN>w%׮VI.[ZX!89J?ظ~dJ$bJ7h=61EK80\f;T LBvѿ)TT+<Jl.楘!c!dSjivH rjw7i55i5+sYӍ"iѨ83#7U_{֥4Vr ("d,"F)q3.AKW=v˼;DAg"FMFSf:SɳUƅYnfK !J39~|Z?n[!%2!KǗH6yjH^+(ؒk=e%|`copW숖RHgĀtqڡK9?G'JWoϮ:uc*5}RN@I뱝;AS pY uZF 4eiWsh ?a*=s뷗L%AHΡPn1fz8\NHEfϽЅ1&r[$܇%6=؁/J*?ft]2czJ 8wXܪu⌛%M̙5 Pi^bK>@`?@h̀{ឪe°As]!Q\hCi!׻^ Hמ);Xok҂K RK<E@Ey &ԇ*\hQ18^&+k4N}.bx7I)V=uçu~QimI Vo]mj9kwB82KF˲^܍\Sf{CR%W5$؄8-ЩOm_R{َ3a((.2>>{W|#ؒ:ɒP[ **yMȹj™5Dųd& Ǜ qvi 3_\Pzx,Gw ÒN\Xq5_4Bc8EJv)2w,$@S? ѓfZ4Ծ5,j/P^:SMlL(:b_8徉 s&'MvR`]q~__j`.fFirK6ٙ/ԶK8DsPl2+\g0111bt^smtY"^/BE['iKX Тgétj&yk qC|z2crD~`c2ܻv% 8eD`4veuF{#b);CC\j ooxK2nr@dbHi_O |Sɮ<λhiFS2f<,%}ΝOmE>C)_ȫ #;%N` :7p)Q~!V%:+:4Pc5duW^!:}1p˶SƣyMxۼU/zE >$Mqu<ʜ6Mlni kCh e>UJxKRA/gוQa@GT6h&7mW%y0VY]F5U vepkt휌*zĉ-9l`\mpEEwBImWVqPܶ%n MF(I_2 dJ_v(X>TRB0 _qaYHV'>T!a{2Uq<^OEO~kqAT,4ӭw.cԞlcjr9vC `@䐿#)OH4院J!-Ug/Ȩkf$$z)ngv/GH9s< V'AU({">du(o+ qn sy@zC=#۠aߗ)A*g4jG[>YFڀkװA{O5>& z [FW ]Ow!qn~}Kۺ._.D'ɼ/D2jIp^:r>ⵔxKCʿ粑sBp=io֟m(3~8}"a:G Ok{DL-}+.K7?TjߌhSqA(҇Ч:[ډs^~/Ф4=SF ӳ]^63*˭j46D+ "O0pneO =M9=:T3gf)ƤdS xGWU_GZT[Kru k,ͮڭN:'XˊB1<69xI7wc: Wρ#N חS})wX zʼn}=L}׎?df e@`Ҕl8Y2o CCAf_г 4Lȷicf2*~X᯷FEJD*1־c"RǛf7KuLٞyT_ yb5 =+|BF3̴4d/7ԤRjY+Qs&!vXhv#M܋.ŸjA"7t|֕3h(li*ɓU WYt'&w_^2g[-Yg>B}RJ [ω&hɷ Зˀr_&^і<Ϻ*cYt0tj~73g_5 Otu j~\7 I'vvO"1?O|jsYw[oTI4uJMi;xſ# 8쪽aF4eJ8D1\L\~LצZy;׿s4-zwzmG A7bĎaHVGw6T6q;հjޔ_xE פ@~<8D{tj;śU7&[T&>+)Py& 44:Ds<=E':YǾI@Yqm0? =vM..P b&I yk{ay2_Dy?Q?8.KRv?U"iKwh"/thc,7̴Y>45 ɇ%ݨcna~q{L3+$ ?}ګIZrҞf:cHLܱ1|j9CZǎo}V;gpb]G`sl5Hnͧ9O]|G&Y^I?*DU:B$h]|0eJLL0RjH  "]JPׯ/ҘT9(4M?iFn|mޝ$U}TZ.6FͬWtq:k\'#{!2gUS#AN!t2t˾p&B8#X/oe]4F3B2<\ʧبOwlCX#fCNQPF׼ ub =_ԧ!Q>q65UrW42Ec5toxЦ]԰V,,b$MfC$dr҈%zfwB@DG Z^<]?\GFt'7='8>?8ub H_eFZEJS 5ycav6Xr%O#! A;m+{xܨ[{9C_gK %om +1 ->\x#X'B >ХEK"O9}S"3 &K:2ѪZK[;1(W4eDžA'xՋFVpsQi|Wk pD]k\)(wC[]H#r+^`[>]d[fkԪFDx=*DmpuQ̫ A3IY22LObGŠ/VQNX#!tlgJvw: zDPLqѦi9;& tuw*w"s`}Ck";f㝗N3rd/:C"Qt¯XxOZ>RvWZqv'1p*/'wт¿󭓰y悍/}f"rbr >`ALX0I`éУW>7AD%eM?x/hgeWFy\ IjK;GcS9 .q;̅`?ȍ|Yr`Yy֤;1`UDzܐ, )mQāv\F!Lfi6E2ʰd1Mf=a'm~}f \8^oBR^d3OYVUrmo@fI-?/l)񙸡!8uBQ{ci|jH'NUļbz#y]m_g^q-ꕕwOX 8$ծm,Tg/$',4eqAT]tu)tkz ʼn\-p#؛BNx ٹ*T+A*Qf&sbMuB[nG5 ƜM=L=I"]t|5¼@2^Ьay޴o`atI-|i2Wux?` K|z:ҭ-Ɓ!}TV~3^TacvZV"z-ehW"U"{j+rEh&vq5AkŏƵ%KO4vZ+fdU<՘")fw -j|3^.Z9SH`AH%kb0O<ځJV!|x`$&@76!i=¤΅֊"HCmO-%uY𻟂KpIԽgF-#ҠFu;xؑ4T#C[BEDꛐ!,#CsFiZ49<߾F8s_t>^S^gW;CMhR˟m[Rg!lj˽ip['%wq@ʢ C]z$)t y4[ P6~/E=mO(DɅK:V\[6H´,Z5ሠ2_K ͌ps?`0i~E6mCDt^8+`PiXxkD@7nZ^hUu":ȿLjFn2XMW\sTjZjRyE7C5q#0?A   Zendstream endobj 136 0 obj << /BBox [ 0.00000000 0.00000000 432.00000000 432.00000000 ] /Filter /FlateDecode /FormType 1 /Matrix [ 1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000 ] /PTEX.FileName (./gridBase-005.pdf) /PTEX.InfoDict 31 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 33 0 R >> /ExtGState << >> /Font << /F2 32 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 628 >> stream xMo1+<^SR%Jsz*)MEh 3c.̗@p? =~`0:xshR1'5<\]/ #C lf w~SQhӌ96z?D αK_hLj96}n8G 'QqD*f 1ò!R"œ "rIqm\b&J17īٍɉ31?&;^f۷irJ۲dʊJ#l`eְm֯%ȩƙ0b[ɇ5YDΖMcƒGJJUtJ"ʄyMvemWDī%6Ɏ;9snUv<&L4*'$袯㎑x1{9CT8Kʫ2w8x}?VX \b~zz^wF?&kk>=!Qè=x]?8bM)ēSgk- VE8wsHLA zX8j> stream xڵXKo8W9Iۈzh/EY]Vj)u %:UE߱q8dlqenF95GuvŐ0 ׬ӝQεj>? `sfk?x;%D_Ym>VWVb{,+Y6Wl$:}eߐJg: N%#;ET80JS/O9NC U^[9 \? iBR$$X̒,,0/$,UI S(F6o"NMD9}ѩ(\CC,QS ިDL QHUXwW}+JV;&W z Lš +}e3'3-]V}|>?KuⶮYvj~|W 4K7to7i-4l ?6 _΄x}4.^wpѪD05I#= [ܯ/|֏XMݷ.Cbӎ@)'ڵ=endstream endobj 138 0 obj << /Filter /FlateDecode /Length1 872 /Length2 2460 /Length3 532 /Length 3079 >> stream xy=CH( "ӔP(mN@)#1ӈj(--`HHF1}hא`Rx2`xp$42`H"v_OP; R AB' dWsh| ?K B@rHyH$&@*_ ss:dڞ3TD:@ "QG;H $!ٛjB  8"“7$~8߶4{f_Mfi͙  8#H'y:ӯdO@$s:PL8^pd ^e2D8#  21Z DߴPA?4}(h@ S~[P9i5 |_B&aAJh @ !Dh@C oAO:i)g%j/"g  z@:镬wUuy]_͖g`m #eǖ D^ Pfa!*0)5uVȯgY1_3%x̦w͔y/6M]\ޙQQ!V]Ih|\ݶ0ARb"|˹|Wί|v? qmI{>qclx ̈́yfϴJ8l6m0N^ũwPnۛTj/;7TkZ&)"*HcE|Ɠ_XBlMNNTI2>)!,Q'17w5&)Jkɘ{t\՗Vz,KľX-O޹vbhLlj]1.&GM 4]biܨYs˱_#F(ַ6”yxL j1oqcsY7dز`spy"Ïђջy$`m$i0"T:㦧<X8ix%lW ']1-p:BJR^6?b&*:&o/B+?{HO[w>S5E0Uvr5Ԋl%OTwhc:B h(Utw\ th} E~0xdOD'?N˪r/?mނRV_-6KgqۏuƒB>z2v:wlrhtjSSPO N/rܘ=WX}{+U_>v Vة,$ wg|A%̻;;Wq~2 lƄ7⮉[. LO8yjo'M .Z\Gy܍Jߪ@M)ִGy9蹤+ip @xh7gGY_޻X,+^h/'jKuz.═SO^vj^{4e"WtɑUtL5ֶq#|Piwsad],|ݢ]ھo|#ux5X<+rԞ~cJlөh$qy,U9~dvPV O ;WX<BN^]*2Mh2kCӉaI= 33D*M>Μ8™#5ΰ,NB\!Nn;Z=T^Ed W]RhrN,hQ8&vP~L޽w5CCmd\^=2N!du6dk]b\Iq5bE7LK.c>^@H$܏<.IT&K/p9Uݡr#[hg[JKtG1[͢MC޾'Ŝ'R=(⚓MZs rCkE ,^YWR@eG5Z^u]u-] 6 6QvۊЧ>w*]NkCqM=P/3omaY\!`OvOL6\UҌe}.GoV>ns]{af>7{ŢhVM҇uV: ҝ{'Sc {QąM0{XO[PM@\O.3JZUy!_xɢ yho1bĉ7ss}LO[OR3gwT/a,&pÛ50줮SXyCbCQdj4׵屄K#*EĖU3/?Cg7)tnOٍ:aa 8 [Cإ(oec%44(b7AÝL7ة} q+[FA#VZD]ﺥѶ pL^,Azy=FÉ#BR6 _A*R^kD$5QX${{ͮ};՟mpxpW4'jFFL9{*S5]S?Et͚>7hI䏧=endstream endobj 139 0 obj << /Filter /FlateDecode /Length1 872 /Length2 2470 /Length3 532 /Length 3089 >> stream xRywҵI35gUj$%-EڥG( !!GW[?!l9+OSqeD$~y䕿>7wR)]_tw ̋O QCK0ܳ|+l^=?Xd$r9Şq"!|:]:I-!L `)et&l6`w(iQ֩HMS2wm -A˗$Œ_=@XPY44]|+3@&(΋VSNEs43ry`u,k yBKL/\+gWCAUs$d9ߢylɯ4CcCk^eĵ dt+=-OaW7Cù]|xAYTH`s4 JBW.{+z$BGWG˽әn@6틩ֹ6|9;d[qS zJAzsb$*b\̅<9{ѩE;Bo(f6oιl-W#kӠ}mdAME (z\(_ ̘Sq86BW/Ro8kBި@e1;{4G &May#g^~PAf-ZVu^=,ݮꥡ}YY 0շ$k5f$sp+Eg n<BF>5PUy^K~t-s-+H gy-nD\,p#w5^,wP8l'_p|KPP=w1+U:M57ib陶LFM›gJ"YGӷ`EeS-]c{T/'gFWTa՟쨽}Ƨ7*iWe{uyg(V=A6ô1 *B{8p͹TX&uuGM8p.b,,=B]m-)U\'ۼ3Ejh[zN&іr|]q c[VzrkRb0l9s.R8z9KgX=qL}_|v| NPk]]NV5*Rt?=PJ!UJxu@qT?!?I\4γc΢;INP-.^ߕ>β;8WjL)m{!ltמ0k LT6,U5Fr [&Sԇ첰3}RU~o~3.U?.̧^ﳃѵmfg_@Z5v\[rO"ab!%GI/fAIV)qt},{GRt4q E:mZ;8cQ-}JU]=׺%Rޙ6Gʺ2S+,Q2?o;u>ݨctǸ . )Q"fܥKYj*Ko"m3/kuϩ|~/wt҇ېsMy[_F2j?j &"\YQ<ɩ+Q4&kC;A0Aϥ\o㱻ܚk,x>f޷|^e,4aYmG_wɓF=?17J_(̚.ZHōM%G Mѻ<r'Rg#u!28w\z5.f*Q1V~C(I6ajmQ/8û'7KG> 5oht% O¬tk=|n(9^xCw.Q?Bv#˕+RJRs_^S3re=,p s]סY;KݥQfvsX[|9o>ȌܑZܮԀ. ܶYEb M:0~h%1&6}> stream xUT\۶qw \C=܂ 5{'$hgxm꥾?cVZ26k"Ճi\<rPU, 2v^PPODB=,r% d\P+@rB@`_.3@;6 5/?*пdOPw) $+f bpkB`0'7LgqEOggM+fV.ξyz Y8xgT$j KrpWth9xVuo :22F!-+W=_73l6P)RpAl\aA@`Zb@ rx`# Bm&m7ݬ`Wgo XVn`ߒ l-l!6%a -!Xw\ #V?e ̌op&X?$VMRMN VE7|?aM*z ]CyMk@s0  l @ ?f7a6\@ B@X_?a6#lB|9 D'v=~.v`0ce wzYP:[/kךԷЍ)޹b\%FmM.!>>={lWK^~F_Îp;/^ ?ߘJ7.?>*bԫub~TD#^˪huoT (6sH'm)ZQ㋫yigyKfK]iK_wqKgJv]KThO]&h 1QͱGI 3+9s ;)\ _2Z*c!lwF+J算?sGLg p-JJ\XH5FO(m":fbHx/&L -31cpDrQ)aK^yg|1$XZ=-Cg1Jly$YCdk0ux91l٧mY 3:Ov.#:97sTmoi1HL>J/OO?kg:z:pD,Վd ~x!ɨ硷~ ݦP9 >! #JkduJ̪xtJH4LF}c~#OM׬݂AaֲSg&dfBU=q,Y3Ybe)Y'YeEjڝc( -g &,V{ӯE"Y bbQ|_9A&Mbe=*̋K?w fwX5k}*_zvЦ9g-`^ؐ U20w;e5gr"\=AiE٠P5Lglʅck d&8q05=KJMߏ _zҗ*5z}XM~P3M}빺ڜV+{GJk{w2ei]CkWe&ȋMӧ,Å'SiCP0QvFގ8b}~%#Qf4:Fn&#l4hJ {t)ͧX CcЎdDv0 wX-3#4ꧪ90OfmssMŃ$AV~U{\+֒AdKCqޠ5fAb|8ݏLȷD(s#CnB,?HQ-^t&EZJ%m4>cQ_ }ɉ7¸9z V2sVsRXc!ͯ{q\HLwUF}J o},޵+ɺ,(aח}V]XlW'kdT*r-iT! >RRQ=K)[,&M3~pąE@b90JOԙp5jȢ5|. #;;sJ]$dqGЧ2$ 'U?+:O$^ 5,*roJC\ S2>|IgVR(u>.FFD5ÑpPl[|,Dv#%OJ=yL"*l[ѕ=V1^I$kx = aW65|/?-%XK*D=]1$"bj'Q]Z=pިigHږNvE0[[{u#)ysFP[>c^ב  ߏio8L;alP|]q„pq]g)iAI)xW%'tg4LmJYͺU+r@\[kءĪjtBfmt=A}yF?^AI8OBDƷU{V|;?E%o'C sP /bblɊ 7=pw4wnGm*nu4B*0c9UVlE6ycOZ8xW%EF%}V8ݣ )i[;l6*BpFYjOqjczJ#:,C)[fD{Xe.>& ơ w[&C<7t\dnFM#.urD;w?t1BO#?+O?kIƕ8E W%;! Z~”IJ(k(k;)zƂӒGbH>9"DϢ  Go4DY+H5qB;< bs9 AfJx+nf3қ6ywh511>k=*=EH&4EޤoTh[ gW+t#4=\pFzsG*b|yU*E5KH}cRuJ$ڰ5 m~GF%%wSy1~W#{TGmԹo"Q:RUɑ!j7L9 e)cHnGD6DjzNjZmغ d ;, {V'G 瘼dPzgf:EGxLIߋZntlsDI謡ט2u C 3-3=D_Z昣QJH&bFe.c;p (i[WvaFzc Q|AH8/AS,l] -}FtΡɛfȇ r=cAn? %>3HW޶qqDdA\+m wU%㉌sKcb$_4VٛQv3=%?D ~TʚoZO} igJ2N*^7=*\i*`q-u; 4¤塭xOM.u^8{Xe")؟XS0 ~Y"_U.PNVMBA^ïXCw W}ոӼ4g'kF]j%u+lvFtӁݡ9.P}+qji.c&']%&T,&4;}VY5qx+ ip؁,vw *0ie}F"TEv-5R7z jCn!A/S:atr#HýdwBc1/yO y |Jb1陦Xޕ$@{njsj&P9jn>i@vqρ|X+P魩Ty!?3FR HW\X~l97j%gu_l;Tym}>59BxXR4}Ò;K^񔓮mġѝֵTV'x.^[5laTUDQˎ+};{`;HY:7YYUє%,/Ȍq:8::_Т!\?Q ,YI|n f9WܾhrYy1WUI=4eiV4\lYwZhM iZf6+ě!4q#472:@;ӫB8[j] SpĶ1kr44^#WQ՝K+ruқr ^QMqPTW+Lp$Y16AYSGJ*X#{zPSev{\uI$H0CןsTbR?ajEN ߦs~KiiʂKݹAը|8I!R/Gq9TجސuS.30 ޺ t?,baVHzu?42p>]Эܭo{#eQEr!Zͣ&dDlO[V;%t3#xDʶxІ["txJ5oɒ &UҰIVYd6n6#(Tⳏ׋*̄8a.Jffn)]GgtMvbe˯ޱh;fX5oRO!͊Lsqa%jC</mNk4W4`d~,p8YR)eJ^6^͸!qQ?7_KaXT@Gdž;oF#UǑ N:CEoWRNK_]q+;GGOU(ʸjsѶw%bY iU!V-ʃ>tW, r}+EH2ی"mo^F ZB̏J?*"0%y*NIMy|`∙u9-8j$$8,Z"K۵ bHDġk(4l?{CeOe@-"8uԶڔ;x?`dU< A@5E?&unP)z395*,3͔Ǩwz鍔\gO&x2hXi,L7IIKJ;.D78BY6b9zþv)h߭2I/O%fË=AH$Za1n D*%=X&/;@4W kJW|VtaKğ#{IN*/aJRoFVBbY AA_>PJ̜)Oth2&-~z3&@AJj]E ISdxp Ǡ4s066䴗חd ܢ| tKuw$Vels`cr PDM$ɒ>Zmd.FK{ƤYj$WyDQ%Cr 0 3 36؟XzMoUfjLzax- KKⱜ2 E+ Ly>s+(17Ȫ3`awrH.|"iDS~vPM!lhT8L+7"09t"г(]a82<Z/(#)=.չ[ EwAE*pL?͊ 606m}mLI4c%)8%.|_᪱9.q䌓 ޟ&R" }?2>FUtb wFW1RRЎfM|,:,7!1nR_' iuF϶$&..chV,`@rkx3iVtyjuXWq=:d'ZŒ"]C@Hm0b}2Nue|<S/0Фaٹ$9FWN-N ·_¦]pq{$f4Rob7M!> }E3`[f[(zXn+jp$6")%{fYKMB 2G71W*J'B?r}rA-L;HrpBN?h=5m}~E ̦lm@ }QqW ]==a#S,D?ϵl!0/kLY\iR/~dg+vo[~ڧFsBo1E&j S8]q㕆ˀ8B/÷5Q{I6gYSxIF^ "Lўy)kU6 38PV}Ubq]F_LƣLVJE/&`$N߄^ v) Kc8a?nйJ6}j:xQA9B.WNRe⊶mI Ϊkwi{ٕ߭gDSXw걟`*Xg-R2" 4*ma=f(PHi,Z8O5>Rg^Nef)WV Nr龺>rL~8w{g12ŋZ`XXG 9#oy/YlEy RE7|[iڅٮN8rbqe7el*ܼBSG>u-8\Me7 Ϫٙu@6}8pF 4kFfNp{uqzN*o}99^ .=|]i=M.SLk|BO Y'>_SOG2+yˤs\OvV7?rS7u `wMEm-4ӊY}Ӣ'gӿPl(oQ&ȼ"%0*lG ym&fAq[w1Gɯ|wcyų Re{ n_{f48Qj<2a`;[[,ov> stream xe\ind`a $EA APDFK[J@Z3>?zW~3ߵֵ~Z}s62T!pO,@ML "$LťP0:ȈTP0@DRV\RVX G.(߯")syA(` wAPBwwɯH  A@B""0 p@a_t<`R>c 1X=`31т`0hwwǯ鿥A0w*{xQ@ <]j ۛ> C{;ÜT<!RPN. + r4а7{@0O?M"s8VXHXXSy_ZNp0s$$ O`` 0K# 8Ŀ). zOw3WE?a ;$Č ? i L#FcFOH7(h@߄dan0]!a^/ F FĨ@y?_?c7`lx?c"@.@ F7b>@?˫ $0c ʜ@Uagm@ N3p'H5QE!oU-c7# {z/TXgP᭱^0!4x'M\8e1YfzEl׌6]+J~ՙi:mV[HI)+ wbM(Ҽbģ})Rq"B\ ?TOcG#WGCN; Skvjلe%'j>mE\QyoDy[#E.s@-̷zZVK;Xᶋ ~WXDMߠ͍;bkS#3 j_>=&3RMSI? kAj-7ގOܿNFI=[>{'qbjJVՁlR<ÂPO.,}t?v$YS!Eᧈ꾌ÏCqmHJ6EwGC߇<+|vӾЊNكJD/Sc6~.#?#޽G>ߞr)Mq2Uŗ\XSiB)Dm9Ƕo;L6T:%X5?y8)u*= *v<L~:Ÿ?O_ej[lKYnqrڥxUIH(SN} U&>U)B8C Tʤ%2X<gRQK9WTw7?Q)t7a@ AIۯ92tz,ľT -~)O8 c2'Us7OS"TqȩӼ0>A U`Z0K~ d5c*ۥdM(t޵4,I+:רNRW^4 z<"J~@XjOm]j/gG%a~ 8]W$o3hCK>fWWKpe(ktBߕ쬹B|[[ l}q[ue*}ŰPU9 vv.whRf7ͺe[/<>R8;qEKQjoK."w-g=G*nV WMVvsM(73gllf;{y$]|Km]˘`_ȢM$W"YnÏ#Z13&'+T=e"Ɋc}}=oiщnEg[2BF8 1_MuĊnfԱfY",*2#(`EH4/nM%}2hiw~)3Kw8I +-w֖m",x:s;ó.gMf{7TzqpOO>Wx,#g}:!yW&%hΒ{k.Pg~mlS` -lYSߠ"AiE UvT@6%-If v ^#'h[>'عF)5"%nBǺwHIPp>ъܣ  oC|^&^@M}ljg/@09^ګ-~Mz`1 wiهba{:oŬxXP|gTf ejHݽEt2Zz[[R@؇-;4QXV+: *LVQj>⁡CYpۋ1Kkw i3Xxjh FYF{iBLJ.TZ7c8Z NSpϵ:} 4>i&V40Y濌<;[i @)d2ٽ|cs BŇ4qYB$jwM5.*neHeBIT63o^|_Gjj^%Q=gܕŀF#fċmf'XW6bk5Vn;I7\ty U8,׵{}'\3*M;W !칇YxiJækD$*6c8=g$yR'6XCʫkBUK6KXb˻Uwfx%K]?H)Mq,A~,3,l± ]ĉiRt mw3m tn+D XX PXcۤNeMxNuġ~DznP4M`W ]kQME3kqn^OnwS*שMZRUiug<r2ĠWmBEni,~NΘ-.eHMWlOKtDd FfCM#2gC}#R_~URe)/iE#y9H&Iyփ9sF#.S'q}.ȧl6Y#ާ֋RΩ *‰1%Sn4{g'MD\ /S5/nUOÞj X(=5ʪy}TT2eMx244>ǐșzNU*Ժl.бjoBx_ 0Qp8y\Ogz)'eT7T(:pIz0,:K>aF<݁o,k>(ݜŏ4`}y7s=cBFH[<ۮD'x虝ڱ+myjF0"HxHxkp{p#Sqrix>ĶHI|TgJlضM*#"3"cR?R8j.de'cQo;p#4D'w{n;endstream endobj 142 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 143 0 obj << /Filter /FlateDecode /Length 1090 >> stream xڭWKs0W0 ƒ-#ɡZ 8)'@;]I+{m0 뱏O{ֹ9}h0;+è5/ZDsb9{ ;@?]h4FR@=+>/\1f?O f̉2@ pm -s$O<-\vQZ]ڂ{㔺7PڡN :;-EaxD+J@nu6rm:b6$|1`͗]1 2?[+̼ L`jec 8 O@ls:Lx K67ֈ%F ȱ*1b}SRCkLGAMytה)fܺh̑pZ)%b ǓGۤ6yMb_؂\ 8 ݰJ]bFz}>cEr\'ɪPrͷ-cfYr o^mU*0y+㫃'-Ɏơy'Hf{J<ЌZsSR.˧2 -]ss^=E#3eM}V:]5uE;#zJObsU:TVc.HWw|GdRc)'-( A;CYF9Қw\d׏TMYl<Jendstream endobj 144 0 obj << /Filter /FlateDecode /Length1 815 /Length2 1820 /Length3 532 /Length 2410 >> stream xRi\SW(lCR&H1" h(T\e+q$ 8B Y$%0ZA'vڱg>or{{Qƞ>f W XpRx@(3 ,.Dv [-ɖ̍Y|Qd 8r@EAƏ9 : p,l @x?"p}1o4Ch?h@1d"p@EFO)6{7~i;w-0@2@T 2XΧS7>͢;Bl0#X`,%,>=`K4^Ŀ E_ }^WkfN̈Xx oBAe,E (I7nu3,E4o]NiR[Ñ[V'\\H֥5Wp c8wGSZ]>ܚrGwlDb$ȟm~A|9y|y7 Q%jٌÙ}ve~Ms%[7(A[CJͧ.ʱ_G v!7Hiy:N@I8'`kȝrc4i8G-1>m[Z2;{9[YWVT#9Btu;lv릓˧?C*QN5Vһ쏱uoG*OigGjR[8q53T N%DyU%u/H"T"ޅE~ۘK 8 >Ŵ^]]r}bRI3x:[52_ ┤C6Qe97kxl1o;0sz0AeA)섯ie b\!Ŗ,oWVԥ2dNkҪWeqSff>6EB&}Qtkl~bGmpbR_?0< I{Hho2>$!PtI9Y%W6omDyfQgb&C1j8uP Y-D'jmJD&Sngd=*fȐflS%3o2d'U}{?<'V̩L L릅EbOCYyQey\ILk|&YHt7 |l򞮬:yպeāЍbj3;@4ǿ;z_TuSkVbv wddzfs'ࢄA_fВb{br4mLZp[r^`A{B[Wǥ= (^I׀RUSAG$_qaXm:jƚcՕ˞yOO:-˰#՗L2.y~j|뛤uE㖁arvТ˳ö5g7MG mbE_.hE+4o_бittn]yEQͦ1sGK)6Pv2x]|H|~$SxVrtaѮ$"&R7mC85EW<ő,==߉*fM-mpMK|M\=3j;pF#N1l2 Il>TSމ}{a(PuQ%EW"lZC^Se.Evo2PzG$iBu]5h(Ӫie{Z[~3iB,4_Op<{6 ^'o9_%G+*!l#ж_umMpӓ$Hի%J- Q/u]c| 'c-o&c<= o6?\0I0 X #չaW)+YkF[3BXg6y'];V:+gFM]K"0#[KBEՆc+ .l~O s948 OEendstream endobj 145 0 obj << /BBox [ 0.00000000 0.00000000 432.00000000 432.00000000 ] /Filter /FlateDecode /FormType 1 /Matrix [ 1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000 ] /PTEX.FileName (./gridBase-009.pdf) /PTEX.InfoDict 75 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 79 0 R >> /ExtGState << >> /Font << /F1 76 0 R /F2 77 0 R /F3 78 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 3112 >> stream x[KtHYAֱ]ّdytOzGr]8U,?֋7a՛ii8) aݹ5~>9~`]rc!4XJ#7J8Ju.yǐe̢e,)ϬFS03“RR vc㨃Kp#Osq:Foxc.JǛ91N8DHZƹ2K\|惀k ǨMA:t| uQz$dna&5X"趣7am/NN! Zū_|;yx;wÛ}~׏[!NË>?w]5T/{xYτ=7 i7%[Qo#$1<|zI2m:K:%KFȎr`g:fC8q&:/49LG$t !%B`G,t6'H'S4v;27+̟^,M-fB60B_ŭ7 qmqӭiV\hc8 z3,qTANg0rQϣ ZѓYNٻ>Kz~:HIH`)5901܂&wz\X`2DK`FdqtyHuc= t+|(Q"DlQU #iKx4U3t挿 ;+7q7j\12AQ-sˋid h#k@DЅ .NL|LFqmxCSE}*taA^PwksC| .BKz%.K%1\(,wZNX)aXv|Hyf VhHAQcy-Lc'" y ">= omG4tr!p@1\3-lW.ͳnZ%#~rXi6`vX OVO4 pP{ -S +5\-sFBHWN | 5vV  a`odXmy3(˂jFxz;kS##ٵV 5@0yT7T&jZeI6<}YAVRa]F o!&&k2Y-Œ/iD"8:9uVhIoBo9/*#V$R ze"Սhn9sށЮ:)uIx>B"%F"*d8_ZFA*lBER5  O -M(. &\49lP֤c2kar.)I̱6pHMe%]c3?%*pnbܽ;?j:ȔIhf= uj=Y% żddmt; =Ҥs!z\[o-6=)B1vP%9EW ۠uȖ~Pp=3W͹6@y)XxtY[X&e2itӮwZ"D VNF" ^Rˮ| U42K#JdpGx,ǞL]4+>n:^k=UZB5$8>Lـg=Y% ռbwh. 1DoB޾E b)Vъ%>07} T*Pnm@b[UX_ٵtJbIEGR2[mɲ3PВބr^cT${fuѴe"( Y!ik}u5@'g^_|R;ܔw^Ml2xGΘQ>V^ک|%v@=#vSPВނz^o! )o YHs; [z-^5 ^&)n|!ʍP"R{`cunHٺ@ѳ=Y% ռp3bgh!z\)4 ;.>wתAfΞzR0k vP6`K7e5dPV9tK}ۡY% brf-s5*rމ=rD3)hC^Dp :Mr ;|ng_oî* l%tc3G=W U'ᢘ43UZ|lJk%bg&W&1eA2ZZx!z\iFjP+F@+*he>Y[:}[bI+{-lebUP[WoLpxj&6[9+UhIo犋y\#=-sJ0; a=֯\b6 ^th`Eq[n"۫S=.JQXqZқP\Ϋh6V+A-sZfڎ._yiC9@/he;4> stream xڥXY6~$1 l .t25n#XOYa= )XU#EOBj,LpaQQpf5:4,,~^?VjۇŻZB3,> p΂xV~wX*Q>.Wlv- 5/([xjxWܞq[io:ˏ?0'5lJ-,?ógC m䟑~9EŚ3JKdX⊕tqe=ܛIa7qцmH6KĤj˶Ü'?sgѢEEHМ8Ն8h6<"öNDy"5jP8.62ﵾ텱-VJJeUcd\5#T oPh]WVqG;S4Ƌ-Yp)tȶ=i_~{E: GIi#IO`m{ڕgt|ĈfB|# SJq~ sLн9B,W^E!(u~&w<0$msdL Y R"?\4(vS کiD nha6QL 6Pe-l!]PIϘ}X~N+L {mae ͜@! Nƴu5.i뫄iKv)mΔw~TH+nx3FLh]ӠU|9rZ6fRTӬ]7}Nc9,9!`:QeWX HS(fQޘc+ %uU }g09mĝ1Af[1!oĄ@t0(B~-Z0:"%䳳Ou#6_fp7']96Wg[C7< l\yMɓ +%%#ߜSeU>L6O}:[n2Aο_wȆ3UIT'+t&x`MA(ɏ|ҠäB{mSzR0) Y)yLW+luJqIY..S^ &QI)I]_P [n#{%#/6 ʊfQw2"^MS9d&df"K;LAs5jյ`3V]a%8n>|D\7n4M4@[?t~v *N]OJpS (IWNzmz8ßj ipJY'AcD{2㒰?ZG~glԹmB hE ؂y\_+#H%qj0m ),@ɤD',C٠jΨi Jż"#FPoM'g?`* =A͜< 56{;u"ċ!| Kρ^ -Wx~cI 涻PDxf *귏,xp~xYUPiN3/+1xE;@P|@JWT%LpEDiR P kf+hp0LJ  e >@W㞦_bÛ'#myoOL|~ce3Q¹5ǖ"sⱕ)-xb pa>#{D9nhf5髮ۭ rҿk!!`ua`7y7Ag8'ncM[8=Ѡ,Nݝ{oPƕxy+ i | V;W9[7S-AH!?]< R[K9iWoH=7c35A:H?L40:Gu$yHKTaz&+ř!m:iendstream endobj 147 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 148 0 obj << /Filter /FlateDecode /Length 1789 >> stream xڥXK6Wlf%h!q{IrZ˩v-zCr(Qp8o~ًETģ`u0 a^4X2F#iQ6>ŻRZ= 5m٪Z!@ M3[Wk1 :z?aM("%P/x; UڣZ.*-Ϲ2>!a|dPL񂺻|8?cK6IԆq[>PVZ!X aZstrmPbYSsΊs%s ͦqH.Z6ڴ1'JeD|֚Y Iu.٢]dgY'1z`smuΨ,+V8#?a=8_=iyU;Wp=j7eXun $a\}S$Lx/Iȕ-mG=O|o}6 c9F^G*Bs)Fp/-xbϘ)l`ED+[6:mTuA oF.XIz2 B<:)Ih(::N{LD9MrV E.Py؎ Q'ww.vs9Um)FZ˜8.Ž+(YX11ui@70V^K$%RlRƖ$wYkJ ipCjܣaq*ki"Pُ^3UBxc{'W-W=ڸrtxUyi<73XF# m s`EH8-/du(T&mJ塯}5uN@NPMTG} =tUk8E( cPI r a1j .UHT((>,qi,]Ϻ.y}6> /ExtGState << >> /Font << /F2 87 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 2907 >> stream x\]w6}X||lmt6nsAX%eM 36ĜS%^ ̰ZZ|=7Hn(2(qĺ7{/˷'J6 w'V6^q/B-^χFoNn}[%û;Ah脂OzZKIӉh *Hڱ/v8t?>~}gEH/[?/]'VWכSx1[^OgOq>p$3jkZ/[D.j┘m/zloyg u:)"]ڮAw=_b._nuq't='g.v&ع/֔WG\ ͯ-작ftx;<χ}8c n2#-:gH0l'U Ɍ8#C$r~E7i`X/˥ߑ<5Ld e$lf dFuMbRiKY Vpp I0FBaĄ.mm~$cS7iM"2 j6 Ɍ41pž)e1CY fJuJiRɑh̠G;5c0$3B#!0]T08I1FB628`HfTNK0u·:͂bYPhcL=8#ɦe!Q[_ *l < ՜Djǟ8\ ms$3tNFv]zR9k!ŕpd `=`Hf@c$(0Շ4ҷ\^}5lj7~Q)0zQ$3rcGnn7^MV]1$3L;DAnS Ɍ:j2|=Օj@ob|`HfTW#8 mlugƇ#+SDJ2cс1 b C Ɍ6f5XIWRNEhpZz A]Y!Q]OF-,'E}}RR1nQ$3j `sAD>DAnn0ೲ~tB?؄ܫ}!i3N1y)1ԣ?t @ r@:Zl44r4^v3)0CfZڞ@0xڞ "ji;v7'5la3f;|vޓ<֘BW" vmi{@FC0זuxi}7"> 20 kG`6ve hA~mV`gJwDC kOP^@)0V<*;x{O`^[6Yg?-o/16|KGCdDqgK kف 1ڤxdj*\^ cԼe dFmQN1y/ovO(k)Q1!0$3K/ m( _/nŰDL.;Ir$3`c=c$dw2C27 Yź o!Q} Vm`7+-xr3SO),!apߥ(3եma`̧_RRTȄHfT  Ȣ`-E/qu)f3D!^%c؍.#:c$ ]ܳC2B#!X(%e0$3jX@>NW͞\CCA}!Q_- qB=G+"qB0."aP0jK 6M<oSbbޞ_;#K[L, C,:x&YoM'm40} K)!(GBĄ>*CdZ>H NɌ 6Ŧ#*)<)8=l'4Au,Z&Ȑ0E AC2!Q5DfxhqzRœ;E2C72=e$d|/1(5m}:RۨeY}OBΥ)PnPB aִie}&ECp;#LLC¨][ O1ͮҐ}3_}/'̪qPxL⇿qbݻ@Ozbx.Żw,~x?Zendstream endobj 150 0 obj << /Filter /FlateDecode /Length 1468 >> stream xڥWYoF~ׯD'-"M A@h>45MEQw%$kgꥂ?ƥ2KtUQ,vTif3(駅Wb~8[OŲLd(,7&+46ov&6*͋H=K0~h `)¸Qzi4# Wrgڦ]<9[M4ӥp2zwPKqr5X+wGUOZs:zg_nG9ȪL?n8p+E% yrAt5+vnW gI/2_| >3}4U|.n"KH@B5ܭL4L4~[O@qB׬/ ;jvt,ڏQTSƋk[cz+RX?d+v"f^S* j,lañ| /Heasan͍zN#BN? :5gFճ[v"!cY8Ȟrh*g44'6e|Pb@g6~MRNbޕ/ǣ*vve1jGA=29mCr=B7ԧ<>wԓ\ HJ&,r Pm3Jpyr`8$&r)0eHqsʒ H`"FC1!&٣Rِqq6تrK׃ڪ TiꖁhuXQ,) [!14RB&ݼEQe`9 p"0Ď1wフ,CxٴKpf8A99kX":}@ݣTgvP=|&n%b6Fgh> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 152 0 obj << /BBox [ 0.00000000 0.00000000 576.00000000 288.00000000 ] /Filter /FlateDecode /FormType 1 /Matrix [ 1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000 ] /PTEX.FileName (./gridBase-multiplot.pdf) /PTEX.InfoDict 94 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 97 0 R >> /ExtGState << >> /Font << /F1 95 0 R /F2 96 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 1008 >> stream xYKo6 Wi|͢]`hgC見S#x|9I5AO+_woJk S'bC{bc "Yӿ.0AySYU; їO; jܼ5͡l4" 5vݺ+HtL:jTN2"-[B - Y_Fۋ={F "3%6w>oq7%KzV2FEy1:gM@/K\}'aܢ4ȅz^LkSN;0NE~Uv#Eo&^GgdK}3&71;J& K,[m`FeH' hQ!lkGqOpĞmytvIq$[&5?f y'}CīHvd yAZ1d9x%ѾE9zrxޗyf Cة_Wmh|? 9ӡ_t; o߂CP'j-M1`Y74 VOP7z!nI-{#5. zaC`P%f.`eCEXZ9ű޹] 5!$0*J ) 7+ CA/pA:ȏ>T0;)Wnm9LKtLhV)? tUeeendstream endobj 153 0 obj << /Filter /FlateDecode /Length 1732 >> stream xXK6W=yјS"nɶ J㶇4W5bYegwHl9E!r3t:z|aDKeL!5\&O%ӫ7&FLw0j70~Q+[s4%=-hE[jѷsCc˄'!3F:,IK [ bX<|ed܆u1,2P(!.[R){ձG{|C&X<ģsp/.`<0?l&֧a($q)~;Sq;jcEf 綔H˓ϽU RF"_`Sx39! zrfD+3tn|$i2Si2P9<0^o/7pr8fG)b&(2uU!>09gzqɴқTMS XI4V:1e20QN0n3ddQʗ; &ʚ"3Er̒LYsDTlNSnX5 h\2I-C wK? GWߪ柟^ͩ^IIV\#,45}2UJ>d ;jy?:~0~yөwt$ 0}]{FT{: Y}S hHuT}Fsw)aH OD WL8&rO8KA V޷hR'ϪѫQ]4NSznPѠR{~ZP=^4G!q1˩: )D(xFclnȞx*@|!,A|qdbzevTy >H]P:`ʙbE\5ֿi mƜ( ٪a<`FasA,T6-7 :GD94SS/Vޠ2@ G@̊~Lj/8:xX{2v܏mh;Λ|(JFBnzK!GW %|z@ |ܹ {l(3lPҜ|( Fj`W:#i4:Y6^̌gU^wak ܚΚ`%۪zhVY hFQ1/cT:" lUZFwm Tݯ(Uh{@&cCF1i|xԓn^Л0G_YA(Y+1pr?Eu^mpfRA4Q^ZXJTgjBppQF0,eGnjwSYfy˓O^8Sva &q9*cU3 AL2R$B QY)`-ᦛSiEC{$Ba\0kIB0i7|Synmɛ6ᵏl`5[\S+(7ZN/Q&sH"e'l*eƤm yjLaz]z'7GH˙L _1eYkቋǁ{V@ӡ@gp+".⇼?YԁUQ65 dŢFNnz`w\1N/ TQ?ny$0!Na߁&}O]endstream endobj 154 0 obj << /Filter /FlateDecode /Length1 779 /Length2 1482 /Length3 532 /Length 2056 >> stream xRk<drrRVي\ &v͸m&K3fe 㒭(21"MDQD% R.roxΧYy VyRM $vD|Sݝ|Ţ x0g"\{ښ\"o$9`6vHh fÍyL:̑k!6"t&̏2d6x͞^p8̋fh0t>\4f֒37_ʌЯH.7 lIeGx iַlę OmdGpB#0# 3o|ͤl,̰_pGfx2] bsu։<9;>[\\brP` aX)~X3,''ʿ;of9p x@<ʥ& ,Ƙq zV CG8hbXcƽ<Vh"rڒT/T)>0ckwvbOKs: Ri}TI"=RW_h/81ypx}LSN B,;IkL 8W6Xѻ~{_" ftԊPKG?j8U7fJRz~-w/+~RfeWQN5?hڒj-R'!Q٢4$Iw>*l7Xi㩖c90)oGegg[Bb&ګ0ڱCm}w;F^R^{, 9ӳݏ>jpFW{=Q{s+'k<i'ep5 M,7,m~xS2SE͝@2.4-mY2|bej qjWFm`6VS{c߿w74ݛp(KGI6כg|(TDyHigHe䚂P&ZؐLN=($u+ߌ.7 rzá`7K瞬8e8968b!)ӿנ' cPRs°\IW%?ƒy ~;em=p=b=U۫_x5*܀'Ky "F?ڠ޺ٶfE1cŌׄ->Sl@}')"|hkne d1xfs.}q@K#w॰{~D۶{6!Rl[wÅ~bzvd8CXzaӧUV72u>'uWZefe9b5 N+r -?nnjarrnbJ=#˜ro{?aD?>^Zϸ$Oh_1Hk Z?. :x|BHkendstream endobj 155 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 156 0 obj << /Filter /FlateDecode /Length 2457 >> stream x˒>_JU4 ƃ 'VU!$\#)DEӍn E[Dh4|}1;f3yr҅/p0>N͛/~+:TIOwW``Itz8V##dHP{ݼp{2\Ǚ-ZHY'n^~fvw|od"xpcnÒ 7\zOĉLsL4AR=; {s%4!o[(@t0 T6kdݓ '4n A(̄3N"9sS E3Ldg(uI( X_J#K}KHlJ"˅v~hc[Xm g@׊ =O/6&]Y?-2f4,yj4R>] c_=b|p?Om; јm 5) cQ6@(RL*2M 7AH4HmC#J6P=T-a U.2[K؋/ cȷBilԕ1S͑UgCI~Wae>L.'aAfRD1\*CQWIzl8YFq]DC *QE&gd{~w(AT!ezݕh^GF=.#mb CM~! $m*`z˄%>=ihMCG.rpvҮ=D;9AHGRmlW1]auMDV(mxa7!R}qAc+R7n3S!/g&hM)|H 6jԙkÒAF*FEC_ʂiӅ K#5nG #"W N)ώԂ"y'ju%=BHҩ8, 8M$N|%O& e.,Z鮞) "^fcQ@7)K}^1 BH0#d`zQ_i:?eᾆyO\cЇ`s7O$:U-9F8LHRϜߎzĄjIL_3E~NG&G(45O!N)÷qLXWi*ya}`I}"L0;xf5EJ>Hᴾ_a}_?)yśex9)I]3!!c[!vkak |_%W86۲xg'.iLv";$X3:,S*ޏ\t^\+Ml&%%XFX4-@y{3F;z/仦m 0] Nǻ0&+#Цp ^P.r[ē6JAԱ)w$҅>3-}W޸\G=3dG|v${|eʀ+>$/NqSGr ,@2V9:PIς;ynfZ({ENa&6x;UNB|C<=ސeǭLngq'-FjqIp7) g jm|Vn{ro0'BygeB8;r| #,!(@hi%RJAZJ\5X{@ nu,E[vN`:q@yÙ[8!@mxjceٮC>L0 +봦cu| .݃,V5?9> stream xRiTg* "" 4@&YZ"(1d&$ BAY"XR \@*(URQA TVlV)̟y;{6'Xrta/ʎv!{{?#$`OOVI0`/Ë?Bb%$% U`B)AeBd3`I |JT!"LHh,C.p1ߴE*;(U()S6r><\Dr0o/QI10l<D"RLc(iaJFE|J*ѱ>ƛ흎|ɥ?dGc5gM N SD}b06.$D nP =T`"T P5'HB 4ztTdc[Fjr?:ɉN E3> SR(P[*wBDQ5*~N?XSp",]Zn[ǫ:s/%!]# MZ}aTӗi՛pݷуwf:~ծ>ɝ6z 1 X).Xjn/ffo&˰fV5spV|xm]ׇ{̍&`d9U٩sXJ1/Ք&Ǧ}Cg";IO?㚄ee?iꔝJؠpTXm][jpO_t?ǃ𜉼u"3 [%[xӘ:ႁ[Gns74w'a EMdiIiQM# m",V]p Pq"n).7n%͚jL :N C1#3ӺgT8#z5Z!\^|6l}~vqGZ^ 8upf7hOM֮ Yy>TvA ee..3!s6-ziWWf& s5Ox,ڭhLbgtYSry3eoƔ-s~ օ^ih[Tu :NDGœeĬ̼*loWML奈kEG/ ܩ=eYtlS[[vl,]w»Ղz#E*1-3zeiڒf@6˿Ԗ޹5KA|01#c:V xO idGqgӅdIyOx&xTMU<"RcVʇ|Y< [6S)Nm<,_pW&W-:kcb̔_IK̛muP" !8w7gcendstream endobj 158 0 obj << /Filter /FlateDecode /Length1 763 /Length2 1176 /Length3 532 /Length 1738 >> stream xR}8Tiؑ|̖ˎРZRt0s1P61ҋVJfK*}Dihg!.][XJv?k<~ f=;Jz1HI uI`@gwӁaK$sDr+yl!#JuPwqmx7mr hc1a@B v/0>F=8ONT6 2T I#0f?pTUD StPrudq4`m Йtd q̿šq8B 2"bcBTVYbсb ?VHv4xl?\Z9 xa\ Szӹ/]5˄$EDR yf֙͢_=kev+9IհV֬ܕ;U;rX)J_6)lC5D^&2|('t HW>ڥbY#/5?dlf돻w*";?=W j}xDOeag@=}hWgׅs3 5+ L%z]2$FZ?R/3'U,4KyY[^T:X![u2pwheʀҚTx4CMұ]uB?Ǝ|:+YEfc rjNm m,b鎎V;M+p m3bwNODh 4Ne?t˱̝qZUrAl:U2Ӣ-wap# \G%O &y_Lj]zWRQ;QTiNqu^FV|go_^Kb+ Lݗ\r[|jm+qTFKXҺӴ,VWM(C[yMsZvǾh[;Zw g约SJZzTnsg+{߁=Ͳg?1˦ZlNcY䩐nknPV;8#?zTTwX% [/pXǥ }23bU}itx(nZY Æ[ f*-n\%;"r܂P82]{",1u7M>Kx434zYg7HsKJ&֕Z61-]蝁zxNu뤿%OZ -5|VU.#y_L׫Ũ65m -W7Mnj?ѝrzN9 %ϘH+rm}=R%tc(k,uo;UqTfY ݑ wm2_poHڧMb2ϐ񑔌(׃NNKjiG??<\ yx4wendstream endobj 159 0 obj << /Filter /FlateDecode /Length 1614 >> stream xڵXK6W{ۘCȶChC:!A Ju6E{EYf B"5^'_iXfs'DȌ.LHc]tJo"-a|Qh{uw#Ɵ\sxϐ⊾:u w'3!Zj951wmS5JRzO*zU"t5ܑny}Evv: 2SBZ&Q⏩ɜ2ý, V4^VJ'eT̿.'L@-*vD^m䆙\fp3 f*W9zӜh(;Ҥ7p'ͫ?yUN Ig홄 u`EydoQsø%RIl#X,Y>r% Kx퀥vs?yZn)ܫŬIh.:4mKm iqJi.)ˈOUC&] (dsα.y@Y0/xE1SdOb~ҪKkf;?YPV&ca,SȺ_` cޗP*N \kbCw۪×n*p0.[R/JUȯƝ;DiSK AKĀ_p]}n9rt!X,cgNdyvHE.9S]R+ q"D eqrq̨b*$r,R.+R!uLBѩA6 Us@VCBcWKO5/bH5,@B6GgSJ h# W9bB wԎU~@сFM`3ԎB{vS qR90yx\W}JY PtIK"'Ȯ\~ջoOEm4і%)F9ϙy#].Jk"|-XMpAl: PU7-} ۈ,xj Z_?UN_vWy!r{QC+\l=j}yo]W)UZ9Lp#}?Ke\r"6m:c&9)4dnSEC0g[C Ὠ=ۅLM I=z=r=PÖ2w9b.38}rM郏j{\O8QB1!/n'O޽r“Δ5:93aLn'B,3RɯGr|Hhpu^WP9+8f"T&yR%˄ Č&RHH @Q~'pgWۈ\&xl9Qi0Q6e|YjKζ[QIWv]5\ܹ_C`oTؔ;eg71] iOJn!n]烓T{*7;.3fOe`Wo޾/}U~L%}~x IŎHKQe_*6α n|+f!c endstream endobj 160 0 obj << /BBox [ 0.00000000 0.00000000 432.00000000 432.00000000 ] /Filter /FlateDecode /FormType 1 /Matrix [ 1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000 ] /PTEX.FileName (./gridBase-complex.pdf) /PTEX.InfoDict 110 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 112 0 R >> /ExtGState << >> /Font << /F2 111 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 5491 >> stream x[ˮmGRCz-@j $cK X}['#"su,݁^zdFFfo?{+R~yǿocgOϳ~|e9UWO>{y]|]e_v}ޮ}ۻ ޮߧ{ucq?[}'g\Џ8}}=G}|W+׏x򏟶1~W<=wOol?]{|W<}#߿ۯYk|7KͭEM{EkDVu9t]낯4L.]w/.xsu]tߗ-sw<zÇ綏x?|2>r?#>~|g=ć7kcǏ;e }E{8=̛c4͜[B0NyGVFiW=>417\(;6^q+,|#<-[m"癖OBOyC| ?C|?õƽb|׿? au |z`wV:b[v+X lxj> ߊOx]ϦĻϦA[!N'봳$8hP>5x$p=X3{'|[opq4u>O!3pċuXZ`,7g|6q끫kp& XOg^7_Bl {؟c}q1uĜOt%UoOW q\'ƚ#snHK&E!}=qi]ח1NⰇ\ {F]Q~:šĴ9_{{D$}";~ڧvsDܲc&MsZF?#ˇ 8/߰7͈{ޏ}Tw6-bA;jœvi'nՕ.0L&xӪ0y ͇5Wb#.-T ZC~S oo|c>-W,soz-fi#z|-?~m؟սbc}V^|<{Dïs}x dOM#=7:]R_/Kϴ̭ V~܀ Vx < <_'xЈct2{hΣ$bi_EY0Qq7f"nF\vNx| ❼oxۄK AKqNܿ#x8Wuθx-[jQ7`]'q=,pkZ_ʼ]"[~D\8p肁 `@ޡ3d5}K,7U5 h t{#5.]NJZ?).6ct^? ԕU?БX)>Pmtd}M]ȀO%>y~]'B<Sl˟SgN~tgWR_:<d1b3yȗt+w%oIm[6oW[L/9bZҐkkow1VH؝Bq/=o]#0ya*|ߎdU;vT^;6(c$O8 V!7  N9yȕN1Ҙ9lYo9vE픢1!n9\ i"X󟍱1ǯaGkMr\$U eB{> ն^Ơ=ѹ-.kfX3*lk;P}3V:\dX'ӱ֣/cAvTCYy ,7lvb|/{Eu"7+VLz7Gkr5Rh#i"6Td+-2~Fc 8jZ5gui_y =`ݩ?kS/Юuǟ̘KVjhIڇŤk(ի9>Qc/kcQ8jZI^(щU1KuY1&w56x5b`:"x^i2^8EI:x?ֵRC6xrW>?@-+?@W.Mܸ>rǎ{-㜞WG񖈓[ntL`<.]_5㰞~˾s:i"k=z@GLt⠎V\ vH)x]:BUl :h>pP\hQ8G]Ĝ"~SMKpޡ&]:p_{:9`2ÿŧ W_E#Av:vo4>\`t0i'/tt'ЙۡQ9T az#FPFȑ'|y>VbŃ=Rz9ďPnZpG,~B:ZhN%ֲ ?9ۭz ˂1"U[q޲\T37zj9!GU_Yd 0ǩx3{>TBbvii=n &OTY-Ļv˴Q eNQ/`Uo7%9aʲQPv"Q<%f$FtB%: 6BUQ${k# ˲X?Ps;&LH:te!X_<3'l?|(׋ew`fHlXߥGgSS*`*+qR"?)~0/LJfŠz$`d ,ŃX5X*:lfa="r.⸟ǁ1d鏃e1`FV4W~)pMX_7t? yVCp< }Ǐ"{(o;{L EOÏqXҎ:ql8!e02<X᮸RqyFc]-y~GC?t\N8xE ;WJ}ա} 0dש󠃘+z4*{ ^ذ`vp}61[VY IbYKMLr9̍=,(HS3vSRlNa[,W=OÆ}j}E/ehܴ/ZgMj56دwD+/LڿI ^z u^PluY&>~O3݁o8MK\;.7uFG "a/~>-j ߥlE6Ħvi%f27m_#߇ܲ&V6n:[^M> stream xڝXn6)tJ)z\Ko=(Y宛>}g8CJ%oZ)"ODBf2RJ"6Z7-Rp Է೼vy}'COãRPiV^,KK+E}~n䅊+8lp}?yo6*HY22Xk8x ˿ >3ç'GRwf ^d6~'4 p'!DӢh5bǸ|*wm8>TATXUaZDߖՎ^꥽PS/pK%-2!9DB .)L+ZK'֛Ӣf%@hogԚ6%yOÝ#ߺ#J*8  pCupf=UH?׾2\a o `yH Qg{m2o+UgA$/KD:Pd8]&FLg$'pF{b` Ug<o $V&w D`ޑ F6;@bgp 9dQJ(gd /!fam(VɁr]MԻEտ_.bRWW;5O^Wf"A7A }kNvK[ku?>@' |qws&Ѫl˟5*-6w_n#Bi]͕`)R#w6K*IW #yH)m49.d䔰7IMNX!=rNzR/X23إF<},5x,%kHr!A3=|ﺫʁ4 5 'ĺ@"O(*LD"@MHgZA `i"%AGȪ(>3hQqyDd/tOp˫⩲eFߋqMiCp/*.bvVFĝ=_M5'<sCz ym*8LYay:6~&lL7?*#)xXXhRqh\Jg󉊾xpslXAZ~80{R\ٹ+4 gȟNAZ4Sg`ruDL%@tCedܞ˚Wq 3g8[s"鍆:?N3\3%`}ط]Zy)w+52LPQn%\ u\kri!r1|eb SՒ2U&&[n7{±JjԘB1`ǭH֬1ԓujF$ zgC̼loĸƽ`$NWc:;%M(2DDYb!$OT tY|*4䩕D S*N ůſA!endstream endobj 162 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 163 0 obj << /Filter /FlateDecode /Length 1349 >> stream xڭWMs7 W踚h~iCt6ZV#Yɟ/jhsIMe'AJWD uzd%a2_~,nOWo΄qDjGk(3Y] oU»'x3\ǎW>Og*E N/%VYFqiQ󎦼q޳gm|s|@&L)R_[+{bD1ݎ@h\ f1P`t(Tgl/~=G!ve5K>tguntS>ۉJ̬χF=wRDw▝Dc{mw]L)nǣǑAxeh$T񚘧ͱ}֊Rzχz2-+6"zM4b-.%7޶!h="!>"ahㆌMB+ni3"X;Vh(aw#V9{6٭,쿴DwUTč%F*`fw=  MH8C?]%yw_74hg_Yᘏ^&;tFAQ .gjT*HS FTқ!&.T vPL*fC.M7}H. ++W<Rak5eA//6Zf2 w?+56kWTtlM0mFg*^@ RʸO(#+Oe]F'1F0k{ƻт#Gb6 \e&8Uulg<G:*"7D﯎W~ιWGsSA{x 碑7 e3#ȪO)bѩGʨm8nX=1OW= ژΰ{N 8$%;!YgSR\F 4G_3Ieo;)'Ŕ{tpiW<\g =.Rۊ.>%L}|YC–t#+)@zƭpxږendstream endobj 164 0 obj << /Filter /FlateDecode /Length1 845 /Length2 2641 /Length3 532 /Length 3240 >> stream xRyyz-/cmbxh "y@@pc< b C*=X ֧T׆k@ŗA%xzE$MR X н@K!,3i 5A!#`I C`=Y@2VHL{6,8 p NY^7l]O$ZaHGC"0($_:H,)8J;9c X1DֈI% Mq: c4pq nY{ti!v ~ga_8Y"XDo "5 a@X@0 q`àd `E)Tj bM `F8J FU1%(XE{*Hw%u@K]#俘X*$."+?1X3 V';>ViP>cφT_#F/#S>};ׂt Z|~EԬ݅_$ίX2}mF,lmmǷ2K>t/Z+-Lʰu8vFjhGcd f݊Uy(b0";GJv1oAg,wBhs:w̐ZM-k,aw$fN|A6~mڞ5y{[Bq;:yc1Uom<@hFȜ7`HyogOUP=8lRjg 5);p12(v_ GS=C/L5N٭Zc(41gŸm1ZX %nqjж3Lo I@DbKVK K+Kc*uLTo}P )LW4[t5R/6i׏TWao{j\9k̍҃gO4!o'Tl |{%wDA{yZ"?/h{6'hشDNTVѾMHd%^_nNV+Y媎 /5Sk!Odm:N&iibShN0҅SS2|xr>lA$B-]4cK3)N[cR\EQbJ|ҞiE6I8 ~UM[q qPRI|h=M]1C20zstƖќ[cT_$C&qS׉*fxL=COǗ4PR}7_XTT\t"{"{3HX[lmZr<4ՖcSE#ɽ|L睸s樻70 e_xj;Rv UwS׼.Η3Ԃx4c_Hث:Ä&cv'Lg#C!k>EqW^:=t]_]JqVJۯ&r5/X>cv7tzq3G/ٰ[[ZkE4HZeF7{m6K VšYX 'n3$g!7ܸGJ iRյSWPNkae= & ,$_kl,mIZRP=2ѡa{\'wW}rv5A-׹#2xCUXhCY BVL9xvGo:̚P&oC!6olר(:)>})1'pma8*榣O˞[ ~o73JտhHIl vymWj<P)ÍKÖ6O9)n:#R5J캹u$qX_{<-3)[x.Rʴ; tS)@mSpmvG*7O'f{|f}L8!aÚ}z8&^|@D$gnRDϛw{X^zr l,r!M2ܒЬ'c'qY_xqB;Dž=q?]"zI޺Cp!qYy/P& >?!%*BP} ;endstream endobj 165 0 obj << /Filter /FlateDecode /Length1 808 /Length2 2227 /Length3 532 /Length 2813 >> stream xRk=. 0xbZ;N *O_EP#;I[`>95Nٶif>SpY;P覾@$z3,W!8Exfw-+h[B\2QGרtH)5ͰC-EPOktWϭOu{6}j/}o(!1|,C1Ѻ(BI4;'ʺMO z~!^.oW9Jͬħ"k'%qÞt2 pҳ") 䢘Gڡ$eS#n.mk/QI-^e U1ѵavԅ"Isћayw $Ce4.Us62 j,lm/I2u L#}<~mkawcOp jgYf 5*q:D6A*.6id t0V9Yx]l5sߊiԒޘR9zPr˗c}CM~<8C&7gY}RA֯e~$%P45n\5zZ&{};UXcoz'9 {to &Rz3U[tiFo5*>bޡ&>18H!C"EixjKGn*DDػ 1CʾOIN$7RvyYг> ]#k_Yt/)"tNW~uu޺Hgd0z4xsS'c6^eޠ¸$]Wex|tmLEi u؛V<^]SBKod*1{۽c Ll#wlyfP*bNe̕xO\(hM8R2j2.#c]՗"=N}JhfyOSMoTx_K{jX-\-dbXj߮Vyj6W.I8v.) S)oF\|@SM%ZijtEM[ߦ!bV: JE>0,? uh٧ۧsqЀ]}u% &7$}OVm>HGʈ\Pß=y'j)z$>Ixb0{Sr,zai/ϛ*S ~ y|i&qolףnKі6[ò&XMy ]1gZLRDxL/O/:ǜaG0A:sU[>ՙ[o˰WMyMqgDuonIe(.m:\Q2R룮ύJ#n~9#,9O}ת`xk3%ַ o;ŋͯR**·59 ]( s:W1b+TL1-"6WBj]ٿ*qii? ޳ꩳw3~мgow% <\y+6 v Qw*<-}HNCx^?8cd`ι 1siLq;ӜߚR*m"zi = W&y|'fz}% T3~#KxAv \0ҵ +5$;9gɤN+c 9kIi^+vNŚ=(i=+}1cۧWV3RO(ۃLZn$oEg?;/B1E[g2KOsAk'58dY~i!Uz]]h3|D09,O$;8+RS9kL3~P_]ZohWE 4#7hڨDߐf:x6e1<_j'4b3endstream endobj 166 0 obj << /Filter /FlateDecode /Length 149 >> stream x313P0P0Bc3csCB.c46K$r9yr+p{E=}JJS ]  b<]00 @0?`d=0s@f d'n.WO@.ʛuiendstream endobj 167 0 obj << /Type /XRef /Length 176 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 63 0 R /Root 62 0 R /Size 168 /ID [] >> stream xcb&F~0 $8J҉Ji?Dʱ R\Dr^Qh;∵A$d< 6o38XAv Vf|A$B,.6 !ζ ,V_"\' X $l+$X endstream endobj startxref 143827 %%EOF gridBase/NAMESPACE0000644000176000001440000000034512057445674013261 0ustar ripleyusers importFrom(graphics, par) importFrom(grid, unit, viewport, convertHeight, convertWidth, current.transform, get.gpar) export("baseViewports", "gridOMI", "gridFIG", "gridPLT", "gridPAR") gridBase/demo/0000755000176000001440000000000012302520733012743 5ustar ripleyusersgridBase/demo/00Index0000644000176000001440000000006407707352454014115 0ustar ripleyusersgridBase Demo of integrating grid and base graphics gridBase/demo/gridBase.R0000644000176000001440000000201710262662676014626 0ustar ripleyusers # A base plot with grid viewports synchronised then # further grid viewports pushed to contain pie charts x <- runif(4) y <- runif(4) z <- matrix(runif(4*2), ncol=2) maxpiesize <- unit(1, "inches") totals <- apply(z, 1, sum) sizemult <- totals/max(totals) oldomi <- par("omi") plot(x, y, xlim=c(-0.2, 1.2), ylim=c(-0.2, 1.2), type="n") vps <- baseViewports() # First grid action will trigger a new page unless we do this # Should be able to avoid this yuckiness in the future par(new=TRUE) pushViewport(vps$inner, vps$figure, vps$plot) grid.grill(h=y, v=x, default.units="native") for (i in 1:4) { pushViewport(viewport(x=unit(x[i], "native"), y=unit(y[i], "native"), width=sizemult[i]*maxpiesize, height=sizemult[i]*maxpiesize)) grid.rect(gp=gpar(col="grey", fill="white", lty="dashed")) par(mar=rep(0, 4), omi=gridOMI(), new=TRUE) pie(z[i,], radius=1, labels=rep("", 2)) popViewport() } popViewport(3) par(omi=rep(0, 4), mar=c(5.1, 5.1, 4.1, 2.1)) gridBase/R/0000755000176000001440000000000012302520733012220 5ustar ripleyusersgridBase/R/base.R0000644000176000001440000000265507707352454013305 0ustar ripleyusers # Generate a list of viewports that correspond to the current base # inner region, figure region, and plot region baseViewports <- function() { omi <- par("omi") innervp <- viewport(x=unit(omi[2], "inches"), y=unit(omi[1], "inches"), width=unit(1, "npc") - unit(omi[1], "inches") - unit(omi[3], "inches"), height=unit(1, "npc") - unit(omi[2], "inches") - unit(omi[4], "inches"), just=c("left", "bottom")) fig <- par("fig") figurevp <- viewport(x=unit(fig[1], "npc"), y=unit(fig[3], "npc"), width=unit(fig[2] - fig[1], "npc"), height=unit(fig[4] - fig[3], "npc"), just=c("left", "bottom")) plt <- par("plt") usr <- par("usr") logscale <- FALSE if (par("xlog") || par("ylog")) { warning("viewport scales NOT set to user coordinates") logscales <- TRUE } plotvp <- viewport(x=unit(plt[1], "npc"), y=unit(plt[3], "npc"), width=unit(plt[2] - plt[1], "npc"), height=unit(plt[4] - plt[3], "npc"), just=c("left", "bottom"), xscale=c(usr[1], usr[2]), yscale=c(usr[3], usr[4])) list(inner=innervp, figure=figurevp, plot=plotvp) } gridBase/R/grid.R0000644000176000001440000001075110074350157013301 0ustar ripleyusers # Get the location/size of the current viewport in inches on the device currentViewportLoc <- function() { # Get the current viewport transformation # This transforms from inches in the current viewport to # inches on the device transform <- current.transform() # Convert the current viewport's location to inches ... width <- convertWidth(unit(1, "npc"), "inches", valueOnly=TRUE) height <- convertHeight(unit(1, "npc"), "inches", valueOnly=TRUE) # ... then to inches on the device bottomleft <- c(0, 0, 1) %*% transform left <- bottomleft[1]/bottomleft[3] bottom <- bottomleft[2]/bottomleft[3] topright <- c(width, height, 1) %*% transform right <- topright[1]/topright[3] top <- topright[2]/topright[3] list(left=left, bottom=bottom, right=right, top=top) } # Prolific use of round(..., digits=4) because lots of the time # calculated values will be intended to be the same, but will # differ by tiny amounts due to rounding error. In particular, # we are keen to avoid getting tiny negative values for par() # settings. digits=4 because with the values we are dealing with # two decimal places is plenty of precision. # Check that a viewport location is within base outer margin setting badOMI <- function(cvp, omi, din) { round(cvp$left - omi[2], digits=4) < 0 || round(cvp$bottom - omi[1], digits=4) < 0 || round(cvp$right - (din[1] - omi[4]), digits=4) > 0 || round(cvp$top - (din[2] - omi[3]), digits=4) > 0 } # Check that a viewport location is within base figure region setting badFIG <- function(cvp, fig, omi, din) { width <- din[1] - omi[2] - omi[4] height <- din[2] - omi[1] - omi[3] round(cvp$left - (omi[2] + fig[1]*width), digits=4) < 0 || round(cvp$bottom - (omi[1] + fig[3]*height), digits=4) < 0|| round(cvp$right - (omi[2] + fig[2]*width), digits=4) > 0 || round(cvp$top - (omi[1] + fig[4]*height), digits=4) > 0 } # Return par(omi) settings that correspond to the current # grid viewport gridOMI <- function() { # First get the current viewport locn/size cvp <- currentViewportLoc() # return outer margin values din <- par("din") # Do a round to avoid rounding error omi <- round(c(cvp$bottom, cvp$left, din[2] - cvp$top, din[1] - cvp$right), digits=4) omi } # Return par(fig) settings that correspond to the current # grid viewport gridFIG <- function() { # First get the current viewport locn/size cvp <- currentViewportLoc() # Get the current base outer margins (in inches) din <- par("din") omi <- par("omi") # Throw an error if the curent viewport is outside the # current outer margins (implies fig values outside [0, 1] range) if (badOMI(cvp, omi, din)) stop("Outer margins too large and/or viewport too large") # par(fig) is proportions within the inner region # par(fig) is c(x1, x2, y1, y2) width <- din[1] - omi[2] - omi[4] height <- din[2] - omi[1] - omi[3] # Do a round to avoid rounding error fig <- round(c((cvp$left - omi[1])/width, (cvp$right - omi[1])/width, (cvp$bottom - omi[2])/height, (cvp$top - omi[2])/height), digits=4) fig } # Return par(plt) settings that correspond to the current # grid viewport gridPLT <- function() { # First get the current viewport locn/size cvp <- currentViewportLoc() # Get the current base outer margins (in inches) # and the current base figure region (as a proportion of the inner region) din <- par("din") omi <- par("omi") fig <- par("fig") # Throw an error if the curent viewport is outside the # current figure region (implies plt values outside [0, 1] range) if (badFIG(cvp, fig, omi, din)) stop("Figure region too small and/or viewport too large") # par(plt) is proportions within the figure region # par(plt) is c(x1, x2, y1, y2) innerwidth <- din[1] - omi[2] - omi[4] innerheight <- din[2] - omi[1] - omi[3] width <- innerwidth*(fig[2] - fig[1]) height <- innerheight*(fig[4] - fig[3]) left <- omi[2] + innerwidth*fig[1] bottom <- omi[1] + innerheight*fig[3] # Do a round to avoid rounding error plt <- round(c((cvp$left - left)/width, (cvp$right - left)/width, (cvp$bottom - bottom)/height, (cvp$top - bottom)/height), digits=4) plt } # Return some gpar settings that can be used to set par() graphical # parameters gridPAR <- function() { gpars <- get.gpar() # FIXME: Need to add font specifications too gpars <- list(col=gpars$col, lwd=gpars$lwd, lty=gpars$lty) } gridBase/R/zzz.R0000644000176000001440000000004310110770101013164 0ustar ripleyusers .onLoad <- function(lib, pkg) { } gridBase/vignettes/0000755000176000001440000000000012302520733014027 5ustar ripleyusersgridBase/vignettes/gridBase.Rnw0000644000176000001440000005015011731433714016247 0ustar ripleyusers\documentclass[a4paper]{article} %\VignetteIndexEntry{gridBase} \newcommand{\grid}{{\tt grid}} \newcommand{\gridBase}{{\tt gridBase}} \newcommand{\lattice}{{\tt lattice}} \newcommand{\R}{{\tt R}} \setlength{\parindent}{0in} \setlength{\parskip}{.1in} \newcommand{\aside}[1]{\begin{list}{} {\setlength{\leftmargin}{1in} \setlength{\rightmargin}{1in} \setlength{\itemindent}{0in}} \item {\sc Aside:} {\it #1} \end{list}} \title{Integrating Grid Graphics Output \\ with Base Graphics Output} \author{Paul Murrell} \begin{document} \maketitle @ The \grid{} graphics package\cite{Rnews:Murrell:2002} is much more powerful than the standard \R{} graphics system (hereafter ``base graphics'') when it comes to combining and arranging graphical elements. It is possible to create a greater variety of graphs more easily with \grid{} (see, for example, Deepayan Sarkar's \lattice{} package\cite{Rnews:Sarkar:2002}). However, there are very many plots based on base graphics (e.g., biplots), that have not been implemented in \grid{}, and the task of reimplementing these in \grid{} is extremely daunting. It would be nice to be able to combine the ready-made base plots with the sophisticated arrangement features of grid. This document describes the \gridBase{} package which provides some support for combining grid and base graphics output. \section*{Annotating base graphics using \grid{}} The \gridBase{} package has one function, \verb|baseViewports()|, that supports adding \grid{} output to a base graphics plot. This function creates a set of \grid{} viewports that correspond to the current base plot. This allows simple annotations such as adding lines and text using \grid{}'s units to locate them relative to a wide variety of coordinate systems, or something more complex involving pushing further \grid{} viewports. {\tt baseViewports()} returns a list of three grid viewports. The first corresponds to the base ``inner'' region. This viewport is relative to the entire device; it only makes sense to push this viewport from the ``top level'' (i.e., only when no other viewports have been pushed). The second viewport corresponds to the base ``figure'' region and is relative to the inner region; it only makes sense to push it after the ``inner'' viewport has been pushed. The third viewport corresponds to the base ``plot'' region and is relative to the figure region; it only makes sense to push it after the other two viewports have been pushed in the correct order. A simple application of this facility involves adding text to the margins of a base plot at an arbitrary orientation. The base function \verb|mtext()| allows text to be located in terms of a number of lines away from the plot region, but only at rotations of 0 or 90 degrees. The base \verb|text()| function allows arbitrary rotations, but only locates text relative to the user coordinate system in effect in the plot region (which is inconvenient for locating text in the margins of the plot). By contrast, the \grid{} function \verb|grid.text()| allows arbitrary rotations and can be used in any \grid{} viewport. In the following code we first create a base plot, leaving off the tick labels. <>= library(grid) library(gridBase) <>= midpts <- barplot(1:10, axes=FALSE) axis(2) axis(1, at=midpts, labels=FALSE) @ Next we use \verb|baseViewports()| to create grid viewports that correspond to the base plot and we push those viewports. <>= vps <- baseViewports() pushViewport(vps$inner, vps$figure, vps$plot) @ Finally, we draw rotated labels using \verb|grid.text()| (and pop the viewports to clean up after ourselves). <>= grid.text(c("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"), x=unit(midpts, "native"), y=unit(-1, "lines"), just="right", rot=60) popViewport(3) <>= <> <> <> @ The next example is a bit more complicated because it involves embedding \grid{} viewports within a base graphics plot. The dataset is a snapshot of wind speed, wind direction, and temperature at several weather stations in the South China Sea, south west of Japan\footnote{Obtained from the CODIAC web site: {\tt http://www.joss.ucar.edu/codiac/codiac-www.html}. The file {\tt chinasea.txt} is in the {\tt gridBase/doc} directory.}. \grid{} is used to produce novel plotting symbols for a standard base plot. First of all, we need to define the novel plotting symbol. This consists of a dot at the data location, with a thermometer extending ``below'' and an arrow extending ``above''. The thermometer is used to encode temperature and the arrow is used to indicate wind speed (both scaled to [0, 1]). <>= novelsym <- function(speed, temp, width=unit(3, "mm"), length=unit(0.5, "inches")) { grid.rect(height=length, y=0.5, just="top", width=width, gp=gpar(fill="white")) grid.rect(height=temp*length, y=unit(0.5, "npc") - length, width=width, just="bottom", gp=gpar(fill="grey")) grid.lines(x=0.5, y=unit.c(unit(0.5, "npc"), unit(0.5, "npc") + speed*length), arrow=arrow(length=unit(3, "mm"), type="closed"), gp=gpar(fill="black")) grid.points(unit(0.5, "npc"), unit(0.5, "npc"), size=unit(2, "mm"), pch=16) } @ Now we read in the data and generate a base plot, but plot no points. <>= chinasea <- read.table(system.file("doc", "chinasea.txt", package="gridBase"), header=TRUE) plot(chinasea$lat, chinasea$long, type="n", xlab="latitude", ylab="longitude", main="China Sea Wind Speed/Direction and Temperature") @ Now we use \verb|baseViewports()| to align a \grid{} viewport with the plot region, and draw the symbols by creating a \grid{} viewport per $(x, y)$ location (we rotate the viewport to represent the wind direction). <>= speed <- 0.8*chinasea$speed/14 + 0.2 temp <- chinasea$temp/40 vps <- baseViewports() pushViewport(vps$inner, vps$figure, vps$plot) for (i in 1:25) { pushViewport(viewport(x=unit(chinasea$lat[i], "native"), y=unit(chinasea$long[i], "native"), angle=chinasea$dir[i])) novelsym(speed[i], temp[i]) popViewport() } popViewport(3) <>= <> <> <> @ \section*{Embedding base graphics plots in \grid{} viewports} \gridBase{} provides several functions for adding base graphics output to \grid{} output. There are three functions that allow base plotting regions to be aligned with the current \grid{} viewport; this makes it possible to draw one or more base graphics plots within a \grid{} viewport. The fourth function provides a set of graphical parameter settings so that base {\tt par()} settings can be made to correspond to some of\footnote{Only {\tt lwd}, {\tt lty}, {\tt col} are available yet. More should be available in future versions.} the current \grid{} graphical parameter settings. The first three functions are \verb|gridOMI()|, \verb|gridFIG()|, and \verb|gridPLT()|. They return the appropriate \verb|par()| values for setting the base ``inner'', ``figure'', and ``plot'' regions, respectively. The main usefulness of these functions is to allow you to create a complex layout using \grid{} and then draw a base plot within relevant elements of that layout. The following example uses this idea to create a \lattice{} plot where the panels contain dendrograms drawn using base graphics functions\footnote{Recall that \lattice{} is built on \grid{} so the panel region in a \lattice{} plot is a \grid{} viewport.}. First of all, we create a dendrogram and cut it into four subtrees\footnote{the data and cluster analysis are copied from the example in {\tt help(plot.dendrogram)}.}. <>= data(USArrests) hc <- hclust(dist(USArrests), "ave") dend1 <- as.dendrogram(hc) dend2 <- cut(dend1, h=70) @ Now we create some dummy variables which correspond to the four subtrees. <<>>= x <- 1:4 y <- 1:4 height <- factor(round(unlist(lapply(dend2$lower, attr, "height")))) @ Next we define a \lattice{} panel function to draw the dendrograms. The first thing this panel function does is push a viewport that is smaller than the viewport \lattice{} creates for the panel; the purpose is to ensure there is enough room for the labels on the dendrogram. The \verb|space| variable contains a measure of the length of the longest label. The panel function then calls \verb|gridPLT()| and makes the base plot region correspond to the viewport we have just pushed. Finally, we call the base \verb|plot()| function to draw the dendrogram (and pop the viewport we pushed)\footnote{The {\tt grid.rect()} call is just to show the extent of the extra viewport we pushed.}. <<>>= space <- max(unit(rep(1, 50), "strwidth", as.list(rownames(USArrests)))) dendpanel <- function(x, y, subscripts, ...) { pushViewport(viewport(y=space, width=0.9, height=unit(0.9, "npc") - space, just="bottom")) grid.rect(gp=gpar(col="grey", lwd=5)) par(plt=gridPLT(), new=TRUE, ps=10) plot(dend2$lower[[subscripts]], axes=FALSE) popViewport() } @ Finally, we draw a \lattice{} xyplot, using \lattice{} to set up the arrangement of panels and strips and our panel function to draw a base dendrogram in each panel. <>= library(lattice) plot.new() print(xyplot(y ~ x | height, subscripts=TRUE, xlab="", ylab="", strip=function(...) { strip.default(style=4, ...) }, scales=list(draw=FALSE), panel=dendpanel), newpage=FALSE) @ The \verb|gridPLT()| function is useful for embedding just the plot region of a base graphics function (i.e., without labels and axes; another example of this usage is given in the next section). If labelling and axes are to be included it will make more sense to use \verb|gridFIG()|. The \verb|gridOMI()| function has pretty much the same effect as \verb|gridFIG()| except that it allows for the possibility of embedding multiple base plots at once. In the following code, a \lattice{} plot is placed alongside base diagnostic plots arranged in a 2-by-2 array. We use the data from page 93 of ``An Introduction to Generalized Linear Models'' (Annette Dobson, 1990). <<>>= counts <- c(18,17,15,20,10,20,25,13,12) outcome <- gl(3,1,9) treatment <- gl(3,3) @ We create two regions using \grid{} viewports; the left region is for the \lattice{} plot and the right region is for the diagnostic plots. There is a middle column of 1cm to provide a gap between the two regions. % Save and restore settings so that vignette building will work(?) <>= oldpar <- par(no.readonly=TRUE) <>= pushViewport(viewport(layout=grid.layout(1, 3, widths=unit(rep(1, 3), c("null", "cm", "null"))))) @ We draw a \lattice{} plot in the left region. <>= pushViewport(viewport(layout.pos.col=1)) library(lattice) bwplot <- bwplot(counts ~ outcome | treatment) print(bwplot, newpage=FALSE) popViewport() @ We draw the diagnostic plots in the right region. Here we use \verb|gridOMI()| to set the base inner region and \verb|par(mfrow)| and \verb|par(mfg)| to insert multiple plots\footnote{We use {\tt par(mfrow)} to specify the 2-by-2 array and {\tt par(mfg)} to start at position $(1,1)$ in the array.}. <>= pushViewport(viewport(layout.pos.col=3)) glm.D93 <- glm(counts ~ outcome + treatment, family=poisson()) par(omi=gridOMI(), mfrow=c(2, 2), new=TRUE) par(cex=0.5, mar=c(5, 4, 1, 2)) par(mfg=c(1, 1)) plot(glm.D93, caption="", ask=FALSE) popViewport(2) <>= <> <> <> @ \includegraphics[width=5in]{gridBase-multiplot} % Save and restore settings so that vignette building will work(?) <>= par(oldpar) @ Notice that because there is only ever one current \grid{} viewport, it only makes sense to use one of \verb|gridOMI()|, \verb|gridFIG()|, or \verb|gridPLT()|. In other words, it only makes sense to align either the inner region, or the figure region, or the plot region with the current \grid{} viewport. @ \section*{A more complex example} We will now look at a reasonably complex example involving embedding base graphics within grid viewports which are themselves embedded within a base plot. This example is motivated by the following problem\footnote{This description is from an email to R-help from Adam Langley, 18 July 2003}: \begin{quote} I am looking at a way of plotting a series of pie charts at specified locations on an existing plot. The size of the pie chart would be proportion to the magnitude of the total value of each vector (x) and the values in x are displayed as the areas of pie slices. \end{quote} First of all, we construct some fake data, consisting of four $(x, y)$ values, and four $(z_1, z_2)$ values : <<>>= x <- c(0.88, 1.00, 0.67, 0.34) y <- c(0.87, 0.43, 0.04, 0.94) z <- matrix(runif(4*2), ncol=2) @ Before we start any plotting, we save the current \verb|par()| settings so that at the end we can ``undo'' some of the complicated settings that we need to apply. <<>>= oldpar <- par(no.readonly=TRUE) @ Now we do a standard base plot of the $(x, y)$ values, but do not plot anything at these locations (we're just setting up the user coordinate system). <>= plot(x, y, xlim=c(-0.2, 1.2), ylim=c(-0.2, 1.2), type="n") @ Now we make use of \verb|baseViewports|. This will create a list of grid viewports that correspond to the inner, figure, and plot regions set up by the base plot. By pushing these viewports, we establish a grid viewport that aligns exactly with the plot region created by the base plot, including a (grid) ``native'' coordinate system that matches the (base) user coordinate system\footnote{ The {\tt grid.segments} call is just drawing some dashed lines to show that the pie charts we end up with are centred correctly at the appropriate $(x, y)$ locations.}. <>= vps <- baseViewports() pushViewport(vps$inner, vps$figure, vps$plot) grid.segments(x0=unit(c(rep(0, 4), x), rep(c("npc", "native"), each=4)), x1=unit(c(x, x), rep("native", 8)), y0=unit(c(y, rep(0, 4)), rep(c("native", "npc"), each=4)), y1=unit(c(y, y), rep("native", 8)), gp=gpar(lty="dashed", col="grey")) @ Before we draw the pie charts, we need to perform a couple of calculations to determine their size. In this case, we specify that the largest pie will be 1\verb|"| in diameter and the others will be a proportion of that size based on $\sum_i{z_{.i}} / {\mathrm{max}}\left( \sum_i{z_{.i}} \right)$ <<>>= maxpiesize <- unit(1, "inches") totals <- apply(z, 1, sum) sizemult <- totals/max(totals) @ We now enter a loop to draw a pie at each $(x, y)$ location representing the corresponding $(z_1, z_2)$ values. The first step is to create a grid viewport at the $(x, y)$ location, then we use \verb|gridPLT()| to set the base plot region to correspond to the grid viewport. With that done, we can use the base \verb|pie| function to draw a pie chart within the grid viewport\footnote{We draw a {\tt grid.rect} with a dashed border just to show the extent of each grid viewport. It is crucial that we again call {\tt par(new=TRUE)} so that we do not move on to a new page.}. <>= for (i in 1:4) { pushViewport(viewport(x=unit(x[i], "native"), y=unit(y[i], "native"), width=sizemult[i]*maxpiesize, height=sizemult[i]*maxpiesize)) grid.rect(gp=gpar(col="grey", fill="white", lty="dashed")) par(plt=gridPLT(), new=TRUE) pie(z[i,], radius=1, labels=rep("", 2)) popViewport() } @ Finally, we clean up after ourselves by popping the grid viewports and restoring the initial \verb|par| settings. <>= popViewport(3) par(oldpar) @ The final plot is shown below. <>= <> <> <> <> @ \section*{Problems and limitations} The functions provided by the \gridBase{} package allow the user to mix output from two quite different graphics systems and there are limits to how much the systems can be combined. It is important that users are aware that they are mixing two not wholly compatible systems (which is why these functions are provided in a separate package) and it is of course important to know what the limitations are: \begin{itemize} \item The \gridBase{} functions attempt to match \grid{} graphics settings with base graphics settings (and vice versa). This is only possible under certain conditions. For a start, it is only possible if the device size does not change. If these functions are used to draw into a window, then the window is resized, the base and \grid{} settings will almost certainly no longer match and the graph will become a complete mess. This also applies to copying output between devices of different sizes. \item It is not possible to embed base graphics output within a \grid{} viewport that is rotated. \item There are certain base graphics functions which modify settings like \verb|par(omi)| and \verb|par(fig)| themselves (e.g., \verb|coplot()|). Output from these functions may not embed properly within \grid{} viewports. \item \grid{} output cannot be saved and restored so any attempts to save a mixture of \grid{} and base output are likely to end in disappointment. \end{itemize} \section*{Summary} The functions in the \gridBase{} package provide a simple mechanism for combining base graphics output with \grid{} graphics output for static, fixed-size plots. This is not a full integration of the two graphics systems, but it does provide a useful bridge between the existing large body of base graphics functions and the powerful new features of \grid{}. \subsubsection*{Availability} The \grid{} package is now part of the base distribution of \R{} (from \R{} version 1.8.0). \\ Additional information on \grid{} is available from:\\ {\tt http://www.stat.auckland.ac.nz/~paul/grid/grid.html}. \\ The \gridBase{} package is available from \verb|CRAN| (e.g., {\tt http://cran.us.r-project.org}). \bibliographystyle{plain} \bibliography{gridBase} \end{document} We use the Plant Weight Data from ``An Introduction to Generalized Linear Models'' (Annette Dobson, 1990). <<>>= ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14) trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69) group <- gl(2,10,20, labels=c("Ctl","Trt")) weight <- c(ctl, trt) @ We create two regions using \grid{} viewports; the left region is for the \lattice{} plot and the right region is for the diagnostic plots. There is a middle column of 1cm to provide a gap between the two regions. % Save and restore settings so that vignette building will work(?) <>= oldpar <- par(no.readonly=TRUE) <>= pushViewport(viewport(layout=grid.layout(1, 3, widths=unit(rep(1, 3), c("null", "cm", "null"))))) @ We draw a \lattice{} plot in the left region. <>= pushViewport(viewport(layout.pos.col=1)) library(lattice) bwplot <- bwplot(weight ~ group) print(bwplot, newpage=FALSE) popViewport() @ We draw the diagnostic plots in the right region. Here we use \verb|gridOMI()| to set the base inner region and \verb|par(mfrow)| and \verb|par(mfg)| to insert multiple plots\footnote{We use {\tt par(mfrow)} to specify the 2-by-2 array and {\tt par(mfg)} to start at position $(1,1)$ in the array.}. <>= pushViewport(viewport(layout.pos.col=3)) lm.D9 <- lm(weight ~ group) par(omi=gridOMI(), mfrow=c(2, 2), new=TRUE) par(cex=0.5) par(mfg=c(1, 1)) plot(lm.D9, caption="", ask=FALSE) popViewport(2) gridBase/vignettes/gridBase.bib0000644000176000001440000000112307732415236016236 0ustar ripleyusers@Article{Rnews:Murrell:2002, author = {Paul Murrell}, title = {The grid Graphics Package}, journal = {R News}, year = 2002, volume = 2, number = 2, pages = {14--19}, month = {June}, url = {http://CRAN.R-project.org/doc/Rnews/} } @Article{Rnews:Sarkar:2002, author = {Deepayan Sarkar}, title = {Lattice}, journal = {R News}, year = 2002, volume = 2, number = 2, pages = {19--23}, month = {June}, url = {http://CRAN.R-project.org/doc/Rnews/} } gridBase/MD50000644000176000001440000000153712302562265012343 0ustar ripleyusers6357f2ece12d167c6edfc70a9efe76d7 *DESCRIPTION c23517ab9923f0ec0d87802ff359413a *NAMESPACE 519be1dbab635db1db865c24cc09dfba *R/base.R 921e99fcb1c256cd1f6ad6475d7dc737 *R/grid.R 0433ce02f1d7d8db515c259aabb64f1b *R/zzz.R f4d0a523b792fe11d3d89aa1ed8dc50e *build/vignette.rds 97c6d4a0460b64a8e6ac40a24cddb33c *demo/00Index b0f31e33f859785fb0058f30dd3bcbb6 *demo/gridBase.R bc3aecdea068b8689e959dc5464b2ecb *inst/doc/changes.txt 444f2b1f2d8472ae45c05d9f86321e46 *inst/doc/chinasea.txt 04bf5e05f35567c9233a8874af544daf *inst/doc/gridBase.R 7d84d0cdabfa9877c817064d35ca47b6 *inst/doc/gridBase.Rnw df58ed5b9c51efa05f0de0f6ad12a429 *inst/doc/gridBase.pdf 1cb988e34f020de26f286dc9684e2ebc *man/baseViewports.Rd dd062f90a9221e7f2a1241cb9fbbddc1 *man/gridOMI.Rd 7d84d0cdabfa9877c817064d35ca47b6 *vignettes/gridBase.Rnw 6506cce9c6756dc2b0e4f061542f2404 *vignettes/gridBase.bib gridBase/build/0000755000176000001440000000000012302520733013116 5ustar ripleyusersgridBase/build/vignette.rds0000644000176000001440000000027712302520733015463 0ustar ripleyusersb```b`f@&0`b fd`aDgridBase/DESCRIPTION0000644000176000001440000000062112302562265013532 0ustar ripleyusersPackage: gridBase Title: Integration of base and grid graphics Version: 0.4-7 Author: Paul Murrell Depends: R (>= 2.3.0) Imports: graphics, grid Suggests: lattice Description: Integration of base and grid graphics Maintainer: Paul Murrell License: GPL Packaged: 2014-02-24 01:35:23 UTC; EC\pmur002 NeedsCompilation: no Repository: CRAN Date/Publication: 2014-02-24 07:20:37 gridBase/man/0000755000176000001440000000000012302520733012572 5ustar ripleyusersgridBase/man/gridOMI.Rd0000644000176000001440000000531612302520373014360 0ustar ripleyusers\name{Set Base Plot Regions} \alias{gridOMI} \alias{gridFIG} \alias{gridPLT} \alias{gridPAR} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Set Base Plotting Regions from Grid Viewport } \description{ These functions can be used to align base plotting regions with the current grid viewport. This can be used to draw base plots within a grid viewport. } \usage{ gridOMI() gridFIG() gridPLT() gridPAR() } \details{ For this to be useful, you will have to make liberal use of \code{par(new=TRUE)} to prevent base from moving to a new page. With care, these can even be used to draw multiple base plots within a grid viewport (see the examples below), but in general, base plotting functions that draw multiple panels (e.g., \code{coplot}) should not be expected to work. } %- maybe also 'usage' for other objects documented here. \value{ \code{gridOMI} returns a value that can be used to set the \code{par(omi)} parameter. \code{gridFIG} returns a value that can be used to set the \code{par(fig)} parameter. \code{gridPLT} returns a value that can be used to set the \code{par(plt)} parameter. \code{gridPAR} returns a value that can be used to set some graphical parameters (currently, \code{lwd}, \code{lty}, and \code{col}). } \author{ Paul Murrell } \section{Warning}{ If you resize the device, all bets are off! } \seealso{ \link{Grid}, \code{\link{viewport}} } \examples{ library(grid) opar <- par(no.readonly=TRUE) # gridFIG grid.newpage() pushViewport(viewport(width=0.5, height=0.5)) grid.rect(gp=gpar(col="grey", lty="dashed")) par(fig=gridFIG()) par(new=TRUE) plot(1:10) # multiple plots # NOTE the use of par(mfg) # gridOMI par(opar) grid.newpage() pushViewport(viewport(width=0.5, height=0.5)) grid.rect(gp=gpar(col="grey", lty="dashed")) par(omi=gridOMI()) par(mfrow=c(2, 2), mfg=c(1, 1), mar=c(3, 3, 1, 0)) for (i in 1:4) { plot(i) } # gridPLT par(opar) grid.newpage() pushViewport(viewport(width=0.5, height=0.5)) grid.rect(gp=gpar(col="grey", lwd=5)) par(plt=gridPLT()) par(new=TRUE) plot(1:10) # gridFIG with par(omi) set par(opar) grid.newpage() par(omi=rep(1, 4)) pushViewport(viewport(width=0.5, height=0.5)) grid.rect(gp=gpar(col="grey", lwd=5)) par(fig=gridFIG()) par(new=TRUE) plot(1:10) # gridPLT with par(omi) set par(opar) grid.newpage() par(omi=rep(1, 4)) pushViewport(viewport(width=0.5, height=0.5)) grid.rect(gp=gpar(col="grey", lwd=5)) par(plt=gridPLT()) par(new=TRUE) plot(1:10) # gridPAR par(opar) grid.newpage() pushViewport(viewport(width=0.5, height=0.5, gp=gpar(col="red", lwd=3, lty="dotted"))) grid.rect(gp=gpar(col="grey", lwd=5)) par(fig=gridFIG()) par(gridPAR()) par(new=TRUE) plot(1:10, type="b") } \keyword{ dplot }% at least one, from doc/KEYWORDS gridBase/man/baseViewports.Rd0000644000176000001440000000265312302520015015715 0ustar ripleyusers\name{baseViewports} \alias{baseViewports} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Generate grid Viewports from Base Plot } \description{ This will generate a list of grid viewports which correspond to the current inner, figure, and plot regions of the current base plot. } \usage{ baseViewports() } \details{ The figure region is relative to the inner region so you must push the inner region before pushing the figure region. Similarly, the plot region is relative to the figure region so this should only be pushed after the previous two. } %- maybe also 'usage' for other objects documented here. \value{ A list with three elements: \item{inner }{A viewport corresponding to the inner region of the current plot.} \item{figure }{A viewport corresponding to the figure region of the current plot.} \item{plot }{A viewport corresponding to the plot region of the current plot.} } \author{ Paul Murrell } \section{Warning}{ If you resize the device, all bets are off! } \seealso{ \link{Grid}, \code{\link{viewport}} } \examples{ library(grid) par(oma=rep(1, 4), mfrow=c(1, 2), xpd=NA) plot(1:10) vps <- baseViewports() pushViewport(vps$inner) grid.rect(gp=gpar(lwd=3, col="red")) pushViewport(vps$figure) grid.rect(gp=gpar(lwd=3, col="green")) pushViewport(vps$plot) grid.rect(gp=gpar(lwd=3, col="blue")) grid.points(1:10, 10:1) } \keyword{ dplot }% at least one, from doc/KEYWORDS