cgdsr/0000755000176200001440000000000013504655776011376 5ustar liggesuserscgdsr/inst/0000755000176200001440000000000013504476607012345 5ustar liggesuserscgdsr/inst/tests/0000755000176200001440000000000013470574043013502 5ustar liggesuserscgdsr/inst/tests/test_cgdsr.R0000755000176200001440000000553013470574043015774 0ustar liggesuserscontext("GGDSR Tests") test_that("getCancerStudies", { mycgds <- CGDS("http://www.cbioportal.org/") cancerstudies <- getCancerStudies(mycgds) expect_identical(colnames(cancerstudies), c("cancer_study_id","name","description")) }) test_that("getCaseLists", { mycgds <- CGDS("http://www.cbioportal.org/") cancerstudies <- getCancerStudies(mycgds) ct <- cancerstudies[2,1] # should be row 1 instead ... expect_identical(colnames(getCaseLists(mycgds,ct)), c("case_list_id","case_list_name", "case_list_description","cancer_study_id","case_ids")) expect_identical(colnames(getCaseLists(mycgds,'xxx')), 'Error..Problem.when.identifying.a.cancer.study.for.the.request.') }) test_that("getGeneticProfiles", { mycgds <- CGDS("http://www.cbioportal.org/") cancerstudies <- getCancerStudies(mycgds) ct <- cancerstudies[2,1] # should be row 1 instead ... expect_identical(colnames(getGeneticProfiles(mycgds,ct)), c("genetic_profile_id","genetic_profile_name","genetic_profile_description", "cancer_study_id","genetic_alteration_type","show_profile_in_analysis_tab")) expect_identical(colnames(getGeneticProfiles(mycgds,'xxx')), 'Error..Problem.when.identifying.a.cancer.study.for.the.request.') }) test_that("getMutationData", { mycgds <- CGDS("http://www.cbioportal.org/") # AURKB has not mutation data expect_equal(nrow(getMutationData(mycgds,'lusc_tcga_pub_sequenced','lusc_tcga_pub_mutations','AURKB')), 0) }) test_that("getClinicalData", { mycgds <- CGDS("http://www.cbioportal.org/") expect_true("DFS_MONTHS" %in% colnames(getClinicalData(mycgds,'gbm_tcga_all'))) }) test_that("getProfileData", { mycgds <- CGDS("http://www.cbioportal.org/") # check one gene, one profile expect_identical(colnames(getProfileData(mycgds,'NF1','gbm_tcga_mrna','gbm_tcga_all')), "NF1") # check many genes, one profile expect_identical(colnames(getProfileData(mycgds,c('MDM2','MDM4'),'gbm_tcga_mrna','gbm_tcga_all')), c("MDM2","MDM4")) # check one gene, many profile expect_identical(colnames(getProfileData(mycgds,'NF1',c('gbm_tcga_mrna','gbm_tcga_mutations'),'gbm_tcga_all')), c('gbm_tcga_mrna','gbm_tcga_mutations')) # check 3 cases returns matrix with 3 columns expect_identical(rownames(getProfileData(mycgds,'BRCA1','gbm_tcga_mrna',cases=c('TCGA-02-0001-01','TCGA-02-0003-01'))), make.names(c('TCGA-02-0001-01','TCGA-02-0003-01'))) # invalid gene names return empty data.frame expect_identical(nrow(getProfileData(mycgds,c('NF10','NF11'),'gbm_tcga_mrna','gbm_tcga_all')),as.integer(0)) # invalid case_list_id returns error expect_identical(colnames(getProfileData(mycgds,'NF1','gbm_tcga_mrna','xxx')), 'Error..Invalid.case_set_id...xxx.') })cgdsr/inst/doc/0000755000176200001440000000000013504476607013112 5ustar liggesuserscgdsr/inst/doc/cgdsr.Rnw0000755000176200001440000002573213504476440014713 0ustar liggesusers\documentclass[a4paper]{article} %\VignetteIndexEntry{Introduction to the CGDS R library} %\VignettePackage{cgdsr} % Definitions \usepackage{url} \title{The CGDS-R library} \author{Anders Jacobsen and Augustin Luna} \begin{document} \SweaveOpts{concordance=TRUE} \maketitle \tableofcontents \section{Introduction} This package provides a basic set of R functions for querying the Cancer Genomic Data Server (CGDS) hosted by the Computational Biology Center (cBio) at the Memorial Sloan-Kettering Cancer Center (MSKCC). This service is a part of the cBio Cancer Genomics Portal, \url{http://www.cbioportal.org/}. In summary, the library can issue the following types of queries: \begin{itemize} \item{ \texttt{getCancerStudies()} : What cancer studies are hosted on the server? For example, TCGA glioblastoma or TCGA ovarian cancer. } \item{ \texttt{getGeneticProfiles()} : What genetic profile types are available for cancer study X? For example, mRNA expression or copy number alterations. } \item{ \texttt{getCaseLists()} : what case sets are available for cancer study X? For example, all samples or only samples corresponding to a given cancer subtype. } \item{ \texttt{getProfileData()}: Retrieve slices of genomic data. For example, a client can retrieve all mutation data for PTEN and EGFR in TCGA glioblastoma. } \item{ \texttt{getClinicalData()}: Retrieve clinical data (e.g. patient survival time and age) for a given cancer study and list of cases. } \end{itemize} Each of these functions will be briefly described in the following sections. The last part of this document includes some concrete examples of how to access and plot the data. The purpose of this document is to give the reader a quick overview of the \texttt{cgdsr} package. Please refer to the corresponding R manual pages for a more detailed explanation of arguments and output for each function. \section{The CGDS R interface} \subsection{\texttt{CGDS()} : Create a CGDS connection object} Initially, we will establish a connection to the public CGDS server hosted by Memorial Sloan-Kettering Cancer Center. The function for creating a CGDS connection object requires the URL of the CGDS server service, in this case \url{http://www.cbioportal.org/}, as an argument. <<>>= library(cgdsr) # Create CGDS object mycgds = CGDS("http://www.cbioportal.org/") @ The variable \texttt{mycgds} is now a CGDS connection object pointing at the URL for the public CGDS server. This connection object must be included as an argument to all subsequent interface calls. Optionally, we can now perform a set of simple tests of the data returned from the CGDS connection object using the \texttt{test} function: <<>>= # Test the CGDS endpoint URL using a few simple API tests test(mycgds) @ Note that the tests may not work if you are connecting to a portal other than the one in the above example. The tests can fail if the portal instance does not contain the data that is being tested against, or if you do have have authorization to access the data that is being tested against. A verbose option can be set for the CGDS connection object. This will cause function calls that retrieve data from cBioPortal to additionally display the programming interface URL to be displayed. This is useful for debugging and troubleshooting issues with the package. <<>>= # Set verbose flag setVerbose(mycgds, TRUE) @ [Optional] A data access token can be optionally attached to a CGDS connection object when it is created. This allows you to connect to cBioPortal instances that require authentication. Data access tokens (when this feature is enabled) can be created through the cbioportal website. If you attempt to access data that you are not authorized to access you will get an \texttt{Unauthorized (HTTP 401)} error. Note the public portal at http://www.cbioportal.org/ does not require authentication so you do not need a token to connect to it. <<>>= # Connect to a portal instance that requires authetication mysecurecgds = CGDS("https://cbioportal.mskcc.org/", token="fd0522cb-7972-40d0-9d83-cb4c14e8a337") @ \subsection{\texttt{getCancerStudies()} : Retrieve a set of available cancer studies} Having created a CGDS connection object, we can now retrieve a data frame with available cancer studies using the \texttt{getCancerStudies} function: <<>>= # Get list of cancer studies at server getCancerStudies(mycgds)[,c(1,2)] @ Here we are only showing the first two columns, the cancer study ID and short name, of the result data frame. There is also a third column, a longer description of the cancer study. The cancer study ID must be used in subsequent interface calls to retrieve case lists and genetic data profiles (see below). \subsection{\texttt{getGeneticProfiles()} : Retrieve genetic data profiles for a specific cancer study} This function queries the CGDS API and returns the available genetic profiles, e.g. mutation or copy number profiles, stored about a specific cancer study. Below we list the current genetic profiles for the TCGA glioblastoma cancer study: <<>>= getGeneticProfiles(mycgds,'gbm_tcga')[,c(1:2)] @ Here we are only listing the first two columns, genetic profile ID and short name, of the resulting data frame. Please refer to the R manual pages for a more extended specification of the arguments and output. \subsection{\texttt{getCaseLists()} : Retrieve case lists for a specific cancer study} This function queries the CGDS API and returns available case lists for a specific cancer study. For example, within a particular study, only some cases may have sequence data, and another subset of cases may have been sequenced and treated with a specific therapeutic protocol. Multiple case lists may be associated with each cancer study, and this method enables you to retrieve meta-data regarding all of these case lists. Below we list the current case lists for the TCGA glioblastoma cancer study: <<>>= getCaseLists(mycgds,'gbm_tcga')[,c(1:2)] @ Here we are only listing the first two columns, case list ID and short name, of the resulting data frame. Please refer to the R manual pages for a more extended specification of the arguments and output. \subsection{\texttt{getProfileData()} : Retrieve genomic profile data for genes and genetic profiles} The function queries the CGDS API and returns data based on gene(s), genetic profile(s), and a case list. The function only allows specifying a list of genes and a single genetic profile, or oppositely a single gene and a list of genetic profiles. Importantly, the format of the output data frame depends on if a single or a list of genes was specified in the arguments. Below we are retrieving mRNA expression and copy number alteration genetic profiles for the NF1 gene in all samples of the TCGA glioblastoma cancer study: <<>>= getProfileData(mycgds, "NF1", c("gbm_tcga_gistic","gbm_tcga_mrna"), "gbm_tcga_all")[c(1:5),] @ We are here only showing the first five rows of the data frame. Entries with NaN indicate missing values. In the next example, we are retrieving mRNA expression data for the MDM2 and MDM4 genes: <<>>= getProfileData(mycgds, c("MDM2","MDM4"), "gbm_tcga_mrna", "gbm_tcga_all")[c(25:30),] @ We are again only showing the first five rows of the data frame. \subsection{\texttt{getClinicalData()} : Retrieve clinical data for a list of cases} The function queries the CGDS API and returns available clinical data (e.g. patient survival time and age) for a given case list. Results are returned in a data frame with a row for each case and a column for each clinical attribute. The available clinical attributes are: \begin{itemize} \item{ \texttt{overall\_survival\_months}: Overall survival, in months. } \item{ \texttt{overall\_survival\_status}: Overall survival status, usually indicated as "LIVING" or "DECEASED". } \item{ \texttt{disease\_free\_survival\_months}: Disease free survival, in months. } \item{ \texttt{disease\_free\_survival\_status}: Disease free survival status, usually indicated as "DiseaseFree" or "Recurred/Progressed". } \item{ \texttt{age\_at\_diagnosis}: Age at diagnosis. } \end{itemize} Below we retrieve clinical data for the TCGA ovarian cancer dataset (only first five cases/rows are shown): <<>>= getClinicalData(mycgds, "ova_all")[c(1:5),] @ \section{Examples} \subsection{Example 1: Association of NF1 copy number alteration and mRNA expression in glioblastoma} As a simple example, we will generate a plot of the association between copy number alteration (CNA) status and mRNA expression change for the NF1 tumor suprpressor gene in glioblastoma. This plot is very similar to Figure 2b in the TCGA research network paper on glioblastoma (McLendon et al. 2008). The mRNA expression of NF1 has been median adjusted on the gene level (by globally subtracting the median expression level of NF1 across all samples). \begin{center} <>= df = getProfileData(mycgds, "NF1", c("gbm_tcga_gistic","gbm_tcga_mrna"), "gbm_tcga_all") head(df) boxplot(df[,2] ~ df[,1], main="NF1 : CNA status vs mRNA expression", xlab="CNA status", ylab="mRNA expression", outpch = NA) stripchart(df[,2] ~ df[,1], vertical=T, add=T, method="jitter",pch=1,col='red') @ \end{center} Alternatively, the generic \texttt{cgdsr} \texttt{plot()} function can be used to generate a similar plot: \begin{center} <>= plot(mycgds, "gbm_tcga", "NF1", c("gbm_tcga_gistic","gbm_tcga_mrna"), "gbm_tcga_all", skin = 'disc_cont') @ \end{center} \subsection{Example 2: MDM2 and MDM4 mRNA expression levels in glioblastoma} In this example, we evaluate the relationship of MDM2 and MDM4 expression levels in glioblastoma. mRNA expression levels of MDM2 and MDM4 have been median adjusted on the gene level (by globally subtracting the median expression level of the individual gene across all samples). Samples with "NaN" do not have measurements. \begin{center} <>= df = getProfileData(mycgds, c("MDM2","MDM4"), "gbm_tcga_mrna", "gbm_tcga_all") head(df) plot(df, main="MDM2 and MDM4 mRNA expression", xlab="MDM2 mRNA expression", ylab="MDM4 mRNA expression") @ \end{center} Alternatively, the generic \texttt{cgdsr} \texttt{plot()} function can be used to generate a similar plot: \begin{center} <>= plot(mycgds, "gbm_tcga", c("MDM2","MDM4"), "gbm_tcga_mrna" ,"gbm_tcga_all") @ \end{center} \subsection{Example 3: Comparing expression of PTEN in primary and metastatic prostate cancer tumors} In this example we plot the mRNA expression levels of PTEN in primary and metastatic prostate cancer tumors. \begin{center} <>= df.pri = getProfileData(mycgds, "PTEN", "prad_mskcc_mrna_median_Zscores", "prad_mskcc_primary") head(df.pri) df.met = getProfileData(mycgds, "PTEN", "prad_mskcc_mrna_median_Zscores", "prad_mskcc_mets") head(df.met) boxplot(list(t(df.pri),t(df.met)), main="PTEN expression in primary and metastatic tumors", xlab="Tumor type", ylab="PTEN mRNA expression",names=c('primary','metastatic'), outpch = NA) stripchart(list(t(df.pri),t(df.met)), vertical=T, add=T, method="jitter",pch=1,col='red') @ \end{center} \end{document} cgdsr/inst/doc/cgdsr.R0000644000176200001440000001010113504476607014330 0ustar liggesusers### R code from vignette source 'cgdsr.Rnw' ################################################### ### code chunk number 1: cgdsr.Rnw:71-74 ################################################### library(cgdsr) # Create CGDS object mycgds = CGDS("http://www.cbioportal.org/") ################################################### ### code chunk number 2: cgdsr.Rnw:83-85 ################################################### # Test the CGDS endpoint URL using a few simple API tests test(mycgds) ################################################### ### code chunk number 3: cgdsr.Rnw:98-100 ################################################### # Set verbose flag setVerbose(mycgds, TRUE) ################################################### ### code chunk number 4: cgdsr.Rnw:111-114 ################################################### # Connect to a portal instance that requires authetication mysecurecgds = CGDS("https://cbioportal.mskcc.org/", token="fd0522cb-7972-40d0-9d83-cb4c14e8a337") ################################################### ### code chunk number 5: cgdsr.Rnw:122-124 ################################################### # Get list of cancer studies at server getCancerStudies(mycgds)[,c(1,2)] ################################################### ### code chunk number 6: cgdsr.Rnw:139-140 ################################################### getGeneticProfiles(mycgds,'gbm_tcga')[,c(1:2)] ################################################### ### code chunk number 7: cgdsr.Rnw:158-159 ################################################### getCaseLists(mycgds,'gbm_tcga')[,c(1:2)] ################################################### ### code chunk number 8: cgdsr.Rnw:176-177 ################################################### getProfileData(mycgds, "NF1", c("gbm_tcga_gistic","gbm_tcga_mrna"), "gbm_tcga_all")[c(1:5),] ################################################### ### code chunk number 9: cgdsr.Rnw:182-183 ################################################### getProfileData(mycgds, c("MDM2","MDM4"), "gbm_tcga_mrna", "gbm_tcga_all")[c(25:30),] ################################################### ### code chunk number 10: cgdsr.Rnw:216-217 ################################################### getClinicalData(mycgds, "ova_all")[c(1:5),] ################################################### ### code chunk number 11: NF1plot1 ################################################### df = getProfileData(mycgds, "NF1", c("gbm_tcga_gistic","gbm_tcga_mrna"), "gbm_tcga_all") head(df) boxplot(df[,2] ~ df[,1], main="NF1 : CNA status vs mRNA expression", xlab="CNA status", ylab="mRNA expression", outpch = NA) stripchart(df[,2] ~ df[,1], vertical=T, add=T, method="jitter",pch=1,col='red') ################################################### ### code chunk number 12: NF1plot2 ################################################### plot(mycgds, "gbm_tcga", "NF1", c("gbm_tcga_gistic","gbm_tcga_mrna"), "gbm_tcga_all", skin = 'disc_cont') ################################################### ### code chunk number 13: MDM2plot1 ################################################### df = getProfileData(mycgds, c("MDM2","MDM4"), "gbm_tcga_mrna", "gbm_tcga_all") head(df) plot(df, main="MDM2 and MDM4 mRNA expression", xlab="MDM2 mRNA expression", ylab="MDM4 mRNA expression") ################################################### ### code chunk number 14: MDMplot2 ################################################### plot(mycgds, "gbm_tcga", c("MDM2","MDM4"), "gbm_tcga_mrna" ,"gbm_tcga_all") ################################################### ### code chunk number 15: PTENplot ################################################### df.pri = getProfileData(mycgds, "PTEN", "prad_mskcc_mrna_median_Zscores", "prad_mskcc_primary") head(df.pri) df.met = getProfileData(mycgds, "PTEN", "prad_mskcc_mrna_median_Zscores", "prad_mskcc_mets") head(df.met) boxplot(list(t(df.pri),t(df.met)), main="PTEN expression in primary and metastatic tumors", xlab="Tumor type", ylab="PTEN mRNA expression",names=c('primary','metastatic'), outpch = NA) stripchart(list(t(df.pri),t(df.met)), vertical=T, add=T, method="jitter",pch=1,col='red') cgdsr/inst/doc/cgdsr.pdf0000644000176200001440000062212213504476607014714 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Length 378 >> stream concordance:cgdsr.tex:cgdsr.Rnw:1 12 1 1 0 57 1 1 2 1 0 1 2 4 0 1 2 6 1 1 3 19 0 1 2 10 1 1 3 8 0 1 2 8 1 1 4 6 0 1 2 5 1 1 3 516 0 1 2 12 1 1 2 35 0 1 2 15 1 1 2 20 0 1 2 14 1 1 2 13 0 1 2 2 1 1 2 14 0 1 2 30 1 1 2 8 0 1 2 12 1 1 2 6 0 1 1 11 0 2 1 4 0 1 2 5 1 1 2 10 0 1 2 9 1 1 2 6 0 1 1 11 0 1 1 4 0 1 2 5 1 1 2 10 0 1 2 8 1 1 2 6 0 1 1 11 0 1 1 5 0 1 1 11 0 2 1 4 0 1 2 2 1 endstream endobj 4 0 obj << /Length 2077 /Filter /FlateDecode >> stream xXYo8~ ԪxRNHQv>Ȏxױ6~"%jd>Hp<=zؑbR;q⊑s6ֹFD.$I4=;+hٖ:{*FJEj<*m < ͜6@OWܴ^#E-,jiLNG^kE4B\(&6_{L3l'7bHXQYGqD1,QO |9TN9o4I8M0wbzdl ;3mEtz _y=/1-:>QԹ4d$YR7hy t@ io:}+A\ߋJ\\d=;M$("#NhYylŠD+/٧DV$CI-3&Ϣ BTM;bE[QW%]e[C)VfJ, bؒ}6VN\l^G j*:,py| !#ႾoAзȹ\QFe^ 9 vƒU-,0ް\`wtJlVq $-ḵ>:. /Be=!K5L&HsiJaUBwDD/'u@k9Aw|6/ag83K 8K. $i(\@1{ 7˹,]no #5V瞓EU!;ZhM·RG ?_%VrF+4p[dZJ ,_ɁtQ@Ɯw/+0f_ /eR0BۅMl[ß?m*k?n؅BG/fh endstream endobj 16 0 obj << /Length 2147 /Filter /FlateDecode >> stream xYKs6Wh 5S bfԍ3m&(d%RR%:grK.f.xTEgbd"m>ʣ,4q1G&5"MQx2aam8xp<@)w˜AVU,|CZVhu\RL۬kU Y!MK`[baLiga[V90S#+B.撛5&WܖKq5]4¨$%!$j5ť+"_?ʄ[]O:*wc`dV@qnckV0q3#RT<=<` NK1h`Cfh<\7r g$Aw IsU1 /QqNuyC ™qiϛ_ݚ0G0Ȟc$МѦf 5`a`]ZT*(S!EyN>aڰQNKHIi\7ZiK͹Q~&aLdRqp'cϭ_D \GYhp ^( % >\$h;LtG$U,4`x WנlZ;CH\{E B%̢p\RCi B ww ڃεH?u[Kqs Z_[-$aL?9_D ]lku[]LŸ HP T:<4] ;:Qu&0aʇ~cLCZ`aƆ,.L_+pf!B|W%\70O6NNz]x2L+9ew}?.4|c_Z/JsWC=V+KbH!FtV EA# -Vh/e?O]5K<@nr!Cd {()Y o-@'O7rhǚٚw}Iiy`]bu/T~WT5"{`s`^[Qu"Aj+nBVo\AjiG6?$%]=;@2>L(?UNjZŹ۱9)V>)zCY&YJp0ѿX endstream endobj 21 0 obj << /Length 2086 /Filter /FlateDecode >> stream xڵX[F~WDTx㻍DB ZK_(Z:8 |cv0̜366~zy6Ƚ< lMA:I5`syhc9Bb2UT3WNvmځLoGA6ai?3T"d0}/c9ӂx"Ra(JRu dF.j5Q 1 QavU[暂'‡EˣϣqPQWǰjj;R.62y -c^1Y /@+븣lrwܵ x` ) F~upȆ*yS}4p f]C1ة"(qڪBů>j|jI91FK*:\Mx qO^z2_h拑WiF\8vYõyi&KQ*5QX'!< M|xj~Ĥ""ePM´ay-J|B2XP;Ж_ML0aT.z(ޱ)h!q٢JK"Q'r0+m_Bi*H]a]E|lL||I ڽް$6j2o3jahlVQjU :UMJHk);==aIU:>tH;]eA{$!D(niM^Fj.JRx%KW#N284Ii?=S7ͷ[P4HjCmxl  \ۀj=uB)M8$V}w; 6!I5GÍKvZN8YFؽg9FqF<5uqG])y8 -@`aKI{V` čVe7,eng"GjnmG+oPڦÈ&q*w'gP5iV1F{6{سc:b҉01/gN6^]`8v/SX/.b8?knPG ~ڇU<'O UDc} iyD3$Z˼JGzrVk"lAYW[9!tABe}ǰϼ0K|r[d0 ޑkK@qxciQ}Bw.efAc( ӧnXi:/^Zπoֽ-QA/.[J%:|0N Z_} @8ûg8. 7کr֢K:T?a'-^?Rc_qܕ=X_o/Mz݅~+(pi> F,bƾd5g#4)I$4/ >8v({}Tou5R`y>Km5:wb`yWQK˺rzHWUԊ($=sąаh_#VLb"(aꪾ }rYFIg)ǔs)[Qpsڝb_S$stϮIIL1#z?qs; endstream endobj 24 0 obj << /Length 842 /Filter /FlateDecode >> stream xXK0WpLdZ{9s%Dj} jQ f,&/%z%b*I9:YlS2#|Nx>-Ҍ\(f?ߒ,I k!>V+O,2Ō5+bVp{jFfFX>Jj'fLf6-݃l͟`ڳ`ڈP, hq ggw y=,eR^ <+@t̀Q)!fҙߘ)ҩDzChѦʿnVM03ZYNQl}5-|w_:2]ՀI"$mQ9tWK~KST@UuHd<-Qt ʴT\qx].ղ̒m Q?3^PRխe:ŀj` S /e;$nֆYgaC/G+nE+a Ū.VIk&nJ\b%z4J#FR9&nrX7tW^*wp!P}ξJ= v#nd5R fwdknC1~Fщj VЫ9;ۑܻs\aԻ&٣&~opm<@Cg!UF4Y<~up,ny ʷݥked%fK6׺o3}x!"n[]M S-_wF c.m۠&xQD(Y$F.QX$˫3)Ru83ou1%w6 endstream endobj 27 0 obj << /Length 812 /Filter /FlateDecode >> stream xŘn0y "clHŬF 4Jc19el..,a'|nɷQO>{$|^p|MQ,jRW#Q7!.n_071dV> stream xXMs0WpvtLsٷN01v?}XkN;` <={x"1 JO Bx?s+ eׁ .W}7L}FH ͙H(,(չX*=@(4\hNAEQƛk3듧De@DZ>kF6^&4ˍa ¨Dh s6v128sB%VR""B&t+߬Q$VOZhqV. YO06Hb&nvA!`v[`bv$l2#wDkaM{@LܡB7x!nޔAD6Z?fJdR5鄗Ήo1cL2k~ 5BHo &wi' zokq u)x$_X =No;]$dᇊ/^Js'ѪMHSnl" i<*AZzV@ ڢtyM \v vî蝳خ@+c=Q5H5)`df, &VJx -iuIP}<> stream xXMs0Wp $i=tخ`gRW.^Ճ ۯ_W*Ĥ2i1FӻeᆎcS}u70ƣs{Za~(bb:5b$y6hdF05ܗ ׻ 琍xDQ#nM%"0 5=| /7`G7s5$FhHio.H7ryv/= 3paHs&:]ʼn6ʶq}yQqRс!c`p8I9"\؇Fhodp_W?R+MKE2=ct`2?Ӊ"P-9^M a$x.1(Nr-TT`  dN7lxB X)8iΒ u9鴡 R| Qӂ2DBGo9J3H'̀$-G89dxO#!_0>LQBsss i?Q> TM~7Tuƙ=4׍~7^w"r,D}Q <pBw\6fk\H, 2`zyG ـ1)Ά8 rr74'=\c!*œU`mO9{MΊf*[Ԋe :F d:'@&vpAy|rHdsĄ0I bG#a 8s 7"I SV$A9C|Jq( >ò|:=JMۥmӤH57ΆW׆VIV(vb[: gP9d endstream endobj 37 0 obj << /Length 1118 /Filter /FlateDecode >> stream xYn8++"E.3n6hbYUS;Nj;_?x)_-tAX?g.9TO *д'e8ء]!zdݘPJߌw?:J⼊$5"=6!Ս%^Pz#9',^H6bFR֨y#_{ 0cDfYC(kRnǜfYyl52HĂ@T<pL`}`Sfd$ uiB)V[PAߣp/azM'J`%L%Ex,h&4ShT pEѱ1i[ۑd> r`6ӌt@ Ps#7@E!OZ"ȉú X$?1[2x9hCDކ͏"wiQ=ɘp*dIO)_V3V]"(BA-8*@UNSKtp0OtZ"bcxDL5[jTIVl2rXkӖ^FV&>Ƀ;Dq dA~6C+[NM墶l*rQu~Eݞxdm,bS񼰯W~ƌ8G-<ЯԒUuj[ET\F*|J1յo[?*ҁ_0ESѝ|w$}XhB+ >,@DdL7qy!O2^8mݲ}41SzW,GcXoK =6f(XfISK[ƴ uZwEy)ssOGXEƟ]I>yU},`})匼u\S+t&IT>Qp of DJaAKMƷlZyq^L-Ȥ+QSI@}@={{bɩǾi|eu%K8?+tݫK="T TyghxU endstream endobj 40 0 obj << /Length 1442 /Filter /FlateDecode >> stream xZAs6Wp$3X%[#LҼ4Bf:BH!I_ZYkal؆,˒ókx3-q[:9 Eu8Wa"T(+QQ]yO݊^ͫ(J=Ff9OEy7QzP~U-w8@jW/{xrZmB:Rz{ֲ Ɠ_^o\ķ Exm||Ve/Xc>BG|mߪXk9BήHhH myme ,2AR z8Lcė@JO>N6G, PhgS5DmiHz ΅6  +8ҫ !Zm˨ Q-`Nq̑/PffWN,CN]8~I[ʛ ,O;& g%Q<^_nF+p ulFuD6}i2#rZ ‹Y(Q Sg@@?Zid$כ~ )9E~Δ%͢Z|kXK1B\ξz;_T0\WPIQ`3 (tx98=,s_Dp=va 35O=D=1, O0dީ{Μ6 p>B/ wZO! hJ+8g$+5?,JaW'~%5^ePidoIc' '9S8,`A)a3d E5;,bJ9ahqtENY7;@:iCvP塗~e^cws$ 98Q$BXr$}iр7 \EsHJR#y{ @|C9U|[%w}xjv hMBG8F<'nLzȃ}bH/ 7BD/h6kptuty(N/8r|*hY'8K|O`mf>eK'|EB/j@͒d`bdVrKW LҙafEr)0A8uZs^5U'FEyu- 藔sJJ_SIC!!^4O3cAyhPNs .A\ ]aJ"9l{auk cT,쓠; o5 ֗zJ <ռJg/Ncc)S[#M7t kw>y`h9/w)`9#M|)(S *&'"uA8q5mbez T--lA!9xcvy' C%@.۝gc endstream endobj 43 0 obj << /Length 1464 /Filter /FlateDecode >> stream xZKs8WpXe[yLީvqnGZV'3=Kȼd\O^օ.@Nj1-ķ 'qX؋5#<ա"^UOՈ،?k7^ܧM-*"9h&ɖȿF {c-$xA8UGHSaP' 2MmVUb_8OsQY;#؋#e0u1R+ubdx) 2 2 쿠.Ĭr젴ٜ&qm@{Y'R# X,j# /?dƊ0r⿙+( pde>1a€HK3 %#_LU!jd$G~0O9_8hs\5Nތ+= gHE?.|dhۼ>(ÒλG.N endstream endobj 46 0 obj << /Length 1590 /Filter /FlateDecode >> stream xZIw8Wp bٖc,L 69wkߏ,,6\WJ\Ooq[;[Dw;YS%|u>9ollՍopƄ-k6pct\ƏG`G͸eろ,,&Dذ&w)U7_Y&"\ÂxwөeSk4_6zqoaݹ$t~,q #_g}nɲ[X}^#nKdeaԋs v&ьvd?x*D> GI Q`12 %uHi5ǐZ@6dLPd[VL]AÈ8~1 [L(k)h; ,6yR_3\Ə\_0v3R9} c7XXb,F:ir;w{\ 9­EJ '\ry 0CȣZX/Ylf,&oe#AScyTrs6PO7(~&_f[d ڱ!&Hg$*]^&Ėb2{ 1l ;((IHH,eBby5 5YAy9bˊ|sUZVd1Iեyȟ[B%l -^3S lb*p1[7톄CkF`KhVxԊMhF`0ꦶS">C툨BL'#VIC֜%{$pԃKH G;;궨Q_0!8mG&vd$]QqF&-Dc"B_ Mt JjZ;4 fMAku^cfk۟T`1#%m\@QHVkԁT Z IT'#irhޗڶ lFFw(7IKM0YCbs.J}'U rG ۶GȽTA؈vZw!Z|e#{SN2h F;gԱZm`_ P(x8:q]BrzY \)j$}]aJŏU8aT=  aByϔ.7et8X?xr=>Ts endstream endobj 49 0 obj << /Length 1622 /Filter /FlateDecode >> stream xZr8}WTd0n @jjo LW[r6XL&*-,V'jΩKk5vkMkaC9yGCވ/E6ّE\+.GE7񣖸:KϠyoϦѳUzo=)qVM)~,jnQ&c]y;Gjvr:'D4!_9;d/>/M,ЀhZ]cp'܁.爔QrK2Sԩkہ6p3RCƼ nM.VĘx\OlpQ\Ll1gJ_ž"r}+0г~_3ZTDHxؔK5D5G?By0+x?pUg^x|_ǰ#qp+K_6q-p3ȗ-a\]`@v0yB ,fѢm*NxįsĐP]]P `ˣ{,wvqlFHdiWb)UNH`)@Πk*J {Prg' Ov DV~B<A[,q8fYn 5CҦ =h#}, s 5G !1utFҽ.(n5WJHn. glJє2{TMcY69ʚSzYM [8 0A4Y'Q} " $Y$,Z ;Zwp.\9-|ZHus ;C^xe@1lnU6 Ur285`KǪH?-v3RnA)1)XzcX\¤&  ;l endstream endobj 53 0 obj << /Length 1645 /Filter /FlateDecode >> stream xZ[W6~_G&X|#.,]BO{}0t:J=v)v}-OR#2<я\Ay3wp.sxqKU]u{ǝ}TB]143'QWs#v"E "_\UOCuAյ ua'Ta)HCK/  ߉bIaEnI!cnG̫CQ%bԠ 5PPI:%FZ$M1=ʍ8xcn` xgy)yZ[N+3F-58gl۵B`Z#Iˋ8R =R'PJ"ʡe۸ K` LV$gdU2ǜWΰOmŤV [%DtW`TQR)m_&)ch#u ""B;cՈ OY#cEe0>2 ;g Dv1Rj4 /ឥV~( uh.\Nzk`wg '! |dMJ9*HCry |U:E-dLwyڥ q:9<{L`LΒ3#牢7o-e ʰ" L~N #+IVI.ꃿPQe2q|$φ]%*@xlMxG)*, ='l*.S>@A@1W  b uHk(4\X))eh~{P }/(vYv_&oRα9ҩ_^&ܰ!oW`dF0l2;}feADi0) KL +b ldMĆ4٭+,2e+rQd+8Togrykl& : zV AB3!{hCL/G͗"pbH܌uW|pv"6#װwN9[P6:NU[SUh7jPФt ړ :}xVP> 8 vubmӘװg!?Z>R0&Jzp5BLDz/~=>w*f-n__ 5t}3QaVu4HGJ/ٻ/Yd?I W:]/q7&f[?:F/.Yf$Ϻcj |& E-_t4UslU顑Mj,R(z*Ő\ucZs}y84c!%I $n8HzyǚGyPI\vk "&Xf>l3}\kuKan$pjv3:HiyBHWJ0/QwMz#'3LUMG#=+L==]3ueB* ~He?t=cwGw endstream endobj 57 0 obj << /Length 1864 /Filter /FlateDecode >> stream xڽYF=O-H aV欚*r>4"Ƈd1n50lwgG_jE?GGFr/c\xnUJVSxg[kx}"oҒYjOl'RkL`\m'kQT8C S Y9opWS#GqTfark;AZ9 |_!)GQTBV#W9JGci9*uT19~JPsRW8X_dʎ +<={ÍqcՂS mx]QlZ] AҭvY8zCIsµ$)0dwZop5|+J$veB+; Z#;8e[kƠr]z{iFM#PTJMy rҍF& HLY!H  yFO`b-)Z~C֓Oh1!yʝnZZ .|@6H*O$v76(q_хEAE]c̡"ڠ"BĸB&:- τ H_h\b.g!OMڱ)**Qː)~C"23YЗR(g#se<>)k<95B7RXޙMKE ~u4}n=ϰY_ݠVCf}WXBg!; $U} ^Xnru<|~4/L@DS&X&-¶h)B_YK,gC+!>JS0-8UWfU֊{Nyg_J]bwF|biy@BȰ!P~5@3͔jul]RZtH_Oww*7h88+xF m*ߜu9P$ooA8i9TP p7|xH$4~(w{0mE DG'zSjE|8rPʢoD՝,n=/ ݝ~QnVvqWovn,R'Z*Z]-mWXyl`MP]7ϙ0.aBYr F7I'8J[=0l._*i fYߚ,y l<: y!s]Y5*yZf!^PW]fZk1%:q!Ot@5\&3+EaAG2hTfh@Y;TǺ_⦉qj<׿\vڈK<7 2*!bk, 6i]iv9DxAhXv*TnNrq|+[=u ]趴9o ÷"Ăݿ8:0^> stream xnF=_!!KtNӴY4FCZD$%%=)ڑܺ(\Μ9so.^zr?Ot2,У4H|lێWW*gI:k{ ݌':JhM@ES5b@d%^C,-FU8Xi?A}&Y"E#4)= M#edGh1k*AʻCH(v1E2͔F8SL=-oZf9rPe |vo[ Xrзc-b<ŐcQ C$ WyaئtʹnL_E,Q,} ͑jcp0u>0T]al+v3iI(5Ry. 4uGlk&oh=ƈ/g-d/0L ؍ "@D_ž] K!m#姀qvP 1ˈE&ES!bD%ՙ2ks+|!yel,l`%f|*e1SM;MeZƾ|ǘ(dNڗNhGQOA1qw)q9l)MTE[۝9AA( +/b ;9OAQŵu0[xo44STD鳪$// $?A--K&=T5u}Ӥv%9 AZ\ E;k'0 /6;"0q4KVp@QQT厺?I΀/౟$ c>=O7YzQkip`˛\lsPuL*lQGփl) 7|Xxo 򐠌Q3 {ϣs2Fߎ;Vn޻;6:w]be%bPZ+=ѩK'h5"jNqXaqԈ[-]D{g]rnDwm̅.]v"+_CԟL?izc1vld6Vk +V'Z \ ޫmf4jՑLn C 2YI@97ݖD>M!!buk0 DjB͎/M魵v?ti  װsDnǠdx6|h}TtSK}QNTN:laq,F5~zVHM]IreMݭ>eMT懙Q (޺Vk(pTdBMܖJaNڹE B]nadARLشe6[{0lxEy:)]N-z̪[uVpm69SmNJ\ŝ8<Ñ CZ ~@hI)O`4+Yo4]ԉ&#g]{V47W_+[#B9iAH~.AvNΙDeAb3roAP9 ǀqftSuxN5ֈclU\/IGQZb픸y)ޛn]N}έ1CJgz6 _;s9'?'eU.Ϻ)u3YP>,$굄`0ꄃ$AgXBQ-w/^ endstream endobj 64 0 obj << /Length 2289 /Filter /FlateDecode >> stream x]o~B\~\\EhrAIV]Q>\JkA@q;3;3a:GePf&MFI"4<̂Ȕbw?<R3g F8#Vp֯3<QPDc|2y\4!q,{Y xrx>Ğ 9жP)e[a.I̞'EN@B2J>Q=L. }5g&Чڐxϋ8 ϊ xy]& $& 2b1.#~^#e"_kkrOޓ{2y%Nlɛz>QB)ΞDsǰEтV:%шe`b\\Nq0ȢHpٕƟ-(tϧ0  QEP\XYx[#3r@fl]oz1M"! ~?9S1= _8GE·H3S~@1)JW4q؝@g7DUOT-/T&`5`W3鐹)dyU!iZ  kڴ0 ȑeH<9쒍LU[ <^֪6ti2J,mּLwԴ( 4P,"j--CV;) ^QG!P.mk}8!r_]w9]q;̲͛о<|I6Jң*;w_ߺ[XmVp_V\Ul}Fcf>(d^A#7heu(t4mĖԐFd O_kFzt0eqb&@ O,<~rujqK`"q)aL<74>TJp ʾժ`!82ㇿlb웰`1*W1WN)XA迥 ytj;'@PHZS (wR8ed9(`.}>꾲&7<>XzB؜ E'!sJt;y"VϘz$%Y\Nɒv-c|/~4naJ`%sKFfɎb`)=xmZ[8e$E m?ԢU6u xI6Ggl2|; B&W\GzRm;%gehVfk]%IAkeHn4Ƿ'Œ[7`e6U﹞twWnltÓo}mhзBqE* տ)rp$ϴ߯*K.k%]8W t)ɜςFikdӖ+\4_Oigis犰N8ɌH=6AQHnxSNۯQc# RU<'7A X`Wb䬂&a\GL5;!W{N/zSۜV6`C6Sjcq1P;ʑ5nX84$(xir Nӽ]Tj"N.%'xߔˣ5< pIK8uN9w,(r'J`D/ě7,DT endstream endobj 69 0 obj << /Length 965 /Filter /FlateDecode >> stream xXO0_Qu; L| =mJ[[?6t}I[vl$Nvlw+JL /a ׼xxQC1$^]n i_S!ZS_8[gi֑s? o>=d73)w}`JBә&/u0u8Zv_ædum+?c;a GfsCîl;wrvS jWw3oga{Xe li4}n7'd!LQ^bl~-H!iM皎ƨqgHgs)a#m#ڨklH2gVhc%js%ɟc,T*Q?0 .%juq̆ nOUY` C5Wpl8Q9um&ڭbjT|3&(S=e# 8& $=<8PJ)9wA6\ 0o2gO=Mq孡K]_ Z0x&"dH8kZ?Zh Y\2ʋiV WZDx$@: SBОpvP;AіO2}Gi+cHX*/STSmg l_ E(W3-퍈3 sBAd9*h \3TȂȽ7(:|< =CmglS'k ;$З#i9Fm0 m5'mzٺ CvE!%Zj5;[o-*Ff;Ӝm{a"Y"uHWP,ÍKH!|)1Goė߈ob3?TO 9'ө?6s g_λ:[hh?izrX)F_c endstream endobj 65 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cgdsr-NF1plot1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 70 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 71 0 R/F2 72 0 R/F3 73 0 R>> /ExtGState << >>/ColorSpace << /sRGB 74 0 R >>>> /Length 3655 /Filter /FlateDecode >> stream x]Kϯtp37[[ `82CZS_{fh/q$A:ozfusOe뺗i&sU_Nx_mޞҞRڮ՛RaKNi{}o2^rso}˵Y-?VvwZ弗doWd?j/sKYW>xp|xxXP|t^P|Ҏ _\oE=l-ͦ "{GIM{(X?Yb/~oH*˽죟?(-/^Xmc-(p:t?n߿E4ѱB@4Myh?E4ƭ6#id!ڒ>^ް7&쒮8>h7֚bcMkV[t>etOMtiϬwvj^Q[w~b Eۿo\o05YkBM> #-R(3yƎٌYʵОG||5/?XÏfw? A'لt؍r;c^wΟY+K}=]bʸzKӭynu O%n,}u4qx3Af&fk7S#gS`4؄=pހOt-l&$nL-%kjrݫ M1{aal5A| C!Y6%ߙ ma83W vs4=9ʹg-yuY3f7I3twdztXzeN_1: C@'iBcmýӘL3c79qZc&?nPj^#pgՕ}E(=ik[;6|N\g^*&8=ws:E:qdaVQ^G pE-7NFU @5Jb -c? ИJBYak Ҕ + o !PSJD%p֥xv01`H]YIv[V]2g8AD4SBajր}Ř K4}4#9(y& CY:@UZwr@]Qg(1 3-%5Q\R#^DL PJ$i!3\55m^=.%UmG̋Mi)=%RB#q]77HeelP9'3cδ&2RRv1S !OY\%iMj{69 1bꞚ|ryCy(Mր}P.9 @J}L|gn@hRݛ{R4"p(+h&+`E3E(?EHAQFNcuSH*L|=j+8'4Hf&iT &(x~%+e^!Esn`ž MYd jġ.'4G.MY/2"\ds^$(ݼ y&PM~7} sQ#TSK |j: {JbĎ{r"Sj-LAL˅}l9CR,  4y(L 2 7yRsmtL 1E G*t&``N`H_CeQ]Jqx: -x0yx"2\xVSBpR򚽨3h&A03ABݸ+eFjTrUJ+h4;' Mi> 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 80 0 obj << /Length 1058 /Filter /FlateDecode >> stream xڽWYo6~H@b@~k CۅesEN"Ak8o. FSJD&V%jTf LZHZR'//sK{F .>[SI:Jۤ*hSE{h"&:`Vhn7_GqjMŅIk 55 n, _a6ȓ;4uџ%!`!26\i8 M%w8m*xʤt!{Eb %;PZkrESalFtkJ+ADGk&Iu~ldxN?&#`|IG8 {S̛,O$(hbѷ$GF];I +MQY L%'*Ppi2 1 endstream endobj 66 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cgdsr-NF1plot2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 81 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 82 0 R/F2 83 0 R>> /ExtGState << >>/ColorSpace << /sRGB 84 0 R >>>> /Length 3668 /Filter /FlateDecode >> stream x]I&dʙ @22|x~SFkJ}fkͶW߷no}&|zc77i}Ӟ>vZ~=[:_1yc6~xj{+W/~W/<;;; 7 ڱKG.ķ}K0#[lbhR?bǥȉQ9./&/;:m86k97tl+8ݾЬ̽.;tuh6Z}EwC-}/gl(SVwKWom_lhDZX͹cUKgέ*?AG]V"́g>:7u>R|GέB7_qSӱKXå k)|iޒX !{9h^N,i/ϣ |x /?<7KWۯAV={~{[g`4o[j/R̶ fi&ΉsKǁy|}|x~Lx>zoWzj5;)QmT;_ VO60;wS{٧?l~_76^m/߾zӫw7m}~鿮N2韶W1~O}uN})nj5lU>ͳ'[O_-O8׼oc{%Kvs-PkА?\Я Os~YHsS剓|r'2|bV!+ W$pW0ɔ;sE*G7;EK! y 'Pk]U@j/a'ĵ K@.Q~ n}H F/9>[n , K"=:ݜVtkpՄqHn.ĭjHQˊ6x& e{ȆԤ4Q M5Si 2 :\. O{WaInO>%VJxSIx&g=%KBIe$ r $-DU鋗na irg{3 ͞ź]s!aԭ;]'7S$YSp6,sO-Nf7(w:b7fy@bIG盶 OsהŻ횭d._$ӄ;!V0&:*$a |VҼH_<1+]U^)4lhσߝ捩Qm_s #Dҵ5a䄰AzQ4@i,3 ыeJB@w%Jp9i8#Hihu8F͢`IFLE6IE2KVi'>e!GF<:'v['-6mC.fBCE.͋tV-pI$f\ .>2hzE:4YƝ94Wf0 Fj'`)rОuS9r.E\OSCCK8Uɸh.qpzAtgz*&mġO$Zxm '/)+q)kFDyU$ Kb2 VMgă"4,OyHe.FSR#r^d:Ũs/S$~W@6D.&0-h@:IILJ$V I{@w!&%u MPo3_iNWɦI$묀ED~qܬ}TdhU@dfvxp3ބEo_.)J6LE1<"RR{U4ڴr(EJ"'Ȭr\d nDt1I1lTM$>%k ƺ@Gb!I`Gl@8y 9iiţ]6&:Hi /R͎C1P~1W;EWfRϨa]>[JYh8%>fuv~a>-"䒚@4-C!O,Znk֒6 1>mߊkSN(M9Q;!"&کlVk!l#fh\J{gϏյ/ۈLkD~N棪% 5iTW\Ȁ:<ߟ )_Jh] :;@CMI٩h{'QlH]UN$9DqZ z >"f9V{>ItE&STAD5FL}hDI{i,e} )G ~,SøJJJeQY*X)>,$/5E})?R$-YW*-Цax  qtG"m(N~/֡D6о`vevh#V}Ǭ%PXŗT9~G7p7a8a-Ӥ )IjFC ̎'o5e XrOKg@X$dhCJ%mwժptIjEII0ȋVzɑS|vg/RlGG [E뢑W,+;NW6 LS"E>Og7s endstream endobj 86 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 90 0 obj << /Length 592 /Filter /FlateDecode >> stream xUo0~_a%1qd6m6i6eO]4J:{看{|}ߝ#XιK"Y?nFxK%(dU>n+vFWynRÊ2ce Vܲ"a֬kYWfa(S06Uf21nO+-}R!Ҳ5ۀ' `T+#I=_Q<5! n*j|!WEiƩ"ycU2SAZNPF*y a!xu/`-rcV$"[B+0~S!MT>ׅ֞8ݰϺ BKv>3؄S"=KڳǦ;9 _tapD3NS7C"ᝧ{Pk+r0-[&gAt %=K'MqQZJsJz:wHos/ ŵĹ"]⬼3*uD?4{񯽦#ޖwg7Daoz)` ;0gcyC\#k endstream endobj 77 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cgdsr-MDM2plot1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 92 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 93 0 R/F2 94 0 R/F3 95 0 R>> /ExtGState << >>/ColorSpace << /sRGB 96 0 R >>>> /Length 3515 /Filter /FlateDecode >> stream x]M%E#(2<.쇄H{@VJ`v9uk01|Ui]ώzpY1lf>?~zWC9K)ӯ/>"w_s㻇z|~xO^>|{O|y}̳͒?Ժَ?<^/_?NrvLOt_(-L/v%Lo繇0γ6*L7%\)l\؈m³DZd慴Br9Y"ݽ WlLï)48 lb>VլsXX27FKSd \q_8kXSDv!<JYSoo _r 6} G)!CAۗ/qH |zZZצ,]X7"uҵ$)>\IXWIńUaF*#i WP~;&kE[a%)bn{Ô\–i$=<9Ycjs}3buP2&[x&K34MA  Q6Czm#)\o  :M:8X)yJX vs%nv!KBSaOoPLzhۛfa3dVFRE:s׼Z<Ѯ,]6.SwۂKQH iQa,3C(R}b b_ҋR'Fx'Q)WSC{!pw/$뒂$?$h34j3I[p\0P# R:d5"ʻGDύL>)g:H!7-cQz$֡1l}_Jܥ( t~ AzHe)%:בT%FBa%AEՠpV&KIw}% z}gʘR'QenI#P)9)2ӥD#c%2Kjb"u{mI52ۇIYZU4#Q;{mD~KH;YLXsK,ծ7I0Hըw&+LVt-R&f(%QWpubepg=m \+ Jt--|pkZUcaB(gc J#ɜhF*=5Bs&!"6aW5a*1=–~.]b$%uSP)RS4#}k,a)&P*`>$O~5f|gXE3֙5MdL%5wdD-#lZEԱIx (#ûk˒\Qgkwǽh|qBAT/fB>I; )Ji7,we-< d֭7G CؙI*buPc R:b֚-"M;#<="WD iktp qvu fLӸxQ{aWF4q*֞2&RTΣW4KdShVg]1%Lt KQkIsa1]My&mq翆1x6\'Lx X5e V[`qǡN~|2u>}-W7v퍝@~`^Q<;粎=\1wNd{sq_sG>ջmϘ smn돏x7xҧyd-d>q6cxkx^ǽtud<qOɂ|d'N)|x`[𝓭I}-y {7nꭒƭײR.xhx'˿~//oG/o|^+Fx?S~ş? ~|͛Շ/?Pb6W "LTs|= endstream endobj 98 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 101 0 obj << /Length 848 /Filter /FlateDecode >> stream xW[k0~ϯ0{(6̊uЍnM{(.q۰8lomΑRKJ)GO'^8gμHp]VdMY'PL \&lV0/j Dꓬm' ͇Cxr@@d~iߞYɩQ:/Ys D#؛n&^"R,UD7 Gff1ajp dtد0ҟ΁D4MB'5GKQXGO>GqipG\CͨO^]˵1۲J*|#w,;'l Mu?[&OIn9#$6B܇1q FRƖ,/{;15ޟtʞ)B9ʶ=mLimmϩcJ{z;=S:g:u{y.ΟL"X=nhܻ=9r*BH` vxa"V͈> /ExtGState << >>/ColorSpace << /sRGB 105 0 R >>>> /Length 3504 /Filter /FlateDecode >> stream x]M%ϯd<!!;a,X0zK"##3kQ_>?~9>K;vgoOw+g)x竏?w_w_~}w$]}t_j<g[%uv^6Nj_??V*_p_(- /v% osaxg80,spa`#n\>N\彜Քewߜ<}stN¼,͜4|vu,<`CڱV,Wxz;G{kT6Liٔ^c_5{Ǻ;W;W?\J X0]iaõs 6 S=*/͖@zp;0s&b)FÁ5ck=L}M1˾]iЕZwUp-w{S:MA Ezz]ng_C۰$kXUbdn H+d JӋz)"];{] <JاteݼsοD ;m(PR C"n_a56Lc2# ?7GkU79sUe[pl]2yzZKԠc\]d b^p:) /%bROKڔ T.>@QL8Y{p2Ҏs?qClV3>^"ƺ7LDfIĆkb}3buذeMv`&Kx:]hOw!|DzC6\!71*F"_#|aVxuCA]\|Iۭ, cH%C0e⧓^~.yŬZ@垁( eNz#,A) bҚ$YeBAXB-^>4B4װF^"3TAg(/m5] ls)!ԦDpR8IvQB`ݤBoKso՛G ΰY:$*>t殱Y O+ś&1g H *JESA1J}NōNRrNRC{z!po/뒂$?$J b$΀ \0P# R:d5Q"ʷ#"PF& r3hR7;xMCjIuh [ߥ)w)M =)%>HS"fذ٠jEJI8O/åuXL$4]0I.%%"|,I-C&f)V'fT#}X@$UEsRAd݁;}#R[Bbº5>0$C)&dp "0J,ծuJ⛢MZjw&+LVt-R&f`JhQg jÑPnrt P"k)G3̞K-0. ZV2Gk7"JCI)4)-:-VK(_)"X7%F4ل~$^d)h>ptF0i-^- [D[)vn*;V:la FS]zuV%Tme{Tp%$b8:>iRlCYYJ%BeRD"N&ů- LR^Aզ[D)ɬM*V[&X~ :#$6rỳ\+(Z9[ppkZW0q6ŮJ%{ ('so6*=9kF&K1pU1=–~.]b$%H7R濢[S #L1:P!1BהcΈZg"֐Jtj6S{~34.yu_i-=SZ;ئLTd]_Ԋ:[%.D̔<]!J&QaKnJ9ĞR7q.$ڡLg$5Y?ӡPI`"FQ+):FV t5:d3$K 5ŢPW'ŎPp"g*ej[n?J&Tkb\3iTa׃v:ܴs+}\X{Xdw8*2jXT* %}3K%.y γyikFJ)|J)Z) MTM*S~JuU6˲"gv HF%+ |CJg8̭2%UTYd$2zή=} uR $x(%nYX ./:ZyIko3T tĬ5[Dv(Fu-{DP<h36gpג1hBbb{MAZ#%#Ea;i]5;Pg®`5Ul/=eL nTΣvjhȈЬκ*cJ6יxB0a5Ϸ|iײ,Ie q=0k 'QU4>T8wtK%`H=v7̿&PW9@9ľ$t iE*[I\;yyO4PõmhE7,JHzh?vj6S:+ |~~OavD^Zh^xR3n=޾\>},{޿\>yy8ooO?ǯs}{O6vY;/7 VnuT㺾s,hړcD65h{kxmY6_ooji^>yl܏/O?}/<zr~?'yjYu~}yWFAL?}j8^^)/χ޼矎^ۇyxxxMz9=t>3?/RL endstream endobj 107 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 111 0 obj << /Length 594 /Filter /FlateDecode >> stream xVMo0 W,bv-mmS4ESwI64~D2.v||(%e2R\P) 1ɗ)KgS-IR  iRe (-k6OLS)lR~Y(-s1E18q6>3 5Wy_;=r x#S.r4(ǒli `m`,#`x跦3]EilwXcZt c!vqNN[E5۲,FIw{Z(ȵe<`>@,77ʅ~\EÈpȾT}K]@*Ar-4UR PX` > /ExtGState << >>/ColorSpace << /sRGB 116 0 R >>>> /Length 1691 /Filter /FlateDecode >> stream xZMoU7ݿ_e=\D+!I] R/$U˿/4&ǞϜDE}ڼr\>d$'ߒKcͅ]m~&;y&T_o\p6ޛMoj5K1"æĝ#:ElTšB]q/Ňˮqx{=cqqXX4mVEuKFTIa$ uB0e/O~E٧ȝ Uܖ!V/VLvŠUuj3[|pe~sxu~V#^EwVꧤ^䗉c.7xv^\ߜ'9N>q[;;&EOvwwwoO=6\)Us(} f~x0߻9OUo-r:p=90Xתm5ۣp?Z8@x-, ǰJ'Y??x|VEr4˄ӯ/ũx.w)Ǜ)u{ Z׫E|󷺉: sw/?KPyi~{#lkmI0T69؛-jV,9\z#]c\mo}וaM> r8_+%C<@o)e#sUeB\j{"%hخ0v_+y)Xx'lv}.+9UOTG/yIөӻM|@PI796pA$Xj.JQ^moH"zOWAV ȸT_p~K(1Pm4Hhn PWjK*n>QD=ЩX*lw) 袒D R& HSʣxVd*=ȉtPDT K UMffTBʛ$.1CY\mʬe[QdՉJV  .S>u4qHqF딊*tDydO:'e"5NS"cL1mwD^WM<0tŚfzGZym#SpRdjX5/f1qzJJqΔg{4*K(Smh"`>j!ƄHn'_<=QM a$I[n%02q]x^BOZ!:=Z8ޗh K(+&&e9l7?pJ endstream endobj 118 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 131 0 obj << /Length1 1786 /Length2 12890 /Length3 0 /Length 14013 /Filter /FlateDecode >> stream xڍP݃-e www@pKpww.[U[T-ѣݓDYA$` Sfa03123SP[ڂc9X9Ct}]n6 '/ /33?μq@ `rsprt}'ڔEg8@le (]-Av@[RP[:21yxx0\-iVU dd"wiuK+5sW3n2ٻٛ5y#/g_#@SS;GPgttpں8݁V@w?H] 52%@.Od~^L7?24쭜@2Y\\ij􇀺#O{ ~>2@~V>.@w o< `'d~￳'@}X}mqLJ"Zt_RT ```p?72s+Vq?Gv{^Rtx\Ag`6}a<?=<_?\gO <+)ao`ǖw o;)01;ދ;8QN.7I`/b0IL2Eܬ&;b0A Ed/|1|k/`|_]LBowawawaBw}u9LJΠ7_7d}J?}7usv~K_ahj7oEFQWw$o_|Nڛ`":RT:|Tg:NcO40 8j@R|qrFV.lX_SٯCxeӈ*7Y%@K~2s;7F,DwV죻VҋGKy>>C#zIOYI\oˡ rxʸΡ Y=yYζSJ*FX02)22Bdmp3}Dg= ,qvD9*3Ri`dˊJسj~.qME>zCo%w ֐%v뼃8ʓO&M)^{-G0oBQy"w]Y_RZ~˰"&iB5h}JB03$'-ϓ_{kfh \TI_kGȞAgi/кrIΒYw O7gO5`ef`皶]_u `3/T5eD>?`֩(%[y4;mG]%|+{t r䈙H/`gP˥EI+s sp\O?zEr HJ"j>A60ƏNը*Sp-Q q{Ro<{L$YNF4;n3/ ,A [֋&h`|6G?La>ET2D,cFcoی:/yiJRG!F4_{Vc&+^ɺ\ ŪRskx3!D[R:J~ 4ڇ_x3j*Ȭ%OUTex *1!kx&&ձHt1w{^_:X{r+)E/?5&2dEM/5.)h p* TQљ \Mhh\u7 |9J8HikQzOb'c;̭RNǺ|=!d$p^:\"] 5IX3zbÝ'HԖE02dGn`JvőkeH0#W[|)#nlrNQ01CLkfk19&@fyCpcK:K1`)>?]qԔ\whD" u~Ng0JQ棊{);w[; =7 xR.χu"c%"o6h7 u>]pF1z [ёmxgXaHvAP^)J4g*f_yd7Zf؍H|.0t Up!NTfW438/.%Оw:g,uwE7|tJ:|`a8Y(rPڼLo8ݚNsh*}-f߉TUT/_๰wW38\߶g:;eGMAɘhdQkWɏ59XdE#͉ߕ AQIT%5ϗS~$)qWG"}js?Eqpq=5iҷ*98$1 MiPjQƅ7 6{?5n0 Ϲ[GN95 m; Tl?U}L+#\HD)64GܣQ淤/1ҙ8gq G1wwE\c :#ZSB8mUDcǯe>0<5ܛX( 1ۃ˒F U_݁Ǜj{|\6|;򈢢g6E~p{(́ҪHǿQ"|WT,+mz5a抾ciuLp.K gÈB[y6Kq/a!*I˪ X4/R*DP<[ pv|:!ɷ< _mEp(~Bk;W3K8!'"ȅ)}c2Dy3T>VuU|ɨA.?/Zsb(ɘgS]T&Ɵ$4FHp'`xH]W.rvTjCPCȏHiK_ x]z/j-)TAʪn@0W/ .C<z^[i\P&Df=LۄKA!{ etھc4jL+:ꏰ^3&3q= |×5)J0&GŐ~ 4%.ה}$t^X\cċ~?XhL`>pSǓ&;$;1EH^4o/ |5 ;3%"0St?M^<~Pb/C!幻R(^c\+ۯNQZbMv:xWF3G}f V߆_u %VS?QJ t`ZwSakPNUU0gVfUOXt?Eg@Yr3F`6 %A ^g/ݞI v 钉4%7Ϣ$Q zT+_~ .kUg]3)+6~0Nce :|Yn񛃬=R %xmmQ)*E/+;99Ee?-}y ߡS{+ iOV@,2xװxkp.ƚPd":x~H=(.J\yR%`/|= w~)Wb]yeh+ؗRhݾǚLå8yAh !h'? su؇~ 0EL#(4ӕSkήzZq?>AFb;F㴵xĸEeQ;:PDJ@ ;w:B޿b?08n>h%SvJDw{ANtִz@w$1xZM;r,\6R>9;Q*]V%8u. q˳ ES/Z PE/Sǂ Ϭ\MͨvN2`=E@6A/\\P[,\{rM޴|ch.DB8^}8Z Ku~bs,z)\w}TF[a}R<>*06Q ߵ5PQu !KƓS`2Wձ S[\1޷jOma20U-2YmQ:5ԀCG`7ڕml_jM^F3T.`Z+p,`Vw 09ԤPp(T_!~2k'FhY:#RQ;qC;O~͵;Zbqe%GW3lӸ$+V-te6e浶!8shz|2si&׾GӆHcTZmɖ~ݫ O1%@ua #FgݢRnz"*ENf(+^b PWު9B熗?<ń;_cS'☧^@#| taz6CSqoX!38@ 'dzŋop;xwK}kxy[Q5E4GWM.Rȵ9]廚QkeMdeprhՈb^i\Tv)Mc,C[aVah{n Hv}k ũ@La>)֙.u<2[/y.qŵǓϪ?yfX'-FKxkbAO,.FUxc;ݺsRBwkAǠ9Mn--GH(lĝS)P\> .2aLU#%?a׻1A".< x+ʉi8%|K !:iC@QI@nDKTUTsulxq$I* Ä77dJEe^P}I|#?"obuB:<٦~s.gL *%y'b$CZʰAdi*ض>aC~C'XQg65 vNpm|"1CnjϳƱ{g$4oܺge_¯SBLl`RL~ QcCk5t/ZS(za:#'{/x Y~"yKھkWO{@#…U\I?D}M-5&@ MNlȝR"hI?P(1:1Jr){;YᾥE^`.$rP޷~P$HR_O[bFBu9@\ bq!JXe0r MscQo%NE)k=]!V~ sIT>> [[Tm-Ҋ E Z^(O(פ[e~U"iB:y̙8hyiNҵÓx vtßvx-Q?a6s8;4XQ(4U@/{ܭpݟ]hpdڊHG=K}V^w}IlEH<^5-d "m)aw$KAmey4Od` nC/#o]WfS}\ocr>JՆnʘFfڬ]0oXPZ%u_bEA aKL*Ω`^\)vhӲűÎA 鶒9qrcZ>߶C ڎP%#ՇeYҤg&Kg8k/WJ 2@ AȭK4W} +rL?ܤ67Qt"#.J6glc}]1yg^ cxjl̝d \C0HZo"w'N4 l62ؠ 6?8i(5<#[{ܢj'R8M:H:ㄏAٜ%/DbK2|N$olNz-& _`< b4M\E :)!XRR8筥č|oݙh‚p(^hE6m1uXF2mjŎC_kON]]].Рrc{!};C*bX7`rSf{^lb mkd_R"RC6Q쫍pp"]; `75w3} ]Z8i|89Lr!~|jtN׺cǏ'Gm$2ɿgЬB-9K>%`YWC}z%FfH2pS!յA_d#Wx]l~Er@MuI10aːDCs^>Yҟ$ZJp38?$@|6xSI"# Ѭ3z5X8 -Vd9ȸaoub/޷|%NR(Zw ~T^,GxS[f_gJƘ*D7J-0[QuG+ =7F2ˮ/.Kt`g6PW!j/>}k"V$+iϫyD70U; Jo)ec#`DN|PZ"Z4FGx>N^}x3Wtf8Bw(h[eMFķO[ GP] mg 3FG,Z^[=_yA9-^@UyUxwK-W?{ HW0u{˞؂F.a2{x$YS:v\<0HB|/m⺜q6I5;|ι~m I&~wJw(<L B:],+pk7$$uHè.W_"[8uG|]oIE@ +L 4#OE~ A!D&^G4TUL`INBvR7:O_ɟ:n8,\~I֏ڛ߼;YTV&|HQS>TG>I$ҨNJ|ڍrH~bx]a9cj9&*8,$>Z,TQ``ߣr&+[ȧ-_hֲǕlPh[n榙c~-,0_-7医QKd.D}~,dtZ*-'G1<'sY9 5y,%T7B$C5:S *B\@-', V_Nz5 $K*UhEYn$Fk|L@?EcK[ N_?BeաQ×(mD"&aʤld~cfua=NXD0i5t-ܩ+嘹 i $̵ (j{g~P? PiidR}"-;2l/mxY ʿ,rje. P&7]wJijyx }s:1͹b2޿쫥r?!vٖu㖑2쒓9oa G}]};)i_|]Vj* ۸d;K5mR,3ggA[ZN6GeF}O'vOȭ>QMx ՃW߆Uqddb1s ӢjQ$Hթtq})T+,Uř)Fh$8׏_xSD"kZe2-w>4A~ďP< |m(^i!-א41–hє;0:oY2<<A"a_/f6|c%-Ɂh2vJk;u 4qr 1mۅ2g/`BLWEUmOZHj/]٫6,Q!khnNpٿkrצ CûjYE+SWB$ߩ4rG򻭕)hP| l6K=]VXg4G J~𮎓= cGSGE3y"^@LZd/Z$cOyEPc=u!Wc*EpP _جچQ{` aG2cQ~a !y\y/}翯雉cIKV6MWAF;`g5*Am=;@OW! $# }7]TJPuN1MNr;H $?Trh? @IG18KbAֹ}W+cjeƿ~}|K^7}#X?Aw&R"8Jhkv:_&=Y2c*3'|6">sht݈i)"SaS_z =p4G㡘!VO%KGEIPI*F 1Y3Z}ZCl!?4RMza9y4])7!y{dcw5B-z*A,XwߨUv+Z#uxqXsSϙN[SWD(ߏ 10)T$a z'_]DM*.XCP: f6ewmeϾ%wX/l|ULM!׵ot1<6H$NZw^^nu &pZ%bb%zh^HA[دj_N&ƪT ?ɾJ2>.wf_Q|; z'^,@T^F8 ~~7f} zG%=f7wA/z;]iSP2RhIz %ya$C_{ 捶y`2uW9pASJMu^Ik$5䖪E@n~|㼗/~@oNbjH2Mߚ6nc-e֍X-M z0ڗ=HnVr\;6 ,Cliu(&rS??9:Z|/3s_ 9rF CgUγ*%LNhM }sUy;}V4KѝO^N]nzv)6f$KY7a20$j 0akf\P rI[]6ԏlop_=>}–9>e{+w}breVjS/fN#*=Pq{dI0{}L5MktAզŋp=1KTfEBS'6GEZަy 'Xμdֿ4݉wY1Gfdr[D)ON{sQ:R12 bxmhlM9WnL`ñ q?up0);I>io;Khzk69Tq}w0U1kʞ@A/ (󕟱Im$к+XMŰO#5U,~Wf2z,iNE~nءdw}g~B3OA%^ջy SΒ(WwY p_2XѰ>^QD>*w4:+.udeI~ ]$<'?7R]P0I?K`v3ujx/Jɝ9mUL? h$lu "i9i>M4) }(%a2jb;x7hX£f䌁SQc@J6li2&M͂fM#³e5泷-tO{D[MƏ_ӐUW<޶/3:Flةlݛ_]Ɏ6G4P0}D[byK *b>" 2:~b H$Ίߜ8Ngj-R7RwoZtr WIS[eY] 8pkCۏF|eЕt&_'8bcG4 *[6UM?KOIO|u% QĖI?IqohqK| !ԟ^Iw)Q}nQ6d}0a{{k*T vy5;8-tC8<حe]~kE vqp EZ7%4Q6;]tD>?8y"VǩYD|;˺3(O.1Y*K̥ [Yl&oU_.3,sW$eb2Y3ŷ60M{;s"i<+xSE(,:3?4v!UvH,)AEufH=fu&;nVDE\VwbD z 6\1Ա:R[#k^nv|z4}{Ҍ@&sԅq7أ+< tn#7mJvUܰ/$Y}ZJ1T/,3QI]DG C]qFMLEqz > stream xڍP\ CnAwww%;%wwww\+929nrbEzac[C=3@TNDGNjd\hnk Q]&tz7H;[Y<̜aƶ6V>b/2.J[7'=;+ dgx/"y01p+>'eտ\ Pt&v&/)uoFVVeZ[}r޷@}l_+bkeuRN]1o%@ƊNFfZ4+s_W ޷p|ɿUߐ6Fm ;tcz%vv':b#ӻ 8/_'`K/ `b7Q (1% V)sq(A,F?Eb0qswN?=O"w{{#ˌ﹃ߓ0BX.:;=oBnۙλh?{q {)zYm{}C{ G/߳G-9]~+Q38Qw2s99؜ksG77rvpx޷?w 2[^5 l{J7?KBMH]N8qeuGVh&%^7V)ɼ~B__YB4wJg;s!)?I ^Sگ䐁)R+#6̘!v'AtCE˜|#F uŚ冀8V؅KCq66M)r$YT#Q`B(Ў g&\+9-Aޙ1R&>RA˪,yeυsT8x( 8`tgExK%qrȱ3=CY#m0Ix䤤 /gS`äf3L^hCho?XUoHwz 81 \Bhd\ Ny'eQɩN81D+ ,r(BLo  x&ꦋgBᏌ+ENKL}s C(]0gjv1M]wJ3`q,V :PbHB MhԲ3MQZk,vwj[gKCA4J}FB~? jNXJűX.X#DŽhkpu׀ۙ.zNq{(JaZ٬8zfHlb9[q.B knhCf'!kف|W=%0DH [ ӘFn-%X.8%xTih|Z|Ki2?jgi=^P%۳|Ň,Vb c gsJB-ei5+"J'jmR7/c,mpwpˤj" 6~^ޅ  H5BOmR˜o 2[0<@\2ٷ<әBfwOޖ20=L0W&h/aY=JQV ' ۈ`ļDiK!H%@Aw`t_EBVe@` `OҎQ"3]wMi'̦(jf\+п^9>Q`B[<=CQc_P_ j>,drE{mXː 䌯sOpNQNx+= -[-zLs^ ?iHHFCxX0t{ !DnHqeYHRlMDLYqκN#DAFBumIVQ^؊44543H%.z7 <@l[ph)lǿ^>&;CQx1Dfد<0^1Ǜ4G&XG%1kiL-=+ԝF.\REf]‡⡥IOvIX>' 簳BϸWQ)A>_Pug^βIrK%$?d:f!Zv׸WWy_\ {ĂYeq1r?X}jҒf{3İ[7g{T|njaJYNաp^Tjp0,{agI$Yv2YGy%_mӜZ.LE D0&Ĩ>هS{]֤$I?!f,j:^J[N3! )ɾ|-#"蔉B%R0D* 6z;&ǖ]1Q`A^PթVׁ|2#K#U-Z(7k>"sO'P?v>;Wu9bX5y:c=JCk@LG j?DaҴ VC_˚\H1 炍%آLljVEto=uڱӡSNO䞊%\}.@ѺW>uZ]vCы Ca xJzOpF%^i+16]Czbf(ӛ }}W%:\Tc+SF>=ux||kW]haPV!1|A.by nZ s?H&ysd%reBHmRᢕ`0}܈YQj-v*KibX"HÐeZw]Z1y`Єd;.3Ԗ@7|& _Z_fCǬ CY*Su3*"l#(ևgƬ6F͢(a)ylP!FhAiX06wz)Xdߗ{m'[ \dO$ )~yKx_&&I1hu o'[Wr^BI,4Z5!^+N3e_HOiLphӉՄþM|@dEqLA H|C: ?8윏a!YJ xSc`3OvA=.Xw͗n.r|Y^#Ұ,HP2٧X&'Fۂ*>k_TJ!ZT\fr͏\fI_>^;lx@fu/Vx,-y諫AY{; ?`jxʞ\-3&7Ҩm٫'cR|緺'XВ^*d[ Δ(~`)vu,}^R4u"i Pmlh/<ۉՆY꺁 3ꗏt$!2LƆ@Sܷu6I28*σqU8 %CQ#yA̗1{GZz*5t@"ws_c$Xq_LQ3#(r伖~ fYDd:8 l7oq g+?jdy+>@dc䲈9O͒35n qKvE˭ک|9iYw>(*I\hͅ;r*9o")ry `r(>sZg+DR9A~d4n%%I7DNlZI`s{a~`V|+nۨM7]V6Rcd 2 U 7afyZYDIWHҎCq%[ktmkbmo,%] 9>O Oaư1Zg!ӎ [ k=e=ugȨ#x)2ACK+byS xsoS毻to뽑@uPh|7ʣ,G1Cm/@3qr}uB^"g[cpm/9 )[jvŅ絫6Vt\}mŎ ݆5|$AdyJ ܷ pO}y"%Ҙ w]|C=ɂ{d9;Fu~[6mĐ4;Wi\Di D4PSW'1|DY$AnL`;ZQ7D 8g\ Zƈޭ>;2s'jYWw9#9wtR)йǃV /[F;]PV"YAYP505ZbЏ°#}z}ux ʜU1为N}d3xՑ?yu,xlQG2)e(w HH/#/@qqU6>2/(N_N_KF0BWC1D_WtZuIx.a}C:ղ2 :C]z{X2X4y_>Vm]T)e;A)dcQL.o9m\4F|n\wa!m::Ʊ*ᗷT xtܯ4JC4!/AB)؍]OD<œ1ޚ)ʤ}Nbƈu|i7~zbWT}:)u2}VP#^@~=k v5Ia6qp91R !Yy0Ϛ(}}u7iWy#Yxf05<{:I$|2<Ǹn~@k?̴R*Fx6- ્cK}т-O:N!^ɓc@;+ _Qk~"\JzL[> ܣۺ ?\m}f KӸ1i%lEpRw.vqkg`֟~#!H‹/It!:םQ)gsK]x=\`(3H&uBY(0GhEϒҌdޢu^Y;r2ZR?/׫~L$]+O hf3>-RuB̾9p5Mlڴϐx󭎺l;I)asM<%iv S3>8;QHnR3UʳF:D{(›Ne[OgYҸVPfn]ڎ]7Wc IwfR M6(Ҿsyz,ol$6Ih0ycdGWm xs] ݮN_{4{F:>%o1;]`ab±F_q/Mޛ SڔUm*bq7E)d 5pqmbnrm5ӞV&20u$]91)=Z/MNO w<.IŸSfjD$ *Ai?_O]غG^q[LO+4pmgګk-EZVw?{lɩF!f"}h|<5{Im4ѯBg>{@r2ay\17-DdYIr&:i8q4>A&-~XR8f>_.bT17P,*2  aXL8Aڮ$ 2ǝ : ͦ/jl6~!+R bEMuc1^b[%nܶ(d1ΝD8n +L͗ p'8%j{X!C o)󼠀S#hz!FRMR.!n}'m/熤pA/r5['ϙLDEz}p4p?wob1<믋̚^kʉn^9)B|2~qiJԥz[Kɽ&U 1&3YCυ" w 8{"?W~c%*.U"V9o[nYohE%kRޠnT~'w. rC?bh]P~{B{<fUl2%,?ktNt( lDڿc=ii>#OGh[6÷}Cсe2: qr<3˻ ;W}v!tfba3yre8O>\kڂEvK2(`roi|nЭA,s6v8j[ 'XČV8"f]6gJͰveS#hsQ͒[f3\F}ج͓c2 }~ u l?`'grgrь;.y;"F&{<]"7f/9ho_Keb#e|H_YLK7<f9?7saױrlD=pWir^7$jf^=?&t9u24un,gx %!8[x/@B()ԽeV9Vܨ#ΘIL6$[ef2'6PC@)mRr~ 8DJq̋_px4+9 i[f/T|D,\T(=p]+l6-6nW"39ܯ Q / /Tx!bc;R\c-  {#d?K~kO@/(Qŗ%"In6Y8CܘÖ.!ĉ yBʛ>T'q2,y`}W~ - =#w\쥔vڹUu@{kQG"TV&yz.Aw⍩Ŵ/.T_HQu_L(. Q(\!tҹHpi{0Ãy3 hphmU y~G,%\Gë gXGEC2Y 0{ၣd=Ѩ;)j8ޞSZ 3/>>e:gsq]K,2A憝QiNn {ְIC 8W"( Q+ xB lnZr-V93S fz˜9ժ9ƴ.zI̫Ћ>JƤR])[ǀcvZ"p?Åvc:$wanJܿWEۓR|&uțx82+cjx S ">OSLbQE 8w5!eQNG=}dEչB05y!n.焔/w xD'd3Z2;@!=9: դ.xݹЯ)O$61=hP)Y#.!^[n dL|Ӆr. Dp$i>rɆx< IVr{Utrt3fv5 (9J`SZ䟢 ~Y&F$^<帘O|`U'=M _HCή?}H=ORE4@Lh\O#uLvjT0 x{*2]{*> xĂ/Ϛ3<>hI.wP+o ~));^i!U9v݆wNpnwI^ŀ}HҿpeK_v"GCGǾjL?cȫY N~h"6C#?;]A,n$2t) el8*>n``7w9<'DtSHac>D#+/Z™%~cH(7S" >tIϰyn3%dNP$Mr(E|а^s#zg6Y.`wl}@]^CSI.:&K.1ÞFgٜfU )`<ի4~5&<ק= ;#}L|S#^z"5joiAsփ2œ Ru󅑧 8>5#[ "sUP: -~? |1_$+fc!yi9C6'Z6"' BT \0orPNmevR={q 5LO {9g1u:m-HI< {ﴝ]gR. .^44(¶cVHDPO hݷN L3-lM3OpUf)%ݾ88Ksr0?,qguTgT<sؠzhMG?N-GM{ƒs4D Q6L/fakb`y6"W7Zx"7_‏ؗl;=!t/r*ń`EwAaby뤱hk<BC4w;Tcd.(-0WnD{]k괾K]@RlA IVB%Dʶa׸GnqC^ht @^ylm9Ewuh)kk$qe4bH ʊ'̫eg,AVpANRMI$q'͈2lQ7U3׷>fʓȇgD֭K !ޢnOM7p oƃ~LYM8})v`P΢=CWbI Q}c1xԽ-(,LGWqB #) iC|mWf@Lcv7|nA^wf=V0 7vA\^>^Y T) F/aGZ8_#H>z@oncMRd 09Z@8hX-咬֜_: oԜٴ4c';?'( >~4 g/JQ<&eDSA=4/gw9m!#`[o)DPz<' &ѥpPvk,gX$X:Vџ0UER EH-/zP DpKGʈ9quQ/HB |u >dKsy4#Ud{It+fQ}`Yڌ_,c Vi}L5iזݡO۵:>M#jDjx_.YՠFŻ5`Z1XYE:%R}JPA3ܽYbB\-wbcD&" {Cwᰁ^4]K@X݌\0(#R㐦(14ݽ=e+. osCCf'_} ,kSv**j0oQv h7tC3[&а(qu2BBļd I[t)f v?q?$a gQѹex3=WOppj9M_0btdFZeS.2jK2Cyun7ʺO>G~XssSҦ(ј'KF9QItW͏L [p05B61od ITz8d]8?i*0c_n5]ZO襙_D7#g rnzB:QQܫYfo>oX+꤬)(#"-̿qp#Z۟S"5=_N0&ؑ!/25#]UתVYNZg< H,vyRG)}ѵL/A/abPip&AS{ XY\TBS^Z,i6ko0 jwۊf#7NG_!oʟ9uHC7P'IaVhgiFlvjg5`JvUC% (g`_ cSrYU/GXfmO͡x"'$g(%H 6àb8u5QȏM\׭:zGh3c$tw?cϋ`O~t=~a0$:a'\ZB-2Wr׮B*#og̺9PGMh㇍0F@$$ݞqn:Z}չdb)g aB3Z>Ouf6Bl BׇL[ $͚{ϳeO7 Q$-đ+"Jb>Hmi=jGi?3CWRo^HXb--%@zݽ$8_6.J2[Ν;:RGwGN$DIkLhÏ=3:["NEJ_քa":?Tf=QNYXXٙ~7Z~|s)[F#FmVrl:{ mtuy2qЃ\Sj`gX?retu,z-\ɀ8w k2PB=ҩv_lC;X)&ɰ[F!sYa٭)e]\]_#4~ dOpWqma1LQFq=u噻`Knka9&"ۀyu]AntHpPp:¼\(Ԥ2΍V}-:cu6T?`/mH $N8~ ,tc--rSEPDbXcHI7fbx聕kD^( &ZV$29YTqiTS Ls̀Hh'lwpoSyL3.vXdbj֥)2H0S=vyV {d6hahw zeҏfqȲ&}@j܈1*l%${ %Z3垔$rA![01MX޴ X 4U ` 5w)-GÌcΤKAG ܪBB9 MuZ+E} !$`WAV,۟ιh|OӳV{g%ܾ?NLf< S(]X\+]NX ̺w>.W,%=" endstream endobj 135 0 obj << /Length1 2477 /Length2 21457 /Length3 0 /Length 22887 /Filter /FlateDecode >> stream xڌPҀ #AKp5Np w-;{}y{(IEL WFV&>*+ RRb3,7q)8nvVv++7 ?|qwks@tAsprrG-{ `jG439Y]#3 - t: ( ne\ ̀  79P(9Am7V&oG֠9;A k; @IRӕ`2mhb>onbmgb 6+s \?幘9[;0X.p%@b@ ĭf{1} ?`a 2]# (# XGf tppNo^ |"~@w o++` !-f;[{X `O2wy1~edD:QQO# {ȸ׍?i w6'c/E4\ u߄67!I7;4&v^ 5_S-K4vZW",FkIkO\Y.ֿ+FxlH7CJ' |`w@#py~ g7 `-̢,x,_f0K!Vb0K!vGC]+!pt8SCxj58GC%^u\-6p#g\< pp {L?e'+ #7Yg6wps;՟t=reY  ݴ;`/l޻ ܀O{ zIwy`9{+4!,;ԇv<ԉx0 Pi2,9u{BK pI#As+Ls.-YQ^;$DѱHC?[BFu}'_ [/]yNn<(}R +{*\r?+c5bJg)Mp`]0.Sp? -=X$VW2>TAukeޡ1,1  }g.ba%>RS]"43:5IYZ&z1qY ^nAssQ$,=$9?{\ER־9BD2o&fe)Oh??oly\ZX ݨ> oj|?g;h4F/SYuZuAb+KsuvkuԌߝ./3bJ @}%wRL{ڟXf,DW :,U>\zPιNdxէuVp 0H}1@LB%G˦2KF詪1gSx860'7@FiѴ;^v/_{-)=/b.r+oxBf#[Tw&nA_;(Z3Ɨ'NRUwM cylo8Tnj^XڟI5/×yqw/$BqAjWT3u9Re?pviF_:d~Z)>5*aPX`JN~ hͅWUۯR,=g'o$3[f}T`#Ug>Ĭ)ܸ϶F!o[ԆI&GCA.:$i]@ uP@4œ0+׮+W`egï&9$J$ٽwP&u_^ۼ'b$`bU_AAƨQbRٴfᩜ'9 &||P7}NK ^6]#m=Kzy4PaũTn;i\ mO \2A(މ=pՅE|9xqΈQ! Rܼ2ֿE- @v\^o%+)ʼn~wOX+:hz[h^Z .` `~k44`t\.;$ӕ^5WVl$G &=BE6Sf3E >hb?Y:)n%?=~'ζDa2aT@b$̩3VU7k7%k! )Jڍ".(^G@on| Ts#J`$?e3ڥWI*YL8Ljp%Jd׾)dSʼ '.;'Z|O\fn?Z eiQqx`y#S̲ic{ ()b~꥓0Xc.1Q6rJ7IUkuCCEQqHQzbw|-rM+@?Ok WL4!p>Xm/HaMty=sIym M.X~!󝩰O<"<I q1E9͜qJv|6J^ F+&F'fzAo2-zQ7lg;a~\w.DjC#DZz,!?pIR3 ˅J~s?J~KNx%1im\bD/2Aٓ#P:,F)wh:d7K?f*`XSO8x+ظeE_\Ϣ-in=TP\jyƒ\[HT)x QE>{Z7E|*S5$R5:l0[T(}< 3 ٦(l)oٱ8aP XQWꎷCsLK:‹ JT4j7xN;"0ȠOaֱ V,%5`MɉF_p{VIj[>u8&Wv7g?6_1éQ#~u}#F;ʆ mX+*NPqmթ\$8w݂\XcFOzw*+eS\4QU9!^Q+&Qҩ՛_fj9b5zo`iHGRuRN~@$2thVQُ&lCn|XnYУKEaei%"yPjg=y\XbF`9mې]ŊsD,pq@f" -CV2_нv +쓟kTÌ* (&~?'8`޲S6K d7#/k @ȁ(_xH|!^5Mh'$d!T m[]#|ތrSUQ5N؊C]Cr~xz: @l!-VTLN;ER^bp*O"2b̑A~6H.o+ї,9| 9F5b= )>'QsIieZS]aza !۹l*_ wFO ɗ}K=B 8:'iG vN>4:TUUJ^*I>!֬S·3ѷj blǥEMgXH%*(~5wxx_kfWm!2XaQ!mυx򁜃1&r6rb^4,K=9H(5Pintuf6 Z}GئN%FGVd=% J)-wN&_9~HlH#ן蜦5*D"[qu}*Z> -lM\!QviIro ,3}R=owڣ1HS!EB~q/F"OeoiD!"j[_.#qqSu63 Yˏ%W&Ʒ:^Y9!-dë7}#P,X&Oʹ &՛CBz~ZR4F q6d~t#\덌Ljq*i B " ; 4ُŝM۝D؜)e05z TT\3lǔ|KV&3=RcNޥzyDT[Q% {o^wW55ִؚ~JRK{P)olYYF@,O07. 2q~@Ȍ>v" >:6~L?n߫3Nc}=!iLnpJ(ܽ|KlOb(Ux~}xO6!Fub ^hf3 L;lw\ͭמ-R(EK7A˙h޳TȣՉD(9b9"i ^_k`\-uEÇ}V홶 )= %_WTM1jB_h$Dh>Wx[\9M7H,=Y: kr/nxA}_Ca(!Kw@Hs⼟UƟ(Hޢ~1ٚJC>GsrG+)e ^ƞ cn0bگ`WC0^ }E}+H(+d;,/67)?fEtPux=3zVcvIDžaڷlktZR;L[^bx=~XGUq|9!78 **}O.mi9`~%c4̪+F@Կ"ɵαGOѠ]5&?Et?O55r9c7IMCMVξ e2 NZ,D#%efIWڥ%fn& ^7WChY/jXS/U ,D5[j+` Q.w0u|n zƵF@Y@~AqE~Q|:l|Ξg{!@M&uu: j,F\0|Qt6 r8ct/j4j_CYel$ xN#}\Cs0^1vI[Njy/ЛRa+z J 9oóuX;pB*ٕ ɚmSAIRq=T6jʁ".} v@ {bF4/CZ7*~|۞j.c"Y(f>M[VrSk嚢"sb$nԁSԸHe*E60l8VIw5d؂%Ԝ(ܾoĊߠw<\N# 2y;;]Ң=,~NA=܁>qx޶_GxvgXs8)1"wx GQ8Q̜킩 Aw~j⻺_ɕSćCqJ#:x4:ւ@ &)Up͔ vOP5M9aYDQǝp?i-QWzٶW*ÇuP$RvB9Ȱ뮸DZQQ [ug23<~܍f؝gG!7rHR0*@kV6S&Xgr-AQamm-ÄaۂcF/q62~ oX840 1$a;v 67V9Уğ,%z]=HLc9&ޕGEɍ6D]YJ)Ƕ #ܳ i>=ti/UwH.B4wR6:XU+>u{h)vo$n,.BMm}.}c9sz}-L&e̍3V.6*avߗhmu=;Qć:[$p RUW6ZY̔ГVuٚǾٟ>Bn. Eo&:D!~ e5F0Dmh7}WD( K;,;B' A^%rD^xdrӫq l{'i_-JCb̒ӾU{C1mksu:%~"_CͻIo}]G#_,pI@[ڮo܀uYHZ-U{W3ݯZ\4hg .św];#XO!dnHTAHmiXOsR0H: R>OS qDHuzN\K^2H~W$.ZmSxd9I L+wx|咂1A&:}c(L}CTm5nHvBpv*F!BN 6 j/g#ٽu:g[Lpr٦bi罙Te)6+aGɒ%F؂o9t7+)5+c19,B;#LtlśH %M8w֮!aŲ苫hNƺƷb6U)kB<ލ^VaB/Cn3jjAAѭ&q>,[yS Zw"bY W #u 1-f` Y}dEɱk" #ث$NGffQ9myAt&Wy.m tյb̭(9f|zV{A~5zt0P8LWKaI:U=6j` /4d 0{%>q܉X&2#s#͠<0j8^6"]d /&A]߳#-MPH&ȆYyǰ7h JRts{շZ.X};–9N~+2lfQȻp/߱E6I{j",x#MݮjXbյɄBP-JC<+/X͵4\n6=t3.FRx4|DOm,ю<%V"v82Bd9S1(~/Up>"(gRy|4 )؛r˳o㋗ \ ytX$Ac>d0%EpZAJZZ_)f黩mى!~cy)G7WQFD7{ST,* J>ȼ8p@P a{j.kT4]'ZW=5E܆h†'iy?0tDC1VJO]B " iQ*V ́Ό"(daN<'BqSc#S>OS ܡ4 |&WMTd,/lJFNx bh=\jgd qnBΕV45J1YF4F5\ ..H!GhX[Ĉ0mf•rda^-p,oWu%{ЗFcۏ &Aw1~ؿ;»9tT(Pz{&$˛M*ڼ8?cR?,tn$*Ij fGrJ"~] ;_($r)֗"UE_vʂ$Q*BÁ=?i]2buAznGj cNd-9> aoh^M? ˲#C<䐅ZW$7"O3yPahV7D.N"-}֝vl"lkP|NL5xJ+6:{ 6Rފzxlcs#_bp Z-> گ%ujm+q?A ; 80Jċ5j+~o"b3ȫifL2J!_տ~:谅+ߠ+xm]ү8$MV# .F+r,7V_u ƵHxԦQ!@TQ߀6 uQS1#U#<^c5Am/q~} ??!7| 7*θ03K7a4 [횖hmkx$ %G0o\)z9#z+5M4[#«AONAld]ڳD_Z؜CH$瘞/+t7;nqJ#Y>,` w9/⾁;)+ވM<՟/g ŕ{IR&$Ξ8(E}םȍVW!c: OEO(˽XG[5q6Y[Jj}n(XޭO%f;~6w'u(H?x[ O^x.'.XʛN|1=a^(}IJcCZAZ9\^6{#xse~|P,7l9܇}0-8Ŗ hOM;14q{mz<\R/"+]oھ`+mCNcLDrsZ+\%`֪{%a3nc9΃nB_W\Q޹ؗ;|AL_yU Yhou =Ӝg)x*Or!a楩j3@Yjْ}0Egw1B,8:sj (G ei-Hg q]nߚhL~㾱~%2E{(FJҰ %+ᠸrZe{Yje; g%~]\+#cZJ|yǍM|h%N#zʈ8d#Pv9C(ײ ->gV]-RVKjmY_;*y=*w~^sƝrz&"mp~āPo 9H'kVyHįvMջZB!lB\Wu/҆۟vj.h֦ڑBhw~Ro".}JW%ڹ/>XrYUcĚy"m( U4US zaC+N. j4\e}C>؞g1D3t:_rR gD&yP'd si-byvJ_pw3l@[{$;o_ nIҕAN( i$5.Mp`=MLDom|7>Ѩuћ!;sA rIlsPjћ7I8 AK.)bSmeྯ֪me WЧȲr[F; f9a!QD[rg+ܱqsTj |ch>/$C+(]~D<:Yt lm4:C-ݑ F/ *gCFQݼc+Ue@s<ݮڏuby־B-o-uB㕎@GdyU (/ *cXnDpaxqeXʍ[@,ʋR 9 r pDP|ߦ,*@=B(qLC鰩TAAiURk)RL 4qc\trـ%"Sg<!Mo}h2}N]c;sOb6fo*`xkwsahwy pOX~Ay8PB,+IBLKoۋd֯vd byM69I5u(vNQ@T(c'.?'l3}§\-_Utݥo{f, ^9:?sSgXPFyV=ų 466"a 1`mPj85H]?}(&N<="#mt74z쀳+ҌޟffP!6毜}1])X3mÁA =!?l8':cjiofZfLոuV 0H웩ԗYXʹpi>09BU)6x%;t!_"OS ttm⦣lNSDmyb_N0`T M`Ċw kF/:la˞ךWIa}=5"! ~ N>.uLiCJ'8eYeªȟ+ 7e!M2m=AC-PC}c/Ig̋-? +]d]<R?~tqa<&\ Of,ӳp+Qtzq9km}e>L#Hސ;wȿ4i3hU1z5@ Ych#Ҥߘb3)4b۽ Ӧnj4 >do:#f4p\ J#@lW6S+q4MY Tkɘѫ†<AE.VV_ԇ##P>dӸ-"`PɭƋiYJ9:9|ɶ,B9Y e$Xr7 BS[ZG7G]" >sdz  V>r!kwgfaYaha8Č)2f܁$ Vj@wՏ^˻Y-? Bl#6B(YADVCZ0C:~Ά^O[B3ᇃϽ=ڻ_$4XZ8%p*XXoo v*`?X׫,uwhSn|\k_n/>^LL;F1{b؏Nli8mɂ4zR,dFtʩ|ؐHˏZHjh;ٲjN3iP$_MDF5 g\C*< # HT ?(5K/.eԃCu5qiߕbU&OInR8O%*thFel^eh Jb8Ueh-4YGSϮٻgv$[ҳZsGYH*1l" o~dz(tsAoSMm|L! /#i%ŊXOqO(;̲l(M''LYzc;BDITxq _YPn%Ŭ ǯw9.f߀cǸzJ|ϙGx>'BF)#Bwfr!ӊ.!Z&_3ﭞR2snI"Z%;UA!4UlQs{n|;* "񚴪:w37!*B|yy:󗼼pJYˠ4Nچ8-FY Q0+B"dt&|㥾P]pHd0YuDžn3ߋI_=ߓ^_=$2&O˞rTu )ԢP.=Hi4:Bvu~3;>aNC.aki()Z/V _n%o>R.G(>vYʻs%CjZaYOPwѰ^mf:<y%#,Q2!Q"Jdg6lPu*ۄ7fוֹkhpDŊ?f3oFT;=+t{0=g .p >ɦI'gmHfJշ.54(נc]nFbyC" No3#zp8& j;x&´MU=7k>>Sh&b<-Ir2ٿPEVk&-?Hs^F<575"P)q/!o!b95Щ)F\Zx^#s]4X#H[֥G"v J^T@FL\b@YĖYӂaZWpz7oA}$*;i,UOA`lPU#>EѣX*l4e4XD/sD ܝ* ?eP t8䔘D{vv'+# &RU3 <⫕r>v)#||kb̮ޥlEtRiuDhϧYŗo*BPq+@^/Wh5py]  t +X/Ck/Bsy1Hf[z@Y\vJW-Пzxn.Eb}Xu7JϖXsL,h8ʳe1N*jFJB7ػ\]:"$ OV_R:i M BxcUwZ.E7ٜjJf;-Os((|@ &Փ_ Ay1^~')]?dou#sT_jhɯ߲MU_%.aʻԇ Zg3ͫ;NI[|"o]?仢y4ݫ&sd'f%93MO4OR02\i {8,|OUFKa aWj1WxCcs񃓭 _/R9zݵ9pٜ+jz@H'a+CKL#聤X]f`sR_G0"/ǂN/BlT`5+S0`lRW/`0zd42]E% TKEsZOt۬O`䟦yd'T ?%NIT` )'Rsk[p>Ꜻ$ĨdF.(Af2F!0Y{Ph6#O o4?n{`@ouˁP3x[5.1 i*i J3JťSKn"$Ie/r#WcaBr)l_:IzvZ~Fc;;]o5[9*4f+/ .RHX"/m7 ve7Y2ޠ N'}b1H|cTU& NA54EP<>}58yp'%x~p=`w.BH6=+,[x5G&4IqXa`d;IxMeZ]'ZcEF{%>=eJzaѸۛX)яЄ(.E/Xjԅ&dӕ8aX.|-wx/PڍWA G+ܴ&u.2#'O ?`ahޑ6Ai:0/80A2MhAiȌα ;п2"-gW~=^Mbw?rE|G1WMfH2[3&ݮ$CL(6[U(8}n;NXO-2WPņPUB,ở9FFkrΰJŶ.V0beGO> $+';:~yf.^]rVa)u5ʁTx<8趽jh R1}H3iFk:Hũh6}׉H'^]=įv׵j!xʡ@YR>$J"@Ч nA/ AL$|֢8g'1YzpLq׋b@ܲ:͠:Η(o*|H2ўW}Q=;OLA!ȏPo8A#ٵGNc( i1N ^*Ѣh :|ŕ!y uB8,Iya=]!1AMR$ b6JfF($lIrLtiTOD %b1h83R>lh+ao)έ !rqe݋dRq23 kd5j3qF=*G{/ -.K쯸H67&_M|nElJa-a"TTPÖ < b6u㜉a I7FIQ@s+Qs)`rS_ tװ5 H$@r%Xkat*舶Kn:?BRPx:%)RS=ڐR0e.\ Y&us= 8Y]9U}c _T@fvZxʒ7eyKv:.ݸ1_`LW,$U "U[VI2bkWu^_rT?ijI2 m,o $ 0z+ZJЧ6k߹ [XkIA'd)-Ա.V'HFTp4 8W *NRoyp%Bܪ%qZly`t޺tPO">zv}tJss@`2o^>J=M O%t :_xOopxjCN{PZ#:ղ3Me- yGՇЅڣ|l-# @#g,&ྈA$ũe1z_Ӛb`dSыH74IGTҷ5X;dUp@gI6Z"~8Iw;l؛i|^]`aj#L`,E٘Άw6y]G\i N)`dQD. I endstream endobj 137 0 obj << /Length1 1683 /Length2 9349 /Length3 0 /Length 10437 /Filter /FlateDecode >> stream xڍT6LHK7 J03Ct H7!HHwK Rs9_֬53ώ{~u Peg8(P<@ ?3! ˌl Eœ P@@A{"y 9||"@ O3BrAZ<ug8Y C60;OLLt-t"0pàH`C"]yy=<R v0~!ay/$_E xy}{~g6D {ID($YWߝBпb/x_$wO'.gwڜ}___i?G!=?)xC^n_  N9%BB.jh<7H3os"ݮ٫grɃ]֕Nen|o oIk{m?ъ3o\}/6- _@̹/D tI.Dr= >$8='cPۋ(1[ᏽ^0wHDeFI~J<4#N1SZJ$o^uJsfֿ@[0QQ򢓪^nQMp*aL>\P_T;yoʥqʩb#3׷#Kgw ӡԳDl_P,=/~Z$ml#R{fUh896q=ᾳHzױ9 q@Mfnl ڮiIQyE^Mv&:IrVF{F]~Kۭ8eFewrՕYDتXc/WU+.G޲埘Tv 890/Ji;&щ<ϋk&/hr (RZzEt="{J^-iξNhd oPlP`=\vfe/uxǥ2 h3/9?rFj+=(e2FL%. (%~(MeBǫfuIV\ mEwoe4<~&{g6x=l^r)]I>':=n5+H̰Ą_9N재WY}\l#)Gai5g\r@wRHelK@^F-5Ya>#ف%sGP,\9x꧿5bۿ!r̛̜5!KÆa7nl-_Jg_,F+!6t.@L{i]Mt\/iz1[+H3"n0b(N\sΛIXm-$qA)+oDIGjwrCL 蔪((F+{21Z$:<="WA1= o>ʧW; HOF^0ݥɊޡ %жH 3Xcu[Lv6 y5D2%@H'ducxN{#Ěg>a쑁P;b-л%lb&((D"TlYIVj2~UĂ&T9UVSFd\ʴ !$Q H`mY*1Hh7z}'ϝѤ GjV BkjܾX1PP hÅa6/8~r~hzrQx-Ma3uSSVc(9S|tZep?ל(:CV[9d(dͱ 8!xʟ&kTɰmjzIT'K}%&Tf"c^EKvQda7iSďA ձ\Zc*AaJyb#ΌZd')T߿ ,X9pczkPXHY'R垜:8C.w`l@ɵA{4ک숇gR/+b8KZ#=MJg40&ܳ7/"8\8ylrvH_dG^,4g/kZy |(߮JdW U2=$OpW 2e"}Bx>Ri_c-4r(\tc"ǻ7[9Bc G$f<@6c?`NwY14Uw{g]DG;:v#rm%b9q^4XjN*qԠ$qMgn7c5]5)?"(3f.AU"a:?"g'_RՎ@Vq4a Q93e܅iR=`1|xQ샗2v{)y4ϻdxB(#ܯ5,;/lJy[%Amu_y* )=s'n{>_?,ppXEi]ZDq w̟4E9ڲ CKS+ S $:JBqFvWTb4쨗TCL. }q5kbO2~ Vj]fT U@xQSt KXJ=6y0ON`gTաqM28CP󜺯2n|>M'P?v5ӹPPɆ(_LCՉ5D4 lL#YEy٢ިaa|j@/̙Wq|3cY*Ucû[w"v\d m<*} V9/Y\Ր h&!W>oVXreށQL])̧q[2=r_ڥ%eqW%lc A-$Mupf8/ Kr'X\l-F$DԊSiY hk6o۾i%(ó$am+:1ؘo{V8uM*\he~ Hcx<oBG/xn?t׈* ԠQ&ז{*%Fa+$ob9<Ćs7Fɟs)JO;Z⧐Ȏ"8A%~I;z?*8$ r`^Fzm(,2c)*y;2Ft0N _PWh= /^qzuْǁAُ8,l6pc^Lv~iPָٝq89؟fAQ9$1tSb,XYK6wzm/MMH=}gQhtݠ%*=#E(WMD^^;9Ee0.R!BSwY2 1Q׃^_|x7_JLt~`(ѵ{MT'Qc=foR#T7&2ua}ԳO CNK)O/[sH+tB,'nNIIXH@kUD0R.ہz6-gQ2@ |cJLOU_:$g jʽ*חVmYֲ2hʻ5y &U9&>}I<;`ڲiIm{-^/vy"a̴$QÂE"E?7Ԇ 9mVpy\.aT#wOyhP(;lx\rS}&J0-Rp'\UǵNjP$RN 6P):) (͒Q:#O19.|oDԀ 4l Y %pNZ $d>JeiO+ϳmS\|- ҁlLNj}3 ֍մ֫m8 BȰ[UsYBUZ3#.OR`2mBsa|>ie Eͥ}ن#{*vz7}To/:r0 W+5+D6e"";53+/3#3Itvlв*]kvԁ+fhmř!15o57ĸrmOeg^:9ظ*.~' 3t1}mA<ԇ^ qi*Y^/RW"Ůoyg'3)EɞgA*ǦwqfC57myUB=X^c2hFS hi pv>ۼ_~;7ٴs7͟[5*^ )QrY?:iE2Dٟ憾=nt(-D8 "uCemOCD vL\rC:wA&\<=%lTډݓ_)v2Bs@1ouk^3V5 J48&kʠgk<,>{3^5QtPU.cKxke7a{;Ix>I|-t9xM5*=t1Oe.\3j)aێaX kwA4fyB}] q t11O(\[=EK`gsյ@ vC|\ mE6 QN b"g.Dzb,k;}riW1Cנm MJkHϔټ?v05wealӄgܣ JRcsvcEy4f5o@g<_:}#]ҩA q p@GeLtUv,!8r|} ກL7d9Fqjf8kl5ueDf n)}Rx;&FޱQOܗ|Qujx[fB-MDh/|Q 5i(UE*g$LՇBK@#f8#6%n^/ͬYq7j䊭fP0TF?h)8jEEGv^cwٓD  Dy.^OS2~Ӏ;jJT]ГFBKwͶPMFIwsf.tN텭J;3nhWr9mDfyFLZ#@imn {+)8{^P5}"Z>趺]!56'P+;8#qγ0[U?Tc-d4f| sx~Qm8XP%Ƿ[Hj~Wbr1:]Ժo>A{sGHHNWbT[U/vԹ*ޮmS.{;:Osf6fT\)!'hCɷA }ԁXpWG" :+b]%dҮ_y۱ׁ9 )F_ҪﰊrG)הxMSW~s% He|s#\h("Ys[T"n` PX5`/yRN`毜tog} >.S".7<|&u:V{O(\XF X&AGdlRunrĢrb6TϵQuF#,W:ɂwW ͘3,jyERaV]"^W\7=J3Vr$RsZ[Kca6{)9țw# 57PW_Nb´\B7ƍۭەm's9H?C|*w yO^NYr$Ԟ˫ڷ&vBszpR'Z`:ų n!N6zOa$7 Vp+I]¼>n9:eЄ_jG3[}`4dW2X>P˓=X T& M"|3wv&HH3?io!8lT>;l䏸u>\BVYUۊ(si+C|: 4c=Tˑɖ/Ŗ:uxx>< iTGX=0\e(Z%lw fmJA?u?t7.fD-KXuc虿z7v9!/3yj&\V~{} EN֖Ao4Zi4YD_hpŮ*O6lY=U€&e)ѱWS"+;ZKor若t8^-7^(f&1^el2d7gnSaf*ٯame&ɥIW520OLD*"FNSYpeLu{!ՎuIlڹ땛h[+RK3;5!rNTLZ0S7}}4fo*lض]5U{@& S{bf/%Lj$Z Ƨ(?@VAO-;%q]"(yլ9x}Uq?eHSB CK#n;iSu@q wfbsVWRe%BN|c*"*JrC%NhjDQܜWRWt^s/iP c*" e|*6FF6&8H=S=:qe|kModQ9pᘒ1ǛȌeP %ĉ%S|$j$AEKܦ, s]_z%]1gvH x||)Lq-l1QjxX5'+-CGCtV^Oԛǂ&%Ѹ Uُ׽̓ i*] !o ]D(Ws>)11ZȚ 8U>";)⃳c?/)Ş=}1oƲE^Fѣ;XōHQ U҄]E6咘gY|#=b}pj^2><_C`J,SrJ N[( LYN+%9B٫%Ǟy5:iuLbEk9> C endstream endobj 139 0 obj << /Length1 1569 /Length2 8469 /Length3 0 /Length 9505 /Filter /FlateDecode >> stream xڍP\- -X5@#ݸ[B@pNp w . !;$sU2֚s4٤ y(čS %aF92\\PȸnO6YS*Pvwp99ܜB d`+*;@ @]6nOh`r-*% ܼE(j$tte؈3=`SRSjvrsew;*S V2PGGd. ˧{s9Y{Caġ ;d y2c899 gҖ跓_'?Buzn. vrqn d? I{\__&OB }* ,*'- ظ8B|^!Y4vO ٧.g?_7I ?7|V?bi7$q̪Ur>́6]^ + 20uUl\{,KI]rKկ ]\ިOBr=뷆S <5׉ 8d~ AH 7phx ^Hzq=i_)o$M[o'ۧ矈'?)K..Oo??y,Q栖"avaH=ٶŦ1.`"er!v{iS\rgK=RdkfۭߝYvτ?Qt$;õ~RuvǻU+:1 )Wq3tyYԈnl̸G^X3Ӹ9 ,{x|ָ__,WpvВÝNJ(nfοW2ًFLhk7 Ivb- >2GL=r7pC.VGM2h3lO~Wʓ` QΎ.zFeoYݽvuE6HbjLKUXF&Ё-U< c +Lѫ9yՍ Ug4[F ɖqT:멗6BYD{ 羕RQWWZ);^SWy#ȕȁɍlNg Gk~s1`KN;>-?捤u f=1հ;Z CѴkViÿf0W?ǫo6)5衮'1b>&p˳ hEI 1 1Xb lCBwHi&c&WG^׋S(bsuE嬬#cc]feW'|Mj'o:aQyQ \CnB{.iDp.c;:HZP`hjvꉳ>k~qWOdEb\uf!)g5yxqU}L)hźvHOHr;Z?Vx`i>i!l`*nE2@V$dUo}k:?:#U,m`{ dT$ RǕ(U|薷A"[T1{Fܥf|1"VVytIg60u Q`g-C'Cu4S  {>ƀ<˘pi<-'۶eDO/V#?],Ƭ23-uMix9vdWP Np kIs{^p_ZCM/me']@:"%/w :(f7:^irW¯XÍ̀ FFiHJ1ќw+ʫm|((VFM0^]ggS]#A#lU^Y0R0ENv>gؿ)7/Lg*-VpF|ssWn?~qx-xW@,hqYv~ٞF~.ӧ1\s1֧ s#4pv#_eZZw 6'E*R8X-wVU~>/;{(hvo1ӂΘ#}_ɪһ}^dN!h!}`]5 Ὕ`_.dԯ,`P- 9]L gc*cfH]xY`#P< sz=100ASƛȀre(Cd^/fNYs$r83WP-_ò$Uy  7 H#61SSٝBuRZn6\sq^{5nc<ʤ4DlRw[΃6"zN8&S^[BV>YjMM禖SI *fX9?,ro}C:,֞߯??TY>QW錏~Qyc"}u'Q y26/H3!No"ut5ܥ&U7s.jX5vP{xֆ4)Єe<-޷<: xӁ#J)՝ C.T.]`N;7`rB^5/jf:} '_wthlG':˓m%kqƦKI=Fj/^?yow=Þ~W0y.8$n"G?) ח jV20sz<ebIRSHwZ&ZnArC녡DZBj>%P)\pSD+rYc2"y%en{ SES|+:姝g閣BJm/9d.p%h2x :}Y мke?{D RѶu[sOn,YxPqx+ /ai5Î 5~+>zz_u^ w43-˄$%Y/,b|jDM1)㝇8D.>]. Yrv˾O#oض!\ 9*h1KjC fp/g=0-=uD| 6 M;V(pǣwFMdVښ*f3(*O\o=M NK?(B7ݳ Tx ]dN8F#VȽTzr>02H/ƁfJqps{S7z$$@q-UPZ,UdKF38dzTT-A6ΚBa;ʊuy*?Y ɒmky6S5SR/q۔Uj88 [[XYn?hfO KP,y1BA8pj}3TStj^-Qa.r(B* z*LOFuczoJPk`N6i *Mc=wdֳcHoN1x!}a.Rte^!F tJۺ(C׈i͕5؏}@j&up+O,~Ge)AAD$-Xsп`Bt?)< uNxZW6l=^e1݀cg}bH{^uB0opH*eΚNwK8q7祦~R')z:-l#H#+1ъ)aD!PVG cJ̈́ՙJم dMG>*7T8.X(,gofGDmGoA&|Ա.r Q47dy::Bi7Q΃, IC?8Si9 hu+/{~HM܁=eR1b?g0XBf U]c7XN[hI4 |lՙH7-β՛h2Hcde)^V1u[KFՑ?xvckV7ؤ-y} \hQRE}l.K00]*=23c~LI/ F>Re9&nf+&.o6\f9,KǗLQgǢ"DL%]'>^|-w-7~4IenEaxb9ZDHXw!#Le:zC\o%A >.+RWZaDs.o *魮Pߕb^F(҅Q[(gk/pE@H7ɻU{c5=?OЄ+@2pGgl釾Ì՜aʨ;G;Hq=|i̤[G;v]Mi\޼kg&W$O7bי*v?Ԥw3R7 "^~_DdrZda:&-EV'Pe3 68)&s+oëe3.ژq'Lk4xƜ?˓,㪉]]ۓQZ qygr^194*uD?yF}e+}AMEQK9gd@tZrRڥNg5D0n[Wb(W2jN;yBXr)Ow>;/=FE ~ґj8*,oF?(VI%v`]Viwt8̢L")8UYlja6,B{:pb[kTa'neC U_i8F\em!g$gp|Ic;1rlZ/]Ni 8.iYq$Mްζ)ԙOOw3^Q?)VKg,UZKXRdJ2%|ŔtWXt1+1esa*񁐠 *bm4guKJVd˪KmkcIߕ{.9 rk !ߥG<V,QWOBٌ?.4e3JH@r{7Һv]R;UD-s{' s}5_G+z>_:}q=!E i˨p6Z 2Se A~W`2`T\)M[EieDqjSve,i弊v X:W12@,];< h-*ɍ|B@Acѕ{mə3ůByI}kdlݪPG!g߆wr9]e*perIQlУl7k7l7(aę_GA{VD>{K$v"זj5o5D}SMoسuH`Q^2X*++ ߦs7agu^}J\WFѲPXZzEOuĊIxD"[3u"6R)ef*WUV7'T>q#17#`U&n[K%ARPzngEE\aۍ\ ,J8}JrL]?$\؉s4_LJAӚh~*N;PNp{6[wm067A5B2*m[xߧTYSd/vЕsC9Oo`[ߡ4Q[y4xʊ6t:9-~j?lH\B!*%F1y?3 b$ iSB Ym "? ^&OR "m_*4x8dGͧ|miEL`#x0v3Mit44ͽYR5Pur쳳\EmG1p"ZeG;7M.x[֎ѕ oix]-Mw="8vdek[lCq>E\UlX!%) ԣ׋5ڼ,Fy(zN%Uvnȁ#&F_Ƥ"y w糖?\IYnAs(}{ aPN׀G袖ߺ@GmMNBAߧD`y~|4DB6g63ƞDeG *`|g4&[zռ)}C[M4p]$I0n"sp#! Xh}l)w? 5 [~.B,mI-v8Uez]c$j*T2A-l\%B.u1k,.wtO3ȋݕdKoI@VlBוBBJ6躪Ҋܓ$|O,eCQ^4Tޝs%f+MGJ6 0>Z ']lT_&%Av2r靅KϼWRU<8鴍7/J+,.Րedh^w ,ن>SW>¬`hkbV0nVf"eqwMLmq2~`e%Ԩ&)"|a(9F;^3/ tҏٙ1A̌ϑsbޞ>kV"uyUGM{c |R~ endstream endobj 141 0 obj << /Length1 2471 /Length2 15653 /Length3 0 /Length 17096 /Filter /FlateDecode >> stream xڌeTJK H-%94 twwJwwtwwwĝ9[wZXQ^d:330DTdUULL LL,NDruȖ&j̬ffN&& A<QC @d tD$ٹ9X;='ʘI:@`alh 3t2ڀ=ZT@@'1Agd`hr0Z8@ ௴6c@$[8R::`1lktTd v@e<fG/C+l m,l@,g':_֎ X BJCpɑ,2.hW|@cpm-7651+g;F5[ {g$43 X=؜/'nvyxy؁T^@  `ba0Y"&M)p a!3Ͽsfv-wDiM_03 @ `ppsאCU'^p?{B _[ T]5Y17&qgk%+0v x /r@ g˕r2x8![8[|(Z8=&Z;k ["Sgfb?<[ω#x:f^lA& ; 1mbfe a~O#٘C6|@A f r(3GUQT6pֆC2:;.8/'W `ο識1{u$X9HR:_@c1oe]`c+k6(k]Vl߹* T@ACEqZq w2x%P'σ|O5uԇ},M^\@dC%C}xdG<Ahp(H twJimw (>sNuWFZ<],?;e>vAP?,B{;p*a&/}Rгs Y@ND0u;-4v,=嘕Ƙ鶘3 ݇ɖΕ" Y4; jm>û߀48贅8*^~~CuV51'|k@OSHHIٰƍ֋:ȃ?:|w',-B8j1S&g;g$@˾q{ [2+;3`S?ܵ6~JJğfܣQovnWdqP,+ 咓}(u`z-wwά$flvj}u>)UpUgOI<ڔ?DXPs<2S a229,rcGPZS1=+k}\kN^eOHGر!.o)+U7t8 0'YbR RG ?3Vf4X<I{ ^M5߽s2wD+ v%2X#]4Ywvf 6F::3BvڌG:Ϛ/> }w[WߠMGs@Zҗ?e%ʑ\8^)fp}h=%\x\n.A^m"#1zS푉H3WmheE!V=$4uVGqΨMC)2A57M07ډw$3DÉ:Y~|ְ֞V/->~tZ]*'%cͣjѓ ]Tuz.ˢ7><쬛K5{!(}G"/̓/?a m$?oݳ̥Cy^|L-# Ok.x\7ydtwNQԗQcK4u?ştt)u?5R1c=&מ|T6_tJ9"E29xsMF]MBr5i'LU$N8?7};CyVG)Ou]%Nl,:vd_DVp'1W^qOg+ǹǭu)bt`g7wrx0ُ[5 xĶb '׵MS <`eoW4½~?S6laۃrY&{(=bj??ҋ_ӹHլM1L7~6ӽ:O u-erFf7\>`H靧mfxw3χHJj4ax`2y܌";,'xR0晚.Ԫ8e&mL`-OÎƨ`eg(t\jh{k|B矜mŐoܦ>J魸E/@)ڼcC5 Xedr2iU#0IOώVx<@x㽻|m꼦? *o WG-״O@%6+yA pSoI “6?pz~aL+JzK Shƻ2D $nJWtq-o()_"^;1O=TsC&ôD_|"6Mw}^zX=Tf1R`G짒s~ ]@)DP.* Q|Z7ܤk%-ˏ#Mi&7:w!EH^Ϻ1g]w'$ih i0o[ci;kN(5g #==':5] !i3M-,]c^I}MTo}MCf+tb= l&M>xA8iÖ\\zNc`AК iv$eHQgS_#흠K곍wBљ/~3~1kOiT^Н*xN7<.Fešt\1ͨT?ޖ/lsuЙq-mYR4sBJɁ3#`dD`Je29,>Cy 3/Of K0B8hC$-M H 6i<:-2oH|oך=V߄~bLnFW8V}]}Qk8r]am,Oa<GH>tj͢$^|,7(H2Ih__Z&"IZL6!i fjFǠjתR$E%߇$G`&x9 2n_D9J "Ri/{ntp^o"P4^퉆xC~>7*ZK{z:=F $N$%vo}]hpTxViH"?ck 5!F2 C0]&ۮjaW%hu5U2_jCIޟ/tPd`mP23p]9#0ZdgGy^Vz?wJ#%r% !pv8՞PHImxҮ_!wb {v Ge [1{P?23I&_ĠH,< ^z?u$Ț?jj6f{~WdMG^ Uk@rFC:T6-)i7 Na˵T9p9EP6ve-VK)1.5d~_V>+K R~*dI$+Rǟo >[t\ wny](-E8n Jbп!dcb ew_6x'dPf23RMwk*Md7k|MC ?c|9?l2yT݌ɚY>u $ ~_OeS8±޲8!p e#ᮜ^dzv5u 9n% OGYBmݡN[ 0gYMhS}D`Kh1 1K\˄HHPMԥr`+գ_ȿD:^a`V$;eD>2SMj$-qa־rtrGVsm*TԂ#*~o=m7CF6Dv^hH7sm˦fD/WQ&@nN##ZE&lj рZ_kj?p% ơoE;G)b>'c#ŵAygLjf5n .UoTC6,VNI=CT`a* z`5/]Öڏ8 i4[8MIx#(H g+(&tp75vh};<W ms2@!vؤKuk? \p:lue>E][& E_c+ISPtќ91ĵP•:?KvCjD;s\Hz4WN\^ZeV1PPhFqPc^g!sS *34eus!8\e-%y^ W0eKP'D &lǢqW[֧.s\i%▲ӄ|ۚ+GH:Sq huKrƚc<|a獼l60uĚ+`$o+/6Mr(+G"]+{/Kx2q# t .l$b Rec{OOOpxs\y -U>*Yv|HrcQl<^j {$뚹rOJk'>L3 -#. oUVM!vaJo pe1'%C|%tp6,1|wvIDͥ0!L\˖|@|hq0z۷Վ>T˜7:H[k+bi~ؒ72\pfXbrFe-uO<[?ߙս!s Gu4VM D}Ym7Z<UO7^ѯ7,`2ۃKQ AДb9n>۔4ڑM^%Ùn>J`uH8 ~,ՙK,w|5)pUV-&sףBC_6ag̗͍)|&;;⠐pa[u[=D0KZzxq<3Zrk:!DoS?OPt,~USEp$YhZ챹wFX^g4z] #1܆ Rr/evIb10@sE+ۗ@GOCj<;x;Y-KGC}/+ /yyO IB7QuY/Ka"}h_8xͳb9 X.ƧYL;-_-o tO>ĕP*+ ~#9Ǝ2(C<ע o 1ȴiH劅+3M-ˉi̊ Rj6M}g=2; ܪpXsWd"$'P5hGcgk*V̶-9AtPhZyB:J B1O(ºp Ep۶ VG/C^!Ve& qcKk B:$rE,&aW˂<(B]l+{a;Q񦰁_4.6E%njU{O.B(Z//:Q^LMy;Yl<8ށk/+=ow-H7 f*fZR{hJ' I1J7PpVZ=6g  %2h|O]pfGMɛ>4v4^4X ٛ@$榶Tɫ<|kh k/s4V7Ă2yw娳S`iQŅ7ґ`K޾Z٫7-T 0w IO`0y3IsbgmYL!'lnsG eP rV6ƒ$C1};I̬|I|NJ=/$ɺI{ KZOq&H!. A~ ^_"fvCuE=T2L52ۅnYFt <*J7Ll&\*oD{RsVUe&g0pj$)Y+y(J 9U&fGͅjYu"&g㠁'>C{DWS9:;.4y3MrF|f yO UtfI)1@JLa2-ns"џ~BC+^lF\h2-!'QJC^7zDlW9wݠ!6ڌ*>7&Ч_&7{l2;^wՔ !2pc)c%8fiiUƋ͍XƩg#H;;9Rj"~Cƃ,% 7\`Bۼn ʝT6>ԘWx)mWsQ;Wq}8] N&( / a 67LDp kY*ZPW;$ 2BЃs8]ؗ)3 ]L{ı?jC(5>PCTSSSE neVqjsB :jRǡXi=Т xM1^ؕ0( tRʊ̖zݛ,eA=[~i>@k_6ɪ" I&|t *C_-Л~"NOp+sleo,NKӮ~s/edJlLd&(1Ywßh\j8}ELκ J1m ͳjtm6K\Auu{lզ6=JsSm'7կه]Rk_LoZj)vg(M5R4 W~W9j4a/9|oR0ϵ~JY :Pqe:7F_NCG*Mr:è|\Q=f-c`v7-cbpmp(Q(. 5Z[nq=6(-L:NTB dҌ{2ipQ-~ :52g@4\]ǐ w@ "ҐJם7洏Rt{3%lE#q֏_^ʭ_I…:|{z9vr,O#h޺qW5 k6?!: q)SڸZ^!4qrMkmoAnt(ֻQ>|M,>'쉠D$ZDŽ!C{فfy ѕ6'zp/2TΰkCX|fhzzƆ^5ZF |>+ajIWl\-WSb0,ŕ2/(;: ;I|ͭ%BJ+>J;joslShmbLBVHŌ5ؽa#R,% x.6Z>U8VGLEN$6@ȈqЕyez"\HcBxԣ+'9UqGcfLY[cNow~fJp^n( KJc3g7?QJja4 [vWxE wheºNmJ;}{ݍ@$[n!C.Sy<^הSU8GI<2L }<]*/QNr KBy af nԻep"ŷM۽~7|qvXy܆0~T6.jSaY[mA.YB15v!lkVSb;՜A-$aCtj.K! MX3C IKm~݌]SF/@(bL'63{F?逇14dK}rYUSު{<'m) "V-6;G 84mq-+1yTpJM DIIjCR6"<8e)%=FPd0$J~p`8R{hU-ѵ˺lYՇUAC?{)׃v)-4nW[Ю+rHYfT9T8or$d][- %927}~G7+GcJ:^(nj+<J[/J+*aQR6 Նmxip6j-8AtFvҡ>!+i *,465aDզi nxݍ@@ܮk2{Jw$e̠,^Gɇ\@IˋGO?h5Tasӛ+]0Ӆo 3nIMh6nu!Kn^so2th44!1Mh:e[FK- mIz}U"~E]l X2\* f>Dnf>/pd"b#5b5[OX*g1oâ&2b46_M1R!w+N`Z^?+j>P7]Jl7 pkg"ph~= kү;/*ynUfj*|C5إ25Ɛ|:Q4YSEw(T}o߁B$XўOeG-:Twr!Р{0ej `Um{SZvaO_oOnK osjl"^SF՚{$h!9ԯm, 3Y@ٝ-ys\@ ^* !5H%ө˺Ջlaܥ=~Q 72֕(WZ/%Yi d-zxh GH\J@DǴC+-Y.E/F,x6ΘSWI":PoKVM܍6*ĝdDAlU| ~2(o>ߴOrH@tl ?]iRӤ^^5*Gm92,?d&O*qc?OeO %Tގr=1鞞$ְX<ʌT2ֺbttܚ%3Ijfr>M2T«>LU] ļKR'$5gZ3? a̓$?YۮKf6{UbupT&/1h?Pld|cVYjD6,'N“s"kKz\ex:"N8ZB3b-ּk-]rc,}X)HQQĖIb9V_8kjR{Ouك<(l.%Umo%ԊcTDl톖i?"V}or7>u^Gdq[%H>!}nB:`A o]yUB[/CEWL.G3~QFq60)GuP$=CT5_bAeJ, ˂\i% ṅSC?ӏ0%=ӆ[ o{){&6'[}OKGTn8]> t=j`L?^.ܥM(s/IXa]&m jY 9^SFm (d>sj'NOo}CuWe?w Q_rDïe[ҍA+^=PJV#:'MusK\HO i) I5:`ګ*ziJzw OቻQqRP3Sf3Fi--+/!yܶrЏoͰBmwCz_~x:#Cⳕ)N W J~oo]~PxXY=ٻ=^#)7'*(ZdRs;Q^t-]^ǚHZYN>W' RAN*ñOZ%| jƴ1ө<:q? eYL[Jn9n3wص/az%ͨl\;hWg!Kĸ˒OaoA}DP8J|)b{ #]TT%}wI8O-a~E:jRf_e—1H B1\3rm0i9 jz*0qе7RE#H1Qm"ꫜqbsLѢ!'"ĝ"/:(U>(|tTAoGXmPdyϕFoZW; shXe3^CT %aǴvj-Q%^70=ﲬ[-a|^#Dz17DO95|? *SNq8Oˢ>{SYl-x'=&38MY~x%SH4HEbq5~>ް3tyz$JPPM+*.EhH BpNo@cTe>tՇlQoܛx*x"sWxOװq^S>,u PCU"Xʖtu(ا^Կ}/-dH?=bFP.wߖe9BSO듬tf +|/GE0Q֘Y\&:1/3[DX7[R BjZPjcCN1o34[h9g}BK![^itKi2|mK;kߊG5s138A{vI缟:1'˥CWxcO'mS A3G$ѯ oK6.AcAgW౥u(@+ެNQ7U̾='2 aldHV(JCUIdHAŐ+8Ɗ@!;sX4qutT*RWǵ$h^y4lKiܒ~N}qR1 ) Q-:'08N *.d`IDŽq"dIdbbTSۏKLfEP)TF-K|qA{Zn>7tAy,r~9 bMPxhbjٸC@êkIjHvg CI1Ю )3mm:y^W&>۽ f58|(K{2 h諒"Jc'YQU(|>}T n6|CNQ)"ǻLƨ(XhN%{}מQ keulj+9}/%4tz'-n)Ֆ8yay_BlH>_>!;RD6Xw}~Mok>i *`I=ˮ՛nMXTsU] ÝlLk}c66KՄTa6S)B7,BcrN<+$]IpEO Qg~ 7J0h>=Dp¼зb5_zW`G\VL!nc ytd L}PX "'=cS2@sޘQ;4)ΔGe ({(tfA)bsid -^sKXeL顦H㥆Qvw3 M& eژz 1gGqd,[y t\FcuǺ:iW |q?=1Jd ,ؖDp]_]VGpS,O|Y;V=5CLLB7<ӭR\n߽!5OdbܽCD L+9ƺm1+;;-3m&D-TWI}>)}:G#E%! ˇιKll̬Zt3mq鈽,^Q<K;5VF3$y&@/k0 uZIQr DM"0CT5E+!g"=N}ۮ #,<Ɛ3.Xz [o)Hd !en4xQ3pO)~N0ܰ' BPZ"e cZ &^ҢU,1w-.DMKRQ=If8+_O3ȔbXA!PmA뒰Ѭ["ʺ~֒+Sp}KGQz +>glS9ȵmE^]nϔ10kS]`퍳YmMhyRh9E=&9G6<-lkmgBMI? s9n _CZn= endstream endobj 143 0 obj << /Length1 2545 /Length2 18452 /Length3 0 /Length 19913 /Filter /FlateDecode >> stream xڌtm Ƕhb۶m5Dm۶mIchn6h}?Ykfcs(IUELRL,|qE V ; %-?rJ-=?,ĝ& +P f `errXXxc0q6(2.^֖V< 1r3:[M\vf&u3kruucf`2sarpexXZԀ.@gw9௒J&vƄ@ аvB l̀. 7{s3.PvX_ 7p+&ffv&^ k[ @YJӕ`bod7u*Ts1svtuarF€,io.`gwuA3 w/'{{ k{s0wsdִvrJ$B#8YXXx@'̊^A58:8,@e-w O"VV+him':H '@4~>g0s{[?1:KRL`dcgpsx~E,)koYPC@o,%4# 'o:zMmm[7W(:6j@sk7u5킨i"e 4Wv5{6%kl*.,FV-'ɿU@oFI{3󿖌 `l$6NN+h́1UppFH8̢b7Y0KAf"n `2;Y0A .(A .E< .*A .hA .:/3/b9v 6 bolb z>YW쿈4[pp%C㯡c6*?;6 \@,/?@& RV(:ohHfbe@PdjDڃzP}ȀG *`φt6OoBn@?6y^)/tG8A.gӂJt5qG?@23'*n 3x@P<@6PP@PV@P_pE:wfnΠƺH]a@3U3PFQƣY%#LZFu'4چ]{ѴAI; WV؈/Ͼ/FIj G_Ε^2j:j},trAQ)|lޜ_=R=nG|^dӌTLYdGHGu~ `D.2Go-vK?>iOeyZ> -T,.:4ߗ !$#ucGf 5֡t//'-:Ķ%^#aTQ4 ]:.y{H^ eafsSN$5ar|ob qVCJshZ/GÃ6u\,J%+!tuZ\DnӼ^d%bÀQuѳ9:%}Ӆ`ǩE4Բ^^I mh;hN]Ңpə2Y8YAӕ{CtT<+OJu8b/ R–jYU-Q3K*Qj R 3zMz76G4iSI'-Pau~ Sכ7`rjd:W1%CҶmgx80رDiyX>kZr 6‡EߗK,wnBMjgQ~.pJ{+7f{̇ǫ5Dy}+YR8e"8ܢ[*(Lۉ2:M~ɏX6#:wkn5$%c_7d˿Ep^ U{8XeW8~_"{ gu/NLoĶ [ʊln"|8F\xSE_嫹}"w D[#ڲy`E`mN.zk k }qtZ|) fy[RgMs" ŁC%RjyiyN8ϱt'lEDj?6r{ox/Fu0e#K5^p)e ho˶߳ju8}hZ k=/~bj<&ϱYDڧ*ay ţMXC#~3@67G U(Rוti2qW^xNX 5d-G{]HmS~h`4}:/_EmI~|<-&^>[.>jډ;3 ٗU&y-*d)u5Ϙu8_?OC 2>&} 31?DLer%rJZ{$c,tj l: Uӄa%OFUvmgqW4LB' x+fqsTߵPdiwoS^=Шu ;CZN?Mn^fi8qu;7|q{畬.X]!g;\ s?=A=7ׂdV_m\BTC9,ˁLL'6X^ 8Kp3nE<qe(>wvKnKv0JY';5oZ[HUJn01^Ҩ4 oȕAȃduޓ(ʃFfzob!"z$۽DLJG‰'Bdia߯sWq4-Zm0x5_0 7'gb'WބkBέx* >A=iSN뤆AQ|5udTP%K] T)qA![PMc3YܧvDpEPaaݥ{e9:yh7Ng4TO:oo$[*i'fXRYwh͟qbBN T1hQ{K{9M뒅dH%K ?0+YڔK ~[n', V!+07#4Wr=a΅4h>wvp,0kE$qi:|~V(b3oj6m켉AB"{yi$̪~n H:̘tnao:/ Q `^J^K|s8&>5LN}տpj ϼ=6| g s;:wj]eR4_iNA<)>wE:(8#ZRPGB(Š`00u;3mGx(t#ָ}Kցcs~祉1 .}O2uBγ%gm|IpGIcw}H_g /a܃WÕHbn^ >6#@*e|8o~XwR\ʈ~L9[-wu3z: cN.#:.I6cZ1:B¬c~Q?{Fn`э9Hdi,犌^9~W'-mcÀעk4?j۴# }Fʲ9s>P^3xE=$Or 7kKyU};/Lʖ>}E`)jz,&8]# EVMPF\y\x*VzD% 3В5{ɑuc!wϺbR)]GAVWHxnI8AAԮ[^,׳$iJ6{Vq5~!L+YNi|o((UrT}؝z4Ce'D#f͕J'CcMnp\p)a݉a3mxd?BgrYl2~L}@l=`lO̓=2^]WOAr9-q;@Do`{BXT{h4PcQ$L q&;eJrհ U`πN~P Qɬ!"ym5W&Nq8xLIApUȮ%s痢F%M6[Kk,ՠ,rG?]YXy# KTI`U>Y Rv@81] KL( &?" Ȃ9 e˂/o?tʍ]SYhEWQ|v+5&TzЩNUeӑ*]~M0Ŵ‚q3#dc/3d> PfkZ^ ˾MM-dER3}~{(Ѽs*.*TqU;gh!nfҿ)"nvhj, [[ȝc[ŪaCh8q&_<% =s㛊d}(SYV:yfF0#[hkM$Ǿ᱌fH{V4>/ŝ5KނMGl'|i xm-A#T]xEOV0ATdHs<^G =<)Jt{% PE+1Y:ll; FGʲ-:𴭈^'w[ :K'=` 2O-Y7'9#!?7 ƕc*Ӈ.-HtfpNJ(*OcY$s&pəU?\Dz_~^6 e,ghTHQDGezYIc0'Ő㽦ʒM #o̍Xﶛ}CޒҶ7WSu2Us>16Tĩ0찍uHXYhQ鏻{%=(b&6ӄ$f0dfWcH%fcG ԓ366k')xfa_~]0g;P 1``8QQƕ'rFb {VN7gxXݲ'&: ~B=WZu]8 i`a9oftiNX_YPIなI K/=I y{UrO9]x;Q`Ud.{NB '*s؏c4eM_˱j; ޶j !l˃-&p[Dy#L}DS)ۻqlhO3WR$3M- -4_>l}ř^!8v>>_ ; Dkڞ5Iu6_Zu 0N\]\*>`G Q)KЦ#͉V?W `i9 \1I ]9RmM{` [Ygȡ,+^:.7r[﬜D# >;s]U顙Caن, L۽Kq=7!J l}xB{~E06UJJV*Y kAԩSo`}?@6*ԂAkщ{ʯ%}b`W.C+023$uK $dB"UQCawzb ;k / \& 3}x%SF:!y\6/Z]6ٓт D_2`E%y͉KiYd+.P7%%WϠ_4}ݐk앥yv4>s -b_]LJ*z^ï,֬8sI CGkV$ C|;m"|)wUrn-[rnHڻ;Ng!1YKΒ3 YD 2 _v"F2x H+~ƒc]2|oACoT͟4E|Va`8MMi %/!T. V"|zB=43,IeY17&cu [ԓzlC3;pl0gJ]5d-ֿG'xkDqX)ӊ,0,dφ(t|Wg6"i_=]~jEpe/KҮL"m-R!akt]KX%)RY; :Qڇ(ÅuEe&NLs_ $q>|x8X 0&}t;?'sSlk"rx aBB'$nYj{z5 '[`HݖNiSgA=Up/¬AFGaƐƝOC_mS]ޯ=l e+Crq7,$N%>S?Maw2V(P<b{><YLƣ܋=QJ6~)6yU h#\P 1=)T2Sջ'Qc sϿBH1[zUΟ_/pЧEqz%)2\}xi[9aT]<|JC ?>HUrМhR뽆Huygu8\*!]7mY 5eY鎄}#d>뼚ad?4NaGgCw7}ۢ dw ggw]axIQSo.IJrr'`WhqG+OMޟ}2,gUP^'cƮ wNOOM$89ReAB8ݻ-q'zێE/km}%_o@yvẙ-X2U !7cN.^`B97gV)Np-iUZ{wUݑV-p @W4${-vߍQl,mw}:8A~F{PL24xƗEm0,-2پ'۲\Z;^<m:V#\n̹29AʓsCjcCz.j$RiUS:k0-m$CDLL}};h#XyviGA ߙK:H=fM,y8&OF<6sHx(CTH 6G7J`<ܞ.4_q\אU4?ժ9vDCP׆^@<|qQyDڔ%XB bIfSl!a*ӗ}2 +~P]ٳ.¸e2>TV[!sEv.ЯŶ#OPZ{Vȳ+HfdzAqe0:*:MwC*Y{u74٨x+S9g!V/LWLyo&#;Ea G6_? \ImZKŘVC0 3>AGTۼ"@g@6}r0ջ)j_,ӈq'fQd}-gShoHA1PЧĪfyopܖx@$LBj;uw T寻jcS:\?HG'& &6!!RQqZ:"-&r tt'΃Q6Shd짋[2L,У8 PB. Lʘex310?;ʥBk# 1Oj)Ugmf;Etճॎz<*~zӽvg5 uC'D{';MNhf`z/[i| 5+f[sy#Vs C S`-{>tKYܸ\+sDUU%L^?"EJpirp;k%w`u"\BY~h3 lϬ|9 n<=v NYLQ$ 0L G R$jpr4} *%w(ުBYv0S\eUv*{YsW?# z"%:Iݽ-?x{ɛCʑz&Q( #R6 _ߺW-̟p;wDl5qnHӃ ZΡN_ĴiQ4cVhqpY{+k3sժ nL.t#\lC"*I}lpg> rHMDa.^RE2vĵ%f̍Ȱ l[/$ )yt^ƈ\E^0N]k l8 5^x_5Rl}~xOZ΃0<`23k^vj!].Uuy)Ģ^@g1.,:|q<GЈh(x~qnV sWc2P:^4OY$AFu?aUT8A;rk`H[ZvCSf΄Ύ'^v1һB653:] pׄ)f̻߿Ce#翄r9I*JP:X-CS-!CdSZ-?q2o- >)B&aMH'!~ԭmWPFg_vaB**rtU4>=Jk)L0(x4n!u\:Yne/\T%wIgk;!lVKAo~|5P'+" QG)XMR=eLN3ڣs%ZRl }ԁ6.j9(>sexXŰi2 O"Õ6{17nB)oqT;pD)Yx9N#wZJ%I%[jqީ(n}Wؼ[>n#.6Ƃ6V9WpOEDlYTcAdd3x$/NYBQ,EXґVcUqBJ(o>;Wlm c K'H`,,@ s&)سp}*(Z.sQpON1dݖ9ffI+0tT)M~} &s{Gutk|!:aI7𗣤5g,q2k*(1jϏ#;W+"s R#K]4W~7۷fLHwO3۱ϳPYPsfv~Bw~OD+p ]E=!ݯ$R PAKTmͯJwlu}2ic5TPw=yul=wҟ=!-&y[nsAGAFM<@:])y>{P?|bgȠ pɗ73؃];JDkY\& +=F`;)|aJŷIC6R o7,vPn$%QѴ zljdfF+D>_ٖ~Zn2 Wd(X] =fR 9L `R27ko# ^BmKL#֤e߹vZ' {~e "!UD`ĢwL9ݧIW/Dߩ#݇/v35lײ2j ƛF=+PZpœ@_o$6@.QK^xQmܽa~-0k+_ ,}g:7̬Q4{}K.%pI{Y7uP|XPP_(6yT ډhjKgw. K:E_=rHC60벨BqRX[Lc1WP|th,5\i@( pdB4a2q{RArGњ LmK-QަS~)KDZWBŒ"eħe= x ZJ@JpM9AQFaȻBiwȐʖ  `M]oT4 ( IfF|B>&9Jw+-Ca$>f Y5-6.g`jJqVG x)L:7Si(Zt>+ۺԃM_5$NRB^xo/Mp2EVAl%C&D&Axy~4O0Lzp.N;Wr7d[ۂ=_e[73~3mJˮ>GQzK=LqצtysT|Ej >(NQaWU~V^-qhof=doVG F Ƒ=[`VRt/J,i.ďc7J|Քӵd\0}KΓo;:sb*68&AT\q rsMq&߿Z z]cKZ)9;d4dx5ɫ6z=V1[6GO\ nIwif3-fstrx4k6O7+ec+%ݸ<`㘁,Hgl.J%J8U}f{' WP<{{[PfSIb6DeRA u&s?{,=7|H$HP\صi [mYm,KPٳ6s3Y`|Aip$zTt VSe)ތ ?@ƃk#} 0;|8p 4 A|h!ƿĹG_wʴ< ̦3=-ʹZz0 m7xΨl3 Io!@?Z W %NM20QT-C+6.B. kT2)vpY {t?: Dcx&ᇳ:݉%|8ж*$s].w+pTaUuwcho@Sa+ L칫2rC*2QN.%K[ wMSsfq0RX+~1Au>[>v,`~JkF蕾*K-skZ?Bqi9B_tS`w7ѥA SJ, 5g>_7m\.&SlL4a['L`&'ms*I PB8hB][qLЋ``SbS2z:D*?(D 4sr]ᐯ(p$gzoȀU.$m2n¬ j' )/]n-kjUlD` 2FEODj:p:wT[ ӂ0_ig?I]+jcfUc$61yfXQ:=]YE}ӵ7/KX11έed5a}G65S3((St#0I!C%ڍ?yx(&K4Qb3X~uB#{_̰hKr~@s"u Z+E&"h$&]BKOCOwmd4,w'CO@Oz;aE^p pd;醟@7Xctc!&nEP&lu@Ij ipmOqi]ޝ>$${ '߯:']~R+a qA(5SdSO UH)]_Hjg'T7Ds42VgTD6]70YީPְ#0't|։zo\Zd카~|yš_vKPW\|u9FR,+-"-dWXe{* 'X |T4xcf,`Iuvܒ,/\k5r'K)QܟJA|W?ҒuǠXkj"yCYw zQkafȽۜC# /\}RTY/%z m}6U [;?Zy-PZ&؅N{m^[e2 M%)B@gS^~at*$J\OKԎY}3X.l沝i_K5Ʉ1eH<=:iN5i'n0jW_~\Ww~贌ܯ^Gq}bBN1 8rȷU.{DخRxƩMtY!t40> stream xڍw 4mDJ<-,u.$c1,!-/)YeRdIY"d I]F|ߙsfߵ_SH '(09(1(T^ Y(xM$qD/ 0d( ЄHNRL)!`(C* $a9$t$+# `**2H¡QEq=(̭>g -@U3yLOc80ϋEdIv:ۥ@±YYcEeݫaj\Q>|킳☤/]ȱ3z9BK='>i'X:K>ܑ i4W褶so+/9W7D^Jix=pe"PF^no?qtκGF w -;ݡTZl֙5veڕ i]bs(qJSHyfD%} Ŧz z:52Ł_^މ=YgyWz iqp8]L05@n+ `zבt0lum[VG)́} 8sˤd x$/egkJ)W-X0Kx6f;?G6']OOhK#'j ޝE> [fXKzyۜ((|^~EQQ#Z9)|Jf0x;,xu(+QH0:KBY2+3{RHAZ])EtLi#;d8t! hɝ6fwrW!e&Ǘk&aK-=x^󴁁oxu_^,7i~'DNSMt(? eY XI^O|dPY^˻[ocn›bʊXgP{rn^xj!XJIw~KXJLtљ WvwJOV ʚH(z6uti9l0Sj[vo,TS*kqwR'^<ߓ(cY=gq֍CkT[]1Ge(}k6Kfk(V^Ukd‹o;f@ UTT{h_y+V"TˇT·^0)hsFtfƼOجU:p/e!mP¡jvϔ̜AX -sc= z\izAϩi]sO]aILֺve]sQf6:AyGcJGV,?hEbj7=l쎑Zv7(9V"w$:ٻeVM>nVͤOt.zf 4 |Ĭ鳓ґal<6Eʫ/9Xg>8?FCEYL-ܫۂCZr/m~ U&\&m&<ɺKJ{iMON0]2ZųuGg9X}הV ]Yr"V;Y LugreMydn}CB}:|b5;fY]{ƋtHƝ;Stm,$/Kj' 'f%]"I"-C-J6%-TtB'* d m9?w:m9; G<}{1@E˩qt_i,žG;2 b=ꋰB됧yƨV,Ҍ7mYs. jS4h9cKFN;GU8E 0gz{m,|bS++)X.Յ/^-9='bt!>` }_ z;U|u 򷥎ZU?ySH,+,1&i]=Pήeqot%׵_|P<}{3Ryo%<4i (.?mDҍWĤ ^ 긛.ev>2ۿN=*f4 *TRvi?['8"cWV Ig=[y[b5/KLeBHU'M턣]J8{~fۇOFYoc'fy#nK%r'.b+W{筌-^N?E 4T7TA2k{/@U*.)=.~4vW8̻ W*FǮV~\JaIbV3:j:by<185~$64Z Qq; e[NZpr:,[-B=?qfAHZ11;\n^`{[k$#V,B^dL^v]FS\;]&8#2'my倅D.K?zt  I>ѻ7b?}[6`.#啃i;&\@}zPȔt@Krqb~^YφQ^uATtO9 OA "LNՃ;ڹnV{O(oYGf#&\W8Q7˫d2ەrT*;NG $V’{VI.Ţf5r㜿!0t=)K?$Vpzc] 9_WmRBV킧Fsa|Mg15|lRX}lTʍŸ<"{f7)gqiYnܻ[$V==h+|O~_MM}$wCm=A|Rx^t~rRA}C# . U7?*w:y:FFOpP-t~^;uRpي]uOoyV/JҲ,"+:-GMdEZOVr_?q;qR$/ÞmG2_@r2L~jw7$NWNݷRb-BXR>2&-4NJjl+L2_Tf'nk$<~Kx[QM2GwcGeq2kRvt0X7 {rro<2'1R Bk}nVuoOٓcȉ5Wm endstream endobj 147 0 obj << /Length1 721 /Length2 4672 /Length3 0 /Length 5264 /Filter /FlateDecode >> stream xmrg4ju :ѣ D%.E13 3ѣN"D'щ5DF^7]Zz>쳟˥A!0HDT`n `P<V2`pb 2^ `@D!c ȹ*➋`+\7"=`tBTʹ @F`N6NH@ CqA- p'0h8oM8?Ю,Z-A t4x5â>_//u'!p$ A!dM m<?wt-w p f?wrCQ t1p 0YP_z9 $N醀#VB- ]O?ڏcN;z?<50 ⯽bP? \""X7Oa#i|žc4׻9$ #d |r o Y {igKX /(lok} (V{"B-XOΞuZjuӘ'OM{$ަ,}'OίmE3;1|KyzI!TB3`eda0$3;6/3?=KqrytnEGu2rHtn%MbԈpsڧ BJ ;`e`FX(8WD"Q/]*\ұaRƨoV@~CM…bԙe3'3'>]}TJT!{QyŦr؞{ } 2%.Evpz#J, Jc9u}-*;\pf4ѫ&wϯ,3o;!@ LGl** 7$WWpYQ5Ϛ5# o9-ͰEq?sHf =R=]q'b."_{88  8ixxs=e26R>-MԜy$l$Hr*ReK\w:(_``M:ǦBԲmhR@NP >ѝU%' 13atLjgt4O ")<u@VoYA38IG 4_?)o~[u.ᅬpLw$,ttQ[ \6Qb})Ŏ72K@w>T8~5,N乁c-Tlv#$I2<-fJLZ摳lru^Pd<=.m1MMf+km(=[3/71,(m}!\.·ڔe=D{ωM^ E2 !w/3+H6= M4A'Z,Dƞi*s\F. ONޜՍ 6 ۹,W!#%Xfo߷90 )!Us*@>i}ޟ|Gv-z C-d9Du1N,tA po%ǞMݩvIeʾ&Ĵ6flVk;;v^-YlM.#&l^D3 KYOhlu9ZM:IQtf\jwwŶLaG|-;+qm@٧ N4 8$ZTcg3-KVn*?CmY;S^cyס8'"R\R.E(/^,j&Ny[뙧}x0Q;>vdJKo7f>!ʏs5hr\TesnX͈S)lY,W%!%?b:I9;D>b60*/꘤p&8y\/+5D 8ǒܚsϩRXKIHdݢxN m& V}ih6{͎Q z|yń'<3reh;Xy3E ="A`.jbZ_+2f%vI^ف7Ҥz3q|Po_-g畈 eWGߚ&PJ/$/32pDqDwu&:`O#4) =lp7X\~\m+r-]hQ"eG>xTh "#Ud5i\*!' xAE@}oU4gnş5Y,tl:/IZo8io'"v){gdXߟ;ٺE+u7{</&Uiѝ*v|0l (kN1S#k>w?{Y9Ay|'?8*Yf dW(jP ]~:e!=0iټ౱]PEf-|ѝ6%~R)'ryhz`v,z5bphѵ1[$1ʪ{Jb~Կ s;_<9|9t*ʝX|Jy~>M۩^L(ݡ ֣KHڪzԴDjt³ޘy&m=t9+r[lS3΄QDgy+3f^x_hiޠdd357hm Oڻ;=F!}7;\+9n"jqK5T灁?"(l ,A]Dn,,fhaP)Feɻ3o52i@{;H8dg%lo VUÜ{#gZ#K 2f}{UZIݴzEW1M;7I^_w󱛍^1cŐ=!m endstream endobj 149 0 obj << /Length1 737 /Length2 966 /Length3 0 /Length 1535 /Filter /FlateDecode >> stream xmR PSWHD0´*"IJ(T6! ;T0$&O*". es%JŢl"D@& u!әΛyswz2#Iqb0]Aز0>d&ښK@!☷@k!XdLK"Pvy#  T *T,*KP2U! Ġ2A|y  +E2T Q1p ;@c:I! ARb\|eA|usCr#T6+r̒ ,ј5%Ä*&JPqX7_,l=(FC!Q2YP)IHO a$L&ĨNFKrTE2|I!% P2:00X&B$%)IB T)?)} #8&K+ȟV&lI}W=wW&5^\4Wf-KQmˮΩVe[+3w$J)=d@j)܀7?˦:lǚzIzs%e6%nRuFܻǖWE~Qq}ď9eh8št{$ꎿ}'\i~Vx]p(;Cx148nH -5U4pm1t:i%Ė.+w5nnm>m:]d_&5;R@Wt_lj^il~ >i[|V .Fْ\I0M;үȆns_l`WhA`,mk[ෙ V,<^uZ>8\秪^_r;9J"'|S/v6AJv{A/rlqq2MXFϓK6>CwyMB+597f]fiÆZޫ{V4jA-8w+Ny׃ߍo`z=J)%CF+M|_/+LgOU>&MXD㦯$eE3;qM3ٚQq>\Y?|dd>18_b} endstream endobj 151 0 obj << /Length1 725 /Length2 15948 /Length3 0 /Length 16495 /Filter /FlateDecode >> stream xmctn6vضm۶gNVl۶mZ콿~=zUWWWw9&=#7@E\UHCF&lfj`/jj 039̌L0dG/g+ KW տu[#S+;+g%]ōٍN*ffWK3@DAQKJ^@)!07s6(ZdL]̨4&VBofή3wvȉ +ȫDTEFYۻpmfh#d?X=#01LL\fV0 MMrfxٙ(E\͜rfql濮FvV^C2-?*+q+O3SE+vuv3Z?s#gfjffpϬ:z 1(ȫ+i O,fo`jeoPqO#gQ۬hd /f\<:J=73#' d_pMܜ]M?d2343Y_q0 Nm -+1TYa^A458¹Wß 4ۻܕo&63;& [y-&~W׿SǶ3sMXRb9v*C`6,Gډ_[|ң@3;F )6x_ wCm`YPx_e-8%s-J^;$tŲ!r0Y~ë p )SɫZq77K:C# F .{=jϝ!*)=9B_nu2`A\gvLX9 uTl47/i(i[t"\9;#!E>#}@ٌA4Wg A2ĘKFS젷ПUsU02 _5d xϳ${zf6yi^5U^A S!}w)!h %SF;rB90.3=ltf_<9Ka(:y,op#E}r#丂Y |/xISؙAXgbER^9 s-'p'w٫Y5(ӕ|3uVARb$!.D 1@0]I2 g#^pTNYh߽Y~tl2 W*TXQj*zl}t-f:nVMoPX"*Z_n[7*JSkU{uFs'Ldjig&kh֎ wA3tݽJnKn9筼6[o/[x ]V wAeDH~3 }Mg⺈w;k}b21%:woQPK"F\H1^g pHUcf Uovey1-غ aWڠxCL|JRzV>= ;JHA[;`ك;֣'-A!W^ aehīO1]eV O \ =V' }]^Qc(%OOznu<ĜQ؋TIʪ+eA%8d$ d>#gشgAnK}W;2(G5}3.}ysA4Ξ=pdZaQe͆փ$NLjJ)?ɅLo/IKcR!q1hHSEzsu3Mp[HR9"Wq;ED-ˉA0Qkrl(RDRT2;]b׷}7C輀썩$ s4|ɏE]Txp8TQ*}XWױZs۫ozMZǛst!G{~V7N]j[vjxa{L뽱dKc݉Z]`a2&+Wk Mv^a&nhkS/S#7R-nKv՝fŧϴLBCr=m8p cM7=۩ej H 6y'{H@$_MWӦ{_^gf2  B*|Xv-@!G9L5fI";1uCD(T>'p}ua$cc }bu~땺W"tFB@ ]ӶVc+U?0|7$:NW6U 0Oτ: T|w^)3)2ʿLXUܞ~c]'JP2^Yn9g%:N_1P8-vЍ'~{"瘲dzr~a7kTU(jߎyw\t}ƠD񪉸abR3|g$#A^!M{/pU#_§Em? 0i HGam4pqh@!#Eb. .lXp(#\u8"*57ҕ:S):e%eOÆfpgq| gy%CHNmݺm^˭Ƽ]IߕXx0J*_s~.%#]VBoKd-OSmf=mu\> :b( Xs'Jcr-t#wN%TAx @"t-'3<0zCVm*O_> 3Y%rqC{nf \a /E #!8&ѩE(g{`^ay 0"0ۯE&ymC#@;ܝ`(F[.gEq`Sn\^A=.#x腾*/\{9ؾ %:;vv_=}~ZA\7x- ؈#u))I*hof1ZOe43R"=)g*̱$D'Džs3c11զЂ$`LV@L$ 芋R? 9:X<O@WrqAcZդa,̮17yBt1f gtǵ'&"e mڮ 2y ]E&͊bc:xjt:F!3.\:8nty}\y?Z~*gG:{2 HBHU,-0I6v!rQ\WW0qaXx-ؕF(ngm( 9FbGzG YЬ /uV_l!Iar#?Ol\7"2 xϝdwP"/B`pϷ(-jК)j(rgydLlJ^l% ie9,b EU]#'s @{ܜ辧Mv%Rq A>tZ Zjj7?ݨMy+mI\3z'F`rACDiV-!vy}]!h^ UI!Qʉ`Nf?_ E'B_wZzl-ZB _O#R7|pX5J)(P~$hlOq֗߉UI};uA*8qp)/ sna5;]<7@ "{RL+.HlQn5q-&\<2htԹ2z.Ab·uTA??eSC[@0C6T3n&, bTU_!|Jy(9ExףV6e 4'>qR̭n$𨪼S4?ή0LzLQb]{& }qe&U2 ,N2J!F 7؎zotwq1hu{*nղ|Tk Z {hۜխ#4! 42>9N}p$X-o`kkc@&Ds6j,z}tƟ"*BflUbQktw3|$͹GŪ@U#dƀ6oZ9CPQΏG:j% (0knb>f7`*%FXō("یGJ84P~ e9Ϛf*NMW(s &Q ;H膿 *כ>p*,}KUhHJ{寜BZ=p"꫚(0#%)XI|C%[ݖ@45QJR$AU%>"|{e-A; <]brYZpl0C#bѨ cH-'{ -A e%WN" ih5ј*=(VA8;x_jD]|K~= H"ܞqV_Q6O0!ve~Rmܪ}:;3$qJ;*MR*N±):O'ah9 Zsپ|.nЬ#]Y=J{V_DeQ|x\/sr$7]5NFp(mLB7S.4f`=F|D, *l>ELa rC 1",/hR;Mr B4*Y9r)`ߍ!fD@MvHw>X=:rϿKܻ}&Ր;[&~Fiz)v$5BQac!788\.\kV*tXҷp,qX79bVziO('UU Bڎ ,keX*ck4 3ǫE6-3I"#~ϕ&y"`6(eGP{:kiEc [PP,=cVCM=jph6izoOxSvAb7`KidTi[EԛUSx^~Pk*<g>tT͗*υ "`ew9i-(pL~w5JY)l͟-Pe]R,ŝ%FL&F4=' qD?q )3q뽽ob5y%+ Ҳw_ᶟTl/nH9/@JD|#HCp-b3oDǗN3l$̾.yFH:D£Dv"]O@?OSyqd^D?E$d0P?|||Ղނ@7$" WPHԠ=_>qĦ6! _ˋ&s7'VD9!Kf+>U.Ө I.<ՙ@"g}#HkhmA,r3ϛUUUi>ěGgrz鼥 #,dx{kHn*xȧ1zWI=C0{_wmsHs2ء#Β-cwF5K/eI<*~߁_q*.),+w |(-b{2Q%xLaA,;reJ-JusȫxK8RdWS퍙} ^ `ŰFK$s,%ǔ"C%S;5 `AGE"q\UXx=6~^g9o_sd XW Tߴ:gسFlp9ҕyO}4 s~L;Nn Q-zquk#esmFҊ͔?U7drў"kwc)%;Ñw{=LnjҖIxL {޳lیUv`GH$5wtN$ J8f> Tԉ̿sb~^v7V߱Qb}+H1PǤYb1<:,4^4/#o@ъu524Qx13bˉN&%5%=Q$f5d" {^ lBc8I)ni+Hf= ZLtjl֪ĕ;Q P|LȰP~a90y3M8e U>F@?OYxm$G#̲F;i_3@8@HOeC%Pɕv]Y[}`5(qz;^yWmY1`ڨeO9;za0{VS͞V% WkC aBMݼ-VWҋClUZIY$(M IAbrm휹V1l_aAjKC]P \zb=& <&T WōG*nG]("50]QL%W䲋us 8 X #mdǢxgt%WR +t4 0:JV!sjZ,Tv> "[`X 2.6u0V~)ظdp.nRn"X%\A"8]e|X -~O'78vIQkN\G,^wbnQd" ER>-d 8҅AzyXnkfP3AP('NalҮ%Bj_5 F/"I;!(-'U # 懏rΑ8 ?5X:\tL} "o,CVo=Ymc4-r ƕx\oN;.H R@\/ |sN[fv)GF=9G׏~4KMpv]?m?B <SQonW/ʮy. 'Vv"3R0” g/1| ,MK<.j5_(7;=ANʯ`„q2Tu&"RMX1 >rY[P~rnsF'gB]! $i*21Hy .oJyܕ|}vhvax;yY4Ĥ tx #ݟu3籍Z_FgI}] BTllC1 KK߅@HTY>ٴ̺{n#IKɡ(AMդcqɾ)D]Owfen;E~clp 5 G}V7_%%,x%Op}zP+)5`7·9{5Q H2p!Qh߭1N9>^cDL>ezgIrNpՇ;p،V ̬Y}`C|vuES`qc:~X I7Յ79QH:ס\B/i/V&>DuɬLujŒiMwcEJ7=~A=q'QP*G-_ {5Iz]O+N>ӋKN3 %~0qzPieA G>3/3y]M' ˓pEd8щHT5N~ Av7 Z i '6yTt'T f2=4ynS׶61nwGu%m.\SHP K7Zkږ? EpW @x@W#3? d(bAg^r> (6ohpp.@=Sw>h@-Zw* G-:Ƚf3E^@:=ٹCt %A[vr1b wb /Ζj-p |=,aT\.qXĉ.s>mqN;z)k+㊸aT?/۾3tSl3VES46o<`Z*=Acppw=hWciJc8]֨}EM-ȋD詝%فoW-zm"<$7Ԑ @`"Li -3qVnn_DFc )QƲ3$ji@@IP['RފvtBJ.)U1diGRԛIךl[78uw%ϲjK2 pysv@$G™26dpMH*7Ҿ-de QL2;zxTsMv5tVE# KFmAI+hwN/0@M<'-cXH;@҄7J  9ʗG/{*[ӪR@A j(5,!R0H9]c5٪9"$;}O(:a"N)F;.YږKȟ94}NEb錖1 sOվVsУ=4g܆l"`E$1D1}tĔ*MÐr"&vޛq:v{$ ʓт!]c򙬷᭱ݍCs>嫦ByeDli>-eTa;F;far2лcS(ceX~ubO}tr\JE]Æ\KFiK-?R;Jk\fkyWsHFʧrg,3l0B}$(\ޒؿE4 Mg[7aҵ¹/IɁ1iWK fQ7"oF !B)u4f[nۃYK2@(ÿ!+7gn=VZ :kM9쭿bpbiR5Wܓ5-4gʿ"Y $3l ~Ja`m +^%+"G~G=e}QAR&2$Td+3mB&223 ojvς /});;aŧwKaD\mMU|.hըݾ,ߥ4~[_P)+ӻ ed 6.HY sj^?FuC"i?A/;&ăd&L|Nmm3\! J5{ KK6V3Y?sު{hRkG_A V0iC/mCZDA3CČALx"tj\[eJSX мƇӏ$+WU+=׳됰6%;U'R⍜ 4dmj#$i.}ʦz*6̋cA u=ZuNw9?ȣfWW!&NLOlh5FUn9c I'Q W^o!#n@c?%/4}ӈQ6]ݠm&M)Kokq ~#$DfR;ҩ]_ҪۿV]zv@=ǹ19{9fZ"qxlV% 6& dG3@bLzD vÊBmĚL8qՅzΦggh4O͗ [.*(KϢ̃$l~%n"15ܨBKsb_+g-}m\:$m[f݉'Rz&]hDF5T|s<~™`$(ܔ)3ix4 RBPl^ <D uMKEٌ9* U2Ē5KM`0 HlpR((pujh+v9FwGkz%s%}?}A$w^!:3Zj\@{Ed*UKl`vHf4$ PҚ#>a4+ Bd1rqA9_^qZn,њ~\*1oNHg3u <4_0*gL5NpH86]|Aou}Ai2GE"_a?NW֨ dMLxVO'(G5Skz㽷Y3}l8~x1e.v%z:c^|;PZܧdΜF #۵"~VGحnAŌ&9cm 5P&eHxʨ>-%Ps_ɒ5S)p3%A_zꌰ_ UIl7]@5~D p 9$R`7CVDnSC^=ܧ?bk&uY7 3,.cwHCq<`iq,* ['^P @o fx%r˧gmU8 0((˸R\c$ Gp3_p˧ (B`>ч |Ug{Hv$Y j =&M|ˮ5J8]eh1\}hN Zu_v|wغ)4 |8Z0Rʪ 5\B;U7_fi !R܋~=)[Qde]g v$ߨJ-ݖEjiZq2)0;N0z1R*GI{['gM0皈$ 3 Jb_[@XCw]L'Ӂ['qSpL..IS !U]h9 ^^EE<2XRdljog< VE#SQ x{{w5`(,:x,ْ}^᳢/xk 86y00B6ZVb@p$gƅ\x;~(o[_'a,S-w_$Gi)aԟ ~L(O~Jzc}]~ґ»{cE-Yч8~8hmVЋ>5KNs K讁sRnpR4Ò;zkxРjP *L ڇ4\a].܅TW$/ &1ųf GRil4X$0@kN͇ +{咀1j5~ nTmkr!#<`*O#e]IX^\ch ' 7~x$W7>DpHz0զoc@?1NtJMS_\Fd[Ӛ>,䄤=^,]ƹb"F݁_{3ưJf-ceU܄ϯ냚 d\ "ՏT*$ !JAb+%(Jh1 3}L{4P\/D~+I{ubA-FQ >%)q6 0kp(;@PP_;2sb*ˊ_.|.#]<KIVthK+q)OF |?qIFpܖA0:_PCXX\̹4IrOlefB<2YR,cVp9ώn1^|.o>K&Rf}bF]ЛVΜVbֻD$M&)0)l`("̣c H O{'dA&ΊA?W`d gCm)5NƁ r<@Bl4dW+[gBtiּ;LF(TEpl \,jm$ uM/~[6w],}WiB2[#Ni'ȶ[?%FJ`I"Bl,j۝W(cx;V*TRЏ@9[+M10jJ}'fDPP@Y75B6 rbQ1EOQ0N_9h6k,=ƚY^hlCC  7 ?:7$xa] ֺm|O*&ȪľC}_;ɧJZ0D@)m_3Z9F007YA"dZθi| lN0\lsL8= S]s&"AHT\Eq2D 1!菨 fA6& YrOx;AH/=f_GV_00x_C&uò)GgNjyy-{5 2.SPJqݶR8zwu7r|T+Kz6nAYt*QՊU?:>GsO,\1TeyhRSsQf k? nQm%\5lk~U};lSQ69wםqZd>u-vr+ oP$FM]ySA&Ŝ Y؈ ZʭDcb1;KJ2C!࡟p_Lv^)pIN:|hݝ)1z. endstream endobj 12 0 obj << /Type /ObjStm /N 100 /First 836 /Length 3132 /Filter /FlateDecode >> stream x[[s۶~ׯc38i;Icf@KSYr$*MϷ%QXɴ%˷ @SeL0L |ie2cZ*0#qIgud`&=ɘL( )S1eP2B6SLeeZ3a|:MPb$4# 1Yl*gypwB'?'s0YqpAA3vA.Mr@c<Å ~{o0]SVp #d,z w0 Su"r e IfT$=xXXAZwDfAXhA| ȀO, A1̪x !@>XXpϭWb F% i,م q.#iC60XSXk:Be#dTfQde)2d$%0dDas)m$Дx̠RҨ@~Bd$A!d"3+ #2K*0d)*N&2.:u_/U1&L^ub2{;~:L0]IhCRƘs"O?E=b| lM"nF35e(Qj:=_Gba>'ŗ}]똰 }' [6xFMӊr hy£ }[MhgܝܺXD2|c&eLT&*J߿@+󍙨[V[3hZnZk&MvܑtU#jZm]6iRomL 1nwhc[[lGE^^^쇽L ]0qxƱ`{2/ބVAt?cU]ԺF`CÏUN O==WNj ٔK1\Te/🇽QZwGZǏiFC4O2r3Q!_Gi:Aɤgs޴*x^~/x4nCr |:<ӋA>l4,ཛྷM.^+7 @sE~E/M~zM>{*ETuXvmd&C+VnwprWXmTMΪYtny\*[m ZevV7moeh?+)Y).~А,῟?'Lo|CC ݵ{jU1WV:LeqޕX81uW+)[iC!]zEne%fA5(90oa>eECw-K^X k1uE>eEW U~ҋ=AzskҌx-$8E&D/]Dau4t#zw)r!YN*BM$:Q3C}D >j1Z@M=zA kݣ_`I:gL X|Ęhoe7C4q' j43uy1j]>/e6=} ڔO:)˾ 6  >s(_7-!=?O1ɝc]\񨯉`-K`?=J"Ta?M =L4U|\dO[r6A<| e;W,\l3#gx Z¨hc9h܂t6fF51V'/I6+%t]xz|xrj%U-ŻX11|Ӌb<)φתt9Uqt؇h\,x5Vw#SPUPo,ſƿ(_I>Ulmj.kB7;OSH7̂B}H7/iQ:D"QE2e 9><8z#l!6$=TRpKgYlBiY6.˧}& _,^qye^L\&%MXhɋo~m\#oQv ̚Ut.UhJ_1p.zZ/.k|O*riD0/Ĝe:_]_ UzU=q5ԋz3vn}e3ݷMk7о\>KCل|v2O-/m}{US~cwջ endstream endobj 156 0 obj << /Producer (pdfTeX-1.40.20) /Creator (TeX) /CreationDate (D:20190625210111+01'00') /ModDate (D:20190625210111+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) kpathsea version 6.3.1) >> endobj 153 0 obj << /Type /ObjStm /N 10 /First 70 /Length 388 /Filter /FlateDecode >> stream xڭMO0s@BlEQwu!$ +ݨ ;O;-   |%x.e:|" H}P '},7u/龷D웮sN.&;q ;m7- gFxiZpN{*eGP>8Il <5D89F9484D02F75A141E70FB2DD82B7B>] /Length 443 /Filter /FlateDecode >> stream x%9LTQsCATqAM\&&j((l,lIh-X Ɔ΄@7}L? 8"bɨM@5b#(!BQ@~;nED "AԦ=ԣJD1Q%b yX.ʈqǭhpLmDG0) { url = paste(url,"&case_list=", paste(cases,collapse=","),sep='') } else if (caseIdsKey != '') { url = paste(url,"&case_ids_key=", caseIdsKey,sep='') } else { url = paste(url,"&case_set_id=", caseList,sep='') } df = processURL(x,url) if (nrow(df) == 0) { return(df) } m = matrix() # process data before returning if (length(geneticProfiles) > 1) { cnames = df[,1] m = t(df[,-c(1:4)]) colnames(m) = cnames } else { cnames = df[,2] m = t(df[,-c(1:2)]) colnames(m) = cnames } return(data.frame(m)) }) setMethodS3("getClinicalData","CGDS", function(x, caseList='', cases=c(), caseIdsKey = '', ...) { url = paste(x$.url, "webservice.do?cmd=getClinicalData",sep="") if (length(cases)>0) { url = paste(url,"&case_list=", paste(cases,collapse=","),sep='') } else if (caseIdsKey != '') { url = paste(url,"&case_ids_key=", caseIdsKey,sep='') } else { url = paste(url,"&case_set_id=", caseList,sep='') } df = processURL(x,url) rownames(df) = make.names(df[,1]) return(df[,-1]) }) setMethodS3("plot","CGDS", function(x, cancerStudy, genes, geneticProfiles, caseList='', cases=c(), caseIdsKey = '', skin='cont', skin.normals='', skin.col.gp = c(), add.corr = '', legend.pos = 'topright', ...) { errormsg <- function(msg,error=TRUE) { # return empty plot with text if (error) {msg = paste('Error:',msg)} # override msg if global message provided in object if (x$.ploterrormsg != '') {msg = x$.ploterrormsg} plot.new() # set message text here ... #mtext(msg,cex=1.0,col='darkred') text(0.5,0.5,msg,cex=1.0,col='darkred') box() return(msg) } # we only allow the following combinations # a) gene1 (1 profile) # b) gene1 vs gene2 (1 profile) # c) profile 1 vs profile 2 (1 gene) if((length(genes) > 1 & length(geneticProfiles) > 1) | (length(genes) > 2 | length(geneticProfiles) > 2)) { return(errormsg("use only 2 genetic profiles OR 2 genes")) } # make genenames conform to R variable names genesR = make.names(genes) # get data, check more than zero rows returned, otherwise return df = getProfileData(x, genes, geneticProfiles, caseList, cases, caseIdsKey) if (nrow(df) == 0) { return(errormsg(paste('empty data frame returned :\n',colnames(df)[1]))) } # check data returned with more than two genes or genetic profiles if (length(genes) == 2 & ncol(df) != 2) { return(errormsg(paste("gene not found:", setdiff(genesR,colnames(df))))) } if (length(geneticProfiles) == 2 & ncol(df) != 2) { return(errormsg("geneticProfile ID not found:", setdiff(geneticProfiles,colnames(df)))) } # get geneticProfiles annotation for axis labels gps = getGeneticProfiles(x, cancerStudy) if (nrow(gps) == 0) { errormsg(colnames(gps[1])) } rownames(gps) = gps[,1] gpaxisnames = gps[geneticProfiles,'genetic_profile_name'] names(gpaxisnames) = geneticProfiles # we can have a situation where there is no data for a given combination of gene and genetic profile # in this case, we have a column of NaN, and we generate an error nacols = sapply(df, function(x) all(is.nan(x))) if (any(nacols)) { if (length(geneticProfiles) > 1) { # two genetic profiles in columns, one gene return(errormsg(paste(genes, "has no data\n for genetic profile(s):", paste(gpaxisnames[nacols],collapse=", ")),FALSE)) } else { # one genetic profile, one or two genes in columns return(errormsg(paste(paste(genes[nacols],collapse=' and '), "has no data\n for genetic profile:", gpaxisnames),FALSE)) } } # set sub title with correlation if specified plot.subtitle = '' if ((add.corr == 'pearson' | add.corr == 'spearman') & ncol(df) == 2) { ct = cor.test(df[,1],df[,2],method=add.corr) plot.subtitle = paste(add.corr, ' r = ', sprintf("%.2f",ct$estimate), ', p = ',sprintf("%.1e",ct$p.value)) } ### ### Skins ### if (skin == 'cont') { if(length(genes) == 1 & length(geneticProfiles) == 1) { hist(df[,1],xlab=paste(genes," , ",gpaxisnames,sep=""),main='') } else if (length(genes) == 2) { # two genes plot(df[,genesR[1]],df[,genesR[2]] , main = '', xlab = paste(genes[1],", ",gpaxisnames,sep=""), ylab = paste(genes[2],", ",gpaxisnames,sep=""), pch = 1, col = 'black', sub = plot.subtitle) } else { # two genetic profiles gpa = geneticProfiles[1] gpb = geneticProfiles[2] plot(df[,gpa],df[,gpb] , main = '', xlab = paste(genes[1],", ",gpaxisnames[gpa],sep=""), ylab = paste(genes[1],", ",gpaxisnames[gpb],sep=""), pch = 1, col = 'black', sub = plot.subtitle) } } else if (skin == 'disc') { if(length(genes) == 1 & length(geneticProfiles) == 1) { barplot(table(df[,1]),xlab=paste(genes,", ",gpaxisnames,sep=""),main='',ylab='frequency') } else { #discrete vs discrete return(errormsg('discrete vs. discrete data not implemented')) } } else if (skin =='disc_cont') { # skin only valid for two genetic profiles if(length(geneticProfiles) != 2) { return(errormsg("two genetic profiles required for skin 'disc_cont'")) } else { # skin assumes that first genetic profile is discret gp.disc = geneticProfiles[1] # b gp.cont = geneticProfiles[2] # a boxplot(df[,gp.cont] ~ df[,gp.disc], outpch = NA, main = '', xlab = paste(genes[1],", ",gpaxisnames[gp.disc],sep=""), ylab = paste(genes[1],", ",gpaxisnames[gp.cont],sep=""), border = 'gray', sub = plot.subtitle) stripchart(df[,gp.cont] ~ df[,gp.disc],vertical = TRUE, add = TRUE, method = 'jitter', pch = 1, col = 'black') } } else if (skin == 'cna_mrna_mut') { # skin uses parameters # * skin.col.gp = mut # * skin.normals = normal_case_set [optional] # fetch optional normal mRNA data if (skin.normals != '') { df.norm = getProfileData(x, genes, geneticProfiles[2], skin.normals) if (nrow(df.norm) == 0) { return(errormsg(paste('empty data frame returned :\n',colnames(df.norm)[1]))) } # check if data is missing (NaN) if ( !all(is.nan(df.norm[,1])) ) { # add normal data to dataframe df.norm2 = cbind(rep(-3,nrow(df.norm)),df.norm[,1]) colnames(df.norm2) = geneticProfiles df = rbind(df,df.norm2) } } # create boxplot df.nona = df[apply(df, 1, function(x) {!any(is.na(x))}),] ylim=range(df.nona[,geneticProfiles[2]],na.rm=TRUE) labels=seq(-3,2) names(labels)=c("Normal","Homdel","Hetloss","Diploid","Gain","Amp") labels.inuse = sort(unique(df.nona[,geneticProfiles[1]])) # sort removes any NA boxplot(df.nona[,geneticProfiles[2]] ~ df.nona[,geneticProfiles[1]], main='', outline=FALSE, xlab = paste(genes,", ",gpaxisnames[geneticProfiles[1]],sep=""), ylab = paste(genes,", ",gpaxisnames[geneticProfiles[2]],sep=""), border="gray",ylim=ylim, axes=FALSE, outpch = NA, sub = plot.subtitle) axis(1,at=seq(1,length(labels.inuse)),labels=names(labels)[match(labels.inuse,labels)],cex.axis=0.8) axis(2,cex.axis=0.8,las=2) # box() # manually jitter data # order data by CNA status df.nona=df.nona[order(df.nona[,geneticProfiles[1]]),] xy=list() xy$MRNA=df.nona[,geneticProfiles[2]] cats=cbind(1:length(labels.inuse),as.data.frame(table(df.nona[,geneticProfiles[1]]))) colnames(cats)=c("X","Class","Count") rownames(cats)=names(labels)[match(cats[,2],labels)] xy$JITTER = unlist( apply(cats,1, function(cc) { y=rep.int(as.numeric(cc[1]),as.numeric(cc[3])) y=y+stats::runif(length(y),-0.1,0.1) })) xy=as.data.frame(xy) colnames(xy) = c('MRNA','JITTER') # Initialize plotting features nonmut.pch = 4 N=nrow(xy) cex=rep(0.9,N) pch=rep(nonmut.pch,N) col=rep("royalblue",N) bg=rep(NA,N) # fetch mutation data for color coding if (length(skin.col.gp == 1)) { df.mut = getProfileData(x, genes, skin.col.gp, caseList, cases, caseIdsKey) if (nrow(df.mut) == 0) { return(errormsg(paste('empty data frame returned :\n',colnames(df.mut)[1]))) } # get matrix corresponding to df.nona df.mut = df.mut[rownames(df.nona),1] # check if data is missing (NaN) mut=which(!is.na(df.mut)) if(length(mut)>0) { # default mutation col[mut]="red3" bg[mut]="goldenrod" pch[mut]=21 mt=list() mt$pch=c(21,23,24,25,22) mt$type=c("missense","nonsense","splice","shift","in_frame") mt$pattern=c("^[a-z][0-9]+[a-z]$","[*x]$","^(e.+[0-9]|.+_splice)$","fs$","del$") mt$bg=c("goldenrod","darkblue","darkgray","black","goldenrod") mt=as.data.frame(mt) for(i in 1:nrow(mt)) { idx=grep(mt$pattern[i],tolower(df.mut)) pch[idx]=mt$pch[i] bg[idx]=as.character(mt$bg[i]) } #col[mut]="red3" # ?????? legend("topleft",bty="n", as.character(as.vector(mt[["type"]])),col="red3", pt.bg=as.character(as.vector(mt[["bg"]])), pch=mt[["pch"]],cex=0.85,pt.cex=1.0 ) } } ## # Plot the jittered data, add mutated points last xy.mut = (pch != nonmut.pch) points(xy$JITTER[!xy.mut],xy$MRNA[!xy.mut],pch=pch[!xy.mut],cex=cex[!xy.mut],col=col[!xy.mut],bg=bg[!xy.mut]) points(xy$JITTER[xy.mut],xy$MRNA[xy.mut],pch=pch[xy.mut],cex=cex[xy.mut],col=col[xy.mut],bg=bg[xy.mut]) box() } else if (skin == 'meth_mrna_cna_mut' | skin == 'cna_mut') { # these skins use parameters # * skin.col.gp = (cna,mut) [optional] # * skin.normals = normal_case_set [optional] # [meth_mrna_cna_mut] forces x axis range to [0,1.05] # fetch cna and mut data for color coding pch=rep(1,nrow(df)) col=rep("black",nrow(df)) if (length(skin.col.gp) == 2) { # color by both CNA and mutation df.col = getProfileData(x, genes, skin.col.gp, caseList, cases, caseIdsKey) if (nrow(df.col) == 0) { return(errormsg(paste('empty data frame returned :\n',colnames(df.col)[1]))) } # because mut is text vector, we need to transform cna to integer vector instead of factor cna = as.integer(as.vector(df.col[,skin.col.gp[1]])) mut = as.vector(df.col[,skin.col.gp[2]]) col[cna==-2]="darkblue" col[cna==-1]="deepskyblue" col[cna==1]="hotpink" col[cna==2]="red3" col[mut!="NaN"]="orange" pch[mut!="NaN"]=20 } else if (length(skin.col.gp) == 1) { # color only by CNA df.col = getProfileData(x, genes, skin.col.gp, caseList, cases, caseIdsKey) if (nrow(df.col) == 0) { return(errormsg(paste('empty data frame returned :\n',colnames(df.col)[1]))) } # because mut is text vector, we need to transform cna to integer vector instead of factor cna = as.integer(as.vector(df.col[,1])) col[cna==-2]="darkblue" col[cna==-1]="deepskyblue" col[cna==1]="hotpink" col[cna==2]="red3" } # fetch optional normal methylation and mRNA data if (skin.normals != '') { df.norm = getProfileData(x, genes, geneticProfiles, skin.normals) if (nrow(df.norm) == 0) { return(errormsg(paste('empty data frame returned :\n',colnames(df.norm)[1]))) } # remove missing data df.norm = df.norm[apply(df.norm, 1, function(x) {!any(is.na(x))}),] if ( length(df.norm) > 0) { df = rbind(df,df.norm) col = append(col, rep("black",nrow(df.norm))) pch = append(pch, rep(20,nrow(df.norm))) } } xlim = range(df[,geneticProfiles[1]],na.rm = TRUE) # add 15% to range, to make room for legend if (legend.pos == 'topright') { xlim = c(min(xlim),max(xlim) + (max(xlim)-min(xlim))*0.15) } else if (legend.pos == 'topleft') { xlim = c(min(xlim) - (max(xlim)-min(xlim))*0.15,max(xlim)) } if (skin == 'meth_mrna_cna_mut') { # force x axis range to [0,1.05] xlim = c(0,1.05) } # now plot plot( df[,geneticProfiles[1]],df[,geneticProfiles[2]],main="", xlab=paste(genes,", ",gpaxisnames[geneticProfiles[1]],sep=""), ylab=paste(genes,", ",gpaxisnames[geneticProfiles[2]],sep=""), xlim=xlim,pch=pch,col=col,cex=1.2, sub = plot.subtitle ) #abline(lm(d$rna~d$methylation),col="red3",lty=2,lwd=1.5) #lines(loess.smooth(d$methylation,d$rna),col="darkgray",lwd=2) # Replace with dynamically created legend when time permits legend(legend.pos,bty="n", c("Homdel","Hetloss","Diploid","Gain","Amp","Mutated","Normal"), col=c('darkblue','deepskyblue','black','hotpink','red','orange','black'), pch=c(1,1,1,1,1,20,20),cex=0.85,pt.cex=1.0 ) } else { return(errormsg(paste("unkown skin:",skin))) } return(TRUE) }) setMethodS3("test","CGDS", function(x, ...) { checkEq = function(a,b) { if (identical(a,b)) "OK\n" else "FAILED!\n" } checkGrt = function(a,b) { if (a > b) "OK\n" else "FAILED!\n" } checkTrue = function(a) { if (a) "OK\n" else "FAILED!\n" } cancerstudies = getCancerStudies(x) cat('getCancerStudies... ', checkEq(colnames(cancerstudies),c("cancer_study_id","name","description"))) ct = cancerstudies[2,1] # should be row 1 instead ... cat('getCaseLists (1/2) ... ', checkEq(colnames(getCaseLists(x,ct)), c("case_list_id","case_list_name", "case_list_description","cancer_study_id","case_ids"))) cat('getCaseLists (2/2) ... ', checkEq(colnames(getCaseLists(x,'xxx')), 'Error..Problem.when.identifying.a.cancer.study.for.the.request.')) cat('getGeneticProfiles (1/2) ... ', checkEq(colnames(getGeneticProfiles(x,ct)), c("genetic_profile_id","genetic_profile_name","genetic_profile_description", "cancer_study_id","genetic_alteration_type","show_profile_in_analysis_tab"))) cat('getGeneticProfiles (2/2) ... ', checkEq(colnames(getGeneticProfiles(x,'xxx')), 'Error..Problem.when.identifying.a.cancer.study.for.the.request.')) # clinical data # check colnames cat('getClinicalData (1/1) ... ', checkTrue("DFS_MONTHS" %in% colnames(getClinicalData(x,'gbm_tcga_all')))) # check one gene, one profile cat('getProfileData (1/6) ... ', checkEq(colnames(getProfileData(x,'NF1','gbm_tcga_mrna','gbm_tcga_all')), "NF1")) # check many genes, one profile cat('getProfileData (2/6) ... ', checkEq(colnames(getProfileData(x,c('MDM2','MDM4'),'gbm_tcga_mrna','gbm_tcga_all')), c("MDM2","MDM4"))) # check one gene, many profile cat('getProfileData (3/6) ... ', checkEq(colnames(getProfileData(x,'NF1',c('gbm_tcga_mrna','gbm_tcga_mutations'),'gbm_tcga_all')), c('gbm_tcga_mrna','gbm_tcga_mutations'))) # check 3 cases returns matrix with 3 columns cat('getProfileData (4/6) ... ', checkEq(rownames(getProfileData(x,'BRCA1','gbm_tcga_mrna',cases=c('TCGA-02-0001-01','TCGA-02-0003-01'))), make.names(c('TCGA-02-0001-01','TCGA-02-0003-01')))) # invalid gene names return empty data.frame cat('getProfileData (5/6) ... ', checkEq(nrow(getProfileData(x,c('NF10','NF11'),'gbm_tcga_mrna','gbm_tcga_all')),as.integer(0))) # invalid case_list_id returns error cat('getProfileData (6/6) ... ', checkEq(colnames(getProfileData(x,'NF1','gbm_tcga_mrna','xxx')), 'Error..Invalid.case_set_id...xxx.')) }) cgdsr/vignettes/0000755000176200001440000000000013504476607013400 5ustar liggesuserscgdsr/vignettes/cgdsr.Rnw0000755000176200001440000002573213504476440015201 0ustar liggesusers\documentclass[a4paper]{article} %\VignetteIndexEntry{Introduction to the CGDS R library} %\VignettePackage{cgdsr} % Definitions \usepackage{url} \title{The CGDS-R library} \author{Anders Jacobsen and Augustin Luna} \begin{document} \SweaveOpts{concordance=TRUE} \maketitle \tableofcontents \section{Introduction} This package provides a basic set of R functions for querying the Cancer Genomic Data Server (CGDS) hosted by the Computational Biology Center (cBio) at the Memorial Sloan-Kettering Cancer Center (MSKCC). This service is a part of the cBio Cancer Genomics Portal, \url{http://www.cbioportal.org/}. In summary, the library can issue the following types of queries: \begin{itemize} \item{ \texttt{getCancerStudies()} : What cancer studies are hosted on the server? For example, TCGA glioblastoma or TCGA ovarian cancer. } \item{ \texttt{getGeneticProfiles()} : What genetic profile types are available for cancer study X? For example, mRNA expression or copy number alterations. } \item{ \texttt{getCaseLists()} : what case sets are available for cancer study X? For example, all samples or only samples corresponding to a given cancer subtype. } \item{ \texttt{getProfileData()}: Retrieve slices of genomic data. For example, a client can retrieve all mutation data for PTEN and EGFR in TCGA glioblastoma. } \item{ \texttt{getClinicalData()}: Retrieve clinical data (e.g. patient survival time and age) for a given cancer study and list of cases. } \end{itemize} Each of these functions will be briefly described in the following sections. The last part of this document includes some concrete examples of how to access and plot the data. The purpose of this document is to give the reader a quick overview of the \texttt{cgdsr} package. Please refer to the corresponding R manual pages for a more detailed explanation of arguments and output for each function. \section{The CGDS R interface} \subsection{\texttt{CGDS()} : Create a CGDS connection object} Initially, we will establish a connection to the public CGDS server hosted by Memorial Sloan-Kettering Cancer Center. The function for creating a CGDS connection object requires the URL of the CGDS server service, in this case \url{http://www.cbioportal.org/}, as an argument. <<>>= library(cgdsr) # Create CGDS object mycgds = CGDS("http://www.cbioportal.org/") @ The variable \texttt{mycgds} is now a CGDS connection object pointing at the URL for the public CGDS server. This connection object must be included as an argument to all subsequent interface calls. Optionally, we can now perform a set of simple tests of the data returned from the CGDS connection object using the \texttt{test} function: <<>>= # Test the CGDS endpoint URL using a few simple API tests test(mycgds) @ Note that the tests may not work if you are connecting to a portal other than the one in the above example. The tests can fail if the portal instance does not contain the data that is being tested against, or if you do have have authorization to access the data that is being tested against. A verbose option can be set for the CGDS connection object. This will cause function calls that retrieve data from cBioPortal to additionally display the programming interface URL to be displayed. This is useful for debugging and troubleshooting issues with the package. <<>>= # Set verbose flag setVerbose(mycgds, TRUE) @ [Optional] A data access token can be optionally attached to a CGDS connection object when it is created. This allows you to connect to cBioPortal instances that require authentication. Data access tokens (when this feature is enabled) can be created through the cbioportal website. If you attempt to access data that you are not authorized to access you will get an \texttt{Unauthorized (HTTP 401)} error. Note the public portal at http://www.cbioportal.org/ does not require authentication so you do not need a token to connect to it. <<>>= # Connect to a portal instance that requires authetication mysecurecgds = CGDS("https://cbioportal.mskcc.org/", token="fd0522cb-7972-40d0-9d83-cb4c14e8a337") @ \subsection{\texttt{getCancerStudies()} : Retrieve a set of available cancer studies} Having created a CGDS connection object, we can now retrieve a data frame with available cancer studies using the \texttt{getCancerStudies} function: <<>>= # Get list of cancer studies at server getCancerStudies(mycgds)[,c(1,2)] @ Here we are only showing the first two columns, the cancer study ID and short name, of the result data frame. There is also a third column, a longer description of the cancer study. The cancer study ID must be used in subsequent interface calls to retrieve case lists and genetic data profiles (see below). \subsection{\texttt{getGeneticProfiles()} : Retrieve genetic data profiles for a specific cancer study} This function queries the CGDS API and returns the available genetic profiles, e.g. mutation or copy number profiles, stored about a specific cancer study. Below we list the current genetic profiles for the TCGA glioblastoma cancer study: <<>>= getGeneticProfiles(mycgds,'gbm_tcga')[,c(1:2)] @ Here we are only listing the first two columns, genetic profile ID and short name, of the resulting data frame. Please refer to the R manual pages for a more extended specification of the arguments and output. \subsection{\texttt{getCaseLists()} : Retrieve case lists for a specific cancer study} This function queries the CGDS API and returns available case lists for a specific cancer study. For example, within a particular study, only some cases may have sequence data, and another subset of cases may have been sequenced and treated with a specific therapeutic protocol. Multiple case lists may be associated with each cancer study, and this method enables you to retrieve meta-data regarding all of these case lists. Below we list the current case lists for the TCGA glioblastoma cancer study: <<>>= getCaseLists(mycgds,'gbm_tcga')[,c(1:2)] @ Here we are only listing the first two columns, case list ID and short name, of the resulting data frame. Please refer to the R manual pages for a more extended specification of the arguments and output. \subsection{\texttt{getProfileData()} : Retrieve genomic profile data for genes and genetic profiles} The function queries the CGDS API and returns data based on gene(s), genetic profile(s), and a case list. The function only allows specifying a list of genes and a single genetic profile, or oppositely a single gene and a list of genetic profiles. Importantly, the format of the output data frame depends on if a single or a list of genes was specified in the arguments. Below we are retrieving mRNA expression and copy number alteration genetic profiles for the NF1 gene in all samples of the TCGA glioblastoma cancer study: <<>>= getProfileData(mycgds, "NF1", c("gbm_tcga_gistic","gbm_tcga_mrna"), "gbm_tcga_all")[c(1:5),] @ We are here only showing the first five rows of the data frame. Entries with NaN indicate missing values. In the next example, we are retrieving mRNA expression data for the MDM2 and MDM4 genes: <<>>= getProfileData(mycgds, c("MDM2","MDM4"), "gbm_tcga_mrna", "gbm_tcga_all")[c(25:30),] @ We are again only showing the first five rows of the data frame. \subsection{\texttt{getClinicalData()} : Retrieve clinical data for a list of cases} The function queries the CGDS API and returns available clinical data (e.g. patient survival time and age) for a given case list. Results are returned in a data frame with a row for each case and a column for each clinical attribute. The available clinical attributes are: \begin{itemize} \item{ \texttt{overall\_survival\_months}: Overall survival, in months. } \item{ \texttt{overall\_survival\_status}: Overall survival status, usually indicated as "LIVING" or "DECEASED". } \item{ \texttt{disease\_free\_survival\_months}: Disease free survival, in months. } \item{ \texttt{disease\_free\_survival\_status}: Disease free survival status, usually indicated as "DiseaseFree" or "Recurred/Progressed". } \item{ \texttt{age\_at\_diagnosis}: Age at diagnosis. } \end{itemize} Below we retrieve clinical data for the TCGA ovarian cancer dataset (only first five cases/rows are shown): <<>>= getClinicalData(mycgds, "ova_all")[c(1:5),] @ \section{Examples} \subsection{Example 1: Association of NF1 copy number alteration and mRNA expression in glioblastoma} As a simple example, we will generate a plot of the association between copy number alteration (CNA) status and mRNA expression change for the NF1 tumor suprpressor gene in glioblastoma. This plot is very similar to Figure 2b in the TCGA research network paper on glioblastoma (McLendon et al. 2008). The mRNA expression of NF1 has been median adjusted on the gene level (by globally subtracting the median expression level of NF1 across all samples). \begin{center} <>= df = getProfileData(mycgds, "NF1", c("gbm_tcga_gistic","gbm_tcga_mrna"), "gbm_tcga_all") head(df) boxplot(df[,2] ~ df[,1], main="NF1 : CNA status vs mRNA expression", xlab="CNA status", ylab="mRNA expression", outpch = NA) stripchart(df[,2] ~ df[,1], vertical=T, add=T, method="jitter",pch=1,col='red') @ \end{center} Alternatively, the generic \texttt{cgdsr} \texttt{plot()} function can be used to generate a similar plot: \begin{center} <>= plot(mycgds, "gbm_tcga", "NF1", c("gbm_tcga_gistic","gbm_tcga_mrna"), "gbm_tcga_all", skin = 'disc_cont') @ \end{center} \subsection{Example 2: MDM2 and MDM4 mRNA expression levels in glioblastoma} In this example, we evaluate the relationship of MDM2 and MDM4 expression levels in glioblastoma. mRNA expression levels of MDM2 and MDM4 have been median adjusted on the gene level (by globally subtracting the median expression level of the individual gene across all samples). Samples with "NaN" do not have measurements. \begin{center} <>= df = getProfileData(mycgds, c("MDM2","MDM4"), "gbm_tcga_mrna", "gbm_tcga_all") head(df) plot(df, main="MDM2 and MDM4 mRNA expression", xlab="MDM2 mRNA expression", ylab="MDM4 mRNA expression") @ \end{center} Alternatively, the generic \texttt{cgdsr} \texttt{plot()} function can be used to generate a similar plot: \begin{center} <>= plot(mycgds, "gbm_tcga", c("MDM2","MDM4"), "gbm_tcga_mrna" ,"gbm_tcga_all") @ \end{center} \subsection{Example 3: Comparing expression of PTEN in primary and metastatic prostate cancer tumors} In this example we plot the mRNA expression levels of PTEN in primary and metastatic prostate cancer tumors. \begin{center} <>= df.pri = getProfileData(mycgds, "PTEN", "prad_mskcc_mrna_median_Zscores", "prad_mskcc_primary") head(df.pri) df.met = getProfileData(mycgds, "PTEN", "prad_mskcc_mrna_median_Zscores", "prad_mskcc_mets") head(df.met) boxplot(list(t(df.pri),t(df.met)), main="PTEN expression in primary and metastatic tumors", xlab="Tumor type", ylab="PTEN mRNA expression",names=c('primary','metastatic'), outpch = NA) stripchart(list(t(df.pri),t(df.met)), vertical=T, add=T, method="jitter",pch=1,col='red') @ \end{center} \end{document} cgdsr/MD50000644000176200001440000000237313504655776011713 0ustar liggesusers8df939f17206bd2847d78d5ef7a8ff7e *DESCRIPTION d391b42ffa5394512dbf5e0c3fcac219 *NAMESPACE 01c59b5112fbeb1556b03ced4f84f4e3 *R/cgdsr.R 34ec857f5041d9d5ea31469700cf35ea *build/vignette.rds d92e5d90c88266a2ea0434f5a425ca09 *inst/doc/cgdsr.R 14bcef61325a876900be370a94c03691 *inst/doc/cgdsr.Rnw 659120f8cbef75963397f6065c784c84 *inst/doc/cgdsr.pdf e8199d8c648fac71bf259bb3a6cae038 *inst/tests/test_cgdsr.R faf3f7cc9915ad5001e542163baf03bd *man/cgdsr-CGDS.Rd c04bfbdab10e22ea1a689b88cfc13e38 *man/cgdsr-getCancerStudies.Rd 3b18aad11809a02117c01f6e2a03d9b4 *man/cgdsr-getCaseLists.Rd 25b8219441d8c7747484e2820aa40163 *man/cgdsr-getClinicalData.Rd 80123ce906081f8aa3d382b2e53dca37 *man/cgdsr-getGeneticProfiles.Rd c97a15fa380af5f443bde62e38aed7fe *man/cgdsr-getMutationData.Rd 31d4a70c8d8039236af374df1dd6eea5 *man/cgdsr-getProfileData.Rd a3d6d671aba04bb70605432e6b7f5f4a *man/cgdsr-package.Rd 425f45d90f56594eff80c0cd5414bd08 *man/cgdsr-plot.Rd 2b4568d6f8eb3cf04a2fa4ebe3d351b1 *man/cgdsr-processURL.Rd 91bd2171f20046362ffa5fb3a7a61eca *man/cgdsr-setPlotErrorMsg.Rd 6574c854a2a4c7473c6f5127a367e19a *man/cgdsr-setVerbose.Rd e2ddf0a9f90f25e7c9ee216af66d43ec *man/cgdsr-test.Rd b83d2f9506bfd0790bb6da8948d719dc *tests/runTests.R 14bcef61325a876900be370a94c03691 *vignettes/cgdsr.Rnw cgdsr/build/0000755000176200001440000000000013504476607012467 5ustar liggesuserscgdsr/build/vignette.rds0000644000176200001440000000033113504476607015023 0ustar liggesusersmP 0, FK$FtElzX<<a4 @Kx M.TA,* $':hI&, Augustin Luna Maintainer: Benjamin Gross Description: Provides a basic set of R functions for querying the Cancer Genomics Data Server (CGDS), hosted by the Computational Biology Center at Memorial-Sloan-Kettering Cancer Center (MSKCC) at . License: LGPL-3 LazyLoad: yes URL: https://github.com/cBioPortal/cgdsr Depends: R (>= 3.1) Imports: R.oo, R.methodsS3, httr Suggests: testthat NeedsCompilation: no Repository: CRAN RoxygenNote: 6.0.1 Packaged: 2019-06-25 20:01:11 UTC; wilson Date/Publication: 2019-06-26 11:50:22 UTC cgdsr/man/0000755000176200001440000000000013504375024012132 5ustar liggesuserscgdsr/man/cgdsr-setVerbose.Rd0000755000176200001440000000135113470574043015651 0ustar liggesusers\name{cgdsr-setVerbose} \alias{cgdsr-setVerbose} \alias{setVerbose} \alias{setVerbose.CGDS} \title{Set verbose logging level for CGDS function calls} \description{Sets verbose logging level for CGDS function calls.} \usage{\method{setVerbose}{CGDS}(x, verbose, ...)} \arguments{ \item{x}{A CGDS object (required)} \item{verbose}{Activate verbose logging (boolean)} \item{...}{Not used.} } \author{ } \references{ cBio Cancer Genomics Portal: \url{http://www.cbioportal.org/} } \seealso{ \code{\link{cgdsr}},\code{\link{CGDS}} } \examples{ # Create CGDS object mycgds = CGDS("http://www.cbioportal.org/") getCancerStudies(mycgds) # Activate verbose logging setVerbose(mycgds, TRUE) getCancerStudies(mycgds) } cgdsr/man/cgdsr-getCancerStudies.Rd0000755000176200001440000000245213470574043016767 0ustar liggesusers\name{cgdsr-getCancerStudies} \alias{cgdsr-getCancerStudies} \alias{getCancerStudies} \alias{getCancerStudies.CGDS} \title{Get available cancer studies available in CGDS} \description{Queries the CGDS API and returns available cancer studies. Input is a CGDS object and output is a data.matrix with information regarding the different cancer studies.} \usage{\method{getCancerStudies}{CGDS}(x, ...)} \arguments{ \item{x}{A CGDS object (required)} \item{...}{Not used.} } \value{A data.frame with three colums: \enumerate{ \item \var{cancer_study_id}: unique ID used to identify the cancer study in subsequent interface calls. This is a human readable ID. \item \var{name}: short name of the cancer type. \item \var{description}: short description of the cancer type, describing the source of study. }} \author{ } \references{ cBio Cancer Genomics Portal: \url{http://www.cbioportal.org/} } \seealso{ \code{\link{cgdsr}},\code{\link{CGDS}},\code{\link{getGeneticProfiles}},\code{\link{getCaseLists}} } \examples{ # Create CGDS object mycgds = CGDS("http://www.cbioportal.org/") getCancerStudies(mycgds) # Get available case lists (collection of samples) for a given cancer study mycancerstudy = getCancerStudies(mycgds)[2,1] mycaselist = getCaseLists(mycgds,mycancerstudy)[1,1] } cgdsr/man/cgdsr-test.Rd0000755000176200001440000000141513470574043014510 0ustar liggesusers\name{cgdsr-test} \alias{cgdsr-test} \alias{test} \alias{test.CGDS} \title{Simple test suite for CGDS object.} \description{Queries the CGDS API and returns results of the tests.} \usage{\method{test}{CGDS}(x, ...)} \arguments{ \item{x}{A CGDS object.} \item{...}{Not used.} } \value{ Test results in text format.} \details{ A set of simple tests are evaluated. The format of the returned output from the following queries are tested: "getCancerStudies()", "getCaselists()", and "getGeneticProfiles()"} \author{ } \references{ cBio Cancer Genomics Portal: \url{http://www.cbioportal.org/} } \seealso{ \code{\link{cgdsr}},\code{\link{CGDS}} } \examples{ # Create CGDS object mycgds = CGDS("http://www.cbioportal.org/") # Run tests test(mycgds) } cgdsr/man/cgdsr-getClinicalData.Rd0000755000176200001440000000307313470574043016543 0ustar liggesusers\name{cgdsr-getClinicalData} \alias{cgdsr-getClinicalData} \alias{getClinicalData} \alias{getClinicalData.CGDS} \title{Get clinical data for cancer study} \description{Queries the CGDS API and returns clinical data for a given case list.} \usage{\method{getClinicalData}{CGDS}(x, caseList, cases, caseIdsKey, ...)} \arguments{ \item{x}{A CGDS object (required)} \item{caseList}{A case list ID} \item{cases}{A vector of case IDs} \item{caseIdsKey}{Only used by web portal.} \item{...}{Not used.} } \value{A data.frame with rows for each case, rownames corresponding to case IDs, and columns: \enumerate{ \item \var{overall_survival_months}: Overall survival, in months. \item \var{overall_survival_status}: Overall survival status, usually indicated as "LIVING" or "DECEASED". \item \var{disease_free_survival_months}: Disease free survival, in months. \item \var{disease_free_survival_status}: Disease free survival status, usually indicated as "DiseaseFree" or "Recurred/Progressed". \item \var{age_at_diagnosis}: Age at diagnosis. }} \author{ } \references{ cBio Cancer Genomics Portal: \url{http://www.cbioportal.org/} } \seealso{ \code{\link{cgdsr}},\code{\link{CGDS}},\code{\link{getCaseLists}} } \examples{ # Create CGDS object mycgds = CGDS("http://www.cbioportal.org/") getCancerStudies(mycgds) # Get available case lists (collection of samples) for a given cancer study mycancerstudy = getCancerStudies(mycgds)[2,1] mycaselist = getCaseLists(mycgds,mycancerstudy)[1,1] # Get clinical data for caselist getClinicalData(mycgds,mycaselist) } cgdsr/man/cgdsr-package.Rd0000755000176200001440000000527413470574043015133 0ustar liggesusers\name{cgdsr-package} \alias{cgdsr-package} \alias{cgdsr} \docType{package} \title{ CGDS-R : a library for accessing data in the MSKCC Cancer Genomics Data Server (CGDS). } \description{ The package provides a basic set of R functions for querying the Cancer Genomics Data Server (CGDS), hosted by the Computational Biology Center at Memorial-Sloan-Kettering Cancer Center (MSKCC). Read more about this service at the cBio Cancer Genomics Portal, \url{http://www.cbioportal.org/}. } \details{ \tabular{ll}{ Package: \tab cgdsr\cr Type: \tab Package\cr License: \tab GPL\cr LazyLoad: \tab yes\cr } The Cancer Genomic Data Server (CGDS) web service interface provides direct programmatic access to all genomic data stored within the server. This package provides a basic set of R functions for querying the CGDS hosted by the Computational Biology Center at Memorial-Sloan-Kettering Cancer Center (MSKCC). The library can issue the following types of queries: \enumerate{ \item \var{getCancerStudies()}: What cancer studies are hosted on the server? For example TCGA Glioblastoma or TCGA Ovarian cancer. \item \var{getGeneticProfiles()}: What genetic profile types are available for cancer study X? For example mRNA expression or copy number alterations. \item \var{getCaseLists()}: what case sets are available for cancer study X? For example all samples or only samples corresponding to a given cancer subtype. \item \var{getProfileData()}: Retrieve slices of genomic data. For example, a client can retrieve all mutation data from PTEN and EGFR in TCGA glioblastoma. \item \var{getClinicalData()}: Retrieve clinical data (e.g. patient survival time and age) for a given case list. } } \author{ } \references{ cBio Cancer Genomics Portal: \url{http://www.cbioportal.org/} } \keyword{ package } \seealso{ \code{\link{CGDS}}, \code{\link{getCancerStudies}}, \code{\link{getGeneticProfiles}}, \code{\link{getCaseLists}}, \code{\link{getProfileData}}, \code{\link{getClinicalData}}. } \examples{ # Create CGDS object mycgds = CGDS("http://www.cbioportal.org/") # Test the CGDS endpoint URL using a few simple API tests test(mycgds) # Get list of cancer studies at server getCancerStudies(mycgds) # Get available case lists (collection of samples) for a given cancer study mycancerstudy = getCancerStudies(mycgds)[2,1] mycaselist = getCaseLists(mycgds,mycancerstudy)[1,1] # Get available genetic profiles mygeneticprofile = getGeneticProfiles(mycgds,mycancerstudy)[4,1] # Get data slices for a specified list of genes, genetic profile and case list getProfileData(mycgds,c('BRCA1','BRCA2'),mygeneticprofile,mycaselist) # Get clinical data for the case list myclinicaldata = getClinicalData(mycgds,mycaselist) } cgdsr/man/cgdsr-getProfileData.Rd0000755000176200001440000000517513470574043016432 0ustar liggesusers\name{cgdsr-getProfileData} \alias{cgdsr-getProfileData} \alias{getProfileData} \alias{getProfileData.CGDS} \title{Retrieves genomic profile data for genes and genetic profiles.} \description{Queries the CGDS API and returns data based on gene(s), genetic profile(s), and a case list.} \usage{\method{getProfileData}{CGDS}(x,genes,geneticProfiles,caseList,cases,caseIdsKey,...)} \arguments{ \item{x}{A CGDS object (required)} \item{genes}{A vector of gene names or a String specifying a single gene (required)} \item{geneticProfiles}{ A vector of genetic profile IDs or String specifying a single genetic profile (required)} \item{caseList}{A case list ID} \item{cases}{A vector of case IDs)} \item{caseIdsKey}{Only used by web portal.} \item{...}{Not used.} } \value{ When requesting one or multiple genes and a single genetic profile, the function returns a data.frame with genetic profile data in columns for each gene. When requesting a single gene and multiple genetic profiles, the function returns a data.frame containing columns with data for each genetic profile. Cases can be specified either through a case list ID, or a vector of case IDs. } \details{ Only one list is allowed, specify either a list of genes or genetic profiles. The format of the output data.frame depends on if a single or a list of genes was specified in the arguments. } \author{ } \references{ cBio Cancer Genomics Portal: \url{http://www.cbioportal.org/} } \seealso{ \code{\link{cgdsr}},\code{\link{CGDS}},\code{\link{getCancerStudies}},\code{\link{getGeneticProfiles}},\code{\link{getCaseLists}} } \examples{ # Create CGDS object mycgds = CGDS("http://www.cbioportal.org/") # Get list of cancer studies at server getCancerStudies(mycgds) # Get available case lists (collection of samples) for a given cancer study mycancerstudy = getCancerStudies(mycgds)[2,1] mycaselist = getCaseLists(mycgds,mycancerstudy)[1,1] # Get available genetic profiles mygeneticprofile = getGeneticProfiles(mycgds,mycancerstudy)[1,1] # Get data slices for a specified list of genes, genetic profile and case list getProfileData(mycgds,c('BRCA1','BRCA2'),mygeneticprofile,mycaselist) # Get data slice for a single gene getProfileData(mycgds,'HMGA2',mygeneticprofile,mycaselist) # Get data slice for multiple genetic profiles and single gene getProfileData(mycgds,'HMGA2',getGeneticProfiles(mycgds,mycancerstudy)[c(1,2),1],mycaselist) # Get the same dataset from a vector of case IDs cases = unlist(strsplit(getCaseLists(mycgds,mycancerstudy)[1,'case_ids'],' ')) getProfileData(mycgds,'HMGA2',getGeneticProfiles(mycgds,mycancerstudy)[c(1,2),1],cases=cases) } cgdsr/man/cgdsr-processURL.Rd0000755000176200001440000000055413470574043015575 0ustar liggesusers\name{cgdsr-processURL} \alias{cgdsr-processURL} \alias{processURL} \alias{processURL.CGDS} \title{Internal methods for CGDS library.} \description{These methods should not be invoked by the user.} \author{ } \references{ cBio Cancer Genomics Portal: \url{http://www.cbioportal.org/} } \seealso{ \code{\link{cgdsr}},\code{\link{CGDS}} } cgdsr/man/cgdsr-getCaseLists.Rd0000755000176200001440000000441113470574043016122 0ustar liggesusers\name{cgdsr-getCaseLists} \alias{cgdsr-getCaseLists} \alias{getCaseLists} \alias{getCaseLists.CGDS} \title{Get available case lists for a specific cancer study } \description{Queries the CGDS API and returns available case lists for a specific cancer study. } \usage{\method{getCaseLists}{CGDS}(x,cancerStudy,...)} \arguments{ \item{x}{A CGDS object (required)} \item{cancerStudy}{cancer study ID (required)} \item{...}{Not used.} } \value{A data.frame with five columns: \enumerate{ \item \var{case_list_id}: a unique ID used to identify the case list ID in subsequent interface calls. This is a human readable ID. For example, "gbm_tcga_all" identifies all cases profiles in the TCGA GBM study. \item \var{case_list_name}: short name for the case list. \item \var{case_list_description}: short description of the case list. \item \var{cancer_study_id}: cancer study ID tied to this genetic profile. Will match the input cancer_study_id. \item \var{case_ids}: space delimited list of all case IDs that make up this case list. } } \details{Queries the CGDS API and returns available case lists for a specific cancer study. For example, a within a particular study, only some cases may have sequence data, and another subset of cases may have been sequenced and treated with a specific therapeutic protocol. Multiple case lists may be associated with each cancer study, and this method enables you to retrieve meta-data regarding all of these case lists. } \author{ } \references{ cBio Cancer Genomics Portal: \url{http://www.cbioportal.org/} } \seealso{ \code{\link{cgdsr}},\code{\link{CGDS}},\code{\link{getCancerStudies}},\code{\link{getGeneticProfiles}},\code{\link{getProfileData}} } \examples{ # Create CGDS object mycgds = CGDS("http://www.cbioportal.org/") # Get list of cancer studies at server getCancerStudies(mycgds) # Get available case lists (collection of samples) for a given cancer study mycancerstudy = getCancerStudies(mycgds)[2,1] mycaselist = getCaseLists(mycgds,mycancerstudy)[1,1] # Get available genetic profiles mygeneticprofile = getGeneticProfiles(mycgds,mycancerstudy)[1,1] # Get data slices for a specified list of genes, genetic profile and case list getProfileData(mycgds,c('BRCA1','BRCA2'),mygeneticprofile,mycaselist) } cgdsr/man/cgdsr-getMutationData.Rd0000755000176200001440000000441613470574043016627 0ustar liggesusers\name{cgdsr-getMutationData} \alias{cgdsr-getMutationData} \alias{getMutationData} \alias{getMutationData.CGDS} \title{Get mutation data for cancer study} \description{Queries the CGDS API and returns mutation data for a given case set and list of genes.} \usage{\method{getMutationData}{CGDS}(x, caseList, geneticProfile, genes, ...)} \arguments{ \item{x}{A CGDS object (required)} \item{caseList}{A case list ID} \item{geneticProfile}{A genetic profile ID with mutation data} \item{genes}{A vector of query genes} \item{...}{Not used.} } \value{A data.frame with rows for each sample/case, rownames corresponding to case IDs, and columns corresponding to: \enumerate{ \item \var{entrez_gene_id}: Entrez gene ID \item \var{gene_symbol}: HUGO gene symbol \item \var{sequencing_center}: Sequencer Center responsible for identifying this mutation. \item \var{mutation_status}: somatic or germline mutation status. all mutations returned will be of type somatic. \item \var{age_at_diagnosis}: Age at diagnosis. \item \var{mutation_type}: mutation type, such as nonsense, missense, or frameshift_ins. \item \var{validation_status}: validation status. Usually valid, invalid, or unknown. \item \var{amino_acid_change}: amino acid change resulting from the mutation. \item \var{functional_impact_score}: predicted functional impact score, as predicted by Mutation Assessor. \item \var{xvar_link}: Link to the Mutation Assessor web site. \item \var{xvar_link_pdb}: Link to the Protein Data Bank (PDB) View within Mutation Assessor web site. \item \var{xvar_link_msa}: Link the Multiple Sequence Alignment (MSA) view within the Mutation Assessor web site. \item \var{chr}: chromosome where mutation occurs. \item \var{start_position}: start position of mutation. \item \var{end_position}: end position of mutation }} \author{ } \references{ cBio Cancer Genomics Portal: \url{http://www.cbioportal.org/} } \seealso{ \code{\link{cgdsr}},\code{\link{CGDS}} } \examples{ # Create CGDS object mycgds = CGDS("http://www.cbioportal.org/") getCancerStudies(mycgds) # Get available case lists (collection of samples) for a given cancer study # Get Extended Mutation Data for EGFR and PTEN in TCGA GBM \donttest{ getMutationData(mycgds,gbm_tcga_all,gbm_tcga_mutations,c('EGFR','PTEN')) } } cgdsr/man/cgdsr-setPlotErrorMsg.Rd0000755000176200001440000000133713470574043016647 0ustar liggesusers\name{cgdsr-setPlotErrorMsg} \alias{cgdsr-setPlotErrorMsg} \alias{setPlotErrorMsg} \alias{setPlotErrorMsg.CGDS} \title{Set custom plot error message} \description{Sets custom plot error message.} \usage{\method{setPlotErrorMsg}{CGDS}(x, msg, ...)} \arguments{ \item{x}{A CGDS object (required)} \item{msg}{A custom message (string)} \item{...}{Not used.} } \author{ } \references{ cBio Cancer Genomics Portal: \url{http://www.cbioportal.org/} } \seealso{ \code{\link{cgdsr}},\code{\link{CGDS}} } \examples{ # Create CGDS object mycgds = CGDS("http://www.cbioportal.org/") getCancerStudies(mycgds) # Set custom error plot message setPlotErrorMsg(mycgds, 'My message ...') getCancerStudies(mycgds) } cgdsr/man/cgdsr-CGDS.Rd0000755000176200001440000000233513504375024014247 0ustar liggesusers\name{cgdsr-CGDS} \alias{cgdsr-CGDS} \alias{CGDS} \title{Construct a CGDS connection object} \description{Creates a CGDS connection object from a CGDS endpoint URL. This object must be passed on to the methods which query the server.} \usage{CGDS(url,verbose=FALSE,ploterrormsg='',token=NULL)} \arguments{ \item{url}{A CGDS URL (required).} \item{verbose}{A boolean variable specifying verbose output (default FALSE)} \item{ploterrormsg}{An optional message to display in plots if an error occurs (default '')} \item{token}{An optional 'Authorization: Bearer' token to connect to cBioPortal instances that require authentication (default NULL)} } \value{ A CGDS connection object. This object must be passed on to the methods which query the server. } \author{ } \references{ cBio Cancer Genomics Portal: \url{http://www.cbioportal.org/} } \seealso{ \code{\link{cgdsr}},\code{\link{getCancerStudies}},\code{\link{getGeneticProfiles}},\code{\link{getCaseLists}},\code{\link{getProfileData}} } \examples{ # Create CGDS object mycgds = CGDS("http://www.cbioportal.org/") # Test the CGDS endpoint URL using a few simple API tests test(mycgds) # Get list of cancer studies at server getCancerStudies(mycgds) } cgdsr/man/cgdsr-plot.Rd0000755000176200001440000000777213470574043014523 0ustar liggesusers\name{cgdsr-plot} \alias{cgdsr-plot} \alias{plot} \alias{plot.CGDS} \title{Generic plot function for CGDS API data.} \description{Queries the CGDS API and plots data for specified genes and genetic profiles.} \usage{\method{plot}{CGDS}(x,cancerStudy, genes, geneticProfiles, caseList, cases, caseIdsKey, skin, skin.normals, skin.col.gp, add.corr, legend.pos, ...)} \arguments{ \item{x}{A CGDS object (required)} \item{cancerStudy}{cancer study ID (required)} \item{genes}{A vector of gene names or a String specifying a single gene (required)} \item{geneticProfiles}{ A vector of genetic profile IDs or String specifying a single genetic profile (required)} \item{caseList}{A case list ID} \item{cases}{A vector of case IDs)} \item{caseIdsKey}{Only used by web portal.} \item{skin}{A string specifying which plotting layout skin to use (default is continous data 'cont')} \item{skin.normals}{Specify a case list ID with normal samples, only some skins handle normal data.} \item{skin.col.gp}{Specify a vector of additional case list IDs to use for color coding of data points. Color coding is only handled by some skins.} \item{add.corr}{Computes correlation between the two data vectors. Specify correlation method ('pearson' or 'spearman') as argument.} \item{legend.pos}{Position of legend in plot (default is 'topright').} \item{...}{Not used.} } \details{Queries the CGDS API and plots data for specified genes and genetic profiles. The following combinations are allowed: \enumerate{ \item 1 gene and 1 genetic profile. Plots genetic profile data histogram for specified gene. \item 2 genes and 1 genetic profile. Scatter plot of continuous genetic profile data for the two genes. \item 3 1 gene and 2 genetic profiles. Scatterplot or boxplot relating two genetic profile datasets for single gene. } The function currently implements the following skins: \enumerate{ \item \var{cont}: This is the default skin. It treats all data as being continuous. \item \var{disc}: Requires a single gene and a single genetic profile. The genetic profile data is handled as a discrete dataset and barplot is returned. being continuous. \item \var{disc_cont}: Requires two genetic profiles. The first dataset is handled as being discrete data, and the function generates a boxplot with distributions for each level of the discrete genetic profile. \item \var{cna_mrna_mut}: This skin plots mRNA expression level as function of copy number status for a given gene. Data points are colored by mutation status if specified (\var{skin.col.gp}), and normal data points are included if specified (\var{skin.normals}). \item \var{cna_mrna_mut}: This skin plots mRNA expression level as function of DNA methylation status for a given gene. Data points are colored by copy number and mutation status if specified (two element vector of copy number and mutation genetic profiles specified for \var{skin.col.gp}). Normal data points are included if specified (\var{skin.normals}). } } \author{ } \references{ cBio Cancer Genomics Portal: \url{http://www.cbioportal.org/} } \seealso{ \code{\link{cgdsr}},\code{\link{CGDS}},\code{\link{getCancerStudies}},\code{\link{getGeneticProfiles}},\code{\link{getProfileData}} } \examples{ # Create CGDS object mycgds = CGDS("http://www.cbioportal.org/") # Get list of cancer studies at server getCancerStudies(mycgds) # Get available case lists (collection of samples) for a given cancer study mycancerstudy = getCancerStudies(mycgds)[2,1] mycaselist = getCaseLists(mycgds,mycancerstudy)[1,1] # Get available genetic profiles mygeneticprofile = getGeneticProfiles(mycgds,mycancerstudy)[4,1] # histogram of genetic profile data for gene plot(mycgds,mycancerstudy,'MDM2',mygeneticprofile,mycaselist) # scatter plot of genetic profile data for two genes plot(mycgds,mycancerstudy,c('MDM2','MDM4'),mygeneticprofile,mycaselist) # See vignette for more details ... } cgdsr/man/cgdsr-getGeneticProfiles.Rd0000755000176200001440000000415213470574043017314 0ustar liggesusers\name{cgdsr-getGeneticProfiles} \alias{cgdsr-getGeneticProfiles} \alias{getGeneticProfiles} \alias{getGeneticProfiles.CGDS} \title{Get available genetic data profiles for a specific cancer study} \description{Queries the CGDS API and returns the available genetic profiles, e.g. mutation or copy number profiles, stored about a specific cancer study. } \usage{\method{getGeneticProfiles}{CGDS}(x,cancerStudy,...)} \arguments{ \item{x}{A CGDS object (required)} \item{cancerStudy}{cancer study ID (required)} \item{...}{Not used.} } \value{A data.frame with six columns: \enumerate{ \item \var{genetic_profile_id}: a unique ID used to identify the genetic profile ID in subsequent interface calls. This is a human readable ID. For example, "gbm_tcga_mutations" identifies the TCGA GBM mutation genetic profile. \item \var{genetic_profile_name}: short profile name. \item \var{genetic_profile_description}: short profile description. \item \var{cancer_study_id}: cancer study ID tied to this genetic profile. Will match the input cancer_study_id. \item \var{genetic_alteration_type}: indicates the profile type. Will be one of: MUTATION, MUTATION_EXTENDED, COPY_NUMBER_ALTERATION, MRNA_EXPRESSION. \item \var{show_profile_in_analysis_tab}: a boolean flag used for internal purposes (you can safely ignore it). } } \author{ } \references{ cBio Cancer Genomics Portal: \url{http://www.cbioportal.org/} } \seealso{ \code{\link{cgdsr}},\code{\link{CGDS}},\code{\link{getCancerStudies}},\code{\link{getCaseLists}},\code{\link{getProfileData}} } \examples{ # Create CGDS object mycgds = CGDS("http://www.cbioportal.org/") # Get list of cancer studys at server getCancerStudies(mycgds) # Get available case lists (collection of samples) for a given cancer study mycancerstudy = getCancerStudies(mycgds)[2,1] mycaselist = getCaseLists(mycgds,mycancerstudy)[1,1] # Get available genetic profiles mygeneticprofile = getGeneticProfiles(mycgds,mycancerstudy)[1,1] # Get data slices for a specified list of genes, genetic profile and case list getProfileData(mycgds,c('BRCA1','BRCA2'),mygeneticprofile,mycaselist) }