oligoClasses/0000755000175000017500000000000014147670204013040 5ustar nileshnilesholigoClasses/DESCRIPTION0000644000175000017500000000405614136075651014556 0ustar nileshnileshPackage: oligoClasses Version: 1.56.0 Title: Classes for high-throughput arrays supported by oligo and crlmm Author: Benilton Carvalho and Robert Scharpf Maintainer: Benilton Carvalho and Robert Scharpf Depends: R (>= 2.14) Imports: BiocGenerics (>= 0.27.1), Biobase (>= 2.17.8), methods, graphics, IRanges (>= 2.5.17), GenomicRanges (>= 1.23.7), SummarizedExperiment, Biostrings (>= 2.23.6), affyio (>= 1.23.2), foreach, BiocManager, utils, S4Vectors (>= 0.9.25), RSQLite, DBI, ff Enhances: doMC, doMPI, doSNOW, doParallel, doRedis Suggests: hapmapsnp5, hapmapsnp6, pd.genomewidesnp.6, pd.genomewidesnp.5, pd.mapping50k.hind240, pd.mapping50k.xba240, pd.mapping250k.sty, pd.mapping250k.nsp, genomewidesnp6Crlmm (>= 1.0.7), genomewidesnp5Crlmm (>= 1.0.6), RUnit, human370v1cCrlmm, VanillaICE, crlmm Description: This package contains class definitions, validity checks, and initialization methods for classes used by the oligo and crlmm packages. License: GPL (>= 2) LazyLoad: yes Collate: AllClasses.R AllGenerics.R utils-general.R utils-lds.R utils-parallel.R methods-gSet.R initialize-methods.R methods-AlleleSet.R methods-AnnotatedDataFrame.R methods-FeatureSet.R methods-AssayData.R methods-SnpFeatureSet.R methods-oligoSnpSet.R methods-CopyNumberSet.R methods-CNSet.R methods-PDInfo.R methods-RangedDataCNV.R methods-SnpSet.R methods-GenomeAnnotatedDataFrame.R methods-BeadStudioSet.R methods-BeadStudioSetList.R methods-gSetList.R methods-GRanges.R methods-SummarizedExperiment.R show-methods.R functions.R zzz.R biocViews: Infrastructure ## Local Variables: ## time-stamp-pattern: "8/Date: %3a %3b %2d %02H:%02M:%02S %Z %:y\n" ## End: RoxygenNote: 6.1.1 git_url: https://git.bioconductor.org/packages/oligoClasses git_branch: RELEASE_3_14 git_last_commit: 6e6c7b4 git_last_commit_date: 2021-10-26 Date/Publication: 2021-10-26 NeedsCompilation: no Packaged: 2021-10-26 22:05:29 UTC; biocbuild oligoClasses/man/0000755000175000017500000000000014136047277013621 5ustar nileshnilesholigoClasses/man/getBar.Rd0000644000175000017500000000051514136047277015315 0ustar nileshnilesh\name{getBar} \alias{getBar} \title{ Gets a bar of a given length. } \description{ Gets a bar of a given length. } \usage{ getBar(width = getOption("width")) } \arguments{ \item{width}{desired length of the bar.} } \value{character string.} \author{ Benilton S Carvalho } \examples{ message(getBar()) } \keyword{manip} oligoClasses/man/SnpSet2-class.Rd0000644000175000017500000000513514136047277016515 0ustar nileshnilesh\name{SnpSet2-class} \Rdversion{1.1} \docType{class} \alias{SnpSet2-class} \alias{calls,SnpSet2-method} \alias{calls<-,SnpSet2,matrix-method} \alias{confs,SnpSet2-method} \alias{confs<-,SnpSet2,matrix-method} \alias{exprs,SnpSet2-method} \alias{initialize,SnpSet2-method} \title{Class \code{"SnpSet2"}} \description{ A container for genotype calls and confidence scores. Similar to the \code{SnpSet} class in \pkg{Biobase}, but \code{SnpSet2} extends \code{gSet} directly whereas \code{SnpSet} extends \code{eSet}. Useful properties of \code{gSet} include the \code{genome} slot and the \code{GenomeAnnotatedDataFrame}. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("SnpSet2", assayData, phenoData, featureData, experimentData, annotation, protocolData, call, callProbability, genome, ...)}. %% ~~ describe objects here ~~ } \section{Slots}{ \describe{ \item{\code{genome}:}{Object of class \code{"character"} indicating the UCSC genome build. Supported builds are 'hg18' and 'hg19'.} \item{\code{assayData}:}{Object of class \code{"AssayData"}.} \item{\code{phenoData}:}{Object of class \code{"AnnotatedDataFrame"}.} \item{\code{featureData}:}{Object of class \code{"AnnotatedDataFrame"}.} \item{\code{experimentData}:}{Object of class \code{"MIAxE"}.} \item{\code{annotation}:}{Object of class \code{"character"} ~~ } \item{\code{protocolData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{.__classVersion__}:}{Object of class \code{"Versions"} ~~ } } } \section{Extends}{ Class \code{"\linkS4class{gSet}"}, directly. Class \code{"\linkS4class{eSet}"}, by class "gSet", distance 2. Class \code{"\linkS4class{VersionedBiobase}"}, by class "gSet", distance 3. Class \code{"\linkS4class{Versioned}"}, by class "gSet", distance 4. } \section{Accessors}{ The argument \code{object} for the following methods is an instance of the \code{SnpSet2} class. \describe{ \item{}{ \code{calls(object)}: \code{calls(object) <- value}: Gets or sets the genotype calls. \code{value} can be a \code{matrix} or a \code{ff_matrix}. } \item{}{ \code{confs(object)}: \code{confs(object) <- value}: Gets or sets the genotype confidence scores. \code{value} can be a \code{matrix} or a \code{ff_matrix}. } \item{}{ \code{snpCall(object)}: \code{snpCallProbability(object) <- value}: Gets or sets the genotype confidence scores. } } } \author{ R. Scharpf } \seealso{ \code{\linkS4class{SnpSet}} } \examples{ showClass("SnpSet2") new("SnpSet2") } \keyword{classes} oligoClasses/man/makeFeatureGRanges.Rd0000644000175000017500000000205714136047277017614 0ustar nileshnilesh\name{makeFeatureGRanges} \alias{makeFeatureGRanges} \title{ Construct a GRanges object from several possible feature-level classes } \description{ Construct a GRanges object from several possible feature-level classes. The conversion is useful for subsequent ranged-data queries, such as \code{findOverlaps}, \code{countOverlaps}, etc. } \usage{ makeFeatureGRanges(object, ...) } \arguments{ \item{object}{ A \code{gSet}-derived object containing chromosome and physical position for the markers on the array. } \item{\dots}{ See the \code{makeFeatureGRanges} method for \code{GenomeAnnotatedDataFrame}. } } \value{ A \code{GRanges} object. } \author{ R. Scharpf } \seealso{ \code{\link{findOverlaps}}, \code{\linkS4class{GRanges}}, \code{\linkS4class{GenomeAnnotatedDataFrame}} } \examples{ library(oligoClasses) library(GenomicRanges) library(Biobase) library(foreach) registerDoSEQ() data(oligoSetExample, package="oligoClasses") oligoSet <- oligoSet[chromosome(oligoSet) == 1, ] makeFeatureGRanges(oligoSet) } \keyword{manip} oligoClasses/man/CopyNumberSet-class.Rd0000644000175000017500000000502314136047277017752 0ustar nileshnilesh\name{CopyNumberSet-class} \Rdversion{1.1} \docType{class} \alias{CopyNumberSet-class} \alias{CopyNumberSet} \alias{cnConfidence,CopyNumberSet-method} \alias{cnConfidence<-,CopyNumberSet,matrix-method} \alias{copyNumber,CopyNumberSet-method} \alias{copyNumber<-,CopyNumberSet,matrix-method} \alias{initialize,CopyNumberSet-method} \alias{checkOrder,CopyNumberSet-method} \title{Class \code{"CopyNumberSet"}} \description{ Container for storing total copy number estimates and confidence scores of the copy number estimates. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CopyNumberSet", assayData, phenoData, featureData, experimentData, annotation, protocolData, copyNumber, cnConfidence, ...)}. } \section{Slots}{ \describe{ \item{\code{assayData}:}{Object of class \code{"AssayData"} ~~ } \item{\code{phenoData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{featureData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{experimentData}:}{Object of class \code{"MIAxE"} ~~ } \item{\code{annotation}:}{Object of class \code{"character"} ~~ } \item{\code{protocolData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{.__classVersion__}:}{Object of class \code{"Versions"} ~~ } } } \section{Extends}{ Class \code{"\linkS4class{eSet}"}, directly. Class \code{"\linkS4class{VersionedBiobase}"}, by class "eSet", distance 2. Class \code{"\linkS4class{Versioned}"}, by class "eSet", distance 3. } \section{Methods}{ \describe{ \item{cnConfidence}{\code{signature(object = "CopyNumberSet")}: ... } \item{cnConfidence<-}{\code{signature(object = "CopyNumberSet", value = "matrix")}: ... } \item{coerce}{\code{signature(from = "CNSet", to = "CopyNumberSet")}: ... } \item{copyNumber}{\code{signature(object = "CopyNumberSet")}: ... } \item{copyNumber<-}{\code{signature(object = "CopyNumberSet", value = "matrix")}: ... } \item{initialize}{\code{signature(.Object = "CopyNumberSet")}: ... } } } \author{ R. Scharpf } \note{ This container is primarily for platforms for which genotypes are unavailable. As \code{oligoSnpSet} extends this class, methods related to total copy number that do not depend on genotypes can be defined at this level. } \seealso{ For genotyping platforms, total copy number estimates and genotype calls can be stored in the \code{\linkS4class{oligoSnpSet}} class. } \examples{ showClass("CopyNumberSet") cnset <- new("CopyNumberSet") ls(Biobase::assayData(cnset)) } \keyword{classes} oligoClasses/man/is.ffmatrix.Rd0000644000175000017500000000107214136047277016342 0ustar nileshnilesh\name{is.ffmatrix} \alias{is.ffmatrix} \title{ Check if object is an ff-matrix object. } \description{ Check if object is an ff-matrix object. } \usage{ is.ffmatrix(object) } \arguments{ \item{object}{object to be checked} } \value{ Logical. } \note{ This function is meant to be used by developers. } \examples{ if (isPackageLoaded("ff")){ x1 <- ff(vmode="double", dim=c(10, 2)) is.ffmatrix(x1) } x1 <- matrix(0, nr=10, nc=2) is.ffmatrix(x1) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{manip} oligoClasses/man/locusLevelData.Rd0000644000175000017500000000215114136047277017016 0ustar nileshnilesh\name{locusLevelData} \alias{locusLevelData} \docType{data} \title{Basic data elements required for the HMM} \description{ This object is a list containing the basic data elements required for the HMM } \usage{data(locusLevelData)} \format{ A list } \details{ The basic assay data elements that can be used for fitting the HMM are: 1. a mapping of platform identifiers to chromosome and physical position 2. (optional) a matrix of copy number estimates 3. (optional) a matrix of confidence scores for the copy number estimates (e.g., inverse standard deviations) 4. (optional) a matrix of genotype calls 5. (optional) CRLMM confidence scores for the genotype calls At least (2) or (4) is required. The locusLevelData is a list that contains (1), (2), (4), and (5). } \source{ A HapMap sample on the Affymetrix 50k platform. Chromosomal alterations were simulated. The last 100 SNPs on chromosome 2 are, in fact, a repeat of the first 100 SNPs on chromosome 1 -- this was added for internal use. } \examples{ data(locusLevelData) str(locusLevelData) } \keyword{datasets} oligoClasses/man/defunct.Rd0000644000175000017500000000176314136047277015547 0ustar nileshnilesh\name{Deprecated} \title{oligoClasses Deprecated} \alias{featuresInRange} \alias{featuresInRange,SnpSet2,RangedDataCNV-method} \alias{RangedDataCNV-class} \alias{RangedDataHMM-class} \alias{RangedDataCNV} \alias{RangedDataHMM} \alias{RangedDataCBS} \alias{RangedDataCBS-class} \alias{RangedDataCopyNumber-class} \alias{state,RangedDataCNV-method} %\alias{coverage2} \alias{coverage2,RangedDataCNV-method} \alias{mean,RangedDataCBS-method} \alias{sampleNames,RangedDataCNV-method} \alias{chromosome,RangedDataCNV-method} \alias{findOverlaps,RangedDataCNV,SnpSet-method} \alias{findOverlaps,RangedDataCNV,CNSet-method} \alias{findOverlaps,RangedDataCNV,RangedDataCNV-method} \alias{findOverlaps,RangedDataHMM,RangedDataHMM-method} \alias{findOverlaps,RangedDataCNV,AnnotatedDataFrame-method} \alias{findOverlaps,AnnotatedDataFrame,RangedDataCNV-method} \alias{sampleNames<-,RangedDataCNV,character-method} \description{ The function, class, or data object you asked for has been deprecated.} \keyword{internal} oligoClasses/man/createFF.Rd0000644000175000017500000000072714136047277015575 0ustar nileshnilesh\name{createFF} \alias{createFF} \title{ Create ff objects. } \description{ Creates ff objects (array-like) using settings (path) defined by oligoClasses. } \usage{ createFF(name, dim, vmode = "double", initdata = NULL) } \arguments{ \item{name}{Prefix for filename.} \item{dim}{Dimensions.} \item{vmode}{Mode.} \item{initdata}{NULL.} } \value{ ff object. } \note{ This function is meant to be used by developers. } \seealso{ ff } \keyword{manip} oligoClasses/man/db.Rd0000644000175000017500000000143514136047277014500 0ustar nileshnilesh\name{db} \alias{db} \alias{db-methods} \alias{db,FeatureSet-method} \alias{db,DBPDInfo-method} \alias{db,SnpSet-method} \alias{db,SnpCnvQSet-method} \alias{db,SnpQSet-method} \title{Get the connection to the SQLite Database} \description{ This function will return the SQLite connection to the database associated to objects used in oligo. } \usage{ db(object) } \arguments{ \item{object}{Object of valid class. See methods.} } \section{Methods}{ \describe{ \item{object = "FeatureSet"}{object of class FeatureSet} \item{object = "SnpCallSet"}{object of class SnpCallSet} \item{object = "DBPDInfo"}{object of class DBPDInfo} \item{object = "SnpLevelSet"}{object of class SnpLevelSet} }} \value{ SQLite connection. } \author{Benilton Carvalho} \examples{ ## db(object) } \keyword{methods} oligoClasses/man/requireClusterPkgSetDeprecated.Rd0000644000175000017500000000176214136047277022233 0ustar nileshnilesh\name{requireClusterPkgSet} \alias{requireClusterPkg} \alias{requireClusterPkgSet} \alias{requireClusterPkg-deprecated} \alias{requireClusterPkgSet-deprecated} \title{ DEPRECATED FUNCTIONS. Package loaders for clusters. } \description{ Package loaders for clusters. } \usage{ requireClusterPkgSet(packages) requireClusterPkg(pkg, character.only) } \arguments{ \item{packages}{character vector with the names of the packages to be loaded on the compute nodes.} \item{pkg}{name of a package given as a name or literal character string} \item{character.only}{a logical indicating whether `pkg' can be assumed to be a character string} } \details{ \code{requireClusterPkgSet} applies \code{require} for a set of packages on the cluster nodes. \code{requireClusterPkg} applies \code{require} for *ONE* package on the cluster nodes and accepts every argument taken by \code{require}. } \value{ Logical. } \author{ Benilton S Carvalho } \seealso{require} \keyword{manip} oligoClasses/man/ffdf.Rd0000644000175000017500000000112214136047277015011 0ustar nileshnilesh\name{ffdf-class} \Rdversion{1.1} \docType{class} \alias{ffdf-class} \alias{list_or_ffdf-class} \title{Class "ffdf"} \description{ Extended package ff's class definitions for ff to S4. } \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \section{Slots}{ \describe{ \item{\code{.S3Class}:}{Object of class \code{ffdf} ~~ } } } \section{Extends}{ Class \code{"\linkS4class{oldClass}"}, directly. Class \code{"\linkS4class{list_or_ffdf}"}, directly. } \section{Methods}{ No methods defined with class "ffdf" in the signature. } \keyword{classes} oligoClasses/man/data-sfsExample.Rd0000644000175000017500000000042414136047277017126 0ustar nileshnilesh\name{sfsExample} \alias{sfsExample} \docType{data} \title{SnpFeatureSet Example} \description{ Example of SnpFeatureSet object. } \usage{data(sfsExample)} \format{ Object belongs to SnpFeatureSet class } \examples{ data(sfsExample) class(sfsExample) } \keyword{datasets} oligoClasses/man/clusterOptsDeprecated.Rd0000644000175000017500000000400714136047277020421 0ustar nileshnilesh\name{setCluster} \alias{setCluster} \alias{getCluster} \alias{delCluster} \alias{setCluster-deprecated} \alias{getCluster-deprecated} \alias{delCluster-deprecated} \title{ DEPRECATED FUNCTIONS. Cluster and large dataset management utilities. } \description{ Tools to simplify management of clusters via 'snow' package and large dataset handling through the 'bigmemory' package. } \usage{ setCluster(...) getCluster() delCluster() } \arguments{ \item{\dots}{arguments to be passed to \code{makeCluster} in the 'snow' package.} } \details{ Some methods in the oligo/crlmm packages, like \code{backgroundCorrect}, \code{normalize}, \code{summarize} and \code{rma} can use a cluster (set through 'snow' package). The use of cluster features is conditioned on the availability of the 'bigmemory' (used to provide shared objects across compute nodes) and 'snow' packages. To use a cluster, 'oligo/crlmm' checks for three requirements: 1) 'ff' is loaded; 2) 'snow' is loaded; and 3) the 'cluster' option is set (e.g., via options(cluster=makeCluster(...)) or setCluster(...)). If only the 'ff' package is available and loaded (in addition to the caller package - 'oligo' or 'crlmm'), these methods will allow the user to analyze datasets that would not fit in RAM at the expense of performance. In the situations above (large datasets and cluster), oligo/crlmm uses the options \code{ocSamples} and \code{ocProbesets} to limit the amount of RAM used by the machine(s). For example, if ocSamples is set to 100, steps like background correction and normalization process (in RAM) 100 samples simultaneously on each compute node. If ocProbesets is set to 10K, then summarization processes 10K probesets at a time on each machine. } \section{Warning}{ In both scenarios (large dataset and/or cluster use), there is a penalty in performance because data are written to disk (to either minimize memory footprint or share data across compute nodes). } \author{ Benilton Carvalho } \keyword{manip} oligoClasses/man/AssayDataList.Rd0000644000175000017500000000126614136047277016623 0ustar nileshnilesh\name{AssayDataList} \alias{AssayDataList} \title{Create a list of assay data elements} \description{The eSetList-derived classes have an assayDataList slot instead of an assayData slot. } \usage{ AssayDataList(storage.mode = c("lockedEnvironment", "environment", "list"), ...) } \arguments{ \item{storage.mode}{See \code{assayDataNew}.} \item{\dots}{Named lists of matrices} } \value{ environment } \author{ R.Scharpf } \seealso{ \code{\link{assayDataNew}} } \examples{ r <- replicate(5, matrix(rnorm(25),5,5), simplify=FALSE) r <- lapply(r, function(x,dns) {dimnames(x) <- dns; return(x)}, dns=list(letters[1:5], LETTERS[1:5])) ad <- AssayDataList(r=r) ls(ad) } \keyword{manip} oligoClasses/man/pdPkgFromBioC.Rd0000644000175000017500000000141314136047277016535 0ustar nileshnilesh\name{pdPkgFromBioC} \Rdversion{1.1} \alias{pdPkgFromBioC} \title{ Get packages from BioConductor. } \description{ This function checks if a given package is available on BioConductor and installs it, in case it is. } \usage{ pdPkgFromBioC(pkgname, lib = .libPaths()[1], verbose = TRUE) } \arguments{ \item{pkgname}{ character. Name of the package to be installed. } \item{lib}{ character. Path where to install the package at. } \item{verbose}{ logical. Verbosity flag. } } \details{ Internet connection required. } \value{ Logical: TRUE if package was found, downloaded and installed; FALSE otherwise. } \author{ Benilton Carvalho } \seealso{ download.packages } \examples{ \dontrun{ pdPkgFromBioC("pd.mapping50k.xba240") } } \keyword{data} oligoClasses/man/CopyNumberSet-methods.Rd0000644000175000017500000000521514136047277020313 0ustar nileshnilesh\name{CopyNumberSet-methods} \docType{methods} \alias{CopyNumberSet-methods} \alias{copyNumber} \alias{copyNumber<-} \alias{cnConfidence} \alias{cnConfidence<-} \title{Methods for class CopyNumberSet.} \description{ Accessors and CopyNumberSet } \usage{ copyNumber(object, ...) cnConfidence(object) copyNumber(object) <- value cnConfidence(object) <- value } \arguments{ \item{object}{\code{CopyNumberSet} object or derived class} \item{\dots}{Ignored for \code{CopyNumberSet} and \code{oligoSnpSet}. } \item{value}{matrix} } \value{ \code{copyNumber} returns a matrix of copy number estimates or relative copy number estimates. Since the copy number estimates are stored as integers (copy number * 100), the matrix returned by the \code{copyNumber} accessor will need to be divided by a factor of 100 to transform the measurements back to the original copy number scale. \code{cnConfidence} returns a matrix of confidence scores for the copy number estimates. These are also represented as integers and will require a back-transformation to the original scale. } \keyword{methods} \keyword{manip} \examples{ library(Biobase) data(locusLevelData) path <- system.file("extdata", package="oligoClasses") fd <- readRDS(file.path(path, "genomeAnnotatedDataFrameExample.rds")) ## the following command creates an 'oligoSnpSet' object, storing ## an integer representation of the log2 copy number in the 'copyNumber' element ## of the assayData. Genotype calls and genotype confidence scores are also stored ## in the assayData. oligoSet <- new("oligoSnpSet", copyNumber=integerMatrix(log2(locusLevelData[["copynumber"]]/100), 100), call=locusLevelData[["genotypes"]], callProbability=integerMatrix(locusLevelData[["crlmmConfidence"]], 1), annotation=locusLevelData[["platform"]], featureData=fd, genome="hg19") ## There are several accessors for the oligoSnpSet class. icn <- copyNumber(oligoSet) range(icn) ## integer scale lcn <- icn/100 range(lcn) ## log2 copy number ## confidence scores for the genotypes are also represented on an integer scale ipr <- snpCallProbability(oligoSet) range(ipr) ## integer scale ## for genotype confidence scores, the helper function i2p ## converts back to a probability scale pr <- i2p(ipr) range(pr) ## The helper function confs is a shortcut, extracting the ## integer-based confidence scores and transforming to the ## probability scale pr2 <- confs(oligoSet) all.equal(pr, pr2) ## To extract information on the annotation of the SNPs, one can use position(oligoSet) chromosome(oligoSet) ## the position and chromosome coordinates were extracted from build hg19 genomeBuild(oligoSet) } oligoClasses/man/AssayData-methods.Rd0000644000175000017500000000564414136047277017434 0ustar nileshnilesh\name{AssayData-methods} \Rdversion{1.1} \docType{methods} \alias{corr} \alias{flags,AssayData-method} \alias{nu} \alias{phi} \alias{batchNames,AssayData-method} \alias{batchNames<-,AssayData-method} \alias{nu,AssayData,character-method} \alias{phi,AssayData,character-method} \title{Methods for class AssayData in the oligoClasses package} \description{ Batch statistics used for estimating copy number are stored as AssayData in the 'batchStatistics' slot of the CNSet class. Each element in the AssayData must have the same number of rows and columns. Rows correspond to features and columns correspond to batch. } \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \section{Methods}{ \describe{ \item{batchNames}{\code{signature(object = "AssayData")}: ... } \item{batchNames<-}{\code{signature(object = "AssayData")}: ... } \item{corr}{\code{signature(object = "AssayData", allele = "character")}: ... } \item{nu}{\code{signature(object = "AssayData", allele = "character")}: ... } \item{phi}{\code{signature(object = "AssayData", allele = "character")}: ... } % \item{sigma2}{\code{signature(object = "AssayData", allele = "character")}: ... } % \item{tau2}{\code{signature(object = "AssayData", allele = "character")}: ... } } } \section{Details}{ \code{lM}: Extracts entire list of linear model parameters. \code{corr}: The within-genotype correlation of log2(A) and log2(B) intensities. \code{nu}: The intercept for the linear model. The linear model is fit to the A and B alleles independently. \code{phi}: The slope for the linear model. The linear model is fit independently to the A and B alleles. %\code{sigma2}: For allele A, sigma2 is calculated as the squared MAD %of the log2(intensity) for allele 'A' among subjects with genotype AA. %For allele B, sigma2 is calculated as the squared MAD of the %log2(intensity) for allele 'B' among subjects with genotype BB. %sigma2 can be interpreted as a robust estimate of the signal variance. % %\code{tau2}: For allele A, tau2 is calculated as the squared MAD of %the log2(intensity) for allele 'A' among subjects with genotype BB. %For allele B, tau2 is calculated as the squared MAD of the %log2(intensity) for allele 'B' among subjects with genotype AA. tau2 %can be interpeted as a robust estimate of the background variance. } \seealso{ \code{\link{CNSet-class}} } \examples{ library(crlmm) library(Biobase) data(cnSetExample, package="crlmm") cnSet <- cnSetExample isCurrent(cnSet) assayDataElementNames(batchStatistics(cnSet)) ## Accessors for linear model parameters ## -- Included here primarily as a check that accessors are working ## -- Values are all NA until CN estimation is performed using the crlmm package ## ## subsetting cnSet[1:10, ] ## names of elements in the object ## accessors for parameters nu(cnSet, "A")[1:10, ] nu(cnSet, "B")[1:10, ] phi(cnSet, "A")[1:10, ] phi(cnSet, "B")[1:10, ] } \keyword{classes} oligoClasses/man/isPackageLoaded.Rd0000644000175000017500000000066414136047277017116 0ustar nileshnilesh\name{isPackageLoaded} \alias{isPackageLoaded} \title{ Check if package is loaded. } \description{ Checks if package is loaded. } \usage{ isPackageLoaded(pkg) } \arguments{ \item{pkg}{ Package to be checked. } } \details{ Checks if package name is in the search path. } \value{ Logical. } \seealso{ search } \examples{ isPackageLoaded("oligoClasses") isPackageLoaded("ff") isPackageLoaded("snow") } \keyword{manip} oligoClasses/man/FeatureSetExtensions-class.Rd0000644000175000017500000000501714136047277021345 0ustar nileshnilesh\name{FeatureSet-class} \docType{class} \alias{show,FeatureSet-method} \alias{FeatureSet-class} \alias{FeatureSet} \alias{initialize,FeatureSet-method} \alias{GeneFeatureSet-class} \alias{ExpressionFeatureSet-class} \alias{ExonFeatureSet-class} \alias{SnpFeatureSet-class} \alias{SnpCnvFeatureSet-class} \alias{TilingFeatureSet-class} \alias{TilingFeatureSet2-class} \alias{GenericFeatureSet-class} \alias{GeneFeatureSet} \alias{ExpressionFeatureSet} \alias{ExonFeatureSet} \alias{SnpFeatureSet} \alias{SnpCnvFeatureSet} \alias{TilingFeatureSet} \alias{TilingFeatureSet2} \alias{GenericFeatureSet} \title{"FeatureSet" and "FeatureSet" Extensions} \description{Classes to store data from Expression/Exon/SNP/Tiling arrays at the feature level.} \section{Objects from the Class}{ The FeatureSet class is VIRTUAL. Therefore users are not able to create instances of such class. Objects for FeatureSet-like classes can be created by calls of the form: \code{new(CLASSNAME, assayData, manufacturer, platform, exprs, phenoData, featureData, experimentData, annotation, ...)}. But the preferred way is using parsers like \code{\link[oligo]{read.celfiles}} and \code{\link[oligo]{read.xysfiles}}. } \section{Slots}{ \describe{ \item{\code{manufacturer}:}{Object of class \code{"character"} } \item{\code{assayData}:}{Object of class \code{"AssayData"} } \item{\code{phenoData}:}{Object of class \code{"AnnotatedDataFrame"} } \item{\code{featureData}:}{Object of class \code{"AnnotatedDataFrame"} } \item{\code{experimentData}:}{Object of class \code{"MIAME"} } \item{\code{annotation}:}{Object of class \code{"character"} } \item{\code{.__classVersion__}:}{Object of class \code{"Versions"} } } } \section{Methods}{ \describe{ \item{show}{\code{signature(.Object = "FeatureSet")}: show object contents } \item{bothStrands}{\code{signature(.Object = "SnpFeatureSet")}: checks if object contains data for both strands simultaneously (50K/250K Affymetrix SNP chips - in this case it returns TRUE); if object contains data for one strand at a time (SNP 5.0 and SNP 6.0 - in this case it returns FALSE)} } } \author{Benilton Carvalho} \seealso{\code{\link[Biobase:class.eSet]{eSet}}, \code{\link[Biobase:class.VersionedBiobase]{VersionedBiobase}}, \code{\link[Biobase:class.Versioned]{Versioned}}} \examples{ set.seed(1) tmp <- 2^matrix(rnorm(100), ncol=4) rownames(tmp) <- 1:25 colnames(tmp) <- paste("sample", 1:4, sep="") efs <- new("ExpressionFeatureSet", exprs=tmp) } \keyword{classes} oligoClasses/man/list.celfiles.Rd0000644000175000017500000000172414136047277016654 0ustar nileshnilesh\name{list.celfiles} \alias{list.celfiles} \title{List CEL files.} \description{ Function used to get a list of CEL files. } \usage{ list.celfiles(..., listGzipped=FALSE) } \arguments{ \item{\dots}{Passed to \code{\link{list.files}}} \item{listGzipped}{Logical. List .CEL.gz files?} } \value{ Character vector with filenames. } \note{ Quite often users want to use this function to pass filenames to other methods. In this situations, it is safer to use the argument 'full.names=TRUE'. } \seealso{\code{\link{list.files}}} \examples{ if (require(hapmapsnp5)){ path <- system.file("celFiles", package="hapmapsnp5") ## only the filenames list.celfiles(path) ## the filenames with full path... ## very useful when genotyping samples not in the working directory list.celfiles(path, full.names=TRUE) }else{ ## this won't return anything ## if in the working directory there isn't any CEL list.celfiles(getwd()) } } \keyword{IO} \keyword{utilities} oligoClasses/man/flags.Rd0000644000175000017500000000137314136047277015210 0ustar nileshnilesh\name{flags} \alias{flags} \title{ Batch-level summary of SNP flags. } \description{ Used to flag SNPs with low minor allele frequencies, or for possible problems during the CN estimation step. Currently, this is primarily more for internal use. } \usage{ flags(object) } \arguments{ \item{object}{ An object of class \code{CNSet} } } \value{ A \code{matrix} or \code{ff_matrix} object with rows corresponding to markers and columns corresponding to batch. } \seealso{ \code{\link{batchStatistics}} } \examples{ x <- matrix(runif(250*96*2, 0, 2), 250, 96*2) test1 <- new("CNSet", alleleA=x, alleleB=x, call=x, callProbability=x, batch=as.character(rep(letters[1:2], each=96))) dim(flags(test1)) } \keyword{manip} \keyword{methods} oligoClasses/man/largeObjects.Rd0000644000175000017500000000302014136047277016507 0ustar nileshnilesh\name{initializeBigMatrix} \alias{initializeBigVector} \alias{initializeBigMatrix} \alias{initializeBigArray} \title{ Initialize big matrices/vectors. } \description{ Initialize big matrices or vectors appropriately (conditioned on the status of support for large datasets - see Details). } \usage{ initializeBigMatrix(name=basename(tempfile()), nr=0L, nc=0L, vmode = "integer", initdata = NA) initializeBigVector(name=basename(tempfile()), n=0L, vmode = "integer", initdata = NA) initializeBigArray(name=basename(tempfile()), dim=c(0L,0L,0L), vmode="integer", initdata=NA) } \arguments{ \item{name}{prefix to be used for file stored on disk} \item{nr}{number of rows} \item{nc}{number of columns} \item{n}{length of the vector} \item{vmode}{mode - "integer", "double"} \item{initdata}{Default is NA} %%FIXME \item{dim}{Integer vector indicating the dimensions of the array to initialize} } \details{ These functions are meant to be used by developers. They provide means to appropriately create big vectors or matrices for packages like oligo and crlmm (and friends). These objects are created conditioned on the status of support for large datasets. } \value{ If the 'ff' package is loaded (in the search path), then an 'ff' object is returned. A regular R vector or array is returned otherwise. } \examples{ x <- initializeBigVector("test", 10) class(x) x if (isPackageLoaded("ff")) finalizer(x) <- "delete" rm(x) initializeBigMatrix(nr=5L, nc=5L) initializeBigArray(dim=c(10, 5, 3)) } \keyword{ manip } oligoClasses/man/affyPlatforms.Rd0000644000175000017500000000055214136047277016727 0ustar nileshnilesh\name{affyPlatforms} \alias{affyPlatforms} \title{Available Affymetrix platforms for SNP arrays} \description{ Provides a listing of available Affymetrix platforms currently supported by the R package oligo } \usage{ affyPlatforms() } \value{ A vector of class character. } \author{R. Scharpf} \examples{ affyPlatforms() } \keyword{list} \keyword{misc} oligoClasses/man/gSet-class.Rd0000644000175000017500000000565114136047277016124 0ustar nileshnilesh\name{gSet-class} \Rdversion{1.1} \docType{class} \alias{gSet-class} \alias{gSet} \alias{checkOrder,gSet-method} \alias{db,gSet-method} \alias{genomeBuild,gSet-method} \alias{genomeBuild<-,gSet,character-method} \alias{getArm} \alias{getArm,gSet-method} \alias{initialize,gSet-method} \alias{makeFeatureGRanges,gSet-method} \alias{show,gSet-method} \title{Container for objects with genomic annotation on SNPs} \description{ Container for objects with genomic annotation on SNPs } \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \section{Slots}{ \describe{ \item{\code{featureData}:}{Object of class \code{"GenomeAnnotatedDataFrame"} ~~ } \item{\code{assayData}:}{Object of class \code{"AssayData"} ~~ } \item{\code{phenoData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{experimentData}:}{Object of class \code{"MIAxE"} ~~ } \item{\code{annotation}:}{Object of class \code{"character"} ~~ } \item{\code{protocolData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{genome}:}{Object of class \code{"character"} ~~ } \item{\code{.__classVersion__}:}{Object of class \code{"Versions"} ~~ } } } \section{Extends}{ Class \code{"\linkS4class{eSet}"}, directly. Class \code{"\linkS4class{VersionedBiobase}"}, by class "eSet", distance 2. Class \code{"\linkS4class{Versioned}"}, by class "eSet", distance 3. } \section{Methods}{ The \code{object} for the below methods is a class that extends the virtual class \code{gSet}. \describe{ \item{}{\code{checkOrder(object)}: checks that the object is ordered by chromosome and physical position. Returns \code{logical}.} \item{}{\code{chromosome(object)}: accessor for chromosome in the \code{GenomeAnnotatedDataFrame} slot.} \item{}{\code{chromosome(object) <- value}: replacement method for chromosome in the \code{GenomeAnnotatedDataFrame} slot. \code{value} must be an \code{integer} vector.} \item{}{ \code{db(object)}: database connection } \item{}{ \code{genomeBuild(object)}, \code{genomeBuild(object) <- value}: Get or set the UCSC genome build. Supported builds are hg18 and hg19. } \item{}{ \code{getArm(object)}: Character vector indicating the chromosomal arm for each marker in \code{object}. } \item{}{\code{isSnp(object)}: whether the marker is polymorphic. Returns a \code{logical} vector.} \item{}{ \code{makeFeatureGRanges(object)}: Construct an instance of the \code{GRanges} class from a \code{GenomeAnnotatedDataFrame}. } \item{}{\code{position(object)}: \code{integer} vector of the genomic position} \item{}{ \code{show(object)}: Print a concise summary of \code{object}. } } } \author{ R. Scharpf } \seealso{ \code{\link{chromosome}}, \code{\link{position}}, \code{\link{isSnp}} } \examples{ showClass("gSet") } \keyword{classes} oligoClasses/man/parStatus.Rd0000644000175000017500000000052014136047277016073 0ustar nileshnilesh\name{parStatus} \alias{parStatus} \title{ Checks if oligo/crlmm can use parallel resources. } \description{ Checks if oligo/crlmm can use parallel resources (needs ff and snow package, in addition to options(cluster=makeCluster(...)). } \usage{ parStatus() } \value{logical} \author{ Benilton S Carvalho } \keyword{manip} oligoClasses/man/clusterOpts.Rd0000644000175000017500000000374414136047277016447 0ustar nileshnilesh\name{ocSamples} \alias{ocSamples} \alias{ocProbesets} \title{ Cluster and large dataset management utilities. } \description{ Tools to simplify management of clusters via 'snow' package and large dataset handling through the 'bigmemory' package. } \usage{ ocSamples(n) ocProbesets(n) } \arguments{ \item{n}{integer representing the maximum number of samples/probesets to be processed simultaneously on a compute node.} } \details{ Some methods in the oligo/crlmm packages, like \code{backgroundCorrect}, \code{normalize}, \code{summarize} and \code{rma} can use a cluster (set through the 'foreach' package). The use of cluster features is conditioned on the availability of the 'ff' (used to provide shared objects across compute nodes) and 'foreach' packages. To use a cluster, 'oligo/crlmm' checks for three requirements: 1) 'ff' is loaded; 2) an adaptor for the parallel backend (like 'doMPI', 'doSNOW', 'doMC') is loaded and registered. If only the 'ff' package is available and loaded (in addition to the caller package - 'oligo' or 'crlmm'), these methods will allow the user to analyze datasets that would not fit in RAM at the expense of performance. In the situations above (large datasets and cluster), oligo/crlmm uses the options \code{ocSamples} and \code{ocProbesets} to limit the amount of RAM used by the machine(s). For example, if ocSamples is set to 100, steps like background correction and normalization process (in RAM) 100 samples simultaneously on each compute node. If ocProbesets is set to 10K, then summarization processes 10K probesets at a time on each machine. } \section{Warning}{ In both scenarios (large dataset and/or cluster use), there is a penalty in performance because data are written to disk (to either minimize memory footprint or share data across compute nodes). } \author{ Benilton Carvalho } \examples{ if(require(doMC)) { registerDoMC() ## tasks like summarize() } } \keyword{manip} oligoClasses/man/AlleleSet-class.Rd0000644000175000017500000000511414136047277017066 0ustar nileshnilesh\name{AlleleSet-class} \Rdversion{1.1} \docType{class} \alias{AlleleSet-class} \alias{AlleleSet} \alias{allele} \alias{allele,AlleleSet-method} \alias{allele,SnpFeatureSet-method} \alias{bothStrands} \alias{bothStrands,AlleleSet-method} \alias{bothStrands,SnpFeatureSet-method} \alias{db,AlleleSet-method} \alias{getA,AlleleSet-method} \alias{getM,AlleleSet-method} \title{Class "AlleleSet"} \description{A class for storing the locus-level summaries of the normalized intensities} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("AlleleSet", assayData, phenoData, featureData, experimentData, annotation, protocolData, ...)}. } \section{Slots}{ \describe{ \item{\code{assayData}:}{Object of class \code{"AssayData"} ~~ } \item{\code{phenoData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{featureData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{experimentData}:}{Object of class \code{"MIAME"} ~~ } \item{\code{annotation}:}{Object of class \code{"character"} ~~ } \item{\code{protocolData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{.__classVersion__}:}{Object of class \code{"Versions"} ~~ } } } \section{Extends}{ Class \code{"\linkS4class{eSet}"}, directly. Class \code{"\linkS4class{VersionedBiobase}"}, by class "eSet", distance 2. Class \code{"\linkS4class{Versioned}"}, by class "eSet", distance 3. } \section{Methods}{ \describe{ \item{allele}{\code{signature(object = "AlleleSet")}: extract allele specific summaries. For 50K (XBA and Hind) and 250K (Sty and Nsp) arrays, an additional argument (strand) must be used (allowed values: 'sense', 'antisense'.} \item{bothStrands}{\code{signature(object = "AlleleSet")}: tests if data contains allele summaries on both strands for a given SNP.} \item{bothStrands}{\code{signature(object = "SnpFeatureSet")}: tests if data contains allele summaries on both strands for a given SnpFeatureSet.} \item{db}{\code{signature(object = "AlleleSet")}: link to database connection.} \item{getA}{\code{signature(object = "AlleleSet")}: average intensities (across alleles)} \item{getM}{\code{signature(object = "AlleleSet")}: log-ratio (Allele A vs. Allele B)} } } \author{R. Scharpf} \seealso{ \code{\linkS4class{SnpSuperSet}}, \code{\linkS4class{CNSet}} } \examples{ showClass("AlleleSet") ## an empty AlleleSet x <- new("matrix") new("AlleleSet", senseAlleleA=x, senseAlleleB=x, antisenseAlleleA=x, antisenseAlleleB=x) ##or new("AlleleSet", alleleA=x, alleleB=x) } \keyword{classes} oligoClasses/man/ClassesNotExported.Rd0000644000175000017500000000024214136047277017677 0ustar nileshnilesh\name{ListClasses} \alias{initialize,eSetList-method} \title{eSetList class} \description{ Initialization method for eSetList virtual class. } \keyword{classes} oligoClasses/man/splitVec.Rd0000644000175000017500000000146414136047277015706 0ustar nileshnilesh\name{splitIndicesByLength} \alias{splitIndicesByNode} \alias{splitIndicesByLength} \title{ Tools to distribute objects across nodes or by length. } \description{ Tools to distribute objects across nodes or by length. } \usage{ splitIndicesByLength(x, lg, balance=FALSE) splitIndicesByNode(x) } \arguments{ \item{x}{object to be split} \item{lg}{length} \item{balance}{logical. Currently ignored} } \details{ \code{splitIndicesByLength} splits \code{x} in groups of length \code{lg}. \code{splitIndicesByNode} splits \code{x} in N groups (where N is the number of compute nodes available). } \value{ List. } \author{ Benilton S Carvalho } \seealso{ split } \examples{ x <- 1:100 splitIndicesByLength(x, 8) splitIndicesByLength(x, 8, balance=TRUE) splitIndicesByNode(x) } \keyword{manip} oligoClasses/man/data-scqsExample.Rd0000644000175000017500000000042114136047277017301 0ustar nileshnilesh\name{scqsExample} \alias{scqsExample} \docType{data} \title{SnpCnvQSet Example} \description{ Example of SnpCnvQSet object. } \usage{data(scqsExample)} \format{ Object belongs to SnpCnvQSet class. } \examples{ data(scqsExample) class(scqsExample) } \keyword{datasets} oligoClasses/man/AlleleSet-methods.Rd0000644000175000017500000000556614136047277017437 0ustar nileshnilesh\name{getA} \alias{getA} \alias{getM} \alias{getA,SnpQSet-method} \alias{getM,SnpQSet-method} \alias{getA,SnpCnvQSet-method} \alias{getM,SnpCnvQSet-method} \alias{getM,TilingFeatureSet2-method} \alias{getA,TilingFeatureSet2-method} \alias{A} \alias{A,AlleleSet-method} \alias{A<-} \alias{A<-,AlleleSet-method} \alias{A<-,AlleleSet,matrix-method} \alias{B} \alias{B,AlleleSet-method} \alias{B<-} \alias{B<-,AlleleSet-method} \alias{B<-,AlleleSet,matrix-method} \alias{open,AlleleSet-method} \alias{close,AlleleSet-method} %- Also NEED an '\alias' for EACH other topic documented here. \title{Compute average log-intensities / log-ratios} \description{ Methods to compute average log-intensities and log-ratios across alleles, within strand. } \usage{ getA(object) getM(object) A(object, ...) B(object, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{\code{SnpQSet}, \code{SnpCnvQSet} or \code{TilingFeatureSet2} object.} % \item{con}{\code{AlleleSet} or \code{AlleleSet} extension.} \item{...}{arguments to be passed to \code{allele} - 'sense' and 'antisense' are valid values if the array is pre-SNP_5.0} } \details{ For SNP data, SNPRMA summarizes the SNP information into 4 quantities (log2-scale): \itemize{ \item{antisenseThetaA}{antisense allele A. (Not applicable for Affymetrix 5.0 and 6.0 platforms.)} \item{antisenseThetaB}{antisense allele B. (Not applicable for Affymetrix 5.0 and 6.0 platforms.)} \item{senseThetaA}{sense allele A. (Not applicable for Affymetrix 5.0 and 6.0 platforms.)} \item{senseThataB}{sense allele B. (Not applicable for Affymetrix 5.0 and 6.0 platforms.)} \item{alleleA}{Affymetrix 5.0 and 6.0 platforms} \item{alleleB}{Affymetrix 5.0 and 6.0 platforms} } The average log-intensities are given by: \code{(antisenseThetaA+antisenseThetaB)/2} and \code{(senseThetaA+senseThetaB)/2}. The average log-ratios are given by: \code{antisenseThetaA-antisenseThetaB} and \code{senseThetaA-senseThetaB}. For Tiling data, \code{getM} and \code{getA} return the log-ratio and average log-intensities computed across channels: \code{M = log2(channel1)-log2(channel2)} \code{A = (log2(channel1)+log2(channel2))/2} When large data support is enabled with the ff package, the AssayData elements of an \code{AlleleSet} object can be \code{ff_matrix} or \code{ffdf}, in which case pointers to the ff object are stored in the assay data. The functions \code{open} and \code{close} can be used to open or close the connection, respectively. } \value{ A 3-dimensional array (SNP's x Samples x Strand) with the requested measure, when the input SNP data (50K, 250K). A 2-dimensional array (SNP's x Samples), when the input is from SNP 5.0 and SNP 6.0 arrays. A 2-dimensional array if the input is from Tiling arrays. } \seealso{\code{\link[oligo]{snprma}}} \keyword{manip} oligoClasses/man/assayDataList-methods.Rd0000644000175000017500000000106514136047277020321 0ustar nileshnilesh\name{assayDataList-methods} \docType{methods} \alias{assayDataList} \alias{assayDataList-methods} \alias{assayDataList,oligoSetList-method} \title{Accessor for slot assayDataList in Package \pkg{oligoClasses} } \description{ Accessor for slot assayDataList in Package \pkg{oligoClasses} } \section{Methods}{ \describe{ \item{\code{signature(object = "gSetList")}}{ An object inheriting from class \code{gSetList}. } \item{\code{signature(object = "oligoSetList")}}{ An object inheriting from class \code{gSetList}. } }} \keyword{methods} \keyword{manip} oligoClasses/man/ocLapply.Rd0000644000175000017500000000153314136047277015675 0ustar nileshnilesh\name{ocLapply} \alias{ocLapply} \title{ lapply-like function that parallelizes code when possible. } \description{ ocLapply is an lapply-like function that checks if ff/snow are loaded and if the cluster variable is set to execute FUN on a cluster. If these requirements are not available, then lapply is used. } \usage{ ocLapply(X, FUN, ..., neededPkgs) } \arguments{ \item{X}{first argument to FUN.} \item{FUN}{function to be executed.} \item{\dots}{additional arguments to FUN.} \item{neededPkgs}{packages needed to execute FUN on the compute nodes.} } \details{ \code{neededPkgs} is needed when parallel computing is expected to be used. These packages are loaded on the compute nodes before the execution of FUN. } \value{ A list of length length(X). } \author{ Benilton S Carvalho } \seealso{lapply, parStatus} \keyword{manip} oligoClasses/man/exprs-methods.Rd0000644000175000017500000000123414136047277016712 0ustar nileshnilesh\name{exprs-methods} \docType{methods} \alias{exprs-methods} %\alias{exprs,ExpressionSet-method} \alias{exprs,FeatureSet-method} \alias{se.exprs,FeatureSet-method} %\alias{exprs,SnpSet-method} \title{Accessor for the 'exprs' slot} \description{ Accessor for the 'exprs'/'se.exprs' slot of FeatureSet-like objects } \section{Methods}{ \describe{ \item{object = "ExpressionSet"}{Expression matrix for objects of this class. Usually results of preprocessing algorithms, like RMA.} \item{object = "FeatureSet"}{General container 'exprs' inherited from eSet} \item{object = "SnpSet"}{General container 'exprs' inherited from eSet, not yet used.} }} \keyword{methods} oligoClasses/man/ldOpts.Rd0000644000175000017500000000240514136047277015356 0ustar nileshnilesh\name{ldSetOptions} \alias{ldSetOptions} \alias{ldStatus} \alias{ldPath} \title{ Set/check large dataset options. } \description{ Set/check large dataset options. } \usage{ ldSetOptions(nsamples=100, nprobesets=20000, path=getwd(), verbose=FALSE) ldStatus(verbose=FALSE) ldPath(path) } \arguments{ \item{nsamples}{number of samples to be processed at once.} \item{nprobesets}{number of probesets to be processed at once.} \item{path}{path where to store large dataset objects.} \item{verbose}{verbosity (logical).} } \details{ Some functions in oligo/crlmm can process data in batches to minimize memory footprint. When using this feature, the 'ff' package resources are used (and possibly combined with cluster resources set in options() via 'snow' package). Methods that are executed on a sample-by-sample manner can use ocSamples() to automatically define how many samples are processed at once (on a compute node). Similarly, methods applied to probesets can use ocProbesets(). Users should set these options appropriately. \code{ldStatus} checks the support for large datasets. \code{ldPath} checks where ff files are stored. } \author{ Benilton S Carvalho } \seealso{ocSamples, ocProbesets} \examples{ ldStatus(TRUE) } \keyword{manip} oligoClasses/man/chromosome-methods.Rd0000644000175000017500000000357314136047277017734 0ustar nileshnilesh\name{chromosome-methods} \docType{methods} \alias{chromosome-methods} \alias{chromosome} \alias{chromosome<-} \alias{chromosome,AnnotatedDataFrame-method} \alias{chromosome,SnpSet-method} \alias{chromosome,gSet-method} \alias{chromosome,GenomeAnnotatedDataFrame-method} %\alias{chromosome,RangedDataCNV-method} \alias{chromosome<-,SnpSet,integer-method} \alias{chromosome<-,gSet,integer-method} \alias{chromosome<-,GenomeAnnotatedDataFrame,integer-method} \alias{chromosome,GRanges-method} \alias{chromosome,GRangesList-method} \title{ Methods for function chromosome in package oligoClasses} \description{ Methods for function \code{chromosome} in package \pkg{oligoClasses} ~~ } \section{Methods}{ The methods for \code{chromosome} extracts the chromosome (represented as an integer) for each marker in a \code{eSet}-derived class or a \code{AnnotatedDataFrame}-derived class. \describe{ \item{\code{signature(object = "AnnotatedDataFrame")}}{ Accessor for chromosome. } \item{\code{signature(object = "eSet")}}{ If 'chromosome' is included in \code{fvarLabels(object)}, the integer representation of the chromosome will be returned. Otherwise, an error is thrown. } \item{\code{signature(object = "GenomeAnnotatedDataFrame")}}{ Accessor for chromosome. If annotation was not available due to a missing or non-existent annotation package, the value returned by the accessor will be a vector of zero's.} \item{}{\code{(chromosome(object) <- value)}: Assign chromosome to the \code{AnnotatedDataFrame} slot of an \code{eSet}-derived \code{object}.} \item{\code{signature(object = "RangedDataCNV")}}{Accessor for chromosome.} } } \note{ Integer representation: chr X = 23, chr Y = 24, chr XY = 25. Symbols M, Mt, and MT are coded as 26. } \examples{ chromosome2integer(c(1:22, "X", "Y", "XY", "M")) } \seealso{\code{\link{chromosome2integer}}} \keyword{methods} oligoClasses/man/gSetList-class.Rd0000644000175000017500000000623514136047277016757 0ustar nileshnilesh\name{gSetList-class} \Rdversion{1.1} \docType{class} \alias{gSetList-class} \alias{$,gSetList-method} \alias{$<-,gSetList-method} \alias{[,gSetList-method} \alias{[,gSetList,ANY-method} \alias{[[<-,gSetList,ANY,ANY,BafLrrSet-method} \alias{annotation,gSetList-method} \alias{assayDataList,gSetList-method} \alias{chromosome,gSetList-method} \alias{coerce,gSetList,list-method} \alias{dims,gSetList-method} \alias{elementNROWS,gSetList-method} \alias{featureDataList,gSetList-method} \alias{genomeBuild,gSetList-method} \alias{genomeBuild<-,gSetList,character-method} \alias{initialize,gSetList-method} \alias{length,gSetList-method} \alias{makeFeatureGRanges,gSetList-method} \alias{position,gSetList-method} \alias{sampleNames,gSetList-method} \alias{sampleNames<-,gSetList,character-method} \alias{show,gSetList-method} \title{Virtual Class for Lists of eSets} \description{ Virtual Class for Lists of eSets. } \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \section{Slots}{ \describe{ \item{\code{assayDataList}:}{Object of class \code{"AssayData"} ~~ } \item{\code{phenoData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{protocolData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{experimentData}:}{Object of class \code{"MIAME"} ~~ } \item{\code{featureDataList}:}{Object of class \code{"list"} ~~ } \item{\code{chromosome}:}{Object of class \code{"vector"} ~~ } \item{\code{annotation}:}{Object of class \code{"character"} ~~ } \item{\code{genome}:}{Object of class \code{"character"} ~~ } } } \section{Accessors}{ \code{object} is an instance of a \code{gSetList}-derived class. \describe{ \item{}{ \code{annotation(object)}: character string indicating the package used to provide annotation for the features on the array. } \item{}{ \code{chromosome(object)}: Returns the chromosome corresponding to each element in the \code{gSetList} object } \item{}{ \code{elementNROWS(object)}: Returns the number of rows for each list of assays. In most \code{gSetList}-derived classes, the assays are organized by chromosome and \code{elementNROWS} returns the number of markers for each chromosome. } \item{}{ \code{genomeBuild(object)}, \code{genomeBuild(object) <- value}: Get or set the UCSC genome build. Supported builds are hg18 and hg19. } } } \section{Coercion}{ \code{object} is an instance of a \code{gSetList}-derived class. \describe{ \item{}{ \code{makeFeatureGRanges(object, ...)}: Create a GRanges object for the featureData. The featureData is stored as a list. This method stacks the featureData from each list element. Metadata columns in the GRanges object include physical position ('position'), a SNP indicator ('isSnp'), and the chromosome. The genome build is extracted from \code{object} using the method \code{genomeBuild}. } } } \author{ R. Scharpf } \seealso{ \code{\linkS4class{oligoSetList}}, \code{\linkS4class{BeadStudioSetList}} } \examples{ showClass("gSetList") } \keyword{classes} oligoClasses/man/SnpSet-methods.Rd0000644000175000017500000000627214136047277016774 0ustar nileshnilesh\name{SnpSet-methods} %\docType{methods} \alias{calls} \alias{calls,SnpSet-method} \alias{calls<-} \alias{calls<-,SnpSet,matrix-method} \alias{confs} \alias{confs,SnpSet-method} \alias{confs<-} \alias{confs<-,SnpSet,matrix-method} \alias{checkOrder,SnpSet-method} \title{Accessors and methods for SnpSet objects} \description{ Utility functions for accessing data in \code{SnpSet} objects. } \usage{ calls(object) calls(object) <- value confs(object, transform=TRUE) confs(object) <- value } \arguments{ \item{object}{A \link{SnpSet} object.} \item{transform}{Logical. Whether to transform the integer representation of the confidence score (for memory efficiency) to a probability. See details.} \item{value}{A matrix.} } \details{ \code{calls} returns the genotype calls. CRLMM stores genotype calls as integers (1 - AA; 2 - AB; 3 - BB). \code{confs} returns the confidences associated with the genotype calls. The current implementation of CRLMM stores the confidences as integers to save memory on disk by using the transformation: round(-1000*log2(1-p)), where 'p' is the posterior probability of the call. \code{confs} is a convenience function that transforms the integer representation back to a probability. Note that if the assayData elements of the \code{SnpSet} objects are \code{ff_matrix} or \code{ffdf}, the \code{confs} function will return a warning. For such objects, one should first subset the \code{ff} object and coerce to a matrix, then apply the above conversion. The function \code{snpCallProbability} for the \code{callProbability} slot of \code{SnpSet} objects. See the examples below. \code{checkOrder} checks whether the object is ordered by chromosome and physical position, evaluating to TRUE or FALSE. } \note{ Note that the replacement method for \code{confs<-} expects a matrix of probabilities and will automatically convert the probabilities to an integer representation. See details for the conversion. The accessor \code{\link{snpCallProbability}} is an accessor for the 'callProbability' element of the \code{assayData}. The name can be misleading, however, as the accessor will not return a probability if the call probabilities are represented as integers. } %\section{Methods}{ % \describe{ % \item{\code{initialize(SnpSet)}:}{Object instantiation, used by % \code{new}; not to be called directly by the user.} % \item{\code{calls(object)}:}{accessor for genotype calls} % \item{\code{confs(object)}:}{accessor for crlmm genotype confidence scores} % } %} \seealso{ The helper functions \code{\link{p2i}} converts probabilities to integers and \code{\link{i2p}} converts integers to probabilities. See \code{\link{order}} and \code{\link{checkOrder}}. } \examples{ theCalls <- matrix(sample(1:3, 20, rep=TRUE), nc=2) p <- matrix(runif(20), nc=2) integerRepresentation <- matrix(as.integer(round(-1000*log(1-p))), 10, 2) obj <- new("SnpSet2", call=theCalls, callProbability=integerRepresentation) calls(obj) confs(obj) ## coerces to probability scale int <- Biobase::snpCallProbability(obj) ## not necessarily a probability p3 <- i2p(int) ## to convert back to a probability } \keyword{manip} oligoClasses/man/data-efsExample.Rd0000644000175000017500000000045114136047277017110 0ustar nileshnilesh\name{efsExample} \alias{efsExample} \docType{data} \title{ExpressionFeatureSet Object} \description{ Example of ExpressionFeatureSet Object. } \usage{data(efsExample)} \format{ Object belongs to ExpressionFeatureSet class. } \examples{ data(efsExample) class(efsExample) } \keyword{datasets} oligoClasses/man/annotationPackages.Rd0000644000175000017500000000044414136047277017723 0ustar nileshnilesh\name{annotationPackages} \alias{annotationPackages} \title{Annotation Packages} \description{ \code{annotationPackages} will return a character vector of the names of annotation packages. } \usage{ annotationPackages() } \value{ a character vector of the names of annotation packages } oligoClasses/man/pmFragmentLength-methods.Rd0000644000175000017500000000071214136047277021013 0ustar nileshnilesh\name{pmFragmentLength-methods} \docType{methods} \alias{pmFragmentLength} \alias{pmFragmentLength-methods} \alias{pmFragmentLength,AffySNPPDInfo-method} \title{Information on Fragment Length} \description{ This method will return the fragment length for PM probes. } \section{Methods}{ \describe{ \item{object = "AffySNPPDInfo"}{On \code{AffySNPPDInfo} objects, it will return the fragment length that contains the SNP in question.} }} \keyword{methods} oligoClasses/man/checkExists.Rd0000644000175000017500000000365314136047277016374 0ustar nileshnilesh\name{checkExists} \alias{checkExists} \title{ Checks to see whether an object exists and, if not, executes the appropriate function. } \description{ Only loads an object if the object name is not in the global environment. If not in the global environment and the file exists, the object is loaded (by default). If the file does not exist, the function FUN is run. } \usage{ checkExists(.name, .path = ".", .FUN, .FUN2, .save.it=TRUE, .load.it, ...) } \arguments{ \item{.name}{ Character string giving name of object in global environment } \item{.path}{ Path to where the object is saved. } \item{.FUN}{ Function to be executed if is not in the global environment and the file does not exist. } \item{.FUN2}{ Not currently used. } \item{.save.it}{ Logical. Whether to save the object to the directory indicaged by \code{path}. This argument is ignored if the object was loaded from file or already exists in the .GlobalEnv. } \item{.load.it}{ Logical. If load.it is TRUE, we try to load the object from the indicated \code{path}. The returned object will replace the object in the .GlobalEnv unless the object is bound to a different name (symbol) when the function is executed. } \item{\dots}{ Additional arguments passed to FUN. } } \value{ Could be anything -- depends on what FUN, FUN2 perform. Future versions could return a 0 or 1 indicating whether the function performed as expected. } \author{ R. Scharpf } \examples{ path <- tempdir() dir.create(path) x <- 3+6 x <- checkExists("x", .path=path, .FUN=function(y, z) y+z, y=3, z=6) rm(x) x <- checkExists("x", .path=path, .FUN=function(y, z) y+z, y=3, z=6) rm(x) x <- checkExists("x", .path=path, .FUN=function(y, z) y+z, y=3, z=6) rm(x) ##now there is a file called x.rda in tempdir(). The file will be loaded x <- checkExists("x", .path=path, .FUN=function(y, z) y+z, y=3, z=6) rm(x) unlink(path, recursive=TRUE) } \keyword{manip} oligoClasses/man/batch.Rd0000644000175000017500000000221014136047277015164 0ustar nileshnilesh\name{batch} \alias{batch} \alias{batchNames} \alias{batchNames<-} \title{ The batch variable for the samples. } \description{ Copy number estimates are susceptible to systematic differences between groups of samples that were processed at different times or by different labs. While 'batch' is often unknown, a useful surrogates is often the scan date of the arrays (e.g., the month of the calendar year) or the 96 well chemistry plate on which the samples were arrayed during lab processing. } \usage{ batch(object) batchNames(object) batchNames(object) <- value } \arguments{ \item{object}{ An object of class \code{CNSet}. } \item{value}{ For 'batchNames', the value must be a character string corresponding of the unique batch names. } } \value{ The method 'batch' returns a \code{character} vector that has the same length as the number of samples in the \code{CNSet} object. } \author{ R. Scharpf } \seealso{ \code{\link{CNSet-class}} } \examples{ a <- matrix(1:25, 5, 5) colnames(a) <- letters[1:5] object <- new("CNSet", alleleA=a, batch=rep("batch1", 5)) batch(object) batchNames(object) } \keyword{methods} oligoClasses/man/SummarizedExperiment-methods.Rd0000644000175000017500000000245214136047277021735 0ustar nileshnilesh\name{SummarizedExperiment-methods} \alias{baf,RangedSummarizedExperiment-method} \alias{chromosome,RangedSummarizedExperiment-method} \alias{isSnp,RangedSummarizedExperiment-method} \alias{lrr,RangedSummarizedExperiment-method} \alias{baf,SummarizedExperiment-method} \alias{chromosome,SummarizedExperiment-method} \alias{isSnp,SummarizedExperiment-method} \alias{lrr,SummarizedExperiment-method} \title{Methods for RangedSummarizedExperiment objects} \description{ Methods for \link{RangedSummarizedExperiment}. } \usage{ \S4method{baf}{RangedSummarizedExperiment}(object) \S4method{chromosome}{RangedSummarizedExperiment}(object,...) \S4method{isSnp}{RangedSummarizedExperiment}(object, ...) \S4method{lrr}{RangedSummarizedExperiment}(object) } \arguments{ \item{object}{ A \link{RangedSummarizedExperiment} object. } \item{...}{ignored} } \details{ \code{baf} and \code{lrr} are accessors for the B allele frequencies and log R ratio assays (matrices or arrays), respectively, \code{chromosome} returns the \code{seqnames} of the \code{rowRanges}. \code{isSnp} returns a logical vector for each marker in \code{rowRanges} indicating whether the marker targets a SNP (nonpolymorphic regions are FALSE). } \seealso{ \code{\linkS4class{RangedSummarizedExperiment}} } \keyword{methods} oligoClasses/man/getSequenceLengths.Rd0000644000175000017500000000241314136047277017705 0ustar nileshnilesh\name{getSequenceLengths} \alias{getSequenceLengths} %\alias{setSequenceLengths} \title{Load chromosome sequence lengths for UCSC genome build hg18 or hg19} \description{Load chromosome sequence lengths for UCSC genome build hg18 or hg19} \usage{ getSequenceLengths(build) %setSequenceLengths(build, names) } \arguments{ \item{build}{ character string: "hg18" or "hg19" } % \item{names}{ % % Chromosome names (e.g, 'chr1', 'chr2', ...) % % } } \details{The chromosome sequence lengths for UCSC builds hg18 and hg19 were extracted from the packages BSgenome.Hsapiens.UCSC.hg18 and BSgenome.Hsapiens.UCSC.hg19, respectively. } \value{ Names integer vector of chromosome lengths. } \author{ R. Scharpf } \examples{ getSequenceLengths("hg18") getSequenceLengths("hg19") if(require("GenomicRanges")){ ## from GenomicRanges sl <- getSequenceLengths("hg18")[c("chr1", "chr2", "chr3")] gr <- GRanges(seqnames = Rle(c("chr1", "chr2", "chr1", "chr3"), c(1, 3, 2, 4)), ranges = IRanges(1:10, width = 10:1, names = head(letters,10)), strand = Rle(strand(c("-", "+", "*", "+", "-")), c(1, 2, 2, 3, 2)), score = 1:10, GC = seq(1, 0, length=10), seqlengths=sl) metadata(gr) <- list(genome="hg18") gr metadata(gr) } } \keyword{attribute} oligoClasses/man/checkOrder.Rd0000644000175000017500000000157114136047277016165 0ustar nileshnilesh\name{checkOrder} \alias{checkOrder} \alias{chromosomePositionOrder} \title{Checks whether a eSet-derived class is ordered by chromosome and physical position} \description{ Checks whether a \code{eSet}-derived class (e.g., a \code{SnpSet} or \code{CNSet} object) is ordered by chromosome and physical position } \usage{ checkOrder(object, verbose = FALSE) chromosomePositionOrder(object, ...) } \arguments{ \item{object}{ A \code{SnpSet} or \code{CopyNumberSet}. } \item{verbose}{ Logical. } \item{\dots}{ additional arguments to \code{order} } } \details{ Checks whether the object is ordered by chromosome and physical position. } \value{ Logical } \author{ R. Scharpf } \seealso{ \code{\link{order}} } \examples{ data(oligoSetExample) if(!checkOrder(oligoSet)){ oligoSet <- chromosomePositionOrder(oligoSet) } checkOrder(oligoSet) } \keyword{manip} oligoClasses/man/integerMatrix.Rd0000644000175000017500000000127614136047277016740 0ustar nileshnilesh\name{integerMatrix} \alias{integerMatrix} \alias{integerArray} \title{ Coerce numeric matrix (or array) to a matrix (array) of integers, retaining dimnames. } \description{ Coerce numeric matrix to matrix of integers, retaining dimnames. } \usage{ integerMatrix(x, scale = 100) integerArray(x, scale=100) } \arguments{ \item{x}{a \code{matrix} or \code{array}} \item{scale}{scalar (numeric). If not 1, \code{x} is multiplied by \code{scale} prior to coercing to a matrix of integers.} } \value{ A \code{matrix} or \code{array} of integers. } \author{ R. Scharpf } \examples{ x <- matrix(rnorm(10), 5, 2) rownames(x) = letters[1:5] i <- integerMatrix(x, scale=100) } \keyword{manip} oligoClasses/man/celfileDate.Rd0000644000175000017500000000074214136047277016314 0ustar nileshnilesh\name{celfileDate} \alias{celfileDate} \title{ Cel file dates} \description{ Parses cel file dates from the header of .CEL files for the Affymetrix platform} \usage{ celfileDate(filename) } \arguments{ \item{filename}{ Name of cel file } } \value{ character string } \author{H. Jaffee} \examples{ require(hapmapsnp6) path <- system.file("celFiles", package="hapmapsnp6") celfiles <- list.celfiles(path, full.names=TRUE) dts <- sapply(celfiles, celfileDate) } \keyword{manip} oligoClasses/man/isSnp-methods.Rd0000644000175000017500000000237714136047277016656 0ustar nileshnilesh\name{isSnp-methods} \docType{methods} \alias{isSnp-methods} \alias{isSnp} \alias{isSnp,character-method} \alias{isSnp,SnpSet-method} \alias{isSnp,gSet-method} \alias{isSnp,GenomeAnnotatedDataFrame-method} \title{ Methods for Function isSnp in package oligoClasses~~} \description{ ~~ Methods for function \code{isSnp} in package \pkg{oligoClasses} ~~ } \section{Methods}{ \describe{ Return an indicator for whether the marker is polymorphic (value 1) or nonpolymorphic (value 0). \item{\code{signature(object = "character", pkgname = "character")}}{ Return an indicator for whether the vector of marker identifiers in \code{object} is polymorphic. \code{pkgname} must be one of the supported annotation packages specific to the platform. } \item{\code{signature(object = "eSet", pkgname = "ANY")}}{ If 'isSnp' is included in \code{fvarLabels(object)}, an indicator for polymorphic markers is returned. Otherwise, an error is thrown. } \item{\code{signature(object = "GenomeAnnotatedDataFrame", pkgname = "ANY")}}{ Accessor for indicator of whether the marker is polymorphic. If annotation was not available due to a missing or non-existent annotation package, the value returned by the accessor will be a vector of zero's. } } } \keyword{methods} oligoClasses/man/length-methods.Rd0000644000175000017500000000046614136047277017040 0ustar nileshnilesh\name{length-methods} \docType{methods} \alias{length-methods} \alias{length,FeatureSet-method} \title{Number of samples for FeatureSet-like objects.} \description{ Number of samples for FeatureSet-like objects. } \section{Methods}{ \describe{ \item{x = "FeatureSet"}{Number of samples} }} \keyword{methods} oligoClasses/man/oligoSnpSet-methods.Rd0000644000175000017500000000403014136047277020014 0ustar nileshnilesh\name{oligoSnpSet-methods} \docType{methods} \alias{oligoSnpSet-class} \alias{initialize,oligoSnpSet-method} \alias{baf,oligoSnpSet-method} \alias{baf<-,oligoSnpSet-method} \alias{coerce,oligoSnpSet,data.frame-method} \alias{copyNumber,oligoSnpSet-method} \alias{copyNumber<-,oligoSnpSet,matrix-method} \alias{calls,oligoSnpSet-method} \alias{calls<-,oligoSnpSet,matrix-method} \alias{cnConfidence,oligoSnpSet-method} \alias{cnConfidence<-,oligoSnpSet,matrix-method} \alias{callsConfidence,oligoSnpSet-method} \alias{callsConfidence<-,oligoSnpSet,matrix-method} \alias{position<-,oligoSnpSet,integer-method} \alias{updateObject,oligoSnpSet-method} \title{Methods for oligoSnpSet class} \description{Methods for oligoSnpSet class} \section{Methods}{ In the following code, \code{object} is an instance of the \code{oligoSnpSet} class. \describe{ \item{}{ \code{new("oligoSnpSet", ...)}: Instantiates an object of class \code{oligoSnpSet}. The assayData elements of the \code{oligoSnpSet} class can include matrices of genotype calls, confidence scores for the genotype calls, B allele frequencies, absolute or relative copy number, and confidence scores for the copy number estimates. Each matrix should be coerced to an integer scale prior to assignment to the \code{oligoSnpSet} object. Validity methods defined for the class will fail if the matrices are not integers. See examples for additional details. } \item{}{ \code{baf(object)}: Accessor for integer representation of the B allele frequencies. The value returned by this method can be divided by 1000 to obtain B allele frequencies on the original [0,1] scale. } \item{}{ \code{baf(object) <- value}: Assign an integer representation of the B allele frequencies to the 'baf' element of the assayData slot. \code{value} must be a matrix of integers. See the examples for help converting BAFs to a matrix of integers. } } } %\examples{} \keyword{methods} oligoClasses/man/ff_or_matrix-class.Rd0000644000175000017500000000115214136047277017671 0ustar nileshnilesh\name{ff_or_matrix-class} \Rdversion{1.1} \docType{class} \alias{ff_or_matrix-class} \title{Class \code{"ff_or_matrix"}} \description{ A class union of 'ffdf', 'ff_matrix', and 'matrix' } \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \section{Methods}{ \describe{ \item{GenomeAnnotatedDataFrameFrom}{\code{signature(object = "ff_or_matrix")}: ... } } } \author{ R. Scharpf } %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link[ff]{ff}}, \code{\link[ff]{ffdf}} } \examples{ showClass("ff_or_matrix") } \keyword{classes} oligoClasses/man/BeadStudioSetList-class.Rd0000644000175000017500000000630614136047277020553 0ustar nileshnilesh\name{BeadStudioSetList-class} \Rdversion{1.1} \docType{class} \alias{BeadStudioSetList-class} \alias{BafLrrSetList-class} \alias{oligoSetList-class} \alias{[[,BeadStudioSetList,ANY,ANY-method} \alias{[[,BafLrrSetList,ANY,ANY-method} \alias{[[<-,BafLrrSetList,ANY,ANY,BafLrrSet-method} \alias{baf,BeadStudioSetList-method} \alias{baf,BafLrrSetList-method} \alias{baf,oligoSetList-method} \alias{calls,oligoSetList-method} \alias{clone2} \alias{clone2,BafLrrSetList-method} \alias{copyNumber,oligoSetList-method} \alias{initialize,BeadStudioSetList-method} \alias{lrr,BeadStudioSetList-method} \alias{lrr,BafLrrSetList-method} \alias{lrr<-,BafLrrSetList,matrix-method} \alias{updateObject,BeadStudioSetList-method} \title{List classes with assay data listed by chromosome} \description{ Container for log R ratios and B allele frequencies stored by chromosome. } \section{Slots}{ \describe{ \item{\code{assayDataList}:}{Object of class \code{"AssayData"} ~~ } \item{\code{phenoData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{featureDataList}:}{Object of class \code{"list"} ~~ } \item{\code{chromosome}:}{Object of class \code{"integer"} ~~ } \item{\code{annotation}:}{Object of class \code{"character"} ~~ } \item{\code{genome}:}{Object of class \code{"character"} indicating the genome build. Valid entries are "hg18" and "hg19". } } } \section{Methods defined for the class}{ \describe{ \item{}{\code{clone2(object, id, prefix="",...)} Performs a deep copy of the ff objects in the assay data elements of \code{object}. A new object of the same class will be instantiated. The ff objects in the instantiated object will point to ff files on disk with prefix given by the argument \code{prefix}. A use-case for such a function is that one may want to perform wave correction on the log R ratios in \code{object}, but keep a copy of the original unadjusted log R ratios. If \code{object} is not copied using \code{clone2} prior to wave correction, the log R ratios will be updated on disk and the original, unadjusted log R ratios will no longer be available. } } } \section{Accessors}{ \describe{ \item{}{\code{baf(object)}An accessor for the B allele frequencies (BAFs). The accessor returns a list where each element of the list is a matrix of the BAFs for the corresponding element in the SetList object. While the BAFs have a range [0, 1], they are often saved internally as integers by multiplying the original BAFs by 1000. Users can restore the original scale by dividing by 1000.} \item{}{\code{lrr(object)} An accessor for the log R ratios, an estimate of the copy number (presumably relative to diploid copy number) at each marker on a SNP array. The accessor returns a list where each element of the list is a matrix of the log R ratios for the corresponding element in the SetList object. The log R ratios are often saved internally as integers by multiplying the original LRRs by 100 in order to reduce the memory footprint of large studies. Users can restore the original scale by dividing by 100.} } } \author{ R. Scharpf } \seealso{ See supporting packages for methods defined for the class. } \keyword{classes} oligoClasses/man/ff_matrix.Rd0000644000175000017500000000123114136047277016064 0ustar nileshnilesh\name{ff_matrix-class} \Rdversion{1.1} \docType{class} \alias{ff_matrix-class} \alias{annotatedDataFrameFrom,ff_matrix-method} \title{Class "ff_matrix"} \description{ ~~ A concise (1-5 lines) description of what the class is. ~~ } \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \section{Slots}{ \describe{ \item{\code{.S3Class}:}{Object of class \code{"character"} ~~ } } } \section{Extends}{ Class \code{"\linkS4class{oldClass}"}, directly. } \section{Methods}{ \describe{ \item{annotatedDataFrameFrom}{\code{signature(object = "ff_matrix")}: ... } } } \examples{ showClass("ff_matrix") } \keyword{classes} oligoClasses/man/fileConnections.Rd0000644000175000017500000000220614136047277017232 0ustar nileshnilesh\name{fileConnections} \alias{open} \alias{openff} \alias{openff,CNSet-method} \alias{close} \alias{closeff} \alias{closeff,CNSet-method} \alias{open,matrix-method} \alias{open,numeric-method} \alias{open,array-method} \alias{close,matrix-method} \alias{close,numeric-method} \alias{close,array-method} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Open and close methods for matrices and numeric vectors } \description{ \code{CNSet} objects can contain \code{ff}-derived objects that contain pointers to files on disk, or ordinary matrices. Here we define open and close methods for ordinary matrices and vectors that that simply pass back the original matrix/vector. } \usage{ open(con, ...) openff(object) closeff(object) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{con}{ matrix or vector } \item{object}{ A \code{CNSet} object.} \item{\dots}{Ignored} } \value{ not applicable } \author{ R. Scharpf } \examples{ open(rnorm(15)) open(matrix(rnorm(15), 5,3)) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{manip} oligoClasses/man/GRanges-methods.Rd0000644000175000017500000000605014136047277017100 0ustar nileshnilesh\name{GRanges-methods} \docType{methods} %\alias{coverage2,GRanges-method} %\alias{coverage2,GRangesList-method} \alias{state} \alias{coverage2} \alias{numberProbes} \alias{coverage2,GRanges-method} \alias{coverage2,GRangesList-method} \alias{numberProbes,GRanges-method} \alias{numberProbes,GRangesList-method} \alias{findOverlaps,GRanges,gSet-method} \alias{findOverlaps,GRangesList,gSet-method} \alias{genomeBuild,GRanges-method} \alias{sampleNames,GRanges-method} \alias{sampleNames,GRangesList-method} \alias{state,GRanges-method} \alias{state,GRangesList-method} \title{Methods for GRanges objects} \description{Methods for GRanges objects} \section{findOverlaps methods}{ \describe{ \item{}{ \code{findOverlaps(query, subject, ...)}: Find the feature indices in \code{subject} that overlap the genomic intervals in \code{query}, where \code{query} is a \code{GRanges} object and subject is a \code{gSet}-derived object. Additional arguments to the \code{findOverlaps} method in the package \pkg{IRanges} can be passed through the \code{\dots} operator. } } } \section{Accessors}{ \code{object} is an instance of the \code{GRanges} class. \describe{ \item{}{ \code{coverage2(object)}: For the \code{GRanges} and \code{GRangesList} objects returned by the hidden Markov model implemented in the "VanillaICE" package and the segmentation algorithm in the "MinimumDistance" package, the intervals are annotated by the number of probes (markers) for SNPs and nonpolymorphic regions. \code{coverage2} and \code{numberProbes} are convenient accessors for these annotations. } \item{}{ \code{genomeBuild(object)}: Accessor for the UCSC genome build. } \item{}{ \code{numberProbes(object)}: Integer vector indicating the number of probes (markers) for each range in \code{object}. Equivalent to \code{coverage2}. } \item{}{ \code{state(object)}: Accessor for the \code{elementMetadata} column 'state', when applicable. State is used to contain the index of the inferred copy number state for various \code{hmm} methods defined in the \pkg{VanillaICE}. } } } \seealso{\code{\linkS4class{GRanges}}} \examples{ library(IRanges) library(GenomicRanges) gr1 <- GRanges(seqnames = "chr2", ranges = IRanges(3, 6), state=3L, numberProbes=100L) ## convenience functions state(gr1) numberProbes(gr1) gr2 <- GRanges(seqnames = c("chr1", "chr1"), ranges = IRanges(c(7,13), width = 3), state=c(2L, 2L), numberProbes=c(200L, 250L)) gr3 <- GRanges(seqnames = c("chr1", "chr2"), ranges = IRanges(c(1, 4), c(3, 9)), state=c(1L, 4L), numberProbes=c(300L, 350L)) ## Ranges organized by sample grl <- GRangesList("sample1" = gr1, "sample2" = gr2, "sample3" = gr3) sampleNames(grl) ## same as names(grl) numberProbes(grl) chromosome(grl) state(grl) gr <- stack(grl) sampleNames(gr) chromosome(gr) state(gr) } \keyword{methods} oligoClasses/man/geometry-methods.Rd0000644000175000017500000000064714136047277017413 0ustar nileshnilesh\name{geometry} \alias{geometry} \alias{geometry,DBPDInfo-method} \alias{geometry,FeatureSet-method} \title{Array Geometry Information} \description{ For a given array, \code{geometry} returns the physical geometry of it. } \usage{ geometry(object) } \arguments{ \item{object}{\code{PDInfo} or \code{FeatureSet} object} } \examples{ if (require(pd.mapping50k.xba240)) geometry(pd.mapping50k.xba240) } \keyword{manip} oligoClasses/man/GenomeAnnotatedDataFrame-class.Rd0000644000175000017500000000513114136047277022030 0ustar nileshnilesh\name{GenomeAnnotatedDataFrame-class} \Rdversion{1.1} \docType{class} \alias{GenomeAnnotatedDataFrame-class} \alias{GenomeAnnotatedDataFrame} \alias{coerce,AnnotatedDataFrame,GenomeAnnotatedDataFrame-method} \alias{getArm,GenomeAnnotatedDataFrame-method} \alias{initialize,GenomeAnnotatedDataFrame-method} \alias{makeFeatureGRanges,GenomeAnnotatedDataFrame-method} \alias{position<-} \alias{position<-,GenomeAnnotatedDataFrame,integer-method} \alias{updateObject,GenomeAnnotatedDataFrame-method} \title{Class \code{"GenomeAnnotatedDataFrame"}} \description{ AnnotatedDataFrame with genomic coordinates (chromosome, position) } \section{Slots}{ \describe{ \item{\code{varMetadata}:}{Object of class \code{"data.frame"} ~~ } \item{\code{data}:}{Object of class \code{"data.frame"} ~~ } \item{\code{dimLabels}:}{Object of class \code{"character"} ~~ } \item{\code{.__classVersion__}:}{Object of class \code{"Versions"} ~~ } } } \section{Extends}{ Class \code{"\linkS4class{AnnotatedDataFrame}"}, directly. Class \code{"\linkS4class{Versioned}"}, by class "AnnotatedDataFrame", distance 2. } \section{Coercion to or from other classes}{ \describe{ \item{}{ \code{as(from, "GenomeAnnotatedDataFrame")}: Coerce an object of class \code{AnnotatedDataFrame} to a \code{GenomeAnnotatedDataFrame}. } \item{}{ \code{makeFeatureGRanges(object, genome, ...)}: Construct a \code{GRanges} instance from a \code{GenomeAnnotatedDataFrame} object. \code{genome} is a character string indicating the UCSC build. Supported builds are "hg18" and "hg19", but are platform specific. In particular, some platforms only support build hg19 at this time. } \item{}{ \code{updateObject(object)}: For updating a \code{GenomeAnnotatedDataFrame} } } } \section{Accessors}{ \describe{ \item{}{ \code{chromosome(object)}, \code{chromosome(object) <- value} Get or set chromosome. } \item{}{ \code{isSnp(object)}: Many platforms include polymorphic and nonpolymorphic markers. isSnp evalutes to \code{TRUE} if the marker is polymorphic. } \item{}{ \code{position(ojbect)}: Physical position in the genome } \item{}{ \code{getArm(object, genome)}: Retrieve character vector indicating the chromosome arm of each marker in \code{object}. \code{genome} should indicate which genome build was used to define the chromosomal locations (currently, only UCSC genome builds 'hg18' and 'hg19' supported for this function). } } } \author{ R. Scharpf } oligoClasses/man/SnpSuperSet-class.Rd0000644000175000017500000000317714136047277017456 0ustar nileshnilesh\name{SnpSuperSet-class} \Rdversion{1.1} \docType{class} \alias{SnpSuperSet-class} \alias{SnpSuperSet} \alias{initialize,SnpSuperSet-method} \title{Class "SnpSuperSet"} \description{A class to store locus-level summaries of the quantile normalized intensities, genotype calls, and genotype confidence scores} \section{Objects from the Class}{ \code{new("SnpSuperSet", allelea=alleleA, alleleB=alleleB, call=call, callProbability, ...)}. } \section{Slots}{ \describe{ \item{\code{assayData}:}{Object of class \code{"AssayData"} ~~ } \item{\code{phenoData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{featureData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{experimentData}:}{Object of class \code{"MIAME"} ~~ } \item{\code{annotation}:}{Object of class \code{"character"} ~~ } \item{\code{protocolData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{.__classVersion__}:}{Object of class \code{"Versions"} ~~ } } } \section{Extends}{ Class \code{"\linkS4class{AlleleSet}"}, directly. Class \code{"\linkS4class{SnpSet}"}, directly. Class \code{"\linkS4class{eSet}"}, by class "AlleleSet", distance 2. Class \code{"\linkS4class{VersionedBiobase}"}, by class "AlleleSet", distance 3. Class \code{"\linkS4class{Versioned}"}, by class "AlleleSet", distance 4. } \section{Methods}{ No methods defined with class "SnpSuperSet" in the signature. } \author{R. Scharpf} \seealso{ \code{\linkS4class{AlleleSet}} } \examples{ showClass("SnpSuperSet") ## empty object from the class x <- new("matrix") new("SnpSuperSet", alleleA=x, alleleB=x, call=x, callProbability=x) } \keyword{classes} oligoClasses/man/CNSet-class.Rd0000644000175000017500000001304614136047277016173 0ustar nileshnilesh\name{CNSet-class} \Rdversion{1.1} \docType{class} \alias{CNSet-class} \alias{CNSet} \alias{[,CNSet-method} \alias{[,CNSet,ANY-method} \alias{A,CNSet-method} \alias{A<-,CNSet-method} \alias{allele,CNSet-method} \alias{B,CNSet-method} \alias{B<-,CNSet-method} \alias{batch,CNSet-method} \alias{batchNames,CNSet-method} \alias{batchNames<-,CNSet-method} \alias{batchStatistics,CNSet-method} \alias{batchStatistics<-,CNSet,AssayData-method} \alias{calls,CNSet-method} \alias{calls<-,CNSet,matrix-method} \alias{close,CNSet-method} \alias{coerce,CNSetLM,CNSet-method} \alias{coerce,CNSet,CopyNumberSet-method} \alias{coerce,CNSet,oligoSnpSet} \alias{coerce,CNSet,oligoSnpSet-method} \alias{confs,CNSet-method} \alias{confs<-,CNSet,matrix-method} \alias{corr,CNSet,character-method} \alias{flags,CNSet-method} \alias{initialize,CNSet-method} \alias{initialize,CNSetLM-method} %\alias{lM,CNSet-method} \alias{nu,CNSet,character-method} \alias{open,CNSet-method} \alias{phi,CNSet,character-method} \alias{show,CNSet-method} \alias{snpCallProbability,CNSet-method} \alias{sigma2,CNSet,character-method} \alias{tau2,CNSet,character-method} \alias{updateObject,CNSet-method} \title{Class "CNSet"} \description{ CNSet is a container for intermediate data and parameters pertaining to allele-specific copy number estimation. Methods for CNSet objects, including accessors for linear model parameters and allele-specific copy number are included here. } \section{Objects from the Class}{ An object from the class is not generally intended to be initialized by the user, but returned by the \code{genotype} function in the \code{crlmm} package. The following creates a very basic \code{CNSet} with \code{assayData} containing the required elements. \code{new(CNSet, alleleA=new("matrix"), alleleB=new("matrix"), call=new("matrix"), callProbability=new("matrix"), batch=new("factor"))} } \section{Slots}{ \describe{ \item{\code{batch}:}{Object of class \code{"factor"} ~~ } \item{\code{batchStatistics}:}{Object of class \code{"AssayData"} ~~ } \item{\code{assayData}:}{Object of class \code{"AssayData"} ~~ } \item{\code{phenoData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{featureData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{experimentData}:}{Object of class \code{"MIAME"} ~~ } \item{\code{annotation}:}{Object of class \code{"character"} ~~ } \item{\code{protocolData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{datadir}:}{Object of class \code{"list"}~~} \item{\code{mixtureParams}:}{Object of class \code{"matrix"}~~} \item{\code{.__classVersion__}:}{Object of class \code{"Versions"} ~~ } } } \section{Methods}{ The argument \code{object} for the following methods is a \code{CNSet}. \describe{ \item{}{\code{object[i, j]}: subset the \code{CNSet} object by markers (i) and/or samples (j). } \item{}{\code{A(objet)}: accessor for the normalized intensities of allele A} \item{}{\code{A(object) <- value}: replace intensities for the A allele intensities by \code{value}. The object \code{value} must be a \code{matrix}, \code{ff_matrix}, or \code{ffdf}.} \item{}{\code{allele(object, allele)}: accessor for the normalized intensities for the A or B allele. The argument for \code{allele} must be either 'A' or 'B'} \item{}{\code{B(objet)}: accessor for the normalized intensities of allele B} \item{}{\code{B(object) <- value}: replace intensities for the B allele intensities by \code{value}. The object \code{value} must be a \code{matrix}, \code{ff_matrix}, or \code{ffdf}.} \item{}{\code{batch(object)}: vector of batch labels for each sample.} \item{}{\code{batchNames(object)}: the unique batch names} %\item{batchNames<-}{\code{signature(object = "CNSet")}: ... } \item{}{\code{batchNames(object) <- value}: relabel the batches} \item{}{\code{calls(object)}: accessor for genotype calls coded as 1 (AA), 2 (AB), or 3 (BB). Nonpolymorphic markers are \code{NA}.} \item{}{\code{confs(object)}: accessor for the genotype confidence scores.} \item{}{\code{close(object)}: close any open file connections to \code{ff} objects stored in the \code{CNSet} object.} %\item{coerce}{\code{signature(from="CNSet")}: ... } \item{}{\code{as(object, "oligoSnpSet")}: coerce a \code{CNSet} object to an object of class \code{oligoSnpSet} -- a container for the total copy number and genotype calls.} % \item{corr}{\code{signature(object = "CNSet", allele = % "character")}: ... } \item{}{\code{corr(object)}: the correlation of the A and B intensities within each genotype.} %\item{flags}{\code{signature(object="CNSet")}: SNP flags } \item{}{\code{flags(object)}: flags to indicate possible problems with the copy number estimation. Not fully implemented at this point.} \item{}{\code{new("CNSet")}: instantiating a \code{CNSet} object.} \item{}{\code{nu(object, allele)}: accessor for the intercept (background) for the A and B alleles. The value of \code{allele} must be 'A' or 'B'.} \item{}{\code{open(object)} open file connections for all \code{ff} objects stored in the \code{CNSet} object.} \item{}{\code{nu(object, allele)}: accessor for the slope for the A and B alleles. The value of \code{allele} must be 'A' or 'B'.} \item{}{\code{sigma2(object, allele)}: accessor for the within genotype variance} \item{}{\code{tau2(object, allele)}: accessor for background variance} } } \author{ R. Scharpf } \examples{ new("CNSet") } \keyword{classes} oligoClasses/man/celfileName.Rd0000644000175000017500000000264014136047277016316 0ustar nileshnilesh\name{celfileName} \alias{celfileName} \title{ Extracts complete cel file name from a CNSet object } \description{ Returns the complete cel file (including path) for a CNSet object } \usage{ celfileName(object) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{ An object of class \code{CNSet} } } \value{ Character string vector. } \author{ R. Scharpf } \note{ If the CEL files for an experiment are relocated, the \code{datadir} should be updated accordingly. See examples. } \examples{ \dontrun{ if(require(crlmm)){ data(cnSetExample, package="crlmm") celfileName(cnSetExample) } } } % datadir=list(dirname="/thumper/ctsa/snpmicroarray/hapmap/raw/affy/1m", % n=2L) % fnames <- list.files("/thumper/ctsa/snpmicroarray/hapmap/raw/affy/1m", pattern=".CEL$") % fnames <- fnames[c(grep(sampleNames(cnSetExample)[1], fnames), % grep(sampleNames(cnSetExample)[2], fnames))] % protocolData(cnSetExample)$filename <- fnames % tmp@datadir <- list(dir="/thumper/ctsa/snpmicroarray/hapmap/raw/affy/1m", 2L) % protocolData(tmp) <- protocolData(cnSetExample) % % data(cnSetExample2) % tmp <- updateObjectFromSlots(cnSetExample2) % tmp@datadir <- list(dir="/thumper/ctsa/snpmicroarray/hapmap/raw/affy/phase3_1m", n=1258L) % protocolData(tmp)$filename <- tmp$celFiles % phenoData(tmp)=phenoData(tmp)[, -4] % cnSetExample2=tmp % } \keyword{manip} oligoClasses/man/i2p_p2i.Rd0000644000175000017500000000132514136047277015355 0ustar nileshnilesh\name{i2p} \alias{i2p} \alias{p2i} \title{ Functions to convert probabilities to integers, or integers to probabilities. } \description{ Probabilities estimated in the \code{crlmm} package are often stored as integers to save memory. We provide a few utility functions to go back and forth between the probability and integer representations. } \usage{ i2p(i) p2i(p) } \arguments{ \item{i}{ A matrix or vector of integers.} \item{p}{ A matrix or vector of probabilities.} } \value{ The value returned by \code{i2p} is 1 - exp(-i/1000) The value returned by \code{2pi} is as.integer(-1000*log(1-p)) } \seealso{ \code{\link{confs}}} \examples{ i2p(693) p2i(0.5) i2p(p2i(0.5)) } \keyword{manip} oligoClasses/man/kind.Rd0000644000175000017500000000137214136047277015040 0ustar nileshnilesh\name{kind} \alias{kind} \alias{kind,AffySNPPDInfo-method} \alias{kind,AffySNPCNVPDInfo-method} \alias{kind,AffyExonPDInfo-method} \alias{kind,ExpressionPDInfo-method} \alias{kind,TilingPDInfo-method} \alias{kind,AffyExpressionPDInfo-method} \alias{kind,AffyGenePDInfo-method} \alias{kind,AffyHTAPDInfo-method} \alias{kind,GenericPDInfo-method} \alias{kind,FeatureSet-method} \title{Array type} \description{ Retrieves the array type. } \usage{ kind(object) } \arguments{ \item{object}{\code{FeatureSet} or \code{DBPDInfo} object} } \value{ String: "Expression", "Exon", "SNP" or "Tiling" } \examples{ if (require(pd.mapping50k.xba240)){ data(sfsExample) Biobase::annotation(sfsExample) <- "pd.mapping50k.xba240" kind(sfsExample) } } \keyword{manip} oligoClasses/man/batchStatistics.Rd0000644000175000017500000000207214136047277017245 0ustar nileshnilesh\name{batchStatistics} \alias{batchStatistics} \alias{batchStatistics<-} \title{ Accessor for batch statistics uses for copy number estimation and storage of model parameters } \description{ The \code{batchStatistics} slot contains statistics estimated from each batch that are used to derive copy number estimates. } \usage{ batchStatistics(object) batchStatistics(object) <- value } \arguments{ \item{object}{ An object of class \code{CNSet}} \item{value}{An object of class \code{AssayData}} } \details{ An object of class \code{AssayData} for slot \code{batchStatistics} is initialized automatically when creating a new \code{CNSet} instance. Required in the call to \code{new} is a factor called \code{batch} whose unique values determine the number of columns for each assay data element. } \value{ \code{batchStatics} is an accessor for the slot \code{batchStatistics} that returns an object of class \code{AssayData}. } \seealso{ \code{\link{CNSet-class}}, \code{\link{batchNames}}, \code{\link{batch}} } \keyword{manip} \keyword{methods} oligoClasses/man/generics.Rd0000644000175000017500000000070714136047277015713 0ustar nileshnilesh\name{generics} \alias{baf} \alias{lrr} \title{ Miscellaneous generics. Methods defined in packages that depend on oligoClasses} \description{Miscellaneous generics. Methods defined in packages that depend on oligoClasses } \usage{ baf(object) lrr(object) } \arguments{ \item{object}{A \code{eSet}-derived class.} } \author{ R. Scharpf } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{misc} oligoClasses/man/sampleNames-methods.Rd0000644000175000017500000000052014136047277020013 0ustar nileshnilesh\name{sampleNames-methods} \docType{methods} \alias{sampleNames-methods} \alias{sampleNames,FeatureSet-method} \title{Sample names for FeatureSet-like objects} \description{ Returns sample names for FeatureSet-like objects. } \section{Methods}{ \describe{ \item{object = "FeatureSet"}{Sample names} } } \keyword{methods} oligoClasses/man/BeadStudioSet-class.Rd0000644000175000017500000000612514136047277017716 0ustar nileshnilesh\name{BeadStudioSet-class} \Rdversion{1.1} \docType{class} \alias{BeadStudioSet-class} \alias{BafLrrSet-class} \alias{BeadStudioSet} \alias{baf,BeadStudioSet-method} \alias{baf<-,BeadStudioSet-method} \alias{baf<-} \alias{copyNumber,BeadStudioSet-method} \alias{copyNumber<-,BeadStudioSet,ANY-method} \alias{coerce,BeadStudioSet,data.frame-method} \alias{initialize,BeadStudioSet-method} \alias{lrr,BeadStudioSet-method} \alias{lrr<-,BeadStudioSet-method} \alias{lrr<-,BeadStudioSet,ANY-method} \alias{lrr<-,BafLrrSet-method} \alias{lrr<-,BafLrrSet,ANY-method} \alias{lrr<-} \alias{show,BeadStudioSet-method} \alias{updateObject,BeadStudioSet-method} \title{Class \code{"BeadStudioSet"}} \description{ A container for log R ratios and B allele frequencies from SNP arrays. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("BeadStudioSet", assayData, phenoData, featureData, experimentData, annotation, protocolData, baf, lrr, ...)}. } \section{Slots}{ \describe{ \item{\code{featureData}:}{Object of class \code{"GenomeAnnotatedDataFrame"} ~~ } \item{\code{assayData}:}{Object of class \code{"AssayData"} ~~ } \item{\code{phenoData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{experimentData}:}{Object of class \code{"MIAxE"} ~~ } \item{\code{annotation}:}{Object of class \code{"character"} ~~ } \item{\code{protocolData}:}{Object of class \code{"AnnotatedDataFrame"} ~~ } \item{\code{genome}:}{Object of class \code{"character"} ~~ } \item{\code{.__classVersion__}:}{Object of class \code{"Versions"} ~~ } } } \section{Extends}{ Class \code{"\linkS4class{gSet}"}, directly. Class \code{"\linkS4class{eSet}"}, by class "gSet", distance 2. Class \code{"\linkS4class{VersionedBiobase}"}, by class "gSet", distance 3. Class \code{"\linkS4class{Versioned}"}, by class "gSet", distance 4. } \section{Methods}{ In the methods below, \code{object} has class \code{BeadStudioSet}. \describe{ \item{}{\code{baf(object)}: accessor for the matrix of B allele frequencies.} \item{}{\code{baf(object) <- value} replacement method for B allele frequencies: \code{value} must be a matrix of integers.} \item{}{\code{as(object, "data.frame")}: coerce to data.frame with column headers 'lrr', 'baf', 'x' (physical position with unit Mb), 'id', and 'is.snp'. Used for plotting with lattice.} \item{}{\code{copyNumber(object)}: accessor for log R ratios.} \item{}{\code{copyNumber(object) <- value}: replacement method for the log R ratios} \item{initialize}{\code{signature(.Object = "BeadStudioSet")}: constructs an instance of the class} \item{}{\code{lrr(object)}: accessor for matrix of log R ratios} \item{}{\code{lrr(object) <- value} replacement method for log R ratios: \code{value} should be a matrix or a \code{ff_matrix}.} \item{}{\code{show(object)}: print a short summary of the \code{BeadStudioSet} object.} \item{}{\code{updateObject(object)}: update a \code{BeadStudioSet} object.} } } \author{ R. Scharpf } \examples{ new("BeadStudioSet") } \keyword{classes} oligoClasses/man/platform-methods.Rd0000644000175000017500000000044114136047277017374 0ustar nileshnilesh\name{platform-methods} \docType{methods} \alias{platform} \alias{platform-methods} \alias{platform,FeatureSet-method} \title{Platform Information} \description{ Platform Information } \section{Methods}{ \describe{ \item{object = "FeatureSet"}{platform information} }} \keyword{methods} oligoClasses/man/DBPDInfo-class.Rd0000644000175000017500000000327514136047277016547 0ustar nileshnilesh\name{DBPDInfo-class} \docType{class} \alias{initialize,DBPDInfo-method} \alias{annotation,DBPDInfo-method} \alias{DBPDInfo-class} \alias{AffySNPPDInfo-class} \alias{AffySNPCNVPDInfo-class} \alias{show,DBPDInfo-method} \alias{AffyExpressionPDInfo-class} \alias{AffyTilingPDInfo-class} \alias{AffyGenePDInfo-class} \alias{AffyExonPDInfo-class} \alias{AffySTPDInfo-class} \alias{SNPPDInfo-class} \alias{SNPCNVPDInfo-class} \alias{NgsTilingPDInfo-class} \alias{TilingPDInfo-class} \alias{ExpressionPDInfo-class} \alias{NgsExpressionPDInfo-class} \alias{GenericPDInfo-class} \alias{DBPDInfo} \alias{AffySNPPDInfo} \alias{AffySNPCNVPDInfo} \alias{show,DBPDInfo-method} \alias{AffyExpressionPDInfo} \alias{AffyTilingPDInfo} \alias{AffyGenePDInfo} \alias{AffyExonPDInfo} \alias{AffySTPDInfo} \alias{SNPPDInfo} \alias{SNPCNVPDInfo} \alias{NgsTilingPDInfo} \alias{TilingPDInfo} \alias{ExpressionPDInfo} \alias{NgsExpressionPDInfo} \alias{GenericPDInfo} \title{Class "DBPDInfo"} \description{A class for Platform Design Information objects, stored using a database approach} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("DBPDInfo", ...)}. } \section{Slots}{ \describe{ \item{\code{getdb}:}{Object of class \code{"function"} } \item{\code{tableInfo}:}{Object of class \code{"data.frame"} } \item{\code{manufacturer}:}{Object of class \code{"character"} } \item{\code{genomebuild}:}{Object of class \code{"character"} } \item{\code{geometry}:}{Object of class \code{"integer"} with length 2 (rows x columns)} } } \section{Methods}{ \describe{ \item{annotation}{string describing annotation package associated to object} } } \keyword{classes} oligoClasses/man/requireAnnotation.Rd0000644000175000017500000000163214136047277017621 0ustar nileshnilesh\name{requireAnnotation} \Rdversion{1.1} \alias{requireAnnotation} \title{ Helper function to load packages. } \description{ This function checkes the existence of a given package and loads it if available. If the package is not available, the function checks its availability on BioConductor, downloads it and installs it. } \usage{ requireAnnotation(pkgname, lib=.libPaths()[1], verbose = TRUE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{pkgname}{ character. Package name (usually an annotation package). } \item{lib}{ character. Path where to install packages at. } \item{verbose}{ logical. Verbosity flag. } } \value{ Logical: TRUE if package is available or FALSE if package unavailable for download. } \author{ Benilton Carvalho } \seealso{ install.packages } \examples{ \dontrun{ requirePackage("pd.mapping50k.xba240") } } \keyword{data} oligoClasses/man/oligoSetExample.Rd0000644000175000017500000000151214136047277017210 0ustar nileshnilesh\name{oligoSet} \alias{oligoSet} \docType{data} \title{An example instance of oligoSnpSet class} \description{ An example instance of the \code{oligoSnpSet} class } \usage{data(oligoSetExample)} \source{ Created from the simulated locusLevelData provided in this package. } \seealso{\code{\link{locusLevelData}}} \examples{ \dontrun{ ## 'oligoSetExample' created by the following data(locusLevelData) oligoSet <- new("oligoSnpSet", copyNumber=integerMatrix(log2(locusLevelData[["copynumber"]]/100), 100), call=locusLevelData[["genotypes"]], callProbability=locusLevelData[["crlmmConfidence"]], annotation=locusLevelData[["platform"]], genome="hg19") oligoSet <- oligoSet[!is.na(chromosome(oligoSet)), ] oligoSet <- oligoSet[chromosome(oligoSet) < 3, ] } data(oligoSetExample) oligoSet } \keyword{datasets} oligoClasses/man/featureDataList-methods.Rd0000644000175000017500000000067614136047277020643 0ustar nileshnilesh\name{featureDataList-methods} \docType{methods} \alias{featureDataList} \alias{featureDataList-methods} \title{ Accessor for slot \code{featureDataList} in Package \pkg{oligoClasses} ~~} \description{ Accessor for slot \code{featureDataList} in Package \pkg{oligoClasses} ~~ } \section{Methods}{ \describe{ \item{\code{signature(object = "gSetList")}}{ An object inheriting from class \code{gSetList}. } }} \keyword{methods} \keyword{manip} oligoClasses/man/manufacturer-methods.Rd0000644000175000017500000000067514136047277020255 0ustar nileshnilesh\name{manufacturer-methods} \docType{methods} \alias{manufacturer} \alias{manufacturer-methods} \alias{manufacturer,DBPDInfo-method} \alias{manufacturer,FeatureSet-method} \title{Manufacturer ID for FeatureSet-like objects.} \description{ Manufacturer ID for FeatureSet-like and DBPDInfo-like objects. } \section{Methods}{ \describe{ \item{object = "FeatureSet"}{Manufacturer ID} \item{object = "PDInfo"}{Manufacturer ID} }} \keyword{methods} oligoClasses/man/chromosome2integer.Rd0000644000175000017500000000206114136047277017722 0ustar nileshnilesh\name{chromosome2integer} \alias{chromosome2integer} \alias{integer2chromosome} \title{Converts chromosome to integer} \description{ Coerces character string for chromosome in the pd. annotation packages to integers } \usage{ chromosome2integer(chrom) integer2chromosome(intChrom) } \arguments{ \item{chrom}{A one or 2 letter character string (e.g, "1", "X", "Y", "MT", "XY") } \item{intChrom}{An integer vector with values 1-25 possible} } \details{ This is useful when sorting SNPs in an object by chromosome and physical position -- ensures that the sorting is done in the same way for different objects. } \value{ \code{integer2chromosome} returns a vector of character string indicating the chromosome the same length as \code{intChrom}. \code{chromosome2integer} returns a vector of integers the same length as the number of elements in the \code{chrom} vector. } \examples{ chromosome2integer(c(1:22, "X", "Y", "XY", "M")) integer2chromosome(chromosome2integer(c(1:22, "X", "Y", "XY", "M"))) } \author{R. Scharpf} \keyword{manip} oligoClasses/man/genomeBuild.Rd0000644000175000017500000000131314136047277016340 0ustar nileshnilesh\name{genomeBuild} \alias{genomeBuild} \alias{genomeBuild<-} \alias{genomeBuild,DBPDInfo-method} \alias{genomeBuild,FeatureSet-method} \title{Genome Build Information} \description{ Returns the genome build. This information comes from the annotation package and is given as an argument during the package creation process. } \usage{ genomeBuild(object) } \value{ character string } \note{Supported builds are UCSC genome builds are 'hg18' and 'hg19'.} \arguments{ \item{object}{Supported objects include \code{PDInfo}, \code{FeatureSet}, and any \code{gSet}-derived or \code{eSetList}-derived object. } } \examples{ showMethods("genomeBuild", where="package:oligoClasses") } \keyword{manip} oligoClasses/man/library2.Rd0000644000175000017500000000055714136047277015645 0ustar nileshnilesh\name{library2} \alias{library2} \title{ Supress package startup messages when loading a library } \description{ Supress package startup messages when loading a library } \usage{ library2(...) } \arguments{ \item{\dots}{ arguments to \code{library} } } \author{ R. Scharpf } \seealso{ \code{\link{library}} } \examples{ library2("Biobase") } \keyword{manip} oligoClasses/man/GenomeAnnotatedDataFrameFrom-methods.Rd0000644000175000017500000000403414136047277023213 0ustar nileshnilesh\name{GenomeAnnotatedDataFrameFrom-methods} \docType{methods} \alias{GenomeAnnotatedDataFrameFrom} \alias{GenomeAnnotatedDataFrameFrom,AssayData-method} \alias{GenomeAnnotatedDataFrameFrom,ff_or_matrix-method} \alias{GenomeAnnotatedDataFrameFrom,NULL-method} \alias{GenomeAnnotatedDataFrameFrom,array-method} \alias{GenomeAnnotatedDataFrameFrom,list-method} \title{Methods for Function GenomeAnnotatedDataFrameFrom in Package oligoClasses} \description{ \code{GenomeAnnotatedDataFrameFrom} is a convenience for creating \code{\linkS4class{GenomeAnnotatedDataFrame}} objects. } \section{Methods}{ Use the method with \code{GenomeAnnotatedDataFrameFrom(object, annotationPkg, genome, ...)}; the argument \code{annotationPkg} \emph{must} be specified for \code{matrix} and \code{AssayData} classes. \describe{ \item{\code{signature(object="assayData")}}{ This method creates an \code{GenomeAnnotatedDataFrame} using feature names and dimensions of an \code{\link{AssayData}} object as a template. } \item{\code{signature(object="matrix")}}{ This method creates an \code{GenomeAnnotatedDataFrame} using row names and dimensions of a \code{\link{matrix}} object as a template. } \item{\code{signature(object="NULL")}}{ This method (called with 'NULL' as the object) creates an empty \code{GenomeAnnotatedDataFrame}. } \item{\code{signature(object="array")}}{ This method (called with 'array' as the object) creates a GenomeAnnotatedDataFrame using the first dimension of the array (rows are the number of features). } }} \author{R Scharpf} \examples{ require(Biobase) minReqVersion <- "1.0.2" require(human370v1cCrlmm) if (packageDescription("human370v1cCrlmm", fields='Version') >= minReqVersion){ x <- matrix(1:25, 5, 5, dimnames=list(c("rs10000092","rs1000055", "rs100016", "rs10003241", "rs10004197"), NULL)) gd <- GenomeAnnotatedDataFrameFrom(x, annotationPkg="human370v1cCrlmm", genome="hg18") pData(gd) chromosome(gd) position(gd) } } \keyword{methods} oligoClasses/man/position-methods.Rd0000644000175000017500000000217114136047277017416 0ustar nileshnilesh\name{position-methods} \docType{methods} \alias{position-methods} \alias{position} \alias{position,AnnotatedDataFrame-method} \alias{position,SnpSet-method} \alias{position,gSet-method} \alias{position,GenomeAnnotatedDataFrame-method} \title{Methods for function position in Package oligoClasses} \description{ Methods for function \code{position} in package \pkg{oligoClasses} } \section{Methods}{ The methods for \code{position} extracts the physical position stored as an integer for each marker in a \code{eSet}-derived class or a \code{AnnotatedDataFrame}-derived class. \describe{ \item{\code{signature(object = "AnnotatedDataFrame")}}{ Accessor for physical position. } \item{\code{signature(object = "eSet")}}{ If 'position' is included in \code{fvarLabels(object)}, the physical position will be returned. Otherwise, an error is thrown. } \item{\code{signature(object = "GenomeAnnotatedDataFrame")}}{ Accessor for physical position. If annotation was not available due to a missing or non-existent annotation package, the value returned by the accessor will be a vector of zero's. } } } \keyword{methods} oligoClasses/man/data-sqsExample.Rd0000644000175000017500000000037614136047277017147 0ustar nileshnilesh\name{sqsExample} \alias{sqsExample} \docType{data} \title{SnpQSet Example} \description{ Example of SnpQSet instance. } \usage{data(sqsExample)} \format{ Belongs to SnpQSet class. } \examples{ data(sqsExample) class(sqsExample) } \keyword{datasets} oligoClasses/vignettes/0000755000175000017500000000000014136047277015056 5ustar nileshnilesholigoClasses/vignettes/scriptsForExampleData/0000755000175000017500000000000014136047277021322 5ustar nileshnilesholigoClasses/vignettes/scriptsForExampleData/CreateExampleData.R0000644000175000017500000000355114136047277024762 0ustar nileshnilesh## Adding toy examples ## Saving the script that creates the examples here ## so we can improve later NS <- 5 FS <- 9 rp <- 4 ids <- as.character(t(outer(1:FS, 1:rp, paste, sep="."))) sns <- paste("sample", 1:NS, sep="") fns <- paste("feature", ids, sep="") set.seed(1) tmpExprs <- matrix(as.integer(2^rnorm(NS*FS*rp, mean=12, sd=2)), nc=NS) rownames(tmpExprs) <- fns colnames(tmpExprs) <- sns ## ExpressionFeatureSet efsExample <- new("ExpressionFeatureSet", exprs=tmpExprs, annotation="example") save(efsExample, file="../../data/efsExample.rda") ## SnpFeatureSet ids <- as.character(t(outer(1:FS, c("1-A", "2-A", "1-B", "2-B"), paste, sep="."))) fns <- paste("SNP", ids, sep="") rownames(tmpExprs) <- fns sfsExample <- new("SnpFeatureSet", exprs=tmpExprs, annotation="example") save(sfsExample, file="../../data/sfsExample.rda") ## SnpCnvFeatureSet ## TilingFeatureSet ## ExonFeatureSet ## GeneFeatureSet ## SnpQSet set.seed(1) NS <- 5 FS <- 9 ata <- matrix(rnorm(NS*FS, mean=12, sd=2), nc=NS) atb <- matrix(rnorm(NS*FS, mean=12, sd=2), nc=NS) sta <- matrix(rnorm(NS*FS, mean=12, sd=2), nc=NS) stb <- matrix(rnorm(NS*FS, mean=12, sd=2), nc=NS) rownames(ata) <- rownames(atb) <- rownames(sta) <- rownames(stb) <- paste("SNP", 1:FS, sep="") colnames(ata) <- colnames(atb) <- colnames(sta) <- colnames(stb) <- paste("sample", 1:NS, sep="") sqsExample <- new("SnpQSet", antisenseThetaA=ata, antisenseThetaB=atb, senseThetaA=sta, senseThetaB=stb, annotation="example") save(sqsExample, file="../../data/sqsExample.rda") ## SnpCnvQSet scqsExample <- new("SnpCnvQSet", thetaA=ata, thetaB=atb, annotation="example") save(scqsExample, file="../../data/scqsExample.rda") oligoClasses/tests/0000755000175000017500000000000014136047277014210 5ustar nileshnilesholigoClasses/tests/doRUnit.R0000644000175000017500000000372414136047277015725 0ustar nileshnilesh## from xmapcore package if( require( "RUnit", quietly=TRUE ) ) { ## loading Biobase below b/c we're simply Import:ing it, rather than Depend:ing on it ## then functions from there are not visible downstream library(Biobase) pkg <- "oligoClasses" if( Sys.getenv( "RCMDCHECK" ) == "FALSE" ) { path <- file.path( getwd(), "..", "inst", "unitTests" ) } else { path <- system.file( package=pkg, "unitTests" ) } cat( "\nRunning unit tests\n" ) print( list( pkg=pkg, getwd=getwd(), pathToUnitTests=path ) ) library( package=pkg, character.only=TRUE ) ##xmap.clear.cache() ##Fail on warnings ##options( warn=2 ) options(warn=0) ## Get the pattern (if there is one?) patt <- Sys.getenv( "RUNITFILEPATTERN" ) if( is.null( patt ) || nchar( patt ) == 0 ) { testSuite <- defineTestSuite(name=paste( pkg, "unit testing" ), dirs=path, testFileRegexp=paste( "^test.+", patt, "\\.[rR]$", sep="" )) } else { ##testSuite <- defineTestSuite( name=paste( pkg, "unit testing" ), testFileRegexp=paste( "^runit\\.", patt, "\\.[rR]$", sep="" ), dirs=path ) testSuite <- defineTestSuite(name=paste( pkg, "unit testing" ), testFileRegexp=paste( "^test.+", patt, "\\.[rR]$", sep="" ), dirs=path ) } tests <- runTestSuite( testSuite ) pathReport <- file.path( path, "report" ) cat( "------------------- UNIT TEST SUMMARY ---------------------\n\n" ) printTextProtocol( tests, showDetails=FALSE ) printTextProtocol( tests, showDetails=FALSE, fileName=paste( pathReport, "Summary.txt", sep="" ) ) printTextProtocol( tests, showDetails=TRUE, fileName=paste( pathReport, ".txt", sep="" ) ) printHTMLProtocol( tests, fileName=paste( pathReport, ".html", sep="" ) ) tmp <- getErrors( tests ) if( tmp$nFail > 0 | tmp$nErr > 0 ){ stop( paste( "\n\nunit testing failed (#test failures: ", tmp$nFail, ", #R errors: ", tmp$nErr, ")\n\n", sep="")) } } else { warning( "cannot run unit tests -- package RUnit is not available" ) } oligoClasses/R/0000755000175000017500000000000014136047277013247 5ustar nileshnilesholigoClasses/R/methods-gSetList.R0000644000175000017500000001663014136047277016577 0ustar nileshnileshsetMethod("initialize", signature(.Object="gSetList"), function(.Object, assayDataList=AssayDataList(...), featureDataList=GenomeAnnotatedDataFrameFromList(assayDataList), chromosome=integer(), phenoData=annotatedDataFrameFrom(assayDataList, byrow=FALSE), protocolData=phenoData[, integer(0)], experimentData=new("MIAME"), annotation=character(), genome=character(), ...){ callNextMethod(.Object, assayDataList=assayDataList, featureDataList=featureDataList, phenoData=phenoData, chromosome=chromosome, annotation=annotation, genome=genome, protocolData=protocolData, experimentData=experimentData, ...) }) setMethod("[", signature(x="gSetList"), function(x, i, j, ..., drop=FALSE){ ## using 'i' to subset markers does not really make ## sense ## ## Use i to subset the list. example, x[1] is still a BeadStudioSetList, but is one chromosome ## if(!missing(i) & !missing(j)){ ##browser() ad <- assayDataList(x) nms <- ls(ad) for(k in seq_along(nms)){ elt <- nms[k] tmp <- ad[[elt]][i] tmp <- lapply(tmp, function(x, j) { x[, j, drop=FALSE] }, j=j) x <- assayDataElementReplace(x, elt, tmp) } x@chromosome <- chromosome(x)[i] x@featureDataList <- featureDataList(x)[i] x@phenoData <- phenoData(x)[j, ] } if(!missing(i) & missing(j)){ ad <- assayDataList(x) nms <- ls(ad) for(k in seq_along(nms)){ elt <- nms[k] tmp <- ad[[elt]][i] x <- assayDataElementReplace(x, elt, tmp) } x@chromosome <- chromosome(x)[i] x@featureDataList <- featureDataList(x)[i] } if(missing(i) & !missing(j)){ ad <- assayDataList(x) nms <- ls(ad) for(k in seq_along(nms)){ elt <- nms[k] tmp <- lapply(ad[[elt]], function(x, j) { x[, j, drop=FALSE] }, j=j) x <- assayDataElementReplace(x, elt, tmp) } x@phenoData <- phenoData(x)[j, ] } return(x) }) setAs("gSetList", "list", function(from){ to <- vector("list", length(from)) for(i in seq_along(from)){ to[[i]] <- from[[i]] } return(to) }) setMethod("$", signature(x="gSetList"), function(x, name){ eval(substitute(phenoData(x)$NAME_ARG, list(NAME_ARG=name))) }) setReplaceMethod("$", "gSetList", function(x, name, value) { phenoData(x)[[name]] = value x }) setMethod("annotation", signature(object="gSetList"), function(object) object@annotation) setMethod("assayData", signature(object="gSetList"), function(object) assayDataList(object)) setMethod("assayDataList", signature(object="gSetList"), function(object) object@assayDataList) setMethod("assayDataList", signature(object="oligoSetList"), function(object) object@assayDataList) setMethod("chromosome", signature(object="gSetList"), function(object, as.list=FALSE, ...){ ##lapply(object, chromosome) if(!as.list) object@chromosome else chromosomeList(object) }) setMethod("dims", signature(x="gSetList"), function(x){ nchr <- length(chromosome(x)) nr <- sum(elementNROWS(x)) ns <- ncol(x) ds <- c(nr, nchr, ns) names(ds) <- c("features (total)", "list elements", "samples") return(ds) }) setReplaceMethod("featureData", signature(object="gSetList", value="list"), function(object, value){ object@featureDataList <- value object }) setMethod("featureData", signature(object="gSetList"), function(object){ object@featureDataList }) setMethod("fvarLabels", signature(object="gSetList"), function(object){ varLabels(featureData(object)[[1]]) }) setMethod("featureDataList", signature(object="gSetList"), function(object) object@featureDataList) setMethod("featureNames", signature(object="gSetList"), function(object){ lapply(featureDataList(object), featureNames) }) setMethod("genomeBuild", signature(object="gSetList"), function(object) object@genome) setReplaceMethod("genomeBuild", signature(object="gSetList", value="character"), function(object, value){ object@genome <- value object }) setMethod("length", signature(x="gSetList"), function(x) length(x@chromosome)) setMethod("order", signature(...="gSetList"), function(..., na.last=TRUE,decreasing=FALSE){ x <- list(...)[[1]] for(i in seq_along(x)){ x[[i]] <- chromosomePositionOrder(x[[i]]) } return(x) }) setMethod("pData", signature(object="gSetList"), function(object) pData(phenoData(object))) setMethod("phenoData", signature(object="gSetList"), function(object) object@phenoData) setReplaceMethod("phenoData", signature=signature( object="gSetList", value="AnnotatedDataFrame"), function(object, value) { object@phenoData <- value object }) setReplaceMethod("pData", signature=signature( object="gSetList", value="data.frame"), function(object, value) { pd <- phenoData(object) pData(pd) <- value phenoData(object) <- pd object }) setMethod("position", signature(object="gSetList"), function(object){ lapply(featureDataList(object), position) }) setMethod("sampleNames", signature(object="gSetList"), function(object) sampleNames(phenoData(object))) setReplaceMethod("sampleNames", signature(object="gSetList", value="character"), function(object,value){ sampleNamesGSetList(object, value) }) sampleNamesGSetList <- function(object, value){ pd <- phenoData(object) sampleNames(pd) <- value object@phenoData <- pd adl <- object@assayDataList lrrlist <- adl[["lrr"]] baflist <- adl[["baf"]] relabel <- function(object, names){ colnames(object) <- names object } if(length(lrrlist) > 0){ lrrlist <- lapply(lrrlist, relabel, names=value) baflist <- lapply(baflist, relabel, names=value) } assayData <- new.env(parent=emptyenv()) assayData[["lrr"]] <- lrrlist assayData[["baf"]] <- baflist ## adl[["lrr"]] <- lrrlist ## adl[["baf"]] <- baflist object@assayDataList <- assayData return(object) } setMethod("sapply", signature(X="gSetList"), function(X, FUN, ..., simplify=TRUE, USE.NAMES=TRUE){ listobject <- as(X, "list") sapply(listobject, FUN, ..., simplify=simplify, USE.NAMES=USE.NAMES) }) setMethod("show", signature(object="gSetList"), function(object){ nm <- ls(assayData(object))[[1]] lo <- length(assayData(object)[[nm]]) cat(class(object), " of length ", lo, "\n", sep="") }) setMethod("storageMode", "gSetList", function(object) storageMode(assayData(object))) setMethod("varLabels", signature(object="gSetList"), function(object) varLabels(phenoData(object))) setMethod("makeFeatureGRanges", signature(object="gSetList"), function(object, ...){ fdl <- featureData(object) pos <- unlist(position(object)) snp <- unlist(lapply(fdl, isSnp)) chr <- unlist(lapply(fdl, chromosome)) df <- data.frame(position=pos, isSnp=snp, chromosome=chr) rownames(df) <- unlist(featureNames(object)) fd <- as(df, "AnnotatedDataFrame") fd2 <- as(fd, "GenomeAnnotatedDataFrame") makeFeatureGRanges(fd2, genomeBuild(object)) }) setMethod("elementNROWS", signature(x="gSetList"), function(x){ adl <- assayDataList(x) nm <- ls(adl)[[1]] sapply(assayDataList(x)[[nm]], nrow) }) setMethod("ncol", signature(x="gSetList"), function(x){ adl <- assayDataList(x) nm <- ls(adl)[[1]] ncol(assayDataList(x)[[nm]][[1]]) }) oligoClasses/R/methods-AssayData.R0000644000175000017500000000453214136047277016711 0ustar nileshnileshsetMethod("batchNames", "AssayData", function(object){ ##should call method for AssayData sampleNames(object) }) setReplaceMethod("batchNames", "AssayData", function(object, value){ sampleNames(object) <- value return(object) }) setMethod("nu", c("AssayData", "character"), function(object, allele){ getValue <- function(allele){ switch(allele, A="nuA", B="nuB", stop("allele must be 'A' or 'B'")) } val <- getValue(allele) assayDataElement(object, val) }) setMethod("phi", c("AssayData", "character"), function(object, allele){ getValue <- function(allele){ switch(allele, A="phiA", B="phiB", stop("allele must be 'A' or 'B'")) } val <- getValue(allele) assayDataElement(object, val) }) ##setMethod("sigma2", c("AssayData", "character"), ## function(object, allele){ ## getValue <- function(allele){ ## switch(allele, ## A="sig2A", ## B="sig2B", ## stop("allele must be 'A' or 'B'")) ## } ## val <- getValue(allele) ## assayDataElement(object, val) ## }) ##setMethod("tau2", c("AssayData", "character"), ## function(object, allele){ ## getValue <- function(allele){ ## switch(allele, ## A="tau2A", ## B="tau2B", ## stop("allele must be 'A' or 'B'")) ## } ## val <- getValue(allele) ## assayDataElement(object, val) ## }) ##setMethod("corr", c("AssayData", "character"), ## function(object, allele){ ## getValue <- function(allele){ ## switch(allele, ## AA="corrAA", ## AB="corrAB", ## BB="corrBB", ## stop("allele must be 'AA', 'AB', or 'BB'")) ## } ## val <- getValue(allele) ## assayDataElement(object, val) ## }) setMethod("flags", signature(object="AssayData"), function(object) assayDataElement(object, "flags")) AssayDataList <- function(storage.mode = c("lockedEnvironment", "environment", "list"), ...) { storage.mode <- match.arg(storage.mode) ## defaults to "lockedEnvironment" assayData <- switch(storage.mode, lockedEnvironment =, environment = new.env(parent=emptyenv()), list = list()) arglist <- list(...) for (nm in names(arglist)) assayData[[nm]] <- arglist[[nm]] ## FIX: ::: not safe if (storage.mode == "lockedEnvironment") Biobase:::assayDataEnvLock(assayData) assayData } oligoClasses/R/AllGenerics.R0000644000175000017500000001070714136047277015567 0ustar nileshnileshsetGeneric("manufacturer",function(object) standardGeneric("manufacturer")) setGeneric("manufacturer<-", function(object, value) standardGeneric("manufacturer<-")) setGeneric("bothStrands", function(object) standardGeneric("bothStrands")) setGeneric("allele", function(object, allele, strand) standardGeneric("allele")) setGeneric("annotate", function(object) standardGeneric("annotate")) ## assayData accessors setGeneric("getM", function(object) standardGeneric("getM")) setGeneric("getA", function(object) standardGeneric("getA")) setGeneric("A", function(object, ...) standardGeneric("A")) setGeneric("B", function(object, ...) standardGeneric("B")) setGeneric("A<-", function(object, value) standardGeneric("A<-")) setGeneric("B<-", function(object, value) standardGeneric("B<-")) setGeneric("calls<-", function(object, value) standardGeneric("calls<-")) setGeneric("calls", function(object) standardGeneric("calls")) setGeneric("confs", function(object, transform=TRUE) standardGeneric("confs")) setGeneric("confs<-", function(object, value) standardGeneric("confs<-")) setGeneric("cnConfidence", function(object) standardGeneric("cnConfidence")) setGeneric("cnConfidence<-", function(object, value) standardGeneric("cnConfidence<-")) setGeneric("copyNumber", function(object, ...) standardGeneric("copyNumber")) setGeneric("copyNumber<-", function(object, value) standardGeneric("copyNumber<-")) setGeneric("baf", function(object) standardGeneric("baf")) setGeneric("lrr", function(object) standardGeneric("lrr")) setGeneric("lrr<-", function(object,value) standardGeneric("lrr<-")) setGeneric("baf<-", function(object,value) standardGeneric("baf<-")) ##GenomeAnnotatedDataFrame accessors setGeneric("chromosome", function(object, ...) standardGeneric("chromosome")) setGeneric("chromosome<-", function(object, value) standardGeneric("chromosome<-")) setGeneric("db", function(object) standardGeneric("db")) setGeneric("kind", function(object) standardGeneric("kind")) setGeneric("position", function(object, ...) standardGeneric("position")) setGeneric("position<-", function(object, value) standardGeneric("position<-")) setGeneric("isSnp", function(object, ...) standardGeneric("isSnp")) setGeneric("isSnp<-", function(object, value) standardGeneric("isSnp<-")) ##setGeneric("snpNames", function(object) standardGeneric("snpNames")) setGeneric("getArm", function(object, ...) standardGeneric("getArm")) setGeneric("genomeBuild", function(object) standardGeneric("genomeBuild")) setGeneric("genomeBuild<-", function(object,value) standardGeneric("genomeBuild<-")) setGeneric("geometry", function(object) standardGeneric("geometry")) ## batchStatistics/copynumber setGeneric("batch", function(object) standardGeneric("batch")) setGeneric("batch<-", function(object, value) standardGeneric("batch<-")) setGeneric("batchNames", function(object) standardGeneric("batchNames")) setGeneric("batchNames<-", function(object,value) standardGeneric("batchNames<-")) setGeneric("nu", function(object, allele) standardGeneric("nu")) setGeneric("phi", function(object, allele) standardGeneric("phi")) setGeneric("sigma2", function(object, allele) standardGeneric("sigma2")) setGeneric("batchStatistics", function(object) standardGeneric("batchStatistics")) setGeneric("batchStatistics<-", function(object,value) standardGeneric("batchStatistics<-")) setGeneric("flags", function(object) standardGeneric("flags")) setGeneric("coverage2", function(object) standardGeneric("coverage2")) setGeneric("state", function(object) standardGeneric("state")) setGeneric("featuresInRange", function(object, range, FRAME=0, FRAME.LEFT, FRAME.RIGHT, ...) standardGeneric("featuresInRange")) setGeneric("openff", function(object) standardGeneric("openff")) setGeneric("closeff", function(object) standardGeneric("closeff")) setGeneric("checkOrder", function(object, verbose=FALSE) standardGeneric("checkOrder")) ##setGeneric("order2", function(object) standardGeneric("order2")) setGeneric("GenomeAnnotatedDataFrameFrom", function(object, annotationPkg, genome="hg19", ...) standardGeneric("GenomeAnnotatedDataFrameFrom")) setGeneric("numberProbes", function(object) standardGeneric("numberProbes")) setGeneric("makeFeatureGRanges", function(object, ...) standardGeneric("makeFeatureGRanges")) ## List classes setGeneric("assayDataList", function(object) standardGeneric("assayDataList")) setGeneric("featureDataList", function(object) standardGeneric("featureDataList")) setGeneric("clone2", function(object, id, prefix="",...) standardGeneric("clone2")) oligoClasses/R/methods-PDInfo.R0000644000175000017500000000307214136047277016154 0ustar nileshnileshsetMethod("annotation", "DBPDInfo", function(object) object@annotation) setMethod("initialize", "DBPDInfo", function(.Object, ...) { .Object <- callNextMethod() tInfo <- dbGetQuery(db(.Object), "select * from table_info") .Object@tableInfo <- tInfo .Object }) setMethod("manufacturer", "DBPDInfo", function(object) object@manufacturer) setMethod("genomeBuild", "DBPDInfo", function(object) object@genomebuild) setMethod("geometry", "DBPDInfo", function(object) object@geometry) setMethod("db", signature(object="DBPDInfo"), function(object) object@getdb()) setMethod("kind", "GenericPDInfo", function(object){ "generic" }) setMethod("kind", "AffySNPPDInfo", function(object) { "SNP" }) setMethod("kind", "AffyExpressionPDInfo", function(object) { "expression" }) setMethod("kind", "AffySNPCNVPDInfo", function(object) { "SNPCNV" }) setMethod("kind", "AffyGenePDInfo", function(object) { "gene" }) setMethod("kind", "AffyExonPDInfo", function(object) { "exon" }) setMethod("kind", "AffyHTAPDInfo", function(object) { "hta" }) setMethod("kind", "ExpressionPDInfo", function(object) { "expression" }) setMethod("kind", "TilingPDInfo", function(object) { "tiling" }) oligoClasses/R/methods-CNSet.R0000644000175000017500000002160014136047277016006 0ustar nileshnileshsetMethod("show", "CNSet", function(object){ is.ff <- is(calls(object), "ff_matrix") | is(calls(object), "ffdf") if(is.ff){ if(!isPackageLoaded("ff")) warning("ff objects detected, but ff package is not loaded") ##to avoid warnings if("SKW" %in% varLabels(object)) { if(is(object$SKW, "ff")) open(object$SKW) } if("SNR" %in% varLabels(object)){ if(is(object$SNR, "ff")) open(object$SNR) } if("gender" %in% varLabels(object)){ if(is(object$gender, "ff")) open(object$gender) } } ad.class <- class(A(object))[1] cat("CNSet (assayData/batchStatistics elements: ", ad.class, ")\n", sep="") callNextMethod(object) bns <- head(batchNames(object)) ##bns <- bns[-length(bns)] freq <- as.integer(table(batch(object))) index <- names(table(batch(object))) %in% bns freq <- freq[index] cat("batch: ", paste(bns, ":", freq, sep="", collapse=", "), "\n") adim <- list(nrow(object), length(batchNames(object))) if(adim[[1]] > 0){ cat("batchStatistics: ", length(ls(batchStatistics(object))), " elements, ", nrow(object), " features, ", length(unique(batch(object))), " batches\n") } }) setMethod("updateObject", signature(object="CNSet"), function(object, ..., verbose=FALSE) { if (verbose) message("updateObject(object = 'CNSet')") obj <- tryCatch(callNextMethod(batch=batch(object)), error=function(e) NULL) if(is.null(obj)){ ## must supply batch for batchStatistics to be added if(is(calls(object), "ffdf") | is(calls(object), "ff_matrix")) stopifnot(isPackageLoaded("ff")) if(.hasSlot(object, "mixtureParams")){ obj <- new("CNSet", assayData = updateObject(assayData(object), ..., verbose=verbose), phenoData = phenoData(object), experimentData = experimentData(object), annotation = updateObject(annotation(object), ..., verbose=verbose), featureData=updateObject(featureData(object), ..., verbose=verbose), batch=as.character(batch(object)), batchStatistics=batchStatistics(object), mixtureParams=object@mixtureParams) } else { obj <- new("CNSet", assayData = updateObject(assayData(object), ..., verbose=verbose), phenoData = phenoData(object), experimentData = experimentData(object), annotation = updateObject(annotation(object), ..., verbose=verbose), featureData=updateObject(featureData(object), ..., verbose=verbose), batch=as.character(batch(object)), batchStatistics=batchStatistics(object), mixtureParams=matrix(NA, 4, ncol(object))) } if (isCurrent(obj)["CNSet"]) return(obj) return(obj) } }) setMethod("[", "CNSet", function(x, i, j, ..., drop=FALSE){ openff(x) x <- callNextMethod(x, i, j, ..., drop=FALSE) isdf <- is(A(x), "data.frame") if(isdf){ orig <- assayData(x) ##storage.mode <- Biobase:::assayDataStorageMode(orig) storage.mode <- storageMode(orig) assayData(x) <- switch(storage.mode, environment =, lockedEnvironment = { aData <- new.env(parent=emptyenv()) for(nm in ls(orig)) aData[[nm]] <- as.matrix(orig[[nm]])##[i, j, ..., drop = drop] if ("lockedEnvironment" == storage.mode) Biobase:::assayDataEnvLock(aData) aData }, list = { lapply(orig, as.matrix) }) } if(missing(j)) j <- 1:ncol(x) if(missing(i)) i <- 1:nrow(x) x@batch <- batch(x)[j] nms <- sampleNames(batchStatistics(x)) ## need to subset columns of LinearModelParameter ## Adapted from the '[' method for eSet in Biobase ## redefine 'j' j <- which(nms %in% unique(as.character(batch(x)))) storage.mode <- storageMode(batchStatistics(x)) ## i (if defined) is already subset by callNextMethod orig <- batchStatistics(x) batchStatistics(x) <- switch(storage.mode, environment =, lockedEnvironment = { aData <- new.env(parent=emptyenv()) for(nm in ls(orig)) aData[[nm]] <- orig[[nm]][i, j, ..., drop = drop] if ("lockedEnvironment" == storage.mode) Biobase:::assayDataEnvLock(aData) aData }, list = { lapply(orig, function(obj) obj[i, j, ..., drop = drop]) }) return(x) }) setMethod("batch", "CNSet", function(object) object@batch) setReplaceMethod("batch", signature=signature(object="CNSet"), function(object, value){ object@batch <- as.character(value) object }) setMethod("batchNames", "CNSet", function(object) batchNames(batchStatistics(object))) setReplaceMethod("batchNames", "CNSet", function(object, value) { batchNames(batchStatistics(object)) <- value return(object) }) setMethod("allele", "CNSet", function(object, allele){ stopifnot(!missing(allele)) allele <- match.arg(allele, c("A", "B")) what <- paste("allele", allele, sep="") assayDataElement(object, what) }) setMethod("A", "CNSet", function(object, ...) allele(object, "A", ...)) setMethod("B", "CNSet", function(object, ...) allele(object, "B", ...)) setReplaceMethod("A", "CNSet", function(object, value) { obj <- assayDataElementReplace(object, "alleleA", value) }) setReplaceMethod("B", "CNSet", function(object, value) { assayDataElementReplace(object, "alleleB", value) }) setMethod("closeff", signature(object="CNSet"), function(object){ if(!isFF(object)) return() names <- ls(assayData(object)) L <- length(names) for(i in 1:L) close(eval(substitute(assayData(object)[[NAME]], list(NAME=names[i])))) physical <- get("physical") names <- ls(batchStatistics(object)) L <- length(names) for(i in 1:L) { tmp <- eval(substitute(assayData(object)[[NAME]], list(NAME=names[i]))) if(!is.null(tmp)) close(tmp) } }) setMethod("close", "CNSet", function(con, ...){ object <- con closeff(object) }) setMethod("openff", signature(object="CNSet"), function(object){ if(isFF(object)){ names <- ls(assayData(object)) L <- length(names) for(i in 1:L) open(eval(substitute(assayData(object)[[NAME]], list(NAME=names[i])))) names <- assayDataElementNames(batchStatistics(object)) L <- length(names) for(i in 1:L) open(eval(substitute(batchStatistics(object)[[NAME]], list(NAME=names[i])))) } if("SKW" %in% varLabels(object)){ if(is(object$SKW, "ff")) open(object$SKW) } if("SNR" %in% varLabels(object)){ if(is(object$SNR, "ff")) open(object$SNR) } if("SNR" %in% varLabels(object)){ if(is(object$gender, "ff")) open(object$gender) } }) setMethod("open", "CNSet", function(con, ...){ object <- con openff(object) return(TRUE) }) setMethod("nu", c("CNSet", "character"), function(object, allele) nu(batchStatistics(object), allele)) setMethod("phi", c("CNSet", "character"), function(object, allele) phi(batchStatistics(object), allele)) setMethod("sigma2", c("CNSet", "character"), function(object, allele) sigma2(batchStatistics(object), allele)) setMethod("flags", signature(object="CNSet"), function(object) flags(batchStatistics(object))) setMethod("batchStatistics", signature=signature(object="CNSet"), function(object) object@batchStatistics) setReplaceMethod("batchStatistics", signature=signature(object="CNSet", value="AssayData"), function(object, value){ object@batchStatistics <- value object }) setMethod(snpCall, "CNSet", function(object, ...) { assayDataElement(object, "call") }) setMethod(snpCallProbability, "CNSet", function(object, ...) { assayDataElement(object, "callProbability") }) setReplaceMethod("snpCall", c("CNSet", "matrix"), function(object, ..., value) { assayDataElementReplace(object, "call", value) }) setReplaceMethod("snpCallProbability", c("CNSet", "matrix"), function(object, ..., value) { assayDataElementReplace(object, "callProbability", value) }) setMethod("calls", "CNSet", function(object) assayData(object)$call) setReplaceMethod("calls", signature(object="CNSet", value="matrix"), function(object, value) assayDataElementReplace(object, "call", value)) setMethod("confs", "CNSet", function(object, transform=TRUE) { X <- snpCallProbability(object) if(is(X, "ff_matrix") | is(X, "ffdf")){ warningMsg(X) return(X) } if (transform){ X <- i2p(X) } return(X) }) setReplaceMethod("confs", signature(object="CNSet", value="matrix"), function(object, value){ ##convert probability to integer if(max(value) > 1){ X <- matrix(p2i(value), nrow(X), ncol(X), dimnames=dimnames(value)) } else { X <- value } assayDataElementReplace(object, "callProbability", X) }) ##setMethod("genomeBuild", "CNSet", function(object) object@genome) ##setReplaceMethod("genomeBuild", signature(object="CNSet", value="character"), ## function(object, value){ ## object@genome <- value ## return(object) ## }) oligoClasses/R/methods-BeadStudioSet.R0000644000175000017500000000445614136047277017543 0ustar nileshnileshsetMethod("updateObject", signature(object="BeadStudioSet"), function(object, ..., verbose=FALSE) { if (verbose) message("updateObject(object = 'BeadStudioSet')") obj <- tryCatch(callNextMethod(object), error=function(e) NULL) if(is.null(obj)){ obj <- new("BeadStudioSet", assayData = updateObject(assayData(object), ..., verbose=verbose), phenoData = phenoData(object), experimentData = updateObject(experimentData(object), ..., verbose=verbose), annotation = updateObject(annotation(object), ..., verbose=verbose), featureData=updateObject(featureData(object), ..., verbose=FALSE), ...) } if (all(isCurrent(obj))) return(obj) obj }) setMethod("lrr", "BeadStudioSet", function(object){ return(assayDataElement(object, "lrr")) }) setMethod("copyNumber", "BeadStudioSet", function(object) lrr(object)) setReplaceMethod("lrr", c("BeadStudioSet", "ANY"), function(object, value) { assayDataElementReplace(object, "lrr", value) }) setReplaceMethod("lrr", c("BafLrrSet", "ANY"), function(object, value) { assayDataElementReplace(object, "lrr", value) }) setReplaceMethod("copyNumber", c("BeadStudioSet", "ANY"), function(object, value) { lrr(object) <- value object }) setMethod("baf", "BeadStudioSet", function(object) { return(assayDataElement(object, "baf")) }) setReplaceMethod("baf", c("BeadStudioSet", "ANY"), function(object, value) { assayDataElementReplace(object, "BAF", value) }) setAs("BeadStudioSet", "data.frame", function(from, to){ cn <- as.numeric(lrr(from))/100 bf <- as.numeric(baf(from))/1000 x <- rep(position(from)/1e6, ncol(from)) ##x <- rep(position(object)[marker.index], 4)/1e6 is.snp <- rep(isSnp(from), ncol(from)) id <- rep(sampleNames(from), each=nrow(from)) df <- data.frame(x=x, lrr=cn, baf=bf, id=id, is.snp=is.snp, stringsAsFactors=FALSE) df$id <- factor(df$id, ordered=TRUE, levels=unique(df$id)) return(df) }) setMethod("show", signature(object="BeadStudioSet"), function(object){ callNextMethod(object) ##cat("Genome Build: ", genomeBuild(object), "\n") ##cat("Integer representation of BAF/LRR: ", isInteger(object), "\n") }) oligoClasses/R/zzz.R0000644000175000017500000000101414136047277014223 0ustar nileshnileshTHISPKG <- "oligoClasses" .oligoClassesPkgEnv <- new.env(parent=emptyenv()) .onAttach <- function(libname, pkgname) { version <- packageDescription("oligoClasses", fields="Version") packageStartupMessage("Welcome to oligoClasses version ", version) ldSetOptions() ## bm <- ldStatus(TRUE) ## snow <- ocParallelStatus() setHook(packageEvent("ff", "attach"), function(...){ ldSetOptions(verbose=FALSE) ldStatus(TRUE) }) setHook(packageEvent("foreach", "attach"), function(...){ ocParallelStatus() }) } oligoClasses/R/methods-GenomeAnnotatedDataFrame.R0000644000175000017500000003521014136047277021651 0ustar nileshnileshsetMethod("initialize", signature(.Object="GenomeAnnotatedDataFrame"), function(.Object, position=integer(), isSnp=vector("logical", length(position)), chromosome=vector("integer", length(position)), row.names=NULL, data, varMetadata, ...){ if(missing(data)) data <- data.frame(isSnp=isSnp, position=position, chromosome=chromosome, ..., row.names=row.names) if(missing(varMetadata)){ nms <- names(list(...)) varMetadata <- data.frame(labelDescription=c("SNP indicator", "physical position", "chromosome", nms)) } .Object <- callNextMethod(.Object, data=data, varMetadata=varMetadata) }) setMethod("updateObject", signature(object="GenomeAnnotatedDataFrame"), function(object, ..., verbose=FALSE){ ##as(object, "GenomeAnnotatedDataFrame") ADF2GDF(object) }) setMethod("coerce", signature(from="AnnotatedDataFrame", to="GenomeAnnotatedDataFrame"), function(from, to){ new("GenomeAnnotatedDataFrame", isSnp=as.logical(from$isSnp), position=as.integer(from$position), chromosome=as.integer(from$chromosome), row.names=featureNames(from)) }) ADF2GDF <- function(object){ new("GenomeAnnotatedDataFrame", isSnp=as.logical(object$isSnp), position=as.integer(object$position), chromosome=as.integer(object$chromosome), row.names=featureNames(object)) } isValidGenomeAnnotatedDataFrame <- function(object){ if(!all(c("isSnp", "position", "chromosome") %in% varLabels(object))) return("'isSnp', 'position', and 'chromosome' are required varLabels of the AnnotatedDataFrame for features") if(!is(chromosome(object), "integer") || !is(position(object), "integer")) return("chromosome and position must be integers. See function 'chromosome2integer'") if(!is.logical(isSnp(object))){ return("isSnp must be logical") } TRUE } setValidity("GenomeAnnotatedDataFrame", function(object){ msg <- isValidGenomeAnnotatedDataFrame(object) if(is.character(msg)) return(msg) }) setMethod("GenomeAnnotatedDataFrameFrom", signature(object="ff_or_matrix"), function(object, annotationPkg, genome="hg19", ...){ GenomeAnnotatedDataFrameFromMatrix(object=object, annotationPkg=annotationPkg, genome=genome, ...) }) setMethod("GenomeAnnotatedDataFrameFrom", signature(object="array"), function(object, annotationPkg, genome="hg19", ...){ GenomeAnnotatedDataFrameFromArray(object, annotationPkg, genome=genome, ...) }) setMethod("GenomeAnnotatedDataFrameFrom", signature(object="NULL"), function(object, annotationPkg, genome="hg19", ...){ GenomeAnnotatedDataFrameFromNULL(object) }) setMethod("GenomeAnnotatedDataFrameFrom", signature(object="list"), function(object, annotationPkg, genome="hg19", ...){ GenomeAnnotatedDataFrameFromList(object, annotationPkg, genome=genome, ...) }) setMethod("GenomeAnnotatedDataFrameFrom", signature(object="AssayData"), function(object, annotationPkg, genome="hg19", ...){ GenomeAnnotatedDataFrameFromAssayData(object=object, annotationPkg=annotationPkg, genome=genome, ...) }) GenomeAnnotatedDataFrameFromMatrix <- function(object, annotationPkg, genome, ...){ dims <- dim(object) if (is.null(dims) || all(dims==0)){ object <- GenomeAnnotatedDataFrameFrom(NULL, ...) } else { nms <- rownames(object) if(!is.null(nms)){ if(any(is.na(nms))) warning("NA's in rownames") } if(length(annotationPkg)==0 | is.null(nms)){ n <- dims[1] data <- data.frame(position=integer(n), chromosome=integer(n), isSnp=logical(n), row.names=nms) object <- new("GenomeAnnotatedDataFrame", data=data) } else { stopifnot(isSupportedAnnotation(annotationPkg)) is.pd <- isPdAnnotationPkg(annotationPkg) if(is.pd){ object <- addFeatureAnnotation.pd2(annotationPkg, featureNames=rownames(object), genome=genome,...) } else { object <- addFeatureAnnotation.crlmm2(annotationPkg, featureNames=rownames(object), genome=genome, ...) } } } return(object) } GenomeAnnotatedDataFrameFromArray <- function(object, annotationPkg, ...){ ## coerce to matrix dims <- dim(object) is.array <- length(dims) == 3 if(is.array){ res <- GenomeAnnotatedDataFrameFromMatrix(object[, , 1], annotationPkg, ...) } else { ##dim(object) <- dim(object)[c(1,2)] res <- GenomeAnnotatedDataFrameFromMatrix(object, annotationPkg, ...) } res } GenomeAnnotatedDataFrameFromList <- function(object, annotationPkg, genome){ ##if(length(object)==0) return(GenomeAnnotatedDataFrameFromNULL(NULL)) if(length(object)==0) return(object) nms <- ls(object) elt <- object[[nms[1]]] fdlist <- vector("list", length(elt)) for(i in seq_along(elt)){ fdlist[[i]] <- GenomeAnnotatedDataFrameFrom(elt[[i]], annotationPkg, genome) } return(fdlist) } GenomeAnnotatedDataFrameFromNULL <- function(object, byrow=TRUE, ...) { new("GenomeAnnotatedDataFrame") } GenomeAnnotatedDataFrameFromAssayData <- function(object, annotationPkg, ...) { eltNames <- if (is(object, "environment")) ls(object) else names(object) if (length(eltNames)==0) GenomeAnnotatedDataFrameFrom(NULL) else GenomeAnnotatedDataFrameFrom(object[[eltNames[1]]], annotationPkg, ...) } setMethod("isSnp", signature(object="GenomeAnnotatedDataFrame"), function(object) object$isSnp) setMethod("position", signature(object="GenomeAnnotatedDataFrame"), function(object, ...) object$position) setMethod("chromosome", signature(object="GenomeAnnotatedDataFrame"), function(object, ...) object$chromosome) setReplaceMethod("chromosome", signature(object="GenomeAnnotatedDataFrame", value="integer"), function(object, value){ fData(object)$chromosome <- value object }) setReplaceMethod("isSnp", signature(object="GenomeAnnotatedDataFrame", value="logical"), function(object, value){ Biobase::fData(object)$isSnp <- value object }) setReplaceMethod("position", signature(object="GenomeAnnotatedDataFrame", value="integer"), function(object, value){ Biobase::fData(object)$position <- value object }) isPdAnnotationPkg <- function(object) length(grep("pd.", object)) >= 1 addFeatureAnnotation.pd2 <- function(annotation, featureNames, genome){ ##message("Adding required feature annotation (chromosome, position, isSnp) to featureData slot") fs <- featureNames tmp <- paste("('", paste(fs, collapse="', '"), "')", sep="") fD <- matrix(integer(), length(fs), 3) rownames(fD) <- fs colnames(fD) <- c("chromosome", "position", "isSnp") sql <- paste("SELECT man_fsetid, chrom, physical_pos FROM featureSet WHERE man_fsetid IN ", tmp) ##Check if two objects have been combined pkgs <- strsplit(annotation, ",")[[1]] snps <- snp.index <- nps <- np.index <- vector("list", length(pkgs)) for(i in seq(along=pkgs)){ annotation <- pkgs[i] requireAnnotation(annotation) annoObject <- get(annotation) gb <- tolower(genomeBuild(annoObject)) if(gb != genome){ stop(paste("Genome build in package ", annotation, " is ", gb, ", but build ", genome, " is requested.", sep="")) } snps[[i]] <- dbGetQuery(annoObject@getdb(), sql) snp.index[[i]] <- match(snps[[i]]$man_fsetid, rownames(fD)) if("featureSetCNV" %in% dbListTables(annoObject@getdb())){ sql <- paste("SELECT man_fsetid, chrom, chrom_start FROM featureSetCNV WHERE man_fsetid IN ", tmp) nps[[i]] <- dbGetQuery(annoObject@getdb(), sql) np.index[[i]] <- match(nps[[i]]$man_fsetid, rownames(fD)) } } if(length(snps) > 1){ snps <- do.call(rbind, snps) snp.index <- unlist(snp.index) if("featureSetCNV" %in% dbListTables(annoObject@getdb())){ nps <- do.call(rbind, nps) np.index <- unlist(np.index) } } else { snps <- snps[[1]] snp.index <- snp.index[[1]] if("featureSetCNV" %in% dbListTables(annoObject@getdb())){ nps <- nps[[1]] np.index <- np.index[[1]] } } fD[snp.index, "isSnp"] <- as.integer(1) fD[snp.index, "chromosome"] <- chromosome2integer(snps$chrom) fD[snp.index, "position"] <- as.integer(snps$physical_pos) if("featureSetCNV" %in% dbListTables(annoObject@getdb())){ fD[np.index, "isSnp"] <- as.integer(0) fD[np.index, "chromosome"] <- chromosome2integer(nps$chrom) fD[np.index, "position"] <- as.integer(nps$chrom_start) } featureData <- new("GenomeAnnotatedDataFrame", isSnp=as.logical(fD[, "isSnp"]), chromosome=as.integer(fD[, "chromosome"]), position=as.integer(fD[, "position"]), row.names=featureNames) return(featureData) } addFeatureAnnotation.crlmm2 <- function(object, featureNames, genome="hg19", ...){ nm <- grep("Crlmm", object, ignore.case=TRUE) if(length(nm) == 0){ pkgname <- paste(object, "Crlmm", sep="") } else pkgname <- object path <- system.file("extdata", package=pkgname) if(path=="") stop("Are you sure ", pkgname, " is installed?") ## Most of our annotation packages have only hg19 build snpBuilds <- list.files(path, pattern="snpProbes_") build <- gsub(".rda", "", gsub("snpProbes_", "", snpBuilds)) if(length(build) > 1){ if(genome %in% build){ build <- genome } else { ## genome not in build message(paste("Builds", paste(build, collapse=","), "are available. Use genome=[build] to specify which build to use for annotation.")) build <- build[1] } } if(length(build)==1){ if(build != genome){ message(paste("Build", genome, "requested, but only build", build, "is available.")) } loader(paste("cnProbes_", build, ".rda", sep=""), pkgname=pkgname, envir=.oligoClassesPkgEnv) loader(paste("snpProbes_", build, ".rda", sep=""), pkgname=pkgname, envir=.oligoClassesPkgEnv) } else { ## length of build is zero ## file not found (older version of annotation packages). allow processing to continue loader("cnProbes.rda", pkgname=pkgname, envir=.oligoClassesPkgEnv) loader("snpProbes.rda", pkgname=pkgname, envir=.oligoClassesPkgEnv) } cnProbes <- get("cnProbes", envir=.oligoClassesPkgEnv) snpProbes <- get("snpProbes", envir=.oligoClassesPkgEnv) snpProbes <- snpProbes[rownames(snpProbes) %in% featureNames, , drop=FALSE] cnProbes <- cnProbes[rownames(cnProbes) %in% featureNames, , drop=FALSE] ##Feature Data isSnp <- 1L-as.integer(featureNames %in% rownames(cnProbes)) names(isSnp) <- featureNames if(any(isSnp)){ snps <- featureNames[isSnp == 1] index <- match(snps, rownames(snpProbes)) position.snp <- snpProbes[index, "position"] names(position.snp) <- snps J <- grep("chr", colnames(snpProbes)) chr.snp <- snpProbes[index, J] } else{ warning("None of the featureNames in the object match SNP probes for the indicated annotation package. Either the annotation package is misspecified, or the featureNames of the object are incorrect") message("The annotation for the object is ", object) chr.snp <- position.snp <- integer() } if(any(!isSnp)){ nps <- featureNames[isSnp == 0] index <- match(nps, rownames(cnProbes)) position.np <- cnProbes[index, "position"] names(position.np) <- nps chr.np <- cnProbes[index, J] } else { chr.np <- position.np <- integer() } position <- c(position.snp, position.np) chrom <- c(chr.snp, chr.np) ##We may not have annotation for all of the snps if(!all(featureNames %in% names(position))){ warning("physical position not available for all featureNames") } ix <- match(featureNames, names(position)) position <- position[ix] chrom <- chrom[ix] ##require(SNPchip) chrom <- chromosome2integer(chrom) stopifnot(identical(names(position), featureNames)) if(sum(duplicated(names(position))) > 0){ warning("Removing rows with NA identifiers...") ##RS: fix this I <- which(!is.na(names(position))) } else I <- seq(along=names(position)) new("GenomeAnnotatedDataFrame", isSnp=as.logical(isSnp[I]), position=as.integer(position[I]), chromosome=as.integer(chrom[I]), row.names=featureNames) } cleancdfname <- function(x) strsplit(x, "Crlmm")[[1]][[1]] isSupportedAnnotation <- function(x){ validAnn <- annotationPackages() validAnn <- validAnn[-grep(",", validAnn)] stripCrlmm <- sapply(validAnn, cleancdfname) validAnn <- unique(c(validAnn, stripCrlmm)) x <- strsplit(x, ",")[[1]] for(i in seq_along(x)) match.arg(x[i], validAnn) return(TRUE) } annotationPackages <- function(){ c("pd.mapping50k.hind240", "pd.mapping50k.xba240", "pd.mapping50k.hind240,pd.mapping50k.xba240", "pd.mapping250k.nsp", "pd.mapping250k.sty", "pd.mapping250k.nsp,pd.mapping250k.sty", "pd.genomewidesnp.5", "pd.genomewidesnp.6", "genomewidesnp6Crlmm", "genomewidesnp5Crlmm", "human370v1cCrlmm", "human370quadv3cCrlmm", "human550v3bCrlmm", "human650v3aCrlmm", "human610quadv1bCrlmm", "human660quadv1aCrlmm", "human1mduov3bCrlmm", "humanomni1quadv1bCrlmm") } affyPlatforms <- function(){ platforms <- c("pd.mapping50k.xba240", "pd.mapping50k.hind240", "pd.mapping250k.nsp", "pd.mapping250k.sty", "pd.genomewidesnp.5", "pd.genomewidesnp.6") combined <- rep(NA, 2) combined[1] <- paste(sort(platforms[1:2]), collapse=",") combined[2] <- paste(sort(platforms[3:4]), collapse=",") platforms <- c(platforms, combined) platforms } checkAnnotation <- function(x){ if(length(x) == 0) return(FALSE) x <- strsplit(x, ",")[[1]] if(length(x) == 1){ istrue <- isSupportedAnnotation(x) } else { istrue <- sapply(x, isSupportedAnnotation) istrue <- all(istrue) } return(istrue) } setReplaceMethod("position", signature(object="oligoSnpSet", value="integer"), function(object, value){ position(featureData(object)) <- value object }) setReplaceMethod("position", signature(object="GenomeAnnotatedDataFrame", value="integer"), function(object, value){ object$position <- value object }) setMethod("makeFeatureGRanges", signature(object="GenomeAnnotatedDataFrame"), function(object, genome, ...){ chr.names <- c(paste("chr", 1:22, sep=""), "chrX", "chrY") sl <- getSequenceLengths(genome) sl <- sl[chr.names] chrom <- paste("chr", integer2chromosome(chromosome(object)), sep="") if(!all(chrom %in% chr.names)) stop("chromosomes must be chr1, ... chr22, chrX, or chrY") gr <- GRanges(chrom, IRanges(position(object), width=1), seqlengths=sl) names(gr) <- sampleNames(object) metadata(gr) <- list(genome=genome) return(gr) }) setMethod("getArm", signature(object="GenomeAnnotatedDataFrame"), function(object, genome){ genome <- match.arg(genome, c("hg18","hg19")) .getArm(chromosome(object), position(object), genome) }) oligoClasses/R/AllClasses.R0000644000175000017500000001403414136047277015422 0ustar nileshnilesh########################################################################### ## General DBPDInfo Classes ########################################################################### setClass("DBPDInfo", representation=representation( getdb="function", tableInfo="data.frame", geometry="integer", manufacturer="character", genomebuild="character", annotation="character")) setClass("GenericPDInfo", contains="DBPDInfo") setClass("SNPPDInfo", contains="DBPDInfo") setClass("SNPCNVPDInfo", contains="SNPPDInfo") setClass("ExpressionPDInfo", contains="DBPDInfo") setClass("TilingPDInfo", contains="DBPDInfo") setClass("stArrayDBPDInfo", contains="DBPDInfo") setClass("ExonPDInfo", contains="stArrayDBPDInfo") setClass("GenePDInfo", contains="stArrayDBPDInfo") setClass("HTAPDInfo", contains="stArrayDBPDInfo") ########################################################################### ## Manufacturer-specific PDInfo Classes ########################################################################### setClass("AffyTilingPDInfo", contains="TilingPDInfo", prototype=list(manufacturer="Affymetrix")) setClass("AffyExpressionPDInfo", contains="ExpressionPDInfo", prototype=list(manufacturer="Affymetrix")) setClass("AffyGenePDInfo", contains="GenePDInfo", prototype=list(manufacturer="Affymetrix")) setClass("AffyExonPDInfo", contains="ExonPDInfo", prototype=list(manufacturer="Affymetrix")) setClass("AffySTPDInfo", contains="AffyExpressionPDInfo") setClass("AffyHTAPDInfo", contains="HTAPDInfo") setClass("AffySNPPDInfo", contains="SNPPDInfo", prototype=list(manufacturer="Affymetrix")) setClass("AffySNPCNVPDInfo", contains="AffySNPPDInfo") setClass("NgsExpressionPDInfo", contains="ExpressionPDInfo", prototype=list(manufacturer="NimbleGen")) setClass("NgsTilingPDInfo", contains="TilingPDInfo", prototype=list(manufacturer="NimbleGen")) ########################################################################### ##Feature-level classes ########################################################################### setClass("FeatureSet", representation=representation( manufacturer="character", intensityFile="character", "VIRTUAL"), contains="NChannelSet", prototype=prototype( manufacturer=NA_character_, intensityFile=NA_character_)) setClass("GenericFeatureSet", contains="FeatureSet") setClass("ExpressionFeatureSet", contains="FeatureSet") setClass("SnpFeatureSet", contains="FeatureSet") setClass("SnpCnvFeatureSet", contains="SnpFeatureSet") setClass("TilingFeatureSet", contains="FeatureSet") setClass("ExonFeatureSet", contains="FeatureSet") setClass("GeneFeatureSet", contains="FeatureSet") setClass("HTAFeatureSet", contains="FeatureSet") setClass("AlleleSet", contains="eSet") ########################################################################### ## Combo classes - SNP Summaries - alleles + calls/conf ########################################################################### ## RS is no longer using this class setClass("SnpSuperSet", contains=c("AlleleSet", "SnpSet")) ########################################################################### ## GenomeAnnotatedDataFrame ########################################################################### setClass("GenomeAnnotatedDataFrame", contains="AnnotatedDataFrame") ########################################################################### ##SNP-level classes ########################################################################### setClass("gSet", contains="eSet", representation(##featureData="GenomeAnnotatedDataFrame", genome="character", "VIRTUAL")) setClass("SnpSet2", contains="gSet") ##setClass("SnpSet2", contains="SnpSet") setClass("oligoSnpSet", contains="SnpSet2") ##representation(featureData="GenomeAnnotatedDataFrame")) setClass("CopyNumberSet", contains="gSet") ## total copy number (no genotypes available) setClass("BeadStudioSet", contains="gSet") setClass("BafLrrSet", contains="BeadStudioSet") #setClass("SomeClass", contains="SnpSet2") ## why will this not work?? ########################################################################### ##Summary-level classes - CNP ########################################################################### setOldClass("ffdf") setOldClass("ff_matrix") setClassUnion("list_or_ffdf", c("list", "ffdf")) setClassUnion("ff_or_matrix", c("ffdf", "ff_matrix", "matrix")) setClass("CNSet", contains="gSet", representation(batch="character", batchStatistics="AssayData", mixtureParams="ff_or_matrix", datadir="list"))##, ## prototype = prototype( ## new("VersionedBiobase", ## versions=c(classVersion("SnpSet"), CNSet="1.0.6")))) setClass("CNSetLM") setMethod("initialize", "CNSetLM", function(.Object, ...){ .Defunct(msg="The CNSetLM class is defunct") }) ## SetList classes setClass("gSetList", representation(assayDataList="AssayData", phenoData="AnnotatedDataFrame", protocolData="AnnotatedDataFrame", experimentData="MIAME", featureDataList="list", ## could be GRangesList... chromosome="vector", annotation="character", genome="character", "VIRTUAL")) setClass("BeadStudioSetList", contains="gSetList") setClass("BafLrrSetList", contains="BeadStudioSetList") setClass("oligoSetList", contains="gSetList") ##--------------------------------------------------------------------------- ## classes for ranges ## deprecated now ## setClass("RangedDataCopyNumber", contains="RangedData", ## representation("VIRTUAL")) ## setClass("RangedDataCNV", contains="RangedDataCopyNumber") ## setClass("RangedDataCBS", contains="RangedDataCNV") ## setClass("RangedDataHMM", contains="RangedDataCNV") ##setClass("GRangesHMM", contains="GRanges") ##setClass("GRangesHMMList", contains="GRangesList") ##setClass("GRangesList", ## contains=c("CompressedList", "GenomicRangesList"), ## representation( ## unlistData="GRanges", ## elementMetadata="DataFrame" ## ), ## prototype( ## elementType="GRanges" ## ) ##) oligoClasses/R/methods-RangedDataCNV.R0000644000175000017500000001533014136047277017376 0ustar nileshnilesh##setValidity("RangedDataCNV", function(object){ ## all(c("chrom", "id", "num.mark") %in% colnames(object)) ##}) ##setValidity("RangedDataCBS", function(object){ ## if(nrow(object) > 0){ ## all(c("seg.mean", "start.index", "end.index") %in% colnames(object)) ## } ##}) ##setValidity("RangedDataHMM", function(object) "state" %in% colnames(object)) ## RangedDataCNV <- function(ranges=IRanges(), ## values, ## start, ## end, ## chromosome, ## coverage, ## sampleId, ## startIndexInChromosome, ## endIndexInChromosome, ## ...){ ## .Defunct("RangedDataCNV is defunct. Use GenomicRanges instead.") ## } ## RangedDataCBS <- function(ranges=IRanges(), ## seg.mean=vector("numeric", length(ranges)), ...){ ## .Defunct("RangedDataCBS is defunct. Use GRanges instead") ## } ## RangedDataHMM <- function(ranges=IRanges(), ## state=vector("integer", length(ranges)), ...){ ## .Defunct("RangedDataHMM is defunct. Use GRanges instead") ## } ## setMethod("state", signature(object="RangedDataCNV"), function(object) .Defunct()) ## setMethod("coverage2", signature(object="RangedDataCNV"), function(object) .Defunct()) ## setMethod("mean", signature(x="RangedDataCBS"), function(x,...) .Defunct()) ## setMethod("sampleNames", signature(object="RangedDataCNV"), function(object) .Defunct()) ## setMethod("chromosome", signature(object="RangedDataCNV"), function(object, na.rm=FALSE) .Defunct()) ## setMethod("findOverlaps", signature(query="RangedDataCNV", subject="SnpSet"), ## function (query, subject, maxgap = 0L, minoverlap = 1L, type = c("any", ## "start", "end", "within", "equal"), select = c("all", "first", ## "last", "arbitrary"), ...){ ## findOverlaps(query=query, subject=featureData(subject), ## maxgap=maxgap, ## minoverlap=minoverlap, ## type=type, ## select=select, ...) ## .Defunct("findOvelaps method for RangedDataCNV and SnpSet is defunct") ## }) ## setMethod("findOverlaps", signature(query="RangedDataCNV", subject="CNSet"), ## function (query, subject, maxgap = 0L, minoverlap = 1L, type = c("any", ## "start", "end", "within", "equal"), select = c("all", "first", ## "last", "arbitrary"), ...){ ## .Defunct("findOvelaps method for RangedDataCNV and CNSet is defunct") ## }) ## setMethod("findOverlaps", signature(query="RangedDataCNV", subject="AnnotatedDataFrame"), ## function (query, subject, maxgap = 0L, minoverlap = 1L, type = c("any", ## "start", "end", "within", "equal"), select = c("all", "first", ## "last", "arbitrary"), ...){ ## .Defunct("findOverlaps for RangedDataCNV and AnnotatedDataFrame is defunct") ## }) ## setMethod("findOverlaps", signature(query="AnnotatedDataFrame", subject="RangedDataCNV"), ## function (query, subject, maxgap = 0L, minoverlap = 1L, type = c("any", ## "start", "end", "within", "equal"), select = c("all", "first", ## "last", "arbitrary"), ...){ ## .Defunct("findOverlaps for AnnotatedDataFrame and RangedDataCNV is defunct") ## }) ## setMethod("findOverlaps", signature(query="RangedDataCNV", ## subject="RangedDataCNV"), ## function(query, subject, maxgap = 0L, minoverlap = 1L, ## type = c("any", "start", "end", "within", "equal"), ## select = c("all", "first", "last", "arbitrary"), ...){ ## .Defunct("findOverlaps for RangedDataCNV is defunct") ## }) ## setMethod("findOverlaps", signature(query="RangedDataHMM", ## subject="RangedDataHMM"), ## function(query, subject, maxgap = 0L, minoverlap = 1L, ## type = c("any", "start", "end", "within", "equal"), ## select = c("all", "first", "last", "arbitrary"), ...){ ## .Defunct("findOverlaps for RangedDataHMM is defunct") ## }) ## setReplaceMethod("sampleNames", signature(object="RangedDataCNV", ## value="character"), ## function(object, value){ ## .Defunct("sampleNames<- defunct for RangedDataCNV") ## }) setMethod("genomeBuild", signature(object="GRanges"), function(object) metadata(object)[["genome"]]) ##setAs("RangedDataHMM", "GRangesList", function(from, to){ ## GRangesListFromRangedDataHMM(from) ##}) ## ##setAs("RangedDataCNV", "GRangesList", function(from, to){ ## GRangesListFromRangedDataCNV(from) ##}) ##GRangesListFromRangedDataCNV <- function(object, build, ...){ ## index <- split(seq_len(nrow(object)), sampleNames(object)) ## notmissingbuild <- !missing(build) ## if(notmissingbuild) sl <- getSequenceLengths(build) ## grl <- vector("list", length(index)) ## for(i in seq_along(index)){ ## j <- index[[i]] ## gr <- GRanges(paste("chr", chromosome(object)[j], sep=""), ## IRanges(start(object)[j], end(object)[j])) ## if(notmissingbuild) seqlengths(gr) <- sl[match(unique(seqnames(gr)), names(sl))] ## elementMetadata(gr)$numberProbes <- coverage2(object)[j] ## grl[[i]] <- gr ## } ## grl <- GRangesList(grl) ## names(grl) <- names(index) ## grl ##} setMethod("findOverlaps", signature(query="GRangesList", subject="gSet"), function (query, subject, maxgap = 0L, minoverlap = 1L, type = c("any", "start", "end", "within", "equal"), select = c("all", "first", "last", "arbitrary"), ...){ frange <- makeFeatureGRanges(subject) findOverlaps(query, frange, maxgap=maxgap, minoverlap=minoverlap, type=match.arg(type), select=match.arg(select), ...) }) setMethod("findOverlaps", signature(query="GRanges", subject="gSet"), function (query, subject, maxgap = 0L, minoverlap = 1L, type = c("any", "start", "end", "within", "equal"), select = c("all", "first", "last", "arbitrary"), ...){ frange <- makeFeatureGRanges(subject) findOverlaps(query, frange, maxgap=maxgap, minoverlap=minoverlap, type=match.arg(type), select=match.arg(select), ...) }) coerceToGRanges <- function(range, build="hg18"){ ##chrlevels <- paste("chr", 1:22, sep="") chrlevels <- names(getSequenceLengths(build)) chrom <- paste("chr", chromosome(range), sep="") chrlevels <- chrlevels[chrlevels %in% chrom] if(is(range, "RangedDataHMM")){ gr <- GRanges(factor(chrom, levels=chrlevels), IRanges(start(range), end(range)), sample=sampleNames(range), state=range$state, numberProbes=coverage2(range), seqlengths=setSequenceLengths(build, names=chrlevels)) } if(is(range, "RangedDataCBS")){ gr <- GRanges(factor(chrom, levels=chrlevels), IRanges(start(range), end(range)), sample=sampleNames(range), seg.mean=range$seg.mean, numberProbes=coverage2(range), seqlengths=setSequenceLengths(build, names=chrlevels)) } metadata(gr) <- list(genome=build) gr ##sort(gr) } oligoClasses/R/methods-AlleleSet.R0000644000175000017500000001033514136047277016707 0ustar nileshnileshsetMethod("db", "AlleleSet", function(object) db(get(annotation(object)))) setMethod("A", "AlleleSet", function(object, ...) allele(object, "A", ...)) setMethod("B", "AlleleSet", function(object, ...) allele(object, "B", ...)) setReplaceMethod("A", "AlleleSet", function(object, value) { assayDataElementReplace(object, "alleleA", value) }) setReplaceMethod("B", "AlleleSet", function(object, value) { assayDataElementReplace(object, "alleleB", value) }) setMethod("bothStrands", "AlleleSet", function(object){ grp1 <- c("alleleA", "alleleB") grp2 <- c("senseAlleleA", "senseAlleleB", "antisenseAlleleA", "antisenseAlleleB") elem <- assayDataElementNames(object) if(all(grp1 %in% elem)){ return(FALSE) }else if (all(grp2 %in% elem)){ return(TRUE) }else{ stop("Invalid 'AlleleSet' object.") } }) setMethod("allele", "AlleleSet", function(object, allele, strand){ stopifnot(!missing(allele)) allele <- match.arg(allele, c("A", "B")) both <- bothStrands(object) if (!both){ what <- paste("allele", allele, sep="") }else{ stopifnot(!missing(strand)) strand <- match.arg(strand, c("sense", "antisense")) what <- paste(strand, "Allele", allele, sep="") } assayDataElement(object, what) }) setMethod("getM", "AlleleSet", function(object){ both <- bothStrands(object) ffmat <- all(unlist(eapply(assayData(object), is.ffmatrix))) ismat <- all(unlist(eapply(assayData(object), is.matrix))) stopifnot(ffmat || ismat) if (!both){ if (ismat){ tmp <- A(object)-B(object) }else{ tmp <- ff(vmode="double", dim=dim(object)) for (i in 1:ncol(object)) tmp[,i] <- A(object)[,i]-B(object)[,i] } }else{ if (ismat){ tmp <- array(NA, dim=c(dim(object), 2), dimnames=list(featureNames(object), sampleNames(object), c("antisense", "sense"))) tmp[,,1] <- A(object, "antisense")-B(object, "antisense") tmp[,,2] <- A(object, "sense")-B(object, "sense") }else{ tmp <- ff(vmode="double", dim=c(dim(object), 2)) for (i in 1:ncol(object)){ tmp[, i, 1] <- A(object, "antisense")[,i]-B(object, "antisense")[,i] tmp[, i, 2] <- A(object, "sense")[,i]-B(object, "sense")[,i] } } } return(tmp) }) setMethod("getA", "AlleleSet", function(object){ both <- bothStrands(object) ffmat <- all(unlist(eapply(assayData(object), is.ffmatrix))) ismat <- all(unlist(eapply(assayData(object), is.matrix))) stopifnot(ffmat || ismat) ## rm(ffmat, ismat) if (!both){ if (ismat){ tmp <- (A(object)+B(object))/2 }else{ tmp <- ff(vmode="double", dim=dim(object)) for (i in 1:ncol(object)) tmp[,i] <- (A(object)[,i]+B(object)[,i])/2 } }else{ if (ismat){ tmp <- array(NA, dim=c(dim(object), 2), dimnames=list(featureNames(object), sampleNames(object), c("antisense", "sense"))) tmp[,,1] <- (A(object, "antisense")+B(object, "antisense"))/2 tmp[,,2] <- (A(object, "sense")+B(object, "sense"))/2 }else{ tmp <- ff(vmode="double", dim=c(dim(object), 2)) for (i in 1:ncol(object)){ tmp[, i, 1] <- (A(object, "antisense")[,i]+B(object, "antisense")[,i])/2 tmp[, i, 2] <- (A(object, "sense")[,i]+B(object, "sense")[,i])/2 } } } return(tmp) }) oligoClasses/R/methods-SnpFeatureSet.R0000644000175000017500000000716214136047277017571 0ustar nileshnileshsetMethod("bothStrands", "SnpFeatureSet", function(object){ pkg <- annotation(object) set1 <- c("pd.mapping50k.xba240", "pd.mapping50k.hind240", "pd.mapping250k.sty", "pd.mapping250k.nsp") set2 <- c("pd.genomewidesnp.5", "pd.genomewidesnp.6") if (pkg %in% set1){ return(TRUE) }else if (pkg %in% set2){ return(FALSE) }else{ return(NA) } }) setMethod("allele", "SnpFeatureSet", function(object, allele, strand){ allele <- match.arg(allele, c("A", "B")) axiom <- length(grep("axiom", annotation(object))) == 1 ## remember: select different than value below (works also ## on axiom) ac <- switch(allele, A=1, B=0) cc <- switch(allele, A='channel2', B='channel1') ccc <- setdiff(c('channel1', 'channel2'), cc) if (axiom){ sql <- paste('SELECT man_fsetid, fsetid, fid, allele, allelea, alleleb, count', 'FROM pmfeature', 'INNER JOIN featureSet USING(fsetid)', 'WHERE allele != ', ac) tmp <- dbGetQuery(db(object), sql) tmp <- tmp[order(tmp[['count']], tmp[['fsetid']], tmp[['fid']]),] rownames(tmp) <- NULL ## easy SNPs: [A/C] [A/G] [T/C] [T/G] ## alleleA: fid channel1 ## alleleB: fid channel2 ## hard grn.: [A/T] ## alleleA: fid channel1 ## alleleB: fid channel1 (probe2) ## hard cyan: [C/G] ## alleleA: fid channel2 ## alleleB: fid channel2 (probe2) ## indel grn: [-/A] [-/T] ## need Angela ## alleleA: fid channel1 ## alleleB: fid channel2 ## indel cyn: [-/C] [-/G] ## need Angela ## alleleA: fid channel2 ## alleleB: fid channel1 easy <- c("AC", "AG", "TC", "TG") hgrn <- "AT" hcyn <- "CG" indelg <- c("-A", "-T") indelc <- c("-C", "-G") types <- paste(tmp[['allelea']], tmp[['alleleb']], sep='') i1 <- which(types %in% easy) i2 <- which(types %in% hgrn) i3 <- which(types %in% hcyn) i4 <- which(types %in% indelg) i5 <- which(types %in% indelc) a1 <- assayDataElement(object, cc)[tmp[i1, 'fid'],,drop=FALSE] a2 <- assayDataElement(object, cc)[tmp[i2, 'fid'],,drop=FALSE] a3 <- assayDataElement(object, ccc)[tmp[i3, 'fid'],,drop=FALSE] a4 <- assayDataElement(object, cc)[tmp[i4, 'fid'],,drop=FALSE] a5 <- assayDataElement(object, ccc)[tmp[i5, 'fid'],,drop=FALSE] result <- rbind(a1, a2, a3, a4, a5) i <- c(i1, i2, i3, i4, i5) tmp2 <- tmp[i,] rownames(result) <- tmp2[, 'man_fsetid'] o <- order(tmp2[['fsetid']], tmp2[['fid']]) rm(tmp2) result <- result[o,, drop=FALSE] return(result) }else{ stop("Not yet implemented") } }) oligoClasses/R/methods-AnnotatedDataFrame.R0000644000175000017500000000060414136047277020515 0ustar nileshnileshsetMethod("chromosome", signature(object="AnnotatedDataFrame"), function(object, na.rm=FALSE, ...){ chrom <- object$chromosome if(!na.rm) return(chrom) chrom[!is.na(chrom)] }) setMethod("position", signature(object="AnnotatedDataFrame"), function(object, na.rm=FALSE, ...) { pos <- object$position if(!na.rm){ return(pos) } pos[!is.na(pos)] }) oligoClasses/R/utils-lds.R0000644000175000017500000001126514136047277015317 0ustar nileshnilesh## utilities for Large Dataset Support ## ## Summary: ## - is.ffmatrix: test specifically for ff_matrix ## - ldStatus: TRUE if Large Dataset Support is available ## - ldPath: where to save ff files ## - createFF: creates an ff object setting path appropriately ## (leaving out of fftempdir b/c parallel processes ## access the object very easily) initializeBigArray <- function(name=basename(tempfile()), dim=c(0L,0L,0L), vmode="integer", initdata=NA){ if(isPackageLoaded("ff")){ results <- createFF(name=name, dim=dim, vmode=vmode, initdata=initdata) } else { init <- switch(vmode, integer=as.integer(initdata), double=as.double(initdata), character=as.character(initdata), stop("Mode ", vmode, " not implemented for regular matrices")) results <- array(init, dim=dim) } return(results) } initializeBigMatrix <- function(name=basename(tempfile()), nr=0L, nc=0L, vmode="integer", initdata=NA){ if(isPackageLoaded("ff") & (nr > 0 | nc > 0)){ if(prod(nr, nc) > 2^31){ ##Need multiple matrices ## -- use ffdf ## How many samples per ff object S <- floor(2^31/nr - 1) ## How many ff objects L <- ceiling(nc/S) name <- paste(name, 1:L, sep="_") resultsff <- vector("list", L) for(i in 1:(L-1)){ ## the Lth object may have fewer than nc columns resultsff[[i]] <- createFF(name=name[i], dim=c(nr, S), vmode=vmode, initdata=initdata) } ##the Lth element leftOver <- nc - ((L-1)*S) resultsff[[L]] <- createFF(name=name[L], dim=c(nr, leftOver), vmode=vmode, initdata=initdata) results <- do.call(ffdf, resultsff) rm(resultsff); gc() } else { results <- createFF(name=name, dim=c(nr, nc), vmode=vmode, initdata=initdata) } } else { init <- switch(vmode, integer=as.integer(initdata), double=as.double(initdata), character=as.character(initdata), stop("Mode ", vmode, " not implemented for regular matrices")) results <- matrix(init, nr, nc) } return(results) } initializeBigVector <- function(name=basename(tempfile()), n=0L, vmode="integer", initdata=NA){ if(isPackageLoaded("ff")){ results <- ff(initdata=initdata, vmode=vmode, length=n, pattern=file.path(ldPath(), basename(name))) } else { init <- switch(vmode, integer=as.integer(initdata), double=as.double(initdata), character=as.character(initdata), stop("Mode ", vmode, " not implemented for regular matrices")) results <- rep(init, n) } return(results) } createFF <- function(name, dim, vmode="double", initdata=NULL) ff(initdata=initdata, vmode=vmode, dim=dim, pattern=file.path(ldPath(), basename(name))) ## TODO: really safe to use :::? setMethod("annotatedDataFrameFrom", "ff_matrix", Biobase:::annotatedDataFrameFromMatrix) is.ffmatrix <- function(object) is(object, "ff_matrix") isFF <- function(object){ names <- ls(assayData(object)) is(assayData(object)[[names[[1]]]], "ff") | is(assayData(object)[[names[[1]]]], "ffdf") } ldPath <- function(path){ if (missing(path)){ return(getOption("ldPath")) }else{ if(!is.character(path)) stop("path is not a character string") ## stopifnot(is.character(path)) options(ldPath=path) } } ldSetOptions <- function(nsamples=100, nprobesets=20000, path=getwd(), verbose=FALSE){ ocProbesets(nprobesets) ocSamples(nsamples) ldPath(path) ldStatus(verbose) TRUE } ldStatus <- function(verbose=FALSE){ ld <- isPackageLoaded("ff") if (verbose){ message(getBar()) message("Large dataset support for 'oligo/crlmm': ", appendLF=FALSE) if (ld){ message("Enabled") ns <- prettyNum(c(ocProbesets(), ocSamples()), big.mark=",") message(" - Probesets: ", ns[1]) message(" - Samples..: ", ns[2]) message(" - Path.....: ", ldPath()) }else{ message("Disabled") message(" - Load 'ff'") } message(getBar()) } return(ld) } ## does nothing if not an ff object setMethod("open", "numeric", function(con, ...) return(NULL)) setMethod("open", "matrix", function(con, ...) return(NULL)) setMethod("open", "array", function(con, ...) return(NULL)) setMethod("close", "numeric", function(con, ...) return(NULL)) setMethod("close", "matrix", function(con, ...) return(NULL)) setMethod("close", "array", function(con, ...) return(NULL)) oligoClasses/R/utils-parallel.R0000644000175000017500000000574414136047277016336 0ustar nileshnilesh## utilities for parallel computing (now (20Mar2012) via foreach) ## ## NOTE: Using this framework, it is possible to allow for parallel ## computing WITHOUT the ff package. The problem with this is to ## overload the system as operations will pottentially copy the same ## data over and over and over. Therefore, I chose to allow parallel ## computing only when ff is loaded. ## ## Summary (useful when coding): ## - parStatus: TRUE if requirements for parallel are met ## - ocProbesets: number of probesets to process at a time (batch) ## - ocSamples: number of samples to process at a time (batch) ## - ocPath: path where ff objects are to be saved parStatus <- function() getDoParRegistered() & isPackageLoaded('ff') ocParallelStatus <- function(verbose=TRUE){ cl <- parStatus() if (verbose){ message("Parallel computing support for 'oligo/crlmm': ", appendLF=FALSE) if (!cl){ message("Disabled") message(" - Load 'ff'") message(" - Load and register a 'foreach' adaptor") message(" Example - Using 'multicore' for 2 cores:") message(" library(doMC)") message(" registerDoMC(2)") }else{ message("Enabled") ocProbesets(getOption('ocProbesets')) ocSamples(getOption('ocSamples')) } message(getBar()) } return(cl) } ocProbesets <- function(n){ if (missing(n)){ return(getOption("ocProbesets")) }else{ options(ocProbesets=n) invisible(TRUE) } } ocSamples <- function(n){ if (missing(n)){ return(getOption("ocSamples")) }else{ options(ocSamples=n) invisible(TRUE) } } ocLapply <- function(X, FUN, ..., neededPkgs){ if(missing(neededPkgs)) neededPkgs <- 'ff' else neededPkgs <- unique(c('ff', neededPkgs)) x <- NULL ## to make NOTE go away in R's package checker if (parStatus()){ res <- foreach(x=X, .packages=neededPkgs) %dopar% FUN(x, ...) }else{ res <- lapply(X, FUN, ...) } return(res) } splitIndicesByLength <- function(x, lg, balance=FALSE){ lx <- length(x) split(x, rep(seq(1,lx), each=lg, length.out=lx)) } splitIndicesByNode <- function(x){ split(x, sort(rep(1:getDoParWorkers(), length.out=length(x)))) } ## deprecated setCluster <- function(...){ msg <- paste('To set cluster for oligo/crlmm/friends,', 'use the "foreach" package and one adaptor like "doMC" or "doMPI."', 'Then, register the adaptor via registerDo*().') .Deprecated(msg=msg) } delCluster <- function(){ msg <- paste('Use the recommendations used by the "foreach" package.') .Deprecated(msg=msg) } getCluster <- function(){ .Deprecated('getDoParWorkers') } requireClusterPkgSet <- function(packages){ .Deprecated(msg='Function no longer needed. Replaced by proper argument of foreach') } requireClusterPkg <- function(pkg, character.only=TRUE){ .Deprecated(msg='Function no longer needed. Replaced by proper argument of foreach') } oligoClasses/R/methods-FeatureSet.R0000644000175000017500000000211214136047277017076 0ustar nileshnilesh## Only accessors for FeatureSet objects ## In addition to the slots inherited from eSet, FeatureSet has: ## - manufacturer ## - 'exprs' in assayData ## - 'channel1' and 'channel2' in assayData setMethod("manufacturer", signature(object="FeatureSet"), function(object) object@manufacturer) setReplaceMethod("manufacturer", signature(object="FeatureSet"), function(object, value){ object@manufacturer <- value object }) setMethod("exprs", signature(object="FeatureSet"), function(object) assayDataElement(object,"exprs")) setReplaceMethod("exprs", signature(object="FeatureSet"), function(object, value) assayDataElementReplace(object, "exprs", value)) setMethod("db", "FeatureSet", function(object){ db(get(annotation(object))) }) setMethod("kind", "FeatureSet", function(object){ kind(get(annotation(object))) }) setMethod("geometry", "FeatureSet", function(object) geometry(getPD(object)) ) oligoClasses/R/methods-BeadStudioSetList.R0000644000175000017500000001570714136047277020400 0ustar nileshnileshsetMethod("initialize", signature(.Object="BeadStudioSetList"), function(.Object, assayDataList=AssayDataList(baf=baf, lrr=lrr), lrr=list(), baf=lapply(lrr, function(x) matrix(nrow=nrow(x), ncol=ncol(x))), featureDataList=GenomeAnnotatedDataFrameFrom(assayDataList, annotation, genome), chromosome=vector("list", length(lrr)), phenoData, annotation=character(), genome=character(), ...){ if(missing(phenoData)){ if(length(lrr) > 0){ phenoData <- annotatedDataFrameFrom(lrr[[1]], byrow=FALSE) } else { phenoData <- new("AnnotatedDataFrame") } } callNextMethod(.Object, assayDataList=assayDataList, featureDataList=featureDataList, phenoData=phenoData, chromosome=chromosome, annotation=annotation, genome=genome, ...) }) setMethod("updateObject", signature(object="BeadStudioSetList"), function(object, ..., verbose=FALSE) { if (verbose) message("updateObject(object = 'BeadStudioSetList')") obj <- tryCatch(callNextMethod(object), error=function(e) NULL) if(is.null(obj)){ obj <- new("BeadStudioSetList", assayDataList = assayDataList(object), phenoData = phenoData(object), annotation = updateObject(annotation(object), ..., verbose=verbose), featureDataList=featureDataList(object), chromosome=chromosome(object), genome=genomeBuild(object), ...) } obj }) setMethod("[[", signature(x="BeadStudioSetList"), function(x, i, j, ..., exact=TRUE){ if(missing(i)) return(x) ad <- assayDataList(x) fdlist <- featureData(x) adnew <- switch(storage.mode(ad), lockedEnvironment =, environment = new.env(parent=emptyenv()), list = list()) nms <- ls(ad) if(length(i) == 1){ for (nm in ls(ad)){ elt <- ad[[nm]][[i]] dimnames(elt) <- lapply(dimnames(elt), unname) adnew[[nm]] <- elt } } x <- new("BeadStudioSet", assayData=adnew, phenoData=phenoData(x), featureData=fdlist[[i]], genome=genomeBuild(x), annotation=annotation(x)) }) setMethod("[[", signature(x="BafLrrSetList"), function(x, i, j, ..., exact=TRUE){ x <- callNextMethod() new("BafLrrSet", assayData=assayData(x), phenoData=phenoData(x), featureData=featureData(x), genome=genomeBuild(x), annotation=annotation(x)) }) setMethod("[", signature(x="gSetList"), function(x, i, j, ..., drop=TRUE){ if(missing(i) && missing(j)) return(x) ad <- assayDataList(x) if(!missing(i)){ fdlist <- featureData(x)[i] } adnew <- switch(storage.mode(ad), lockedEnvironment =, environment = new.env(parent=emptyenv()), list = list()) nms <- ls(ad) if(!missing(i)){ for (nm in ls(ad)){ elt <- ad[[nm]][i] adnew[[nm]] <- elt } ad <- adnew } if(missing(j)){ x@featureDataList <- fdlist x@chromosome <- x@chromosome[i] } else { for (nm in ls(ad)){ elt <- lapply(ad[[nm]], function(y, j) y[, j, drop=FALSE], j=j) adnew[[nm]] <- elt } phenoData(x) <- phenoData(x)[j, ] x@protocolData <- x@protocolData[j, ] } x@assayDataList <- adnew return(x) }) setReplaceMethod("[[", signature(x="BafLrrSetList", value="BafLrrSet"), function(x, i, j, ..., value){ fdl <- x@featureDataList fdl[[i]] <- featureData(value) adl <- x@assayDataList r <- adl[["lrr"]] r[[i]] <- lrr(value) b <- adl[["baf"]] b[[i]] <- baf(value) adl <- AssayDataList(lrr=r, baf=b) new("BafLrrSetList", assayDataList=adl, featureDataList=fdl, phenoData=phenoData(x), chromosome=chromosome(x), annotation=annotation(x), genome=genomeBuild(x)) }) setReplaceMethod("assayData", signature=signature(object="BeadStudioSetList", value="AssayData"), function(object, value) { object@assayDataList <- value object }) setMethod("baf", signature(object="oligoSetList"), function(object) assayData(object)[["baf"]]) setMethod("baf", signature(object="BeadStudioSetList"), function(object){ ##lapply(object, baf) assayDataList(object)[["baf"]] }) setMethod(baf, signature(object="BafLrrSetList"), function(object){ assayDataList(object)[["baf"]] }) setMethod("calls", signature(object="oligoSetList"), function(object) assayData(object)[["call"]]) setMethod("copyNumber", signature(object="oligoSetList"), function(object) assayData(object)[["copyNumber"]]) setMethod("lrr", signature(object="BeadStudioSetList"), function(object){ ##lapply(object, lrr) assayDataList(object)[["lrr"]] }) setMethod("lrr", signature(object="BafLrrSetList"), function(object){ ##lapply(object, lrr) assayDataList(object)[["lrr"]] }) setReplaceMethod("lrr", signature(object="BafLrrSetList", value="matrix"), function(object, value){ ## value can often be fewer columns than object if(is.null(rownames(value))) stop("row.names is NULL") if(is.null(colnames(value))) stop("col.names is NULL") sample.index <- match(colnames(value), sampleNames(object)) for(j in seq_along(object)){ bset <- object[[j]] k <- match(featureNames(bset), rownames(value)) lrr(bset)[, sample.index] <- value[k, , drop=FALSE] object[[j]] <- bset } return(object) }) ##setMethod("ncol", signature(x="BeadStudioSetList"), ## function(x) ncol(assayDataList(x)[["lrr"]][[1]])) setMethod("snpCallProbability", signature(object="oligoSetList"), function(object) assayData(object)[["callProbability"]]) setMethod(clone2, "BafLrrSetList", function(object, id, prefix, ...){ duplicateBLList(object, ids=id, prefix=prefix, ...) }) duplicateBLList <- function(object, ids, prefix="waveAdj", empty=FALSE){ ##brList.copy <- object ## duplicate the lrr ff objects. Then do wave correction on the ## duplicated files. if(missing(ids)) ids <- sampleNames(object) ids <- as.character(ids) r <- lrr(object) b <- baf(object) rcopy.list <- list() bcopy.list <- list() for(i in seq_along(r)){ x <- r[[i]] y <- b[[i]] rcopy <- initializeBigMatrix(paste(prefix, "lrr", sep="-"), nrow(x), length(ids), vmode="integer") bcopy <- initializeBigMatrix(paste(prefix, "baf", sep="-"), nrow(x), length(ids), vmode="integer") dimnames(rcopy) <- list(rownames(x), ids) dimnames(bcopy) <- dimnames(rcopy) J <- match(ids, colnames(x)) if(!empty){ for(j in seq_along(J)){ k <- J[j] rcopy[, j] <- x[, k] bcopy[, j] <- y[, k] } } rcopy.list[[i]] <- rcopy bcopy.list[[i]] <- bcopy } adl <- AssayDataList(baf=bcopy.list, lrr=rcopy.list) pd <- phenoData(object)[match(ids, sampleNames(object)), ] new("BafLrrSetList", assayDataList=adl, featureDataList=featureData(object), phenoData=pd, chromosome=chromosome(object), annotation=annotation(object), genome=genomeBuild(object)) } oligoClasses/R/methods-gSet.R0000644000175000017500000000731514136047277015743 0ustar nileshnileshsetMethod("initialize", signature(.Object="gSet"), function(.Object, assayData = assayDataNew(...), phenoData = annotatedDataFrameFrom(assayData, byrow=FALSE), experimentData = new("MIAME"), annotation = character(), protocolData = phenoData[,integer(0)], genome=c("hg19", "hg18"), featureData, ...) { genome <- match.arg(genome) if(missing(featureData)) featureData <- GenomeAnnotatedDataFrameFrom(assayData, annotation, genome=genome) .Object@genome <- genome .Object <- callNextMethod(.Object, assayData = assayData, phenoData = phenoData, featureData = featureData, experimentData = experimentData, annotation = annotation, protocolData = protocolData) return(.Object) }) ##setValidity("gSet", function(object){ ## if(nrow(object) == 0) return(TRUE) ## sl <- getSequenceLengths(genomeBuild(object)) ## charChrom <- unique(integer2chromosome(chromosome(object))) ## fr <- makeFeatureGRanges(object, seqlengths=sl[charChrom]) ## fr2 <- ##}) setMethod("isSnp", signature(object="gSet"), function(object, ...) { isSnp(featureData(object)) }) setMethod("isSnp", signature(object="character"), function(object, pkgname, ...){ path <- system.file("extdata", package=pkgname) load(file.path(path, "snpProbes.rda")) snpProbes <- get("snpProbes") object %in% snpProbes }) setMethod("db", "gSet", function(object) { requireAnnotation(annotation(object)) || stop(paste(annotation(object), "package not available")) get(annotation(object))@getdb() }) setMethod("chromosome", "gSet", function(object, na.rm=FALSE, ...){ chromosome(featureData(object), na.rm) }) setReplaceMethod("chromosome", signature(object="gSet", value="integer"), function(object, value){ fData(object)$chromosome <- value object }) setMethod("position", "gSet", function(object, na.rm=FALSE, ...){ position(featureData(object), na.rm) }) setMethod("checkOrder", signature(object="gSet"), function(object, verbose=FALSE){ .checkOrder(object, verbose) }) .checkOrder <- function(object, verbose=FALSE){ d <- diff(order(chromosome(object), position(object))) if(any(d < 0)){ if(verbose) warning("Object should be ordered by chromosome and physical position.\n", "Try \n", "> object <- order(object) \n") return(FALSE) } TRUE } chromosomePositionOrder <- function(object, ...){ is.ordered <- checkOrder(object) if(!is.ordered){ ##if(verbose) message("Ordering ", class(object), " object by chromosome and physical position") index <- order(chromosome(object), position(object), ...) object <- object[index, ] } return(object) } setMethod("genomeBuild", signature(object="gSet"), function(object) object@genome) setReplaceMethod("genomeBuild", signature(object="gSet", value="character"), function(object, value){ object@genome <- value return(object) }) setMethod("show", signature(object="gSet"), function(object){ callNextMethod(object) cat("genome: ", genomeBuild(object), "\n") }) setMethod("makeFeatureGRanges", signature(object="gSet"), function(object, ...){ makeFeatureGRanges(featureData(object), genomeBuild(object)) ## sl <- getSequenceLengths(genomeBuild(object)) ## gr <- GRanges(paste("chr", chromosome(object), sep=""), ## IRanges(position(object), width=1)) ## seqlengths(gr) <- sl[match(unique(seqnames(gr)), names(sl))] ## return(gr) }) setMethod("getArm", signature(object="gSet"), function(object, ...){ .getArm(chromosome(object), position(object), genomeBuild(object)) }) oligoClasses/R/methods-CopyNumberSet.R0000644000175000017500000000152314136047277017573 0ustar nileshnilesh##setMethod("copyNumber", "CopyNumberSet", function(object) assayData(object)[["copyNumber"]]) setMethod("copyNumber", "CopyNumberSet", function(object) { cn <- assayDataElement(object, "copyNumber") return(cn) }) setReplaceMethod("copyNumber", signature(object="CopyNumberSet", value="matrix"), function(object, value){ assayDataElementReplace(object, "copyNumber", value) }) setMethod("cnConfidence", "CopyNumberSet", function(object) assayData(object)[["cnConfidence"]]) setReplaceMethod("cnConfidence", signature(object="CopyNumberSet", value="matrix"), function(object, value){ assayDataElementReplace(object, "cnConfidence", value) }) ##setMethod("order", "CopyNumberSet", ## function(object, ..., na.last=TRUE, decreasing=FALSE){ ## chromosomePositionOrder(...) ## }) oligoClasses/R/initialize-methods.R0000644000175000017500000004110214136047277017172 0ustar nileshnileshsetMethod("initialize", signature(.Object="CopyNumberSet"), function(.Object, assayData = assayDataNew(copyNumber = copyNumber, cnConfidence = cnConfidence, ...), phenoData = annotatedDataFrameFrom(assayData, byrow=FALSE), experimentData = new("MIAME"), annotation = character(), protocolData = phenoData[,integer(0)], copyNumber = new("matrix"), cnConfidence = matrix(numeric(), nrow=nrow(copyNumber), ncol=ncol(copyNumber), dimnames=dimnames(copyNumber)), featureData=GenomeAnnotatedDataFrameFrom(assayData, annotation, genome=genome), genome=c("hg19", "hg18"), ...) { if(nrow(copyNumber)>0){ if(!is(copyNumber[, 1], "integer")) stop("copyNumber should be supplied as a matrix of integers (original scale * 100). See integerMatrix in the oligoClasses package for the conversion to integer matrices") } .Object <- callNextMethod(.Object, assayData = assayData, phenoData = phenoData, featureData = featureData, experimentData = experimentData, annotation = annotation, protocolData = protocolData) if(nrow(assayData[["copyNumber"]]) == 0){ .Object@genome <- "" } else{ .Object@genome <- match.arg(genome) } return(.Object) }) setValidity("CopyNumberSet", function(object){ assayDataValidMembers(assayData(object), c("copyNumber", "cnConfidence")) msg <- isValidGenomeAnnotatedDataFrame(featureData(object)) if(is.character(msg)) return(msg) else TRUE }) setAs("CNSet", "CopyNumberSet", function(from){ new("CopyNumberSet", copyNumber=totalCopynumber(from, i=1:nrow(from), j=1:ncol(from)), annotation=annotation(from), featureData=featureData(from), phenoData=phenoData(from), experimentData=experimentData(from), protocolData=protocolData(from)) }) ##setMethod("initialize", "oligoSnpSet", ## function(.Object, ## call=new("matrix"), ## callProbability=matrix(numeric(), nrow=nrow(call), ncol=ncol(call), dimnames=dimnames(call)), ## copyNumber=matrix(numeric(), nrow=nrow(call), ncol=ncol(call), dimnames=dimnames(call)), ## ##cnConfidence=matrix(numeric(), nrow=nrow(call), ncol=ncol(call), dimnames=dimnames(call)), ## assayData=Biobase::assayDataNew(call=call, ## callProbability=callProbability, ## copyNumber=copyNumber, ...), ## annotation=character(), ## phenoData, ## featureData, ##=GenomeAnnotatedDataFrameFrom(call, annotation), ## experimentData, ## protocolData, ## genome=c("hg19", "hg18"), ## ...){ ## if(nrow(copyNumber)>0){ ## if(!is(copyNumber[, 1], "integer")) stop("copyNumber should be supplied as a matrix of integers (original scale * 100). See integerMatrix in the oligoClasses package for the conversion to integer matrices") ## } ## nms <- names(list(...)) ## if(length(nms) > 0){ ## ## check that each element in ... is a matrix of integers ## for(i in seq_along(nms)){ ## elt <- list(...)[[nms[i]]] ## if(nrow(elt) > 0) ## if(!is(elt[,1], "integer")) stop("all assay data elements must be integers. For copy number, use original scale * 100 and for B allele frequencies use original scale * 1000. See integerMatrix in the oligoClasses package for the conversion to integer matrices") ## } ## } ## if(missing(featureData)) ## featureData <- GenomeAnnotatedDataFrameFrom(assayData, annotation) ## if(missing(phenoData)) ## phenoData <- Biobase::annotatedDataFrameFrom(call, byrow=FALSE) ## if(missing(experimentData)) ## experimentData <- new("MIAME") ## if(missing(protocolData)) ## protocolData <- phenoData[, integer(0)] ## .Object@genome <- match.arg(genome) ## .Object <- callNextMethod(.Object, ## assayData=assayData, ## annotation=annotation, ## featureData=featureData, ## experimentData=experimentData, ## phenoData=phenoData, ## protocolData=protocolData, ## ...) ## return(.Object) ## }) ##harmomonizeAssayData <- function(assayData){ ## nms <- names(ls(assayData)) ## nr <- rep(NA, length(nms)) ## for(i in seq_along(nms)){ ## elt <- assayData[[nms[i]]] ## nr[i] <- nrow(elt) ## } ##} setMethod("initialize", "oligoSnpSet", function(.Object, call=new("matrix"), callProbability=matrix(numeric(), nrow=nrow(call), ncol=ncol(call), dimnames=dimnames(call)), copyNumber=matrix(numeric(), nrow=nrow(call), ncol=ncol(call), dimnames=dimnames(call)), ##cnConfidence=matrix(numeric(), nrow=nrow(call), ncol=ncol(call), dimnames=dimnames(call)), assayData=Biobase::assayDataNew(call=call, callProbability=callProbability, copyNumber=copyNumber, ...), annotation=character(), phenoData, featureData, ##=GenomeAnnotatedDataFrameFrom(call, annotation), experimentData, protocolData, genome=c("hg19", "hg18"), ...){ if(nrow(copyNumber)>0){ if(!is(copyNumber[, 1], "integer")) stop("copyNumber should be supplied as a matrix of integers (original scale * 100). See integerMatrix in the oligoClasses package for the conversion to integer matrices") } nms <- names(list(...)) if(length(nms) > 0){ ## check that each element in ... is a matrix of integers for(i in seq_along(nms)){ elt <- list(...)[[nms[i]]] if(nrow(elt) > 0) if(!is(elt[,1], "integer")) stop("all assay data elements must be integers. For copy number, use original scale * 100 and for B allele frequencies use original scale * 1000. See integerMatrix in the oligoClasses package for the conversion to integer matrices") } } genome <- match.arg(genome) if(missing(featureData)) featureData <- GenomeAnnotatedDataFrameFrom(assayData, annotation, genome=genome) if(missing(phenoData)) phenoData <- Biobase::annotatedDataFrameFrom(call, byrow=FALSE) if(missing(experimentData)) experimentData <- new("MIAME") if(missing(protocolData)) protocolData <- phenoData[, integer(0)] .Object <- callNextMethod(.Object, assayData=assayData, annotation=annotation, featureData=featureData, experimentData=experimentData, phenoData=phenoData, protocolData=protocolData, ...) .Object@genome <- genome return(.Object) }) setValidity("oligoSnpSet", function(object){ ##nms <- ls(assayData(object)) Biobase::assayDataValidMembers(assayData(object), c("call", "callProbability", "copyNumber")) msg <- isValidGenomeAnnotatedDataFrame(featureData(object)) if(nrow(copyNumber(object)) > 0){ if(!is.integer(copyNumber(object)[,1])) return("copyNumber should be a matrix of integers (original scale * 100). Use integerMatrix(x, 100) for converting 'x' to a matrix of integers.") } if("baf" %in% ls(assayData(object))){ b <- assayData(object)[["baf"]] if(nrow(b) > 0){ if(!is.integer(b[,1])) return("B allele frequencies should be a matrix of integers (original scale * 1000). See integerMatrix(x, 1000) for converting 'x' to a matrix of integers.") } } if(nrow(object) > 0){ genome <- genomeBuild(object) if(!genome %in% c("hg18", "hg19")) return("Supported values for genome are hg18 and hg19") } if(is.character(msg)) return(msg) validObject(phenoData(object)) }) ## RS: ask BC about this... initialization method for CNSet does not work when this is uncommented setValidity("AlleleSet", function(object){ grp1 <- c("alleleA", "alleleB") grp2 <- c("senseAlleleA", "senseAlleleB", "antisenseAlleleA", "antisenseAlleleB") elem <- assayDataElementNames(object) ok <- all(grp1 %in% elem) || all(grp2 %in% elem) f <- function(x) paste("'", x, "'", collapse=" + ", sep="") if (!ok){ paste("Elements of 'AlleleSet' must be:", f(grp1), "OR", f(grp2)) }else{ TRUE } }) setMethod("initialize", "SnpSuperSet", function(.Object, ...) callNextMethod(.Object, ...)) initializeLmFrom <- function(object){ nr <- nrow(object) nc <- length(unique(batch(object))) if(nc > 1) nc <- nc+1 ## add extra column for grand mean lm <- assayDataNew(N.AA=initializeBigMatrix("N.AA", nr, nc), N.AB=initializeBigMatrix("N.AB", nr, nc), N.BB=initializeBigMatrix("N.BB", nr, nc), medianA.AA=initializeBigMatrix("medianA.AA", nr, nc), medianA.AB=initializeBigMatrix("medianA.AB", nr, nc), medianA.BB=initializeBigMatrix("medianA.BB", nr, nc), medianB.AA=initializeBigMatrix("medianB.AA", nr, nc), medianB.AB=initializeBigMatrix("medianB.AB", nr, nc), medianB.BB=initializeBigMatrix("medianB.BB", nr, nc), madA.AA=initializeBigMatrix("madA.AA", nr, nc, vmode="double"), madA.AB=initializeBigMatrix("madA.AB", nr, nc, vmode="double"), madA.BB=initializeBigMatrix("madA.BB", nr, nc, vmode="double"), madB.AA=initializeBigMatrix("madB.AA", nr, nc, vmode="double"), madB.AB=initializeBigMatrix("madB.AB", nr, nc, vmode="double"), madB.BB=initializeBigMatrix("madB.BB", nr, nc, vmode="double"), tau2A.AA=initializeBigMatrix("tau2A.AA", nr, nc, vmode="double"), tau2A.BB=initializeBigMatrix("tau2A.BB", nr, nc, vmode="double"), tau2B.AA=initializeBigMatrix("tau2B.AA", nr, nc, vmode="double"), tau2B.BB=initializeBigMatrix("tau2B.BB", nr, nc, vmode="double"), nuA=initializeBigMatrix("nuA", nr, nc, vmode="double"), nuB=initializeBigMatrix("nuB", nr, nc, vmode="double"), phiA=initializeBigMatrix("phiA", nr, nc, vmode="double"), phiB=initializeBigMatrix("phiB", nr, nc, vmode="double"), phiPrimeA=initializeBigMatrix("phiPrimeA", nr, nc, vmode="double"), phiPrimeB=initializeBigMatrix("phiPrimeB", nr, nc, vmode="double"), corrAB=initializeBigMatrix("corrAB", nr, nc, vmode="double"), corrBB=initializeBigMatrix("corrBB", nr, nc, vmode="double"), corrAA=initializeBigMatrix("corrAA", nr, nc, vmode="double"), flags=initializeBigMatrix("flags", nr, nc)) return(lm) } initializeLmFrom2 <- function(object, batch){ nr <- nrow(object) nc <- length(unique(batch)) if(nc > 1) nc <- nc+1 ## add extra column for grand mean lm <- assayDataNew(N.AA=initializeBigMatrix("N.AA", nr, nc), N.AB=initializeBigMatrix("N.AB", nr, nc), N.BB=initializeBigMatrix("N.BB", nr, nc), medianA.AA=initializeBigMatrix("medianA.AA", nr, nc), medianA.AB=initializeBigMatrix("medianA.AB", nr, nc), medianA.BB=initializeBigMatrix("medianA.BB", nr, nc), medianB.AA=initializeBigMatrix("medianB.AA", nr, nc), medianB.AB=initializeBigMatrix("medianB.AB", nr, nc), medianB.BB=initializeBigMatrix("medianB.BB", nr, nc), madA.AA=initializeBigMatrix("madA.AA", nr, nc, vmode="double"), madA.AB=initializeBigMatrix("madA.AB", nr, nc, vmode="double"), madA.BB=initializeBigMatrix("madA.BB", nr, nc, vmode="double"), madB.AA=initializeBigMatrix("madB.AA", nr, nc, vmode="double"), madB.AB=initializeBigMatrix("madB.AB", nr, nc, vmode="double"), madB.BB=initializeBigMatrix("madB.BB", nr, nc, vmode="double"), tau2A.AA=initializeBigMatrix("tau2A.AA", nr, nc, vmode="double"), tau2A.BB=initializeBigMatrix("tau2A.BB", nr, nc, vmode="double"), tau2B.AA=initializeBigMatrix("tau2B.AA", nr, nc, vmode="double"), tau2B.BB=initializeBigMatrix("tau2B.BB", nr, nc, vmode="double"), nuA=initializeBigMatrix("nuA", nr, nc, vmode="double"), nuB=initializeBigMatrix("nuB", nr, nc, vmode="double"), phiA=initializeBigMatrix("phiA", nr, nc, vmode="double"), phiB=initializeBigMatrix("phiB", nr, nc, vmode="double"), phiPrimeA=initializeBigMatrix("phiPrimeA", nr, nc, vmode="double"), phiPrimeB=initializeBigMatrix("phiPrimeB", nr, nc, vmode="double"), corrAB=initializeBigMatrix("corrAB", nr, nc, vmode="double"), corrBB=initializeBigMatrix("corrBB", nr, nc, vmode="double"), corrAA=initializeBigMatrix("corrAA", nr, nc, vmode="double"), flags=initializeBigMatrix("flags", nr, nc)) if(nc > 1) { sampleNames(lm) <- c(unique(batch), "grandMean") } else sampleNames(lm) <- unique(batch) return(lm) } setMethod("initialize", "CNSet", function(.Object, alleleA=new("matrix"), alleleB=alleleA, call=alleleA, callProbability=alleleA, assayData=assayDataNew(alleleA=alleleA, alleleB=alleleB, call=call, callProbability=callProbability, ...), phenoData=annotatedDataFrameFrom(assayData, byrow=FALSE), protocolData=phenoData[, integer(0)], experimentData=new("MIAME"), annotation=character(), featureData, batch=character(ncol(alleleA)), batchStatistics=initializeLmFrom2(alleleA, batch), genome=c("hg19", "hg18"), mixtureParams=new("matrix"), datadir=list("", integer(), ""), ...){ genome <- match.arg(genome) if(missing(featureData)) featureData <- GenomeAnnotatedDataFrameFrom(assayData, annotation, genome=genome) .Object@mixtureParams <- mixtureParams .Object@batch <- batch .Object@batchStatistics <- batchStatistics .Object <- callNextMethod(.Object, assayData=assayData, phenoData=phenoData, featureData=featureData, experimentData=experimentData, annotation=annotation, protocolData=protocolData, ...) .Object@datadir <- datadir .Object@genome <- genome if(nrow(.Object)==0) .Object@genome <- character() return(.Object) }) setValidity("CNSet", function(object){ if(!assayDataValidMembers(assayData(object), c("alleleA", "alleleB", "call", "callProbability"))){ return("assay data members must be 'alleleA', 'alleleB', 'call', 'callProbability'") } if(length(batch(object)) != ncol(object)){ return("'batch' must be the same length as the number of samples. ") } if(nrow(object) > 0){ genome <- genomeBuild(object) if(!genome %in% c("hg18", "hg19")) print("Supported entries for genome are hg18 and hg19") } msg <- isValidGenomeAnnotatedDataFrame(featureData(object)) if(is.character(msg)) return(msg) else TRUE }) initializeGenotypeSummaryFrom <- function(object){ nr <- nrow(object) nc <- 3 bns <- batchNames(object) elem.names <- paste("N_", bns, sep="") nGt <- vector("list", length(bns)) for(i in seq_along(bns)) nGt[[i]] <- initializeBigMatrix(elem.names[i], nr, nc) names(nGt) <- elem.names numberGt <- do.call(assayDataNew, nGt) elem.names <- paste("mns_", bns, sep="") mns <- vector("list", length(bns)) for(i in seq_along(bns)) mns[[i]] <- initializeBigMatrix(elem.names[i], nr, nc) mns <- do.call(assayDataNew, mns) elem.names <- paste("mads_", bns, sep="") mads <- vector("list", length(bns)) for(i in seq_along(bns)) mads[[i]] <- initializeBigMatrix(elem.names[i], nr, nc) mads <- do.call(assayDataNew, mads) return(list(numberGenotypes=numberGt, means=mns, mads=mads)) } setMethod("initialize", "BeadStudioSet", function(.Object, assayData=assayDataNew(baf = baf, lrr = lrr, ...), phenoData = annotatedDataFrameFrom(assayData, byrow=FALSE), featureData = GenomeAnnotatedDataFrameFrom(assayData, annotation), experimentData = new("MIAME"), annotation = character(), protocolData = phenoData[,integer(0)], baf = new("matrix"), lrr = matrix(numeric(), nrow=nrow(baf), ncol=ncol(baf), dimnames=dimnames(baf)), genome=c("hg19", "hg18"), ...) { .Object <- callNextMethod(.Object, assayData = assayData, phenoData = phenoData, featureData = featureData, experimentData = experimentData, annotation = annotation, protocolData = protocolData, ...) if(nrow(assayData[["baf"]]) == 0){ .Object@genome <- "" } else{ .Object@genome <- match.arg(genome) } return(.Object) }) setValidity("BeadStudioSet", function(object) { if(!is.null(lrr(object))){ if(nrow(lrr(object)) > 0) if(!is.integer(lrr(object)[,1])) return("lrr should be a matrix of integers (original scale * 100). Use integerMatrix(x, 100) for converting 'x' to a matrix of integers.") if(nrow(baf(object)) > 0){ b <- baf(object)[,1] if(!is.integer(b)) return("B allele frequencies should be a matrix of integers (original scale * 1000). See integerMatrix(x, 1000) for converting 'x' to a matrix of integers.") } } return(all(is.element(c("lrr","baf"), assayDataElementNames(object)))) }) oligoClasses/R/methods-SnpSet.R0000644000175000017500000001274714136047277016262 0ustar nileshnilesh## ## Directly from Biobase ## setMethod("initialize", "SnpSet2", function(.Object, assayData = assayDataNew(call = call, callProbability = callProbability, ...), phenoData = annotatedDataFrameFrom(assayData, byrow=FALSE), featureData,## = annotatedDataFrameFrom(assayData, byrow=TRUE), experimentData = new("MIAME"), annotation = character(), protocolData = phenoData[,integer(0)], call = new("matrix"), callProbability = matrix(numeric(), nrow=nrow(call), ncol=ncol(call), dimnames=dimnames(call)), genome=c("hg19", "hg18"), ...) { genome <- match.arg(genome) if(missing(featureData)) featureData <- GenomeAnnotatedDataFrameFrom(assayData, annotation, genome=genome) callNextMethod(.Object, assayData = assayData, phenoData = phenoData, featureData = featureData, experimentData = experimentData, annotation = annotation, protocolData = protocolData, ...) }) setMethod(snpCall, "SnpSet2", function(object, ...) { assayDataElement(object, "call") }) setMethod(snpCallProbability, "SnpSet2", function(object, ...) { assayDataElement(object, "callProbability") }) setReplaceMethod("snpCall", c("SnpSet2", "matrix"), function(object, ..., value){ assayDataElementReplace(object, "call", value) }) setReplaceMethod("snpCallProbability", c("SnpSet2", "matrix"), function(object, ..., value){ assayDataElementReplace(object, "callProbability", value) }) ##----------------------- ## new methods for SnpSet2 ## setMethod("calls", "SnpSet2", function(object) assayData(object)$call) setReplaceMethod("calls", signature(object="SnpSet2", value="matrix"), function(object, value) assayDataElementReplace(object, "call", value)) setMethod("calls", "SnpSet", function(object) assayData(object)$call) setReplaceMethod("calls", signature(object="SnpSet", value="matrix"), function(object, value) assayDataElementReplace(object, "call", value)) p2i <- function(p) as.integer(-1000*log(1-p)) i2p <- function(i) 1-exp(-i/1000) warningMsg <- function(X){ .class=class(X) warning("callProbability slot is of class ", .class, ".\n") cat("\nTo obtain the confidence scores, the data needs to be extracted from disk and represented as a matrix. The '[' method does both. For example,\n", fill=TRUE) message("> x <- confs(object)[,] ## 'x' is a matrix\n") cat("* Note however that 'x' may be very large and swamp the available RAM. A better approach would be to specify which rows (i) and columns (j) are read only those rows and columns from disk.\n", fill=TRUE) message("> x < confs(object)[i, j] \n") message("Finally, 'x' still needs to be translated to a probability. This can be done by", fill=TRUE) message("> p <- i2p(x)") } setMethod("confs", "SnpSet2", function(object, transform=TRUE) { X <- snpCallProbability(object) if(is(X, "ff_matrix") | is(X, "ffdf")){ warningMsg(X) return(X) } if (transform){ X <- i2p(X) } return(X) }) setReplaceMethod("confs", signature(object="SnpSet2", value="matrix"), function(object, value){ ##convert probability to integer if(max(value) > 1){ X <- matrix(p2i(value), nrow(X), ncol(X), dimnames=dimnames(value)) } else { X <- value } assayDataElementReplace(object, "callProbability", X) }) setMethod("confs", "SnpSet", function(object, transform=TRUE) { X <- snpCallProbability(object) if(is(X, "ff_matrix") | is(X, "ffdf")){ warningMsg(X) return(X) } if (transform){ X <- i2p(X) } return(X) }) setReplaceMethod("confs", signature(object="SnpSet", value="matrix"), function(object, value){ ##convert probability to integer if(max(value) > 1){ X <- matrix(p2i(value), nrow(X), ncol(X), dimnames=dimnames(value)) } else { X <- value } assayDataElementReplace(object, "callProbability", X) }) setMethod("combine", signature=signature(x="SnpSet2", y="SnpSet2"), function(x, y, ...){ ##Check that both x and y are valid objects if(!validObject(x)) stop("x is not a valid object") if(!validObject(y)) stop("y is not a valid object") annot <- paste(sort(c(annotation(x), annotation(y))), collapse=",") annotation(x) <- annotation(y) <- annot if(class(x) != class(y)){ stop("objects must have the same class") } if(storageMode(assayData(x)) != storageMode(assayData(y))){ stop("objects must have same storage mode for assayData") } fd <- combine(featureData(x), featureData(y)) pd <- combine(phenoData(x), phenoData(y)) ad.x <- as.list(assayData(x)) ad.y <- as.list(assayData(y)) ad.xy <- mapply(rbind, ad.x, ad.y, SIMPLIFY=FALSE) id.x <- match(rownames(ad.xy[[1]]), featureNames(fd)) ee <- combine(experimentData(x), experimentData(y)) assayData(x) <- ad.xy storageMode(assayData(x)) <- storageMode(assayData(y)) experimentData(x) <- ee featureData(x) <- fd phenoData(x) <- pd x }) ## setMethod("featuresInRange", signature(object="SnpSet2", range="RangedDataCNV"), ## function(object, range, FRAME=0, FRAME.LEFT, FRAME.RIGHT, ...){ ## .Defunct("featuresInRange has been deprecated. Use findOverlaps.") ## }) oligoClasses/R/utils-general.R0000644000175000017500000001312014136047277016142 0ustar nileshnileshloader <- function(theFile, envir, pkgname){ theFile <- file.path(system.file(package=pkgname), "extdata", theFile) if (!file.exists(theFile)) stop("File ", theFile, " does not exist in ", pkgname) load(theFile, envir=envir) } requireAnnotation <- function(pkgname, lib=.libPaths()[1], verbose=TRUE){ stopifnot(is.character(pkgname), !missing(pkgname)) status <- suppressWarnings(require(pkgname, character.only=TRUE, quietly=!verbose)) if (!status) status <- pdPkgFromBioC(pkgname, lib=lib, verbose=verbose) status } ## Package Downloader/Installer ## returns TRUE if installed and FALSE otherwise pdPkgFromBioC <- function(pkgname, lib=.libPaths()[1], verbose=TRUE) { if (length(lib) > 1) { warning("Ignoring all but first element of argument lib.") lib <- lib[1] } if (verbose){ message("Attempting to obtain '", pkgname, "' from BioConductor website.") message("Checking to see if your internet connection works...") } if (testBioCConnection()) { ## Check for file permissions if (file.access(lib, mode=0) < 0){ if (verbose) message("Directory '", lib, "' does not seem to exist.") return(FALSE) } if (file.access(lib, mode=2) < 0){ if (verbose) message("You do not have write access to '", lib, "'.") return(FALSE) } biocContribUrl <- sapply(repositories(), contrib.url) biocPkgs <- available.packages(biocContribUrl) if (! pkgname %in% biocPkgs[, "Package"]) { if (verbose) message("Package '", pkgname, "' was not found in the BioConductor repository.\n", "The 'pdInfoBuilder' package can often be used in situations like this.") return(FALSE) } else { install.packages(pkgname, lib=lib, repos=repositories(), dependencies=TRUE) status <- require(pkgname, character.only=TRUE, quietly=!verbose) if (status){ return(TRUE) }else{ if (verbose) message("There was a problem during download or installation.\n", "Package '", pkgname, "' cannot be loaded. Please, try again.") return(FALSE) } } } else { if (verbose) message("Could not access the Bioconductor repository.\n", "Please check your internet connection.") return(FALSE) } } list.celfiles <- function(..., listGzipped=FALSE){ files <- list.files(...) if (listGzipped){ return(files[grep("\\.[cC][eE][lL]\\.[gG][zZ]$|\\.[cC][eE][lL]$", files)]) }else{ return(files[grep("\\.[cC][eE][lL]$", files)]) } } celfileDate <- function(filename) { h <- affyio::read.celfile.header(filename, info="full") date <- grep("/", strsplit(h$DatHeader, " ")[[1]], value=TRUE) if(length(date) < 1){ ##try something else results <- h$ScanDate } else{ date <- strsplit(date, split="/")[[1]] CC <- ifelse(substr(date[3],1,1)=="9", "19", "20") results <- as.character(as.Date(paste(paste(CC, date[3], sep=""), date[1], date[2], sep="-"))) } results } celfileName <- function(object){ if(!is(object, "CNSet")) stop("object must be CNSet") vl <- varLabels(protocolData(object)) dirnames <- rep(object@datadir[[1]], object@datadir[[2]]) if("filename" %in% vl){ fns <- file.path(dirnames, protocolData(object)$filename) } else { fns <- file.path(dirnames, basename(sampleNames(object))) } if(!all(file.exists(fns))) stop("not all files exist") fns } ## a bar that I like to use when sending messages to the user getBar <- function(width=getOption("width")) paste(rep("=", width), collapse="") isPackageLoaded <- function(pkg){ stopifnot(is.character(pkg)) pkg <- paste("package:", pkg, sep="") pkg %in% search() } checkExists <- function(.name, .path=".", .FUN, .FUN2, .save.it=TRUE, .load.it, ...){ ##default of load.it depends on whether the object exists in .GlobalEnv if(exists(.name)){ message("Exists in .GlobalEnv") if(missing(.load.it)){ message(".load.it is missing. Setting .load.it to FALSE") .load.it <- FALSE } if(.load.it){ fname <- file.path(.path, paste(.name, ".rda", sep="")) if(file.exists(fname)){ message(".load.it is TRUE") message("Loading ", fname) load(fname) if(!exists(".object")) .object <- get(.name) return(.object) } else { message(fname, " does not exist") message("Running ", .FUN) .object <- .FUN(...) if(.save.it) { message("Saving ", fname) save(.object, file=fname) } return(.object) } } else { message(".load.it is FALSE. Nothing to do") .object <- get(.name) return(.object) } } else{ message(.name, " does not exist in .GlobalEnv") fname <- file.path(.path, paste(.name, ".rda", sep="")) if(file.exists(fname)){ message(fname, " exists") if(missing(.load.it)){ message(".load.it is missing. Setting .load.it to TRUE") .load.it <- TRUE } if(.load.it){ message("Loading ", fname) .tmp <- ls() load(fname) if(!exists(".object")) .object <- tryCatch(get(.name), error=function(e) NULL) ##extremely ad-hoc if(is.null(.object)) .object <- get(ls()[!(ls() %in% .tmp) & !(ls() %in% c(".object", ".tmp"))]) return(.object) } else { message(".load.it is FALSE. Running .FUN") .object <- .FUN(...) if(.save.it) { message("Saving ", fname) save(.object, file=fname) } return(.object) } } else { message(fname, " does not exist. Running .FUN") .object <- .FUN(...) if(.save.it) { message("Saving ", fname) save(.object, file=fname) } return(.object) } } } library2 <- function(...){ suppressPackageStartupMessages(library(...)) } oligoClasses/R/methods-SummarizedExperiment.R0000644000175000017500000000210414136047277021211 0ustar nileshnileshsetMethod("chromosome", signature(object="RangedSummarizedExperiment"), function(object,...) as.character(seqnames(object))) setMethod("isSnp", signature(object="RangedSummarizedExperiment"), function(object,...) values(rowRanges(object))$isSnp) setMethod("lrr", signature(object="RangedSummarizedExperiment"), function(object){ assays(object)[[1]] }) setMethod("baf", signature(object="RangedSummarizedExperiment"), function(object){ assays(object)[[2]] }) ## Remove the methods below once the transition from SummarizedExperiment ## to RangedSummarizedExperiment is complete. [H. Pages - May 11, 2015] setMethod("chromosome", signature(object="SummarizedExperiment"), function(object,...) as.character(seqnames(object))) setMethod("isSnp", signature(object="SummarizedExperiment"), function(object,...) values(rowRanges(object))$isSnp) setMethod("lrr", signature(object="SummarizedExperiment"), function(object){ assays(object)[[1]] }) setMethod("baf", signature(object="SummarizedExperiment"), function(object){ assays(object)[[2]] }) oligoClasses/R/methods-GRanges.R0000644000175000017500000000772514136047277016374 0ustar nileshnilesh##GRangesHMM <- function(seqnames = Rle(), ranges = IRanges(), ## strand = Rle("*", length(seqnames)), ## state=integer(), ## numberProbes=integer(), ## ..., ## seqlengths = # this default is more accurate than in newGRanges ## structure(rep(NA_integer_, length(unique(seqnames))), ## names = levels(as.factor(runValue(as(seqnames, "Rle")))))){ ## if(is.numeric(state)){ ## state <- Rle(factor(state)) ## } else { ## if(!is(state, "Rle")) stop("state must be Rle or numeric") ## } ## if (missing(seqlengths)) # avoid potentially expensive seqnames conversion ## GenomicRanges:::newGRanges("GRangesHMM", seqnames = seqnames, ranges = ranges, strand = strand, ## state=state, ## numberProbes=as.integer(numberProbes), ## ...) ## else GenomicRanges:::newGRanges("GRangesHMM", seqnames = seqnames, ranges = ranges, ## strand = strand, ## state=state, ## numberProbes=as.integer(numberProbes), ## ..., seqlengths = seqlengths) ##} ##setMethod("initialize", "GRangesHMM", ## function(.Object, numberProbes=integer(), state=Rle(), elementMetadata=DataFrame(state=state, numberProbes=numberProbes), ...){ ## callNextMethod(.Object, elementMetadata=elementMetadata, ...) ## }) ##setGeneric("as.GRangesHMM", function(x, seqlengths, ...) standardGeneric("as.GRangesHMM")) ##setAs("GRanges", "GRangesHMM", ## function(from, to){ ## state <- elementMetadata(from)$state ## numberProbes <- elementMetadata(from)$numberProbes ## gr <- GRangesHMM(paste("chr", chromosome(from), sep=""), ## IRanges(start(from), end(from)), ## state=state(from), ## numberProbes=coverage2(from)) ## }) ##GRangesHMMList <- function(...) ##{ ## listData <- list(...) ## if (length(listData) == 0L) { ## unlistData <- GRangesHMM() ## } else { ## if (length(listData) == 1L && is.list(listData[[1L]])) ## listData <- listData[[1L]] ## if (!all(sapply(listData, is, "GRangesHMM"))) ## stop("all elements in '...' must be GRangeHMM objects") ## unlistData <- suppressWarnings(do.call("c", unname(listData))) ## } ## end <- cumsum(elementNROWS(unname(listData))) ## ans <- IRanges:::newCompressedList("GRangesHMMList", ## unlistData, ## end = end, NAMES = names(listData), ## elementMetadata = new("DataFrame", nrows = length(listData))) ## validObject(ans) ## ans ##} ##--------------------------------------------------------------------------- ## ## convenience functions for GRanges ## ##--------------------------------------------------------------------------- setMethod("chromosome", "GRanges", function(object) as.character(seqnames(object))) setMethod("coverage2", "GRanges", function(object) elementMetadata(object)$numberProbes) setMethod("numberProbes", "GRanges", function(object) elementMetadata(object)$numberProbes) setMethod("sampleNames", "GRanges", function(object) as.character(elementMetadata(object)$sample)) setMethod("state", "GRanges", function(object) elementMetadata(object)$state) ##--------------------------------------------------------------------------- ## ## convenience functions for GRangesList ## ##--------------------------------------------------------------------------- setMethod("chromosome", signature(object="GRangesList"), function(object) seqnames(object)) setMethod("coverage2", signature(object="GRangesList"), function(object) numberProbes(object)) setMethod("numberProbes", signature(object="GRangesList"), function(object){ new2("CompressedRleList", unlistData=Rle(elementMetadata(object@unlistData)$numberProbes), partitioning=object@partitioning, check=FALSE) }) setMethod("sampleNames", signature(object="GRangesList"), function(object) names(object)) setMethod("state", signature(object="GRangesList"), function(object){ new2("CompressedRleList", unlistData=Rle(elementMetadata(object@unlistData)$state), partitioning=object@partitioning, check=FALSE) }) oligoClasses/R/show-methods.R0000644000175000017500000000063314136047277016015 0ustar nileshnileshsetMethod("show", "DBPDInfo", function(object) { cat("Class........:", class(object), "\n") cat("Manufacturer.:", manufacturer(object), "\n") cat("Genome Build.:", genomeBuild(object), "\n") cat("Chip Geometry:", geometry(object)[1], "rows x ", geometry(object)[2], "columns\n") }) setMethod("show", "FeatureSet", function(object){ callNextMethod() requireAnnotation(annotation(object)) }) oligoClasses/R/methods-oligoSnpSet.R0000644000175000017500000001027414136047277017305 0ustar nileshnileshsetMethod("updateObject", signature(object="oligoSnpSet"), function(object, ..., verbose=FALSE) { if (verbose) message("updateObject(object = 'oligoSnpSet')") obj <- tryCatch(callNextMethod(object), error=function(e) NULL) if(is.null(obj)){ obj <- new("oligoSnpSet", assayData = updateObject(assayData(object), ..., verbose=verbose), phenoData = phenoData(object), experimentData = updateObject(experimentData(object), ..., verbose=verbose), annotation = updateObject(annotation(object), ..., verbose=verbose), featureData=updateObject(featureData(object), ..., genome=genomeBuild(object), verbose=FALSE)) } if (all(isCurrent(obj))) return(obj) obj }) setReplaceMethod("baf", signature(object="oligoSnpSet"), function(object, value){ if("baf" %in% assayDataElementNames(object)){ object <- assayDataElementReplace(object, "baf", value) } else{ warning("assay data element 'baf' does not exist in oligoSnpSet object") } return(object) }) setMethod("copyNumber", "oligoSnpSet", function(object) { cn <- assayDataElement(object, "copyNumber") return(cn) }) setReplaceMethod("copyNumber", signature(object="oligoSnpSet", value="matrix"), function(object, value){ assayDataElementReplace(object, "copyNumber", value) }) setMethod("cnConfidence", "oligoSnpSet", function(object) assayData(object)[["cnConfidence"]]) setReplaceMethod("cnConfidence", signature(object="oligoSnpSet", value="matrix"), function(object, value){ assayDataElementReplace(object, "cnConfidence", value) }) setAs("oligoSnpSet", "data.frame", function(from, to){ cn <- copyNumber(from)/100 gt <- calls(from) cn <- as.numeric(cn) gt <- as.integer(gt) baf.present <- "baf" %in% ls(assayData(from)) lrr.present <- "lrr" %in% ls(assayData(from)) if(baf.present){ bf <- as.numeric(assayDataElement(from, "baf"))/1000 } if(lrr.present){ logRRatio <- as.numeric(assayDataElement(from, "lrr"))/100 } x <- rep(position(from)/1e6, ncol(from)) ##x <- rep(position(object)[marker.index], 4)/1e6 is.snp <- rep(isSnp(from), ncol(from)) id <- rep(sampleNames(from), each=nrow(from)) if(!baf.present){ df <- data.frame(x=x, cn=cn, gt=gt, id=id, is.snp=is.snp, stringsAsFactors=FALSE) } else { df <- data.frame(x=x, cn=cn, gt=gt, baf=bf, id=id, is.snp=is.snp, stringsAsFactors=FALSE) } if(lrr.present){ df$lrr <- logRRatio } df$id <- factor(df$id, ordered=TRUE, levels=unique(df$id)) return(df) }) ##setAs("oligoSnpSet", "SnpSet2", function(from, to){ ## new("SnpSet2", ## call=calls(from), ## callProbability=snpCallProbability(from), ## genome=genomeBuild(from), ## phenoData=phenoData(from), ## protocolData=protocolData(from), ## annotation=annotation(from), ## experimentData=experimentData(from), ## featureData=featureData(from)) ## ##}) ## ideally, oligoSnpSet would inherit from SnpSet2, but currently problems with GenomeAnnotatedDataFrame ##setMethod(snpCall, "oligoSnpSet", function(object, ...) { ## assayDataElement(object, "call") ##}) ## ##setMethod(snpCallProbability, "oligoSnpSet", function(object, ...) { ## assayDataElement(object, "callProbability") ##}) ## ##setReplaceMethod("snpCall", c("oligoSnpSet", "matrix"), ## function(object, ..., value) ##{ ## assayDataElementReplace(object, "call", value) ##}) ## ##setReplaceMethod("snpCallProbability", c("oligoSnpSet", "matrix"), ## function(object, ..., value) ##{ ## assayDataElementReplace(object, "callProbability", value) ##}) ## ####----------------------- #### new methods for oligoSnpSet #### ## ##setMethod("calls", "oligoSnpSet", function(object) assayData(object)$call) ##setReplaceMethod("calls", signature(object="oligoSnpSet", value="matrix"), ## function(object, value) ## assayDataElementReplace(object, "call", value)) oligoClasses/R/functions.R0000644000175000017500000000420114136047277015377 0ustar nileshnileshintegerMatrix <- function(x, scale=100) { if(!is(x, "matrix")) stop("argument x must be a matrix") dms <- dimnames(x) if(scale != 1){ xx <- as.integer(x*scale) } else xx <- as.integer(x) x <- matrix(xx, nrow(x), ncol(x)) dimnames(x) <- dms return(x) } numericMatrix <- function(x, scale=1/100) { return(x/scale) } integerArray <- function(x, scale=100){ if(!is(x, "array")) stop("argument x must be an array") dims <- dim(x) dms <- dimnames(x) if(scale != 1){ xx <- as.integer(x*scale) } else xx <- as.integer(x) x <- array(xx, dim=dims, dimnames=dms) return(x) } getSequenceLengths <- function(build){ path <- system.file("extdata", package="oligoClasses") load(file.path(path, paste("seqlengths_", build, ".rda", sep=""))) return(seqlengths) } setSequenceLengths <- function(build, names){ ## names are unique(seqnames(object)) sl <- getSequenceLengths(build) sl[match(unique(names), names(sl))] } chromosome2integer <- function(chrom){ chrom[chrom == "X"] <- 23; chrom[chrom == "Y"] <- 24; chrom[chrom == "XY"] <- 25; chrom[chrom=="M" | chrom == "MT" | chrom == "Mt"] <- 26 as.integer(chrom) } integer2chromosome <- function(intChrom){ charChrom <- as.character(intChrom) charChrom[charChrom=="23"] <- "X" charChrom[charChrom=="24"] <- "Y" charChrom[charChrom %in% c("MT", "Mt")] <- "M" charChrom } .getArm <- function(chrom, pos, genome){ if(is.integer(chrom)) chrom <- paste("chr", integer2chromosome(chrom), sep="") path.gap <- system.file("extdata", package="oligoClasses") gfile <- list.files(path.gap, pattern=paste("gap_", genome, ".rda", sep=""), full.names=TRUE) gaps <- readRDS(gfile) centromere.starts <- start(gaps) centromere.ends <- end(gaps) names(centromere.ends) <- names(centromere.starts) <- seqnames(gaps) centromere.starts <- centromere.starts[chrom] centromere.ends <- centromere.ends[chrom] chr.arm <- arm <- rep(NA, length(pos)) arm[pos <= centromere.starts] <- "p" arm[pos >= centromere.ends] <- "q" ##arm <- ifelse(pos <= centromere.starts, "p", "q") chr.arm[!is.na(arm)] <- paste(chrom[!is.na(arm)], arm[!is.na(arm)], sep="") chr.arm } oligoClasses/inst/0000755000175000017500000000000014136047277014023 5ustar nileshnilesholigoClasses/inst/extdata/0000755000175000017500000000000014136047277015455 5ustar nileshnilesholigoClasses/inst/extdata/gap_hg18.rda0000644000175000017500000000153614136047277017550 0ustar nileshnileshb```b` ̒ ,L@1FN QZZE,1( Ie@YAdtlb b @,B@, "@, b@,1ԲԜbN (KrF!m6Ab"͐Hl $% c1B#sL93d92#d!HHdMI,$<|K򋀬hsRK2xbSsRsSJ|SKSKヮ# ,A9^-HLNLOE vϠļtPF% h&adP]0.p)a FDNa9wNty"Y>$R ńogYg0}.e:xss0/sgyU` ,(ʡwrD5p nh ,HSy%EdD"H@ XrHqv<$,#3p>cBr.c@̎~d'n"%dv`]F  0\Ѫ =r?`Nu| . 8bR8O`q],l|yzlbYgj83}>}{z,O,J.I&D%F/&SsaTgrKc/Y{uBf2lHs[a7z oligoClasses/inst/extdata/genomeAnnotatedDataFrameExample.rds0000644000175000017500000021161614136047277024367 0ustar nileshnileshi8U_8p* J4Oͥ"PP ,)* A iL$"J}]~x?^uα5s]DI8y'HD9&@ /Flu=WK$@HD_"X.6ijm[Tt!Vt;Mۜyls^*y~]Tغz{uwr>M6BN.ېk?np_?/okɐ1{zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^'H$CHw p~G+]"9)1p b%Z2&A2zdT$]_&dlBD &128,12&1G :%=$Sc%3_QdfLS*-11]$1yR mY&Z2'F[2adɜK6I$js=$ Hο.Y}^bv,Yxo$/5Jː,n",EmdIedI<ɒsssK%#Ķ^O&1/~&Ydihr75r_끼z!(NX_'2]ԗ]>*Y9a~La%mI6Ql4Z+8M9-q*}%q"q"Pwr%L5Uj$q})q'q+]*qoX '<$^ˮJ:IxRߛw$IA6?' r%;NKvN<49(=)F{ %KǴKn'Hn[/9BrJ~ɔl+9,9%}%JNϔ*vJv/]%gNK\>$9+'9{#UI_UEA ~J.Z/GrFWr5Fl2_B%);%$7vK2C$M}$Yݒnw%ٚGoJ9|$J^(< GJJ#I/I4BRFfIKqPzURQR苤TIcIIEBQ℅ 5M$'y)y?;eɻ%F]3Xn!ɻ=w%vIS/%J*T ThJFTUTTTK"$L$QIuC6ɇȁ%|8$>H>|y/͒f\|5Fqe^m'rPi@^bI >+(:Du9Ibᄖ]?JIS)Q[ܙ/iz!i_Ւ6[Ib% _$m%UDǬ$%=R[P[|)h%eꧥ|YJي*).FxfT%|T%"CRq[iTOTMiTMyTyKkKiK5H5'z&JRm_KjߕtK:[SvJJiiI§J Eʤ#JG|*5Д [(*$iJ 2ReQ';^v蔎^_:z;蠾ұorR1q 'm%8+#Ƒa"TĽ;7jsTK:dё5OG}ws?~@k15{'ϱ\M8uqi8[+8ˆxNnPՏSx?_T)4C8E)㔖 ,93D9&rZ"©Tzp};9UxNUCSu8Տ'9˸-K8ڂNmNm5sS_©g]2~;~QK~G8'8RTjnDM\{Q'35Y-X;aɝ\;;w!%p'1֝׸˻rWX˸yq\7q ՚~\r?K1Kdr\}˘:KennrYWz sw]{1{]ǿr߸a[\].=},}|ս5s?}IUmVfah9װ؊k}_}[Ut4'k:{k5+r:'܏ 7D\_rky̵MZ>ZZDp\; 9Mצks\õ]7q a\h5ZeI:sV\皥\WY[^Suqs4Ku&;L#<< [u9P4{ @y@J<{/M&ZeJ@[`N9s$jl!0Y C}zae`8w Mav O`8].`TuwPxFgۈ>`u` ``80vDdc5;-0z S%`tJ| 0M L[;L\ ӑ=x"t.QfV/B06kۀit S40f{ǂ1O|A`JX!X07X0|%XgL+,`VUQq",K/K^K߀% `܆sp`e`i`Q,>3`9X7K3X.KJ`XQeXQ,(U< ,? qX߀չ`uX֓~kzR!`< XW6/ZOUʢ (ؽ8LA@ 97T jM@p^{-98 W= N`G`<{ŀނ+&+o^4ػ3,{3M`_R-m;&^rD ©DlNvp@pz }ph8P$7 @]փ6pR , R;p8>QO@t0pL+cOqEWp\582KpNi'8 tNۑ;)I 8e NOnՁ@])O@졇 L'=7&iB+UiZ q;{ 3{3_3GA|Z_6 MYsp6'HX \A1gx5H< s@`/HR65!BN5pv*. .N:.Nq)wņ"4g0HJ#jI$K{ gspe1H;$ɝU\A bH >A H R3Ԏ&ڙ Rb< )ˁ4 R@Z$ [51Kpz1VEkF"GpCX`n:2egAfN|YXd\AqY}7 @Vepoh2A vL{{Qi)ϳk xp4x8kȝrAM {q9fU V }@Sv1wkIO@CP; ޼8 |:޴O%o@??P9nPZo m(j ʧ?AyP@fv"@ũ?1,@͉)!&|8>O=GA(P{ޙ j;A rXp>68OÒ)~)(to:<`, b߾ 8hX! 7wi{F |ZUio@ݠɄMcAS|74皊z\p4}?h Z;m0tׁA).hq?YEga=Y{렽vhd:WQskLyh( 꾁_߾_M*WRеjhZ=t%ALнtK@|{&{J9~ămONm!Si\okAk3L z&=tAǹ,=֠ Jàdizu(5Ҙp(=?Y 7@(D_jȅ܄a _D% pO82ĭ]̃YK,r\(Wv#!?i+!qS 걐j}b9d-P_aO{O9So!*|F(}9WgAI,T *g9ΧCd/*g4r@*w,*J\ UnTB U@PUHBWj"7N֧BE Pd#TJ%P]y(TW[ szP}T:}.@ukP}1~?9P#j͆PsZ(Ԝ5͏%\DPvjWBoPy Ԏmg3֣˺R8PQp`S;ԑ9BPǮu`pp8e!u4pX08~.6s y7BIP[ sv8 K~O_a CP$h 4>C4Xk %4R*h|= 0?4+W &8|3uYGo_MIp̴KGp:c6 cᘻp86 &qdp\w9KVq-Ḋp{8fa1 'ˀC8Qa!X'h NS'+?WSb.)npp85` \D3]gYtS8ݹN.3W̉pZ8snHepfbh?҅9 и> w8@4YzX4A{Ghr!$BKI4uMEpQC=p.* 'Å>gh0F fVo:·p2\m׃猄KV(B 4ϛhU!pi&\o9} ZXeC )݅h ZǮA X-ˮeշr]+Q\t.Z7@+hMCqg͊'WLJ+D{D)pu?FATW-+BO9Odz٢BhꁶRh;R"*sTh7C;khA7ݝpw3\ dW] B{ h+_kutd9Т ҡ8t4sxq tLEZ) g }>Yӡ)zC?ov@0)8̇~E?_h5>h5~{~GK4nkBOy(Kx_9' \a6WpOn!pwH#ZA K9 :ۋà 0X+7`lwy`;#p*"`ʀ!raDUb$Zr-d ٔ C"_Ղ{ob}a耳0td( ]8VtР)0_ WƢ0! ~Nag1 ÒSaص!0n aOz#7A:xP#\ CA)Q-<:ÞJx0Ղ^C#!rxh(ڒt3c7DpuF_hO`k7Ɯc*"a9jx]<>6_|]? xO^qbsxQxHx<|8<p3/'ZIT]x;<{+ZOOOӏ8 #^ >3O ̪i0>[q:ܠoܘHxn<7uQ܁W R`UrLia)0X L/foLv[v.F[e#୊3Vx oWŝvI!]:It.o7?CJwMwLw »%n>[n݃r=zxo+x/hڒa0 ̎] )y2T޿޿y =8gA"|CE:8 (+y so9`N?8}|; aނZ}.y 0ؾk^;|{=5F; lۧJX*JQ,׃OKp$b|r aQ,,ƙsa>,; lEaIsX=|*§TM>u`|&=3Y߽ پYeQ|v|Tt >{9>+ϾTjH|~)g`QCXlEb,6s 0m|R _,oa0ÒUr ,%_CaJX:] K7ҭ~,Ml",۾ ̆e_`ٷݰ|!Xz`<tacX5V+nXi0|[ 642&VF8X+ٰ'l Uj[_Xaf7MպV[ϋVe3X~hY%v2q1~ܧ x u~º.]Nuۅn64b?O38?wzcXo;m>q7S4`}X/ _g%Wt ~ɲ_ '~ 1]_#6[kZ4~Ykq<ؘ6/O&r 6M aS_m4#6&i l #M`Kllp6;% _uF&)9, `+8Vfz;l} `񰵭 ?=OO]*U6\ƴ`H5fٯmW`So'Ztt0lg7aIخ۵BEհ]{l_}rؾV/avwM2o``Fء}v ;%ÎAbVv.v<цN;DfK5v ]ˊa=8vg(M؝`w; `"]G?s? mGeҀt5q٣_@#aHZk "4dK2PAh lĺMB+v#B!t7|AX0aS3C87ݓd"AD\Ar{~#26 t}rc˼N~F,s&^ V 4$(, P8?s>)ݨOz%T H~7M@oeB3R@ ?BIuh҄"?R|Q=R)YTWE+_ kqH+;pkiPm8-]xi~~~ߍHCq &A4lrDHv 4E#7Hsk駎ZVS1ik#H{ @:Ñi!H*E>_ġPm֨hr< 1BJ 'Og`4-X BР[РWѠOcEhz4'4< u ߁.BC?@C6tHv{ AtVaC2а>hةhitKCmEo!Hg^F E#ڢK"4$h(vE#ߡij_]D0d0|2߀ #_;Aw2샐24pqd2<ڃ -hT Q5%7:F+1 4~"ֈƋxh|[4AM`&,@ĢhⵡhGk4I?ڐQ5hYdT؃*f dih=2M AS_!/4bMsBrдh{f(Ԣ+ F4i4SͬF}d,֍qaGYNh֖eh4ko4`6Lk|~f?9ȝGsT9jќќhyon8o_&4BK_y--Zph!WBSԉP-KGKӑ.!K^d9`Zf-;0-@bNe׳в{rh3vJYGV?3Њ|dkׄl?lGv#JCr(rLZ9C  F+$aheOd?g45Gk9i!ŕa 9}5UjѪ k*7+* Uׇի_5&h'vDֳDhch]Zw6F4hrZS b6--vЖt_Q9ںm%9rQC.c#9D_ ry5tmR\"׃o냋ȵ 7*rFn+#1y <@ '< g+"4ua,N|VF^Fwo&׊|B_Rd=t|:u8NYN.b,Ό=άBgBgoDgE2Q6]Q6:+[ߋLA\s>s}9qmMQ:W^νF.S(%\QBU7J|%a6]\,.~.6ģ#ХCЕcJ(YDQt!J@BP}y@I]*D)k(Jq.G)^S(XނRjQZ|6iFgMAM&W nv(UeۣP[(UtӲ _2Pff"AAI-tetFYJOBY74PHeݽn6Yn na't(to^to_tώ{=N9֠{P(uϽAGyqJ~Wt@ST2@ =}=N=XpXԄz;žgЃOЃAl z3zH+C= -AGޣGУ{PX$qA+Qn&IZPCQRMBQ(:+sQ2%*=FB}^ @O˼rL=nlNz /D/>E/ыKS_2NơY/ѫ+;Cʁ"0FErcPQ_T*@٨:*JנҫOPmC=*CWP?> rFأw;ѻ5S;ofS./BW}=Ge?=|xj$Q̈́fr5Th6)8>B!Qm)Tjvj~bqZ8ՍO蓦{(_}Y>FUzV`35xD Yivj{}W쏾qC߃3C}!Q5jƙQ&5&F;}Ը25ġƤz9jP@PSRtc j,C͎P:j>l=A}~<x]~lC-rPQ j8ZOԦHڔP>PW9jقھoA@m7Q">ڝsPKuۣ9/ul?:\@wϢ_߭ЯW/Ꜽu::MQws1?:}E]:;o2hFմgJ5yՁ- |E D/0õ1сE>(f$F,E(K1$+m09/bVfb>erNX6a:,ra:,ws#1ɖVL'`)@g!G J}Bqp,?b5Vx=+M2cVrJ^)Xy\x"N;]`=H)c&X=6Oc뉽a/mbUO2#v{_?bwpdY|X>>I;쫲 tb!sgڏ}ż!}~+O~c@M,%G}6xTWTw.ncy$`"؈#o6o|p |>q>i6-U8G8tFiF|l||W|B;F^d`>q>u>`>Z}Zcc[86]tpgP">Z~U=8>-مi᳷C&|.>wh?>w>#>ۅϽk?Oℱq…8N:NT8z|a|*|_Y{_hWlW+ǜp2za1NޜO[ 'tL_WWw!,)()zEhSv]8հO iY`y=pip8}/{p38=%8%V药ED^|ZКo7f7GW͑M,|3lovd㛝7͞-8Sg{SfNY3qg8|[VķS9|c%DιN6|=}wy8ϵDԉ<&|89!p\+d.ĥ?9:?ys?)قV2C<\8f>O^g_1i )~u/ jE⢠\yŊ18]vůV׍Q4\2TlۅK|ҐKLE˾U9|WtU'Wf~53L,5?+?U'X^p7,י[㺥ݒOޥy*Ϛs-( ~%ո>\Qp}5? dr=ܠk6ơq3ܘ,RqcZܔ M=DU< 7%%u6n<@4'բݸi/mq[W>n;6_W\;Kn˶w]>G߉u܃uqL97W_&E dҘ%NhLz,U&=LQ?gQK9&dY2w2\ !2deh !z&C]ŋ(ydd29T&K&w/L&sG&3^&/D&modD)#e"vu2惌mhj2V c2AIQ&D ePwH(%7*7oɻ&~՟͔)O)ӻ2Q2-CJWe2՛d}UYߝ岾2#Oejeje 2u12}v CzMLL#B"!)i2þ2Ëd/FIl`+٨ٲhlf"r :+r &@.a~\wĀ!ra#_ȑ;A U⥡rWL%r咟KqJ.ŻH.I_'wKY.e 岇e~e/*Y.~\jU?rwXX=-\v\N\ΰ|E_rVl+rRM{(+r:P.w\!r_%)7{\ry)Vry ~5%W0g\r'\AD:i\Sqr~5am&\K֙ZɵJ":T'-rա~-1/Q>y26'#Ox{)ϸVlŧ8/4\%؟W8+c^+^񐘟&wrW:ëOU 3xE^ui^d ɫ}U6ꩻx4C^=gD«=15N5Fh.҃,kx͚q/k_浗\]yiyƼv>ⵟO][ |ß׏3__ :c:,y Eݼ.^'f.y*juAO|C'ooC-CC/⇾GGwGc6L[R>vt+Fxxcμ9#d?~.BS&O<6Ņˢ^ %CCy;y{e+]~~Yo'm,mwmDxѼ>Ji]yB!OSwgß.qSq-ǝx.ȯ:YɯįV|)Z¯ʯYͯ͟ȯ}ί8/סV~LU_7۔_g_w{XˍM{ח+O7E7Lo8}Xp7Q5o5D6hﴳw*o]wZy oˈ]VAx?x׃œ?۱Ǽ[2ޭ~Ȅw2OT˻ۯ-ywq|K yѼg-= ޓ=;{jygU3y=yU]{ޝ{~}{~׶S^{\{]R^1w3s96}y_ky8FIy߷sx*3~;Oo?I>漿^__ ߩԵw֦; %-wΟ]?"m|@Z݅C d>h>%~5;|T>A `1>X7|p_>D>ȇ\ɇ!W!a[=#\ЩЌ|hz~~[->×<ïէ@Q>r>rq,0b C[|C1*a|>j4ku|ԣ|Գ|ԫ|h>z3>zg>z]>zM+G?c\|LȬfK?W93?S ع|+>t%ITveWnt>z/&fg_c9)OOЭUl||Y|n|_ȟ?ǟN/'_5^QB)ڏaVOR__4u) L_//$:_{\>OOH|0A''_'߸'_u_]zOUçٶiSyA|c-qO?`_[__;OQ'_|ƁJ>"3G*yy8ATg;Fi=|fE8?*gEY܈-~>0}d;!Gu8g@+gdΑ$α;_; e]a]n(nK ]u Wf|KRg?mᳫ5w:gןy>"wǟgMs\ͅ|j>wN>wi> {Ͻ\^sY|ޒs|ުm|^@/ +O7HhI}Ir!$U?#j)3?m㟛>}~?c)2:jO *j+_/E A|xEX./+J|6//*G31WM^M[!_Bu|I(/iȗjKMso|iy|r||jƗ_soY|w坫A||'WWWT qoǿͿS_ĿV߅)"s|峇|ei<_%;W11ZUW=}W=竺zjCzjx?{!_3 k~kO . o}?ߎ??x ll㿸㿴o῞<}-QR"'5|hڟoK}!x,oR-Mk/E_=|S|yl7{+;Of|sH0_(( [Iw/O&{|-l/n>DTϷ+|ugb~H5klQ9w%V|3{3O? ?j?Kފ&&j?o [7Er(\#+DjH% wdJFŅpONNߡD rn\l:;L n_t0uyJ߄%v"aM]o'k?0aa&ˆ"{"!>DM~D#^W";A+TNHUH^C&}|F>DZ@|%N(nLϮ"7bb&V"(L#J}34!Q!J~KҎ:Q G ҏD9&Q~\Ir%Q~(w""%*JեDEc6O { {KxO#%zKDOD=;DCxnIF|Ɉ?H[@F>Mw!D藞"]׈b^/$0s(1N .&5(2JYJFDQjd.=tmDƊdlw IƩqkɸjdSdq.0d3X؏L2B&}# /&ɇߑ)*d2mXfLG]C$uȴdx%2`!YOfĒqd82[b|<1V"vhAĪ?19{CO!&O)1NLS"bI@L].b&BLVddJ2g5Ɣ̉Jf&q0%/ɪMd #k^uYdC#>"ϐukɺd^M~ YfG?h F9BhC6%6ĩlFdsTl68&aĥ(%.gWG\Du q9YZ'sqLܯw<qr:O< /yW6)xlYE<=%QF<>/F/lM~/KMU#F' Vxs{(EW%))+\$.1+IޔvdGA&!dcHv]6d?k=50 xGv_=I$ 3$ٳFJ\%{*=Cɞd7?'٫FO%{G/&{݌>oo{ JBt< MAB&}|DwZ$d. $RJ-RIxb(HG4$#HbMat@"kA"+$ZYDi:(#$*DYo'Q6PD #腙$zs Dat!OF%G_EN2m#ْX5$V1*'*2Q"LN+!'ӁYw !g*jəxr rCyWs~ȹ{IC$q 2#ٓ V.raIr!InG. 'HJIyӏZkl/E]rdWđQy_y<|> ȇS6/lGj?Q"/Ryf&Ie1Ȑ}!u y_gW51|ƿq@7QfJ^@]|L}L#H+`hLF);i8 I1AߵZY4Hv iO~G+c5O(Il.iy@ZVkj7ֈǤ@"iKZEIk{IƊnS)鷒LHi%kK^- mE iI58hF:JHâvL$:+z7JdG:oM!r{ 'V{O=Nt"%'wmGSɟ;_U_Fw$GN'=}H 9鱊Uk}l w9EߩdL*M%C%B(P%t GߥH"3 3(rDRtȂ&ڶQG}L^?*5ʚ*Ljܝr*w3kMy6(Ϣtme&e Qr ey>Ϥ\*|l}d_@Ǡ|IF˥(ʣTTk*_DA*HdT UHˢ ׷M*%T*i|JSҕVnEUuWΕMj7wRrv;ijfToFDƴ]9WAUP 1d*՘PI5L^SCᙢTqҔj:?2l,TVv*TOjkNZnT۴j^O逹1tgt`43lL:S @uޥ:q3[_SYBuXBAt^:Cdt`:D;!*CgC]ѡORc nY%Ea/aaop5;;:x ~ w GgPTPwg+:bw:".4ӑUБ ґT?!5iP9㩁;5Njp(](n3 tQ+&%ރQttT:ϟѯFEttI:~1[K,"*cNcl۫tG8h1&tj&ANc˷qJtB:&0ՀN8'rN 鄎t:>WNHg҉;u$tN=NO'u.FD+dNJO(SMԒ:ͮN;Cڞi3贞=tB /NxHgDP9j&$PjRӨvjzd65M'}Git}:o2gEB!taOΈ.N?N-C溜lMUtx(]ToG}of7SZ٪,=]b` ]eG]K.% /S*j~IB|qti-tj4E2͢rsjyPZ~^Je'e>t٣tYj\!]>G.OFW,j7Z=WS×u{z[B/P2}[>^h-9eC}QW{ >O3iUR?/h~/_#׼nCO'ۧۧϥۍ5v&ctt(}.ݾ^nwKwDPT?%2;gҝntLJw~j;QtW?0 0HhpȇӀ4i8ФJA+Ѡ{h4xtrh sIݗ?{Տ+}%}+2ckrGP4T? fn Ұ4li~ݤap+4\#@#&ixQ==I+hI4шhĤDFxAiD=oh*=p(ZA[e4M#q`z=d4 .=,e9?z8=|5~FHQ3Ш?4ѷi/42QNcvИ-4f<9Ƽ154Β|,B#N6he;=ZI~&ӣ'tW5͔ƚiZBcrUh"3GwӸh\B%=K$Nݤh|QMs4مg'iǢ4[8=뽕1Og]g?fs''hl24&ϡ<Ћ?h I4i zIA^B/=Oazcz2MiCG}ɻJi4-M>KD ե zuEzn=-H)cMI>MSRwД\-6G\!_B3&\43]fȧebZB3銢hk%AX(>8B{GҜZGs>VLkw=4B}ktiګ4;Ͳyd9xZ<4/ҼZ4E5ߨEOz5j"}RF_ n^EjhZkNFEΓie-ˏJh@ZL/S7Di>$1o7ndfZbӒ,ZIKUwR -[87Ҳoie%-?xYI+L'6ӊM w+.qLE?fiw$~E;m}<} LhHk-5hZs]$:KW_+Z+- Zq<)ӏ3CUcz}SLҺr-ZWQMܢu_/OuOyyY~vL?@?GޠO]c3Ki"WQ4;GOZ E~mF|iCb=^6(Ar-165}i?@ԷG4ûҖ/hKmi.4 iUD[KEh}6ɢhڶ_̠1=~:vLҎcJF_7_δ뺘RCȔK!Uf*_R7:#Sd}?`aL]K3 ;x4dZw2?img}X:@әldwX;WEh6D iIbC`CMƱ fC`|ӵ2]ۡlEllkg*ez}و@i 2-fp{03;T0f3lFIr٨!b̟FdgXqwO$:  $&NeFV(u23z7uT2MdS4S?66]>MߢfH&}̥ؿ}LΟb&%4Ŏ/yAl34Pdg0Kf-[~w[^ƘՎ:fJUtY0k#f5ٜl^.g.6u81.fO=+c0"3BHc2sV1ck9UvcK [}#[o4mآ6JFmDlGlx%mceN͘Spu"Ym1mY\mc.?6lΗll۱*檝\0=E^u (s7bn }#s[O aWx<>W0kGriS<1Ϥ;:b7&3 1yb^mW{:dޯ17&"Q,.|0d>ߍOWUd;&曯|K m~b؎َ͟}؎1]U?b<wmSK|2vMaRٮ,К抚YQopB_,p@* Y.fMo+_ZlwC Z5/YWeY {D,$Rdla{/縟[;w)kNf&}J,gr,Й;`oز0#oomY,B]E"Ua2cTβفѦwINH4foAW÷6vxiv&͢9~E]¢h,ZâCDX,|`1Myi̎*v~{I,e٩٩ Iv0S aqGٙFE}!#V,>YCMT/G\O3p:%~FHRY ,q^ pi !gߺ$,KddKLJKٗĮNv5f zKVSgR)KoYzz!î]g5zCvc,)n.`Yg~}؝0EvwZ?vw(]$'zس] v>\}Qv/.d.|b ֳ~v}!ߜwc3Sك)AU7{P3=h6c~(3c72mHm`|ac9,g<˱r\a9SYx\Ldg,Pr{W,cyX޼,Q ۡvgyiD.,/ݙ&IWuDcX~1Oc~]쉳 {ɞ|{ YmƱ·~@ Ya{5=uQdOig3ٳ3+Q;{9===o^ЕE?E.bQ<{)'/r`//~+ٱ"hm+VgѬXs.+|Ί/Y:Vcˊ^=c׳k+g`yFH|D g%ׯҾwY3tVFXYKVށge-|S>u*eD0:ƪ)j3:LUɬ~-nc6}1qa5ռjƈNK؇C@_VkuzVڲc?9q9.}lz:aEn6V?%=au.{t dݟ}:}r>1,+ٗ}5f_,c_#=7Nm9ƾط۷loطankX5{f8ks5c'uXcO֤˚.aMk leMADYS<`M#X#k6ȚdfK7ךi~^~|Zd.EnkaDEZwKX$obLd-3 k1u`-G#X1u֒Zn~a-ҌرY֊&岟B֮,ڇdPQ k߿^X{A~cHIt3Hfz%`%먵eXGuլuZ"f}Wu]f]ʬ۸V~b/g_"~9?"쏪(3؂I<XTExǂ4'{3Y JCt'b/"Wf km (.rvI fE@sU Y+PY.F 8[`V*BOVA^. Jy!K3CM q#wU] A UP  -BeP@PZPŹ5<,(;/(<$(ołRCP,TvT܄4EٶBߪZiƛZ9Q)t f6/_ _W1'JИA(h_&hĞ44 C f[A3MAв/hIDtMǽg+V ?DAg+aZ0xbaqa?L]|PB:gKݶDuJְY~G7 z#o z# #/FF^.3kAF 򕂁u``pd`r`PL04Ƃ$p p@a0Je0hM70a̷%ظ3{)g8l& ) ]% ] η W #ab\0R00m0C]dH"J-LZyEpN\zKXZT#7I0X$Ye F. g&&Lym%L)t S~ S So S/ ӌ Ӭ0öI9{0s%f:U 򾂱 E & uD0 DLZ3Nct`Z,>wff!AܳsI Kbb0ca0oa:?.<\?0N0i0ߟ h &$ٱ{by"|`Q'X,,/-,W˚2",S&,ې%,B8^_,lP`$l-?T[|JgPaaZ#=aU.^NX?,LXQUOب$l!l46N|.l\U(l\(l (l%8y66Y#l"l% }Zf[vRDqzh["+n\vnƂCCpzVp7 O܃~ 9"xZIy,4t-Okua׆sn5ea$aT!hVrG*Qo\sdasޠaUqOB_ G¶,B a0U?!:!>l>\KGw^&:/D Bc!_;$! # paYpp1闐$+ IBҵwB\!)p/\ ,\-T{{0pE"]ޛ4 Hd@F! b"Rh,("Q!4i*"BP":JQ罾wXkC։r|s}|xxxϞ{xpx?Ƿ^|=?uxS>⧽>[K/|?K_KKo/o~w;^_w} /^ӷ?9_sx-=67;.sg\W\p+~qzA\/98gu+ϻ ꯺ëϹ5W}5郇~x=_m׾}}:<˞qx/<>~x;9Z?.W8YW|57}oz:o>uxGoSt379oEpx˗>+-W-_~^ׇoo_vvΩ=Cgkwǝyx}?xҷs;2O>7 _uxf\};;qxO=wy=w{={>{>z_{ӇK]x͇}w޿.79~__ιw|?G/?po^a>7z>|负8|+_zS?맜s+\7:\3x藿4{.'{.>듇>|>|7>nq}o~Ç}>?| 7=w󇏿ᇏ>~x3'' O}G>}>ggι3g踞r_'=|sϸ?W?]ϿCm~;>snt#[ ߻0vko}q^\;Ӽ^zew9?oE/+pɭ{%:?W._./;\u9\rc||%ԯḞzo>۩zvO^};ON/o]i_oyv~u;ION߱_yΓ3ۙvk|+v}vc^]`;Oۗ+<7/{C~Jʏ?ەyqzk\ܮS[\O׶+*ZU**/zvvO=lWn_q+oW}ŗlW}k:Eծj||ڇhk^]]n]m=]o]خgmW닶z~~Ɠׅ5۷oxskökoݮd횯v|v5|5\tv+v/Zܶk۵>{vg?m~lvg:uخ{7n}Sl}ӵ~O~u?{t|_Wxw^nwoŗn_-?cWno7Wn7[oOnp[lpoouK=uK{ږx---[9s[olW~{kz[C_޾O|{\pۿmsOfm::Vn#o7nrkm79YM#n7own7_nvpynnOnvn`ٷvv=rkuwn-wn'Wn񳷛[[\/[|ն[|M-q햇nc#ߵciƧx4m[nnz[qۭ^{7|v~vop^n+mm9mθvg{o`.nn;׶]6qv+hUW+vw>orS_nkm/lnnOu;޲oxxow:۝rNw{vnjNvv.?vxw7۝o;ٍs=};#oԋ|7nwӳvKn_nv~e]mO>ݿyv}v /W.+odO?t=󽿷mz{䓷{{{Ż{lWnoW{!}Wl?O|v߳?oC߸}Stfew:lN_W|߹qm۷Om}ۧ=۾}>=/On=};#m{l=yy?_z?=Gnxomo߾ O}Om<o}vE}o{ _=敷{mU'mn}^fq睾=߼=?yb][l~q#7䯷 g>b{Ys{߲i{=W׹_wb\cї~}~E\_nnti/}lT/Wޞwwo{nm{_K_oo~gם^^%o/|oo߿O}׻??s~y{﻽^u^~o{GlmW৶ w>z{^O~le~lpm?|୶7=7]|m𸞶nΧ=+O7~nt3Ost^Cgͯr_Ǘg5zyzճ9_g\#\z.kzN½ӯ}qW?g׿yx)Ϟ|}䆗^uڿx;^ gq=?Q=gr_t>ϟYݷ˳ps~C}t;S^iϺz>wU.<߽/ٗ=~_o>ks.snu?!?7m=묻^M}>o?M׼^^nr'%s:O<[.s~M^rxgJO9:9'ur\x?:N:N:N:N:N:N:N:N߯'rϿ8N:Nqr\'ur\'ur\'ur\'ur\'ur\'ur\'ur\'ur\'ur\'ur\]?3\'ur\'oO9_s\'ur\'ur\'ur\'ur\'ur\'ur\'ur\'ur\'urv=?ur\'ur\'%i'IqvIWS8? G}/81/G/8~:?q9w}7(c.us9Wmޚ^*93y鿾s VT֥?|} Fn9ڥ?H3-Hִs\Ի}}nxvv3ޒRY[w_i؇og{mo:ۣ?ef-w߇}$=:F)/YG[nk.{|oWy}4|-[ξ{z 2?HuVՇ}'iʹ'4,m#dLo./8'}xjj3Hw|1(9?^!K/ U ӣUOԺ~"Dٛx-C{y.bBoB9G޲'Q Gpv˓ {K0R8_uQ$@٢N%yz!3EXifP?yH$޳Om"4ƣwvnFa;ҏ2{0w W{׳+(gH3ā}N>hReq(5[qMk~3/WO9{d>m~ S CIZⷡ`vҚ>^K h&ɑź[ehu(n&vfg+"قՈԼbަ*חw#J^En)߷(}kekIMfqvx;{ѐGj`3@̀8 #Cg sv>"#vkue]7WԠQvAXLwh"*O _` b;{qVOzslLG@ٛxQ*IȽ&4*^{_}e/ڵghbH36<ıȵ0Bǥ})(o?3blёNQ($vG0bZH_7슧r|/@AE*0n湍 ށ!U=[Gb( !0aކNtLOFmi҇c]^P4Ec@w0jߓÛG,:N{gN ~Lb+ ^ {~ݑjǜ=_3ަQ$oQyս(tG'}u=xu4z)8C@{3GDZH 9eAP-QHyxs.>qC#ޅ0<5dz!3+їfRNsۼkzHI^=6feo\a'lKO[4@-x8;>fpyIPJrdc@s92g5_8󥵜,)#!)8B$FYAA5+c6 [:}%8O;v?4zDє~f ͕Du<*FQC{*4^;A?:`9zdA0DܦOt}? :J6&o\qDAJǕ W(p"ф.\+~ cBW3b@WrcwL'WiP9*>b)6eD"|g(;հ{%U`)FXWO~w`|K`vU5cɩ#&͹,ݷvnhOB 7S(0@K:jS2"I >ZP?Knu qY*~c Adk K=_C_n `s( 9kk@:樹c u B́~HkRҀ;SGB:N]/ A3j6oem-پéA~ R]B%PvPHhoaZ7 twQh7CVgVCu+GHG\!`k4%v=GZ';b<,%+9i1)S-t$|yA5D&p-<{O  A'zN^݋Ix U/B ֑JF>T$5T䰢Qc)yF7 T-\-y ? 3o._MGZip1EEO$ D78-az=:~g9|w )ǡ4>"*{6PO@$9؅PVٞX"Gǡ%wgbCP ,N j$74sj#§#vvb1YJXhܼ KD*b t. { @.4$ JlG|Lz%wV#"0l% DI!l(]R T,`P/_uQ+{zg@c0q?":pvh#R8;͜}r't 0gL-wm,h(V70M,f$CD)_.Dk `Z!I/hf޾75ĕ01)u܆p@Qo> at }|g7pdcz[QyyաÅ*t$Ҁѱsmh.GD j9zj^3]8[\viLJg(5Xt% -WcOD /]c{'`TIQ^GOC]t(sN},MGd {X7%C?"5DX D@RhyF(=u./ؽqZ-/K tt(!T#~/KQObm4aIwVkGU b~%bu`7.XK|⒩86 F=54u&AX4y?;}L5%V DSN8Ḁgd@ A|,6HkX'j_ yHE#lP |dg< sڸI(UC!&(Sñq bIJm R ubZa +C/y wU لM37Zj{׭LDQ68~ɳJB6ǐVvM#,($/̛A"e^@71A!8aԞ._@v#`SxM+yd!`P$ "R}΄Μ a7xUK,CW|؝.7(X{ a#M8{ztTN fy;%|HK}&Z4eMj2y;N=([,>?kb (4kC)ABճ`;mH#,{kő^w4U F^N$?SB/=Xn#~H5(RLO Q{4`) 0W^9i!*Ä @$ghG'CQTRs2jia--(p;:暎N%rPI| >H" 2@9HM#Ag+ IKH!Kd3A q-7=OizP_Y*6H XXJˣJLQ&aMqNvJ&Yzz0\e%6cte # Cd{ԽF u.df,Z_ o(ѽ䴪ӓZe,}LZIb7\sGш?;hr= Vqu2txiK++U0 #Ȝ.')b(*Cg?I I}1tPV]읨xc 7]AH i]N ^Xsd(sUGaZ\{,Y@lx~O^BZ>e]Зw!HTwlXT,/7 8fQ-[$beY̠#n P* ky _"j _Jf63x4 ([D0\fHӘʈ940œSݻYi"PGY@(S@GbX6\W@R?(\s@*@f@wVnjn{.d[aw5xtQ9gDu4-- N:4~jn7{ZhzNӦJ$r0<|1*S+fI]\`5V# @L~A/HvUBEl,js'/وCw' hʌڼ[RC6Y}Q`D&â eCk!l{Ws`%3cF8UkI)Td4o(.0R`Zn*Vqu\g7=a&"XkN Q2bDJo FDx`-]H( FE%tߛ kG+5P#ɝh۾ Tfǚ f+S0|A=ObIm-MPnI; 9aQ]t?*x- *rÚX @nu<|w?`` !u̼l>v<~NVJl_ fdhСcE`D >8OJ=C$~F>Gd݀tѶ$0dO,5Դ=q Q' zԀHD[;hGGPN:LGX uQG2Wg)JmFN~8ED$M^F=,| 79FPN. "؁YZt^kBï:{s?${jP?39F"AƔd2KG_Kk}@4b0Dz3m`iћըU?&5I,(7~A Ԡ#g5BpBᰃx0Xi w$^P`DU@+&Oc4WFcJ([:>fA3P  ;H jKID{+V1}4:bohc)bPHݭ*|W5_|_p;AqQ j I ԴCRX`޼oJ e`TgU0XG4A-*X˖ #TP ^w>ˇ *I(u'Q'8 >㷡-@uv."`VByU_^ $&5X!#Y2%*5wD|LQ<-tox+#$? &xG= " puaj*TgMy _d]@@$xV ?HFyV)ƟyLnp,Cm2I:`a+O?%p9I9A7fJ,Ce˵ H ' b`EHdoC+[LcDZ`El":xyfg^Ef峳Adu,,U%/[@u.$烀l^Pd  \̚bn9^-@=‰ܓN/?7s\ Aq)*$Rt0d.atTIN(P"-xzǡ3gr5և$Mꎙ蠬nճtI!;s!dF5ӖoB<xG{GByyp:Fs:%PJe xa ]b ``8h(WQ^ݯgt:2X:V "-M[Z|x UE&K`+6Q#`ŗRA#?ּ)In>Nmm[5M'IWC-\G"3KrU_Oh}rc 0VvP$l d a! x*'HSv@y+ O#*Ž-;ZaM8w}vh7PTHf<"AnIc8Q o1qpRm :%N <Ӕ'Wb*nd} RD…PNI;v#2T?Jͻ@,.?7'w" D,gqmTP7z;'ljґjvW #TaOG |pšQzJ`aڬC c;{\%3SAMy'|d@)5xC ]T `~:Ϡ5&^tBy>cu HUdvRۨiXb2obtPzA);] $0F;瑔f#x$ \@P)rY|8v\RstIGp!7@ QH6W,P9)^8UzOvEJO'Ɠpg_I:uv4E)p ~LĎbalo V ]S-soհ`3܋׆:d$z$@t.3#ZsC 0, (tLTPbY*)atȴ:Q`)\J(0m9}y7 6p {"Gdu’W&z$Y;TS(@FQ "1 A5@3ܬ'b$z:P> Ѫ~q@S>X42jGdkstJJ0]$ Xx%99|cŸo u\W3wǾ9d[Ó+Rd($DZAP:>~Apn}\Ҳee=-2 @w G-/xe3]\ Н]]N)NlU|.&7m8\cu~r&`| #?7%5ΰScN(}TR Pܪt?E=7;3W/L<3Ba /)ц|@ZPŒQ@/M=4ڐ"OB #I-c˻FZw,pd5 Ġl2@JqV.F̠b؝.oqo-IȠceH ҃A dɱ?x.bCCcT=52M%B:I9  lr2Qlh@+պa?`]MiI0+oa;HWA*`IX,aK{.W OppFd@+%3u@k{崷i.wI)Z=VyLBmݘ87kVЍ ; X|ŇQ{+IFR{P̞a+m |MPШԊs Uy*. uZ7cֿ-AJ#;Ԇ#TpQZXA}F {U?6<_J gm7ZquA5 Z\ۚ0 B;ԋ!&{ٱ2"Urh As,mAjl.;?O &8d( r"<`\L>ћ !0@G{wc!+R*Jr!_IYk%Fh'')@cb%[}n(HIBfAe9Pr R`OVcyC @n(AT<6=IF[ï<",P߁a4vv`Ed0(w~Hp)X_J\c #sB<BKe]&E|oq]Mx>;Y\X$0oq)>;XCfgbA7H<_HBaȜ*@{i@N\o 1 McMXeCO~W(6OF< "q,qã+^k6N,&-Ў{9`8;&7кǩm֡O91&tc⌫ЉJ`C"S"ʉ6I3TMHR8X)5=)0 *0Ho^({^~୳S' ܁PWD]hݭh6ccT#T个rݪ Yu<+2Hp-DЯ|!ݪ 6iD!R6,L/էH uO~njA&h$J4o>bmdJӁ=DRL'8“_@$Ir НS>9;qyxM(ht8 y8A%ٝS`KΐHmxQ yh1= qhXdX0WL@ @M[`<;}^fmqF J`5.J骲5H_w_L~Q$#:ҳG)[z4pኦQͿ&`D;\}Cp>||,D/N˜ӺH.n.&>,D=UQ 1O~) ZIqBj$d.SHQHyANV"r4 fϋGD]Gt/وn3t#@ $pFL|)Y0 ;F"m++r$&x ]G==pVoC^T%t0+Q;9m)R8bjД}ZCer)5)|wH}js\&0(r}@a:'d;Wk򱣼X0-N] b( dt32 +rk R H UBxt+Gnݧir0T,|ê2/Ë\,HCuGQN #! xwLܕh[z]9?{e6^M{*VyҤX4-v"8`df%{U~?3)yD``lqrmsF PgȢ.Wtu"5؅5 l7"W= <@d|x!()2`<]@2ANakg q01ycԆ:ꔱhxZ^dh\qПX @JTKHjzPi`S@#&NC 9/;Vʎ( t LicA7 ',TvxL4ow. >hV^0J{FzH%K|DZзQaC} \+Cee0a2@ H;(- >m:M]I@Sdx:F&S@jmm/IF$8@YHRS먪oHKJP]X;4gг z$h4" ï'ű|03 'HIT$H߀#+$@G1wdU:T'DnZ8U]^,# 3K0;KiCaϬ4p m@ n,(EDkih;IN9`$rL̏0Rv_rD@*;]hKz_ܬQ W' ֐D:!< B KyT/!K]#ш28P96'4IJhf4F(UgEHYs=j)x@'q{>Z$ G9%iwTeJwQXrʞrl8)!5` Z,L躷P}[/na>0&P2x@r9lZ8au>*<\ͰphTk:X.md˗ͬ{wwO| \(:rItdx pnS"yHR?'2v\JƎ"5hWP-F p{t ;(5F}Eb.H++Y.$}N}=Z:ql]ZJ(U$`Ew8$+ VQuD SkktVHhsPM _%}ÌP I^}*"@ ~?[4cw)'v)YP"z)* ۀ5\ƴz ^%W?:^B:QsLq?Y~],yrNi/.0)Ȑwl@S;1zOu[f5`mdV=\L6;xUrmt@0ϋL[AU@uz˫3Vr+y[$2e5Y359Iw1 "-ҝ j'Fvec$ą?rr 9 W ) %}o4S麓)i6FӰ;R"umgxXwldsh Xa&\0SR LN$lB;Ȼz| .0>p= C E5/6AIϓzJ~vMD*G5i Qqy }xcı8<.iC v;A Zm U;Z ]$4t3, Ve*X˰>wD`jcYXdf}SjC0qhjI80,PAyfQXR#4v 4TwxK/E{'txZHꗄ=}]0/"%8k\AdJ:W4F, e\΃ޯcJ5{VPm#;VSN~vHOX.ı%q֞6BšFf#Ë,4A 9ɛ,%,0J!Z H^y@kne[F7k]Dɉ3oL@1V6DJԩ!ȭo( gǟ(M0L&PJ+d ;@|3cG #VtZY[(=;|dcATY ;670*O7zj =`7\q@nKKҩ`ۇ}J1dH4 #y&.>H꺃Lh:Uy:` ,\9B2` T20D f5Qjh3a8ɡ *d܆DZG0 #d=gX2ۋ0\əb G(ON4 h3ᄕl >@ !j p]{{JLOQ1kq4mk9:V8SDj̆:f=% ZIk|I@@)=}ϴ{\n,pA6BUfWn9H3d$}IaSr@~z/`IKc^j$g4^ܳFVG9z"1m,_Z K<F݅_"Yʠ6@A^p' h' tcb$ԐU@:WU)DZ/rӂ+ J\&-.@ACu:AkEB/š UUHX8raѽ*mn#>/X >(*F҃MYT EazS~TRw/1mL2W;%28uy.?X' œ[% aƒn.@%-2z= iΕ& 1Scz3>Gh5Ȭ:Xf]Avhw~cuj2 9u|N. ˜Ciϼ*eSʰgg=ðYHw?K tt@{O9a٨l~hh Z4turUr HPY@寶;qvy @ (fq-SHd ]BLMwcceAA^Q'+”:$-2ACs %ӱ`̓@G>+*  Hd}#@!WߌeLťu'`EJby8$'RSĶڝĖSD hr%p}@5& ڒG*x8_Xp`h#-O+X~nv?Пoav$C \ 0li(g SKj)v|~e  I1A`Tb4Ps= xzOUVC~qw5GӷT+o\*Oҳ*E*@ cAZҘ∄>3@8 ( %[@lZѣ~lXk67¶Kcy]twb/a|@[ R5WG)\EO<98wPO\0W ^gJ &Ĵ@EHkƝ # X U|մ,zG֎Dv*;%.I*oֈ0eOsV'MA0=*fp>#&lɅjeN5Xk0ō浏@.8t`bPnH+;|NA=5*cRÆ^"L*%Tw9-;FXOvW׬Ƿao zvl]mX-Q ݖ*Ь:Y5WͱՀ#Ox$3.e` pJ-El@.{GݡS e`\N}w[_+r9Ix" 8" >&hF("3t&1"S%hZ!ݕA]Y'RfdiVr E`GMU ;nB ( \N 0W04<?R%c/pKx@^vsĤGdږC%Hl: rB rt`&vgGChI&6 wbcQ$uJM^]]Ҡ*N$Δ8  -gB O7Nƨ"}ﹻ**)@2 s4& YcwZ^-|la!1L1[H@ٛxg 3M )\; j@cT܂"4 e"h ~(m " ;P&pl5|o& fvb4/C{jǹ vлiË+ECFY@wuicV PlqHADE97;TR0P냴1('ZPwaCVB <H31FK'<:/Ac+FJBJA/Ukdr.9upW-"lWLt$u$*C!U>wj6rq@~$']`3*5 nj@B;ž.ݗ^߮F0Ғ6Ь:tHxi- CR\A:W21%[ GGޣu{D Pʡ:f ,C{u#)1B jhWjS\"hp)G9RBdl &N8nX͗bQzd'!O )r,DVv 2݈A#fG!6STZW(%u\Z,|<Om vMqzk d[6ܦY;NrD9;h@L X\;RP %#wIi"!0J6"$\c~HYFS+Zo5`ByA_Q<?!.* H~DtzVy^R"-2tb | ,C>#A6AYK qP&(Ċ<]"Wb]B@r q38ij HMBwq(#"%+p@½ ;Spl`F7NAr .3R+y7O6!X`iSjR$W|p"$C Gwh2byk{L Cu Aɶ䞫/oW]!l ` 76_u2g;ȜF ##1Jnb{ԆBb؎9<.EȜ A kfzqARr97#@om6pN< h<e OP2X2UݻD=wM|!Z&~ }=M$pd]*pcwx|xt`7DB< EC-YuNE!TiwZZ\Z4ɤD#0~"K3H?2Ut0UORb/΅Wq( ? \Ox.9VУ߁Zܗ xFɩFqADz@_aͱIO&. 4"n,4PI\%w 2>QBq@`l+XD{ҽ5g zЯ۽y \b~ơ" dCY @R݁Hvo)"A@*˂=U' J0{ `RrpWnr*/-ϓ+Đq ӫ ߁oqOؖScWCY2uF< * %9KODE12۳3uJ}-3qB $nѨZ@p]*e-p@[@=ܺTG$ru IsG p^͌^0#(@x)d( 6JB'@ |5p)}6{"Ѽ^20|м. q3Jw}Z*G K+) cO*jiKcɠԆW 8!cb3<p^FOym#uX;1$G6b2%@@L"0&I1@%5;$ejN>RYD< 91,h͛jc*IA!IcF ٖۨY&`!cc"v߂r&6H1B?P9Kp 1s`pS(W)h} 1r=ZxLG 4oc 钤qtܽw?U3Fn%~`" ݃&)?q,J!X!&R$-/ONp'n}3@:΃ UH#a3hEn8+ +_$ԫ\{s~G` ',4?cCnҠB:`Y5&uzP@&+z )@G4M꥝I)ڂAj}$}&;5H})vdP܍F#7y;'nPpV0;d+ ٣ iyA7*KQCrRI}4gd\xB d@R $FȢJU~2{쉦AMq<=S%^B^:i>|"Y(lccgJ;uG <*)S%[  G&z,2QMqU!9!XlWo?[AL S5x.S$H0t#,ZWD3{}Z3݃ӳ3(H00X#jLY2 ޡ6'sF@d'G:zxYt&Nã H;Cj'Tӷcu|0)1gO+bdgd #陪q~rE7Ţʴчo@[Ύ%Lg`͓;:]MI%&h`JEbC^PqFU*u$Z^$TFj.Чhˇǩ'XG4 J A( {}CZIS{; 0E:J%*Rrʳ:/(8ߩ r;6;761dU3`CLGy<]Hcdk?E1ᙀPz\G`IҒ@L K v~Reۯ|#Qv*wG-=܄CWpM;$]3= 23CD*Sr8~|xD"ؼ;X [jv xU;f*F@ *ޡ#H5:UzfE܁x!1q>R#@}8Cf뎣ýԑiY^ Ar.<@(A娤ce s4ph9q/gJCF5CNIGIRRzn4?г-0>e`V.?7[6=KP w8ȱ]PeG5!N 2 8˽r3@DDFtcM5c@`Oxn@Mg*<#V)0];6`*DÚ RR r|-~ I:0wP]PW]u>YŁЯ2@`6>OD6PSFZ{O4lK$&]M{O$ / "qC{pKIu |1$q u,|H4Ar\@SpE.Cђ*sJ7઩ 9CTCW/"\fcgFkCH hG8wN/Gdh}dP wˌD he&(78.4,ڜ&j͑r w}W}=}U7.^TaAd2AU3E&(B#RD0W) :`j*U M\h{$<;n3>AGP*SF6%*;IYPn!Ϩ2R!G@8@Y=]%U#-҉HQPUy"Pt2 (..b"1 z&w(EdvPI ?0pзi&`NXƱ2N)/lg>釀H0*hO>TGd0|Ac.A}Yl Y};NUZ4 |]@{-Yt=@Q\߄! Ѕ~A># 2GN" {m$[I I'~YL cBZCc<}͡Gh04EM<v'0vZI9;It̔Bw pO.f$s317[2SB2)ݽ; ];,S`CpR<#? [t w g?UQLpuͨ$|\RО5u@OR]joFo9Ch2(#NAkb Re&R˛|ewv&ʪؗ }:`I :飻xеCC8/t7]bnruvёI_{ s¤~N7HڭH! d[`H:$0C>##FuB!xjԁf8 V)8O5?[7Zx|rL@)["m:pР! E܁>&@(w9_P:(p$fߨ UX{s٤5a6AsG\,5E5_`u/As ү0 2(V!&mԣvDQ Nq-M8 aaP5}wH< $88: A|o[Q? UtXqQejrfM]aw:@T9 ֈ1fp`o 5v`SWȽ+̵+ed013˜Q9ʉAp 47# q(3E[dI [Hp4I㋶u=XH$)K[D oCw+?l-!pϚHH.nv IGK!HtJ.IRORm(+@*\N<*6 N4*}<_zMib.޾{sRYd~dCaz,?B; B̠֡s7*CvTk{/η%I=`Mg jzp e2(-a3(W ;~?UT`Dh.QCMb.d8*G#2)xJ Q^NI2>tq2 2Q|O!܅#!yXHA"rEh75WD|H *2c-!>)#5V?e/V %Ev򾐞~!,P'lA[DףyM$ಕbiPO1Vфfؖ;7RTD6O> fЅNSo1 LΛ >|5+ R׆tEpTM5]1$Qݬ.v8 HSbx.rlOz"O.DA 32IC嫖;(G P\13X6n$gi(Q9I0 氃qp:2=|X_Tt_a6:SfD<(5Ua/n @sX?E7L1 kl8Zu.lB ГgS[}AxYAvcOp4M}y a00n8){ʶ&%O\;'é[֝n#i9RȋM'VXy $SuI҈s-]H}/屢pPؿIhI JzV(vF+Ԡ@vPg&:<|GLn5󧾍'' `0G#!;f_`Jtw<;@;WI;&E>Llr9_6\k;.+?%Ud*D%?\=M1<ً3M1)8 FPcf;#G\G]a,28w-C&J6`Xզxƪ^Vy潃I) {rO>"~A 5ζQC:O+DiU,x˴ŝtLx3G(WZ ޻0D ZsIA^XPX 7h4)n.Y;dt$ruqr` ,+R2 6 PSM+Hޯt,J@ tJ*ւE!+7':Q؎O#Q+$v+-یbR TZP"5pMBނv~|"'#$.(- (6wpS?,048%jx?yl׷ !^ڢL`Qm ࢻ@)::Ԇq +!I(pѝB$|xH_K5ɍHu* `6pȒhGMv>p!Ԋ1`{zJH{G!6W;՛J T24UE'`X6 }>3`ʕ̉fC*7)M`)b$ ПwDܬSZ!u0*"tJHhoLu,/`w~4吺zIuhMdu^y+"r%P@\B~tG'h` R4Ԟ+R6 'xCDY* - @[r|BVyq D dGJ.=+/#N"gKwq 8>w. 8(47l * X䃓gHTTr ԭH"!i?4:*O'- 2GxqD9GT3rM\!7).7w';mxr9߲BNKY:ZcG@N |a@@G]#kK_r·@ᑵqUuA8tªϔl}5F@%@MμrWDQ;=( ^sZuhs@Я БȊ I OJLi8=$n 8`0y0T؉ qYA ،FU 5gG`-HVlc&@#D,+ j4J[FZr AFA#4lE03MP_pkw!ܸ }qլPv @ ax-#I|qկ%Rގ6?N K<  dm&.*w}e oɪOj2OSա F`GX'9%z$vGydfLyJtPJv@XA H su>:j7E !sX? \(5j0hٯ\@|o9=9DB?iLx?XH׭@*IN^`PIɖ<4E J~ DV+DF!晪@]M (pJ`&dliװ r^.޵Ey%U8`yOpnVLy g5]G1(#C J:?fPPA=8ӤyPw@ 5 Xhmc sD<IW<A 򶩂ilL}>.??H)'BjT"6-*7h c.'g:W]n5gʫf l=wbH4Zs,A<ݒ9u JY>m w% :^vtZz Ϡgq⑅L$da{*f P _@h zhPԏEA,#u(?P9 5@`97(ՠQ  \fThPK#G)P  3 )kiً;b5X!k$ (c8dzbiT񐇐%H{L˱j㤤TwMO$cvE:ϭp m` !"Vƌ/0!I* -/+#$NtMm#ЖSr;*&@7f {`EArzp2AxH?_/>Nw/.Ї<1}CΉ߻/޻=Rԗ|y{?{#SN=ˏ?5ӿ:/3K}3ou ovڥ鑏<1zC6 n?_yx~K?svrwOR"oligoClasses/inst/extdata/gap_hg19.rda0000644000175000017500000000145614136047277017552 0ustar nileshnileshb```b` ̒ ,L@1FN QZZE,1( Ie@YAdtlb b @,B@, "@, b@,1ԲԜbN (KrF! b sPd9d)2 c̱@X"#d!I1m6Cb#-Έ@bG%krNb1,$ᛖ\_dCSΞ^Q @XXϟWZXfFPt gL>fIEjAbrvbz*Zذ{%楃>(p0(1/eC3 #$sĘC ebԆ1ta -K hd0"r P?hs[FȳEY򁵸$JO1,®$|fdNs`֫d r+%Ɗf '')2sd8oWHp27 c.iLg[0K%)%${ M1~KpCnHeF+IMO-"#1DBmRC{L%a)!4ds v%fv$#8Av-!/%̼|D0L^ȯ^Vevi+;ݨ0466F֤-,>bYf3m/Lәnq*ǝr"D 15gs:ΰ2}9m0w~GY̢ҜDP jH4 Zbb2=5/?Au& 4(g@^wP d&cˆK9wvF oligoClasses/inst/extdata/seqlengths_hg18.rda0000644000175000017500000000073114136047277021152 0ustar nileshnilesh r0b```b`@& `d`a\ũ9y%@i^!ߞ|oh0sH:Kgy_\1i)'r0OY.zp>OV9r⺕oV`[Gj'{{=5U^b.9Դ^{(x gαY9pnrjq} {&fԝxiۏ=P?ڋ:LB2#?Y@oٲV;vlN5Ġ+5p)`0Da;4p0\(H ]IA AaҍPG!%8I6Nqld$'&H6A Mld$ &H6IIMld$$$&I6IɈr_lj\ oligoClasses/inst/NEWS.Rd0000644000175000017500000000355214136047277015073 0ustar nileshnilesh\name{NEWS} \title{News for Package 'oligoClasses'} \section{Changes in version 1.18}{ \subsection{New class: GenomeAnnotatedDataFrame}{ \itemize{ \item GenomeAnnotatedDataFrame extends AnnotatedDataFrame but requires columns 'isSnp', 'chromosome', and 'position'. \item Accessors for the SNP indicator, chromosome, and position are defined for the GenomeAnnotatedDataFrame class \item The assayData elements must all be integers. Copy number or relative copy number should be multipled by 100 and stored as an integer. Use integerMatrix(x, 100), where x is a matrix of copy number on the original scale. B allele frequencies should be multipled by 1000 and saved as an integer. Use integerMatrix(b, 1000), where 'b' is a matrix of B allele frequencies. \item The featureData in these classes should have the class "GenomeAnnotatedDataFrame". } } } \section{Changes in version 1.14}{ \subsection{NEW FEATURES}{ \itemize{ \item ocSamples() and ocProbesets() propagate the value they are set to to a cluster (if the cluster is set); } } } \section{Changes in version 1.9}{ \subsection{USER VISIBLE CHANGES}{ \itemize{ \item Major refactoring of classes used by SNP/CNP algorithms. \enumerate{ \item New class: CNSet, AlleleSet, SnpSuperSet \item Removed classes: Snp*QSet, Snp*CallSet, Snp*CallSetPlus \item Genotyping algorithms will use SnpSet instead of SnpCallSet } \item Replaced thetaA, thetaB, senseThetaA, antisenseThetaA, senseThetaB and antisenseThetaB methods by allele. \item Exported DBPDInfo, ExpressionPDInfo, FeatureSet, TilingPDInfo \item Added ff utilities used by both oligo and crlmm packages } } \subsection{NEW FEATURES}{ \itemize{ \item bothStrands() methods for AlleleSet and SnpFeatureSet. } } } oligoClasses/inst/unitTests/0000755000175000017500000000000014136047277016025 5ustar nileshnilesholigoClasses/inst/unitTests/test_classes.R0000644000175000017500000001253214136047277020647 0ustar nileshnileshtest_dataExamples <- function(){ library(Biobase) data(oligoSetExample) checkTrue(validObject(oligoSet)) obj <- new("oligoSnpSet", copyNumber=copyNumber(oligoSet), call=calls(oligoSet), featureData=featureData(oligoSet), phenoData=phenoData(oligoSet)) obj <- new("oligoSnpSet", copyNumber=copyNumber(oligoSet), call=calls(oligoSet), featureData=featureData(oligoSet), phenoData=phenoData(oligoSet), genome="hg18") checkIdentical(genomeBuild(obj), "hg18") } test_GenomeAnnotatedDataFrame_construction <- function(){ checkTrue(validObject(new("GenomeAnnotatedDataFrame"))) checkTrue(validObject(GenomeAnnotatedDataFrameFrom(NULL))) data(locusLevelData) if(require(pd.mapping50k.hind240)){ ## might be an exception in the future GenomeAnnotatedDataFrameFrom(locusLevelData[["genotypes"]], annotationPkg=locusLevelData[["platform"]]) tmp <- GenomeAnnotatedDataFrameFrom(locusLevelData[["genotypes"]], annotationPkg=locusLevelData[["platform"]], genome="hg19") checkException(GenomeAnnotatedDataFrameFrom(locusLevelData[["genotypes"]], annotationPkg=locusLevelData[["platform"]], genome="hg18"), silent=TRUE) checkTrue(validObject(tmp)) } } test_oligoSnpSet_construction <- function(){ checkTrue(validObject(new("oligoSnpSet"))) library(Biobase) data(locusLevelData) require(pd.mapping50k.hind240) require(pd.mapping50k.xba240) cn <- integerMatrix(log2(locusLevelData[["copynumber"]]/100), 100) oligoSet <- new("oligoSnpSet", copyNumber=cn, call=locusLevelData[["genotypes"]], callProbability=locusLevelData[["crlmmConfidence"]], annotation=locusLevelData[["platform"]], genome="hg19") checkTrue(validObject(oligoSet)) b <- matrix(dunif(nrow(oligoSet)*ncol(oligoSet)), nrow(oligoSet), ncol(oligoSet)) dimnames(b) <- list(featureNames(oligoSet), sampleNames(oligoSet)) b <- integerMatrix(b, 1000) ## with BAFs oligoSet <- new("oligoSnpSet", copyNumber=integerMatrix(log2(locusLevelData[["copynumber"]]/100),100), call=locusLevelData[["genotypes"]], callProbability=locusLevelData[["crlmmConfidence"]], baf=b, annotation=locusLevelData[["platform"]], genome="hg19") checkTrue(validObject(oligoSet)) ## instantiate oligoSnpSet with 0-row featureData oligoSet <- new("oligoSnpSet", copyNumber=integerMatrix(log2(locusLevelData[["copynumber"]]/100),100), call=locusLevelData[["genotypes"]], callProbability=locusLevelData[["crlmmConfidence"]], genome=genomeBuild(oligoSet)) checkTrue(validObject(oligoSet)) } test_CopyNumberSet_construction <- function(){ checkTrue(validObject(new("CopyNumberSet"))) data(locusLevelData) ##trace(oligoClasses:::addFeatureAnnotation.pd2, browser) cnset <- new("CopyNumberSet", copyNumber=integerMatrix(log2(locusLevelData[["copynumber"]]/100),100), annotation=locusLevelData[["platform"]], genome="hg19") checkTrue(validObject(cnset)) ## instantiate oligoSnpSet with 0-row featureData cnset <- new("CopyNumberSet", copyNumber=integerMatrix(log2(locusLevelData[["copynumber"]]/100), 100), genome=genomeBuild(cnset)) checkTrue(validObject(cnset)) } test_GenomeAnnotatedDataFrameWithFF <- function(){ ## test instantiation from an object of class ff_matrix data(oligoSetExample) data(locusLevelData) fdFromMatrix <- GenomeAnnotatedDataFrameFrom(locusLevelData[["genotypes"]], annotationPkg=locusLevelData[["platform"]], genome="hg19") if(require(ff)){ ldPath(tempdir()) gtMatrix <- locusLevelData[["genotypes"]] gts <- initializeBigMatrix(name="genotypes", initdata=gtMatrix, nr=nrow(gtMatrix), nc=ncol(gtMatrix), vmode="integer") rownames(gts) <- rownames(gtMatrix) fdFromFF <- GenomeAnnotatedDataFrameFrom(gts, annotationPkg=locusLevelData[["platform"]], genome="hg19") checkTrue(identical(fdFromMatrix, fdFromFF)) } } test_CNSet_construction <- function(){ library(oligoClasses);library(RUnit) checkTrue(validObject(new("CNSet"))) a <- matrix(1:25, 5, 5, dimnames=list(letters[1:5], LETTERS[1:5])) tmp <- new("CNSet", alleleA=a, batch=rep("a", 5)) checkTrue(validObject(tmp)) tmp2 <- tmp[1:3, 1:2] checkTrue(validObject(tmp2)) tmp2 <- new("CNSet", alleleA=a, batch=c(rep("a", 3), "b", "b")) checkTrue(validObject(tmp2)) checkTrue(identical(batchNames(tmp2), c("a", "b", "grandMean"))) require("genomewidesnp6Crlmm") fns <- c("SNP_A-2131660", "SNP_A-1967418", "SNP_A-1969580", "SNP_A-4263484", "SNP_A-1978185", "SNP_A-4264431", "SNP_A-1980898", "SNP_A-1983139", "SNP_A-4265735", "SNP_A-1995832") theCalls <- matrix(2, nc=2, nrow=10) A <- matrix(sample(1:1000, 20), 10,2) B <- matrix(sample(1:1000, 20), 10,2) p <- matrix(runif(20), nc=2) theConfs <- round(-1000*log2(1-p)) rownames(A) <- rownames(B) <- rownames(theConfs) <- fns batch <- rep("a", ncol(A)) ##trace("initialize", signature="CNSet", browser) obj <- new("CNSet", alleleA=A, alleleB=B, call=theCalls, callProbability=theConfs, batch=batch, annotation="genomewidesnp6", genome="hg19") checkTrue(validObject(obj)) checkTrue(identical(sampleNames(batchStatistics(obj)), batchNames(obj))) checkTrue(!is.null(batchNames(obj))) checkTrue(all(chromosome(obj) == 1)) } test_BeadStudioSet <- function(){ checkTrue(validObject(new("BafLrrSet"))) } test_BafLrrSetList <- function(){ checkTrue(validObject(new("BafLrrSetList"))) } oligoClasses/inst/unitTests/test_conversions.R0000644000175000017500000000150514136047277021560 0ustar nileshnileshtest_conversions <- function(){ p <- matrix(runif(20), nc=2) integerRepresentation <- as.integer(-1000*log(1-p)) int2 <- p2i(p) checkTrue(all.equal(integerRepresentation, int2)) } test_oligoSnpSet <- function(){ data(oligoSetExample) checkTrue(validObject(as(oligoSet, "SnpSet2"))) } test_makeFeatureRanges <- function(){ data(oligoSetExample) gr <- makeFeatureGRanges(featureData(oligoSet), genome=genomeBuild(oligoSet)) checkTrue(validObject(gr)) gr2 <- makeFeatureGRanges(oligoSet) checkIdentical(gr, gr2) } ##test_RangedDataHMM2GRanges <- function(){ ## if(require(VanillaICE)){ ## data(hmmResults, package="VanillaICE") ## checkTrue(validObject(as(hmmResults, "GRanges"))) ## obj <- as(hmmResults, "GRangesList") ## checkTrue(validObject(obj)) ## checkEquals(names(obj), unique(sampleNames(hmmResults))) ## } ##} oligoClasses/inst/unitTests/Makefile0000644000175000017500000000146114136075651017464 0ustar nileshnileshTOP=../.. PKG=${shell cd ${TOP};pwd} SUITE=doRUnit.R #R=${R_HOME}/bin/R all: inst test inst: # Install package cd ${TOP}/..;\ R CMD INSTALL ${PKG} test: # Run unit tests export RCMDCHECK=FALSE;\ export RUNITFILEPATTERN="$(file)";\ cd ${TOP}/tests;\ R --vanilla --slave < ${SUITE} release: R_LIBS_USER=~/Library/R/2.15-bioc-release/library R-2.15 CMD INSTALL --no-lock ${PKG} export RCMDCHECK=FALSE;\ export RUNITFILEPATTERN="$(file)";\ cd ${TOP}/tests;\ R_LIBS_USER=~/Library/R/2.15-bioc-release/library R-2.15 --vanilla --slave < ${SUITE} devel: R_LIBS_USER=~/Library/R/2.15-bioc-devel/library R-2.15 CMD INSTALL --no-lock ${PKG} export RCMDCHECK=FALSE;\ export RUNITFILEPATTERN="$(file)";\ cd ${TOP}/tests;\ R_LIBS_USER=~/Library/R/2.15-bioc-devel/library R-2.15 --vanilla --slave < ${SUITE} oligoClasses/inst/unitTests/test_annotation.R0000644000175000017500000000266314136047277021370 0ustar nileshnileshtest_annotation <- function(){ library(oligoClasses) library(genomewidesnp6Crlmm) m <- matrix(NA, 2,1, dimnames=list(c("SNP_A-8575125", "CN_473963"), NULL)) gad <- GenomeAnnotatedDataFrameFrom(m, "genomewidesnp6Crlmm", genome="hg19") ##checkIdentical(position(gad), c(564621L, 61723L)) checkIdentical(chromosome(gad), rep(1L,2)) ## genome annotated data frame with additional columns gd <- new("GenomeAnnotatedDataFrame", position=1:10, chrom=1:10, isSnp=TRUE, arm=1) checkTrue(validObject(gd)) ## other approach library(Biobase) pD <- pData(gd) mD <- varMetadata(gd) gd <- new("GenomeAnnotatedDataFrame", data=pD, varMetadata=mD) checkTrue(validObject(gd)) gd <- gd[1:5, ] checkTrue(validObject(gd)) x <- matrix(1:25, 5, 5, dimnames=list(c("rs10000092","rs1000055", "rs100016", "rs10003241", "rs10004197"), NULL)) ## preferred gd <- GenomeAnnotatedDataFrameFrom(x, annotationPkg="human370v1cCrlmm", genome="hg18") checkTrue(is(gd, "GenomeAnnotatedDataFrame")) ## searches for hg19 by default ## checkException(gd <- GenomeAnnotatedDataFrameFrom(x, annotationPkg="human370v1cCrlmm")) checkTrue(is(gd, "GenomeAnnotatedDataFrame")) gd <- GenomeAnnotatedDataFrameFrom(x, annotationPkg="human370v1cCrlmm", genome="") checkTrue(is(gd, "GenomeAnnotatedDataFrame")) ## request a build that is not available ## checkException(GenomeAnnotatedDataFrameFrom(x, annotationPkg="human370v1cCrlmm", genome="hg19")) } oligoClasses/inst/unitTests/test_RangedDataCNV-class.R0000644000175000017500000000140214136047277022650 0ustar nileshnilesh##test_coersionToGRanges <- function(){ ## library(GenomicRanges) ## data(oligoSetExample) ## ## RangedDataHMM and AnnotatedDataFrame/GenomeAnnotatedDataFrame ## rd.hmm <- RangedDataHMM(IRanges(start=49825223, end=54637167), ## chrom=1, state=3) ## if(FALSE){ ## not exported yet ## checkTrue(validObject(new("GRangesHMM"))) ## gr <- GRangesHMM(seqnames="chr1", ranges=IRanges(1,3), ## strand="*", seqlengths=c("chr1"=1000), ## numberProbes=5L, state=3L) ## checkTrue(validObject(gr)) ## library(BSgenome.Hsapiens.UCSC.hg18) ## library(BSgenome.Hsapiens.UCSC.hg19) ## seqlengths <- seqlengths(Hsapiens) ## obj <- as.GRangesHMM(rd.hmm, seqlengths=seqlengths(Hsapiens)) ## checkTrue(validObject(obj)) ## checkException(as.GRangesHMM(rd.hmm)) ## } ##} oligoClasses/data/0000755000175000017500000000000014136047277013757 5ustar nileshnilesholigoClasses/data/oligoSetExample.rda0000644000175000017500000036767014136047277017573 0ustar nileshnilesh7zXZi"6!X#])TW"nRʟXgqjn]LX -:7Δ!i ?[0 YÜmP}ׇ/ ˾]ز^ިBu_UwcmB֌uk.%;R VQ:S.*UDQx:: mm' KFf)TZd޶v1 =XBዞhؽvrQ (~$aI!cė*s)Fqϒ`4`pfhڠ˯)`?h.i@>/&f~'u'{~}wEDC@Vj-ԙm>JqX=CD,@!:BȯXm{W*+{AWׂ#: ;GdXτ!7{N3h֧q5PR*НwE &BiLHЗWF BbXu$ zeV&Q~᡻ V[d8%#V[F~ ;5Wbi'o4 Yus.o‘^&}V[jMh޸M 2B cAay-1D-vO>IHϵ?^NUOUkC|+S#hQ]8QgfZ,w[aմF zB-(ft"\'hL{u+yoyd=`Ε8rBEYgxiDhn+*ATH*hXN`Ш1e'SϬex:IV. #žk'k[-J=g}嚸b)NRXQm7Xln&Wi./+"O43  @KHfcd{ckӄMxҲz4w8tc΄vROϐ?*|8۷/sbr,qhoK~x;+dC av d7p)D=r8t>ֶ?5pO-fw@{ahk #20Y^U-.DpQоS&Rd4B2JKd2PRIQm,F=JWq1GLR0&I,pN!]D0kM az ETSU/n}uKjcR݌VhB#eDxvFtfkţ;`{)H0c Zט. ń:rEȟi)aD aKGc4JT?#4!ծ+ Ȁ`9dݮ:o!Rp̨fJu)?lWW S],vIj^Zh0-\~@%x@(X>E̅+y>~ 61.ѶiQ۽)4)\IϤB5?s&gxV`Zznt ~|ZB#hXݫ-3i. NB5m_zt8/ɿ_m >80`2f(F?HD8aSW?-\57'"V9A߿n%Y6Bt<5lȶyg9wQ.!e:G"vP_|/R Fl/6~Lvz"qdz@8DnjK6Aƥj6uҐvՉV\߼"!;{oBFދ`6ݔd,,:dX ͚BK|V6 Ah񔋒v|/X{vuS"lᦫwziR{2=d U$OSHBciɗSW| CtcftZSռ&3aҦՅV7Kx z(ȻFB dߗqzˆ4׼+/|vgwl"J{PTJ_AՃ(9#S N1惏k& V<+ExRB<) 2h>esY T hcS nw-Enw6<{\>/F)JĤJ"S8+H#w"oI"𛻤#V.R=.ky좃wk}roKs&>ּ1ܯʿ?h]UG]SV+< !MT* /_lԭSjis0^uDhZЁtYXFR1c,w_VXc&~6LNލ^53WB&Rw8wbnPf5)|chF0WAd_Vۇa4H-y6_/F#B3*{5$&}|q<Ag|;Ŷ:D5Pcdrn0,/Y&>_S8Oϭb>n=k?B얿46U [IL t~WY _@=Ƥ.,CG#ML ~΃h5{@f0>h@ϕ9jt ^9$\gj$x-JBpJBI$qxI=uʼqY_Fx!33[S#i USoJ;V}2R {pS63VџR UNu8b}̍ {Qryv6dWː'uVg2D`ʥ8́G@o#]W/pGh=g̿.2/tmjPT#; U!@cY(Gdrd@3u_|n0pԀ;_*vem8uol2s<? Ӯ>E8ncfҥFs珙Sp?Oo 8d=jC E PFְ̈́T1TG'%tP__lӪͧ$/R%Kg|z `uM@mEap?tzp$}@&k&e^*ܜQ<ql|\! #_pq[qM\ +7ph#z'(ջnc8M<Y{+#h%甏8 Xg@pg~F`c_9U= r6ge}7$|Cf A]; S[.k'+}6Tk܆-GY {wO%B{1dzzm8KG.#7+;[0*rt h)|buIfr92f}#mB,l{!T w@Q铿?ԭ>7Kǚ"zy3t&by ʖ*t<]Aέs$-DT_:a|aТk# >7)< ~o_N,DES5E2kX`0%2?5Yiw0HQ@.'X&C:uLe"e88V"PX5.MQU/sNo'>A UqZuD+.e7yTry_65N7YuTdu7A u[&L:WK5a~ xÝ]q,`;'$ PxoEblu?D闂IzΤi~Wv#~7wLJis.QvE Hu!2usoɠl +i4j[66qWz '*'\Xv (qӁ#Z-Loxm\aY2G&…fELSgv3 _*' .&I1f02vus<{)?^EQz1Pa/s=#Qι)zUW^&m]=e%Tt^)}u~F'W;w>tS" 3|v&u# EzH@[#c=k[HK.Z~l 6R2Y@*A`^+aM_\k{ N#mԴӛ7xЄճ\GPxYWAnt{ ψĠ-U<: >n=+etR&GlLPz iX*I%3$2<YƞaޭKJk"``@ +a,@|֌.]偱;53wҫƼwKe M-*%í0о{) -Tþ4=OnzߠF |$)7)K47d&*Fwྵi\bHwȈ P;J/MR'&Н"dI:.30IeEJ(E%k_BHFJ+ʻwއ XC_ҧƲKFyz{cce$0qpe?ɠ!v &a04r 5lQEgӈ0( n蕴Dsz_ U=䵪$ TNq~,þyqfzrz)WSO:/G\WiR3BE\/9gb%G5t|7F/1pSZgţ?\J[z؛xr0S5E1+|@f|wxz}G56\Uu Nn]p&ɰ7\( lGˆK&\9B@d<zLjV'H0,vҫ( y|{ f1У>sD0OA#u'w 7 役R'K[ZzGR*[oV8O]4)WOHgڰl>-=Ss5ǥ;YL֍@(369˕>euBw1cZy0j{ d,)[} AqV4T֚iUHЬ?rtsxK@ߐK,ٵc? պ oKu +Z#AX]8<%:=B{mIk!+*稨Z&.dCM7fmP[U+J×?u Ow zsȚX:v)~|jP0&./Ql:H+|+]H 1_ ↺>/yuk?Gt꠰ s` B%K{~F?e/q{W@+ȅϡYl.*9؂bs-*~J#t Z>n<3c߼B8M/lpW  U=v3tj6v]B%Iv4]<8j@r@b1ā있{- K:mR`ư  i_lg0}XȽZS2n'*W=#MRTה31Yz^ {q*@&_3P}A+m8VH]U@OjT3|옰Ĥ($ 2^.V΅v?|ΞsѺn,5]x%Tu?J|߭$Ď@Ee~glh jH;RW#-L3vVhSi. q5]ƬʚB99SNhhS񓦠7;W#6q@Ofka~7 Mq]34 w 4SaP؎J)D2,%rFJ7{c2ebG#O_?; !WѺz7)B䱆uI~Yq Erb6cL ;{`w0y`64ݾ$,SVR2< ejÕ`uSCR&$@^G<~agqN?Noq;= Gg,|TH3=S`px| |FE˻Ƒk+(ߴUms~$4mtC߼ } t:ǪY:Hn:gWcHXm6Z1pӎ_XjRܙIv 1NÝV4p E< cle|g)Z0)tFWi%@C+>&ȵU8KOΔ,אLZW)WdO~vNwZt؂N~(wy~ԍ"3G)v {*ǻå/)IDی}Ɏ@Lt~9c&Q0Z48YB wD<)EIe7,&X\&ՂCi c-vGEbvDL }[^P);PTLrيX1÷jSCWCW5ZI>77b/%K ]d?NTzgbCK elIF)G]>lso=f5%Ӎap:^L@hժpAS饯 ;:/[SšT)޲5zPZGqcl<5? u;Iƿ,XL4pǿCe맴^}ўo99!\nMFHuX/wqBSߓd+LGS ?Zt@*>4EY3)[5s;w촿p QzR)3 fF ]+8|vJ\zpkI{ ێb-'=<OS>وw|5 ( )wM3EyK-Z[$n ƭ::)Ϭ|qB?bo׳i3r£)NSKy%*46]_?Uy44lA{pX 󮒠4K;tnNv?v-zTÿꭠVKg ߁$%xFhSRUb|d\f/z_ֲuCy:CW}^d1~(Pf#Nnd3Ā}C&_*_@CfLzVDv}Tz_IvA ^΢IN$i ŃoXN?O2{TB#LHECf  Ym<:?䨶,L^7POE~d>V1˔bx(O8|Osot#zB/چ, :S b s^*$VncsNYa⸭ZYR5o"[6nViO-N{6m<:b*ůSZ*?~Fw`꣩n~ oQx2s A1ߢqIWGϰ U4B>m D*Fst>loj1J&K$#qt&VU`0`Fd&׿F~}L =e&~w2qM/ N+5{> ZomMxw_..?ZbLMaT ]1D6}9q\̐fRibd5*9:)xLT%ݴ=]AZl֑4|/hX݇5]ZO3ӏp߱ LYofBu3焏 Vfͪam /ڳ*HYZh* |3my|\\ta*@9 u:LR\ꗣAhz^;LR^q1/Kr`"؝V?~ש*ݱ%0#:<)2d\k'@r~3Ң٥DKlVD6e٦#0042.J\vQ6ˀ^mSa]{Z)h I̫>;ߟ*h1YL:hhGaJ) &z6Wbw6/=Yka5֣] Znpr)>FT@aqOwoy1q9o\bo. NѼ`F 6:%Jؚ%F=CHnԍ HOkrKk˜{nqCOsRoOnq6QLģ-%,0/uXgg~'n lb~t`]1HYf5Ϝu%i9pef{]Lr:Č%fNk{G-SAV YPSHV0O uvǗ|Y'`yc渡`mJ{¥} /jkz!& x6fː"82"CmdSL{xnrMXs27YZ8M|A5f!Ws+A?ٻd1$3Jkv%:笩U^nf"YY)ƌ{-hنwI|;=<5t]sŶݱ@2Arfh|(UzDf&\kΕM<'LTKw:A.ͷ?`Ovآ4Ԡ+{)n *6Bb* W{ OSnK;ɫP#V[ʭY:m:S+A*WSȶd튬U%gSIK[c0/\S]%0BR5qAm)^qJ sSt5\wg5q.+Z kxEu Φ08օanmJ*v=#ɈjV%}=5qu(N酌;Rr cv[B*9!$/.CM QzzZE a~ɋ[N=.KkELPP`rs"`5+9 ) Oxϊ^SZդG[Rmyw]A})5+*9YH?!vFK%h=bmG١L?BgJ0jX_Ex,':q g!_ND@77!VAoypŃıB8c=nD B< $MI>u#wO OvzN˿֠Cxҙ-p<}ZXko ?)[$KQqG[wVUc2Md2au<dػ&fy/ H@:0՟qx̶\rȧ6wU;M~p&PToHlj,dQ#&h:cczw~Xb>..gm+}s{k&X䂪D\2g.GÐ$OggiR`2+Y1faj%˗\N䄌`deb㛎GhBWU`uv9=UFQ!Qg j( Iz~rElNͣVw50ArZ"GM_Joo̻i@:2|#lz?'{ǨUk ImG_3!ZS -s~llu'$MxTƙTKRGOq CiKuҟeW{4U ƺ?[J\ХlASeMH={O$< b~&TӬ=^.[viQ!b%cH5[kMw 2 =Q2Yc[ߋs4jT閴?&'Q0yɟV6-D~$ps]TƒFsJQ=N/@"PCs+ߤ hΣ~=yQⰷT]~Τc 7 :x|x,nG=Zߊt{o#CD@Q# M=7h.,O/Z^XQWIǪ=AZ6b𤥂sk#Aι0Pfw=En 9M!ӿޠ?v~LeDC"l0nˇ sDKJ/#dيf!rȳ<;/܈f mUh D#Jy* лu+wl(Gz?_Q7`#)zM(B_pQAklvz-2JJ8')9)I83 mVϭ!ż `Vb4T""%4WZՌ1W8c!\ &9v82;7*4V.:vCѰ<. ۯʨrFozIwcC q ۳m1y.,EUP(t#lhptwUIrϭ*-d@u@~CSиUC8os#tq h "uFenux?`ulĞisK" r\Ls$i*xrCu?9T9Wxv0,K&…dhWg;PN9. Lʃr%B>0bY"t/fHs~XMAH)FZ&5 FX2Z՛>V> 3)^5eL\ঢ{_SuA4~%(%+iD' hteҨ<([j:~=CwHk+tJ?չh2ڑr@OŠ*l;o3FY"L4_P໔ح "y&{8Axk7y$<~R̰џ+vbUI9˥_zMk]BO%ڏiڣʙPv8#ѳ[+"# A{JFvKb ?-h|x3ѣ ˆ{xkPH5ڤrRp޲* F 9^o šBHd(CPf }Q1UQBrCmli7akvD46*ԩ $y>@%+v':srKUI':]l ,ϽlR44j5)5$1CO7G e/.{2-u)~"5M[&Mi2eO+.R6~h2gX9zڊM>;]YTJ<RL4h݈Z#xtN-|}{>^*kv3Zvih5޹A.n#++, If;"F5M(\%cd|2C[{!WՀݚfIM_y 0'-mZx`($f~e˪㳠ǽJSY<ן3]Eǯ N͂z${.+9]j(ul.\lqyק:y 8rIҴF)(f]PkF9/7=~,%%q5&n3ܴ(A,0y[Yő<ËkAcr2ow "='{ /UdɁ#NF/!:UyP `e~JyL.oe9'Mex*Y{_zP$J,3lӱ~͌.6[%|Huf! rڹ*8AՔxc:U7K̄٦P5DTq\lr{ꂓ:X߀$ks!Iz9ݥ; nEk<=;)}RpW ޹>R0_|z͆Ty\?t?|]rP&һ'h~+7]Yn!N~Uk *=LF.f} ~% |n!c k7D;*V Oq@Tng3zY 1.JXHS1!^+Kqʙ0gmF蝭o}uYr侁2_%Frg`DPޡXh,-+SCot<TMjՌrX>^cUx3Jx~g3 B> 5a Ulm ҆4! Yp鷥~S=eyix1͇lb UovFWZp[(tt.*M~'Iz.1co}Shae >{>%+vW`B|7ݾ%|):4O3pKpmZ T Kvb(pp!E6 z$Yftq9]+6V[!F!J7ZLDs Ρ0ARj&#>uHHF:խ+A73y16B8ܣiފtX|=aYeUMBA進'>%a/IKREVb&6$}s+)B:H >*x5M"ɼD:?H.?2qzêLn>bԠ,_1Fs% sXv+be\SAZ>nryto󓹍Qi3ӽsuUAx,Xw9ZiY3O7~$hn_y9:~]|&BDooM˜:ʱl6[>}fe߷Fb,ˣh%B.8wͦ`%<5ϭ:dT6*gu$>ٔKQ%jjD'# ZF,JVh:28$K/,8p4+7ʥER-x'Z9b1sIF{ls8džprMoV-AQA>\if\}c3`׃zO @{5"]8FC S6Rs7 [ "`\kSH>W!J.>K\BABU~nMdT/p8e uO36EXЩv/[@78o7Y]qh_Bu`{w$NOVj/,Y,y˴K]$mО(؄g"N=! բx5/K$Z{=0Jq}y%FESɠESm@ܥfx`ɪ;煂2a $u4 g ҙ + >HR퀁$Q} jkEZUe&y *Urũ՜}h d$ӹ sT[-й`*Y\&w<[^n P=sy_%;DI}b{h%a GֆJdcyGOo8',` md."Y: \z|][%h',xt!GaQe< Gɵ]5cQ.n;˒Eg.CD #s5tIȖ'T\ j⋠ÄKܨ|w6Mh"fwm;k *gq'G0㣨N[ S# FwZG'YD7 Ip'Z-\ɉpU5O(cngE)z[يL7Ҏ .kwk3i zB=R0 .JTH65[qj=Z_QnZzZ5MUq84oeԟ׮:0<5鑦QnR}(DD%;4"`n<]Jm j/h)bPU =%]W}n'l ]ǿb _g7+jH,r78C J(yuR?:)YPsJPK# #Da tF*ur"hW:t1xy%Y' n8| Fi.V#`嚻_Dyi• }u*1J|dR n hscUDF1 1myYmzgIHjɊu*RpQ5 +HNoV=xOZ,]h^+C(Y$6UIq %ǝԇ`82/W~Z ;8L_g{ |( qP+`׽/n ˉ⻊P, "SÑž@ TM.FE=؃h=O{\\ư Y=rRnخߣԆx `f6v K Q>*D:гqz8X9+)MͤG$aG\z2iYUf%VpyVCaP4ɕt>*ن5=~Gaэ,bRFͺ1K&p4*d:J->Y@{xD-槚s@J׻wdOJ8I-#\njD=FC']!BAO۳.؅mMN2@H,i ,T]RSk~{v t[@ڭwD:|rC~sqa #rA;/s20@~/-' GҸ!MzJ*{ 9d&;/i4:eJ&w<[^~$mlܡ# [$0 q83L$87I#9,jk` WdZbaho ϪO*&D  HK[fN`vQ Tmdp b鰜E͠s./=5\0|c֞ BEsÃ䠍eUt */o[pDsU1~bd{Ie"y _I>幯=ޤ{(x Sk&]V("gIFljkby% ǺFz2x*-g#vfthk`,RT]að{R9  F2z<Ǧ<3=yOE⃟m6$?!N@ZoBk 2Rk̤v̅jdI t7FTr"&Dtfڛ~5d {M󄧷=4{{): F>TLJ?RlTEX'7KZ% Sm#XoV#[͕B_[v)+X'35Q X¦17 v$ٽ g!(~rWdIQ]K!Y(cu` Qfoa˂h$% Fn$1 )M,㞃]@&YyRdJ($'C#%3=MxzaTEe 'XmK^!b pXHOL/rUnp `nA 0Nr=.D\ТƎ >}}=f| NG9̄c\M>yHǜOSstV#=>ȓ bt<ϕGsVȽ-iu2cK)*y6拮oGF_6D'RઅʛJBZZ"tyiuBK7U"p'Gǚ1ݹD'ށ\m`ŐOXY>C`edB|񰞒w4':pW2eO:XM #{"͑r9V._K{oAytڭo$-kd n+um`ԏ枺& u@r!ÊQ\(;Qz>6c\݉N+Gݿ/e+- e@rGYoac$S^Pj  ,b* J#8KT@ >s8TD$QWO BVňڋk~xfFB[UqIW3F2]Q3ULB@Pe-s7e~ [bdts4 x)3ybLS9p-249~>/S'>vyW#4LRA*Ea ߏ0bť;= |+M$Yxq2nAF!)vrF1slL/fu<k`]#{V. 0`iqgj[yB>CXؐdv[0nrvi(i5w?ށ mao!a:A?Ih!K.ws'SF{luT6JbA;oQS y]6>1F+cX:kc(\bڔ2r(xyYOBju0cmFY9\G{aa宸hp5#rr*ܱlH6Љ8]-.g|.WLݑ#Gt|~N]uXc('?9wt^5]_ZϮO )}s7U4!x21,eV(ek0osj/ca;f$ňjNHM-_\N^]'88z*H@q]׶ ڦF8_+N Q< ?,GZ traB @i; zܩF͹<*|@gQ zKG $vz=wI-1d`$Aed{sL! 1!lL6+ès}-X-%أ#_,-8C5Gj)Jy\͇6X:up'1V&Gsxyf knW>dQM!)!:编|Y{٪YI)2|drԂu@&Г$7ʓ,@M fs+ W{7uR1FbD^xzoǼt{7z\Ce\zҧ͇^J䋇˓.1TR61J8j#PsֳۊIi]YY7IbT d|\`ܹ)]`&PldJ[)Ӻh*i_vd82L!r `0ĥI gO&^{3n1~,YaQwx@jvXBw6M 'Ἧ~pv$@$e]:_W!}VH]ƌkF}%K68@ @REmιj*Od삲eM/JQu6>2E$NΦ02[ATTK-b 90 ^gi\_|q,z;ErR]M_.l!~Sɇ)WCܝAb{ @knaꦷ@WՀj+7z/Rدol`B;ހvdžT \QuP>1|1ZT%Xѕ@r%>RGdQ'9c ŏ!(JT V[#ԱbC$$V{@&VDl#1r+>}P7K8<2p:yǨĸo/^v}-k{ҥ-tD[q5;c'̲+|J<+ʼn) c3`@(D^,i#Hhh~5Ϟ21.>Sq9qiYXZUnźLJwe+P,4=$÷⨒\8'\Vf\)>0c0E_N|5 /nsO[woYgF9⤬%oQ٤f{5>E_}J{v4s9mP(y1 Z\' C(n?BELTXpylt jܷ @8rM#N]jɀW{΢nּ {F:c[#Rz˪[r̜'k9]`h˽[T1H*G  awp$c@ͮFa W'[b9t3<"L@XV$I~m՛=%JAQnhQߢZ+t5 Mÿ? Vc7AB 1IhJj\'A`#DH9kC'CnK薶sų*XZ#UFi.X9ɉ "CPǝ-Z TgÏ `)^34䛪nk"F֌|mZ{քoa zߦDTö%r깼iGs0` >z ge+Mjv6{Z>ۤw` =wZfpM;{emMHH?p7Ӧ{|p_R<ٯ #+M:Erbk8CHsXcm:CLB3o=`Q }Xƈ:x ɬrؑ붐lMщcV6xa1GM=lm :MD>: @Ol</I|WeZgwlV3 @MjP,n}A 9X״h8YBH8?FEG&dO#ȧ|tz;=Bƚ,h+R7O78)ܡ#S0x|a2%B鄋Mawn*6ij Cd u>4sw[a{f tʯuyZuyi3sꌐ)C X w[薌)g*0Ϻ1:b#XU٘i@&G{ B`e'{eDPM>^M^/ S paw PĻh," Vu˩Ӥ(Uniǽ_*IғRS{Iqjǥ/%+:DL4ntW*k3 D5dBN2nd,ƎcUEd=Iޤ˶֤(C ! ĻRp+qǬ*;e0Gvtk|Қh)K1nUBjf,]K3F9ށu,E q*.·-KzlZr#qlnO|_/<-fBq!B?eӺo+$ a %I]i/fg; .Զ?Aءix]݉O)("yŇIHK:Cvi=}e&Oӯvf8$nC;ԳN|~x7N!WL;m ܶC7aA9&B ,U`ƉQ{4V!dW¶^Cb59+#ǁ4WK/U7)5@*LO0urzn:didvӉ pG^Sc7>eFg8~>'ҥm.#iK2[nU$ica܍pFg_槇%PQ4k:p3I[H(PMUw|] ]u/_kChgp^s.M|2/ /HA^@.uɅff1qʠ|yF8<Xʆ:b۪aШy%ՑORu"Lte*Zܮ4J%ç寣p&{&lBU٠[D1 L.@údh3 \Z";`p&n٭oN/GJh @(Q|-tȡ9ةk1t3όJݲEG`hA)}H]o֤L,Wvs`soMwt)(U,SBrg6 .rj?QK2'NzND$)>LV7`ޗD30g= QzPY#4qዴ+me:\ yfkS5X^In~.|􅘹hyX}&@/c;2ju=ꇛ# 8}h&*f<"g&~ҁ|-B[ç@8¨QLs{$0(]5Pc|,.3q.=#fŗp5Aky߀;*ZjCɱ6SC|~2,4^3Klk1@M?Њ=֝^=M0 Z1ZwG'7%0ހm5vɛܴ\nl9GKRrf9#Ԁ 7fZwF9#F VU0F^C= qIekvty^p԰JDbMcr&J+NBASc/w+|&®)^esaYп%bH[s&K],=L(g& t=6 b+NACb$²?9B'NŧD9{>FN^lؙF %q2wgyF謰uk` 6h~?lK|)}Ze\3EVG/˖+(#]:ă$y?Q)^t3z;Y.AhU]ls 'V ڲJUpqk]k]fՎJWT;"ٛ7AgwMVKcvʞ<4$k gp|]5 ^ϱђ=!Y,X 'hu:"@)qի254^pF=DV ->>uD@ړz`_!BMaôS/>wB H8HʤupfSM^jg0ƹLFm+"3T0 ŪI֑Q,\!S@>RDG=\NE;q`Iwc:&scBE_޺{AO?a)Y3pv>jmdH`6r.Bۙ5ጊ`R!2H[ Ecm[x–0"69]p24[L[T :~cc(~gZ]Rkg68Y8k!Nv^.X@geDFȂn 8"lەӨM3ڶ˯?7,~}PY$ݙXI1Pmv9F<4K ^7 >evbt$|rUGl%0$x0:S, ķj>NxȬՇ2^:J&!ضn6E=22EOU邢 l|V(cXf،26Gt.^m3pdvMҩ]^!U_h`T;ӶbG*P9\?[QNV~V^N\g6Kt'6{z3 y<\ 'eFJM1?Gylsnxs xp#{9Ykop$ƃ 4_Qsod;o, BJ4)'X fZKAJhN* $ٛ4ς޸vmuxP/M|Nxe7h /4&!4&{+VJ2 4c&l R'{l>9>=%礃EO`X!RW_7w ?q֍lg-QV.!+B9<c->5Z֥&_tڭc<}Y#S`YxǪȸIxT}nNCø)^1:6 "5VazYÁ[X?1X#Y~ L *a?^/#nİӰfr6U>/ٛ<4]AESVw,+^;DHY5196#~djYKt-Kt!VEL X) ˻TB5RAAu|oTDW,mvhw!ul YPCn$r,yj7z2VbPeK|h雟9;اTl;Q܃~iwt'4?E' ckp0-,b]G\3/7mD$ps{ШiO+$rԼy%YӦ}N;ŠqfpCwu|n98p,mVLUXa' ƠWKOsQ]dy$C|#,?ט.Ox*į#EU6ϘS,C?to2,54yzE*~而s#UiUm ݷ: !d =٨d-u˗qR̹2 HRLVj[rN94ᙼ1uO}-*G<{-""ZxBf bN &yT^ x!h}9o6 ug}\6߁ż2 < LglD_b0@OSZqyv٨f4ٵ~|\f7;I WVMpnCAT?I=1ꀍ k|_xܕmcyHर,JAzW^9 8؄jNWK,M&澭}NmDzb{d\#pt%[O 8^K%@HPR Ǫ.8NBfi=-t >ATΪ^ )V!츏ip>b*ŕM\9PDY M7_I"l"42-1PUQ#g5m]+I3bFMLkr0ln@F匣W&+3k ۔dUaA"S9n8d 3xΆOc?2{\ j `O2˴{0͊\!yZxV"(iod"c>q$I:6l @J_7:ZDξ.J59-fDh}T% jN!\=r 9D;Yg4Ӱ%F+SsɒxtHZI 2S0kҫ]i}e\6Hx/gW ܷxP9sh${wbU()DHxڂxF®ʑN>p-vqa_c EwzRE"i%:rj^uFPtؚCl^s%wKS Lb_q>Ӧ^ܟN7 O"s>@[2h7ܶB"r,'φ͕1:ni 8,x,jw^Eߓ+x2raI%h@w[+"j2x} F J85JL-p%"Td }Ln}~h$9V +$HxJL.[PuMZApc,;t Қu1[kC\U'OssV7ã/gkxF50uUjm"O=ɁKT2$x3َ! ]B43ޱ#yOrGeF&EgUXY Ȕ7Ő(Ϭo Ry/8@ O3 <ހoƋp4rm^s X>mTc;W}0|N%urٺHfܫm7J~' M $E~J,Eaw  z"A ]hX:QݩH5sD|"R (ř,q ц"5U~B]U1>ILC)-Kf{xgI8+hC}#$ߓMZwb$8uhm8s$,)1,c 7IYF;ާT?'X  ΄P ˀS@K`"KCkɶMHt<^==,~s+C +1SԪGf‚rُl"uΚ.ݕ.&JPD0UuBS}N?X:Wʔ-vٚzy㚷28,ߋ}[ ; 8nHI-֫*?J4s~swՌV+dNGMߪ?~jztˠ #C[ N7zLսb=zPH Q.6pmo-E.YnxW~fIƁUx m fq7Z_Kw̟NM׫$@D캋9 ι1Վl t(i}7)7Fݱ/h.~i;v=zPGKaxhýCV*aC8ʨR#~@Ltƈ 2(k% ՓxePl@،*'gų@[g쩄/Oí(JsѮ3ģ3衒a4v0IqȅG}0׌Ӑ< s+^4m©+{bo1{rRBuڹ$a1@Cjk;kሡ޽ШӦeA49v/hg _ShG*9r?5E2Vfi:fU:$RF-WӇY)k ?n1\nT Nͤ&qf U<՛}i0xtB#\P7-Lf;PDbY@U XԚ`Ucj`MHP~O!(RW,YE$*8uCX#Df (iPz4\Sx8(Qo?1!7&&OEns5A~7)m5CY͌r*831y}SC]S|D >jր3ebn"-ZWA41Hso6:C~&I=[ow3L,)gp vv3t~.hJ o&yL?<{:8=B.P{P#6 0c1>B3Lذni^c۱(Ij_c(`b3.#xaP80ԝ1_1)PH1">*E1%!IփK}hwL6jkdcTogMЕԀCP̭rt2"ngCnl3ɢA %06WU؊LamY|7@H!>hh_] ??:tA6?WKl /QN Cg F@h}+*_ X{vCBABy]C9ڌʘ+ouoB$u5b1g,0c~)8a6I$Q"G IiƆW\?m'a}s akZ хGH"}v]0GB-00 q7#=w IJs5z^;oh`0c}̎Kk d\Ybhގ(]?x 5VG}]!w!x]%"# ;Ja/Ds6Qt(AVey{VR\P}Ȟ>ŷw-u_Pu7M=i mhem"c!W=_}Ծw3xڷ9sLM5TKCaqr'w/@ơZyyP*n_KH8RX 70)Dt0Z7+S>@.wnQ}]IV>^199ʨ%֓Ruw<$&%OVᠭ4T@j }N鹿X7 VPCxW|YW[O5 t)'LP VyfKƺ}! =K;eey07i"y7Qg^N˙yMMO+1&@2ʣg +=6 5oic:}A?\Ċ, mt;ږ_ؐhu"ք7អ_#J >2*^EϠ4(OEH`CAtMIqz?om-0J}+.Ol@\zdZ^c]q-Qq:QrT$bVn%osӳљVCer `YcRw!1"c*]<)$P3+>RQav> y\gP0**LR'$'Y]9!ڤ! ;O׽$ˠ:Vho.ozG,ꩥ<V=e0KRHρcTzgcc>+lrC.ht/0mnXpt̉it̵Ԋ+Z YfiX&qJɭJ|7Ჲ_rWIօl%CqӟhYNS"ŗU})2K5BEeI2f:}Z[&IKA<{܇-pفw0!m?' ŦM4B?ԃ\#G[z2Ƃƍ9̌%|_yͬ\seƍI֝dC͡ڶr:pP۔I0; }z{1aٽd\O X qb.%)&輁̀ 1a,5|6A " 7jwz UJ؟! )7ޕyJ'1/8 SD &SAMU"OݍL*BrA % NO1?yX!~5,xSwYԹ2@.}8l On6? H$`#h MPI\-02ASa3s|.B=:ŁI'6A5U X:Ś2.q}U'U of>4Chb2lX$4ZI"R淊E̘xf},>VM OK/Lym`P? ]ub;Mbac}%A/-zhNX'Ovre Ln I) dL4TJfPѰB3`u5W`u6>zU.ZBr'̓N{X:Sbr#Q,25k4;yDnT13)tsj$ÀJXzѺ5h.BRZm/r$7[Kz"?>*ljc5ayo(`R?q1 .4Â[&ppQPt}l 攍V&?:r>C,,|b7+: . 'LU<,g3/5YCT1z!m722}t1_9׍] ; CerujCrbA} s1KR̟5b_ kT@3KR__C:p`cKP@꺻={ ^0WйB)ӽuVz*K:(.F-<K>fp)Qxϸ(y 6 ֨J B]5k?1V`82+t&kX\3hz ~?oNl./Uo4Ն)~bYS0v#kɗ3RS{lxOܛSO6z=V_sw}mBMn@(?$24AuuY|gF^\JVhio :#Lipge_n͠n[ҁҟΛ2@G!rT /z(GٞDM5l\m#!ɧH!zO+M=C 3oP8.\J ZlrLѢ3h֛%{?fedjmMǨ4Xp w$*+ ZfJk #mw:e.F. }N/0ܯI4.?[CP}ĔqN##&=eUDP^=揿P9 %4moᐭu('WS4ԏ,CCPǫ V&xGd[mAۂYLbGD'_L [ T;8k?N c8ZV=. !Ã=pl>CINi-󱝭`>(v3$&Mvm"hԾU^rXy̗?(Qbt-y˰NBu%:^A/$kz9 !Ֆ|E~\Et)K$xTAa~Lֲv(D(=kao{nˇ8LwL,?YM.?%p9u@gң'@}dMN&o vjEX9>JgbxG }cֳE40} .9jV0)p!ik>^*c+Esu)ECkMI+XN^^/ܿk,gA^X,륣 Ms}__f0I5eؗne Kr.jfs ]O/Vx ;Z8ͼmIAJSicCzYJV;D ;̫OpתlM6W¤^l"=I׿ p[_ U-e|/n%ݟ@@5KMuz[<@:h;,Eb?YYT!2ebD ]_=P X E^"jo(xk,DI ’4b\ϱh mza*B,e'8_e6*Rbo4UDᅲO0+Ţ-<-r'8OQf wM=4gnE+ ⯋ocJ`Yl$=0tқz^_?gJEގfrc&qHH{AS*0iUOG+k"{^B_'!PU˓zjΫkקRӒ5~|*\Jiz"`óf><3K܏Sd@vp^D`U\VM-Xn8x陼44(?-|&.L0 lxv{4K: KglbrZ(QS8Gfr)|ɿ%zcA;Wⓧv"iY:)x4&3uxƻhCo1O5>jh:si( \b>1ż2[xU^_|7 4=3bYL}B2b.2؛ښ X $Kk!^&YNG"`g&7 ʂ˾zr#}y?L ʶf0_QT+ζ VdOom{2▼*^TJ/!CJr HoAL_Y۰]uBGjMxT{# @k& cHLiz݁޽disuQ ްqL1 ~0X"O_eeQoPգB1$['BԞB:4kE G+.|,om~G)@}ao?2I`2EDWX/j_ Sj{LA`*mĻ\{VwƼCxa4\ZiȟdQ&챒>Ra;;ǶF!2"AЧQE43@sbϖcM9TKsa ͒ Co_|Ҟ4#8ؘ۶~wqtE{8H 걅10a%˻Q6QT=9[~sp {A#) .P֨nLN$ I!S9k7\wĔuz}"ev5%5`γK.^GN$ 8q(6uS ,O1\OS'{Si<M̷lm>0y1Zh̊aaɕxߣ@}q]5J1vjXƧVnPD kPN],/܌PǢ(1|\7IftIC}$\A_I(˪U={jѢe3|;hۨJq F"hůY|ӁgkVw Pq̮PtS ڀ,g} /o2b捦f)/4{S;@J `$?xU%o0a}BQ{(&U`qP0TOnBZZ^m|8?]dX'Co[|ؾAP,_iF;pH=9/lu2~O`= ܙy6 .L+nRr27&# W8:+uW% F68${>JݙfTϰe M5D\\cL;g͡"ny#Ar\4ܲ3RvQHp-ooxebn;̡@i5&Evm,}E_p8CJY06z(Жdz"#JRġ } ?FSt;f1Q=Fɾ/\K0l[ 6nuh</t4Y}TX`j:Wr'?`~7&(>43Hœt@M!}5Y[oH6ݥ'tB;Lm$>[./BulJIzx|TzOg|ך}3]ikn bn6-6%y"/LfLPlRO_[L =vFi22Q]tZ 3JGy$ȧ\GM~NL zxjC/$HcjS%'7S|Dw[kUX|=uĀ࣋lpHp|_D|twus+4}O9ֻ3!ĵ=zW(ޒ+jpVbvlQMpI(Oᱫ.-Ov+~p/Pz ן$3^fnzMU[9T|*uxpkdTXm b4  &}%od*D q90%WVƸ^$ťranH$|,%] pEgņ1"v'%R)j[ڗ}*K]u!, 'ư|U\R(Vt8BCKʉXҟmĒ<=m \ 9̉!;TS4+{t36Lչ(n77Y_/$JⰾnXHXU{AMrX%A&3'v9$X50.Me5񗴇h G韲ѥ,%eNq/ڟE5U@yxEK_i:yrWY{_05A`51sMi5ՇY>'k{'[i!k/b_;W߲ {ty@ -WyKi##-{@KKkT<5ur}vPMeGjƯD'Z.acar) }*D>$Eƀ?0M2ZASV>uWD7 *Qo 5@ڐ}\kF&LpaLPq''~o;|j֠{?6YEN-Qz\k^Mf<)0;aܡT9N'Zo\̴V3Kܯ@l̹W29OAfΞ߫tr|Hjq"m&FDeҌ}[rK(k0:%i`<NNʦHP\T 1AukZ  aw _lK=wGx-żJ`2Fm qߎH{V L:P6v+`ɂ!A@oܔ"C:W|bC*O @ܜ6^_>SR']nǙ" }D>'q>{lXL.s8 mBJuUǯB$.ݞl8ƍ9!xugr0BzKgbIG.₴O?nZJїKc7*rT-S1l/oӐ 906<ޱZpgJSEMpJx!N | ˑkXgz'Z^uo9t] ~i3"qr뜯#ug"'BC'Vƹ&[ƓKGfsdlAPqiE:ki)+iAG8!vY4n ujUCz Hc]<^tȵ_){$<]_kd!8N6yZ=KB,'Y?<2]n.2?_|iE* a&<\zp9߰/U?ZlkC D9}}m8"a9#BId5_䉂7Zkߧ1q7%,f_O u|0)75 H2gF-H#7(sȰ ȧ^ތ8 !ʌ5Ί03i=uST91~ ^ÏIDp#"X@s?}u# ]Ҙ@3zڳ嘦i; %0}GkD!ᯈXs5$B Lc(vt ,K}q<cȺYE+ dJԘ܌P^}'Nz9,,>Ks_؞9CJ l,[.Y&sKZ˴$\\UXp#->NU;b|dʯ[fD%jt esu"Уw6$cԒqۆ)t=7p@, 7ð:ubSkcUad:F;~)SԍlɈ}Tϩ-+6[ԮoHyL 5Mc ޙO*lI+mjpJ,aeb@--Xpv _/6l 8yR 2|*52ŋ%H85‚J-!P |bޱ[:C 1,"1ڬ9IݜR*2fG6' !~y 7!+t ۃ\H)0y-|N .xQ9Ļ`jϽN/YPF„Vw|]9'evj/odX2̂Y I3"cM2gP_ط†2<@s?Im wd2k&! qKT> 0 jbB"Aș([&cLj^Y~Y\r2* VEJr`,DE=$zԼ:{LM] 9;Q+MOн_*Ȋ~@nDco6 $[+ѿg|i|L f?br-p@JP "?{,Zde95ٶA"[C Gx5N>[&ap {InқsC ıO ]W0eSeCm\P=/EWgp_Z^L f۸z%LbtF4.!?8 \ZfQIf+6>F>R-ޚHܨQ"(qj r[AJYcg-ӡ\!Uoj^c-ݠ,Z<Mi iǰm tSj[,Ԝ&鬼7+՝ k}t S9#aւH1O8&5Y&b ƆE+SUՓsy{[t󛪮F2fY,|)Q!(;bRsPQ&Ucflx5TKwPC7.)r Ha稷bc`_O g4` .TA\=C_,0ɀװъWxg@('@V:ePaXt"P7!ȕ%iئU͖ZR! *i%Jm/QqWn9KabL#Ol2Pj#.3U}nav@8*?FALb"MH=tm *ę;FG(NaKvW;h̲*jnQ?âD>BSߡ=#?9q 6aUx;Cy!YhBBFY9J {Ϲ:v|( t9x, zIY XHmTⲍ\g1ۮ4'6Jrh9?}fma Iؒ$eAObNZ"Y0GL qw=I^NǍt3D%L~l-*0݇/ 5~>s}Z+Mb%Fb B,QFgy>5BH,y.| |+bN^tި%@'}*/Gu(WNC:#Ad=C.qNy)P,+VK [xQ߈@ - 8O9F)q,+bm@)Fza|RK'M`42 J<{ a-S* IR$"n$%{Cd#TΝD1 WE +\pYKNw!. s|$EÕ@c֐/_Ugm5h.$4ԍxts'ook$][p(c`H]T~(DP? 9N?̤ڑۤ@%,^2ՔtIMG8&(g..(0-EĆIN$_1./ުD.6G'c+4=NnK+\Կ?Lr#T/Dϧ4ŎEflk8 tƤ1TI}:$E* ć*ISSN Sv*҉0rA@@tz8!g ГNX{e?-RR C/Z>V8@"s(_{{JX좑7C1ff0)%:Kd6ъy $-=Z)h t(G?,Gtgh۲"vѕ+2\g0ax;B&vlEU@iub 8HexN8l %;y$BpՖxAP$V 05sĔ/nf8-dJۿYVUNcE:dXl%u~ӌ$0 đ$V<L&b%3ݑ{96?n'0ң7ih2ٱ|.U gX|}R9AH:'JMj5v>!cEI̅W3<Y4c?vɽ:o%(k鶳43BBytNHڰ632r+ѣ DlWڍضCkzv)b4뒓Ip˰F/B:j^Vɇʺуj/'e.Z7%m41I#όB?y: 1̌63AYmvza>e3s'( 3l#H;P9|90vo4IJǍ`mybfx봑# N껎ߔr G񛦐X>X5laa}n4dqoo*FӸTTukqUsAfz:1[ $XyHW":Ղc6ס =[[:05:) bdwje@PdSƻ %!j9|RR/sX]U<%ؼ18!r}\R7L?-̹/Ӕ嚴V oC[roЍ3Ac#pG:Y,Ԍ,f5+j[sW/j{8xG?1`a})`>Z _ǚdV ?\VZ)rβc'oE]2{~hs8=9Rd́ <@w]$4+pݹǢ0 c?P 8?b͇c^IcKi]&vǘr)mO?([M6ZL h㻭M,wL.K'2ՔP*4[tZ$D"]!TqۀZeU_"Vp8gNh݈p45E(UnSN1vjNybz­^R(t?"p6}: $= f\wzk;J(W.V[Wq+J/Uc =AJ.do9Bx|ZYrxwHixp3\J *UؘM{N}׽{D)E훳+,sUK%f5<=w~6;2 b2T+ ODM^b"dA k%: }(c9 %8[E_u,g(D @HfBEʴVg\h9wi+BqC:0 QɷMŃ^x$z{gfܠ6 Y߅_$ag޵xzeKvlC`M pǪS  2*{xakBs,De2sE U}=TͼW ګe&fm(i44JXHfѵ< (9dQ=@a+S9d*N-߲H=grn{Hdy+M-v=YVŴN%"CIAcl5V,,tOТo3& H ;윧(Sjqt|q m KGVI{mV2{,ˏ?Ґ@ALO( vصۙH'lKܝE z7$w>{yS/ΈՏQ2N :ſw a0♳0g2l;mC *. aʲtEYi\ Hx@՛(&s3 IR80GX \XP*} PK׃}tIE|8Jޮ<5ӏ`7eb6VA;MwDE.ĊHgE˗ CቜY8F1sHVeP45<*2i䪠-#ʹ}&W){;KL;"p~@@0HuzyZJh3) GK?q ~h+ڒ tאbQY">[,d?[^Rb@f;DL{5L~GC3Lx O[H{i'|D$^6\e=FS+}l'|ئ9Doya},cGd7+ә8Mi^fp[VVA솹Ul9eu^?/{c2Z#a]^6& Iէd,Œ6b\ky!JoQ/WG"ŗIE٨gY.rz#(UqƯ+qtJn|gp:u&r8GioMSsUp/sqkIH_&ͳ 2_6r-tjy]곡*;[ pGs7~yl[ 2rzLʶEok15@>]Ad5̬#cO4>11#_n9U?LSFE)hSB%+:,6Y[y-W/ho:8@}X ʺ8=<->aӜbی͆Ors1zA؈<0@A8胈UQ*Ph¯^90>(#Cc&&Hz_p 菾`{R윳= EW!"8b h+{Xi<9XxW?ğ{ ~ -e[% u/2Ç ls0jzԓ:hV%رrƯ}*[ByJ?YBi8hXzuaCT*(=--`b+,)i~|_I6lj!o-F@eEo"w2;ԫG@s˔zv&\N.Jhd=?Nxdң^q i ]rƐƿ3;/YO3+C?UƵd&̄ yI Il@v G&#uXXAam#qQ%%re/_f]n#-2N!z|D|Q2q㓑cr/LA?pm.;QH^n64̀!;*XL&.$tE{֓#F)3 (#Uw,k> ^HbzȮ}s`3:ɤAjLt' =2\9fxGRc-NٳU|xWWezeV卄MMC]<^;z6B(LY6Ҷ\%*U[KG Wʹ3T(>G |v?dtqB ΧD'l8ABae$Y@slBu9n"~ӷnn27^yc_m['DnPߧ*\+p}*1Z3._{tqgƝŖoMR3BS,!<% /TAsu[fB2g[~͗%Λs$p+\^bTSE͚u'é雲:O8-Z:2a[g!!m@dO˛48J m"Bs._+}A6]_6n4=XC=[=.Ʌz) d"Dbh$㟬(.|VF$RD(AsȌY?<X3' *\;b'xc9$ޯ-nEDWoWWj` m/ȈOjřH޶w]g|pU ]V|#ALF>R !@:Xiti`kĮ,3[ SJjgv#I:N+Ut'݁{Ȟ/ 3{c+4 XiQ_y<߆"XMQ@qc&CHM8ѯl7^L.&{4Cy.9o, X;X#dlcym(p9cZ= ڍJBC_ AW#7hǸ$ZK}O#D I] Sv ݬkJ)UC{~ >BB0k, w̌ K6;1w еLTYI>yTȓ!x$:J(eo)XlW VwHm3;KrC E 5cd~cJV8o-N_|Awb!hef9 N Fd)G6a$*7ٺW|᧭@JDW>}9Ia ςR50%GL07,10͈ T>Ӛ(ɶ翯D"MhFDڒ#V.a9_5qi o?@0y˾2ۍ|ܱR2X\a @uSV&b&ޡ:G~Ϊ*zߧ.tLKmE4WIٲd\~ȰJkq)oʼn[ 2凜ުS9Xex'JXbYKq|17dȟ~[B{ c"r;esJubI6egLly ~}o>u;l/ =v*ZhN3;N<}4JJ jEI&(p8V p2H"W }?ID&\$#6’CizYҜIJ.50ix\=R\kإ' O~+'E c39*}ߝL~Áj_@̕CuG3Uշ!64. PLJJ* 9MP’l%/YA 17ޒ󦩑 $ur֢^ywHJ%NY14r)<}@a *w+_sGDY8PRܳjX]\e\+Fo -[Nn>Mh: Rʽ ;?x~8 csƽ,L57om:rb3*n `,n/VVnx/;K?0N}>`y^FDGbs_Iĝ2"5ۢ1#4˗\Uu ٜ!`pgGh{7OnATfo۠zk8|ORA\V$f_=MHas@d;k7m孉xrt$a)&1:6/ijcCB//T)I}kx1<ӳjU7ۏߢƲcGfe(:+v+O-/r2Rq9{o3=3"۱)M͹/B&d=7:'x:`9ͪ)\XHb킣Sn T<5` yeqa :qJu_!'<e`HRLd$M?.7Oh Hbkhd3}h/ƞ|L;,=a[Jy30VZ tts*DI#J'uH崑UF˜[#Zg|ۋɀZJϕ< с^O:%5,h)#]QGe|;V :2Pb|赑AuuR78qhO=Ir qYM咕7wHbx*5W`x"kJB'q֠NUȽbyݕ^ShtE,0'xУ ڤk05W-W1n0<>jn$DrZFw" ~j9iCˮWR\2ėMcra.b6mЉRk=Ҫ!ǼI)ZIB n:DE!ò3xzj71ͥr?Z$amtjDګip?rQ8tg" -*6]g;u 8` M8V%tV@2m+a~5H2IҁXHa[udme- 4 ۥ*)#p gh٣&S,w]o1O t09vSûcO6`Cjb˜4oo9 ^9(y}o3pZT@eA-Sd|K\vfH6|.Q~a5Ltswc%خQMiIcWiQe?QE)z=?z)IIw>zunjwod[ ?P#:_q=aji8֝=uq=ُ*+w=w⃑av.D$;D|D;PW]N>j'P{N~lA f`e<\AQtl6ILڻ+[6bRjp:㛗==<:Ėݛw;ԍ82 gHR?|EsQt6#>0Q.8'>LmA&zkZwJ3?Od.# )~`ӛ$ʠڢ2Mݍ\ZkȨS4HJ(bzd[pl{䦬LDoZo2DS.V&6Lʆc-z ]ȴ7O!5MDL5;hH@R1<_9X~=C8Wn>1j^lA d( O\<ȞV߽=u>b1sw(@F*sVms;\2we.!屏Wy3C]Jf2}QC@(ؑGsXMN#Kd= xgzlcq, %E٤\k Fq %SR-c 19Qk&Ҟ\}LuVZJIq`CeeXsVtchAg͕J)I)qF5d]*q8_IԞ e# e-# GV%&Y5L91*!]$>UñL漢Y;Lד:nA_E~s:5qvIo*E#w$sdTqxFѩJGYjO6ڵhӍ . }冟عy5ጫ`'ۍ4ip%1UOA_Lv#ww|#DhzJی,_QJ2mm}ķ!BS1Iv&cEWKT)XR)n-QI$|mjW@]tw%Zomӭ hĢ3~윅筲vcW񷓳n zuu^#'K}Sq_z:cHڔwyu" pf(9i + 3TO2 \;!BfBQ^ӏc>,y;Q]wOIJ,b>б &s߿-Oi1dzU^5䒊q_8˟Bzxb"N1(i5˻:gjJ 'Nf7:[ՠqRz\hP_p+9Ff]4iՊrNpay`ìq-9+tA`JC՟@?^2`qtRabKL e1dT'@:v aōNr ƔH/D:3 dJpKB -0ҏBeS-1kzJΈ[CB/TEᙬ 0VƎ¡|!*Z?,mA, .|Kg(pwo*cCaȂzRsJmGh,R1ƺqТwHLƧΰ/W;boG:AvP(bU]200673~ ډ!כv]rSv< E W⮞qj|-fc[2@gpl6Bb鉲׵'R3a/a9霡ۓO:&usSY>ޑGaT9ʣkӦhKE'mWgwTo-hHASᬷBq X ԍVOŵ2V?IƧ!ʄ^ɷڽk&O=&V!-("CGt\m+}KQ_T~K;̮&^3e,xZl;-l?γ87͈[ׂ)RK3=sX&^l@:'Y-/C\GbMdE)K8g@W D5mk3MTn@IZ]\a̻{=zawo1h=GRk[8Zҁ@- exEpܒ +*̢$KBO:pRܑ=zJHyD3'I5򹥴miD␏DUvѵ|-f:HWJHUeyFmUVTݼ hkzu +Lt$pEY+B42w_lGDhm쑓fLÝ;\8l $r`hU#aG+,<5)خ!(Ňe"zOI.%1^2J\FW4چ܋f 4Mz4,|/,t$hY ȡfiZ5Xw>'xԅ o˷M>ۿtc'JL8q_SK~be߼xeИ{&plT_ZY){8eXp9DUJqeRAIdJjXW?\3|"zˁsUTQ `o7VaZbYžpV(3Y(T,\irERBOY y$*R | F$TS<3F.ݾ""DbӡS4!) #\Jz?ecU +/1;j'ߔ)kɂFRvVhڐG^Pk>\_<1yغE5$ 3Ps-'UJǰߍIqF#6 ʹV }Bma $7uM r&J5j].^;B_l:#ƭ&ret#vNp믏+y616lR 7!m\h%58\4d+gu>y}CwwH26y|[;-P+m5; |pi#Jd&XE|JZ*YVe Ly8{yDQһuyp/'] Pvj0)MNnmP mQۡ^syiIJ+_3WѲ\7$̟!裂 ++* ꟿy(|W/`rYKt$?55 9?FQV8,1Iq#dO. K׾iWjgf]CU @=w~MYԄRovnoXj,c&]eH$Q6*O@g`gUoe9X1( Cښ]RWdYHyׅ@G:>zRdS[ۣ B^4N`ž\z_.RσVss Gh{W6E3$UKN ILB' V/=$k)WRc4Рp-K0c#2P˯n:Aꤙį3C6GP&oHd"`& =G92A釻N34 =wE;;1Fp3 XpPR̢}+ӨKѴQtB W`.#Йm͏d;HՊ @~%`0j4^IeO Tn $eN4gX}):_8{{%Zt }jEIq:nix ǼC.t }y9vhCZ>@Q^@ks\J?8UrQ㓳z83;W=W2] NDqiQ2^<I gjPӌ56`"X&6~f}W/5;/ e2JӟY 2%H%aX+vU2V*$L}`pؐmn[e1 6$jfj=S˺T K:`v22ޤf1g&58xD&Hp*B[_CƙTf@(9Q=c*JRc&9#@ɇ1[mvf3#{Km"5*,rM806bG*(z *3=ז*4$?ۜQ*mH;( 7F/2J cվiOQbeDD(0Qjė,NPU@x ކZI]aB gE,zjR%3]:KTmk;N lboξVLBvVu45L+I;ڛ0ŚE;ʯiDw{PDr 7e`=M1D. !h#rRѫY_e4P0S6Bj0 Ja};xS Zrӈ=½lLLKa < V(lj,+˜)ޔhPK&Ɯ;V5q^W](FI@Ftu]v@2LLƌ,ّ!ؗV-u:y rB!Ne5Gy|ȱ{^t]vpKpi!FUj u|n@Šp?%>)OK;*D >chlO;]a<=f' .1ikfún=u"itp@j֘5-3Tx2đTn͊ 1hj191G$+;0GoVE)R>諨eM}g:krK7P o`(5&0 &nyсAk88 +&xgmgb)#VL@M; }gr$Cً U&9':+N-4b0*S˦d9syX‘pN1:1Y Y/VVm/f?wςR $;5FME?OT7p)|b8ܖz2C'q1DJewV|~h!z v2||v2U闞#MxhU5>gN7)3.--ۖvSj+|v&k89j@Mm[ytFC) gVӵIEp\6yʱ^eoḧ́ިb1c\(APJ&‡c}l~UCg'$C߲TK4 lI5JX 5WݹzsIҁT05fXLQJa50`܋54y}{8AD,\V%J5!L~:-QHleM!Eo`h%؁8L'"ܨ&#)׺~VOV ʢSvBx,R\M5GNCďn)p%5jө]1Sҵ.YlsEX ?ЉȔ$GA4`\Mؔj ʸk!|%v*1.5 $m=s<~U\:OX) <,[K|w2sH >6̓9(|1n'roaZPM!XˎuS*8q6P C)kL%Fo!blTli;alU̲ ق.hr=Km!Z\kxǠd*?x:lU'j|Z}c|TɤUTT:%Rrj103\|0<5YRTjk9DzH/h|f |Ζ:D5=mj>wO!YRg(JA x!A O^}f?QT.O/iz4SH9_רӂMBb60 v'o*s]OuVx\ZgW PRR(]diK4' Mੰ̰Qe& w&pc1?/&⌂.V۫2VV;q&?4O^lzU>gVD ӂܤ3*OfMw@0h[b_B=n!I,GDW.XDg^π5[`ь:1Zt 6Gr6iq">x掉Q-<@9@;j[WyvW,0PRQE6M"RTR (HsÆ)lU?݇A!~+Cȴq[e2&Σc1Qz4 dt*~]޸M)(=ŇkR-l𐬆goy{]j=7rpmDC. \r詧b7O[ȳOX3q_o,{ ec3Kymwm{72:URQ]b^^wy}~8;(@zxQ1hR($eܠy[K~w;PT\=Y.M-ω6;tfy0$ G;N_9_3譆&[v{Mp{p!p{8hR6ϑVޒgI)ʲ6V5êIOih^96GX:RFz+ *'1T(W}/}i,jQ"_69qȐeT03޲!2uמ% 5 *&>Dғ4UC;2 {6R&QvbuҎcH|0=WlE_Pxdf>}vbhkH=>X&1Ki,qcE4G޾&3+C篌hpS\?_O<ٱrY> 8s9_Xj(EvJp#BNK2p(g0Td~|nVs<5k֞EreKi #|͛>lzCpq#3 l,+:;p#v.!بfE_GVʃ&~_Z[:z> MſiEV7qKfJQ%W(pŽ hI[!ה =i)zJ:#G9%@GV jzv ر'ǭXIYLbn4Q~!gTĹ%QԨG^5 8*e'E]e_KAFR{Z~,t2ElːHok_ fTCêqboH'1DYf$is1 KN7 4y~P q8n{bNN\ <[x[^o}J rn(t*h$ f=߹ϩ}8#" N%l`)Lp],Aq>zlz܃QgfL->Yfkd3&0, V[79ZzV@pCK!{xrV51*OEQFY7Ity[PY[[8]m(U :$NްY{òk<$ 9mFus7W:%ERr~T=Qh:I.W1qxgl:3,6|YyKN!˥r?jX Ζ cI#gڎH5ͯOL9G%|o\u]Ċǻ`&o!6sb2d N#.` Sβ̓ =7JÆglޥJ/-6\O0[+QIL( /W>qUƘ20h U3'g?N+M@|=W1j؊VeI \^ &g^ Cp ,,M3Wϼn'IC-(j%-Bu'@he ̡t}õQHu{r1LQ ,2Nw2⤭# 1V?Utk<τ c`==Fm,$ 8o5? HS9U>mqLp}(q{墙oVG,,*O<͸E DT1K<$-#,wxblT7X? Fh|ĉE N<:nuv _)Jk;).pmu_npb+\q5t?$zw??j=k晆K?x *;IЃ_'Ke#Mn|rQ\^i"\`>26*٤poJA -'FFL24\ѽ%xIR+ 9^7]ǔ.MnxEoAa{mZE^OD`P {Z,iQjAG*4f~<$#2CȘ5728\ǂĉ$8{$"܎ˮ[v~yGZRC^э2u[u91!+?NI_(\z@6/WQ2T*,5t[Wdh\,H7uQx`HCY>M5twl~ ?*syƁaU;x-h\֥%xQJMI F {05Ǭ(K=ЎתhyRc0'Ӓa`ѵ?|!Q6黎6TxY_Bg"VLo[sbqOڅkVԖZ-Ȗ@ WLlPo["YM\GBN ;!WAb)9- 7_JTarT g=!EG^S r~LU@PEC 9nŲL@j9hPiBWMT|%/0$7<'oDGC1)=/*|84Q`]DiU-G)oLmoR# }@0/}tyHOVrxHLTgc5εo*K(K_ d4T2,E?4fy}M[JyD$3B#-bAd.Rx?+ F|Sftq)W7?11G9y,(Zp#sP]"?Zګf$i/^YZ++;%{y@$>Ls}3O:RJf)ܤQ5*4wJک1M3d\+>i cM] e}\Lx@:u7َ \U $x&v?o{-j.F^J݄w1|=y69ωfpɣI^O3g=`4HWt^Ş3({RA%nP-VB$pwJnBvVA =8E*8GO?8_)t^uI{}(a=D7u;|jZеX`4WrH ZwcTb+FM8ҒxW:s+fdE>Z58ue%:PP"wlr:L ACF\ņjguq??3<49z wAI_UpT!fDD3r8KǬq/#:QOz_@~KWѬ娪r*Z.w`=}1t ZQZ捌P}KfE mKhIEo 6gޫ"5~ܝ~Xyۉ:o\zɫeP/ᵰ !h %w BeX6vڥħCS<hm6SNNnAoclazm@K@D{ {E~U޴yCN[ ܒHn|ZN9q:ʟ>}|f^fO7[?\k sR9\\rV.oX;}NɞHItFz FWmH Ux@l]uO.MSibc'@H OLzoOtZZ^:Xk헵$eo-bmߴhI#3.k,T/Z :9/ t>'׺` AN*7qT4r Vtcu9bgbW]`!kóSY>@Ȁmbuw^A{[=M6O1b3OT[˳K;o7q9]s8<ռ_ `WGqw|MNg|I؟$^lJ\v;-ޑn.kՁ᷶{3HWxNj*u@;M?#>"0NO]ZDĘ_oyْ9SBN ࣂ{S<MU*\QL@tzH TD. O pA}¤.>)/GyqC,TT~B; 'cdla(]_Ţ`1?x^]3*}4O-rӘH*GtW١;nl?w˂<\갍׋X}NRp_Z ɆdD'Q<[԰6+0Tlm;_џ6%&\9c?шr%@m;evVw?e'\%ɞk\8y.JuC0zeYʑB*a<:TjXih@ٙY$;ɋI KW~/MOls[n1i<*L#Haag|?*o*rlʟMPt1}n Of9y|d^HZ۰puP)vr+"M\UAP?UsvV]pCJLޯ^C>u^|a~Ыd=VڪPx6B@IÚG|VW\2/||߉ ^_[\î6J@R8^gr%%`̱-5*Fs'>Aغ^؞j_!wY+;Mnll-@WS`qZX$kw=@`۩tޖοr7X~XH>Pˉ=O}{ \xh[}TNG(Hr4kK{EqCe |W/Y໤VazuQi$h!Wj9tVNztoD'7:Z:k e3㼆Y֔ sa풋 "mL!&vL h2Xzc:e.p|ݛCOJ7FMH)lñ=P76.۝>hUbbߡ)Yq[ kQ#*ة(fVA55ƼIFAUPPOKx\*|6Jzܙ;'LNIE{T=e%&A7K+jR ^8o 9wOkfBP鮘UB\wC8t)BO+q:ts&!Srf+"rii^&]zpÚuIcycHi\$(;+#;LL0ךQp䧚C/>j~GěR=zN6J#71jTyY ܸrٕy[DTZ8ם0Qi^w+}6^Pcw2ZC*G4Ց^I]_:{-23`DIDүb8ω_-βglzA[HZ]qhj)yZ~\u?W<=a"vZ5hţv#NΌi7U!\0%ocٲ\q v=?kX OzL8-HӒ~jPp99b XJ! ?y'z-hHw)aWvKZ4p]Po߫Dibgjsyd ڌ<x> BQQ-r/+eUyI v4˚ +& $0|ŧ*M8'2?GEW0}BG_wSmoBG0ܤHTۀ*XbWER8ށ劤 X|^ \S?L~'"cEq ԞzlPUru~811ߟwÜU,QѲRQTǩ\9c@[Zh҈}Zdw~e(T\b'&X[L6ZRɷhDk" c{OLݗ =OsMJit' wt+R{goO*[ՅtgEf*bvUc_p UGoBN :jUpɱC}nf\ȎI1 !^rE UQ سW, G^7IJ ٰo$ 5P+(ق/E]_ "Fwv*ؿՃ5 Ё]dk-E,$WOWŻfϵ7{"XHؕعC:F0ÉA'R3iT()sLJmJvss8z^7C͈!eY _3A/\fĺyƢ +緭yZieA]!OCΫdPNK8p? e%!)6Gɑ=hM Y?/KoDmRm?Xwb?^o'`Y hr(A:jHr$XN+ܓ2;S@^E掰Ze)LԪ%$K~z(̊SʇCl Y1nbɀ/,{Qk;#tPuVUY.%K Bl l U5}u" Ť, l`=Z)خI xbiLg䰼\I\By /HEtօ%(%\ i>ME[/gOi~ Ph f&(<#k-M!1Vv!LG6VSىҁZ-$;s2Ǘ;+Ofj<eٻx_yK4?sNM0[JڷK{=rxD9ZJ 4 Գw}VKbrVewP_jT u2 }փ@IމvGvպ/9*3x`СC Xͽ9gggY*ia 1_Q S*})ɭr7C`7QS3'&1wMd!F3" I.D" glNx筂TG9BJn:t}'\ {;YNM.|d];Y֯!svSTztHQdҭ\+ mHl2>mu6rV$z#cC9+VzҫC?zjppʠ1eU sd4FZ K% -`ΰY@K|gO2O# ,]G`=x)ϰvb @DEճ}+l2HE35Olj71e) ޘvBhO&)$%BnΓHF@5)iLJ;vE!YI^ 4D?W:CxNB$C捓DKQϋSWaHOhR);7V!s@L++#f_4w_ "z`Ѹ>',*}U0Ցj:@AЮjw~E+F\hgFߌDe,2`KbfKǓ ˸n)@js{Y;Yf.pNt7 +~W{YYCfuUeqKvĥډ(}n8Swʘ238g潨 rl8vd )=X?H}Qx g+yb=.uL%d/4+J}r %Z-I N$fɝt,x5bVն$}XMףtu2X⪀8Q_n7@:xQvB:Tfrl]m$3=؍ @@M3R6;"Gvh&2R:pS$y6ʯ[=5͒joq!m+>2x#٫O_ l܀Xm5"8(Eb2I/5œ3ЈӰ?0*_QQl$ O28Lw@c3z /ϭxό4|@P'. DP+ ٺ:2~hqI{ -,u\R7-p8@fNKrJŊpd{Ľh?p${_\Yp %p*-ݶ쵙 5ʹp LHfJ37!Q0G »vB@עp"Vlq) U*8p{OqxfلMAjk~4N0ׇVnpᦇpd9V+9Ò-}k; ;{֪ >R3aˠH2u)XtYmife.#>w;ͣOvޓc"agei;H8(.sLJǸQEi; ;ܾQiYd lݤB곘p7p-SZs1ս GCȡ*W5w·8(!5Gi颵3Y0t"b/%]H% sOH_`wd{4C?̃ϪRl-I+jޯ1R,n/[" kX6Luf'Ciϭwcf UDiLgp kR BW7Iojlff0^ J i9DyKV 6&-,I J@F:K>ßRvL z=hLrnNip,1? yo4"TS"LkD( J.v1PxLoxบA۶m2P)Kt".E6nX[sZځ(fyf`[Ei[|cRh$|,I,Uszx=ŏ=*^ EW'RŠ([Kl2$Iky%Bg:(EIFt:[' ũGnhgzDqh7344nky⢼hz4<'Iih#}eM$QhϰuPxLy1ZpWcyA%#V-wOs# [B'Dck#>zfH_{|t{8}M8 LKA>}ÅW71:b۽)bL l*? wEϲ5.G.O*XMk9QAUȮ\j{rG M`97ԟ8J='͛Ǐk7+He_S(֨U΃3@ *׊8[ j+]J{ܜ>SNIVF+A,{pJ$y§hUtԧ E^ !n` S yr^ -z^gۯ˘|gctԲiuuEPֽ:2_3mmF~CN0r(N5Kc:[SRٕG* J6^.]iZ&IEjrF_J28Ir ,FmO S+oiHKIFcQPy0P,F$-ϕ.쫮XJc(Dd{ , Abd L1D|5cRktP -.2Q[/f|Ki/ '\ܚ YnmޯIp#O޶ >1SoZE evI o"m4-oN}@rFW4U~̻#+zgsoh#O̘2Tn1sńT;EH |"%oD 8^xsy!%A<6 p+ =-G©=Eo'fg[ꗅ0'n X/NOᡔ V&'$ d e,r65f)ce*%V_ S (~YYOmrZXlK#^`8-Ywg,67_g042k.=ͮs"޵"ɗzuR}:ph/Rmӓ#iwkej9 gPF/}*S/ 2LO6@X*'4xGh!_"dù{`scP#dSƻ4<_vJ'S}ѹw}y,K:Վ簡gYTU[H\Odz&SK8Of@(J bj3R $_ 1A=>gr|WѬ/3ģ+ŷSmOxkY3^ג;77f0">@L^ vgfRn f<,5{XGmrbjjˬ`1o9PCU36ݝx)V5zВIjLkB(@-яR)$s>Cڤ#Wxq~Th2MOgWP]+ Y? =< &C}6}D2yɱ{䯤1|ݼ<^<b$ 9uV\ :ik硽iq /[Sp0HqC7=[aX!x\P{z|~M䣓Ǡw»pOjmKWn Vƺ$u|`  df*}xLDÒ'^C,N1H˓5樋 lHzsREC]"0h#,Bf5`Ddb)EېW]a^SměGetJmA/Z!H58ո{cq#pxF5!ST8u(+| ,XDZ j{3Ş\nG3SCG֌.Eb؊y.EJE$ Xu])y6X\̫ A6逋;ϊ jsiՁ^%56JFrq=kXO\v '|pKgR*BUv0 S#Q7~4Z:T6Y^n֣Նa9{ ش":ۺKr 9܊+ >\ہGdۋ}t&brx]!? "m0#@^,`[{v'~w?vlGQ8nj~]K*''_ޑFCT3?*Y9pn WAX~>8p>Xn;Xdĺ@ZI^VBFREhʹ+16C/bI4Pv(njLRiS4 5{ U#H9FRTgH(E9&^!'ě娈"4~8-225xZvhMi]Y JW2D+\Fr>&@=?\8/W?ǰ'!o~[.ڒp-SֹϲQ?Вhb*BfBtl\6/`:R.Q/OY(ܨlrn,M9y$94k74 ޙy%5|-@d͙I*l7Z!B(HgH"m#6N_^5@Tyw7d$J'h~'॰"З_l۱6v%64r`&vقX>Jt ]Un5p Gảp&2Q4 ^ÔV i]\何!##ӇQ7{H#)NT3sI?L;/A:t|'˲$g@_{08֭SuB4LPwl7d*%3Kv3neekP;$枛hDڭ #awl~3DU l0]aCցwV -q1ƝV2J0X!lX(Hӧ~o*Pf tbIJ0]^eh[:|!oGe\mukMSĨ%x*CARn0;]Uxٳ{?tmՆ.yݝEO5l!XV)8quC6 B̦]Igs9|fde֟P1 kFfcˏzP>~K8{h!t*߱D1uaĺ}X֭H"`ΊşWiDN[#SrM)wrva˹E7X6(ߌ>5,/CO C̗"D?Y4ˤ,lny5`MF$?rթEHM@S$WkejBwUMH9R?#1V]H_\ϟo9mtd_\X_ y5E_O {FNpufX-ۻ:҆`;Cl 朝oHګ+B(2Bp!?lMgؚL$w~I!ÛKT`%~36@A臷ʛr=V9[eF &f;ɯ:d۪~IW:u5ӽ"FY{fF"9A;ɼDm]mr T_ć5A  ~ #QV+-2t'=?We= Ư3@qǂ˭/n#H"M`BfEir K ݵpzUn ftva<;grTӝ. c5n( /ɩf"ؠc' ?}w!nz^3H|,Rt6áf!g B 4s3sO;WU;4Yq>D#m{ ng(MWA)%USGn:Gu+"&y/S3(z<3 bnyje2A}Y뉩G}ABR>F2sӸ-*`*`IrôplZ[3-|$T DGANa=(s6n8:*|{KϏXfޑ'pwW^踰Ǹ߃uwpߨTAC:NM@6 Ԣc2miƵR%Q d;B~/ F͛(աgVxD-rG#w؆%J.2w2V_;mo27V1ĝK/LȮ޻(o+-dGՌL.l<4q,VBΊLZa|A632sz* hB.J->jd8g3'q. s_3IWq83*Zi(/,y*wo0X{o?dЍկkx?,Sܟ؂O7EuF17="ǞHStFgEUF]* bSUW۷|4P&~~O3q,Ye w~M~iɡ׍l>Xww/!yHĄ ؏-Q0꠽sCp'qlԿ<03F2J"cr­(,Wl}&$\QEbbdOm>R5&.(An~U9A仴KUՑ ^֑RՑ$H+h'A垺 zI7h .mNզ۹$os mg0^zGdjq&-ixA۔~m*:`]'q HOΕ6c9,^RMBN](B5) l!9V;05 K )xM${D A܃=>z: p ]I9>[ѐH3㛡ʮ:_`_#QhQm y@V h|^t3o6Q\򵑭ǿN֮h߂-Rx&B_(Qh{;Y\tj.Xe #{XQC w.LPրϧ~|3,-檻  é͂`ulk7MPLS";c}l4qFcFQmeהv@P}^ZZrb_`FjXlbѥΩ^ODa,ƽ>莠 oA9+$[ʬsMu)ȷG$+s%r8rj!0V R~?ȨhXLNC\X*!b/- zN\0L+Jga6qDž /pI-#wćg<!v?ݦ.:4j\0?s"U#eas}}MxR-k|n/u>,]gN˨"JufqiRbP=~V4pywϪsVWI75[+S?wؔMPG\ja09B񍜶^; kZ2nqʼ2dģY##@M̷hTP 50ݙC>6>LTۺj.- ]_Yb+4y}ɨ?"arJfQ0wl:d6,=[ wܭϟY]e( ,StL}P?7Xx,qd3l3,H Y5c\~vUjca2]F_/^0<(0rEbyt'bv_ujW=ݒ_k:s.Y<9rlr>@ԮԜr:g; 1h7ʓ"@o&άl#} ,jy]NGy,=aW?;@X1WXGiEfO&M{N#Za snIkIp{J: ֐A5¯ >Yma hOLC ~ n8r?KJaY7]F-k碢ީYe|#J2RI鱂L m;J7]ҲV pU~p9V:JDaftih dR>m1K4bB*580Z+PQ񅶼U iuԑ|P:\(3L`ڹ#21}u[^? kžEy/ d~֯j~ dF56Aԫտ"BdiDf؉-O1U'POHGѐ %KԄfύ3<7Yx"J5Ji.,Ja}D &](E{K , 1ijĖ> ,ϯ$Y 8O4޹wTΤVg$S3EHMy]|jOãBJ u JQ}mƉv5Y k4ss]UֿhGcHĵ^ \|~j)+ܫ?ReS7sa 0e@`Kp;< >Rud3`3.38Hj?NxIG nԝ SB&kĸ=n:Rwf`c_м5דVPs Vܪ? C6Ϻ O?#I8guO WdCDm #dXL4 JV>s t4۸z\YÕǯDvVP6wW\7#x4Я(C6q9ڎ8a{'tSǴ2A>w,mIJSM4/ ) H 83,O|b9H4anۖ:)K5NPߐGPC^ ߳~$cṠTDv}ѭs4e3[K oDS~WEUgC-QmM8Kǐ;C ˛^g}JdéNP<0oG qmAA1YQ&77Ξ8LJ)5ڡ-@ydf^S WDqϣN6mnmp`jr ' F;dDwD[A~6AkSee8u2е̙N7ݨưvK 7`9by< AƘ>7V'P-$EG;bxDY~SiuC+9 NmN;x)Kl$e,]Ks ]+$͂ZݩL[/ 9m?'>,˟`(V%UUwG+[ IpfEn \32W~IB6. %s_+ĩYC㒨nNPCsxuV% t䷳uCծ6z-ngBGb6Pޓv,eLp;PվӕOK ^q7l`L$[>tiV0=PmfGMSL3mQkY>X6"mHC 5R{sTf{ĝ_f^KX\*x9Vf~D\XawO?OS-,0M7^c^ֱm[xdN?ǝ@v L_TuyV]Kh4^%dtmkxr蝢21^of? 8ؗN&+-ߎ%|D2Q&-5jB),BQ3T1-OO,j[#_Ox:=5 =8Z-:V#9~y$ ]%K̔E>?ZUٛHbULzN; XM IQd$yI|kuROCw8xK p{rQy/+ԊDkxvyf֓߮Z>ʾ {?8'x&}(ɑGLNiו ٢%$ (j{3@ I޻6@8.IPD@Qӓ=(1$߁ <3! =XgP殒R~`!m} y/ UjdMާ tp{#ݢ0*S;(>N&D1>GoȀd=+hFbH>Tw{0UoGʽl#q0+YVAW1.RӶ|VݙÙg%;w9y竤!W.tZə8=0jj`ęx!g83!~Q'ގ0zYͬoySs=!{IQ<,YSdӣz[RED Lq?P.څtL&_T; CF#2݂n7OY5Jv DF 䒞-+Ffk;5W|FJL|r`>R{otF"A8$ (=Zv= YIOښ(u45kyj3!uGu2ޣ?Y yѶo4BXr q%r5P(YX# 7h8G *%J1w7 o?p{"33H&E͚W5$"Ӏ&Pylj˫SH[ga>>8tQ%ZșlxӮ 0WDnypOBV[(t%o֜!X1R9˹Uh[:=>W,iINb@5 Um8rj58PڈB9Ԭ6'l[Ujl(F]SbDa%AeT+xgͰdrT>dĖ"BsӑBBG3JctծI$.Af=:O`\хj LVmR -MGO>|r[KF HN;?E/#˖ѱ.KP%t({ ˅k087*u*ۨ>f*t-V<-v\ܗ>J#m1De51nsO/Loxh0'l[Y$ b ntb쁦FeK{ c1)\J+OwHtV/,&vmhr,E k$F2J0uldrt$LwRj2ⵥQXxTw^MkUhGz󜱽ZqJ8(y{93#\ )x .%t'jjE܂]qOD“*6*LۙП INT~3LJy֨~%I.ӓS1dnS5]l 7io9˩;5A侢Af~-n |>\p҉{:vJ&T#hƽyz?TOwXBR5b:tD YbyCf݀IA (ɾAP6jӻeN?>D}. qm/ھbo~[%Ng#| #Njk:HkM3$ѹb q RV^Fy;A!-emJB(,^olqyZR4Y{w#sw>ԍLfaW6\eE9jQEN.B(UTH: p{(U]sg7U!rIыAtBu*rs B)/>v"(x,%R#-^m>LmFXMLM.u__V08~.\V)һ_G:Z/Ly\KWs/OH>)W%z qnkL3cx2j; C9{g%47lטk%h_ n<"rZI\|s5dL%3?f$1]xo=&ǵc$i2BPT [F۸AZV{f:aRaHD/vBvHd}wqk#YKP~ku}~F˳y&d^VfE`*۹K@hGA#uwÌXB8az:1+pR\rWK/-c^Q2'7{U't4hxd aK?2ǡz { NxsT6]7`}2_Fh+xH8GAQY3}'IJx"ӊ% [Qӊ4kC͚2m11,p;!AH2^KUcTg% =,bqYZ>X):ԍ xXMG l| ~3XLf}*k:{F NEE)*!tL(ҴA~ x2[ABQQ!ݼHy5&6X>.%>zɼ"z0E䕖RԊ pL(Hq"宝蔞>hi;~3Kj_@=*RlD/6<:ٜM6B^r+d'P~W$aӑ~}*ʼvW[w0{'>BL{⪵#tzLf6~@/иADq#q4҃Սe'Ooih?s>Tgԣٔvĸd責KFLtY{&r8W2ۀ`| Jo5:`isefʺ,e@b@ȥ>W$aS2ha2։y]x& DWjHx~܃/$$\=8eh͒VӍXN HeЅST4{.=/|$ 4Nߢ;+ZMy-YCb^ (vRqh\TcT>|m m/V|mzgr6';r2~0=qS#AO +mRT}6r oࢇѫ=(&.h9 QfE£ѾLFO"ahM. PDZIBA>zf045+x2LcVPVhlk֣|Z=՗&KHogxq2vSQsgt??J}FXթܳ`c7-?|"}I$mC? 4b-'FcMd(C3ߎ2n Ӿ~7g%Z:QꅧyE,k7dE8+XssW&ԡ쫌+~Oqn<^:yZ Omh닌C`gh7/#sRO XsH8I]V YӾRf}(O{ЊD1$ Avw[R}dd-ӂ/D2mEf`1n>׍ 35; ~l.GN0kk3i@\*,玜kUM˜rmf8b^:F&^an2&u ypdJqNC_8IcZ?C(Ă sSj 桠[tRsbd|drpn{?ʹRNwuՐ(O Ni̝]坆~_XB ">#e`?|exm9j:p ,%[Kf4'ш|v7K72O7eݲrmBKW /y`4 ;@T֤3yڥÇSpՙnB [uj(&\lzx(͒0jjQh9͚$mRL'%ypBEB}SS0(8y99àeijě5zӀˢ Y 82%X"YK[yZ6=܎#ނ&~&'iR#%p/kV4S00OX`T@;q F׸a@BmɈ+υ˄͙Av}&$,|WS`BK|mB&`5÷wbvY[ڭR+tlEP}F٢.0 _o'gܽ E:}b1(x8aM~ Tx!5 p2 l)+S6%oq؀KNy}ܝMدՐ%S61opL"i&6$^OGychĊcJ7$t۱VۼxoHyOף9N=ƶG`x NSBxG@\:i %1Yz|S+x6sͫPIsb`q!H,#sX-}Qe{ \jn)"'҇\r^W й %0˵(;!s2҉\ܞѰS$clZ AXD* n1QY-QH(jX7Y$ ,#IE+,#P /j;w{: :l"Wc0_uA6ώgEi bĿ ^wB0T&mfw;}QX*7 j_-|ac.+?ool]fږJbrWÔ v?c,og3`K֫Q4$7Aܥ2*cC2E)4X~"Qï7N&+Wu!<S_gzꢏhx9ʞnmIFZ90];h%'|BxuGJ#ڷTn[7! ӄ,kT]) T۾ORH?a'ꍼ$sVHe ˵swKٳ¾loH!&IrhթCX,!̧ePK%Z9,j\cyB80`Z6bacٸɹHEƄggv-lj剛}6h$}Vfgx:b O +R= S(.\>eZ_3Ye1=txh$kL`I^b] מڽ;,@Mxq?u:La@N1[=Pƽ>#4j2QFw Ђ"6IH]1OQ?/uͥѯÕw`h ELZ @3drff*"cPdգE{QM,5f.P{7}y$ .A#w*Z|b<]{fdBy[35Rb$:E|]B=gD7-` 5u|VʹL=vY[ڭR+t[ BS=)b~>bbb}Ճ/11np#_(˅ѕ~*'u񴨞|rg}u+'.D`pN^w(x~JbsS|1T<]h6n  2L?G$Y@n XDoMê)k\g.T<,,To?jwY¢lBˈ?\N&(q= |Z'[\KhM4+ ۡ2VTȹ:l7o8j jUNf{+N3]'lR*|xAHxSulyc=G<&zzJJi`vr [+iwl%~hDԍjhw3t0!9-j.ON)pI[5^ P^Ut(1׽nwaa|M=BlҘ3U]-1\*4k9k5$ nV=#o)쟔}3-X-ODMD|}'>Taӿ MdM|%4쩮KR9Ǖ,!}L rbӚş߂qO5!%A/Uİ]X?:>9'M-f܀\!K?4pR 0+ ౯ e&5sS&$g&Tr*pj5Ѭ8(BZlغƨ@Qq _*A {ج湄 ch̰_WvmYS\ҬaCcMht:\j>(K[nT}ZM.+Q*ktAjKB~L1X._6Jq/v5ƌ]$G(xOijX Syx[@w9-v!Ka)U0Մ'D*mI:si婡ԭ;\[ @R<`:56\pBlxA|bsWH3KM ƛ#"wT֯ĕ2TrR5~kSXT;SAzZV6㵎K\e?N#VM0x '/_ru-Xz&&HIw?O8iܦ?!H~4(k@m:֦I`nimFg0]Ix*#<[a['Jwj +  ?ǫI fUoaǥ:X(k?bN<*hm:2 ceQE|ߗ7畹P8S6/"C_!ÂJ#U0UBH*O2[%7xX3Aj0MV溛2?Y3{>Jux-ʢ⣛5DSB{$p&KВΟRQ<0f3 `~HNon|!DZODiXqR/??!e>6!lMxo[$/9Qln;pJ(3[V/ˇltp|.ԑЎ㌗BJ4Cg&29Ll/>?ҠKՖI+2 MUU%nSZwxW&s?  |9/jFXۘOIf9IYQg?սߟK_#I6I.y;ug.1|jNiݗN cs8ssJ_Cc;/{bc|pn + $1gI*g\̝r a!Hػ\(wHX=@;gRdI(\!/Ud m:529pS̻\Y5@<4r_)]7[ߠ6T4ÐלZCֆ= gem6Fx)Ǻ;cejask\ r'0o8K=Kid  wJK/lT06V9@ ,~l|RD8lMS[cqtPF9“S &O,$\.z}Yq{lEI&씳W/GodARg'#ESIqؒ+l$kqEzŕ,0E(D][0(iL9eAtEPk?Ǚ2R䠋haݤ㛅w"fYTE ^ƌy )DKiLѬU;.&[(uk2ZO=u۾+~u.v Bc?&y \ߔRcBW}VJ79at  j6|(#},U[F͜V'A#dJVSZ?Ai%,Pa-f{0\Os[M QkO>#bolŎ&3̌4 <3PjAg9D}h@[V³F%6er$g8vuw2WEPY^`-M+qM/n/NȨW2_ eO(θKP[963wce_%H6-,{5&I&Ļ&RiK0X:ro{BW+00^dӤޕNvg+yu֐/;R,?ru'5x>K!S}&g㈓ & TD$9*gȗ68MMC% TpTޓӕ'"8M\ysP!ćAx8=ׇ/:;HmE.~F, ѵ s9.368I ZՓQ^oɣdJN8%a*Ŭ~P=Ts2/E~4lJ葔̌..,j[dN u<LQ p`PI fCwjZ)0ga ;INdA7L L,.C _#H?SiFb4y-nbNVW"B^)er |V@Gy)ma=ݦˈ/SS JB=c2 2JRsQ_"i[ͨ.¬gݡ߲Ijrn3}*mXiJj3C^q=uFd1o)wW,%m-)FS~?{ =ֆF "Y|~ԋCbLDʲ'l ܫO- %nH=2ReU! <˄EHvq7Ҙ Z_ښQQJmrFH)I[j !.HZ'X/*  *BJAë}U3QV{^l]PIU= &Dh:g#)DO+5;ޗeL1x\>n@!!pQ~#ՠAvpW7>䕛LH{9l+w <@F<jmPv֮75I\wlg~YoS[D޵HƈCbi3C 8Y'/;^_ߊDo>t'::=}ЍrBwWO,z\]d4O8 YB,KV%k=oPDHӀ#趠T EZx`Ԃydit԰c\ -+ʵs~O.>wb+*= 1t@{echn]B4a7Vle(H%T&Bm %G)%`e ?*?AƁ@AmfRw"\Ms=#΃؃S/&>`94KnGNw<-f6@hVoꊞAMw7OnR␚v5V*nGYGʶ &xd2,YڜP+n] $*c'VnYT54C:rA}ӦdQ{p Ϡ_$  ĆA|Js[IWHz =>"+)f7eq,6޿E) 8C$G\:v}ݑhA$TH;#(9,xһ%~U_>_ Rg 7rp3:sA?'<Y'T$ԞمЊ|Z*^O:m⇘ ?]H_QUzvJ"v"( `M-Kִ}@B{<'ioz9=tnV%+ŹNi+n@V }I,X9 #\/cr`$UIleϝwN(#ɰζT 5eɣ-Y%sk%Es,^#6{Г+b>Յ,@#=J// ze̘+T~nqFPˆΌm::\/,x 8ӓ.- *LEX+Ӂ4]Dp8mP_3d.6mlZsrBfx0,!i{Hӳ/3,~mH"uA DBdÑ`PfV^L%ѹ$sr`ךIcx 6[f}T&5iX!'+=\.z㢡j`f0T:U޺m!J&"o~`*be띆ÛYQ4`&>dwZyibM&i̷$ǬP Ûu W'6ې9xXđ޾5vʜ W9@qM/ӡ۬BmYB 3hw~0I\3#K5Z1;Tu1ں%XTX\%} Qн6r i2/bJ(dhtxl >)+ȥ)h%{\?ԕL5֣(Ҫn^fs0]m6L̓VhJ7dJ&,~jjf* E5iK\Ԩ%;],zni%(-酠Z E.E4d3;]XŬ_qgj8}S=\IUj{zVU㑎;inZ|+bՑ5C&̺6C8ff|~v#/*ezK>?-;t͆uyLuB(f񬩌-G<{NpЮ]?/0AHX2hBJ^f*鳣m|xiT yӊ-<$)m&#=dn})Lx4)@|^Y:x*YUq8[gCT*TNn;^:(a6'U` B4$3G"eJZfvm0>, \g>&?X~MX)wՔKtOu7~t-gsQ5Gl}0 SB35Ks׀8`Δ9*7~pt欤$mw:PBCıdL#N z Q(9$%lQXOavU)[gj~7IZK%&/E&GG>=/bN|-AQ[<-jlUMiRe%OEG Xr[ 6FܩK*hloVsjbvE>1|* EL)i3'r D1ᡈV:L!`(=c<wdƽ(f-mg\+t brgpĀWufۗAuhۖǨC6_-=O=CCJ:Ϸ"C<v P3fĝ7"9};J7Td%{JCu^]:ɺ~zǑ5rE2ڟA6v6t8POs-#X;SAOb_ M*G,be/VCEkN?k.8i^!zvo!@.-Ӝ1;eii@GrH*k{Uc]%yTW6ԷA ^zPVC e-j,mm(x~PbrdGʛ\L=2#>?^ftcv J;YábF..Д޿\٫yεY k'\t~kA"-t@$eG{kk^q]*d2H:k:{lf~K=PbxS> `١"jgpv`Og 6Č"uT!BEZ[[ʕFP/m^I0E̖YW̱<`>a&9'7LK4JĸJf rDg !ўO~E{{>/y"# "d]I҉OAWe6{J":A\hY}xC}QvEV3L)oNnbn;[p:ߜ~\q(l{'àF,òR6u%Rub$Au/7RzPK5)^^id7&k!qg&eMë腯oVhqN&h @2Bp Rw^abi-uV=9n^2F0&nu27`-`-#˱ns']KivOFopT'$6cTd 6{5NK$I7xpw+׿p?`‹i$UʛLP􁺠 '$f|,QOaʷEkK(4i a#]fAqc18P6x6{T6T+<:PDE4"mcz9Fl_g̻wMOg YP5^r7 ~鐒ګsx&x[aHb].2#x)D s\}ʫR1\MUbߩ7U"%ٶ"g^X5l#̧;jk}L ~eYb Z- d|>n#.8orrcG} .j]JTTWY ~Ulg8UҕKhHYxDŮk;ҡg/mOHG^xDuxk ="~v#su0#ۜTs%tst[Iިр$eSy䧣r4brr!L;F1WH)q=ܘ3k{xz&J_$OWZͥ[6䦰fx!+K`.wgx;b֖fC+s~t^mCڞR1ס\Lն(oBi#K:"u葇Y-|ͅ*9h")+E0?aWa]G7Cnƶtw?pP# ؐg;PhA3!'ߋqg9P ;)tIGss2ELz1 .Y,LwA}PKz}L`ch.{iObPXm\MqNÄw;]&bUQ*JȀژ6dL5Zc!DH+cUSL%?Wtp[]VV¬g A+b J p֋,pkΧ[1RsRҝ-8 d 9G}f!ؠ9xG~>1N,PZН]Q;Vm܊遶czvwTIBSY/A6WGxϣ1YPza,1sm2} K\uҗ ƫ>"+DgPI:v\,3|/㼛 isҜg5u:S!I|$:ZK%L4h; wUڣda;'=΋G/Ͱ55Ŭ=Ass:h y}S\Yk \QR l-Ee~5.!٘ב!_''rұB1ɜ |Or,/>:e_ЧBgхXS˝q>b wJ}GG8;5@-l WM{dtXw$g=&R=Ɔ*r!ՌBE/Ƌl{z}T% &_EQ"=1"C(3"2P>Ͳp|eLW!w Ql-.xAז/ByW"(z긌\EH@h7/,'+GyTht$0 xp $wk({?`7-g;ߗBU큯`-䴏CdD[ a#d%? w 9d~}G2G녇@h¿ucv!-Q_9iJsgB"q.VGӵ,,Rfʇɕ2OI"9Pe[I'g2ݞL.`g]&w3g:L6{5|se[Efwp[Q&s`Zp;fTB<6Ǚ)%rcӸ۝!sŠ 5͓K5'Qx,(ً 3 5R(_g[ qt>O|BfH/hϥI*ާ@!E%ٔ'z# O?h_P('Q9Jx6l_F-?UȏƵW}O~DQ9̤ҕu l@D6]6YdO}zc~I݂#3-dbF+ٍS#OIjyBU(fcECk0*E&ϖ E%4;Ӈ,1L/=)UM @EptR3fUQaZlPlf&"8[T`JN:}UIw2+AZ@SG9KXgRd5(%!Mx~S rUf:s hSăų;Lh^nQ^.8'suƟNh;/JTɿe*&̌@`F _T/LQ MYSSC4gh6gqQ]p% GEKf.݂R"nXp<`9;sGoy, HFs{x~ə!a"ɟYK S q\Y)ػY[/͏~ħYYzwGeݕMoA%@veT!EDͿ$O5ECBC72s/Tt~K;eL':֞2hng Z[M*#g wڽ45pz.Moak(Xn='6t` TZ-=r+گO"<,sX'.I*M̕Mzͧ!=-hƠy2.<=w dTfx`?l;yGUȖ`(JwҦw4E:BT1Dk,>cW(f.@~wwatd[|ѹW(G}pUZ n:>^v]og@v)Gd!*7E>e慿8wS%"B{qK,V3'_v3H0 -Kэ/X%bP޼},dyzg vle?uGy7a]40rsUk8%~lf^2|wd˰뤞ml5! 3J @.Rso([cfevAzE&z`6@xO*p{ly Rk#}bVᤃrw6p7['.V喎JSbWݘD$w$;dJ Y4]aIP0ZָpUu@d ,7L[/7QˤXL ʿp73X.=7#ڃvVh\zJ3o* {E0h%H1guZV =yൎT*BcWsh'"00[QL~D$$̫ ` Tgك؜Ky ^Y t*(@(B`f !j\lHkA1X.b)XNw" +"]?F7a`DL͵#&''$ Ҡeٚ=AZ6 &>qJ{*XI+7?[ e,A>h9bp$Gk,R"XЗ +w7kmeC"ծL_: T}n\i}&3Z7Y̌ ME(zv=|ȢQ1GJ4k'䎓 GOQ^mduia/#PolC{P*h'9W7ha7j;/t*DHE^izMrG_{r՝'Xě]V^*/gN 5GGO'haE##Hqp,hI-G1-X SGG~m )p*/K0`4Z䚑UK& 4ir%Z9\z2@74eEn#qIn~(':U*ˏ)0Mp=0LN "6G PFe4Uz"Ef! 4'Bl:{)p"=I?^ph<9D~О 1TŝǻV5B(6#3۱'ihK b.ljE8xM)9\`+lly)Bo\Ԋ'{X]_i=VF,uy#shQRT& OF|fϺIx.ݯ`,9[caycJ t*G,Fab/A:y璦Z7`'04FYAxU$с^Bfۡ]c (=H]!D:xJ꫗RШ﫾c`*,?z-[Lo¦F c}A$.̺/QY@oGe'6i,'Q;-v+1ÉD]|3۠ }P<+K!S<(@=EJN\wغuB9Ϋ#`MlVMBwVhmGY_8ۗqk؂_Zp_ðGA5[h1atռ_w0ܪM8v8 !V`EߑbR92wtR\R ޿Vl3lhd.Vhf;Cyz9V"F#8 /нkJ*E #|Op;kL\T[qCcV8f|a`V7T̗o,2~De ]Ek2 T+-j;LH3Q,O*f hR'JEHp+o6TDځ@Oz\yy1U.ԭa"LȄIhFPY1'GR)a׃l `҃iYLG4g\FMiLءLGa?X0\MWsmx?zfj+#Rwge W*4<#2B?Ss )w c:܅.RE5ncBSG7 rD? ˞&XvG]A!.5٦nvWu9ҕ^+ yZK}I\ߊvl-/&H&Y05/(.ЄKoY?j\nFȁ*qj}_\) U!ERط[$@P"KDLqBDHIqРתbRn·SqOezIcݗW$ZQB|8r:OcUj],峵(ׅM6KG`7%9|+8lne6,8I>84sT/Ċbt9{ٲ ͹Y_AK9솳~%&GhEcyc]Q/Qn+…U.Du3de/q~lqߡD_y#N3Q/sTxj <Vv(۶&i{9'wmHی6R A=fyT7 kq`ZȓOGX4!+JG,̆ZN¼ mQ: vqpC_Ҋe.MpzH-m(\f5,j iK.uB- *f gf@9Tfzp C\"y}"I^k@V(s ;pU=g0@J+Շ/fLg[bIUV)RTg=pQBHnc P'͊譡F'ik*@#aj9&F< T![J^wy8ImDM_˨Ԧ_0>k5F2kbRM`DfzY1Լ꫏ijfdyh]Y9sPy&Jg"l- r؃P>pC'\&tѺ#АG#}G^^%X +Fa{@diNywl}?J+8Up >#AhvGJXzmvrHx/;lV*YS@K%tsLRN;%Y"NPU\Xj91 ӐvcVc2}A!dUf,"3dqq:Np8`1I㺇`j0 cD5FRYU_2m6oP5QB_cPnSq@<8'07*c`&cNF$e[c3igKc/{=eBԉ y2KKUfgUKhEb#UhG(8,>aE!gL_g &BQ/2`Ԓ xR8۱PJ|h}p r%Q,\`3//\1Muc5;\D*Z`n>C3aV-:]Mo+:o2 Gzס䨔GG Oy#tƧgNdLt !;$0H"J"?1J"6^sZG=|qE+5(\rR[dִu(Lئ[3v~e]%PgT봭6#ɬȇͧtXfu-d&E8 &ŲRܢqPПH^DfG'N-O|b}7Dq\7'{Ũ*<@ 66eWh7MCgD7nf)ZFbJOFrͮSw.ON4&9Dž,d kG4~NB"HC2('A{,kYy)l=w@n9#8^a}PPxdei; ǝ4A#=)Rj$N"ip%Ϧو۰!sxs+5Ҏ3g{(~(6j /zFL[×I3 oog^l~FU\tf<{GzEUJ2l&,MR6-~|H[ Si%m"3)d۔x̂z2i:*c%$;{qE"@+{ipۨ [r=':rXWN v:W 87e%A+$O>H7-{u ԣŎhNI!8 gfP/K= yژ=xwil'JIZMd}D,a$bs` ;g٣#=<+GJ.,ZQL3e.NF,^OET>BǹqD5;*`q Lڣ}gp HN\iFk8 /!mt9/kN/ X>S7DGLp3S<¨B1HZT<$< [0vbzE~HeTLj%2LYwj-- ^$ xE^ %gɀ!Ѝqr?W%p&߹'L_fԕW5x^$FLSՀNDRD72f XI$X4`5F;,:Um5HC&"rajUjDWc9@N6-?<=px85tfu]yzK)ڧ\ց^YV2V63,dZhH.B570wDWųH3A*74FT?`":秌l -5/ZqE1p'-Y:2lK`/f*yLJMMϵ"G 1H]6)6+n1ɰ* :qJ| yXJC/ יQD4p9*5apX̅-:X41vGmYZ^'>dՈ.cpyh#DʝEenJ|4LBuh 3Ov`c>Ig|o#9U7O:ɍMM@A[T(~9Ya0DjCGp;HHrabLNɭ"]}9[9^:'kgqVob6cSw6h/Х D3}:;1e@5s>~.6{fu]PX$$NsaMv93w}d.!-a#]$oeKfy:;A'9jaIdjp6r)m oXM`59dH:~F<.Ƿsފчv+]xGXll0љ| qZ=>?l7\DUŢlNMsJb)[ﰾw ؜2ʪq͆6bZ)$ u :\J2&3qr.~AO ԭ5[,A?^A3o`֘^tYAx8wǔ[rB_a0]봌S adgz6Ih%fV*޹lO@zSceub`;bVt :gFJFe"G3D2ߒj9 h]A6;*1{?0<=Sy\ ţnXҷ+R~E,kw  jCe_+0^X_RU476p4<";q#o\bP,1W_Dņ";>8oU˿Me!].Gה`;;%vu,Ԓ.. dŏj hN0{jW =_GؠOrQ_Vh)Z򦾨y58.cнμH"g؛Gd';e[gKBt,ǰ*X I<-ۨp%\cݕ,yf}Eq!\Y54j~T5/AXCuE *"/tz~Z3JNt&=pⳁñ^v8f扠:T|dmr|46GL*ȥ뗎Kf `k _6Dh(6dU'=8'`,7B_ ή,=4lr,Uws`FHt.!MۖQ)N)Cm5lndݜ@)ԯl +loܝ|<#H(&iN}]ޟ>jֶ1 ZH[["LӁض,i4hx6qd jk _qMb2|B> Cl_v..w|W2RpٶJLB Zpq|i IidGJiy'NfhگFhgDd]DM L@jfz+H wVdqɾ}e%4J)K~`Hj{6I'7X[\m>yzb#=(3bѽ:-aaf@[wG~tID" C 9lAeTr ttӨfZdQwX{cM|z-ΈKCgέ g93Ut4s`ҡ6؊zy~|vc3]S|"qnҨ1A4먭⣒̋w{tr_?Д4u3B ,޻W0k|ρe W&I7Omjv>${8Ñh̳u Ajg ,ˇ#QShg63u{@ԹMMi:midʚGWM|m{g$S7+v E_URm7Eft/ONRNj!bm7|Qk3;z#W >zg8C+OBQ֠K‚uTaz1,#Dvrxn⛟f`oC}b6>jߑ~SpLadMgeVI~JRs,\8} Y̴cLs}S;A~̩Od BySL?r1X|AanOvUff뽟 g9f,2緣z mgȻZ bIHb syj1Ӷ.i(\1,k{xo\ cD3pf׌7̋bGMOf'KP +)pL`T`qȗBE7I>r³bA []}F?v!mmxl]mˏx|PBȳg^ o;05y:ڥ(M>N+ P,#/=t$s#|ͭHmEEf+\n:@{e@r x >J?@!WDb^.: ]Hioe{4O;qQ) v!No?V"Y,o\`~1fʜ#qI1dwFB:t2D09"R˙%!XmLHA|t1 V+JEuww1ms> `=yS#]p0O"DD+E0Uyḃ8%f#IYJiBQqs|ji^1S&Ny3 Sx:9کmi:1w$C&:od)Fmm`fǸ40Ow5#.;ASuu4*DOYSgߠbNRW&JoD ]|+BAc 5MCŞhLfc.YL(_`VɸN,:YL,2aǡKަ27}<⪱\Kc(6~Lvb^оi1;KS,0v.ƳC3S;؟ΟnJ<_!1Zi} |#[>5r@'d*bDl,)}`z~itF x|h*\?\|- erXE= J8oXK 91XGf\РTu 3+hl!g*(946R Yz7[ҡl`⏪U_rٮKvW@>1]0 .B'2(72mTCb||fwBOӈuag%`n4 H\2'@۬5TZP X4\*سaA}OPj| '[2kS1yS.@G({lk9= h4<;u*kʎ )ֻ$$$re0Ab,+6u32Mơ,lڴ "E;:HbQ4Hf:;DQƏŃH(EB+MX43R*f8\U#8zK^n S)P!]Ɖcs-ùW 6^i}{vEƊff+z̀Ve~HtVn̽芭-.α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._^fӓsS|11np#_(˅ѕ~*'uMɨP"3KfBqxY (F|0.Ve%S61opMG ё`α'\YfRVe8t[ǻz J*n/,]&}jϳ?;~;$/je%F3tJ45.}aA K,\>tZ$]{5!WI:T\++,9uRTض4A͏@>`wWOMj:.]gGf/Sg'RY;:Z@nIW~(,ʥv=/ (>ܓ*ܾuOdw*M1tAp.?%_p hgŏw];4`uh+`|孳198+L}{͉ج?6FswP=[ ‚O Kcrs:RqK?[͏.lk?:K/|zK?4^A|MC#O[N%NWy: ;Sܟ"Ѵd(e]/4ZVh\ gYc`z2`Ww[v7-7WE/n8^QXf9$g#2a5Qy8ZY ^(eNnS)?tlG3WN14=3V=Fk{n= 6Yn<\3В76\lWzY)HwSF>.+*V/ )v5x lZyx6 Vej 8+8ɀ]xyh@o;X[0eWEƭt _{䡒y]~w&함 ;ﭿgOFX$cIF~,VmU+jdU*y ƅҿb ́a_4-_uTYr`ח7ܛAִD_jlxNDGČ^-AW7M)j_sg A6rL y"&gN9p,*a:~Ӛ|p=cp}CF: Yq'r) ? }=6%R@'Jn/nkC1뿺&1UxЬ,W :}'zlqtm$qZBݔ[qhBojr+N'h ب{!>aK*hڸƊT9P% yl,d-ft2,I[o\A$!֪ :R_f3@m6S⢙x"aG|B'_9zSc#KR?B-RI$eqU7}uYodUx7LL26v"X]wO#C~5X.UP]8S֝S i+ZO Fr3'8" im靽FYoѷ1ѥFHGG]H\utssJ"#[2 gzS3N:/Rb&RI\DcRڛ:s<^MzߌP&LJ@ۧUqxD,Ŕ+T2_**MkP"Bb($Be[Yknwx.$t6FL*D 韅/ۺ[o_GQ2c>Q 1H]Q*p|jprrGLT~ՇoligoClasses/data/scqsExample.rda0000644000175000017500000000273214136047277016740 0ustar nileshnileshW{LSW/ lL4q[@uAq m{j[o/" ̦n̍e3EDdCb {#VUcɲ?w~;Iq\!S_>%RR-Ȧ_a 5[Mχ?3lhQJ ?6hh"ϩRUph# } s@5ޜҟ*@^P%@> ӂtc-?YV|^V^12b/y r& dw^Ɲn.j@9Pa m0dUZkv~N`:PRR:oAq4ؑBګ߾7vT)@`BMr7my" ݌_ҬTf}z>M w2(|";q_P %njO< tϗ\w`D\d XG7rI5dN Tc=ĻְwM~x< !]9fGLkHP jlJ$L;>!1x T 1x>z'ȷxJWȆ&Otgk;G~dg[4#av7hgmK*A%^[y lكMG ƃi1mI(( .w"8$5YZCbZ9a3Ghܲ-pc cpDł(*$(wS!oEJA5it8Cbא7Ytxq}JցvH6yXc,?nόd/>Hݤ9g.{A VY1h,c2 $|d3KxE8/=n!Q=& ɛTg# H@R ~WUr5E:h0+ԃD0k@i(J`Vc6ђ7HSB=x&+4BEtg`/W(I\/Ͽ>ڣN[#q%tE5&\|vT2DiO'Y*,XZej,+3Ap18ΐ?z 8?oligoClasses/data/sfsExample.rda0000644000175000017500000000263714136047277016566 0ustar nileshnileshX[hUv7lv7IcM{KmJ6&QQs`ּI:;L&]APKExAAEAE|QT=4~3 ͜sr?GR I~G#fXBQSuxAg=o&% &ŲVo'99y5FՃEӢc NW0pF;o|4]^^9@;LZ7](`| $?c`͕@V`3@& uNs+e~}`QJ<6>OqPncשM =F=ׁ=}{"MQv/09/w r ,ҟ?&(9p՟*q$F^f72Vҋ]?R/cAF% y#n+ǝҗ[g-~^t>|DBa86lMہ?:G `AcP79~D'SkQv@?U =0a@҉5clg#\ &֑C ebwҗ<aK58ZQI' %V+">`}]<6gNE`-׆o"NX(;H3sԿRDW 坹wh7츫k۠omCbr>%--=#=#++iO |Z'}'}//? ? խz*.4v=i3)ΩQ; 3jLTz&CvO9H!IjX\1놭j19fRDJy*aQ%#E%{2 +1Xj +j+R Utǧ2΄5u zӝd'&2.yI0 ;yLlIjՔiUQ/KvNuUy3F 17UhH%.|}}Str|pr^ {JK7/:"u3U-۬,4ojuDӓjn<'_aAn'|.nYf LC%(j4eB=Wb*UqY)no(>"\#g9xL ^߼U]ŗT]6TԥC*F˷ 9qEgvW˖nhujc-#wd 6=zqmx%e) -?k ;_J9_])TW"nRʟXaqjnj-&DOf6C!rjR%@B r#O+ .Ż# kكsv|3}Z]~uzte\)tgc{yrD{X/G},B52Q./$_>8RJ\99bL.J  Lz͍HLR|JE  ۬(>ۇZouq! vb-L>D`Rk3K)FįGjYr?ONoqaCy4X˙p W"=9ZN7N?Tn9Q&ifcd{TPԹh`Gk2 _vIAC*4_4x-zy# \r`? EPi/GCO/6!lh.N$M Di.XK&,Q&~^:caŪN^\/DŽS'Po54DM"^g[#-b='IpÈT$ݏa٠U495J WיiI0&䗲+i}\y8lɒ!Hb2 UMFO*߿& MpHzhLO ǔx\To"whR|{USNs/ڠ(7_&}ƣP#CZQy,Q-5;r&P,HUer)OMKd;"b`YAj/MkL)jJ^\]PV(B-(N|9]SMflܫ$8yl4)u]7 Ek]+87 ˴eVxPD:eoX .E@ qclBk`k:An(ʇ$f*-⇷؈y;/2RH/}R@y' )I0$=0iDoԞb9ylJo"̓t}`*w*jc5>b$U lMa㔥6CumaYŒc[=]2 +1s]JDVVՎ4*g66z dX3#୹ ^2bR*E3)Kxt|PQ4zT6bUS<i%U'a8|DbB6-`nQ F5';~1PBG1 ޞ2wo0ܗOIG&#:o{8jRy#`HrB7Wm/\+(nY[.ZcbK)R?ӰƬ;ޛ@5{>:BOgl.Ԁ lpy" 3|K$w(epQjeo*swnli:В ~'be56 U7 ݊MIEG(VORu-|Yֈg*({ʶ]?y#縫<#$lRs"ǝH:)W4(s ý|_>䋖,ra 郈Sp Bb![QDo-Sg xCvH0VW SySCoDHq/ ڍQҴ FnךZ-̳S{ ҫT쏈񁡝<=\0528rm6]icoG1QAeĬ޳C;TM9R$[(g!Rz)]1ΖgeC <{\̐R;'C}hDA|Lsѐ,u_id(mAJѮokfGXP V!: U5z̎iNKI_tB1o x(HMaJ7U+~ߩ\m ?8;@TEp+_}t{*S=Q(Ix V5oZnA6L9;ւIz9b+DJ9!o1Xv}GN8Zp V-WhSjo}n-<1gZ0r[3?z軅4w<:|,5lS<*՗?Z)_fG)oDw*vcHջݒCa4= V9JP,06N8N`D9EԔE=x[Z6u T\>9:hiuXfow,L${yX\vV $?1.$r7{2LN^GGlZha:֭i..uT&ZFIn:1WϓⰬ8ZUpg ^}5r:(7ia[p92&3cH l5ȧfι{eC |] \MHY4QLnN*Srfn~-5Cq(]&Eϖ_P{}6/*9{4vѽx%y=xA_Ngd }9\Qn'.L9v,.S GαYW{Vw3)%_H$4-Ƀ,zyHT^{6v3c 8^r@a򭣯͂C{Q1K|CdR3p1"z}lp<9c1(PKG\Dk->_&O`?Kv!|wTi٬a/&66@pUz;IѝK3W(ϭ'.WEr?j5vN"_ 2]2jɌyX7 KM#"\lT Q@:q{̎)9ӕzj^$1XZ$)ۧ`a]&xKȻ<_=+]54n اzEཎ=#`r*"<%BCMbIDnQ-Q)c([Z9sl J=F{Z"1c|DQ0Nll(j|vS&QD|4dPUV^( ^ H|!46\A:3HL>cs1 b*Qlc[h9ÖOL6pنG= NP_<=?ۚa6]YTz:y=sdYTVx \_&Wv `fSEB9TWS>K?r2/a}M٠CWsɌ4u2vQT֋G'lzcP z~ܭ't/A/bJ5AcD# 7ARFr촁U68I?f-9z|\`X.D*?Jn@(933%_Ϋ`o-8͍h*4a~B'olǒI 5y(AQ  42Ih!'&G-̂ᲞHߟJ')ۚCXAlC;*3sߡarC.λ{ M۠C@lJ$lV0uo |+oC% eEUUxf)?Pb pni >>cyIAHvBkRpeJEpÉ$b|55Vb<Ʉ`O5BY7DmyK^S+O3m¾.uǺ\GO5\-GLF&y쾯]|cZ77JDv*kOF鳫ޡqR'Mgl"wE2mī9 N;󽭋g4N♻b%ܕ~+BM![[QNktbD6]H-O&eZ?W>xm% Oct~=bߴ= Y7NfOz~>rd*2Fɋp>x(q۬+x?o&zy iNzqisq $2.2t>JHņ\;e~ͪ} \i!~O:J%n" "h) m"M#gG#Jޥ$>{N=4wGi[>˔y!;b9DkZw }yY87#r6k}Qgnap   b*f vd/+ uwdI{ÅvO u'^lj>4hUB& r&Zi|"4;4"ݢAV(RYjW׈Ee;O x)ү\cLHkN<Ɯo%ehQ,$˷f/Dq q j2u}:)ͺ MΧcN4;HR7`9): 5z,N*<ylCvUy!=ؙitdw-" of.D'rrz[3맳 {lg|&< Ţiĥ`CD<}zF>DQdaX`)MSh(^mZ0,!E|;OFS`= 2%ыGX0MC^9L;8% 7@A}+gPjP\_YW4C'e]mG6@PvdmT9ׁ̀2$%Jɹܳ&^vh_Nz  #iL0vrj[Z%ͰYPze=^uGp &++߼\ ^{XKoȖUifZ]9P\Z iJ)#p~RUqMY@pAFah,f&|NǰrdP\ۘ)="5XKF$&:G򢧏06+˄:F*/6uNbcE:%Vxzz\ lDL5J}47gEMEX"~Ny'($@z$nۏ¤GPk:#`M٠m l)ol³JK?bg|)FL?6^f*MGIrf]NKt.j/~ofU2Sܐ"wڠB9Ϯ Ch@0!1D7:i8J(mkO'g !Le吽! ~pAg01ـ(}]lVxF블5.|7^5[rcB vsM@)_P\J(k]G? )d K>-=j):_. `[`ZyuzũLP!i@76G@]$OKw}黧Q';;޶ҌK`\QWWm3ʍ1g]($6I,9.OlxM;6L?C,y')UR!vf "THss$ #x( 3nC>:$;yj&O0C-_lX [VWAİ~d&";|Hz>JR]1ă7Y8QkDl9jdՒ.-vrן0^N'ߪ@ TԵDkf5Ci٭4"w^ɤ! };wƍ am37£*mQ-lj,X[/SD"q4 E`eŀ?_8+8u*h-C0Eсep{j^o)f[Cn&0\ LW,,J1YD)6g.WhJȺd8.õt`+ 2"6x?BˌL(#Gfi"4 Gۇ gfH~3<#4fWO'`F^Pھ̻1TS7U2ruya:Nl3>xu/$9j'x~߰bQoߖ!1RDF \YxR0s m&HAxޟD ҏQ_RzȠwЉuI|b/$̪Qؘ Js=gj6Qz_GMR>*$Jhx:yN|.}~f[g/>ЪtCA?alː|hQ.CCزakէϯBDbKG8Yeץ ;lO(aT0)T8{.ti@dQGG< pm~=);F˭TV6b-\"yģem~Fx2nt[ܝY($3}#+l]Ke. ~Z@ u D)/j-9i HԳ#]`bNn2 XsdrSː R<39tZ,.R+[ S!Ѳ#byc)ɲP,hb.1nEBgԤzBLv6o{N%y]Xy-h~=6F7/ I$i"y(QΨ8̲mKVL.krE]ͅȲEW S-?J,t 4ך5%HY1,qlVLychZ83j,SD'_W*y y(↭8tiŶ_D~`z稕ѼNuŊ5@1 k  b 9d{s4.IuJD473 LRT& JGrrWFuķww0f (7Bh]fB .n!tÝͻ؂^I(F(_rݓ7_S&䩪w2fO˾5-!"AlQ*!+DH$Ov^fpn(rԤ@-}q(ι SQ`6&2wÞc9t !q:ޗ,I*rK*/>}zGp,#^s3K!ng\J-AP1j2omb}a||\댁u?l~Z{M0%cHc3s]kUD[[o3A1j(G hB)e|>&V@~ -nE KKZlJ:e1\R^b ;u<Hl)[z0_ 22·jsv=[,!aXn|GJ~2;6IGe k]NҩO?,FQݱ @-g:F ?h/N.=[p"Alj@~N4S|v0tAi!Q"!)@ \3cN&4kzrwRǑ V*9Fݒ!5q2ֹ D2SfUe0cg9q`CB0Ez𶁴C=ٙ,T"RݔK>$02y+0 HsƼWhKoMKQTqDd<(ʑ T7lx`'cn̕UKt[~A"y!f[ |3R4X&-C3WFB:q*Fu`V#Z!2#Yk0\7MX<᥷C;gbdt_BS8e5YSjU#:P"`C^ ϝJñAmZV A2SəH񃄱fǴɎIN XU3|xPH;&%33j"m(tC#E"LC*XՌ TL1 m}tl[}S1\U{1[콡ڊeznOp2 , 9C2H} 3ZA}>o8R׻i0ؕH`T}VT?&K !Ԭ#x @Ҁ'@Qa*ZY[SH%6s9tsmr;j +}_+;6i*KK, pE[<⪀kprd*ץץZ{_5K|DXeXAB1P뎮^cgE=jT@3a=Ƿn9' [O%M =Jt'>46N c ӹ#P{"Ǚʫ 놻-A?^̽`߉+61xB82XmϾJu(+lg^Ǚ'3)M %Oٛ=<Q푚f@S/vӾ˅X'6Jfy|8[pbn"*y:aX%y$YQmD?\D>uTD Z;OkM MM54B9B1ò󗅍rD;$ϝ̋Rhͷ)1J $F x V %0i9&.>@EMgeoUj\Uv4Y㢹 n%#BD(&,e:*bɁR-׵ z"Ԗ!\fBTGٴqBŜ\2pED_Wggaφ 7NOZgC&9ô<^wW{.SYY*bXs\A*HƠ jrͼIRn|W#; i6} Sʻ+TȈ@O蠈|8~[c72_$.WkZy jm/ar&S\,#?RMzGr܀VhlP~9:kLޫ%]s̎8Q*M7k~'粩/{}C&oNkSo[fx`;)ouZck,= thƾP,AYM.^.@&q\ e/ ڐx(m-<\Uqx_\5a+V*H3:[yTYr+A7Lh;a!u"t@5 DriCWC]RC'̤|z7kST//gKFiԦ.^f4M.u 3 | F^֏2?mm3C8C Osq)מxn7"|-})/FPƩz1 g )' 2h^*$&݉} Wl TYj C o8R-kI?b.ն _CbsTsYH\qlul+sb.OJ|ӭt؉E2dހgP(7&lyRnh޳@}F+1z.B"}&ǡM1>YUI<- ? e?L'ݷyWK,ˊ`R{d| _#,\MJv{✌/+l:+##J" 1 (+nR.}$JHj> KPPH @6q-ɃfDGy|,c:^סoNf*:IA'.aCL*{aJu ߫t50x -_'LfVϬ$ ;-͈O9U'LECyy j} -z+>{v]*;b|/57(aѓyu0>v=J^GS!63XtV9]}<ň$pLDߗNV!^7 nEh ;i-<"5{dgf6?3[X!JOU[^4@x$ye"!CP=,)#g\b'p8b*d֍ iV_|:MkPlz@oTn8!ɽROUXj*rWkֶZpIzBD@85XTkr ةzD|w|C֪L'~t@/;z Mt) X J?i7# )o \-dJ^D_%g ]O Sj>ԎkFK"–?Ƨc"a+:!!@cųy&|w)$|16* 9ZAPٓ%>O>^vB!y|vdCٯPӍ=fxBVD,ˏxx9Mz?o6)BNZD 'a$pb|l >w7t(5:ݮZmtxo źu?nQbcLJe*[|!U+4Kz]^V?G/XD6ޙox^|-dKqߊK+r];~n?%˂u/)A{%؟dHU,O.H+%M T6"X|_\\d+ ܦBx:XeRX s?Erǝ4֠GS96DPߘ"sf!.)Շf1ɒ\(29`L5n k@q,U64?ckxB4I3ڋ4yYHsnsiiXcu, 0"qWow^iջPz(d-/m Pm|xݕ p( ͚Q.ggC*6 S)D'$*Q4.9Z5x0iY:XT38B[2Q|O}d(jLĔ-ˡKɞlp!&K3]o~ j J~uM:QLJ m!۫͊]Rsfk$aE":Z8: uO"@J:O(rBow&<| Ew)TrJ#HJMCrB-XZ;J}cx4ƺKΚO$_{P#8?zp'e1 +PNNZ-Z 1`$}ğfFoଚ)Y[>G1  Wɗ1%,ԝʕq}M_CFzHC^J"T-(x%*1YC(uJ+,ݠDwp\>1XeATQ_&Q}&~e FMD*9uld,s5;`[ 54? InyO2#兙w NDb=rg?U.DO[XCı)E&mC`Ҙ6A3*'2 J鱅mP?%{v7ۮɄh昺 Mθ-('&^u=p[m#(K`w7Y;WKR ?Aڋm[G Q pQ^uck ^˨j%A]ОIU@W@N:bSP-b[!>@%!e7VFZ7 nۆtWK#$1޺̠ݥ 쁬M5KIs挨n'oM 7=9!xJ58&B/ NZf5vf1I. B}PEK-;(6AENWzR>JchJ ӌ"E;>4'vvH8]b9RC$͉?Hg` pTBei L.04[&o9[W, t%!Z joG&10DFRHP&rq\vV~W㸵9SXMpIjT)2:T\U&ᑿg$#-sM}P/clzgQg]%=-3Uclgg NnbF5=$@rSξ~?';456Gር\FϺ~]7+y e R1+pQN,Io 9@$4H/J~ nUa쑁YyDI#7D|Ku8]|rNvtjS'tIQ+(Cڒ ({ '+?k(|(W.UA͋|D#rNdsq@uFѯY :ɆX(ʶ~~AНdP8gGsd}ZkhQQ/MVlg7/mM&!85 74!Np殘( dvY"_- {k?I3>ܿhx0(+0>hp)M>w|`C띧9ϜM& |d+\vҮ$BƖ=}ϲ0bg,H//Ǽ\l-5S;s*fm=kЙB`yXM{42anx `r)ժʅN,6@.xU՝#!uZxg ᵶtsJ,B _lhHIte}/d-%.􁭙A68gOI',^5nLQCS$860zy0t/-K+/͵s[`:_<9ݞV8aL'=8p9]{nlN{@V̄<>,vrcw0N̙g`>U0<~nq ٔyT>dpYe$}}ƭ_εx/d28XY3dDIE$t7-yFҪ,NL@5հܲҔR&!G(۴5 5!vqItJEZ۽!|,Yq)2,eJ8kOJE} VPUeEC4w&BO`Q. r ߡLEhSfLQńC&Jc~2A>n3T7mDc݀ j9'"rPM!4_Eq!y2+ 8lmҤAg' Ϝ.w 6\lifN =/%8okͪX D%fZ &NhF51W@d@']N2QL̐)'../ ˫Z+f]>qCf؁NPyп0낇=`|ҡlqiAGDT ~P`~IDy:C "|3Lٛ(Z Ջ {V629[#k+" FhU&-wE$Se,F A4bdn r ]Y< ߠS}CC`Ry0Fx)Uq>)RyEj&c ՛ C UqFE%|Ia`$vEF=K/˓Ox1y rD|}j)< 횤do{:r LubX hgvJ:&=8"E%snH:iZKPMt7وuG Vu[obw8չa8ݜIkU|ͤyú+ yٝw[)~Y|I_j ɧ\pPڌRRj˜";c4Glr><~8:?NVjh} rFKNe- Z}$[X,AOxp)т6F?k)}%Q 86d|!{r2tUWHzd ޿V^ [lEO]50Sl0(cD[ޥvpQ47|[Ȕ8KZ `8U}#xI:='CF{4im#?@ 5qX'VZ]&/. r.Ͳظ@U#hJ/ev-S!ev`@3A烷cEcH;yl_I)7+т'8vhuMU&5K/j|7|A&I[d7m0T&c,\Okf4Z\,,E\q+Ǝq,,z0"#bR?SZ<:kXӼcV SR72QMݒmo&ͭ!p8875tЫDT%=X퇍"?dжee [؀s/3# E@g5"͎׫U\UTOelF yǯӨՉvɆ` ;:&X[ap+8DКLTa5) JeQ`ޤK"]=Т\Rwfla/-`ש/iH0閳Lgz6QR Ųo 9)-9T1=Ve2J +/hʅ`y)xX¬gtL¨G"gtjB&}\3fq'F&"3;'p5/ꈐ/%g\XiLVmھfyО sfJQT`_K;b T^L;#O}V!c)zDUyyX@Yx$͊Jen4!5C_ ӣ`M{*+y^#x8a64&6Ux՝BҮJ׊0OÇSWD{`_f96%| vihn桋R&3@LWD6CnIevWyT%Eܳ9S ַ,)QZ G_;}(D /驻jzy12 IjK 8 qn!?uCpݭ:QD՚J6dxxa5*f\w}CAa\=Z(?(%4+`ơͯs}bʞDUdDe$ %:}› ̱` )0F,O'4D鲡RlQ84!n}Wldw.6RQ$I.}Z5٦dT|FSG9[ .bA4/{[JOY9SY@K5tWH,b񢧝H6osS?[҃݉TG& 4ٻUin)#ĺ EۥZsKOeFRϪD,Z@4{ƲH;o8c{M)wѶDOozsk~y3[zjhSͼ~VRo^qȿ3OP 6L>\ӑ7bk'd]+RXR\yꘕK1*M=.ӹc@>(h:r'40lUbWR-& )`#"ʦ`CfR0L Rb>3!8H }GcM t"{]eyqiJ`sZ6#/x)f[%N^3 qOqA|s)>)'pg&?a-{ob OnS7=$ٷq}ׅϥtsp rɈmBX{1L3,!!-H&UӠ;>&.vLXiYoqɛi 0f꽆@UUدh=O_ 3P+}T9w}M=y/B֮+=< 'rldN?aWZM-jgεR[ƇS}EW|#F}ߓkCqΥ48ӄ*rCŵS gb_ /("P`k\8eHSʫ9ٶ+%ZOrmEG7:iۆ]aJZ{ 3$byG}.bͨMJ%V ]R}!J&^ o&dzL X-ʽp 1Ng8pQa$0/$1I86ni`id]uRXwZ)\h4 Rrfx.Ej1+w"J!溽z!HXxh851rvP1>Tc*5JGizzI *,xV22[?K^ѯxrMAGPwb6$M&^ܠ sxɟ|SU`3LSBك#C ?(̰${YE"أ1qC&֨MLbx8iȭGTAqz`0?|3T{dFM]tKg+3Uoy]^gEflah޼US*V 8]jM{/AqQe*GݷYS𻺄G.*үk~`;ٞF>l bZ٬pi`b!WAp'  meUKsm8MF,Og n_ϷLH\cSlҶU%yvYBȯ>Ŭ%PIQkqU{LIm_Rr9 K蘭̺v,&(S!SG3@vL:|.xQsaN5eHYc*nuR_\_[APoNʉD&μ>"7XHh:p[)|S@6)Z &]gz|骑7!?X֎-5n=ry%{mG7$at^[ZW֡X(1Bw7P!MF$ʗpbNŜ;RiGfo7_cYM6r넂9Ql2㛻-@7˃EZF4}ӖS9 sTpks:njqWו[=HfG3: "hl 8 s\ب.}=o~I6z̸4ǑmRX$rK|o^D \?OHR&y)U#[U)̙P}x9DOΙƋ3!';K̴^MwFL3\sKf9MDM+]IIVȎ 5;^9o<B9-ZPgDœ:ᬀ|og4<gZp>74v{^,cfC#ur@W:c WʗRQlqeୠX؀6Eo5!,+/XJj qKfǶ<$Ɇy(ZR?] U|bB7=P~eaCS2X'f0=ۘ{`^ vhWz̢⑷-'dVH֘ V <0ÁKLZ[wuD\БHYp%S_*P鋷MIBph{Qd{%N ])n|5[DGf#" ~JЈZ? ?.lEEuiOVG[/Hȁ+PBΫcA<^Cޝ{lb_'t ?= [={ TeW n:f=Og\uN<ڝ-͍$Dz5%YkIC:sK: QöRdA2IjX']F(+i iOƖ>Tg 8t6,JDuDD*260_ 纄\jYwٻ~SeoZ,os,*?=ʤ: c}ی9s~4Flln'Tc (l: ť 5$FG!=Bn: p -. ):8!@u#6ݵvq9}O̭dڎpuaAN nAo؛3foS㪎p:r'LC}$ 5!`(?Ӷmr} >U`{Ǹ73OP# |Orrٙ"F]0Կ65/>.;}5'n=!f68["NL"hd+X0a6x{fMܲGqJF:Irg$t U=<0$7kQI3H1qCǓD;#kj^&CӋKndXFGii$N'\tva݁SE:v) I1,Hl4G\&Ӫw:|'%1?.']滗lJ|=I8[Ι5\<[k`Q.RM9f|_-N8P(8$"vCx!eXs+؎n KpPy5w!M}YbzhJV B&¹컂K5QSFS7@&zR|r<)7DlL@{|2ٙ#䭞=:_(z.EfO~'aw:yg p/Ij&Ͽ4H4Bv=_:S1\ PH4k+) +6eNe)9oU]q˝}4].:>f72Aˑxyf\D,VR_֕>rxcԇQ[z~$2%FZTzGzOF&z6pojx`6]:޽kVFW`0"y~OF `1D*zRB:!B[0՝#rWO)7 p8î𽡄3Q}"jBP ]WJk YSDXBiC?&]h:=avL1ñQxM϶n w:UV Z?zsnn|#xwuTϛ* uj;\FDs|Z;u2fZ ӥʬݔo38EHreH3'۬ H//!063aM|6"_3bObh&_X7nAmޠaX[H<;5/x{tj {a! Q5h{^eeϺ:G0maZҤ ԧ>~Y!tw_ҽh9ZчEk$ȩחC0 #!:CswK`l0tH W3G6*6min&|0->eQ klP.ܠ,OӚPP2C0My&?TցF-W㾠{G~ܷlw2r$0@P!G&YLSI2!ys|´&pdnFi_w*{2G4k0NsaXEJMG{K(#L'jN5 2/<1JD*/dE?8 &hd9!Fzm "&gwtVW`k5g bJ*L%!] Z0FkK~G5OQC}|9?lݑF}1aJ)h q(A(2^( -oMB!¾ PVƙKP٧^khYQaj-}OvJ&YQQwqR´e,wz,{~Kh4]  j6ؔ{h31Ãv(S#ߠjPGtSoW:vqPԸm^ECΟo҉QNj ֒Ņ"91߇Ȯ6վ (i <_Ru6yURXTʐЊ>I=(X=*Aq_Υu&A": ^_2k$ 5F SE%3YJ&?Zb&`>qSD_`# 1_K@ `Q̋E4 ʢDay}4|54HdYBv5Y%A<  s/睡2:ZGBrkʭ+GI1nf7wʠE2O8:Dݶ,C 6 ]?uO:b=Lt=1L{.zHU$ekri._,) πG^E="h?G"\D녑+E M8p(qNx }bݖj+ y; I 5Ϻ%a33}:P9N197ơd̚/_y( _X)Z } De4^80LD #vS_ׂB'L ʢ:"b^ގꌶNh͛5>G"{sK &Py e?ן8ܱ6ç[uLY>3>U !<'`#Yί>1-Sg}k:W)(cAՌ/5=?H0zV^DN]OI# Jn@871KZ>Ig =.00,"7uʮ>.3QN{IJd)]3Ʃjc'Rft܁ ?(@|i^d̷~7e;Fp6$dyheUOҼOMӑF̤kdn턁odB9u4W0TJ4ypѶk238s)foq#YYF܂C_ָVl^J' zq85ɯcB"xxaW(=$BǛB.~QgAxg, b=c Wu63h*fX4KS3S%ͷUН́: k2ܺ@2&lR~<j#D,ٗ)_0Dr;a|9d*" kQ2rq6YXF;\_27jjłwEawH7P 78iugJ;&k!vwENi ])W|"?T~aMqeF&V;4zض4Tj"TkEcg`4E@=KreɊqk>ՁJMO0?$ٓFzᴇ. 6Sj 7L0Z2Wr :poTaɮ,;AJ5liVKFRbZ*vQ:xJ=B >Ʋgbm4.[`7]O%.δq2^)H$HNFS@b/;v@p3RX5 .݃R #MbE>";@ ˋ^=_NH!\4mGڰ󝊒:B9/`2յ9kΒ$U[h)fZ`41nnϔHaŵ Y0twc@y_9B5,a E;֋Y35TS#5ݱ?ڱ)%+m,`,Hx`Jdj9Ll9(2l'|X.8z$Kb㍄;Zԍl30:fXҥi*ګR"BzV诧L3LY30}s/p<W9$kzJZEu0kZ塂3fF@؝FBQ?Ű>w-b'#Uś_.ubIX44醹Ӓ4Vi;E>E6 boWKŽ(Ήh>&|},BcrB "X#pa^ɭm!Aъi2~e7&)pA^k=]J6v(RU0׼>n\[ݼ2.jna qb fD~6eV;dVð ?P.L]_u9md ni77d1HF:ͨ9N?? .Ts&oO}V@ɗX&Z33$NM!Q@슂>qBb͉{v>E|$?uNAVY D(U%PMλB"6M{%WD$:DsN/'u/ZƙM4wuE٥5]N.Ϸ ILkr}6 utdHg3!ߣ#eKn.1u,<.)W%77we`¬+0bruzb F̈́-3D|g%_o"}݃v) ږbCam.+8\_'dRwwOL'O'R{)m,Q?/?A\q(&GX"" G~02ԝq~&iP/ c Þ*bō}Y+bYk+n툺Pv:-a>DJn0cq|j5o6 Eer:*n'FRcVr5QQ9!DlwvRUI90E?[fcH5FhQҾXK ^6:x|DhQJR55MJ gKvjuq6P`3^N~( 2^[S($͓W!"9|L- ?1şo[p;Í=#ǿ~ ] hX8hԿu={B*d}Dh`}5o?_m]CuRx=Bu ^Qx$5dHn=7 ד(ˋ2 d9p0%X\ar6\WD8fi[YV sbA9f}.nrB?.0S IH2jluȖJdr_hne\9T}B=.GS k}Hg$9"1n|Uʦ]L("&ڗ`s&*HtUvUT#2/Ode)t,g+Y3Nwe.,E-_Ѭ2ATt-ˌ}-nw3 I-*WB&Q֟O/͢ĩЭ<| &%iNzwBT{[C C7;G>`,t,Fxx4d1aPIM>T+>prˈ aރs-ao~9_HC3˧>2)n. v _Ա&_Z&u|9S$Pkg }'/⋼RӯAh_dgH]C1^롻PXڏLL?v_cM7?V'LFEw A)<2M18`(46I'|>fѧl Oz9}m C2fI78\}/M$tCjB-$@0 !*k^ZpkN PFRbHk]`8-КGLZmCF Ec)o^PqBeB7,*zxmEe/q=bG=P<0H.F0Aп{UB|s9~oS]@d67O{D _G[۪ $7 4w f92t׌\B piؙ:dg DV}r_s|f1rSd:Ԓ%BӖ(̓ @#ϳBrkaggN剖 Mu>nqX~txǼA"AmШ.YtXOޖZ;ˋ:-ߘ@-eQ^205Ar Xd3c`鲾9yXF+tz%UMiQ KqΜ:1kA/["-l[ Cw.rvRyRf`kY3Һ)7N Ajʭ_z j Ȉ]i8WQpO& B~ʅ ֩T&H ,XqgKkj8K$C3#̆/ik~x;WjQxzu\$_^\,"=@otEAn2 (fgF˚~=RdV@P@M3zF`5xJ( wǫNrKXU ,4c93JRNkA̮9vLP$K$%)}ξob37󥋠vaf5o.f\ ھʁm16j2Ft]yZirH˩=KEc5]&ٻgp*Vt♡"Bx5R@vnZŻ +ߒcc*`ೖ)u Vy_\ovd 'KV[OD*@;}7X@elifZNMrb9BBpqNܹ#DY} mU)uuje- >qڀѡ.rJwp~~KB8DGK8dK'؂_Z5: q~xnHM;!ρF3M#\t =X J(clW %&?;ů%Q,\3WI`-BUBҌeΙ)U4.1nĢC?w$T)0KfU=j$%C~td~c1I.r*f'('T.b!Sv:$S ZtjIɗC305GN ЍePy;2.Ü{$?~dB={EcHXp Yg,թ*bԯ,)cx9~T Glh9⮿gp*~Whu<KLQjSР? s",>EX5&w-_p4Rм05F fA}W1O7gbxAą 65lQ5;A5 ls6^ˤ%$QۙKxg̍{%ڈpKPYe F_(c`, Ҧc2T3]LV{2/yNy bf- *P,sAqy+`k1O (aO]8f:Y hfitmvyZj{sPaL=Jƛ{Eh##/+CYCUR$ciB&L 7phE6Eb"|: ~Gc֥&|h(+uzo{ZEQ Yk7 $$cA~L󖿪Ȁ(aIHd,^~CP7N;bo_|gg.ϾhW3E^-K;CwǬWa>,~L?aW:#wy䰰CS;?]pGL޵qq WLU&b~Dx wu(\(1|d*tf[mwVimTȷ:{7i1D=| @zJVfO3G,YBd;&ïʨaTE ܑ)ԁz#3cixdS"L0حuZML2k@1ie*aBŠ$"t{}5W>߬C)͘? ÈUB0:6Ⱦ h$vYT$H3ۘIJ=Vw dA 8.H1 #=-jySq9VMxĐ}Zez)(pVɿPN?e<ףܕ 3ռy@ &F a!q Nk91P*M^ST=hDk/qbYcۢ|} $ n(wB)K*yIϙ ulA[+ŻOcWrC˿֝o)Bpz6So$>(%DžkVTᦦ珶Nd8z,gNoTVk&3LpZ2V@N.2|'r*؅w~f@gROs'l{m QD52 ĂI3Yrs 2AB-5jxJ8H~@_N9$T@bOyWønS왳{s\+bBDWT*{V Vi]JI JEᶁp@rU$++1-Q]ȎF8 _:lBA)Fא\oM3SAţy ]7\tA]FVFQonKq(o"vDPGRȒ)vHbSDeD ݄7[a]o'^6Ni8<EHsJG>z|uт.gKdVsYӲ}7e+ _4/[7tCؗVi5. 7t{3PtjY6$熩ouV2_dꎷcn,r&J ̃VFG}ٲY:F,ͧEi99z)`D,o.ͳ"u+fPpD7ygѺ1| J|pWQ .XH˚d5%te|5X^ O%c-E0Q7[b: W}Pz"w gUg#Hw&WF r{-[7lP;edKORb3d!G%U6TCJo|ldf<5 uy/Q:eL#oZb_o^ޓ3At(_xvJ-M0'aĸfPʝ{wNAHQGEBXKw}!=!OAf )X>M[Ac\vP"Lֺ{4 HzF. cY ~^?Y#VFv:nF| ?G \'"Hŵʫ$!=J~FC-JB;b=x,@th AFC_w+]JjW!s>`Q*smaSau"Elu!o/\*M(EmtHt zA2E 4a`~Snt3itв,e=,V\d!"BP".X➹2u7iz h(kAcEaim8誹2i;s+RsX%.3}Je=S}jciYC3#үn@ oÆ8 G+6M"ǖ\j nl]=G5ÕOpNym]}*f#57u-T!z=̮H?wAY)sŽFў 2;{|J!o 9,^B^A[8 LFzOe(z@k|%Ibtu R H&\xE}wXZOX;ֽkA,?Vj`&᤻Td- Bj4CGSDJh6AEe[w"H+5k,/;c_-B1^@=0AXᘤKQ0͢Wہ%E5(XɥqXզ$?'\b'  deKB|qdY'b.T{#;Ũ~E' hiq. QO ݕ 0cC>z8ƻqg  D7QIK>胪gjAzi.'䙙taؖ? 5ཟ%bkPg%=8NhڈCfsŅSs 8.l[Q|p/DD= A,q/P3Ash*@@sj,Gqt䏥!M ĻCG?皠 Yk : K!z_+H nν^Ͱ`f}w>2'JBċ?l%>F3JI{;<+$L'B?$qvAIN^f> f/F Ex*.:elc*'ZzKGsEVBvY[6aq`A*rus*D9s8Kcwb=֮YC𞡘7"W-ߞq6/#40D7=JG[1em{+G"2; FBdQ-KR!%lir ˙)4z33|$+`F561mLZ*;{Zv'3\7Sp_ϼ:M&*%!@uzXRX09B| -E1bM~w|GW\@[yXY\{ZnOz4A|e:y! JȑS0c~NuȫgV>sY|3&'@MJI9Y`|A<vHZZ)Gl*"iY][07z̝]7B7nU Q暭JPs ^\:̓zsl5j7EB$O9'W=CqPA=_z<[*6'\q@hB UnsO@>An#8zT(X9GWX$%%grUnJ0i1h K/7:k墲Y0AE_LNqp:A IyyU‚p*LX!0Eϑ_e4A iHR5o%ʏühw?5 : {Pv+OоQaʃc+kd;9ISz^4緼  Mz_`ܸmlqfcHU-r߅(ş(&T82l=:O\jH㨹V,֤oYo<]W&q|{TXKcFݱmhfR+d&t KtO. N ,Vsʺցu{m{LpBhyUIMs7L}-N'yXS3 OJ]l#%u6Ce5r`P31mˆGG)uƕp5m:[oe +̓anq\1O[$mbNy1 [!]^6,U2uf·=>BiV&u ';b:}rM^<0b3E*W]ah,TJs\5H^6ng7ޘ¼S$RO4I,eQ4ҫ>V<"` 呫!X* :Dc߲a"εLC͡%wʩ6N *&qK6u) uW( 69II[Y%<#`JrGey(.]eXul+¹`~4?cgқb1׳vw/Rs0 x(Y`5ܐ[l;YK#_8Q=`S#Օuo{e@)T (|<{kn鋙!s)bμl7k5;"3:zU[(9 cu-趩RG;qċDΩ!W$m297(IQP$m/Յ7q4q~l ܘcRi-įωv6 h.L\[+c`^ (LzB ]d$R! 5 ~G=@}cSo]&sL۞740tKQ92Ŏ;(OGμ~Յ8a  0|zMc>yYQtJ˂R93ݹH_"J׼ =3I⯈, r|e\ 1/rٕ*?Xhh5C|dƔSORC 0䯐?-%g2oC@PP_2 |S Ep2ZW3( ٚf2P&kY]kjVnIgnHpNKݹGhh$KF\3/-=;}<^>^7@犻!ZF=گ-"=SclSi 6DCa_aV!ar&1.`P$ݸùcb=&T+ t/"K״cUGE zpF-4?7ޫ'@B vZz2s.+^+?H1}4]KN bDoQS |0tpLE9hPCPaw$_G0< mcӝr47˝^b?YBqhlXohMijR<TTv.p:Rxds^ .0aĸ$UQ1gzZVrNӆ] *s[ _E!-uPdosVm1Ag,[$8!CSw]Mk<dY|Ml$KeZ$&gh.' hmF^ %JQpp/^CVo5qe14oW鉗}O=&w0Unhq`mukc B`$+pp≢]}R1=vCN6VMr l~b}ҐNs)ߏX>TN촭JF3-T6wYHBxh-qF GEX|ruB jb' 1D*-0lry%C$%*#"GOqDOӡ"tph $]ـzX" nGITgbChqp}򜪋DI I7%S Ӄ!D)e@*E$ QA({V]Ўy,>B{ia?W 9B% p4c;}j J?޵;0pL}޹_ ՑOQ?$ 6՛HUjʼnt?j HR! t(?͡>W@lΗ#OMz|'^G0 ^=;N9CAR~f)w[ȵw>u|xY}@P6D%XrܳOxOZfO$ X{L /br^CXe s+WoJV]]ɿzs"5¬34Õ6 b!{}+UZ:i~cOcDP?cGgW*1Lc"۶HK )KUdU*dIөbU&ɟ)N;— K޿%sOFVQi5p`_s;x r{g%}bWt_>zp\Gz:HդR"To#4~3);6RpЋZrI/M&4SzC էŇawD|kyq jKSmOËB ',ふ̧w"(6fVga݂)OS RZp f>wkA3E89GL3?:fjG 3}Tpo,u 1%3kE|#[Av> {WpG0'=Ù*eN#~)I BZ xܚ.vZQߜAUk俯XjpוV ROGOX/V S:JX b(PWFZkNx$EGM['A\ ,=R eig=@H%oL Id-jHHVE+MAMJe3{K8j 1-qN{S*;&p2>8 !EohZ[vzD 1 ;/*O1s)Pȗe0Y'nIҳqnqe rpa9\.GB6H$2jNu9ZsegGm!= "$}jA0CO) &($6PҨvxun8fF{1J3|n;,nty N4>f/9#ɞSt9"w nnǖ3Eׯ Gr#fŊ\e3Cܑ Q,;f^LwB\hy 2Ky  Dn kV"]9/%}v?EKtt۪[Mp52Y^B)N4sҁwWEAJ5Ɠ tHvG<09b%z!:T1vUU8/xv:^ԟ%KӼ :@VUfiI"e$s G}ML{S2Enz4bVV9YW s^QNbwaO Z,Y} 5saq=TeN>G-3F!1c eꍴ/7Mq@U]zn( :?GcJÏ8"r:%QC43"i[@.qSyfaеs8C!L]ζBq+f6 눌K `m{{ڜ-ݸP>d 1y;@!ץWv-(JGn{Y2K}0Z|͉t Av804~$t2R/rZ XrKy3e?-;SMUpJK &9ߕVӅ'0 H ރ?#5ʬٞ/4B K\f>{hV{MQs)}φl(ZRu9#>Ck`vQ1 ؾg_'O -%'mO;Ƕ \jaWNbAnz'Z7']lb1Rt]J^1^olFБ71G'TuަЯ2 cjL{B !qB0he(S;""Tj^n^]&O3.8橢cH,tg=اE]ytNM ?72f'^>lBu,?x2 ,M? ahA08e)aa*qJRlA:L-6OvhS *$=0njStVX l*Z HQC**ќc5}!9tUTu ( ؙW~Ncm~gb)%p/8.(iO1"WVR s@J=TTfY .oKE4sy |a "gQ6,ȣEPHiSnȶ)s$4gafo0J sa"XJV}~ \9辄6F6Oj(oX@ш_g6s$ޯl\E]Ƈ?2͈pqr_bmH %֟tmWDG:xSY]ցZnQCZz$pb`ѐ`=8nLꕵ՗$0:?a:PpYҁ a %6Q+?pp9jg3eAPͽgYbWgNT¶+nnىCS'(lu`l`PN.):ܰ8.'SkĥDk$vk4 V߈2lfV&u*(" a@mz\_ZG[(NUwׯsW^ ;1Uk rRy# ^eQwN% C* ,At!]rUc24Gc;[r<07+pO&duEOh сJ'W͹?*OX'˚{D: .z|2ub޽ W:aTtEЋu*=ξI氟uM<"$7iuL{R@z ]ݰ¼Sa- 4JۋKfWp7蝣8MҪñLe9vbu976nk4e%s ʣ$U fr62Hϥ9~oݞVAX _ȣR !X5X˥T4ir*hʌDaE\rj$Sao}NA4fB?hZrXھ5$q KGpDUٗ\Hw` fl3K@+-dSIk "HqUɂ2a*L(F[nwuk>ow}DXX':7RC2s͹<9Pq 3|GCVTek'hw#ۑz7z )NPwTN@,ɾxv㐱[dKER8 ŀ&t.f9xur|ɤՉ/1k<` Hk&Ȅ׫-hIg~RQ_/Kks篜uEM*ZNcٜ86<R>-UUM< :Z&EϽW;{Nqd1-T`C4whA9rx!QC~a 66_`kx`+'v~]JI]\P}Kђ9W.;\ F29xPC$ 3P"F'=ӥYwb 2j Z2\dߦ!4!WK0_ M;6(N|VB R*?iCx^p_\lJOVYHV6" sح vJ_n^co+#R툨_HRŔ47D\C`v3˗Z"*y#\ I/ޘD=sPw\-+UrBO! .-XO>'x_%̔["X%LGB{js]8s SЙB>0&3Vb¤;FX2vr< ŽE%=>xe ZRW~!qIG@'-m jb)`勹V=^] c3?k!NJ9.,=ύq)0(zCt'̋ ⯨n^3(ʔk,M qX xn]wuzpOum:jjDJJ_1j5ҨŝvEaxt"jc%ԏyΡ=Lky % C pne#9>ۉR:@tܒP;F oQ^LԨ'?űEW0rOLA,u4 k\nen7<2:i苿%<OԇnTF"{Hq yP3`#tXIH͖|@k9fyHfnUc+Uz &`v4G355f1u)lM~X5!vqyGnfzn'DhYp%!K*4b@*џ:+ҒFPD*ut1 :XaߵUj_6:kTݸicğyWTm͖ĵJ lIJ8"U {aOl6rsp9 1FDv쑨# C_τf?A^ʢc̉}$AF!xV/-[8bG:Aa N^f3?_ڑq/jL~ o$?L+.ʟOa498T:"u'/2-D9X4ubuKcoEm92&!CRtuq c͈RJv`nFSMSQhmೇؐ8OPqu4qvOZ lwz+1&ѵ8Х4SRCj"&ՈO3@=e1C "cj{֭\=lA D[Ȟ{320L'xEֲM8J0H4|EP:hZ= ӍayuY? kc%effigvX *a^d |))wi6zm%fի/)e ĄPrL;T C:y$7?K9tlo#+tD_>q=_T 1RiA>CAȿn[3*\NX~ogMh_6xnlGJ{W.[:Bvjڒ[7]) 0sKCyғ nTZֳງZUj8%ɰ@6uq0) ^[OaZ' l8 eHQ|N/En$#`Ȁ+QjPPC A@)9+Mۗ@Xҿ92S4UH^7(~!PSz]sb5cNKZ ;W + )^Pd8R@Vq8K[4"T!z8)&XfϡY/@nd;xh6٦WLGj4_OQt9u?pbZn8t(ZepLJI@ʔ &ȸt(7BVW4wvcFlbEtB8]*{Քh}ȸ -uŶ7 h/0ʨQQ-0#L s9?IRv%xI`d#U\U?G<Ռ8B49\ sx."@ǪS| Z[OvT˲_K.ŁOݏB^3 յ;n3uB;>ͻ-E=Yn[<'$ZuLƁZ[B?ȼX%!pk·5@>f_jA#.8@/tRͭrx|+1({B^ 0$2G0S0ӱzd_iք[cg8'͹EcSQ6VLa) и^H "]6Y8.txG' x񑅝=u[d6s:&tvعEH͓gkcDK +0Z  f' }}<ͪGQ\~?3R5? "n1i Jv{{YrI2 S%o϶sS,>NiH7\߹J,up|\5vz8U-19jSC=.+^ޯ[Q@)ʃgWwظi95yjш0FȠ7y͑mi{Mؒ;0ht{n[_rc3(VW{'~zhbN 68u۷y<݇ mU$c˒洱3sCb9 6ǾmON 4rjYi3;ji7v\ vG T tx4~!+JSF#^ 햽1e  G};w|J-P=דƣ|ʑTln7 -Nw)*R2+'PAp? M-1};#dfxpLO',S4K<1y2m&xFӋXHΟ#I5qJyPk̮$,O bW07Fx &%'rKNE@$I E"q'g}Q p+T"1 v' ae㢾a>n,YA+mp$v<S:bg@b1_$jFE=jOY_]5%9B*pN#hv*%B܉pbO.1#PvQ$~ӳAlv Y!Ϳ&Lĉvx_,fn$^m@g[Rk'ihM:+2+ItP&?q7׋GLcՖ_F"VT}fMxmNtm|ugi`EpnAj8|3ʻ'L9 MS%Hkz]e0Uh}NH\ܵ~6apRD)"ga&xHXn#E&i `)>2sp;ʼ=BRW'VUGJI>(b6Q5`iB,W?Ry'h:Mg<=%n/`K܁I5#uurs\LջxW2 j .F1fy*׏?Fi 7a~u؈ewjo&cK:ֹp 5A ~3gx^/I&0"5a؂߶k%;2" VJ;+ {Qْ6z&=nrf%/pհ5 @,Hiz@kybUgťT }S s;Sm`cg OJRuz~l2LX۔ ^i)%_2ehfV׆ŋ'u2Rč~# 5 1<}/9!«WbBEMN)"|7@ͿB-1ht-r\H[AE9PeQ7Jt _=7/ru ˢE5PfyN(S=49†AJdLfcB5:F1UW;'˜5K?0IS )l=j&%&# OPcZg%*<#x!E⑗-kK=qv pΣw2U=8wZE7UnWuWKXgL[jS΃R}f*aqbT cvzn:d9=څ%TI|䷁kO;Ke=o!MP@}VַRV?3XkJd6w,MFJMDI 2jBD@j ,l)AE`8 C0m&?T}LzgLVJ@TD0p; kŷӑwՓb9BwA!wq^GQװ%}fF Vb0q,`0<d% Z足[34];Td7wZٳ˧qgr c?*xr#ռJc'xKPKŭ2>Ag]9_L԰RHqL:Ba4g['HCBb9^ߑLT0tqsŌ?:s.K|m~.mxSNnּcoD6\9t[m:vxVKcVC8`D!ϖMK[[J·?6VuDϹ;sƪ((9asjh@Z+imI調w'& 6RKPqݫnUWUMPg*>?GS ,Ш5*>-e0>WH _:)p`}.pˠn|:U퐳 =K[ 3BkяT#'J(&1s=N=nLX0PB*\XH2 xƀWfN=I+GNR2 g XeǻO,bjqwc--+IUG\~'ضPnH /zrZ%ASˡ%hJZ7n}r=%cM*[5SL_5եQ ?nwVQFI^4!m P٤i b+4ubߊ/Y?N`y##s*8~u"CxIuQ{ϾX^@-Opg!7Nl0Rtz:(ouOJɩEA\p>"uFg9Ko`B@ӧp-Fy1lЀgVzTѶa33@jA4/:iuLmv =r-izku <|V}@Z},W„&k7D1"v9Ubf(Ӄ{ ċ5EL뮧iRx<7 Z_ T}mY)M&U#SBQP*Cz%y&g w:^rѠfK=B,[9/ 81o824Sg~j{PP*-#kFh]QM5V U"9cp`gHUn\pހzu:ofT ?>ttE1VҬw1lU+M} Y }bo"E><'fax/9 gi[Uљ+h!Oi,gC>aev-iADyS OD.ڋ"xEleZSѰT][˪#=&/I2#CJ~a9[+<+nKomZn zFYk!`,hMIK(&6!\o-I{jH&[})!LgMHM^+o/5l%׍8M29D7+1$_{"G a1.i[@oWgxIhlÅPѠ%A#gδΙayH GiG =>VBb$>hct}؏sl 9x"ܸ'KofB=\d'7zK yٚjr} {e$7}X]a"J#XAnϳ*{оw79XCmY; Y8Q!ESk`D fQ_LPZ)jE]UFgOCt O]-b>]6VZdNB_K ۝l0otGCzǼKQU292 sJ Z*> H`³S9H;;Ta d1k;CsvJ$'H |Nmq':t\}P4kǀ-*28yu®71F ]]Vz:c3_PcU`٦hI섞[N?VrɠGtERBX= HE/<-bs!׀_ʘNHa y:vd *#6E1d:y3'q꜠H8mV$=z8iԧVgk~t |M B#C$|X6֎ BEx\6jy[V$l1 s[§R%tɧqϒϚjyk`=N_0'߈͋i]`2RTo g"eOP;/{ db4[L牐 kG 9 %-ɱîT$[ U5\d*a3 _3t ֿ0cjv70qXͧö]w)y*()T4B8}Dėz@wp$ri;dw>N= *瘠J%!kHq='@trx˰.jEV%a3Vyo/Yrycw L]3j2N`\7wt yl &mixx;wvO]idλ|pxC%Ay7* n>U6 gpksJef R1-zI *)q*/Ekeּa/ԤAq@88`ZG2H jVgsmzGXdsn+5kiOSL50]dUH18]dqxcNuh/xN=|ᅊF͒j`ѾłVXE'R/vY :  >4d;-$cL&5'04%ZZx.G/ oUXNR귆^dUtm4+ qB$FQ1T(psPO|_1$ p J`%zr*º";W#mB"o<-ÂqV/o61;!!)$WCvRl8}7,:yt?DTDP@v3m1pdϱ bv&4>%|H?( -kZ;8ˆ;+uBeI](CEOh1t 1rWUL6>hy*̼# X[! rMJ' W*J_wh3<$$8D0Cbl̤߫T0&#.f:YrpI=rǎxØvLeHsRیr* ]5Xre`qǞT~( =z$o1m]%5ÊI] ݪXF YA STO2ABgˮӶn.#/~go5N֎\MFLt ٰ΢{OXv)FзJ.&U-y R?lIy$aTW*PFp#ۚS̓ɔ04AcZdncUfFuZn*gy Ý8<4*KZvLL%iaWM\֩5- I e_:ƙ@\pYm敥5vXy:"!)R`D74R*LE& c/֙Ò.+ <0WBhuDZgʾ Zt̥eYd$s=x`O@܁nXX1QKc* ڞvЭFK-L6^/(Ìacqm Gf~*r.a„J}ȴhqyӂI@p*LC,tWzP(_:SX|X$nI3F!'T``^s l}fՇL^QX) ZH j/Nc1.xk|Ajkl8̔×r % iCt{')ëZ |fxKֵ#Be^ȗ^%Lw!#B\{3EuE#i[5/o! yۀ5,4 Q(T~&`%Ĝ$_ }QS{UZk9*3^ _}S~4 /-40E:_^DaUtsx)Vw9H/S?F'͋pwX-dgl-J!ӛqXѳk ,_IHJɐi/'틼"b`:rZ0wQ uH`φ8@)O7.a K u2͛r[|ʦG-Q9DClމB>aH9`UrDrO%dI¬z@*l\ϫ5*7ZLKQ/r 4WSMUIdpbCo7%9і 0(hNtYDb+3)RKߙ&o-=r In~%Hhvd@9/{[#>}”O}ЎS+DILYPP$r5s@t!ϮT Ue0CnC&[{u:}fD֢b\Ė qKP*3ou|+hmgXW`Χ8w!NbyxB3w,jq)lh]śɏo݈%nIBpŘFa#86kR%ŜM*#a?BΎyKQ`O` 0x; J3^(.eI:7S)rk~ԜZf2Do*zo*Ll!#+1j~+sћ7(ŤR Me`1<y^uv<j_Z$W,OQxqTpkSO>|"4iTwn^QLU3( Ht@\!ctvVYX R }'/g.O,k="VTDܟ5洳9Y7}R.{ɾL7#m%EXռ@ITҬ?>lTð \PNj/)\3|B8ŧY a3@ȇKh]H#W;Y+RkժJ Ԍ)^R!C̖N[܂\ 0ANJtmd鿠o2:V2?0m$irLQ[Y[.̪cuQ{Q@ܽPF\"b+e@ B9#}]:Hd|0S3qUm^B\ݞReqcЯ)d譙ezll6䟵9M'VҸ&4Eu'A)Q|gHt,|˝鿕=kոCĕtKQ"6czaUk-y}ڬ] < 21VU;|Rnr+ݷwPk&`(UGq)ad|[4䔵 =zE(M)@ ϱ@",!XM$6PkWlVnOW̒m=ۛe?+>Lgg"88oFZSuW&"AWV"[A E,A QtMd'\)]8eJ`2(Dy~0,MM{1 =^g}1mi yc\OBwox0Yz{qxMv hU˞j8P5Pd[VI1w7ƂͯMhlc" %G+`?aYOI3liPo|f>ȳ=BV%I)4}V 8kV8 3XI)?Цdib Zk\YDHB\rU )귔%I8(s(ZNvQxsCm^)-4uSgF,щ׮omXw+^l0\-Ν +#Xe@tqQpc\nMLħrޜb`s*$z '%YTͣ懄e$c>sN2: si(X/C˜%"ȱ@c2uIT3iE N%4I$QVIظ>80 y]ԋ|DW˝No܅r}<<C ᙨs鹂EG /s1PO?=iXګ qhXn ËL 黎OQj"rДӁUXI8 "Q7/ݮ} s)~ f!UA+=﫞Z2a M8y ژ:vEd E M_@%`1lno 8Q8[Ł+h.^з6 G&iH0|T܆m X;K/avHɫEl伳(6O_ﯽ\EhA@^FNOZ:Xd`9'9P&CoXXb8;y䱅a kŵ를 [kfIjJX./,k_OUݲ?S kE?a)]Zs*y[f gf_KC~灿\w#y9[^E=FWK<vŞݱjL&)]nE^5lpc<3>sfW@zna=%ObGQe.F%FSWRH|#J~B/A5ȇd*C3a¡qlH $ըt5D'mUY]H1hoxfv@j/h\lY&$JFh;9S֟X*W^0e ݠ!ʆuRKͬg )*?} Ӓ3Tmo`+- |D7IWl"@˅. qUQ!!&b҈ZrqJñI 0l%FPGDEIYu%AE?tQva8]&WLɰ>M`'~A42ju1VYRjÄO7!iczNf췘5kTzyN2JL~%Q ;źq5Lpi pQ2aJdKh:'(egX\uxˡG($[hKk(Q"MfbLZ1 6 9sxZ:nL]kl$F*7 VٻjjRroyhѻ4VdbueM$  JЫV~|ct0W)9Iy)\`ـh.M"Xn|eŒqj~z=Wݝf 76wZCwV?87[gK@jci.K<&d͗7'tU(^L"En?6ݘv;:vĠu_Xԫs"F^[ov3lxtF_ʌG8<{2=<a&@NwGIUa*(UkfH{,+Y >`1\ۗc]h' fWyZqbyV-̤"y$EzjԿ'[וK6lؤgHfo:`863%;kDqi]'F=Z=1RHF,y{ >ogkh:߲ 043lcm.\%Ee./@ڡFcX)㋴]BzԂw-Bٿ9a*rlcbOMGm+¥|Z0D8S%wU-9Vn4G:8whja+A{(Iq\&ew'oK̟:_C-l=, .[a?~Dr-M"\27wȜA{1wVhsT>8⛨L, kv]^j ! иZw8}[MgN @CZ6"}= [}+ÏA¬D/`ߍ6ypbuI'3=:&PeRN F kmOrjt4=b-F^Y`(\25*?m^*d9cBC23+ qî\y}>أMg UzI#JIʦ)\Q,9? ql%`Jn q y-ǜ9 (A/.2Sل2ww?wq!SxnpF 2^6"r[ܠp7՗Lr7_ ģa!vߏyɟ-LedԢ1)8Kտ\|1P S2[Q[wk@̮e`X5>/5A0rt' h |k今1PM|>E4fR`W+ O2zծ,@>[ ḱjE9%i\3(}LU?YsN WkvQ77SXԀe>E(d^j4Ef!h5ྡ1`em2zJKCM~> u6߼ + 熆RZT,gc4_Yӵ:F;LKA Asij2"v[ \[1z:}=]/d)*j49u (k , .WUڶMǃ)QiKPK 2{-e,/ΦlL}>g+V"[@n+ ǛȪp/k ќ啀_(5 s 88=iO(AAZʅ:кqOorOA$ <|lE=Nui<<ؒ0c=p/H41s.0tJο5oWxgԂ6%hU.6CU4<yX$_ν=``7Wuger E?-13pf {OE6̌k8Dd6i~)壘J,J&hR <3iR ,RWb'I LWUO{auxOB{dަ@ m}-娓/t ;>+ߕVdf]>IOs*LjTDڎNz8"~>}.٣[MRl*?Bdxؑ\Qh4Gi|gs Fg1񼐦B_ƥ EQB`Sy> MpFlРQXӋwN䮠ݦ,jJr#\p?ʂeeyGM)`[JHE]Ƨ>~@c]M)X}/:K@c$Ng^ 8cr`_WW(P<bWWq4jgnDW5]J4i?ntőÛ|&}T.q.U6bw2;GniPk<0쮑Bۂbxf!B2BBh3t-YgaRrЙwVpTGg4tcj1 fwjqR?0AcsPR7s7[v#e_-)0@ fF_C5-S  X /mS[ς*f? ޢǽwex9` Q(#3ڞypvfGLdiRdNF% #YAY,A+">mBH +ԧ^I|)-(nu2|D5)Phe'->R*CߣU/=H,gfdj쒁۞c}u_UJQ TgޚhݮBRvzkΞZ}NZ H;P!>mZ "BJ@IYaq\ 6m}%=O,?t*ZE',ÌiqM7uEŁ)%$S4vX4tw*Vp"ƌ=Ua&{b iEȊ`1Mj5 a<L:ahsҫD[-B wr٪sSfM2rzԁJQknwnfA&%BlAm z&d&$*1!+2@C[Flc"U $binV7zaE^,"0 >ʇIq@*YK $S&<= ]u:a+??eUhÃUui+!:E5EÏzDGn̆b^q,&ѲҞjsL Q8V8 DM o$2|NĀU{ͯORpR?P);7aLwrT:','YIqNkNyo')NH cWur1TQ.WoN0l3k/ͦ~nd9Pjֈ ISC{-_A&һ$[;+`=DmT[7UY܈d<ON:242gp Qh2 ]DUY;t3^2k^Vi *Nv<#کhfdIݥץD2J7vX^pz||ޫ+:gKVheFkƧykj#Y0:IͿ5,\݊ bk_Tp p %TWtWF{oi'+G'fy:z$.#ǚqCNA9#ۀt ˪ *1go4O W{"๜W -jgTӇ r%_`h-`j#6sRn(NPƝ?zr1.n\/y x.dҮWs9ܛEX~bLh3[֣1IT Vf }'#t'vң!: #dw*VWퟴ|Z nEm82ӗo&gCmVPLa$dnn1@sގd:EzUi_A3fk`г7!93[v)3<H*(-#tuĤuLhoܑF սM1pϐ.f%i`deF h51oy:;6:fȰ=R {tXR1#GL \ ] :Y\u,[9͈p4r7))5SWc<wB-/ [k̴_pvS5j3v%ghWխT(hzû iEӟZ#vlpԨGo Ck.$YqmѠQG ս;L#"A*PĬw `^轷 .zIFo:܅pU3..ѥ{Ӗ1\I[&\^UDęlW8K3/i=4Ygؐ৲s.}ki "W -Bh~8:%8~DcrH FG6jFy /J|z/!0=ݟ/7IC-љL0R;0vO3JF ؅K=jԱubc̵xsbBQH&n2(?H5iykAyy M7xdF\DΙƆ#†p(A -R(M^TmOT b0Zֺ `f*m#wO3i#x_ϛj~nE_3۩ĜαnWPm0F"/3.,h?Æ=Y;^xV-3soY{A>Qx;7c~3“ -.N\)jH!c{ {1;ѳ6}Y=]d9W6YKY$*{婉!o{yCo$ټV:[{CFa1;k\99_]DWÛǓ /7`z.e x5xY?,FlAV(NNXl1=mveMeV.ޕ ǚ2:E^xI=3PᛯW %5p%(x6O'sWCJdbLzN p wk-)}OdP ne7@ÛfcҰ}+S t,ݹ65|aNvIr"^;]% y!)߻W'y.L.cS7~n`YfEyn@aƎ0$`S&:h@2~ GV^ I Iz1Nϯ;Z=Y5訖ᾰ2F+QԵ&񇾬A~~"ݿ%`zeu2X×8V\xYw{Fy@>q0uO>*)æܚdRJƼ tTOF?+:q`v<%`wWŜ/CO;"=.am?6} $(,6 9JpQq8vBxfO@ ]0/6=U֏A4m [yω}? NjJgOP'[`Ťoͬ^a^u]^܍zIJCh<+XM^x8V\NN4ޯK)Ȟ6{ucWWSPk9"R rqX4OCP MƢ)7e1Zi^- oce%1, UR`}PE<}wn=n䪡rK0}nPfYE Q}mf Ъŧ˚4fpk^JpH嗢2\8ay qU "HRj%6b&hw@)NlcZ˃oe]Ef :Wg`c&Pɛ# @l9hC ^͌D(nK` ?ĢZcxE[oG'\{e%gfr1s mxW dn8 p?GL=Hg%ZJws6g{EvcNP1e(SW,C1|h)QPi+g8_b,ZK`G冟pO1y;?e 6?\d4IPn? ɜ;&7H*3?Xyi"N%'{;/?`+Ǒ#ǼSvFp/+xu8Ip6շ >x?m!:lh=\Swp%ʧorTes{ ƲhXOxŧ3DB>*J+1R>ٚq@/ C?+&|@[d5ă'K4ta(9+A}Y{)=p)1ܗϔfn/uMdA?}77-Vs?%نwpH Q"k7>06Fb}ād'h/D? ?/M6PE6~cp*5B͝1ڀyˋ*f%<0O3˫?V5O)u"P6?g,O3.x`v5Okϣ~,x::]rNT}w۷0ձu$ :V9GFrI:̧#&FFC?VRZdUo.D@f5@v$nVܺ1Oran"vaпCvXorI}*RBS-M@.5(!p3,M?zah^@IY^DEw @pMx-&JS9NH*zbF& C K4TttQQN}&`l3Aƚ0f&xHhD5D,~JkFkMi?kKipR~ŵג+x a]DmiyA8^tuŭb.9`8~ >e q|ebRwN03eCȔeG: )&HdӯITx˨kIܨHvsqrz:`Yg YpHXRDMjO"?D'zӣQWu.x%"既GK홤V8GScg1Noİra P!n(b"^⤌͡38*n!zL^"\z_-H#~֭ECK@S8Z^z,0=@J;(jMC`;i4?96X蠐yzsTw٤rj2 2 g]#Ko0xr)-61!tD5SvH>|F(ZtBȘSc"y&SKj;X*fd y-F'C)\`asJ1 `QnZrw2[o#(Ė6O0j/YڿlCs,Y͓w1esOIAzZV:K+lMjQ&ǟ srvX(b"RJ8'?-zAi *.%(g1#>wQ6 ihW$G{Xхv?<Q u/ ]pl8ݙԹNJh R`|šWO#0̈m X`fK&*D*K' y1LHdΠlﴣ)1BNEEHX81j\fk9O&3ѴQ= !iS#O̬Ŕ[P)0op:rrWm8 S{|];Q"h;+H'] zj=XgO@??*}@NuES+w*>8g &; W׎w0ExdUB?w^Y_,t ,r&jћvglK 8iR< x)7p]S=B#PxMMW0&PQ trRI<EĆS5 X~},F U^-8< EA_qqPd,? E9z+XP878B!fRu#GH y'V.I䊗e)f ۔!#-I-۫{SH;e09E?D}a)"G;{f[Ɨ|#HQ;3 pg&鮻w "TC&z+S&d,Ӻ k(4XqgVᴐ^ o[qI`d:O ^TpU`?3E9ʠQzr"MHv[ unXZKTJȓ7ETI̤aϙ?CjrDlǕ.F[€ǤiLjGQl^Iu8&?&bm(E>ɞ1W9;:ZLNP,!DAÍ4ZT+,ѡV"IOQNB qGoT~5fGU'<盞w9WƲf1bI{9"a{td͑ȃi&)BTMD2fh nüRJxfT/ 7ទt5=rA+J9 riucO}/s*-~e yrHevI}g3^a9! \ QT,n|~Y43IϵTu4҆yIS\q6L^"d/w{Q쪨OkJT~0>liw^2y 5$aYܳ&Iw>;n#ugor6 EsobAsQlDaH$ΆƊ& MK+-;W?GZ{xZ cT)埨Y'}/J<Ћlxz=*\;|t8=vS7Ȧ2~S7u#:3_;Az!0Yi^8ڞlzcqPA|"Y8a{:"i} eI–2X^~͞mf궡Z Se1(RDB/}B MփGlr*QIwuDD\ZL.ܕ/˫`tƇx) h2N/78vs,r;i$Gtr`Mц?|x Tiw_}# |5EPCR \^r]WV1``X{D_xw,1p1-dR|濄(2{xiQ4dkV 9t!MCmb=SB2go t2V !%LYdL@Ziu2B:\^Jgmۼ,&7xSqFeS&ȳFyeA4*NHkK<|)~]2OϣmSo!83Ů)P ѮscP̚M5NrtB)8vk A Oݷ[R46%Ҽ1[Ɂ@|ȷ&|s:R5C5اV̾ ?-8ςevH43x|,#AF3OI h p8I>?sȀq߉I!W,ao`@weę({:LNXl5$I׉FN Ĉ))h )+ Ų3=R2$lT=1;S20s٫߹+5eD@9-݊D% @P<IGVcsBv NcZTWHe'ŰK N-z2q܁L^ 3͔Ig*/'= Ȣ`wCÖJO5 +UþŕrTp`'GDsHpv8"Ȕ/Ur$:| ^TzDZQJ94ͯp* i~@u+g6 ~ELVv6I a!(JZL*h2j(; "eI2%bB u%̊5`z!l} 9twDs'pSrCE/Xl6EFolh`q+v'x-P["Y1`F?=h> e(K^|Z.+(mTx#ԡsqD*oЅN&"7kaTthrL-)V!\kTmm@Xn; Wv&o/he߇!U._pC'u߉UfOzWrzO}Sŗ*x]2/ ɬ'kRpMEd@b,J>20RYC(}l1Q'8k-M #w]~52o^f&~jPmZ۶y E1 F%:~PeWwpXt+p{S2N\^#yLt#؍^Z?.jQdu*pרi؞}*zC(/F&>Ϲ=%-"յ(BI}3zZm PYprd$nxEEϝ5F[DRh{~U;TSU2W`#QE{4 wJ]Nn{B].4S19SF O?*\UC>k;Cұi<u9h~Rm-]6 [ 8;KǼ~I93ٜ|ɳLչiP{RNBE5qt:On ۾e5c|=V#o[=4L!}oŏt̨o=@XFE9VҼ qԣ/{v549P #q9jX;г`XD ,qN⠆n{0(~~v-1ک۩JXR!V`Y^: u\  a׻ۣHajFl=o %N)-~rы J9'ڥ]Q4xzʒ0ݡ׍F A;0o ^x7yMDXV4߿uŅLRI٬u7{]K/Ȣs-) }~ [SXB/6:#.bneu0qxp%ze@L6N y[<ӕᝀ7q$#iRa`ZmG-۸9/7 ћ%%9F8O #;!,q9!"3Bkyd8>7YQ~,#EɌ߀407|"4H[ G=,)4JC ¨OU?Ga~-w'%1kqZ?v;n't2Ȑ||@Yr\;H< KEySa`?^eq>TX!B,Wqr~VRD.HڼSPJTed]2jQs#=J@:D12b=}M6zVp5: hq! HlHMQIs18G [1b~Jq0<1M<)`74 Ri[+*&|@ WnF: T]t7 #?%!:Ͱ'·ws2׷Di?@(B\$F-xgA LG/uIDh9WeӳtoME(YKn$p:'&w,aR ~Vh>,XMFXr$15Wݗw0PfkZM SL}B|!皸6$m_TO[1Rk8@``K톆Krvk#BHI8 gX'e q^sɕ⩻Pia%01uZa8OUֳfb?}uVϫ?퇨c=ZWA e|7(w%ᆉNF&WOe |scu2SsmQޣ6)gUbȫv:@+D*h؁mVg;Mv7s5pLHg#['bir ou7sNopl>e{Gn͈Ϸ.'ō~pQ^Y`مvBgB8{NBb=`I&j&~6OOXsjpBuihqyT'gPeEGu,r2ٮ"og2YpZcN=6?|+6L`S_j:(L)N6 C;YJ(GE3T@y2~)rZ~y,f,H ÞʴR')DUTp`s[Ȳ,8='Gm!^;"@4R"wM)[hsr ξU8 ash3֝E4M@M@= vޑ]T-D]^e>F =mE&Jଊ kC f+ڶc[9 gc>gVϧ$`nVV ޵y! b<5JLN?# ۈ}IZ%_ϖΡ S<+mIi߅M74r|x&{xgGq=FWB-|췁IvW5oUpNެ&O˝h=5PcٴG`x- {*I.Yhƃ`5u5<@o[DўEWkʅWlu^MSHm;e'1,N[R6k$%2Bn!N$4%W0SÈ*E{6 8{r7sjJ0h%ЫĜ]@z {6xb˖)A,XڐnwF}uR⡆5k`1-5TED#H"nS#7E#8/D>Uk6גڵiWpE*~8)h0K2V*^_DDTMr6G^S?O%Sy>e)SLdB # kRS!8*Ucr9 FuFD(젊Ac},aew5: :]J#E5C[[Ћ=LV qģ@(#\N"9kd$qPRa9/ۇ _<۩M: 4>@8 UX"En؂1V~;.2ZU@7t0 ȵt "bPZü f(Y@!MvHU=&,B! j(K3jA_+= yU'y滑KY\OILNuM>[DUc4>g`ʩB"{ZUjГnjCge{P~h/>,Sr12z ;nj8Lln͙,8@G)Dӫ3*fT[$E3^~Aw~rp7p`$?nd_{=Rh0~?/>C{ _Y'gR~Ot!}r_kD$ֲp`[_)J ]hZ VZ C 5*[K0S'~Zhْ,/L{Q^ZiB~xOȘbd=ep犿N77hҝyv{|[szbKomk"iĝ[qw0jv }ze>QFEx4XB..sj4Fe?&XMoPNR>-ph++仁B'дУ"t0>9ՃVӸ6;њVְ@.`@k!waAXs\Jh,tu.$Qv<H|0NF:ㄕ"0ɼ:_+Sf˶w+OD9,& sM1r23 D qg59ôxrj:z dw̞Y%bx;}gYIc `cOta{\HÒ.6 ncUy㧰xB>*.{ąF&FPIc SLyts7̑FɺM#Q i`Y\| 䐷t`CbaRD^Qsyi'Ji9D鏂@۟$Q:u53cʓYM% ߺ4{q螜czU,Z^.@BbHʄ;[lbS-}Ӗ2w ]I*+ST016,N3^wYrLqm0oR`îȁ!?L <c@Ҫ4ݭH/Fꤐ# OŹ E:#fG>:ag;$ ȿm Y#J釴ǿd%&5y[ђ+{Uiw^ g|u~2Sbl Yv*8 ]Iڻ/svS7}0 ѵcaL.&Ul8$~a$")?cm׀:E4Lw N>q$S_bI2aYUٲ d I A96/ک }XCv+d֔$1vbtͩk ؘh7 w~tpx6ܐ)Go3곳3ObxE.78x RO%2Q{WB(==F?Gd]:\[Ud2M؊F*1lWz < ۔:4*כ:(R5lOc ; NEP I꾯#h56G!5/<4O|m]o#p$pc^5(n\>w^͢B6Cp Y(%RV1a9*xw10ζyW/Bў}\e͇jۜ.Pl|s]|ň5O^n \=a5[L,RoAa 9M#2οtRNz~ Ţ%5| ]TVq_:;қpdieI<.=&zh7ұtoQe` j FrMUSJG63PFt: E=֬ ,$~"Vq7/l~KMA8O){U(a!3;YD dĆO_iҙu/*l52h:$;A$ >[ ]ǥKM$dcFϡC* E<^}ڠb&Rt+"!ڍf7$ޠxU @^ HPf/_#n:|FR8l!BX1Nb #+ '5Y MXBw aM(lm~ᏔR'2`xô 2JdIL,a@5:r Nf c&A\U%֩ʅbfʕf\2b`W~sF|gI!'!J)]>ЧBFM`QpꤏHJ .a9agœun3TIų X:SEk1TV7~GOUR^ULb?2x4O͋Pߐ9V '~5³c 6. y =Z{kZqK=)NfT^ Qj'yo219 qۧ] /u%0&e3Zgmʬ շKjbq@fKrL f潥$ݺLu&F9BpZ?pf4v}6;PJ$sT*Q̷+7SR3-w&xu&ee$dA򐔏E/T\IFv2?% <Dtp׿veڒ jTow c"g=Njz|;9նG>:+y mYGB-= kAؕ)HюH]bBG &I0ڳQv(t&vdMCZ|[MywXn^t*?'f׾ /G6ϛ]]3DWl@bM;==(${ku ~ܲz{hC,uڳd$ڷQtf鰨UOV`~zSz* Ac|QA OfX[X5дq &[ -ِ-bh8(Vm=4 qX,hw+mhg!VEtU.+M)cBQ1u_%x i0zp0]6ʊCT?zZP93;L2P/if%jt5_s_˾Ru؊#n H}0;h>T_\zҁ -oh/wvb >bŅ_HiUw(/ߕNj$Nx[Aen֣!tӃX=qVBo[N&w&=Թ>?xG2CejKiGch)gNt#YA;#T<7LT+Ӕk1$hbl{vlgg8̂d_Hb gK+‚?h=D4w/{$aʋ4µKߠCj,טǥ[DJ njfW΁O8@&Ehu ],_] *c'pur2:M\YDil>QJK>ӎ~EAO`J,X 8UISdb$_n1?௾2.G7eޚoCY&$Tu:g%nVtyM[ަ㯶x$\rzLll+iLr|lG˻$y . >7%քz'>J_T;%:7&/d,p1Sp7nF7NC@/kQm/`w'0JQ]2l3WyDlC=46'eя)-IeC̄eMHJޖMv6ZT "S*wq'\:(Qϝ*x R XR#qGgAU"gK2Yp>/="k䧉HX9wzŽd t)oYn/ArH_j:&q",_xY\(fu[&qmp\3'd$4 y^)\lR&߬5Ą ,[80 YZoligoClasses/data/efsExample.rda0000644000175000017500000000264614136047277016550 0ustar nileshnileshXYh\Uf&Lf&Imi7\*)L͂Ť־73'{{o&.ER,(.X"K_}TEE˴stR[93{dcK!64G+*tVET֌! ;kk )+b~8ͱc|AoU&Kq}X"Qvyp8)<<XspI`l5x)l,mE )mk79/VB=Wpw'[(5bGC;QtDc_=rt+u:.9_\wyMOn`,?H'M0Aπ+ W+F\?3m7}!yRI`} }x$.cEcCN 1pbؚ/}D9uEgNc&d |\}U6>U2`C~0kc,N1N(u&֑CuwЗ2m9 >?Zscz2(LnU}=XF_o!{E|tqR))Rqfnĩ)azg.͵>)0J$J\@p2NFH8Y '+d%prNNI8}N'I8y '/%/K8N3 H8΀3( J8Π֭3fӬO.=:-4_r#)*;~ae]+Sd{[k'NlbmrԠJpcg~[#`cUx2%Vb;b>Tqa)%kGo ۧDUqP5o5^v'ccw_|Q~ЍdNU0Fjך/iEӄ̛꩏0XN^LBR- i,}}}5?fG)vw./(劆tuR+_Y5dfu9jo~\AK 9IbS^C4KD(H_ϫ:痬.7MԽ ^IOFJ{t%ٛQZ䭄癮