GenomicFiles/DESCRIPTION0000644000175200017520000000361714136071655015665 0ustar00biocbuildbiocbuildPackage: GenomicFiles Title: Distributed computing by file or by range Description: This package provides infrastructure for parallel computations distributed 'by file' or 'by range'. User defined MAPPER and REDUCER functions provide added flexibility for data combination and manipulation. Version: 1.30.0 Authors@R: c(person("Bioconductor Package Maintainer", role = c("aut", "cre"), email = "maintainer@bioconductor.org"), person("Valerie", "Obenchain", role = "aut"), person("Michael", "Love", role = "aut"), person("Lori", "Shepherd", role = "aut"), person("Martin", "Morgan", role = "aut")) biocViews: Genetics, Infrastructure, DataImport, Sequencing, Coverage Depends: R (>= 3.1.0), methods, BiocGenerics (>= 0.11.2), MatrixGenerics, GenomicRanges (>= 1.31.16), SummarizedExperiment, BiocParallel (>= 1.1.0), Rsamtools (>= 1.17.29), rtracklayer (>= 1.25.3) Imports: GenomicAlignments (>= 1.7.7), IRanges, S4Vectors (>= 0.9.25), VariantAnnotation (>= 1.27.9), GenomeInfoDb Suggests: BiocStyle, RUnit, genefilter, deepSNV, snpStats, RNAseqData.HNRNPC.bam.chr14, Biostrings, Homo.sapiens License: Artistic-2.0 Collate: GenomicFiles-class.R VcfStack-class.R reduceByFile-methods.R reduceByRange-methods.R reduceFiles.R reduceRanges.R reduceByYield.R pack-methods.R unpack-methods.R registry.R zzz.R Video: https://www.youtube.com/watch?v=3PK_jx44QTs RoxygenNote: 6.1.0 git_url: https://git.bioconductor.org/packages/GenomicFiles git_branch: RELEASE_3_14 git_last_commit: 6cde8a0 git_last_commit_date: 2021-10-26 Date/Publication: 2021-10-26 NeedsCompilation: no Packaged: 2021-10-26 21:31:25 UTC; biocbuild Author: Bioconductor Package Maintainer [aut, cre], Valerie Obenchain [aut], Michael Love [aut], Lori Shepherd [aut], Martin Morgan [aut] Maintainer: Bioconductor Package Maintainer GenomicFiles/NAMESPACE0000644000175200017520000000337414136050457015373 0ustar00biocbuildbiocbuildimport(methods) importFrom(stats, rbinom) import(BiocGenerics) importFrom(MatrixGenerics, rowRanges) import(S4Vectors) import(IRanges) import(GenomeInfoDb) import(GenomicRanges) import(SummarizedExperiment) import(Rsamtools) import(VariantAnnotation) importFrom(GenomicAlignments, summarizeOverlaps, Union) importMethodsFrom(GenomicAlignments, summarizeOverlaps) import(rtracklayer) import(BiocParallel) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export S4 classes ### exportClasses( GenomicFiles, VcfStack, RangedVcfStack ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export S4 methods for generics not defined in GenomicFiles ### exportMethods( "[", dim, names, show, yieldSize, 'colData<-', countBam, scanBam, summarizeOverlaps, coverage, summary, seqinfo, 'seqinfo<-', rowRanges, 'rowRanges<-', assay, colData, vcfFields ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export S4 generics & methods for generics defined in GenomicFiles ### export( ## GenomicFiles class: GenomicFiles, files, 'files<-', reduceByFile, reduceByRange, pack, unpack, ## VcfStack class: rownames, colnames ) exportMethods( ## GenomicFiles class GenomicFiles, files, 'files<-', reduceByFile, reduceByRange, pack, unpack, ## VcfStack class: rownames, colnames ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export non-generic functions ### export( ## file registry: .fileTypeRegistry, registerFileType, findTypeRegistry, makeFileType, reduceFiles, reduceRanges, reduceByYield, REDUCEsampler, VcfStack, RangedVcfStack, readVcfStack, getVCFPath, paths1kg ) GenomicFiles/NEWS0000644000175200017520000000326514136050457014652 0ustar00biocbuildbiocbuildCHANGES IN VERSION 1.18.0 ------------------------ NEW FEATURES o (v. 1.17.3) Add vcfFields,VcfStack-method. CHANGES IN VERSION 1.6.0 ------------------------ BUG FIXES o dimnames<- correctly updates dim names MODIFICATIONS o Defunct *FileViews classes CHANGES IN VERSION 1.4.0 ------------------------ NEW FEATURES o Add reduceFiles() and reduceRanges() o Add 'algorithm' argument to summarizeOverlaps methods o Add REDUCEsampler() from Martin MODIFICATIONS o Deprecate *FileViews classes o Modify show() for GenomicFiles class o Add 'Chunking' section to vignette o Update vignette figures o Change REDUCE default from `+` to `c` for reduceByYield() BUG FIXES o Bug fix for reduceByRange,GenomicFiles-method CHANGES IN VERSION 1.2.0 ------------------------ NEW FEATURES o Add pack / unpack generics and methods. o Add GenomicFiles class. o Add reduceByFile / reduceByRange methods for GenomicFiles class that expect 'file' to be character and 'ranges' a GRanges. o Move "yieldReduce" from Rsamtools to GenomicFiles and rename as "reduceByYield". o Allow GRange or GRangesList as @rowData in GenomicFiles class. MODIFICATIONS o Remove unused .FileList, VCFFileViews and FaFileViews class. o Add checks for 'summarize=FALSE' when REDUCER is used. o Clean up vignette introduction. o Change REDUCER() signature to single argument reguardless of the value of 'iterate'. o Rework reduceByYield() arguments for consistency with other reduceBy* functions. CHANGES IN VERSION 1.0.0 ------------------------ NEW FEATURES o First release of GenomicFiles package. GenomicFiles/R/0000755000175200017520000000000014136050457014346 5ustar00biocbuildbiocbuildGenomicFiles/R/GenomicFiles-class.R0000644000175200017520000001151614136050457020144 0ustar00biocbuildbiocbuild### ========================================================================= ### GenomicFiles class ### ========================================================================= setGeneric(".validity", function(object) standardGeneric(".validity")) setClass("GenomicFiles", contains="RangedSummarizedExperiment", representation( files="ANY" ), prototype( files=character()), validity=.validity ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Validity ### setMethod(.validity, "GenomicFiles", function(object) { msg <- NULL if (length(files(object)) != nrow(colData(object))) msg <- "'length(files(object))' must equal 'nrow(colData(object))'" msg }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Constructors ### setGeneric("GenomicFiles", function(rowRanges, files, ...) standardGeneric("GenomicFiles"), signature=c("rowRanges", "files")) setMethod(GenomicFiles, c("GenomicRanges_OR_GRangesList", "character"), function(rowRanges, files, colData=DataFrame(), metadata=list(), ...) { if (length(files)) { if (is.null(nms <- names(files))) { nms <- basename(files) names(files) <- nms } if (missing(colData)) colData <- DataFrame(row.names=nms) else rownames(colData) <- nms } new("GenomicFiles", SummarizedExperiment(rowRanges=rowRanges, colData=colData, metadata=metadata, ...), files=files) }) setMethod(GenomicFiles, c("GenomicRanges_OR_GRangesList", "List"), function(rowRanges, files, colData=DataFrame(), metadata=list(), ...) { if (length(files)) { if (is.null(nms <- names(files))) stop("'List' of files must be named") if (missing(colData)) colData <- DataFrame(row.names=basename(nms)) else rownames(colData) <- basename(nms) } new("GenomicFiles", SummarizedExperiment(rowRanges=rowRanges, colData=colData, metadata=metadata, ...), files=files) }) setMethod(GenomicFiles, c("GenomicRanges_OR_GRangesList", "list"), function(rowRanges, files, ...) { GenomicFiles(rowRanges, as(files, "List"), ...) }) setMethod(GenomicFiles, c("missing", "ANY"), function(rowRanges, files, ...) { GenomicFiles(GRanges(), files, ...) }) setMethod(GenomicFiles, c("missing", "missing"), function(rowRanges, files, ...) { GenomicFiles(GRanges(), character(), ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Getters and Setters ### setGeneric("files", function(x, ...) standardGeneric("files")) setMethod("files", "GenomicFiles", function(x, ...) { slot(x, "files") }) setGeneric("files<-", function(x, ..., value) standardGeneric("files<-")) setReplaceMethod("files", c("GenomicFiles", "character"), function(x, ..., value) { if (is.null(nms <- names(value))) nms <- basename(value) colData <- colData(x) rownames(colData) <- nms initialize(x, colData=colData, files=value) }) setReplaceMethod("files", c("GenomicFiles", "List"), function(x, ..., value) { if (is.null(nms <- names(value))) nms <- value colData <- colData(x) rownames(colData) <- nms initialize(x, colData=colData, files=value) }) setReplaceMethod("colData", c("GenomicFiles", "DataFrame"), function(x, ..., value) { if (length(files(x)) != nrow(value)) stop("'length(files(x))' must equal 'nrow(value)'") files <- files(x) names(files) <- rownames(value) initialize(x, colData=value, files=files) }) setReplaceMethod("dimnames", c("GenomicFiles", "list"), function(x, value) { x <- callNextMethod() files <- files(x) names(files) <- value[[2]] initialize(x, files=files) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Subsetting ### setMethod("[", c("GenomicFiles", "ANY", "ANY"), function(x, i, j, ..., drop=TRUE) { if (missing(i) && missing(j)) x if (!missing(j)) { if (is.character(j)) j <- match(j, colnames(x)) if (any(is.na(j))) stop("subscript 'j' out of bounds") callNextMethod(x, i, j, files=files(x)[j], ...) } else { callNextMethod() } }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Show ### setMethod(show, "GenomicFiles", function(object) { cat(class(object), "object with", paste(dim(object), c("ranges", "files:"), collapse=" and "), "\n") cat("files:", paste(S4Vectors:::selectSome(basename(files(object))), collapse=", "), "\n") cat("detail: use files(), rowRanges(), colData(), ...", "\n") }) GenomicFiles/R/VcfStack-class.R0000644000175200017520000003076014136050457017306 0ustar00biocbuildbiocbuild### ========================================================================= ### VcfStack and RangedVcfStack class ### ========================================================================= .validVcfStack = function(object) { msg <- NULL if (!all(rownames(object) %in% seqlevels(object))) msg <- c(msg, "all rownames(object) must be in seqlevels(object)") if (is.null(msg)) TRUE else msg } setClass("VcfStack", representation( files="VcfFileList", seqinfo="Seqinfo", colData="DataFrame" ), validity=.validVcfStack ) .validRangedVcfStack = function(object) { msg <- NULL if (!identical(seqinfo(rowRanges(object)), seqinfo(object))) msg <- c(msg, "seqinfo() on rowRanges() differs from seqinfo() on object") if (!all(seqnames(rowRanges(object)) %in% rownames(object))) msg <- c(msg, "not all 'GRanges' seqnames are in VcfStack") if (is.null(msg)) TRUE else msg } setClass("RangedVcfStack", contains="VcfStack", representation( rowRanges="GRanges" ), validity=.validRangedVcfStack ) # check for sample consistency separate function to make optional for # slow internet connections .validSamples <- function(files, colData){ msg = NULL if (length(files)) { smps = samples(scanVcfHeader(files[[1]])) if (!all(rownames(colData) %in% smps)) msg <- c(msg, "all colnames(object) must be sample names in VCF 'files'") samplesOk <- sapply(files, function(file) { setequal(samples(scanVcfHeader(file)), smps) }) if (!all(samplesOk)) msg <- c(msg, "sample names are not consistent between VCF 'files'") } if (is.null(msg)) TRUE else msg } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Constructors ## VcfStack <- function(files=NULL, seqinfo=NULL, colData=NULL, index=TRUE, check=TRUE) { stopifnot(is.logical(index), length(index) == 1L, !is.na(index)) if (is.null(files)) { files <- VcfFileList() header <- NULL } else { if (!is(files, "VcfFileList")) files = VcfFileList(files) if (index) files = indexVcf(files) header <- scanVcfHeader(files[[1]]) } if (is.null(seqinfo)) { seqinfo <- if (length(files)) { seqinfo(files) } else Seqinfo() } if (is.null(colData) && length(files)) { colData <- DataFrame(row.names=samples(header)) } else { colData <- as(colData, "DataFrame") } if (is.null(rownames(colData)) && length(files)) stop("specify rownames in 'colData'") if (check) { res <- .validSamples(files, colData) if (!isTRUE(res)) stop(res) } new("VcfStack", files=files, colData=colData, seqinfo=seqinfo) } RangedVcfStack <- function(vs=NULL, rowRanges=NULL) { if (is.null(vs) && is.null(rowRanges)) { vs <- VcfStack() rowRanges <- GRanges() } else { stopifnot(is(vs, "VcfStack")) if (is.null(rowRanges)){ rowRanges <- GRanges(seqinfo(vs)) if (any(!seqnames(rowRanges) %in% rownames(vs))) rowRanges <- rowRanges[seqnames(rowRanges) %in% rownames(vs)] } new2old <- match(seqlevels(vs), seqlevels(rowRanges)) seqinfo(rowRanges, new2old=new2old) <- seqinfo(vs) } new("RangedVcfStack", vs, rowRanges=rowRanges) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Getters and setters ### setMethod("dimnames", "VcfStack", function(x){ list(names(files(x)), rownames(colData(x))) }) setMethod("dim", "VcfStack", function(x) { c(length(files(x)), nrow(colData(x))) }) setMethod("files", "VcfStack", function(x, ...) x@files ) setReplaceMethod("files", c("VcfStack", "character"), function(x, ..., check=TRUE, value) { files(x) <- VcfFileList(value) if (check) { res <- .validSamples(files(x), colData(x)) if (!isTRUE(res)) stop(res) } x }) setReplaceMethod("files", c("VcfStack", "VcfFile"), function(x, ..., check=TRUE, value) { files(x) <- VcfFileList(value) if (check) { res <- .validSamples(files(x), colData(x)) if (!isTRUE(res)) stop(res) } x }) setReplaceMethod("files", c("VcfStack", "VcfFileList"), function(x, ..., check=TRUE, value) { value <- indexVcf(value) if (check) { res <- .validSamples(value, colData(x)) if (!isTRUE(res)) stop(res) } initialize(x, files=value) }) ## seqinfo (also seqlevels, genome, seqlevels<-, genome<-) setMethod(seqinfo, "VcfStack", function(x) x@seqinfo ) setReplaceMethod("seqinfo", "VcfStack", function (x, new2old = NULL, pruning.mode = c("error", "coarse", "fine", "tidy"), value) { initialize(x, seqinfo=value) }) ## H.P. 2017-04-29: I renamed 'force' -> 'pruning.mode'. Surprisingly this ## argument is ignored. That doesn't seem right. setReplaceMethod("seqinfo", "RangedVcfStack", function (x, new2old = NULL, pruning.mode = c("error", "coarse", "fine", "tidy"), value) { if (!is(value, "Seqinfo")) stop("the supplied 'seqinfo' must be a Seqinfo object") if (is.null(new2old)) new2old <- match(seqnames(value), seqlevels(rowRanges(x))) rowRanges <- rowRanges(x) seqinfo(rowRanges, new2old=new2old) <- value initialize(x, seqinfo=value, rowRanges=rowRanges) }) setReplaceMethod("seqlevelsStyle", "VcfStack", function(x, value) { newSeqInfo <- seqinfo(x) seqlevelsStyle(newSeqInfo) <- value newFiles <- files(x) nms = names(newFiles) seqlevelsStyle(nms) <- value names(newFiles) <- nms initialize(x, seqinfo=newSeqInfo, files=newFiles) }) setReplaceMethod("seqlevelsStyle", "RangedVcfStack", function(x, value) { newSeqInfo <- seqinfo(x) seqlevelsStyle(newSeqInfo) <- value newFiles <- files(x) nms = names(newFiles) seqlevelsStyle(nms) <- value names(newFiles) <- nms newRange <- rowRanges(x) seqlevelsStyle(newRange) <- value initialize(x, seqinfo=newSeqInfo, files=newFiles, rowRanges=newRange) }) setMethod(colData, "VcfStack", function(x) x@colData ) setReplaceMethod("colData", c("VcfStack", "DataFrame"), function(x, ..., value) { initialize(x, colData=value) }) setMethod("rowRanges", "RangedVcfStack", function(x, ...) x@rowRanges ) setReplaceMethod("rowRanges", c("RangedVcfStack", "GRanges"), function(x, ..., value) { new2old <- match(seqlevels(x), seqlevels(value)) seqinfo(value, new2old=new2old) <- seqinfo(x) initialize(x, rowRanges=value) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Other methods ### setMethod("vcfFields", "VcfStack", function(x, ...) { vcfFields(files(x)) }) setMethod("assay", c("VcfStack", "ANY"), function(x, i, ..., BPPARAM=bpparam()) { if (is(i, "GRanges")) { files <- files(x)[as.character(seqnames(i))] } else { files <- if (missing(i)) files(x) else files(x)[i] i <- GRanges(seqinfo(x))[names(files)] } i <- splitAsList(i, seq_along(i)) genotypes <- bpmapply(function(file, grange, genome) { ## FIXME: readGeno or other more efficient input? vcf <- readVcf(file, genome, grange) t(as(genotypeToSnpMatrix(vcf)$genotypes, "numeric")) }, files, i, MoreArgs=list(genome=genome(x)), BPPARAM=BPPARAM) do.call(rbind, genotypes) }) setMethod("assay", c("RangedVcfStack", "ANY"), function(x, i, ...) { if (!missing(i)) message(paste(strwrap( "RangedVcfStack uses rowRanges to subset; ignoring 'i'", exdent=4), collapse="\n")) i <- rowRanges(x) callNextMethod(x=x, i=i) }) readVcfStack <- function(x, i, j=colnames(x), param=ScanVcfParam()) { stopifnot(is(x, "VcfStack")) if ((!missing(i) || !missing(j)) && !missing(param)) stop("'i' and 'j' cannot be used with 'param'") gr <- NULL if (missing(param) && missing(i) && is(x, "RangedVcfStack")) { gr <- rowRanges(x) i = intersect(names(files(x)), as.character(seqnames(gr))) } else if (missing(param) && missing(i)) { gr <- GRanges() i = names(files(x)) } else if (missing(param) && is(i, "GRanges")) { gr <- i i = unique(seqnames(i)) } else if (missing(param)) { if (is.numeric(i)) i = names(files(x))[i] gr <- GRanges() } else { # use param gr <- GRanges(vcfWhich(param)) i = intersect(names(files(x)), as.character(seqnames(gr))) } x = x[i] if (is.numeric(j)) { j <- colnames(x)[j] } else if (!missing(param)) { j <- vcfSamples(param) } genome <- genome(x) vcfSamples(param) <- j vcfWhich(param) <- gr vcf <- lapply(names(files(x)), function(i, files, genome, param) { file <- files[[i]] if (length(vcfWhich(param))) vcfWhich(param) <- vcfWhich(param)[i] readVcf(file, genome, param) }, files(x), genome, param) do.call(rbind, vcf) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Subsetting ### setMethod("[", c("VcfStack", "ANY", "ANY"), function(x, i, j, ..., drop=TRUE){ if (1L != length(drop) || (!missing(drop) && drop)) warning("'drop' ignored '[,VcfStack,ANY,ANY-method'") if (missing(i) && missing(j)) { x } else if (missing(j)) { if (is(i, "GRanges")) { i <- as.character(seqnames(i)) } initialize(x, files=files(x)[i]) } else if (missing(i)) { colData = colData(x)[j,,drop=FALSE] if (any(is.na(rownames(colData)))) stop("invalid 'j' value; sample not found") initialize(x, colData=colData) } else { if (is(i, "GRanges")) { i <- as.character(seqnames(i)) } colData = colData(x)[j,,drop=FALSE] if (any(is.na(rownames(colData)))) stop("invalid 'j' value; sample not found") initialize(x, files=files(x)[i], colData=colData) } }) setMethod("[", c("RangedVcfStack", "ANY", "ANY"), function(x, i, j, ..., drop=TRUE) { if (1L != length(drop) || (!missing(drop) && drop)) warning("'drop' ignored '[,RangedVcfStack,ANY,ANY-method'") if (missing(i)) { i <- rownames(x) } else if (is(i, "GenomicRanges")) { stopifnot(all(seqnames(i) %in% rownames(x))) rowRanges(x) <- intersect(rowRanges(x), i) } else if (is(i, "character")) { stopifnot(all(i %in% rownames(x))) value <- rowRanges(x) rowRanges(x) <- value[seqnames(value) %in% i] } else { stopifnot(is(i, "numeric") || is(i, "logical")) value <- rowRanges(x) rowRanges(x) <- value[seqnames(value) %in% rownames(x)[i]] } if (missing(j)) j <- colnames(x) callNextMethod(x=x, i=i, j=j) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### show() ### setMethod("show", "VcfStack", function(object) { cat("VcfStack object with ", nrow(object), " files and ", ncol(object), " samples", "\n", sep="") if (is(object, "RangedVcfStack")) { cat(summary(rowRanges(object)), "\n") } cat("Seqinfo object with", summary(seqinfo(object)), "\n") cat("use 'readVcfStack()' to extract VariantAnnotation VCF.\n") }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Helpers ### getVCFPath <- function(vs, chrtok) { .Deprecated("files(vs)[chrtok]") files(vs)[chrtok] } paths1kg <- function(chrtoks) sapply(chrtoks, .path1kg, USE.NAMES=FALSE) .path1kg <- function (chrtok) { stopifnot(length(chrtok)==1 && is.atomic(chrtok)) if (is.numeric(chrtok)) chrtok = as.integer(chrtok) if (is(chrtok, "integer")) chrtok = paste0("chr", chrtok) if (length(grep("chr", chrtok)) < 1) warning("probably need 'chr' in input string") tmplate = "http://1000genomes.s3.amazonaws.com/release/20130502/ALL.%%N%%.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.vcf.gz" if (length(grep("X", chrtok)) > 0) tmplate = "http://1000genomes.s3.amazonaws.com/release/20130502/ALL.%%N%%.phase3_shapeit2_mvncall_integrated_v1b.20130502.genotypes.vcf.gz" if (length(grep("Y", chrtok)) > 0) tmplate = "http://1000genomes.s3.amazonaws.com/release/20130502/ALL.%%N%%.phase3_integrated_v1b.20130502.genotypes.vcf.gz" ans = as.character(gsub("%%N%%", chrtok, tmplate)) names(ans) = chrtok ans } GenomicFiles/R/pack-methods.R0000644000175200017520000000345714136050457017061 0ustar00biocbuildbiocbuild### ========================================================================= ### pack methods ### ========================================================================= ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Generic and methods ### setGeneric("pack", function(x, ...) standardGeneric("pack"), signature="x") setMethod("pack", "GRanges", function(x, ..., range_len=1e9, inter_range_len=1e7) .pack(x, range_len=range_len, inter_range_len=inter_range_len) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Helpers ### isPacked <- function(x, ...) { if (!is(x, "GRangesList")) stop("'x' must be a GRangesList object") if (is(x@partitioning, "PartitioningMap")) TRUE else FALSE } .pack <- function(x, range_len, inter_range_len) { if (length(x) == 0) return(x) ## order o <- order(x) as.character(seqnames(x)) if (is.unsorted(o)) x_grl <- splitAsList(x[o], seqnames(x)[o]) else x_grl <- splitAsList(x, seqnames(x)) ## identify 'long' and 'distant' long <- which(width(unlist(x_grl, use.names=FALSE)) > range_len) long_minus1 <- long - 1L long_minus1 <- long_minus1[long_minus1 > 0L] irange <- unname(setdiff(range(x_grl), x_grl)) irange_max <- irange[width(irange) > inter_range_len] irange_idx <- elementNROWS(irange_max) > 0 distant <- integer() if (any(irange_idx)) distant <- sapply(irange_max[irange_idx], function(i, xx) follow(i, xx, ignore.strand=TRUE), xx=unlist(x_grl, use.names=FALSE)) ends <- c(distant, long_minus1, long, end(PartitioningByEnd(x_grl))) x_grl@partitioning <- PartitioningMap(x=sort(unique(ends)), order(o)) x_grl } GenomicFiles/R/reduceByFile-methods.R0000644000175200017520000000622614136050457020502 0ustar00biocbuildbiocbuild### ========================================================================= ### reduceByFile ### ========================================================================= ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Generic and methods ### .reduceByFile <- function(ranges, files, MAP, REDUCE, ..., iterate, init) { if (!is(files, "character") && !is(files, "List")) stop("'files' must be character vector or List of filenames") if (missing(REDUCE) && iterate) iterate <- FALSE if (missing(REDUCE)) REDUCE <- NULL if (missing(init)) init <- NULL ## files sent to workers bplapply(files, function(file, ranges, MAP, REDUCE, ..., iterate, init) { if (iterate) { result <- if (is.null(init)) MAP(ranges[[1]], file, ...) else init for (i in seq_along(ranges)[-1]) { mapped <- MAP(ranges[[i]], file, ...) result <- REDUCE(list(result, mapped), ...) } result } else { mapped <- lapply(ranges, MAP, file, ...) if (is.null(REDUCE)) mapped else REDUCE(mapped, ...) } }, ..., ranges=ranges, MAP=MAP, REDUCE=REDUCE, iterate=iterate, init=init) } setGeneric("reduceByFile", function(ranges, files, MAP, REDUCE, ..., iterate=TRUE, init) standardGeneric("reduceByFile"), signature=c("ranges", "files") ) setMethod(reduceByFile, c("GRangesList", "ANY"), function(ranges, files, MAP, REDUCE, ..., summarize=FALSE, iterate=TRUE, init) { lst <- .reduceByFile(ranges, files, MAP, REDUCE, ..., iterate=iterate, init=init) if (summarize && !missing(REDUCE)) warning("'summarize' set to FALSE when REDUCE is provided") if (summarize && missing(REDUCE)) SummarizedExperiment(SimpleList(list(data=simplify2array(lst))), rowRanges=ranges, colData=DataFrame(filePath=files)) else lst } ) setMethod(reduceByFile, c("GRanges", "ANY"), function(ranges, files, MAP, REDUCE, ..., summarize=FALSE, iterate=TRUE, init) { lst <- .reduceByFile(as(ranges, "CompressedGRangesList"), files, MAP, REDUCE, ..., iterate=iterate, init=init) if (summarize && !missing(REDUCE)) warning("'summarize' set to FALSE when REDUCE is provided") if (summarize && missing(REDUCE)) SummarizedExperiment(SimpleList(list(data=simplify2array(lst))), rowRanges=ranges, colData=DataFrame(filePath=files)) else lst } ) setMethod(reduceByFile, c("GenomicFiles", "missing"), function(ranges, files, MAP, REDUCE, ..., summarize=FALSE, iterate=TRUE, init) { reduceByFile(rowRanges(ranges), GenomicFiles::files(ranges), MAP, REDUCE, ..., summarize=summarize, iterate=iterate, init=init) } ) GenomicFiles/R/reduceByRange-methods.R0000644000175200017520000000656614136050457020666 0ustar00biocbuildbiocbuild### ========================================================================= ### Queries across files (reduceByRange) ### ========================================================================= ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Generic and methods ### .reduceByRange <- function(ranges, files, MAP, REDUCE, ..., iterate, init) { if (!is(files, "character") && !is(files, "List")) stop("'files' must be character vector or List of filenames") if (missing(REDUCE) && iterate) iterate <- FALSE if (missing(REDUCE)) REDUCE <- NULL if (missing(init)) init <- NULL ## ranges sent to workers bplapply(ranges, function(elt, files, MAP, REDUCE, ..., iterate, init) { if (iterate) { result <- if (is.null(init)) { MAP(elt, files[[1]], ...) } else init for (i in seq_along(files)[-1]) { mapped <- MAP(elt, files[[i]], ...) result <- REDUCE(list(result, mapped), ...) } result } else { mapped <- lapply(files, function(f) MAP(elt, f, ...)) if (is.null(REDUCE)) mapped else REDUCE(mapped, ...) } }, ..., files=files, MAP=MAP, REDUCE=REDUCE, iterate=iterate, init=init) } setGeneric("reduceByRange", function(ranges, files, MAP, REDUCE, ..., iterate=TRUE, init) standardGeneric("reduceByRange"), signature=c("ranges", "files") ) setMethod(reduceByRange, c("GRangesList", "ANY"), function(ranges, files, MAP, REDUCE, ..., summarize=FALSE, iterate=TRUE, init) { lst <- .reduceByRange(ranges, files, MAP, REDUCE, ..., iterate=iterate) if (summarize && !missing(REDUCE)) warning("'summarize' set to FALSE when REDUCE is provided") if (summarize && missing(REDUCE)) { lst <- bplapply(seq_along(files), function(i) sapply(lst, "[", i)) SummarizedExperiment(SimpleList(list(data=simplify2array(lst))), rowRanges=ranges, colData=DataFrame(filePath=files)) } else { lst } } ) setMethod(reduceByRange, c("GRanges", "ANY"), function(ranges, files, MAP, REDUCE, ..., summarize=FALSE, iterate=TRUE, init) { lst <- .reduceByRange(as(ranges, "CompressedGRangesList"), files, MAP, REDUCE, ..., iterate=iterate) if (summarize && !missing(REDUCE)) warning("'summarize' set to FALSE when REDUCE is provided") if (summarize && missing(REDUCE)) { lst <- bplapply(seq_along(files), function(i) sapply(lst, "[", i)) SummarizedExperiment(SimpleList(list(data=simplify2array(lst))), rowRanges=ranges, colData=DataFrame(filePath=files)) } else { lst } } ) setMethod(reduceByRange, c("GenomicFiles", "missing"), function(ranges, files, MAP, REDUCE, ..., summarize=FALSE, iterate=TRUE, init) { reduceByRange(rowRanges(ranges), GenomicFiles::files(ranges), MAP, REDUCE, ..., summarize=summarize, iterate=iterate, init=init) } ) GenomicFiles/R/reduceByYield.R0000644000175200017520000000522214136050457017223 0ustar00biocbuildbiocbuild### ========================================================================= ### reduceByYield (iterate through files by chunk) ### ========================================================================= .reduceByYield_iterate <- function(X, YIELD, MAP, REDUCE, DONE, ..., BPPARAM = registered()[[1]], parallel, init) { if (parallel) { ITER <- function() { if(DONE(value <- YIELD(X, ...))) NULL else value } result <- bpiterate(ITER, FUN=MAP, REDUCE=REDUCE, ...) } else { result <- if (missing(init)) { data <- YIELD(X, ...) if (DONE(data)) return(list()) MAP(data, ...) } else init repeat { if(DONE(data <- YIELD(X, ...))) break value <- MAP(data, ...) result <- REDUCE(result, value) } } result } .reduceByYield_all <- function(X, YIELD, MAP, REDUCE, DONE, ..., parallel) { if (parallel) { ITER <- function() { if(DONE(value <- YIELD(X, ...))) NULL else value } result <- bpiterate(ITER, FUN=MAP, ...) } else { result <- bpiterate(ITER, FUN=MAP, ..., BPPARAM=SerialParam()) } REDUCE(result) } ## REDUCE and init are never NULL; init can be missing reduceByYield <- function(X, YIELD, MAP = identity, REDUCE = `+`, DONE = function(x) is.null(x) || length(x) == 0L, ..., parallel=FALSE, iterate=TRUE, init) { if (!iterate && !missing(init)) warning("'init' ignored when iterate == FALSE") if (!isOpen(X)) { open(X) on.exit(close(X)) } if (iterate) .reduceByYield_iterate(X, YIELD, MAP, REDUCE, DONE, ..., parallel=parallel, init=init) else .reduceByYield_all(X, YIELD, MAP, REDUCE, DONE, ..., parallel=parallel) } REDUCEsampler <- function(sampleSize=1000000, verbose=FALSE) { tot <- 0L function(x, y, ...) { if (length(x) < sampleSize) stop("expected yield of at least sampleSize=", sampleSize) if (tot == 0L) { ## first time through tot <<- length(x) x <- x[sample(length(x), sampleSize)] } yld_n <- length(y) tot <<- tot + yld_n if (verbose) message("REDUCEsampler total=", tot) keep <- rbinom(1L, min(sampleSize, yld_n), yld_n / tot) i <- sample(sampleSize, keep) j <- sample(yld_n, keep) x[i] <- y[j] x } } GenomicFiles/R/reduceFiles.R0000644000175200017520000000107614136050457016727 0ustar00biocbuildbiocbuild### ========================================================================= ### reduceFiles ### ========================================================================= reduceFiles <- function(ranges, files, MAP, REDUCE, ..., init) { if (is(ranges, "GenomicFiles")) { files <- GenomicFiles::files(ranges) ranges <- rowRanges(ranges) } if (!is(ranges, "GRanges") && !is(ranges, "GRangesList")) stop("'ranges' must be GRanges or GRangesList") .reduceByFile(list(ranges), files, MAP, REDUCE, ..., iterate=FALSE) } GenomicFiles/R/reduceRanges.R0000644000175200017520000000110314136050457017073 0ustar00biocbuildbiocbuild### ========================================================================= ### reduceRanges ### ========================================================================= reduceRanges <- function(ranges, files, MAP, REDUCE, ..., init) { if (is(ranges, "GenomicFiles")) { files <- GenomicFiles::files(ranges) ranges <- rowRanges(ranges) } if (!is(ranges, "GRanges") && !is(ranges, "GRangesList")) stop("'ranges' must be GRanges or GRangesList") .reduceByRange(ranges, list(files), MAP, REDUCE, ..., iterate=FALSE) } GenomicFiles/R/registry.R0000644000175200017520000000163114136050457016342 0ustar00biocbuildbiocbuild### ========================================================================= ### Utilities for creating and searching a 'file type' registry ### ========================================================================= .fileTypeRegistry <- new.env(parent=emptyenv()) registerFileType <- function(type, package, regex) { .fileTypeRegistry[[regex]] <- list(package=package, type=type) invisible(.fileTypeRegistry[[regex]]) } findTypeRegistry <- function(fnames) { regexes <- ls(.fileTypeRegistry) for (regex in regexes) if (all(grepl(regex, fnames))) return(regex) stop("unknown file type ", paste(sQuote(fnames), collapse=", ")) } makeFileType <- function(fnames, ..., regex=findTypeRegistry(fnames)) { nmspc <- getNamespace(.fileTypeRegistry[[regex]]$package) type <- .fileTypeRegistry[[regex]]$type FUN <- get(type, nmspc) do.call(FUN, list(fnames, ...)) } GenomicFiles/R/unpack-methods.R0000644000175200017520000000177514136050457017425 0ustar00biocbuildbiocbuild### ========================================================================= ### unpack methods ### ========================================================================= ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Generic and methods ### setGeneric("unpack", function(flesh, skeleton, ...) standardGeneric("unpack"), signature=c("flesh", "skeleton")) ## handle results from *lapply() setMethod("unpack", c("list", "GRangesList"), function(flesh, skeleton, ...) unpack(List(flesh), skeleton, ...) ) setMethod("unpack", c("List", "GRangesList"), function(flesh, skeleton, ...) { if (!isPacked(skeleton)) stop("'flesh' must be a packed object") if (sum(elementNROWS(flesh)) != sum(elementNROWS(skeleton))) stop("elementNROWS(flesh) must equal elementNROWS(skeleton)") mo <- mapOrder(skeleton@partitioning) if (is(flesh, "RleList")) do.call(c, flesh)[mo] else unlist(flesh, use.names=FALSE)[mo] }) GenomicFiles/R/zzz.R0000644000175200017520000000043514136050457015330 0ustar00biocbuildbiocbuild.onLoad <- function(libname, pkgname) { registerFileType("FaFileList", "Rsamtools", "\\.fa$") registerFileType("FaFileList", "Rsamtools", "\\.fasta$") registerFileType("BamFileList", "Rsamtools", "\\.bam$") registerFileType("BigWigFileList", "rtracklayer", "\\.bw$") } GenomicFiles/README.md0000644000175200017520000000010314136050457015416 0ustar00biocbuildbiocbuildGenomicFiles ========= Distributed computing by file or by range GenomicFiles/build/0000755000175200017520000000000014136071655015247 5ustar00biocbuildbiocbuildGenomicFiles/build/vignette.rds0000644000175200017520000000043114136071655017604 0ustar00biocbuildbiocbuild}P]K0MZQ `XCkLHfΛ-5r?N9e%(0K0Jŏ\F#JY-Bcڪc.7wȣ=j!F5\7nbϜZJX?waJ#3Ey9o\'=dRCmbBm|%Aw #L1[*_qj>?wjtO/1avaʝ6=\8GenomicFiles/inst/0000755000175200017520000000000014136071655015125 5ustar00biocbuildbiocbuildGenomicFiles/inst/doc/0000755000175200017520000000000014136071655015672 5ustar00biocbuildbiocbuildGenomicFiles/inst/doc/GenomicFiles.R0000644000175200017520000003021314136071655020360 0ustar00biocbuildbiocbuild### R code from vignette source 'GenomicFiles.Rnw' ################################################### ### code chunk number 1: style ################################################### BiocStyle::latex() ################################################### ### code chunk number 2: install (eval = FALSE) ################################################### ## if (!require("BiocManager")) ## install.packages("BiocManager") ## BiocManager::install("GenomicFiles") ################################################### ### code chunk number 3: quick_start-load ################################################### library(GenomicFiles) ################################################### ### code chunk number 4: quick_start-ranges ################################################### gr <- GRanges("chr14", IRanges(c(19411500 + (1:5)*20), width=10)) ################################################### ### code chunk number 5: class-bam-data ################################################### library(RNAseqData.HNRNPC.bam.chr14) fls <- RNAseqData.HNRNPC.bam.chr14_BAMFILES ################################################### ### code chunk number 6: quick_start-MAP ################################################### MAP <- function(range, file, ...) { requireNamespace("Rsamtools") Rsamtools::pileup(file, scanBamParam=Rsamtools::ScanBamParam(which=range)) } ################################################### ### code chunk number 7: quick_start-reduceByFile ################################################### se <- reduceByFile(gr, fls, MAP, summarize=TRUE) se ################################################### ### code chunk number 8: quick_start-assays ################################################### dim(assays(se)$data) ## ranges x files ################################################### ### code chunk number 9: quick_start-MAP-REDUCE-reduceByRange ################################################### REDUCE <- function(mapped, ...) { cmb = do.call(rbind, mapped) xtabs(count ~ pos + nucleotide, cmb) } lst <- reduceByRange(gr, fls, MAP, REDUCE, iterate=FALSE) ################################################### ### code chunk number 10: quick_start-result ################################################### head(lst[[1]], 3) ################################################### ### code chunk number 11: overview-GenomicFiles ################################################### GenomicFiles(gr, fls) ################################################### ### code chunk number 12: pileups-ranges ################################################### gr <- GRanges("chr14", IRanges(c(19411677, 19659063, 105421963, 105613740), width=20)) ################################################### ### code chunk number 13: pileups-MAP ################################################### MAP <- function(range, file, ...) { requireNamespace("deepSNV") ct = deepSNV::bam2R(file, GenomeInfoDb::seqlevels(range), GenomicRanges::start(range), GenomicRanges::end(range), q=0) ct[, c("A", "T", "C", "G", "a", "t", "c", "g")] } ################################################### ### code chunk number 14: pileups-REDUCE ################################################### REDUCE <- function(mapped, ...) Reduce("+", mapped) ################################################### ### code chunk number 15: pileups-reduceByRange ################################################### pile2 <- reduceByRange(gr, fls, MAP, REDUCE) length(pile2) elementNROWS(pile2) ################################################### ### code chunk number 16: pileups-res ################################################### head(pile2[[1]]) ################################################### ### code chunk number 17: ttest-ranges ################################################### roi <- GRanges("chr14", IRanges(c(19411677, 19659063, 105421963, 105613740), width=20)) ################################################### ### code chunk number 18: ttest-group ################################################### grp <- factor(rep(c("A","B"), each=length(fls)/2)) ################################################### ### code chunk number 19: ttest-MAP ################################################### MAP <- function(range, file, ...) { requireNamespace("GenomicAlignments") param <- Rsamtools::ScanBamParam(which=range) as.numeric(unlist( GenomicAlignments::coverage(file, param=param)[range], use.names=FALSE)) } ################################################### ### code chunk number 20: ttest-REDUCE ################################################### REDUCE <- function(mapped, ..., grp) { mat = simplify2array(mapped) idx = which(rowSums(mat) != 0) df = genefilter::rowttests(mat[idx,], grp) cbind(offset = idx - 1, df) } ################################################### ### code chunk number 21: ttest-results (eval = FALSE) ################################################### ## ttest <- reduceByRange(roi, fls, MAP, REDUCE, iterate=FALSE, grp=grp) ################################################### ### code chunk number 22: junctions-ranges ################################################### gr <- GRanges("chr14", IRanges(c(19100000, 106000000), width=1e7)) ################################################### ### code chunk number 23: junctions-MAP ################################################### MAP <- function(range, file, ...) { requireNamespace("GenomicAlignments") ## for readGAlignments() ## ScanBamParam() param = Rsamtools::ScanBamParam(which=range) gal = GenomicAlignments::readGAlignments(file, param=param) table(GenomicAlignments::njunc(gal)) } ################################################### ### code chunk number 24: junctions-GenomicFiles ################################################### gf <- GenomicFiles(gr, fls) gf ################################################### ### code chunk number 25: junctions-counts1 ################################################### counts1 <- reduceByFile(gf[,1:3], MAP=MAP) length(counts1) ## 3 files elementNROWS(counts1) ## 2 ranges ################################################### ### code chunk number 26: junctions-counts1-show ################################################### counts1[[1]] ################################################### ### code chunk number 27: junctions-REDUCE ################################################### REDUCE <- function(mapped, ...) sum(sapply(mapped, "[", "1")) reduceByFile(gr, fls, MAP, REDUCE) ################################################### ### code chunk number 28: junctions-counts2 ################################################### counts2 <- reduceFiles(gf[,1:3], MAP=MAP) ################################################### ### code chunk number 29: junctions-counts2-show ################################################### ## reduceFiles returns counts for all ranges. counts2[[1]] ## reduceByFile returns counts for each range separately. counts1[[1]] ################################################### ### code chunk number 30: coverage1-tiles ################################################### chr14_seqlen <- seqlengths(seqinfo(BamFileList(fls))["chr14"]) tiles <- tileGenome(chr14_seqlen, ntile=5) ################################################### ### code chunk number 31: coverage1-tiles-show ################################################### tiles ################################################### ### code chunk number 32: coverage1-MAP ################################################### MAP = function(range, file, ...) { requireNamespace("GenomicAlignments") ## for ScanBamParam() and coverage() param = Rsamtools::ScanBamParam(which=range) rle = GenomicAlignments::coverage(file, param=param)[range] c(width = GenomicRanges::width(range), sum = sum(S4Vectors::runLength(rle) * S4Vectors::runValue(rle))) } ################################################### ### code chunk number 33: coverage1-REDUCE ################################################### REDUCE = function(mapped, ...) { Reduce(function(i, j) Map("+", i, j), mapped) } ################################################### ### code chunk number 34: coverage1-results (eval = FALSE) ################################################### ## cvg1 <- reduceByFile(tiles, fls, MAP, REDUCE, iterate=TRUE) ################################################### ### code chunk number 35: coverage2-MAP ################################################### MAP = function(range, file, ...) { requireNamespace("GenomicAlignments") ## for ScanBamParam() and coverage() GenomicAlignments::coverage( file, param=Rsamtools::ScanBamParam(which=range))[range] } ################################################### ### code chunk number 36: coverage2-REDUCE ################################################### REDUCE = function(mapped, ...) { sapply(mapped, Reduce, f = "+") } ################################################### ### code chunk number 37: coverage2-results ################################################### cvg2 <- reduceFiles(unlist(tiles), fls, MAP, REDUCE) ################################################### ### code chunk number 38: coverage2-show ################################################### cvg2[1] ################################################### ### code chunk number 39: coverage3-MAP ################################################### MAP = function(range, file, ...) { requireNamespace("BiocParallel") ## for bplapply() nranges = 2 idx = split(seq_along(range), ceiling(seq_along(range)/nranges)) BiocParallel::bplapply(idx, function(i, range, file) { requireNamespace("GenomicAlignments") ## ScanBamParam(), coverage() chunk = range[i] param = Rsamtools::ScanBamParam(which=chunk) cvg = GenomicAlignments::coverage(file, param=param)[chunk] Reduce("+", cvg) ## collapse coverage within chunks }, range, file) } ################################################### ### code chunk number 40: coverage3-REDUCE ################################################### REDUCE = function(mapped, ...) { sapply(mapped, Reduce, f = "+") } ################################################### ### code chunk number 41: coverage3-results (eval = FALSE) ################################################### ## cvg3 <- reduceFiles(unlist(tiles), fls, MAP, REDUCE) ################################################### ### code chunk number 42: reduceByYield-YIELD ################################################### library(GenomicAlignments) bf <- BamFile(fls[1], yieldSize=100000) YIELD <- function(x, ...) readGAlignments(x) ################################################### ### code chunk number 43: reduceByYield-MAP-REDUCE ################################################### gr <- unlist(tiles, use.names=FALSE) MAP <- function(value, gr, ...) { requireNamespace("GenomicRanges") ## for countOverlaps() GenomicRanges::countOverlaps(gr, value) } REDUCE <- `+` ################################################### ### code chunk number 44: reduceByYield-DONE ################################################### DONE <- function(value) length(value) == 0L ################################################### ### code chunk number 45: reduceByYield-bplapply ################################################### FUN <- function(file, gr, YIELD, MAP, REDUCE, tiles, ...) { requireNamespace("GenomicAlignments") ## for BamFile, readGAlignments() requireNamespace("GenomicFiles") ## for reduceByYield() gr <- unlist(tiles, use.names=FALSE) bf <- Rsamtools::BamFile(file, yieldSize=100000) YIELD <- function(x, ...) GenomicAlignments::readGAlignments(x) MAP <- function(value, gr, ...) { requireNamespace("GenomicRanges") ## for countOverlaps() GenomicRanges::countOverlaps(gr, value) } REDUCE <- `+` GenomicFiles::reduceByYield(bf, YIELD, MAP, REDUCE, gr=gr, parallel=FALSE) } ################################################### ### code chunk number 46: sessionInfo ################################################### toLatex(sessionInfo()) GenomicFiles/inst/doc/GenomicFiles.Rnw0000644000175200017520000006764114136050457020741 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{Introduction to GenomicFiles} %\VignetteDepends{GenomicAlignments, RNAseqData.HNRNPC.bam.chr14} %\VignetteKeywords{parallel, sequencing, fileIO} %\VignettePackage{GenomicFiles} \documentclass{article} <>= BiocStyle::latex() @ \title{Introduction to \Biocpkg{GenomicFiles}} \author{Valerie Obenchain, Michael Love, Martin Morgan} \date{Last modified: October 2014; Compiled: \today} \begin{document} \maketitle \tableofcontents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Introduction} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% This vignette illustrates how to use the \Biocpkg{GenomicFiles} package for distributed computing across files. The functions in \Rcode{GenomicFiles} manipulate and combine data subsets via two user-supplied functions, MAP and REDUCE. These are similar in spirit to \Rcode{Map} and \Rcode{Reduce} in \Rpackage{base} \R{}. Together they provide a flexible interface to extract, manipulate and combine data. Both functions are executed in the distributed step which means results are combined on a single worker, not across workers. We assume the reader has some previous experience with \R{} and with basic manipulation of ranges objects such as \Rcode{GRanges} and \Rcode{GAlignments} and file classes such as \Rcode{BamFile} and \Rcode{BigWigFile}. See the vignettes and documentation in \Biocpkg{GenomicRanges}, \Biocpkg{GenomicAlignments}, \Biocpkg{Rsamtools} and \Biocpkg{rtracklayer} for an introduction to these classes. The \Rpackage{GenomicFiles} package is available at bioconductor.org and can be downloaded via \Rcode{BiocManager::install}: <>= if (!require("BiocManager")) install.packages("BiocManager") BiocManager::install("GenomicFiles") @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Quick Start} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Rpackage{GenomicFiles} offers functions for the parallel extraction and combination of data subsets. A user-defined MAP function extracts and manipulates data while an optional REDUCE function consolidates the output of MAP. <>= library(GenomicFiles) @ Ranges can be a \Rcode{GRanges}, \Rcode{GRangesList} or \Rcode{GenomicFiles} class. <>= gr <- GRanges("chr14", IRanges(c(19411500 + (1:5)*20), width=10)) @ File are supplied as a character vector or list of *File classes such as \Rcode{BamFile}, \Rcode{BigWigFile} etc. <>= library(RNAseqData.HNRNPC.bam.chr14) fls <- RNAseqData.HNRNPC.bam.chr14_BAMFILES @ The MAP function extracts and manipulates data subsets. Here we compute pileups for a given range and file. <>= MAP <- function(range, file, ...) { requireNamespace("Rsamtools") Rsamtools::pileup(file, scanBamParam=Rsamtools::ScanBamParam(which=range)) } @ \Rcode{reduceByFile} sends each file to a worker where MAP is applied to each file / range combination. When \Rcode{summarize=TRUE} the output is a \Rcode{SummarizedExperiment} object. <>= se <- reduceByFile(gr, fls, MAP, summarize=TRUE) se @ Results are stored in the \Rcode{assays} slot. <>= dim(assays(se)$data) ## ranges x files @ \Rcode{reduceByRange} sends each range to a worker and extracts the same range from all files. Adding a reducer to this example combines the pileups from each range across files. <>= REDUCE <- function(mapped, ...) { cmb = do.call(rbind, mapped) xtabs(count ~ pos + nucleotide, cmb) } lst <- reduceByRange(gr, fls, MAP, REDUCE, iterate=FALSE) @ The result is a list where each element is a summary table of counts for a single range across all 8 files. <>= head(lst[[1]], 3) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Overview of classes and functions} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{\Rcode{GenomicFiles} class} The \Rcode{GenomicFiles} class is a matrix-like container where rows represent ranges of interest and columns represent files. The object can be subset on files and / or ranges to perform different experimental runs. The class inherits from \Rcode{RangedSummarizedExperiment} but does not (as of yet) make use of the \Rcode{elementMetadata} and \Rcode{assays} slots. <>= GenomicFiles(gr, fls) @ A \Rcode{GenomicFiles} can be used as the \Rcode{ranges} argument to the functions in this package. When \Rcode{summarize=TRUE}, data from the common slots are transferred to the \Rcode{SummarizedExperiment} result. NOTE: Results can only be put into a \Rcode{SummarizedExperiment} when no reduction is performed because of the matching dimensions requirement (i.e., a REDUCE collapses the results in one dimension). \subsection{Functions} Functions in \Rcode{GenomicFiles} manipulate and combine data across or within files using the parallel infrastructure provided in \Rcode{BiocParallel}. Files and ranges are sent to workers along with MAP and REDUCE functions. The MAP extracts and/or manipulates data and REDUCE consolidates the results from MAP. Both MAP and REDUCE are executed in the distributed step and therefore reduction occurs on data from the same worker, not across workers. The chart in Figure \ref{reduceByRange_flow} represents the division of labor in \Rcode{reduceByRange} and \Rcode{reduceRanges} with 3 files and 4 ranges. These functions split the problem by range which allows subsets (i.e., the same range) to be combined across different files. \Rcode{reduceByRange} iterates through the files, invoking MAP and REDUCE for each range / file combination. This approach allows ranges extracted from the files to be kept separate or combined before the next call to \Rcode{MAP} based on whether or not a \Rcode{REDUCE} is supplied. \Rcode{reduceRanges} applies \Rcode{MAP} to each range / file combination and REDUCEs the output of all MAP calls. \Rcode{REDUCE} usually plays a minor role by concatenating or unlisting results. \begin{figure}[!h] \begin{center} \includegraphics{reduceByRange_flow.png} \caption{Mechanics of \Rcode{reduceByRange} and \Rcode{reduceRanges}} \label{reduceByRange_flow} \end{center} \end{figure} In contrast to the `byRange` approach, \Rcode{reduceByFile} and \Rcode{reduceFiles} (Figure \ref{reduceByFile_flow}) split the problem by file. Files are sent to different workers with the set of ranges allowing subsets (i.e., multiple ranges) from the same file to be combined. \Rcode{reduceByFile} invokes \Rcode{MAP} for each file / range combination allowing potential \Rcode{REDUCE} after each MAP step. \Rcode{reduceFiles} applies \Rcode{MAP} to each range / file combination and REDUCEs the output of all MAP calls. \Rcode{REDUCE} usually plays a minor role by concatenating or unlisting results. \begin{figure}[!h] \begin{center} \includegraphics{reduceByFile_flow.png} \caption{Mechanics of \Rcode{reduceByFile} and \Rcode{reduceFiles}} \label{reduceByFile_flow} \end{center} \end{figure} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Queries across files: \Rcode{reduceByRange} and \Rcode{reduceRanges}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% The \Rcode{reduceByRange} and \Rcode{reduceRanges} functions are designed for analyses that compare or combine data subsets across files. The first example in this section computes pileups on subsets from individual files then sums over all files. The second example computes coverage on a group of ranges for each file then performs a basepair-level $t$-test across files. The $t$-test example also demonstrates how to use a blocking factor to differentiate files by experimental group (e.g., case vs control). \pagebreak \subsection{Pileup summaries} In this example nucleotide counts (pileups) are computed for the same ranges in each file (MAP step). Pileups are then summed by position resulting in a single table for each range across all files (REDUCE step). Create a \Rclass{GRanges} with regions of interest: <>= gr <- GRanges("chr14", IRanges(c(19411677, 19659063, 105421963, 105613740), width=20)) @ The \Rcode{bam2R} function from the \Rpackage{deepSNV} package is used to compute the statistics. The MAP invokes \Rcode{bam2R} and retains only the nucleotide counts (see ?\Rcode{bam2R} for other output fields). Counts from the reference strand are uppercase and counts from the complement are lowercase. Because the \Rcode{bam2R} function is not explicitly passed through the MAP, \Rcode{deepSNV} must be loaded on each worker so the function can be found. <>= MAP <- function(range, file, ...) { requireNamespace("deepSNV") ct = deepSNV::bam2R(file, GenomeInfoDb::seqlevels(range), GenomicRanges::start(range), GenomicRanges::end(range), q=0) ct[, c("A", "T", "C", "G", "a", "t", "c", "g")] } @ With no REDUCE function, the output is a list the same length as the number of ranges where each list element is the length of the number of files. \begin{verbatim} pile1 <- reduceByRange(gr, fls, MAP) > length(pile1) [1] 4 > elementNROWS(pile1) [1] 8 8 8 8 \end{verbatim} Next add a REDUCE to sum the counts by position. <>= REDUCE <- function(mapped, ...) Reduce("+", mapped) @ The output is again a list with the same length as the number of ranges but the element lengths have been reduced to 1. <>= pile2 <- reduceByRange(gr, fls, MAP, REDUCE) length(pile2) elementNROWS(pile2) @ Each element is a matrix of counts (position by nucleotide) for a single range summed over all files. <>= head(pile2[[1]]) @ \subsection{Basepair-level $t$-test with case / control groups} In this example coverage is computed for a region of interest in multiple files. A grouping variable that defines case / control status is passed as an extra argument to \Rcode{reduceByRange} and used in the reduction step to perform the $t$-test. Define ranges of interest, <>= roi <- GRanges("chr14", IRanges(c(19411677, 19659063, 105421963, 105613740), width=20)) @ and assign the case, control grouping of files. (Grouping is arbitrary in this example.) <>= grp <- factor(rep(c("A","B"), each=length(fls)/2)) @ The MAP reads in alignments from each BAM file and computes coverage. Coverage is coerced from an RleList to numeric vector for later use in the $t$-test. <>= MAP <- function(range, file, ...) { requireNamespace("GenomicAlignments") param <- Rsamtools::ScanBamParam(which=range) as.numeric(unlist( GenomicAlignments::coverage(file, param=param)[range], use.names=FALSE)) } @ REDUCE combines the coverage vectors into a matrix, identifies all-zero rows, and performs row-wise $t$-testing using the \Rcode{rowttests} function from the \Biocpkg{genefilter} package. The index of which rows correspond to which basepair of the original range is stored as a column \Robject{offset}. <>= REDUCE <- function(mapped, ..., grp) { mat = simplify2array(mapped) idx = which(rowSums(mat) != 0) df = genefilter::rowttests(mat[idx,], grp) cbind(offset = idx - 1, df) } @ The file grouping is passed as an extra argument to \Rcode{reduceByRange}. \Rcode{iterate=FALSE} postpones the reduction until coverage vectors for all files have been computed. This delay is necessary because REDUCE uses the file grouping factor to perform the $t$-test and relies on the coverage vectors for all files to be present. <>= ttest <- reduceByRange(roi, fls, MAP, REDUCE, iterate=FALSE, grp=grp) @ The result is a list of summary tables of basepair-level $t$-test statistics for each range across all files. \begin{verbatim} > head(ttest[[1]], 3) offset statistic dm p.value 1 0 1.1489125 2.75 0.2943227 2 1 0.9761871 2.25 0.3666718 3 2 0.8320503 1.50 0.4372365 \end{verbatim} These tables can be added to the \Rcode{roi} GRanges as a metadata column. \begin{verbatim} mcols(roi)$ttest <- ttest > head(roi) GRanges object with 4 ranges and 1 metadata column: seqnames ranges strand | ttest | [1] chr14 [ 19411677, 19411696] * | ######## [2] chr14 [ 19659063, 19659082] * | ######## [3] chr14 [105421963, 105421982] * | ######## [4] chr14 [105613740, 105613759] * | ######## ------- seqinfo: 1 sequence from an unspecified genome; no seqlengths \end{verbatim} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Queries within files: \Rcode{reduceByFile} and \Rcode{reduceFiles}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Rcode{reduceByFile} and \Rcode{reduceFiles} compare or combine data subsets within files. \Rcode{reduceByFile} allows for more fine-tuned manipulation over the subset for each range / file combination. If differentiating between ranges is not important, \Rcode{reduceFiles} can be used to treat the ranges as a group. In this section read junctions are counted for individual subsets within a file then combined based on user-defined selection criteria. Another example computes coverage over complete BAM files by streaming over a set of continuous ranges. The coverage example is performed with both \Rcode{reduceByFile} and \Rcode{reduceFiles} to demonstrate the passing ranges to MAP individually vs all at once. The last example uses a MAP function to chunk through subsets when the data are too large for available memory. \subsection{Counting read junctions} This example highlights how \Rcode{reduceByFile} allows detailed control over the combination of data subsets from distinct ranges within the same file. Define ranges of interest. <>= gr <- GRanges("chr14", IRanges(c(19100000, 106000000), width=1e7)) @ The MAP produces a table of junction counts (i.e., 'N' operations in the CIGAR) for each range. <>= MAP <- function(range, file, ...) { requireNamespace("GenomicAlignments") ## for readGAlignments() ## ScanBamParam() param = Rsamtools::ScanBamParam(which=range) gal = GenomicAlignments::readGAlignments(file, param=param) table(GenomicAlignments::njunc(gal)) } @ Create a GenomicFiles object. <>= gf <- GenomicFiles(gr, fls) gf @ The GenomicFiles object or any subset of the object can be used as the \Rcode{ranges} argument to functions in \Rcode{GenomicFiles}. Here the object is subset on 3 files and both ranges. <>= counts1 <- reduceByFile(gf[,1:3], MAP=MAP) length(counts1) ## 3 files elementNROWS(counts1) ## 2 ranges @ Each list element has a table of counts for each range. <>= counts1[[1]] @ Add a reducer that combines counts for records in each range with exactly 1 junction. <>= REDUCE <- function(mapped, ...) sum(sapply(mapped, "[", "1")) reduceByFile(gr, fls, MAP, REDUCE) @ Next invoke \Rcode{reduceFiles} with the same files and MAP function. \Rcode{reduceFiles} treats all ranges as a group and counts junctions for all ranges simultaneously. <>= counts2 <- reduceFiles(gf[,1:3], MAP=MAP) @ In the \Rcode{reduceByFile} example junctions were counted for each range individually which allowed us to see results for the individual ranges and combine them on the fly based on specific criteria. In contrast, \Rcode{reduceFiles} counts junctions for all ranges simultaneously. <>= ## reduceFiles returns counts for all ranges. counts2[[1]] ## reduceByFile returns counts for each range separately. counts1[[1]] @ \subsection{Coverage 1: \Rcode{reduceByFile}} Files that are too large to fit in memory can be streamed over by creating `tiles` or ranges that span the whole file. The \Rcode{tileGenome} function creates a set of continuous ranges that span a given seqlength(s). The sample BAM files contain only chr14 so we extract the appropriate seqlength from the BAM files and use it in \Rcode{tileGenome}. In this example we create 5 ranges but the optimal value for \Rcode{ntile} will depend on the application and the size of the chromosome (or genome) to be tiled. <>= chr14_seqlen <- seqlengths(seqinfo(BamFileList(fls))["chr14"]) tiles <- tileGenome(chr14_seqlen, ntile=5) @ \Rcode{tiles} is a GRangesList of length \Rcode{ntile} with one range per element. <>= tiles @ MAP computes coverage for each range. The sum of coverage across all positions is recorded along with the width of the range. <>= MAP = function(range, file, ...) { requireNamespace("GenomicAlignments") ## for ScanBamParam() and coverage() param = Rsamtools::ScanBamParam(which=range) rle = GenomicAlignments::coverage(file, param=param)[range] c(width = GenomicRanges::width(range), sum = sum(S4Vectors::runLength(rle) * S4Vectors::runValue(rle))) } @ REDUCE sums the width and coverage for all ranges in `tiles`. <>= REDUCE = function(mapped, ...) { Reduce(function(i, j) Map("+", i, j), mapped) } @ When \Rcode{iterate=TRUE} REDUCE is applied after each MAP step. Iterating prevents the data from growing too large on the worker. The total width and coverage sum for all ranges are returned for each file. <>= cvg1 <- reduceByFile(tiles, fls, MAP, REDUCE, iterate=TRUE) @ \begin{verbatim} > cvg1[1] $ERR127306 $ERR127306$width [1] 107349540 $ERR127306$sum.chr14 [1] 57633506 \end{verbatim} \subsection{Coverage 2: \Rcode{reduceFiles}} In the first coverage example we used \Rcode{reduceByFile} to invoke MAP for each file / range combination. This approach is useful when analyses require data manipulation at the level of each file / range subset prior to reduction. For many applications, however, distinguishing between ranges is not important and the overhead of an lapply over all ranges may be costly. An alternative is to use \Rcode{reduceFiles} which passes all ranges as a single argument to MAP. The ranges can be used to create a `param` or passed as an argument to another function that operates on multiple ranges at at time. This MAP computes coverage on all ranges at once and returns an RleList. <>= MAP = function(range, file, ...) { requireNamespace("GenomicAlignments") ## for ScanBamParam() and coverage() GenomicAlignments::coverage( file, param=Rsamtools::ScanBamParam(which=range))[range] } @ REDUCE extracts the RleList from `mapped` and collapses the coverage. Note that reduction could have be done in the MAP step on the output of coverage. Because all ranges are passed as a single argument, MAP is only called once on each worker. Consequences of a single invocation are (1) reduction can be done at the end of the MAP or by REDUCE and (2) REDUCE cannot be applied iteratively (this requires more than a single output from MAP). <>= REDUCE = function(mapped, ...) { sapply(mapped, Reduce, f = "+") } @ Recall `tiles` is a GRangesList with one range per list element. We have no need for the grouping in this example so we pass `tiles` as a GRanges. <>= cvg2 <- reduceFiles(unlist(tiles), fls, MAP, REDUCE) @ Output is a list of length 8 where each element is a single Rle of coverage for all ranges. <>= cvg2[1] @ \subsection{Coverage 3: \Rcode{reduceFiles} with chunking} Continuing with the same coverage example. Now let's assume the result from calling \Rcode{coverage} with all ranges in `tiles` does not fit in available memory. We need a way to chunk through the ranges. One option is to use \Rcode{reduceByFile} to lapply through each range in `tiles` individually and then apply a reducer as we did in the first coverage example. Because the `tiles` GRangesList has only one range per list element this approach may be inefficient for a large number of ranges. To reduce the number of iterations in the lapply, the ranges in `tiles` could be re-grouped into a GRangesList with more than one range per element. Another approach is to write your own MAP function that chunks through the ranges. This has the advantage that, if resources are available, an additional level of parallel dispatch can be implemented. MAP creates an index over the ranges which are passed to \Rcode{bplapply}. The data are subset on each worker, coverage is computed and reduced for the ranges in the chunk. <>= MAP = function(range, file, ...) { requireNamespace("BiocParallel") ## for bplapply() nranges = 2 idx = split(seq_along(range), ceiling(seq_along(range)/nranges)) BiocParallel::bplapply(idx, function(i, range, file) { requireNamespace("GenomicAlignments") ## ScanBamParam(), coverage() chunk = range[i] param = Rsamtools::ScanBamParam(which=chunk) cvg = GenomicAlignments::coverage(file, param=param)[chunk] Reduce("+", cvg) ## collapse coverage within chunks }, range, file) } @ REDUCE extracts and collapses the RleList of coverage for all chunks. <>= REDUCE = function(mapped, ...) { sapply(mapped, Reduce, f = "+") } @ Again `tiles` are passed as a GRanges so the chunking in MAP defines the groups, not the structure of the GRangesList. Output is a list of length 8 where each list element is a single Rle of coverage. <>= cvg3 <- reduceFiles(unlist(tiles), fls, MAP, REDUCE) @ \begin{verbatim} > cvg3[1] $ERR127306 $ERR127306[[1]] integer-Rle of length 21469908 with 489540 runs Lengths: 6818 9 8 1 1 2 2 ... 3 5 8 1 10 863 Values : 0 22 23 19 17 18 17 ... 20 22 21 23 22 0 \end{verbatim} \newpage %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Chunking} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Ranges in a file} Both \Rcode{reduceByFile} and \Rcode{reduceByRange} process \Rcode{ranges} one element at a time. When \Rcode{ranges} is a GRanges the element is a single range and when it is a GRangesList the element can contain multiple ranges. If the GRanges is very long (many ranges) working one range at a time can be inefficient. Splitting the GRanges into a GRangesList allows \Rcode{reduceByFile} and \Rcode{reduceByRange} to work on groups of ranges and will gain speed and efficiency in most applications. This approach works as long as the analysis does not depend on keeping the ranges separate (i.e., MAP and REDUCE can be written to operate on groups of ranges instead of a single range). For applications that combine data \emph{within} a file, chunking can be done with \Rcode{reduceByFile} and a GRangesList. Similarly, when chunking through ranges to combine data \emph{across} files use \Rcode{reduceByRange} with a GRangesList. \subsection{Records in a file} \Rcode{reduceByYield} iterates through records in a single file that would otherwise not fit in memory. It is similar to a one dimensional \Rcode{reduceByFile} but the arguments and approach are slightly different. Similar to other \Rcode{GenomicFiles} functions, data are manipulated and reduced with \Rcode{MAP} and \Rcode{REDUCE} functions. What sets \Rcode{reduceByYield} apart are the use of \Rcode{YIELD} and \Rcode{DONE} arguments. \Rcode{YIELD} is a function that returns a chunk of data to work on and \Rcode{DONE} is a function that defines a stopping criteria. Records from a single file are read by \Rcode{readGAlignments} and limited by the \Rcode{yieldSize} set in the BamFile. <>= library(GenomicAlignments) bf <- BamFile(fls[1], yieldSize=100000) YIELD <- function(x, ...) readGAlignments(x) @ MAP counts overlaps between the reads and a GRanges of interest while REDUCE sums counts over the chunks. <>= gr <- unlist(tiles, use.names=FALSE) MAP <- function(value, gr, ...) { requireNamespace("GenomicRanges") ## for countOverlaps() GenomicRanges::countOverlaps(gr, value) } REDUCE <- `+` @ When \Rcode{DONE} evaluates to TRUE, iteration stops. `value` is the object returned from calling YIELD on the BAM file. At the end of file the length of records will be 0 and \Rcode{DONE} will evaluate to TRUE. <>= DONE <- function(value) length(value) == 0L @ The MAP step is run in parallel when \Rcode{parallel=TRUE}. `parallel` is currently implemented for Unix/Mac only so we use multicore workers. \begin{verbatim} register(MulticoreParam(3)) > reduceByYield(bf, YIELD, MAP, REDUCE, DONE, gr=gr, parallel=TRUE) [[1]] [1] 21465 163154 75498 212593 327785 \end{verbatim} Taking this one step further, we can use \Rcode{bplapply} to distribute files to workers and call \Rcode{reduceByYield} on each file. If adequate resources are available this example could have 2 levels of parallel dispatch, one at the file level (\Rcode{bplapply}) and one at the MAP level (\Rcode{reduceByYield(..., parallel=TRUE)}. This example takes the conservative approach and runs \Rcode{reduceByYield} in serial on each worker. The function `FUN` will be run on each worker. <>= FUN <- function(file, gr, YIELD, MAP, REDUCE, tiles, ...) { requireNamespace("GenomicAlignments") ## for BamFile, readGAlignments() requireNamespace("GenomicFiles") ## for reduceByYield() gr <- unlist(tiles, use.names=FALSE) bf <- Rsamtools::BamFile(file, yieldSize=100000) YIELD <- function(x, ...) GenomicAlignments::readGAlignments(x) MAP <- function(value, gr, ...) { requireNamespace("GenomicRanges") ## for countOverlaps() GenomicRanges::countOverlaps(gr, value) } REDUCE <- `+` GenomicFiles::reduceByYield(bf, YIELD, MAP, REDUCE, gr=gr, parallel=FALSE) } @ \Rcode{bplapply} distributes the files to workers. Each worker uses \Rcode{reduceByYield} to iteratively count and reduce overlaps in a BAM file. \begin{verbatim} > bplapply(fls, FUN, gr=gr, YIELD=YIELD, MAP=MAP, REDUCE=REDUCE, tiles=tiles) $ERR127306 [1] 21465 163154 75498 212593 327785 $ERR127307 [1] 23544 181551 91702 236845 341670 $ERR127308 [1] 23236 178270 84027 234735 355353 $ERR127309 [1] 20890 160804 82120 208961 305701 $ERR127302 [1] 20636 140052 89834 208824 283432 $ERR127303 [1] 22198 149809 106987 226217 281000 $ERR127304 [1] 25718 150984 94198 223797 316043 $ERR127305 [1] 25646 145655 79854 219333 327909 \end{verbatim} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rcode{sessionInfo()}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= toLatex(sessionInfo()) @ \end{document} GenomicFiles/inst/doc/GenomicFiles.pdf0000644000175200017520000141167114136071655020744 0ustar00biocbuildbiocbuild%PDF-1.5 % 113 0 obj << /Length 2524 /Filter /FlateDecode >> stream x]KsFWVy?Jkˉ݋DB$@R%'U&@Q8H`8}[9M0~O*P#H#p3.2 ڬi)=X }o30hFH|& cAEњ} ֬ "k@pr.} g_)x^s#h`aMj!Ƒu6?&}I뫳1h0(i(Y2[ymYRoXGCe^QR k&[p"ZwO"0ۡDBH>sқTʎ,zOCSA{d@a0lt#q?|o0tw jhFH|g2&12źl\8)hvVWM<@)Bu.PtH8Zη:g-BL*|REB{չh#̮H\ @"OgWz֟P%}' ݎ&4v;`}wO;1!.~\@ Bj#LaDPX#zI <]rŖCDRnbu2p[IljXUr= H|`AfBnBiWYQO9N* e0 `C#BmT 7t* ۚi36.p*^pB"n'u^ i tLtP4ךHw0Z Ih0ih` hJ40fuH/~% 8#$2V=;UwHS2{ĕpH GhY>G%܅Ϻq|Vg2-VqVhZFh=\h^.I cݩDZ if9\&adtb)tf_}}{ }^9؇YWʛU N0UJo$^|1Xiw& {{ͣ'vg?k!}И&s 0ȟD e=V[kvWd [.Ww@idz_ܖyT,릭6j-n uoWi{wšz2@xbxƶK5Wzס0/@zpaV-W6f1G 6 ]\NsP2jpaW_,^)B¯!Bô1}nv|/P6F"`+g:%Wq q#2+z 3KEγ6 uQ3x &UASՋL=m֫բ@L7n O?~7].^P-E[opCbE7Lc* 7mfTYR0%LB0V%Htd,8Ve)|NzHp9n]f$='LF`ѠJ0+3[]ğ8x fbn2<} oT^MH:\/l啺/V0NJ{sqC(ۼf ޝ ЬE#i䉸;<<(#15x^e'Z(`FCN҇YWx&Ow,XuެSb{2%2nBFSO@(6lC&!wh"d endstream endobj 129 0 obj << /Length 2809 /Filter /FlateDecode >> stream x[s6_F> sqtLj;sCSūD)$'v")nJ Xb?~rDG/Ғl2̫`1Y%U\Zq%4(QT ֣(| [T5'F0%KE/Y<[sz,("I+7Cnp, \ (x4.]c->ʿK,s<ݮjsSⰎZ6.Y3F;5y\fky\b0hCNaHy؝E|Ȃ2-]uq4|\%v|s̨_Zm$ j+鈍8UD*> T Kd']~Y5,V @MS+.S[zR*bEBGZ8hL['2KLE%LI"S@1<ͫkumY|BRؚ59QfZݝ䂰HvWi<Jg$lLA:"J#R=Au"7# kދEMj]P'GHR]gĄG;lց1e&͆ fsJ)D` !s>|WVZEZ ^,3KY/!XSp V7Lo>`ŔBCF> }ZIh1vbRF٦B|G}U'ba^:X l3HnM4 6#B2u޷3 p"q6MSJnzV,;/siso+Wgd#']i {|HW/#sqBb*TH@$Z$0`}&7H´l99g[woFj@AHᾎ#.Ghw99]eyYųٵ 2 x%RmEr1HHx۬ޭ&FTE/ҹ pG?*+R|~t40fv`(:HgDZ]1ֿ)oq II HN@kKZ:VvF,b2}%**F,U֭hlU};+Zv_Z[Jތ^GmcWe(i .V =XP V\ @AаΜݤ6DS״d]B|N媲0X~ #R&sꡌc+dq/ݏ=C2=5`P V_+ >GBm~V&2Nܡ;_oMϣ#}k"exՎ\Mdrs)!&ޓbɿ-u+N90l]$4&$&dT_D` UH@.a BȶL :Ƀ4i\_9g{SWxy?>uLz[8nx۩=B4W] |"Tϳ;JIQ^2x?M;F[EޠF\d,em0 4`@ܧ$ zW{U)J;Yh~'ž8F6wvfZ$% ^^PPFH@»З nNjTod0e?] l0&BQw,˯02Bن܁nx&f(E a'b5 i='Gz#g%7OR8tv_<4͗zuƏvG_#a>9ILjLNl5O!)msڳ9-1(W9bۛw^m=`v\?d1kz4ONׂݪn`nV7HmZw[׸ݨ6Z`<ƸMn$lp endstream endobj 136 0 obj << /Length 3410 /Filter /FlateDecode >> stream x\[۶~LX0;IffiiRg3}p<Dv;owPIm^DqpO^>ɳN2Yi'W7ÙrdRbzuS_H>ySV닙t~To3i!'nYܤKꎠ:ɼRXWr\#M}>{!3řRv26qWvl34~ZT-f\gs[$ᙟ_#΀gWOO1c0dz^`iª'}nl. r9 eV.OIp BZT8A )=~eհX.Q5nZ(a4c`(Y1~q1\NnxҶ"or*\̄z'{߂C]|ܴ46> T8śćhc5TY8U;s"+ZC9R=|F$j:h8`f} 0!|/߿"zRqbuiE>@s1y|ܑЋ E^iwMϛ4$IPd웺ZϗX+ s29p:|(o[11mֱNLx6$,ئEsm7q8RƧo@z'ؾdl[RY?\gw XMx_0Ƣ(ʿa8Xr.t>Oҥbs&Øǃ`:y[7ǦJ2XˢjE `"zwiuۦ4<'r)6~M))>]sȭ dpWx¬I_@w<(aXnӋ"hxG *bE &`[ >f-&>þn*bPuw Ĉ#߳=1mH)ЮU'42so(,&GkkiSmTzB-5"!@KO GIX@vKIk> ~4A+>,ȼv5=K$4Z34{&T U >Y( OBrAV&"7y_Ap;& Ƅ֮5&1` Wq=fB1+Me@Ըsx1.AgNgSTLqGHj34YH{H:~@l$}@}b/Ҩ.͖古q^ViIUb4F]lyT!9ʨL?\(xsK&uO%@y( rZ]tzW|q𣹺G1oW|aE]oԣZwNNI8`㹉7 Om_z!3W+4\ք\B miǨXH&52+4!e^E̠{hR ؉̷V}KCҐ5N8Xw`(Hw%NPO(w<>VC8٢1/tEuϝ97 tn02d$$0{;m7BWeOD+Tr8|`n@oшH8~8i71׻$IU]6!n+~Uz)]gGAiVy %n mGKi{#N H)Eԕe0HQQqCh0|Hk}Acf"tp2Dϊ:L YqHrtpL_AĬbe(X*Ɲ H/{g}ϘI\W0-Q<2݉㔿.ԋU]vx(2~G ._)nCGgq fK忇vC"}vqf){8ވ:|)*N-jwd w+ 2ePKO6=͢>_lV,jTCZpA{{ BN0c4R\) -4SB:/RRip WMps*E,7`OQ`JхI =@u7 QoW.aI갤Xrݾ/S&-v[w/RY-p%Ul8+s'aȰpnWM{LJKX-R-"W`V^&J~MlK?_iZAώţZunAi5&]> stream x[[s۶~4S_[&ΜfܧTiYRE9[E:7!ń][,̋/^\]\Ҷ,Xip,L U\~4aT|!5}ZȂ3Íwx:˝+7;$bIr}VuY'y4Go/gJb mGB0[/MYmUuwؗ_B[0w]Y妩]MWUG1*gBnS{l^֛( >?<5r vo}xoB^B)T87"@2QNeq{.1Ʊ`$&P,`Rn!v CY-'H+&sc'+rȓrJ>?/޿Ynʞ9 U9o|9jk Mm4IT[K C:zi8>?QX*NDθQOiBB|,ǠwUs/LC~JSP}>Ra󅱚W]&:MwI#)z]>I> juf,fԇl"`;T>SE^>ĖK$0MԝY>\W& -Wm] rQ~.f/K9i͸9 pCb܏b' M@қh4Y#>g ~USMt~=G[(a6۠MiZÀ-jgھ6wiѵPej߶~KrAk?<&jLUߡo}o].~j;~=WiWQQv.Ȯ~%F;A,r@|Ňҟ3&V!QDQq>8)e'^8f]hzY'f1QĦ@3lԹ<%D @0tAm~r,))O~τ1( E ݑnaI)932):|#BC~&u'Á{9½4, rJ 6`Ajڜ8*w}>2w/T+tFi=LP"O6/edh$T C;4s{_؀#:k8w2# RgEM'c18`F 0C>n!9à6:I./uU?nZ  aw&D"wV-"}Ӄ(~b7~(__h$YkfB ?$Ŀ@?\/7ժNJǠKP*kAؐ):= |+2$#9j9G s;ܱIQᾙ#{#e"W"#"zb ;Z8"CXTK)ZHUڶdkiu~EjmF#E?Rwg66 P(yqP,6© L $}F;}Sn(,x?Cy'ݤ Ϡz1 Ly{B5 Vl 7HSp%5* =ORj=T?y(EF;m)D79-5Ec uS)KfDݚ JNGc2eQ23("k.t7na᥷,CO裸\\zP:BW$`*MV>iQ/RYjN53^-FS=g v"NT w'\2EXUS\0\qI34S-ACy1Ga 0"OCNy>?π\v#+:sy@KD&df)DOzH5>+ ֖ p( fQj~݉Hy.mOiLP>.).1Ee ܏^9~L@/o2Z>guS`ѫU =gPh83 :j(iL9ZQB>I9sa 3<Sl£ W^ "oXa46o+]E6Pц'ҝMD3'fqeMy72͚{!b endstream endobj 138 0 obj << /Type /XObject /Subtype /Image /Width 1103 /Height 1268 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 149 0 R /Length 83360 /Filter /FlateDecode >> stream x^ﻊA ޹ 18Ks Ǡ!=D">#@DwDJnI |["ݖZ !PQZl|Q苾/u|>X\k1c1}xGRf7Mfe7nէƗi6+CQhbGDDDD;;ǻ͟_z}ϿH()_r_z;#1q"DSb9R (vDDDDd)GnW쫉>4c_7EڈC$Ns٩?]-,vZ40vˉEe(v8lIIy4K[6ZfVbN9 7=vŕ+l-ؾ',_NE^f˖:rMHX}u?9˴]z!oÖ'@kT7Q?=(&4H~-ع펻W^}bGS숈bsEq^>Ï*Yq Rh3؋CHH9v݆R f$T vEɩ3&vN~G_9wcKi9+Nۍ? %`E&Y{]OsL׿@t~k=,6y{\nl<\C?l a`V~VX<=bgql:;7ٲmJcm1NZ;""""r։8wsd@G\z7ݲy;=PܸWDB}2,ٍ`ٲN9fGCDDD;qj 3r+v؂̹wΚWtqTmiI%WV:t;xB)vDDDD%߫Vqӭ%aą]\cvJ w/Xac+v^Ɉ+WgrtϫGtdH2Ŏbǧȹ!v}qwDseOZi9jǃDHo~Y SM1ټekfi#2ˮiKNoظi$%#ԩ;""""ΫoS:=l5ӠD?sk'[&SsL#"$ {i=D=fe?#话!Um<:;""""ĎiŎ)vDDDDDi)~)v4M#""lm^״snt"AMS숈ȒEWMӳ4Ŏ(v4M;H;""4b='fu}O^̡K/'$(~!l_y57lϿ) /SV_{]4/g{;""4ι}!_};[Epe{3{Sήu6^l-[ۍ/Mcxpw|N$A4aO|1ׯj?}4'ZdV#"";g? kh;wО'6лfc_ :)%]؈gs^J21IϽ2MX;9iA =ئm5~ C 9ө$T-6"a]N1TBU숈bG;e-vWmwm޲]a wvdmwܝ8ۯ}J_Lߐ1 Z"]Y_,_ι6yRm8ٕqC|[?J%62ƥ RC*?ůjI֞z5ҙEՅ9N#""MSxqR۶+2v'ǟtfB܎Sʹ۫>D4CCTxX'vI K\JxW\"+|3,9@K QrĐ\nb^XRk]'%8ncI2(D1Զ1"UZ5AHM4_a` KK"ZQE!*զ*ChK/ 7kBQ\ 8Ư2NZ9$/jPMqE*CuI#""MSH2xרC^3zrx́oi4^ruAҶH3Im.ϊO_M'7i.ig͘OIH98ÝkΰQ+Znl$Q4/C>`"")Kǒ dr2RY 匐omkE(N76'^b[D";I8ɱ "*F4$C) >%߸d[בd(~6\wa"J#ʟJ~G]R[F _Y6jEQK Ιy,'pqPQ /ǾFqq*mJUǁ#Ҫ_+SNi_TG60Dv9f!m?[j۰tAe{_%IxtiyrmɿUt3)'1[|1z,rڹQQ咵IDv2webGi;AnI4p:kŎbGi;Ak{<;pmŎbGi;AYmi'P숈(v;iŎbG;)vDD(;4oIѣ8O_Xvo;or꧿51,v"O~ݜ98cROjάÓ_S- UcӁ+hsw?l9;""NDzMl,[Ʈb9m?50W|hET:JyeRKKoYp#-sN$Y}uȜjTF`x)j%.v ׯhŰh e?ٹwZuW\趔^}U״ [V5MsP*I?uͤo诹9Q>,zk}^|;u&"QV jη^(vpqpD;3׏=^yz֭ZbUB~KHٸnqk^F58{;&9vMm"9;_^,]~`ޒ;j>^g ˸kr%/MF~pp88bgamwN^_rMZ֖3u2['̌w.kє:?O3ZR6b߸(*ŎbgdrM[6c>ӂAtַqw}뻳55D2ͰU6:x_;9/@r:33a$_DV Q ?+Wq>Hg^Do8]=B#BlIwFPI0(SXD5.+܈vv8:ΰ;h;g+vХNaw-؉fW숈(v;;ؽw=҇ u[X}u3R8-[[ Wp$yJ9KӜk;ܝ&ǟOS8qhg$‡!I$,&dpzuNrwzNb۹X۴WViC¤];N&vҊZWpFCEw'S?;h}NխJ 2*G#6b&N[j!GL(DPGp \9ZmgL%2IUG1ҘsF!ڽW#"QJDTO4Ctֳ9%h_.nd Bv>R;ؖSR'~Y"fUT30!";x#%STG;$w+tmqMn:bgD;$r1p%QO:~%vᩱUMPPWgio(vfl1AAbj(vґPW|Jm}Mڎ}+}qaw: _$rwp;cfȐAAFx h6-κ@TQhg)Jn[()W;""Θb'Q 8[;9U_Q:/ v[cS f@/\I~d x)GF{Xt)cLnxW;m:;b'O>?YsBQ(v;xϽ2=~C:磏O7DOodV-妳hq&$5ϭ r&NN$GDɿKAL et:5.}˳zNfe՜NsnNQzrәYsFߤM7LP3붢f-53 -s L{' bΗX#0Y1ENNT ;9!='Lݡ?!S3:'_gY@kmXT9{·'wNn$B--֭+N|S)ΌٲmOqGQDLuډXzXu6Ff9+ZS>5/jK?bnbo"NFdk< ҆dۉW:])繉R8,d: 3m¹-J$Է2|]ef|C}@RYю S֖9jY54WV;qHӺJpEANE/C3H&8%ud|M'i?}P;Y׆gQk0s U2ljRw[%=o6b'Cy&-osnNbgIH sYg.qڹx&-/nqN|?B7JbTkif 'FqHsH(47CFe|FCp)sEE 3$3Ay? Ց&t\v?+>l*ɦn0W˶J ӭp-/9Ǹu}YhĘ#1U3 ^ڟNP 餐]d%L̹Iۙؒ H[wMFxIʫIyD;i/#BN8>R3Lp"BR;̶A w47aVjw LF]_HVnCG ~TT'y9R)wz**i`/QbNLF ,!mD홻S)ĐڥuZRݡۄU1t?qŎbG;;+x#ޫR>3~,_DdɊ/O/Q}yz|]5!KX.YΌE9f{?)bH̺ddAgpz(v4Mc9,v?se˿V^} .S&=޼e+v^~;N[KaN0JkW`DYbRfԒ*:XN1_Ttn$*|")&"ʲ><'=Ů{/Y<=Ng;R^i^}Yy6cysHbG;7lt{˶8_^GoO\+\pk/kwUdYp+8y vggGpx.S d"vK;զ \q݆ F;ęD/FɵS#JaΗ'N\ 9]zMƥbG;y>o=h!{U+NŎȹ'vfիg`;xXG -ْxmw}eױ}#k:ɈZBxJ)Sl%?;,䫓ȶ}ujs}h]@#=W\brCƟ\i&v(ab/{ŎoE;ؽw=҇ ;?p[X}u3G_pNѮzM~!]H|Wg)w:xpwZ8V>'_N!4{kxi"><N9%I.پ|I KI$٬DӪX+vXEHԢ|w YkM{hjva(t4^t5~9Ŏb R<[xk#vGS|p%1)v4ΰ^&<*NNejz޲WJ86 w5qw!eǟՃ:b>!J6vŎoNB(vx(Gͣ>apVKS:zyŠq22%vZ^ }z{Œ>=wQa"uN T"3U(v3!t:-؉;\a#g󖭭[r`N=iF߃<.tRV7f/Gw}|k_#VٰؒbGD(A'ہ_iN xh i;njb' m+?c.U<'|˗3,vRDQF"ьIdZ q)XV'N6v4/\|y4ΰ9پLyv^aXtW0[KO]ŎQ,}cWoHVQXg2`6ZcD 0ZK])EW IYtF>䐄^=xe~_o,?=xCFzO~"%ݏ>?V*%?b'&$ 2Ƹ՛((RY_,sՀ QI:pƶgXJ i؍mX[N^ ťAG)$6KϤ!gLd 5[ԭ4M;m3ݚÓ_ntkvLvr*bg#{:p&_;^bG;)v;"PbUr;Q+^t1g_4)ws_U j2Wr`@}Q]iM;Yp/r7ltѬ&v4ִ"v6oʮ!"p^>F ShbG4ŎbGD\DPsLG_P.;{ew_l٪kF"ء#G_}sTxn[*tsAX穢+v;"?3ڇ'UZ:]/5=n3,vtJt__A$g2AtָI^vyۗHgg ^0K3?'6p;]:&~VO(v%|u.*׍:h};+Wk.ݪcOq)wcrťvG+@Q % fa cH靏S xtDŽ*C[8;n.[7bg,?9&y:YYV/dvW>l<ۊ4l(v}|9's;5/: ,Ns]"86e;n?tJG>tJQSPD|@ A!2MIRgyJ$ KI$٬DƽL"o؉hK≝TZy5.hUT֊j' #2,vc]#V ltB $UБU)<0\PTSu̍0p ]nU>f;\S"/$j#W])MQOQ,!}E91GF`,vPmO^| 3N /'.Jdckn[p8_?!>q?9GߛvxVla#εS-$2t]]DKl+3vt}T\ӴV滔'u8f'pw9 IIv2ڍƣuNh;$'mS$wDR6Rzx\\j|;fxh\4A\t$ل̨@r7u9_= +ޟ/bb9ٙm5TabsYvckhΜ7//V^sb3$ؘe b'Bzb x!P#D*<"Cpxo#pc~RǯE̜,b!cwnߙ]ӝ]dϐKŮr\M# .*.LZJ/v8R;TmN㜛D;H33 MU!iieہmvy,L0\8VsԶr,E)vDDsf;Q ?;[;9Uajvwڽ<̞~4Ʊylߓǁ)SbuK,dvV̏0c8flyOˆϰ؉'I۫ްY</j'ʳyV;"D%qqvOUTo1D7iMݷ8pVpSd_FJ ђ*F~gLDDaAz$=g2aæ;Ȅ5,;/nGpwpvw6PtOL3 # .YǸ:dikg.v2Bť&.:$D$vGko᤹m~۔Εŏ]zUUzͶ;O< L3vJ*cD"6KqxZC9d'CKJRa8a\P븝3q"|OS숈(v|;,=w^vefxSk'ZrwgՊ|wl눝ywjJu:<+MѣP쌶́v+Z˖GLQP7l܄FAMQYȟwȘZe-[k >Ŏi= N b}ObgwF@I{h3&2bն L݊M;""zMShQ(v4Miޒ"")v4M#"QXw!uo}v&'м%ED+a/?yV]5MSa5yWb3tW\}OБ7u$?K&NOnl~=tbdA֍h Y!k~eJ8nE˖q`}/\zds"!Ĉ-}'bGDDDY;n]]aG[~y/Y&@yq`_\CN_awTIjpD -{Mnٶ /b$Rq3*}c{'ļk6;X sXޒ"""Ma~/>6N5!rGV[^lV^S]mmnmwܝk'o.O|1~Cdڻyhq'_X`;:Tj%pﳘ{TDVB͟dEP9v:T҉"aZQ3Ó_f;:bۏwulH9Dk^ۗ*d%= &ʊd6"O06rꊇMMJh"%IoIŎ-MC+'{Y?gv%Cf*ru|{~۳ GfBaq?zb['E;맿5y}7߻}'Qi(!@2u>?4},Ǣ\J(25P$ )i}P:>IFFQ86B|dOQ:yܑfNS5I'gOFTڭ}|?FݸVbQ:Ox;""ѴZnDUg*ݏ?'$(ie f8haq!~x+($eD^H?*m)!96ș :U4MT &dcV8]&Amͪk  C…P=(q=Du9dfIJ!V6+_g0DMXETޒ"""M[b?vǻp/jLDN1\W_Ӷ\;yzD#(o?%x-KrHK=kʹ1ʰ&d8S7Pձ0gIq!?kO1 &"mBg%N֬~;f{K(v4miW_S?/W\".z}Ov{Ȍj8#x 561Nӡ2K⪕1Hڟf~aj IҜfaNzLq0Jdǃ3[D-juVE!րo!FbjLP2\DF "Z) 0xӞoQh;xȸq7kpk|9mGԺ -5X银e%0G珄A8p`g&iɐI91LJKD(d9$5$oĺiD!Q\8se0T @42թ]X_f̥F²g! o1׈of;X7n0d{K(v4miΩ_ڽϼk_}KqG[;S (P=aգ#H3Z/vjΉE 8)&ȉ2Hiq4^1Fٶ!w>g`mgE@BV8H^,7iS숈;+Tð c&vif;3ڌ 1 6s[|ʏoO7މ`iJFU//n9߷aE`k?Wn9U1C{/r#INN-@(#ي#V~};"bgh ;b?عm?abg݆dʉ;oylߓ.h )NsLΉVx Նҹ y'"3NTA!3/vnl8̥xnwHRx40k).<<]^J?=‚,s_zMgAŎ,*?h=zWucEn_s6oCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDg7M;MzisW/7KaóҴUt4M#""Mӭ4Ŏ(v4MibGDD;4J]5MShw)v4M#""_nw)vDDDiUAŎ)v4MS숈bG;])""iM9gؼe+nt)v4ͻRD)v4M#"Qh7w)vDD;Mӭ4ŎbG;)vDD(;4JŎo V;])"`j8>4M#"Qh7w)vDD;ٵ{n{?7~~_?9K6<|d`~⋥,vח{qءW;Fϕf/\G"]whHiDD;)vSms9m=l$mlg 7|]˱7Gծ<1xx""r㟧Uw/<4Z ]6jvRK!Z4 lAqj"&mo(vr ! I#';b>䉐V?4|dOu,wZr݆3&v04quDq.Y𗦏Q>I9a;LDDaAj"*ѕW__pi#OAxvW/X;9ETIzͥI(Ϗ"J3!4dWR."$ -ɱ_F\zĐqHr4!mAS)v(\[&וVP$,y6&Eg}b,w&΁_ ;Kd ǟdl^DS4_g""s;'Ozݻ}C{875N]kk?#(bQN;JfT >=t(9*1#IHa !I.wm]>i1TC k9~6;$$m9NDRԥ%)Rd3≝>~s0.}h`lMu&"Pb'0!q8[-֠U5eYzSiR&2q$@o%g$xBW ̡FA&_O ;~}D줁dT"ŏ1f;\NNOP$"6Mu&"bz:r4u8O~ s l؍1:ho+(V1Xȏ6ήW_YZpx!^< S/׏GvݭY('2\~QH;?V-vtB,-䔨̙NidVG?D;;ՓgV ;O߰YbgDN FvSPF|d);Μ0p鷏sE[vƜ F0 (*v4@bZ8LRDjωkqPqY:kvIO6^(5pp"Ft-vp7fu.lĘQp/qC~}vEPV|v _:-jOY Iv6 ⪕vgJ/hKA<iԷv0bG;ރ6b'8앷9H3LdZ@QeEpαv CG 3VA̾2@ ;`eBeGOȨD8g6[a#"b )D֮U+L+vЀ ㋝j/#a$aUC{BIj)4MDxe\+g_#Un%bGƽ;"ةya&bgkNS:5Ǜ-8:8k@#d6ۦ4Kh{hW?=:1s[C@mm޲A#3' w?lG^QTAq(:8!a*=I?y$QVS $;kfab=W_PIr~E!m/ )\Y8 [3()v4יbG|;x+&kMߞ}l A3im8Y٩?\zoT+v+aboءjyq>N}-MS(vDdQfm0nl ݉ӳW]xū<ჇeU+r?z5Ι7N;Dej6npq‡S젞FD@Ri]Όԣ!ͷUbbLa=g{lߓG(v4MS(vDd@О'.8u';F\'9l9,v(s.J,b'yDֲ>s2l˰E΀cD; 3lΜVhQbD%˗=|5~q21xNG,O-q,٢VhbsXd^׎(~]‹.f_gŎ} MS(vDd)DMgMI͏Y}e^vWhbG4ŎbGDO|ǿ]x”'#OZ ,jC*v4w)v|Ȓ;_k+Wɩ -cW Df֣Wd3WOFOk?W \;9՟|XSm޲5-I"D(s9]Tf;ك]K@miSy%v]{{2)dz*ӛ?H#r>>o| RN0AtJ+M?NPP"e5nG-ʖd,i""Ͽ/%;T^T{S{5.*:f m%?+4b~iآ:x4!i0 O`;bG+Wԫ'Ml&;"Hb'=Z'%˗=lG6nb{7Gծ<1qu≈ٯ~$~Wbq780XZ"l5Huڲmr"NM䥔ۂ"M*NN!dFNv^hsJI* d#{]e;ζ?!ʉf09x$i`Lh纷W*sP;4Bn%*"l:1T ] N-/~]cp~PQ-Z=b&n[ڷ&u;,%X3$U4Á_n$t)T4J{C#Eyޞ滧^|JCm=nPϹ\t"I. 6aۗl'XM "~& UU҈RN'ulVL#0SnʫiN-rr."K}=5h'D۹9e4Ґ#Vq9$6I-%G̿T]Zo7`9'Ră/ 9}!;s^5ʲO|7 ᆍ%T-la/SOʐfulIlh׳휋3sr~E]N6'^h%Ŏo;'vdˣ#v=2]HV_{]Iȟorq*܏/o[2YԤPmؘZv=p#^>FbϿ-vxE[9tcL6\)Nㄩ.[)abCx8Wpǟ5Q3nmj)Ҳy?gVj΃"^ߥU_rZ*p=42 gqw,D2Q܃؅[;bRߠOzn'vN/j/BԩV/:qT7{ZWgѠ %݄4Ҁa`%RK  7y1B"n譚 gv#}-Tk?xy_jogs|޲pۣFkmCђHv$fٰSU52\sx}JdyP=(~Ts}B* >_S*(Ϡ +@ ա$(Qx alz(8%Al$nGMvl!Jdt!hY;R>i8j06bΰun%SrK͖8JE{G_ރR8`G-/qnر,"_ rxfn/zc% ȓ;"vو_5ܕb6VyO)8ZmDa|'"llB?Rp֟7H(\ ayT, ;0`h/#bDI4$ēؒ ~ӍRl1D/Bs 8usY^ odGqGMdؙiI#j DodY5 ;df`#XMQYK.%!k"z&rОա툺v>S9\8Ӊt`X|/"jؙ٨2(-Ri08Ǔ$9MŽȝjB\䄍a(թ)ā5]԰cYE3T)xKvxGovMCmRY\ۑ7>VHG! Ώ}ESpQRO@2R~.^m9:2+fyʋor<#|#\Ew ;ZH)qEG &yi_ B$b"x)+aIW.q@"g9M[[&+kQӾvi`*dEcv(,<ۤI`6 uMm K4θ侪gP4k<(]8"#ÿ(*c2[,rcbT[ EUGkt0PAI5,yMPQg?`e;6v )h y>o>,Z|B]4#8{VvuwǭV^o8z7]c|C (@q]ni|SOհ0Yu] } SoMCM ރ\(9Ql}g^8ҍ#dZ>55SG~6lvehEq#=w>>/qJ5#j(1yRGp @UR4ͰcVv,˰$hmDs5_֌]vCs v.|~Eki |QBVc  a/mp?%L!q@cI 'L.&[j1-S4I1V L:M[gg̈=_e)K`W>j(s;v!9Mpmر ;N^˲nnleܻi\ԃRqkM1΍9pീ;j6<6,vN:]w)7qk*b*c| D A,%N^^Μc`ɼ:R3b 8V;DFSu!}Tp9@mſOEڭM7C?v],\,kE2h%;z7vdP $X1JA@1I,EEv"vӷu Ff/^6؉M;Q kOFS>.BPd^ħ`5} ;6akYvb/OOUB ޼5Xg4fGrùyeW 7 zwhn;rñw Ƅ "K=̋Ͽ: =DAkh ¿5{4t!.M 9-I罳Ž.)ܲ$vjR*efDafυĩ+:;v0TqG򑳬8o,2lƇGv-:fXe)z7m^߃{ Vlj<2aS7}OuP6xL5aOԮzKl\\S%I(%&_mLxćp 6[4.)z 19cɬC)ηat֤lmMIsS>ndĮ/R,JDLE%"p- ;6,˲ ;<$#Eǭku sw1IΥƱvԕKM$x1CS PpFp#vH'f\}|;uǫ AXRS\A *cf]"/KW -GnlUdBD^)m[YvG E`ѯ#㎪xzJfر ;eY ;jQO6 g;5~LA}LJM_Kr0|W :T& *Էuԃ>$!\[`G D#"(8G>V,"4"IT#v-6mCђlŰ M`ر:,20O؉lSg j2\ǿ j1f7<(#.;0=Kpu+N9`:fs=\%? @SM] M|L:%o5G_I`q7ȣػpj=Z A5­q2kU2l˲,Î-Nda&vb<f`Uu{7mVi14h ƍg~ Q,HkN?VcOԘ~"9똯n dх,a߲2n #4QfO:s7!vl6ÎeYaǰSvԓ 3&ΰT?+ v2f'{¦Z1\jqm.[)@yH %ڊ"EH+=1HFnZ6E4Ž.4aIaJ-y:69͵af3Xev ; `G/)մN^ƖՊưcYeYeYη?w!s -l\ÿ~'NhRFٗcLStցc`=eYeYeY󁝙7!ڨӚA"8kg3יFԜ-:(%YEK^>oر,˲,˲,k>8ZiDU} ;eYeYe-}|nڒ1XeYeYaWYdڅϯ}ۀt ;eYeY|`gaDz,˲,˲ ;˲,˲,˲ ;˲,˲,˲n'y/˕~r1aDz,˲,˲ ;K =\瞻2_ ;eYeYeYvC;pknKÎeYeYev_0¥F}oΝ_jR)vEPlb+n.~]ʿP\juǝwpG=wӷuh9|d ;eYeYe'wh6nd˳/Yzʮ=lh${ vxdWSGfu@ (B+fB?yf {b=\E|v;A ;eYeYa<[`߉';Tζ!ÿo7P).w\olNbGFv ^;.BI@4OZaDz,˲,˲ ;F*Cd!WXtCc/]=U ݴ{}{E|rENT k { ;eYAӟ*ivkuCo8;l$ 9F=PIʮ.UĶ 090]yXkŽbرGvQm5fev@ܒ"<=z|Ә޹1 ;l\qzzr NMH nHW ;dټ|kfZs`ʮXFfޡyϸh?ydM~L\qCb"D:mCfYvl\l6;?ݞvϰ3qd3b?Smєఋٽ':]vFVLhnl\l6;?aG-)7lCFnRK>wޥ?V[SXcګS^?wSt7< نGvmC `烯fDnl\l6;?t{?:o/O-5CDm(_H\fhb)RFך~bh:QR@*w˲fgd1V}LG[W:pY#=w[]5=+ Ώe-g߬Iv]+:;lcoݘjN/y\-Îfر\%-vr{3/;Ə[{ a\rYlv~,=6w˵f5fc[6af[kfر\%-m]27Zovl6WIC݅ӥ kvl6;?凶 afsq X'm.OZ Ώeiر ;6Ώer4lUҲv}wtiqlUҲv}wtiq\w\l6;?I afsq X'm.+찋+qꮣϼȮWxU6ї5 {]~zw|5dS^[_"1576?Ms p./|~[$HBo]B1ooqGL.NvL>7Uܣaf̲v}wtiSy_8`Cb;ſG68T ;Y(y}[lM[_k7kvC]g߈8 ̬nǞ K&bBB-GRɫHFؓL\8,oS0}Bղgر:fynӆGv٣XC1. {ڞΙ7Wvu aNZ Ppq.^z3 "#DB?F˽C۱||1);EN\& ;2smsi('uM6l~Yevv+`z7B7y;[5$ @6lpq9+vׄ1^?<̋M.^1^N̗`;>ہ/~ʵSgΑ/O.4qS?CM!VD#g <ĄTR"w f $ELrǿv|QHc vDI$)-BQ ;6_geY;'9; #p@vk6~;N} +z ]l|쉽޻i 'V!(b.)@p#Q3M.Ӟ_%ĥ?P2d!JG$#zخj ZL!~%.؞1%;) .T4l~Yevv?hNd76k')<}^}zʑQtp<^n05s&2YrhZ|5YI:jM=C Z0R33o8̑;U˰%ڂ'uy귣ev ;e-t>2PךvWtv}ox88{+z$ρlY468tW4Z4qYˡ5PvFvA mmC4hs_1Safv ;eitֈ0,=7M)}Kb ;f>BFq~g_:Cp,2H Z"wvs`gH;$UiCyNM`ر썻v,˰vM 4}zFu>sS^miȔ9bGr\ySs"9k$ACoIw..W-Ͱcر,M䛧\.xs_wuC8uͯ~ Ͱ,;j:Pi0/_O BPϒ]ǰcvl6WIAÎevZ0ȣ71-ՉS;~af5f3gY֒~ b1OG_jNrN>7e`v>"M/]e#Z30sJإ1ftξ˿Z$Me7 {h:/q>tj5pH(Ẅb$\\ྦΜ#'No|\K<"+;v,˰vxba8wyWWku?Ʈ{ZxܖCp@<f['0lEgj8\F snd8DwmUعġhrR50"'Raɚ6N$#n-iĿdAe^[380J ܉ Tvl-On[V3mkyl\ :zX)ɰcYķq=}~ݦΜsq 9f0XyǭivQ3\ N>AkiTK@Aeɹxs]v""{cf_PGJN dGBFr𨃤MfHitTX,aǰ`D]O?$sZٰcY@mld! @k ;C_)iy}| MC-WcY^>f A |9UH `E IEh+%/Sg9 H12-AB;x}[okF I󰻢agAC⫾0KFP(ZըJuIv)O9)qX5sWu:1.ͪ z]uۏ8(xyKjkaV#UEbGd+8㱅Mwk+Sr,|6u6ó4!8u ;eۡy؁trO6\,`#p@~Ԅ|;K} +z8]4/wA68v]7{7maWxs5ÏK{wd9F\f=\Mn|Pt4Q5;ԯL2/QR?" &#a2T;K[X8!~%P͘Iڒ5s9vX|F  EQ_]%Ugc䳑ST1/5N$Bvl{Fad\j6*P&f݌ΨNbj es ѓs6ꔨEg];P A!+ݣ_1ZE}Ў{rU(0z9ƌx7H2%eQS쐹S[|p>o,Sk`CY*BGNgmÎevvh h.'?O<w#kiS_. {tp&v.H^EO ^8[Ӈ+${zŵ;BܭTmYBriZ4;}xyB˒aDz ; mWJ8{'[| Q;KUdVQOxKhD I@}jn`r  ck^a$Ze#RX;nMHN(BVo?Îp; U1 \B`|p87N̊TͰ wTޢ9k7'n>Ij ɰ3s}yo4O/5Jj[@4{ǭ1AZsrMa=qd|D 6g$@ˍng$ ;mC_xjNp4SSˡ5PvFvV-;R͏1yͰ:dxe.vG&cGp{cz2ߎ_\?0bpVԷuM>e]mսh2x㯵X5ȰCNU/oZMyJV|v-p ٗΨkdeN{ԙs!EڥU WtvvaAB-#-Jmg >zuc ċ^y ;WݨV` - Sk;~Ͱcv,˲ ;~;;v+{%Î}cvrưWLh>qxOgE)7g"KU 2E7LrBՑ vs/GӭI4"pC k豙-JHa' bo 3l~Yevvhv4#kukL;d0w#kis/iѢư\/ڥ$si\kN`쥫V\-#dH%폿}t; *[1mf~_ ;On3nF^DE ʓAܰcv,˲ ;~;;+bEZqf!n ;3o|-;V&\WS զhz" fc63nDٻwj1-#,nM")خ~k&p ;Ə՛c @K战ؐ8CUo.5tSKr )a(!ԋ$@BTo$qH`WaXZuZÎfر,2'[4|쨝:_hnưݭ%/8긾%Lŝ:s1kOc154s!p] 5"&P IihCgFs xU@ \B @W3ny ; rG-z +_z?y0(l;D\I ;6_geYfNsl/|~%&|jfɦe"|Wo=4?Ms8>-GpjF~X+wtdsS=vl6,˲ ;~;)a/wcYVtvnsǝwۿ{}}pǼvݾK6p-߯36^vQ0Z5}ku?^X8Z$ID.V@DBղgر:,20W!h=uim+ "µ\اv 87 `p3?bS4 =4Y<1\lkKF9Q3l~Yevv?`z7B7y;[sfp/}321±_?aH˿O}741]tc]E|[]d8SgΑ/O7ȅN: a8\aK<|dRQ~ξK$j&"I"/;ÏB:hm [>?Hh E{}DcufYealx+߹X8yC(󚰃+m}~=`\\l={#d]M[>F \"8Q#1\Baxliύ/EB\a@S@ːa(׏/ҙ;bn ;d2h1aT=FBEҩ7#ە2J!tN\!T4l~Yevv?hNd76k')SL뿀< d'k>2H4IHփemj|d7?ޘ6폿~/9]^agWȈ6//p!Y`*ƞ;RȝjBάvI҆ލcw4Xa7횰/0ο_xeë ;>}\~Dm5G0-qF41^c!Îf3v,Z4Dy*~Mϥ6q]?Hvl6]l6Îxe-}QMցbMCy8~`Pzb=ͰcJv,˰oׂGO^9q4G5_ ;6_A6aO<˲,`y4_[};1ʵ;ܔaGٹ?:̋*7]tjpž}.TǕKc.͔Lc9ʛn68uq>tj5pr$)(v;:|drAs:sȟ8uy ;Fmu.O?DZiÎev{}ks_?i}ɘ׮>0~]}[gڮ vH(ìsHhnp)̹=wߓޯ}_"ܻiK^~Th 8`51[(R(HEE[-&`'nJ]GJw4ҔymSuO5w"έ5[cӰۖyۮZ:w&_+˺a' &/GDϿO}'N9\(_x b¿;嵕)986u}ÉaDz ;~;,@:']]x p=Hr@~Ԅwy~;N} Gpy`;v68-kuwvO<zGc(]M9ohVخH(^R&f~e!%|W0q_@ ; ;D1D~ıd{@ la ;-[(⫫"Dul6)ipRO3FI8\*S{O(`998pCM_,&Q½PLLPC.t<a'3.Dk]`*!#(?d%#<{T;ؖ|$sٮkQNm@sEQ3F\^BCT=A ;ea`G#tc쾱 X#gڬ;hWn\)r3 Lvp9^5 >\8-OxABW|*Fd8&F_8W5aOF``M%^[Wi/gWºz^ba ;JD8f U>Z BNvnag =N)B$I-WeTj #YLIVQqRl֚e Gu"Ác5;QyD׬XWI]x\%PI<Í L\mP;0 /rY|2kOS|J"b6#A-֋L-S{ZC` $z24Ʀ1.ɰcYv4>O )`!z_[}a>jOEM*v35i 0!*؜vZc0HS CԎ|?,M9PIeުO(5Eͅhz҄АJr) ʆ3 aCOsWgˢ۞m1aG= r@UyK-z1 %-z ǝ e O=oJHAޡ!˰cYvI0Ȱ؉Zy2wzs!>| Fn (v0xڼÊ EBsj (yg;UawT0 ; lᢅi*x15%!OgY;kpqST&v(R_q8arOUUg>?"1hG2,iI) S'4 ,={}v&Ԅo-9' h^`P8TxDՄbAE7K ԫŇ27jn#a4\E T|MWqk!p/ƍiÍGUw6%yl;R:EնZsU15IIvN ;-AJH~Ci7M}rH~d9Ha(FwưͶYagiŽ]U{5҇d;jg9z ;i?/| /a///}jnᅥoz ݌yD hHa5"&`G][MD3% sĚ}24hқ=gMcz4i`WU7!vÞ1|/}㥦`TItkvHLl$izPtjߘbiaMT,DA|wzDy1E9Tjmp(OPcˡ'âM=&!Y-Er^TSa?JS,=OcY?ow.jH~ji4agьɞmKouفT򤹤MeʰC 5׈iHnI4%ڂ'_}{w]V=l/բyҊr؂QSլcDM9> ` Xp1K_,}cwB)l̟=gqM˺`G4~Cc ܤ5ʑָj)80~,wKv{:e a̓}q|vbaGmp(QiNp4SSˡ;#Gk;{~>Ͷ`kYv7{dػi?9Ī? ga3o+ j97\#Um  ҧl.t^U0JSvk^rFId蜖eŽTo;iWt8d$sjÎfouаcYck:;]G{^|hJiy[7рv2z6[5|,_k04&jkv9k$ՃkBTX~Ȱc ;˲ ; < ԙsfa'#9{J41K#5DS{z8v>C^Ұcvl6WIAÎeYs(9@cf&C|;vဎ[. 9aaf3l24 ;Z @i,vM*9}nR F+nH [i ;PXհcvl6WIAÎevF)V^mp17ykgu‰~hΆލRs 5wuuc"αbxϼX]͙4gcu9b1g_: q%쪮t^▉pL"G&꘼f>{S(Wp+MNV'G'1 .=A׸/%vl6Îײvl'N~=w߳_ vrǭY΂hJvsǝwQhZALÏ}t؊N͓p{+U˫7zܸL˗y ?)YZRF{7mˏ {cTez<6hǞ \Tش'.עFBa+mD1OHۍGGvnjNvl6Îײ?(r?j076gοq?uՄ0{aåyȤ+tC^;.$ $ *ϑ̰ӱĭ!/`}[u[h)2іH؞vlwK[.eةB:N5e`׺olq1Kv ܓ \3i$d&o}hD~=_ȝmCl"G -kuwvO<.>|٥QDpv @n|)J- +h~qR2%ul~fҙ;zGuSPOvq_'wCKd"_CFh #A4DȰc,k9Îci0cYR##0Xa1Q[+<.:C kN?ڪrX;W'!M q|hO/ɮ7/a/ m=dOɚOqp5hl9&V6ׄ@k)GZք@<]s\Q4FdF6k'#vպCcaְbY-)2 2 E°cv,˲ ;~;;Msk?g&mpH]4Uxgso?w$` "eJ1n \Peu!` ; J|5nՙ몰C$'ż ~MmCGyJ9}_x4saf3Xev ;5agIܸvEqxlݴ%gk䶀i'|bxdWց]]X,L9QR]QO{EggǭVȊ"9Jmg >zuc ċ^y ;WݨY.Z؁cDs*< sc0  ;6aDz,˰C ^j>и\2Kޘ1聫O|YaGQH9.U1?s 05?EB˂pa8ia natC(5rqň34"pC kbi]Y)N?(sE?ÎיeYaoaGl>2v]dٱsOKMF1k-6+N?<>7kK IҸ֜­1V9bP\7n#`-#dJ폿}t; *3{1ĩӔ4"(j`Y_4vl6ÎeYao`?o9+5hư3sf1wѲjouďZmXӸ`n6f3P4:p6nS6&{rE4_Aj܍z0w6Atha-DLFvC%|_9ԒE:=JU!ԋ$@B!Uo$>\j XU𗛭._kر ;eYZdTGc8ưݭ%/v]u\_&NO9vpq9c154s!p] 5"&`]n|VعrD؉D4p t5-aAE&ȗO-J-N34 9(0ym_ÎjUwJ*4MT$ I2ӐLqp@1Mz5R b$/Є|)*$SPPD釠|d뵯뜎zNv:߮scfG0?ޗ2ѻ?:Aw߻sXޝMTlE6՛d1Ǥѝ [rFN61+*Dn֕ "ff5+WjLlK.u9VٙXaOПmmU+-YQ0;[GG5ѧpaֹ|ʳ>'f8nfU4sLfNٙǹl'84C9fGpJ_4Y s/X'6Z{/@mc`;cR]ߞ~!"fdC$$2 f!hX"ffq`I "f~Boڒ4ךR5"fHH U#bvC$AD!Y "f1;D"fHH U#bv$R5Y "fɬD`v"bvCD!bv$M[Z3V! ~ X3Ct 7 " @Gt ("HH$C$}AD!bv0;Dh@FVj$}ADhvI$C$}AD!bv0;Dh@FV8eX36uiV U#bvD+up`ID+0;AD0;I1; `v"bv@F1;DKV`v, UC$@D2 f!"fdCD("fHup`" ̎%"`v""bv@F1;D!bvD+38AKDѺfbmF[}8CGS%wWZIS2ZŠg`v]zKq-''f?/iߙ"fpq:̎f8N/n p3C}~y:Gڻ~Ӗ(/C}AD̎ `>d/.ZnloxK\{wtmg.\XDx;_av"qx̟nl < gǃu9qFoO~yt?߮Y꽣_0;DwD s!3s[G2ɽc;+Vf0;Dh5;unHf+-)q=cv"qxDf^f o'\ju2;DwD ϋ/^r:_?ȇkVz{U7f'z p|OLlF Ԏ@;9o{C}~oT3ؾ)u@ gUa^V>FDZhW4z3kQtѕUzp=[SՊq1 ?S.&JW\u xsϛ?gmߩmvr$3tIP\p;vyYrɥsKڞ?9I O;T^fVzL7]Bf5'}fG FT͆Lu R zՕ˖?wD;ZT- uBnV2>^JestlKmu >)?OuY,kW?$wnTeCOvY3Ml{{nf'ul4US{ǚ5`=il)'(o޺͓|)i|*iU,浧W`)s#hK{ynvRn]ޝ)>wѢfC^j6K%|7Y `&f'_,xI 2Ҭ)UJw螴{F/Nɋղj#~|OI3p%pRJc?3;Z92;׬\L!Z&].?d>6%Mܖ9۲H:ad/j&cjz36Ԇ~mpqvmvweԌntvUreevFLS0]A$RbScj ?pa]骕Lj\ˮ^sgv9N C#c%2;u;zƾ'[h}B^qU>dA=͝v3VxMӟ'x׶ƵI9ڈyYmLST_Qh -|[M[Tu )3+fpckc5;6}'̾_ݫB}ؓP5ٙW h^|Aʚ#W#rnv*Mv$gbvRc3ͩQ L}|[fjI ;SmpYIs6+1wV g0gdkWo}R4+D~ufndδiMm%4P7"Ys")wzڴ+_eslE5UjCٽin٩5 ZXSOH~KWnN!"?26wf'$^ݤN4fJf<%nlE*8>fI'{b95;\Rq`N߲WiHAMm_= ^ x*)$i/2=;o=H6-+Lʿ9e˹lRgf[b+Q)3RU}3^~|9f`v6;i,Rn}ؒiNTZzb(ZV"5 Kݒ`GiJڦ>կa(Oj߿O_*;s/竴YWL5;+5;ir;V?ӒK.u(S5rlWy7x#sj PPۍ3;q.g.\X}R̠w6z[#1Ae~줂i?٩5g~g=ҠS߷Tt>oc/1;N"r>

KRf'Mς|hRO.WqU?hv+VFծM-ony"isQ)zL9>3SW:k(E#*9ML줭L&R?u֙}f?͸AzA9li~">՘)0tߙmS `z s I/*x|?|8jLO&@2Oby .pMĠW4f{=o2MSu$Ujq`U sbas达MyHYJ{RW0C; JJQO̶m[E.y1d4;EԮr~ɜ-~Ɂo[|{!4H}5X؞jOEѬ!SwG6O"_OKL7@<^u 3YEhՑ:Lu9>5^L;9潋ɿؚy2gG;ůo۳U`S}!֪`) Yj٩WJMuώKvRlk[EOUv*_ ^ئzI>ٮ֕L >σgԟM~AS&2DfGS%i:Uq_ОNZ9?PluIw3,CmΩ$e:E3Ul7ix)`vBə}ΘW^+rP<5o6nYgSf'eK/oYk>_@eɜ]p3M^6T}fT]ݎU$NWZ6;9c_zPQSј -]1bv.T*Yf^t .}Zݮ7$RO7S묬uU5Lw=R/ձ|ToT?& .pi|ilVfjIԾKNU;rV=gdb WVu$5*m]Nl⋗淿72-}V"fflh7rےK.ο V7;0)6 Q/#܀rF5&Yg)^83;D1;Y7;oO~vEq(;PG~ߴe^rU5k;gK7o^ev"bvsavP=?W\f^=֞c:sx|Δze>;ݙ9"ff\z||G䭷o wlrkVi=淿gs6h,Ry_q=7m2;`f!b9:ڛ(vvL쌊!bvDq~Ӗ!Z3V0;=߲zo9L|["fH3w;y[0z|[1;DhfgNuo^|owTO"윆KD1;0;D'D!bvCV`v,C$Z:8$@TMDfH "fdI1; `v"bv@F1;DKV`v, D DM[TZ3VFVj$}ADID`vO"0;D1;C$Z1;DID`vO"0;D1;f!"f U#bvD+R5"fHг~ӖdkDLAD~B~9(L_n "Hx{J%D+R5> "fID`v"bvC$Z1;DIDh0;]> "fID`v"bvC$Z1;DNLMx7HՈ" n@hX &" C$@DC$}AD("fQ0;DhfG1;DKDD D!bvC2 f!hX"fHup`I "ffH$Q0;D1; `v"ъ3pfGAD'uXQV oN1/&mHto޺ѧxLd1)/^r }+Zrɥwno-g.\xώk؜ /Zy|Ӕb""bvTI7x}FNM {Gyw _xH>u9=+-_3;DwD sEoڒ)M.ZT-˖^!Ҿ "fprEuUkJ\·ww]1;*C'9sº3ޞ,X360;DwD fU6ʿ;/~:`vZs O㖯#9L<7cӔenߙom;ՏmOE9P5OJL֙Ru@ ͇iqc5Z`єG11;/<ߪkNbp;j^q+ig̅ ܻ٩~5A҂wxLXazz]h-}KmˌD'Ԕ2,gyû_fL̹Ȕ{%z+ YLT:VN7s/iBbrҾ$Wr]#f' Pۓ*kwmw`+$Iېkoo>sUo#1;rG;\Ҭ'G>37e wlmރevځJ ϿiRRx.hqiFYsZ:$:ՀYv|vC3C͇vG2\i](MZ4i2fG0Gf皕R '|Δ^ s?Ntm-4sod;΢:MeWյl"glUmhcfbmvunfgm|X۝S3ٱY?,P[Sq]=3ǩwhT*4aK 5;)oq7׻ZLf`vhvV%Mڽg$gXzUaP{5;usݘi_e|{ddI6޵u퉒l+ FՒK.jyQ~7ܱm._Ջe3%&++oyZlZвWgڻom>)Wب;ڍ~up̮ Nt'Ϯ39/: x?o甋a̯odvR|Ǧ(zV*v>Ŝv9R$U'jo ms 5\W{<^͵xݚI8JiD+[]G}-U1LBߕ-._UwA'dFuKޕo+JSER4ip՝/Iʝ9[x7TSU>6p1AsN]]:Ֆ5;ٙꜙE[rl4GcNu 9h}1}ٙJn2V 2"=\)'El9))Y*Sb^4f$^". fͩO2[>W$cؐ8,UUJVX+8)nW4e,U7kT)5^͒K.b0єC>B c]ImlvD䬥Tĕϩ9׷)2+)ط(<#η7%<ǔ̖g+)3b{5e5_o!+Oқ=d~E1;u]j6q{:2@=cқruH+Я7ޜ?G-\hphx~'H,@HW4Wi}3kiUڬ6fB11Ձʡ|oX36jvCSZɲi!l$e碼%)~ωȨubv濒]lyǕP\1GVV!$"ZI U٧y6e!c!iU_8g-[۷Q aD-UN6jv=;F{ NUx6 xߢՉ+?.eZ/ۛv횕b[%|6۳?d:̖ɇTm+U~5(?>u稿_ߒ~ҏYfg>ҪJ{GJo|Qrzd>쓫N`Y1;uxcm'M~W];i~bXkXMrڅ$K.t4 evRr:Ȕ~~)qI5hD$/5] zR߳^+La8JQ됪o^*_6j^fJJrYRX+a[/n ՜MIS^km]pKiHgJ])i.O!ům=!Pvh߆9Of`vevZO4uk7;u-4B*Lz~gvnQӛ{Yg]}~v-U3'{I Cuck4' 3>Y4;i;Y}=8?IFl2U!o~$ sr'u╿420}63p7cN>dA!;Tbz.h2ضlõVC*dR SSf]qp=ڽ긛M줘UGv֓-A3zwnʹZ$+=K8\٩$:U)7l_nI\I=vIJ}rώSJֲT\* _Gmz 0o4Q֟ +ԜUYvq7;?6oΏ/9g0ޤϯ]z*1@f' lu<1LοF:=UjcvNj85NfH9ZN5fo{eLd,{}OtEkd^s)۱ɩA~_cIiϷm̏1ߟC=[zd0]E fj˖^޿ S׬\5xwH,S>Gz5z4f')w.`veۃ'N-'N'G{P`p`/`M[M~m4Cfg0CuMڻz>m%[n&-WH_v*sEP`C$Z 0;ӛYy[oXɎXrɥU_O^=vLݹl64nC#kvܻ?C gv"*ٙٙ۸+V\dEod2;;|쬳TfᙾT~ώ3[ 5jv꩟^"1;DU 2;fF?n7Tf7_н/ȧ,xIzo]? ~Po`ɇ150{G^av"*gvޞ̅ cF;d.ZTf/[v˖^+we|~gkV{s裯Ֆ =MV1,V󒙗\ri: 6o 5׵VwXb2K_eu`"ɚyK2]cXfO0CV1ϓ{#-_0X5{vtc#bvD묰fb]y# tz}Cq'?fC}1;D9CO쩎j'mG{Uev`8~s1;D9߾#~sR5> "fNs, DID2 f!"fdC$Z:8DhfGQ5V`v""Q0;D'D!bvCVgq `v" )k&֦ҏVߠ("fHjoL*$,C$Z?XiKi5k;C$Z;EEhH-*<`'R "9?$!؉"@#<v"fHjov"fHjovR "9DjQD$>;CDrHC1;D$G![![=7mIZ3VVavf1;_z͵Vúo~w2}v,&:|w٥lk[6O6fbm8so]hI:fο?/g+&ܻ;wm;szWuzb?̰,˖Ib?}jo}ß|8ns#n ~yX)z&ݙ2=M?W;|,7޵-.fWk;C}˖^8Vq-eo-׍}:kW=wѢx?⋗,_ߴ̅ 3V2sV{ѯ&?vb݆%\mbײW0;nl?QrE~s[d2#Oݟ|MMcjt;}N:b:Ͻ+fܙ/?k,S6Plnghg{&kb^mz>/ۘnvu"=g%3.miu7_ijˆ☦%f\{->4+`ǃ]lYggoo}㵫V::026jf\7>-_97p7;ݷ%߻yEmp麳wo[ F FO7gv6o~ޝ\3‹"}2{Gh[~xHQ> tЛ#fq'?|~a}wuw&6=^qՂ>ӏ3Дcg2g(+}ˇRYφ;2;N8ڼuo~ڻov;Ź1آf|6;jt1oO~%1;ى~wӛ}6f8 i%fNgavbڔ=S@׭AVavNjQD$խoѧ N$}ADrvٷponSKjo>;Iy yY|~O^rɥg}NovkV? |v""@3߾7myg2/{rwmޝ:Rs_Ia>7;]_Dgz\F߳'?`VS{ wl}v߁~7Ԏ;Wc' &Np-]Ɇ2\ |0;D'D$|. /ZLȿnr3.abkW.%.Z/dLs}!pFUdmZ'_aoؘQN>>;Iyd؇ɿ1ϿmĞ|޾g:kj%eF.[z=;o&e+hJVQ4= |v"" CO7mi>啿*jb݆|YukfgW2O`'> "9ߴeKۻl1;1G15G>?mk&^lye31#*3C?V +{(f媛n-nx\uD'D$ce. ^x'?W|YCRo5ĒdsEN+zտeYgSc_L53;P`'> "9Ngx7mRW.[{Ͼ;W7\b[;ڸju/Op˯WAѸړ|hCwx֒K.KفeWU8#YT\Su˔1;D?iKDy ]xοF>Wk&^xωk-{G8sb2 D$rV_6w[_YQ ԒK.AO4[3;ADrH,gŒ/a֏0Vz> D$Ē21;D$Ē21;D$RCdv" 28Dh_THX "H% |e!R "9$$If!"9$$If!RCdv" 28$@TMDP{ |eR!q`I "9$$IfH-*<38AP{ |eR!q`I :ZLڨuo7 7mIN? qgbb݆kVڼuOcx裯~CGR5>1;DdAρzs-ޝO?r uo?YK3Awfqxf'&~g0L!bv^'IP\v|yv߁y`v|?7޵Wܻ[Uf8]1;/QĤ,xeK/'tvc;WK*mߴ̅ q-sE7o~;3Cf[fH.!yҍ-yQGC/jgW:g}?S㕖XYә""bvTٹ7mɔs-Aۖ^qeK/=o3;DwD8N.3vȁ\juM""bvTN s…ug*wlbb݆,]1;*C'ٹv裯=Y>)c8vx|5!fO,;vs/μ}lvׯ~lpI:Su@j=9t'iqc5Z`є؞$fp_[[{WA y_Pm+Zbe2Ϝp{3;uT3ï~f4=QZ0>6]OϹߴrcs\ry9soC~ovvfb3Oͼ?/l&\d|ڨs`N,&*Z{AyS|1Wih$WI+Nsm||R6;SS j6ڛ?ƛ+w=ͤXE[>wٹl99+YϲWd榜,Ꭽmy{N;P8/xInz=r7o^wu$Itsw,ffgmTk]](mZ4;:̑ٹfԷ鱇ϙaGӉn-secu|MlYT'] ]n}c~~{w{GߩzNΩoج+.g?9YT4Ncpxa*fGaifglVgtcE 5;) jfns>zkDfxgR5퉒l+ F⋗{i,˖^Ꭽms^,)iPeŦ -zE6́j?|f\a~h7խ\/3Ϧ{3 64H_|!S.2&:"ٙJ[6[H2֊bNn:)⊲%\PJ ֿ)qy5J!7\ڭCJZvv vh]b嚉-ۓT`dJim[Ki,Ҕ4ߑ%CRkWokDT"Pñf'<@v ;3ӛu*kveP~EZꜙE[r9v^;G5:,CE@[}[m\ߤՉ+?ެGixsZ8V㥴eF[_o ̎aN>l^j٩YU)v>凴֧[wbI'LEov{FJ3hɫz珒5%WG%ꓫiTif͎.y]uzu;S;ߚi9m?Dhv>n%>gxw㉒ZS%MUG TQd8Umk#?:k?PɗifSi`B7C-Qޝ:ءdlT893\ԑrXݞt;&woC@wkfguwm+U i敋)7fiGn~B{N=Ӈ2;:xuۋ֢줢8}Y{o&f'/:zUViC{Osjgnl}8Nei2if'؇pJeӛ4=bиeIӛ[9juշZd>RZSׄT?햓uU?P5A;i7 f'nӛe˳sk aBAWU[>Fy9MN sR(.j`,Ep xxLfv t^큯lz ^!3?` 漧߹T)-\ocmg]W0Crr"S %iNf^`}߆2Z,COqG]<0;?iW ӘF}[tw1ݿH^e·GzFNR4!)ɣjԇؖ~in\F~f~$ȓ{g]c*̶݃ܬ7;D{𶚶`?cCV~Tݿ|+F|<( )؏CoO~5O5`JbKJc}Hy6/'Grwwfzl̡udp=TuHe x3Q a eٲ`~ϪFoʷ]ۦYm3 `} '۱[ޔ̓9;9]CXPRLYjk[fnJBx7Shk7ܱ5pښucwn>:$DڵWC2=\*id7(5aV&oSsֆvqf`v@Sw95;?(,x1]&}~uSh7;93sϷm GOC 9hx-"fGe'4;5Nl ?E 7>Mz\_s,SR#zjyAN]vt y4>2V7V4==ȗfS'pVv2>"1;Ped2촻<d1Bk.qCmݤʼzĆ;kvZpf!biN,b+n}cFXrɥU_O^=vLݹl6TF1j2;Dh+V>y72S>v]*SLc*[g}`).v!bvDdvfg&fF?n7Tf7_н/&iK{ak ,YUe_ӛß|=x;X֞%gv"*ٙ٩WnjMeWlBYgf y)qC׬\UcemǿE "f1;DjDh@FVj$}AD!> "f1;D"fT!HՈ" @M[Z3VVfg5k?D[}"4DA " TO"0;D'D"fCVjDh@F'D$Z̎fO"0;D'D"fCVjDhS5kS7n R5"fHZH DID2 f!"fdC$Z:8DhfGQ51;0;DD1; `v"bv@F1;D!bvD+0;Z!hX "f!> "fdCD("fHb.83:8$@DIk&fm7Swu]b>wǃe⡏Z:HH*8Ns]{w>18׭!d?埪/iߙ"fpDfG3Awfqxf'A_r+!}j97<̺ox׶/lwOݿ~Ӗ|5C}AD̎ `>d1)/^r }+'s}5g.\x;k wlśnϔ̐&?!Ҿ "fGe`tcigw}ՁYgx+V$C}AD̎Iav.hqN4hQ ڶ.[zCOyǞ!Ҿ "fprEuUkJ\OЇ_~iE2pR3.8S齣_d6dfv"Q8)εVGmC}~'?ˇx}U0;es O㖯#9L<7cӔenߙom;?뗟~NT͓5u=@:9t'Q]Uz/ \t0 AdC^(m-JP%LbqJS&pa$ZF2/ <}ɹ'&7s^Zw_gn̹W nk,ȭ+vyou?ǟ"pgc-e<#v`ቬރ;E%<3NwO0n3K+Ns韭onXPhΔCG_Ju'OX;绗xy؉>?˿4wqĮ=زE"u:m1EӸذUNFp+f;#3pd"WqتU*^#5O93L|vt*Cן->FqeބbʑfŎÔb{N6uԙNPoy|CU0v~گl"2yo'6Ngc(\&,?mwUF}OMR, 8x?ȴ:ևkťF_;k";ƖNcz`Vt)nBv%0<κ@{A.'4*vֿPX"ZK'*+p x¦͸R9$KW+",ib;M)l_-xֶ;w-+>lLwݷsۮvSBB-@IKNӉ7~rmu[~ O<ʬ9Nဩ={J.{EΩG#P`Yٜ)\ [pJUr|bGDc0!^e>KPSbA'?u bB%Ax򟣑6" 6#& uUIWZ>UO9 LUm^;}]^G4Rq"zs_I7R$B2n#*=مkvqwpd 1< .phi;3ϥYFlO CǹȊDey}A.%sb"FʎL^#"1i" ;;)#[Iv2|^iIBqJw,(py9)ƼAܖ O溉bS#W)ycJ&mo6.->XmUkIRIhܶpg{b'y]1Zm긼jO\xc}۬{rx6e&kvc#W^")vD;k*vP=Ҭ@ۉsr>}rm ?tejߊͨ*/jKWat!j"VɐyB;6E6mw;$.y\W^T3wo%amLŴ\eo{ɻի3YlffYrmۇBȓ2H>kN,ؽϩq"HFa2r8vc 0Lڮ%wu]տQ2>ٵg¦͕؆a2;"kFym$1]&"R,v]׵\ڱ2YDㆈpSN׶ ⸐өwNqٲnT7bW+}7Y/M;x!i ]he(jۡBS;m!6Ms zA>kה]r40Vbs4GݕE!KмtEK+lb %8rۑi7F? *0 T6ةvf;HV4Q f]";"6Å+kY[?CSUF;AAi[I1YP#tAEWKp,4Yo [sV=ȇ(%wٗ.]s1%"[q7jr76ܸNFp9f2KCX혅v&S[Qґwz\fdrȁ[xvX)=y,ڮ8 W$v1,zb*WjáaNuB2yxV Cʵ>E؅¤זZ%Ai۞*vSUo}񮼍FO)vGx3M bgXۍMD,Zҩc=הH#{n+(:I=.yb#SJ-*>$lOΚK&vjΨNPtGB5F u^Y$ 2d{ ]<{=IM)YFmyA2 %5?"֌S̓F6#v2Rlg8mnN*&-;9&Wa B LAѵv>}vri6R?CWU\DH1Aنʈ5_bB>9 '+ bmP(vn!3|UNY`|ݮTf~l|م = Nx5DG%ꦽbJ:ٽo<ŗ5mp.:|wHF̴h_}wT.P{}QT^>wcK< јw3'_rqT)v֧𔡿m,/ȍuN|ȝ _RV_|i1iaTن2$Q%n`d¬6w>ȅ?6ʳ >n;aEc[\{عN g$O[[8lm[ym] j<|2_9F(_GbG6;513K(2YIʐrJ\DXWT>I( 9 X;H1'rfI5FgsÌJa m7Wx$]foT+v̦|y2K]Q;dPbGniC}= OM;k>=s֠ɖ1׌{E|㮻~PLw߳13}-v?cٺ܅ Dќ('瘤M3n5q:f^eeKO/vHȥ3/63v]ԍL~[ܴ݁ 4Mca("7EdBZpr@X#(!|`%|>yv8)Oڙ^8QfS];#G6zȐHQ$O;e#6aOwYif4ۭ8DZiM#rnQ'=waȭ;꠴ݴk,Yv ˳d^HvNoPwŎ)v4Mo;""C .LM[*;i2}M:$b_9(Zof,4"@iM[AŎbgo~ٶMVȌ;3$I{LRNL1>f;wH%XiM[AŎbgAcZ'v~_5Š`ֵk-C dbZsڅw;P;4UT(v;,I_ϟ}8sDz(e ;>xߖ:< ؒ/&ߣP1xyӎ4ŎiŎ4C-/'NYش/,z ]W^-B5o@ZAڠ_v?T/BdlGFP=]:f'sXM;#+v4Miz>S7Q S &RMSh:O>ns^FNgYg7p:yNd e8bG;(vԎTtYd3Ŏ)v4MoQ쬩-Ӷ?];iOz)vDDsXMу4M#"Qhi# Ŏ)v4MS숈Q(v4MizbiM[ED;XMh4UDD4D4ŎbG MS숈Q(v4MibGDĈBiM[ED;XMSh*"رvj:iŎbGt=H;""7'~ibGVC5I4UDD;fibGDD;fibGDD;4M#""j4UDDPM;iOz)vDDDiOz)vDDDiM;""4Ŏi1T4Ŏ"""j4UDDeT:v_=z"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""w[s endstream endobj 149 0 obj << /Type /XObject /Subtype /Image /Width 1103 /Height 1268 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 19519 /Filter /FlateDecode >> stream x/l:;b@ *$Q@\DEE ** STTTT49ATTQOshvs6 9ܵf-3tAz%/0@3Zk֬,0Zf=IPkv}<(g&<=ݪEf9G6&X""ۧƞn~'}9r")6bʫD}~o'YpS궶 `18iyHm7"dWN9G۪%u6@@Hf21+uPbԵ;ذuuZ5y2LH-[nұ=T{J'%+iR̚S "^/̪*Ć8{6\EҌpDmU$Q*ڽ{t eh'nƪD[֎H_/-a=4|ߧZ=5{+][Ȫ۬JNҍj/ɰ2Ť?+wuu-T_QMq?GwlMJ'?OtNk`mupL{[vڕ*ʍai=\W VB )UPgųĈn?t}*_ {]PU7] )i%N#XVH=\֕P2PQH H'UD٘?vB-acmlx]ÎnxU _mճ֝ȍ~n/GW:bDI:Tݢ-CN\o)WittAw YI2W'M u ݖGtRU,NrMq]֤URʯW=_FJ)gZ' ;Af;";LQ7t}bzy\oR:~ |I˶"YkYu_Nc4vYԞFd8'u.D3݅ -NxmV[Un}6EQ+oqdP#9Z'])R+=ȣm]KxyQ@I<"q+mnWl,sƷ3vDmvT֪L]4Z.NTrwmҷp:ӲSP]ׄZTH Svk8:A'>)/tK{5j} ,+UBXrxC?yOS(gtN :A'N :A'ttN :tN :A':A'tStFXYQ?Zott@':A'@A' :A'N :tN:A' :A'N :nTdv9i :A'A'di+VtN :A'tN :A'tN :A'tN :A'N :A':A'tN :A'͎J*_lYD}Lc?R _'2*;TܲB'I^n\HS-T2gV?v#{_($Љ_ʭhnTJTG ?-qAτTUoYluE9RcwB*m.Y]&"79w7wO+Tɿ?s !ݖ^~GvvGT3+t&}[aTltB*NeS٣tNLtNeM :A'dJM9 :A'\KF'' tNMq:A'|^J:A'h<t}V :A'QN :A'''(:A' ?4->!E X4KŧlʣNɯ ~ ܛIart~+'ltN <0rXgB'JF'*r`tN$dE'NB'd t(ʝN :$N :ĥB'_]ZtS(̌_ƺ<|O;IhtN~ߠ`:!t'N :d?tN :\:A' NH,(R :A'`[F' N :NH,&u $:!t*.qȡte/k5O::Y\ xn@'ʑ:A'`{I:A'`:A'`):A'`J:A'H/QR@' :!t&8!t&x01:A'`U:A'`="tNl tNv_⤀N  %N @ 0l:A'`@"@Q$rA EI 9A;J5v0)rA^,"LNfKg"0&]'`SN N@ TLP0'!ruf`0DU6 4`4Lp &kɺN,Ab~IJ֦uN&VĨtN :;꤀N :A'&I tN ? :A'L:9G'tN&04t24,tN :1@v :A'd"U@''F'nY'ۇ ΛT1 OlY-N$th@'2NղdE! ׳mJ陪^oX3 Jju#7^͟߷? TղϼӆڠUḵv_$Rvq̳Zr_hFտ=H98"ݣ}'/ST|HoY-N5lȠZJ?,8c:SVK#9J+#9Б FX |]'sjur/_{iB?sd֛TxŧҎY:slntN/׵U :A' S6ltNH|8 KoB'G>ۅҋ[R nI'g_tNЉ;,tN :g#7jrgtNЉ<Ͳ/_C''oO1~ tNGvBoǯz3&GA'dAtr쿈kO>$4y :A' gMt75cIv~yN{'KM$E'rx`+'$N ;<_WN"MIv~yk(:A'xY9o#QtN癒!\ڜD :a矐}b@ : PEi^ؤ\D[8rb.1tbD'ўW/^Hg{M*~<~`i N{>hJ'F@'$їSyXaitjӃ܄Dd*h0}Lf t|M8E:N'{ G/Elt2NMWwGCLM쭺]mNI$2dJdݰiOY at:I^ nNI(_rmN{ûj)C+|?_([|]~col8"NNqd'וn"ݓ8L?$r.znp^-b٧YW:s WaE(fv  )d^#Qi}ɴ;Hmx7gw#4 \:Sśz:״#M*C'&tb@

A'N$^)(:A'y&/)t?ENڑi_n[RA'˳( iƳT'MA'd1tb?+l(8,Nꉵ/4:A'm:*:A'mĮc tN9zK=N :A'~,JXS*6:A'3ܗ7sOvtNy&Wo)tNЉ :A'$x>)$WnőI}yv6tN ]k|I_. :A'دΆN:3)C]} lƗw'RfgC'd+VD't3=iA'{Om >=^N :A'O|t_ntE.?$ّ8:A'|Mi6 :A'䫭G~*"6:A'|=:A'o[? tNɧݏZ;s%ʣtNɧ\|zp!RMtN7[;f!K1 ΛTUVODru9|Q'juh$8H]'y RZ'sj駀kW|̺]:r16UeJe.8/"6Ϭ^'rձ͓vABB*ju!MoSBq؄]׉.ZPyq7M*_ iGCVK@Sqn}'Rd>Y1}['=#;2N:ّZu; Lpt}N>dxmSCTaReGrF`<*) .R#0Ađ() j f8kBI?D `d LpX0CVZ&$0c, HLp';&4@0CԑR3@WI\`0N IT`0N"%IK/dktfZ; tN jtN9B'(0A(RA' IY :A'` :A'`-0Svo>~An[RA'Ɋ# 'MA'wq#'?(Pp :]lI7N :7 :A'̱ܣtN1G :A'`KD' 2tNU9@' 6etNotN :A' `?;=:A'|VOzQtN <):A'q0\tKq%%B'W6;S.Nɯc[ D{N :A'&(J+N :A'&'MTN :A'$N :A'&K/N :A'&ztN nJF'vtNL쿚tN$ȉN :A'H%N :A'Hw>>oK1 ΛTMW'y RZ's yTujW2r16UeJe.8/"6ϬCPN? jR tVdN6JLU/׽iKx&T7|%hB'2z{M Lw2Iu28C*dnYdw'R*yfNN tN :tN :A' :A'tN :A'tB tN :A'N :A':A'tb6?4 :YY :YtN :A' :A'N tN :A'@':ttN :A'N :tN tN :tN ̕Dtd>$4y :A'+tNP: :tN tNt@':A'Ntsĥ#G*JNiY&>|[~^ZRڰf1h"Jh y!fpE}9*Rc,*J >^Ӊܙ[h[n-kOdm@Y$QսIFdml&>/[ۖu^#6|˫UTǻtqO{L4%_m}9"l,rje72Y:^Cl?[FKv"꾴~sp8wI)j']V}VCU~Jnu?sW=+PWsH]>}jmFUְC7'kᆰlɰt=|,|l?)]yuS碑[W/> ׆ 3wjG$ `UK1QżR%=lY g.ЪQ62TԲs4lݨ! ZFn+)e 'n(S$W7BG"YTUH=?Rj㵦Jj%K%m0tu@U@Z#SVêLޕK[;"-UxT]Ci+eKgNFjiNY!_&rtCUgеI!Jj؁3ٽ Ff`zVCIkJ"^cMƅ. +wGeSq+RTe?{ '_ k1ྵ)wT-VUcʛ< :,pk Mq6t^=*۶WUӑGWJJRIy/V=W/uX;;r2{]b+/5uutuWhȨQkƍ{fūW{T]Wt{VM?GrtR?k)^eYQ1ɩ dnaH =GXZPgՂi`8:rwMN(}q;xUͩ>ps~ Ƅ3:B{t]Q k[հK"'UqZ'Uo%2I{4>L#TeSAi=qLgP{]t={_N=\Y@[{WzX~ΰGwxP\j6RaUeq[GNnxg1ѡܾKvqu1!wZ㎒o Ӹ۰[trL@X+уeU;N 6Z՝zZwڥͶ3I)qhݟ&FjRSe=nڪr9*2RMv\.=O8m?ٿyl=\yg ׇ}]C^+볃w^oMwf[=qesruA+o'ᙂO_ڔнT_N*6 9d"&yd26ɬZޝ5v5Yg@|j|a]H69(jYUkKDdݲbE*,.˷ MÅ! +ަpcɰS~I1q{au$'oe/#bYU)X+5 N,+?ɱt)i,NIv(I)iwg.xU{l]^Qfi _\W;p ^,]&:q N"n\ix\O H9d%:rZ'L̻\4β.ԍ.v[ݩz:7"+KDzRȮ6uYVI)^ux\i4Y߫/wt(II"N^iހxXVR,VMjݮurPNު\\!=7{I'i30)H%/t*YVڈ-){ƥ<Qk5Y, 9NH>S'ЊgV#{@D ui>$z~vt3DNGiҔvHms\NZ!+: {O~tr5)/tk8w֔1M@'fV  KFTf,3yY6Ht8>|@*K T tNt :A'N :tN t :A'N :~:!t;ݙgNH0'RA't@':A'tN tNP( :A'@':A'$tN :A'N :tNtNf\4K6:A'K\~4^@'dY+tN :A'tBA'tNtN :tN :A'N :A'tN tN :d0NްJnYD}̿t2ʟ8_ɩ|: N w@'2NdNI<}=rQx2Z(He:^gPHH%Y]6Jelha"+g\T|%_g:ǚ8МNT;!Nzs !|H{' [tm :A'CrltN9N :A'' V-tN :>WGtg9t t;+f6l[`lHB' YG' R :A'}BmItNVN :A'H :A'p~t~t$N :ntN5ɣtNkҶ :A'`39 :A'}At(JB'>8Jlt&_EJ<#v)8.d?hNH,$E'B'8+7:!t$ktNGrjtN-ItNiy :A'`E'_ڲN :#mN :#m Vq ETf̫zKKFTdRL[80| 6X@.hO E!0\.J?D `TLp-;%0@V&8!  FHwHl~f Y&g_AMOGTISAU]3&^,ŽA'jtN":!txdtX ITBTɂq+0@h೉ E"gRA'I/NH,srt IKgwٻgoRA' IK J0AW0@J-tN P :A'`ltNa tNR :A'`s?B'^:A'%.= t(:A'LpktN=쾬tNiy :A'`t򻓛ٜ_O%NɯN.?>A_\7ג[ tN P}tN :1AGV :A'Ii[tb@'T%N :A';NtN g"6tN :y 9D'e tN~01:A'L櫓:yÒ+yfN\j Nh@'cySa^YM釂E L&y-7ްTfQ.fyUv\LgS uwtNM)ȑ+]9 :A' ɾqrktNЉH|(:A'L?:NwL49 :A'3p#%_nf3)8,NN<t2@cBOYg!&E'NiEd#GĉN T+'{i"+'eiE"=H?IOib< $6qt?]٥W;rFOiVzOg&NtN~x1ܐZ8 :a.]i#v+W# +9R]r:INb<,/2wubןa"@ZΒеl#t2N֤Mɴ:4G'@'SĮ.hoJs NIYZq|Oclt2No"W"a6:V'ëeaiub8Rmɴ:ѣL6-+fiuv/)DSlt2NBǎ4Q-jNIh%{RdNDPלN?mBltMO!429t⋿?wo ~8tS&)Bd}';GqՏ'IdXc>a_z{G#NtBrSGr%rԙ8qc:lGZbo^dp#NtN4 $Qv_':A'SFvbYk^8 :a2RZڣFN*r!NtNԾl7" ?H"u? qt?UIg|qT"NtNt_Zc=;L}'_tNA'vUݳ @E]G.}EЉU9\t2EI$ :A'ddt?[y`utNЉɽɣtNЉejɊ :A'XVb w;t8}S=tN :QD{o'}N :A'ފ :A'hBO :A'e_> :A'Wс$'&N :A'"-˅e}N :A')I_x_^'qkJ3NɯL.?Gziu#ݮ18:A'1o_Ыiٞ}r/4:A'$`:)pVTn'?6:A'$`O$sL^؆N :q'/:RtNْe{ʠtNװt$"'!tN :⁧dSr!N :A'_!!F'F :A' 4>S^)N :A'2q^tN>aETEڥ:A'|LM>}FCT+FF'ۇ t%OWrju'_xUT k?1T'yWVKW^ھuTZVb:Q4T:Q\ZrXwg=@lэlzޔO(g*,aTJnY-Nv8tn Tղ$ȊϷ⫙ k'>{/y*{꯳juZ;{ӽq}'}'d:ّZubIeZm^Y-N"߭dw'R*yf:*SvJ(T:}ktNL'N :A'fF'~4':A'|5 :A'-ɢtNЉ tNLz;tP_ :A'W_tN>d{ :A'-Qg,\rhL90KX%ۨDs ,[r0VktN4:A'Lp.%tN `C0Ax QtN btN LdbtN wtFhK t&{t{t*{V1:A'ޡ*ytN @0 g8MNb9fSp :Ypr5D'NT :A'`3tNu@'zN :N :#dt&}tN w0AL!tN >lF'N#9 PHevlIcofgmR1}) ' R\.! rK`*>gp$&H=N`K*L^&8B ` LX0CB~Xd CK` Lp!G&|XX쮤H̴vN ̴v̴v=_l,pN~.eGTaC`ؔŤ5PO0E A'NL [;T"Җ:A'Lp"0AR!tN A :A'`@NH,$1GV :A'`k9A' r36Wi :A'|<{-tB*dA) :A'G :A'`3N :eE' et&;:vi :A'tNltN%i0S=)tNLB':A'Lp(:A' z#tN `S1tN~Gr,@r;btN.l?itD'7$W͵K#N :A'&zc&MjN :A'I$N :A'&ؓvtNLp'UtN k%:A'9Zܓ:A' .:A'`K^N :A'RpF'dzR]A'?竓:yÒ+yfNinU'c< ON0Љ<"\uh:!t׹dN|b>:FHS-Teg Ne<=K:O3{_($T> stream xYMs6WHTAiIfzHꛓ-Q鐔>"%%v aՕ2Qg!kMSATpIW&yWu\^]QWig2 jS5Z@¿t}|#VTͫzW,2o^zQ`.5uB)5ҐneF% #sTN aq$b2Q@ "bohVf%7 |9,fUl_VhR2e²B La]#Z6ƷcSj MNޮ08b4LxC{-#C /ǃ}6⚦yAv<&_9yMD17u$TSvB(G2V?NPfK $JnFlEV@|ĖОHg{>`#p{Ih܉˴8Lp2L=Rp#w{a4tv&7Y=HFsHI:BܝDĚ N\y.I9vE(FqH CW`Sl>N:wD(OP<8؛1Sf,8O1Iu&Cp$oWHR:XIq[)e[*߁[]--`mi|}6i-1r*VM^uƃXο {U0#+5,[.T}۷U%q: :AңY3 endstream endobj 141 0 obj << /Type /XObject /Subtype /Image /Width 1105 /Height 1242 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 156 0 R /Length 73772 /Filter /FlateDecode >> stream x˕U3QTEH4HE$&D204|‡`{Xcc"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""rN]4mJv_!"""r^¿MP=~z(y4M#""""V|qRhLPHgO>.GDDDDW뇏1{ϑ;J͇[ 6=5r)9S=a@#""""_wce|uˇPǞ؝1V$j\폿|tǓl$O[r٩?CE/yZȮ=;bPpVZ+R"y9xu/aJǙPJ9%m+We#qb ߸9b'v_`/͏l/ÑϾtʫf9;s$, wc~z%'-_=֯%ҷ?rV$]wK %]1.1b!mzvj=8J͞}:1H!h-S~5TCGFH~)=ՑH98rX(yDDDɣiJIpJ8ył{S5+׬f;Vzo[S{?ƛS>dn_KNBm~s\S2.QXq:Rlq/5;~w>N]OïNq!NL=vBk;ꐅS.IO֍ցݲmע6?#m8ȴ{Ǩ'/跶b:J÷?%7b_6߸!a<*Uۣs%]; ʑc?F@Qv`3*չjp gzG)]?%gv¼\8 E@1d%:3,cgbF:WADdZJJΜB~~HUxAK3$WGQGrPJ'9r3S޾);A"HSHnLv=BmBB"ƚ~. A_PaD U԰l&ݤ7쮻$a?+yX}&/jAaWtR򈈈GӔ~RöGPDw҂DžnIa8 luvQT : ,-׬kJ-HNJЊ:Ljz (ȱT J!!BI&Dp(;dc<mt5'q͏lG ^xB&A\Dq)zZEb~ )yDDDɣiJ){qSq|;Z'wWHR^t&xO8EюdFb#loc8CGP.~5"!7@ %rwcT{`8_'Y ~=QԄ~9t;}K_rCR FxdNa`W޸kq75E K$O_e(]S L%d1+y5qPiKN_oNB2gHF(S*T;&*͊Ed@.bѨ_aUJ292vHOL_m=I\(Oi[M4?N;c7-]VShɌEQ1[Pꦌ`9: {uɳƛ;OTuǗB#w]W#"2[Ԇv_60:b\zx~zv,|㷹j\IUw3+y`nyb4jwD~/klWqh8-3 ,T3=KEoK YɣiSaٶ<""J%OfVxɦb32,i)EC $#{k&#({52U3) 5Tiw%?+}$Rӄ;\;,pv`[8P z:7)!H֑<#R%ϝ鬘9QFU#;PhT$WQ(y.BɓhxIv-v!Ͽw}/k?#jRT~VY2t赕 Y{2~ɮHM9 ͉?F{]Kj&>Q̈ Jɓ>8yay=Kz?4DDD3gϾVBEv&C쥗]ǚM)1WJv\w~tǓ7-]vłx)Ӻ%-O} 6ҜkY<>aISˑɓ5(}}e߫iHɣi~g%OŶngրؽw?E-\4~` yO-yrL^p-YYiɍ7#|rs"y^?|SV*$}7" WbÖzäG:%ϬKĶm~d{o;\0# Wxc: %liuSveivW|ϋN2s%ω~h(.Q-IQAd*$S2ORjNhS{$OBq`/N}_5сܠNMN_ӳxj8_R@24wS]W#"Q%Ϟ}Tq; 6Z`@3~[W$VIJ m7g,'qz(IjjSDk3I}YBtOm/љrڙÖ9n(ͭj!k&k;?Ͼio-V֨GDDɣR/l/N}gUyp~|}EkKohڵ%7cYP"S[^gv#q7:g\Er8[8J%g,dؙ5tV #)s#3a%+GwUIw]_Iӑ<pgu6,q|IJ8ʢ0-d {7`\qC#a˚YVPih ͿKn-;Iiw7p'<ΞW!k( g_:Ap'4:XʯΡ晈ǹ G\%|иJ#"Q^JٍoO~.htr\3,}꣆Ն/(A:L]J GpF/H G$OV-Y{O3#X/ݪo yu#uQ<%+- SFVt.G֮P̤͟[|GDDɣzI<}CG;7-] Gl0ɃG}eORqڥ,Pd c )IKh:IaJr _}{vGNd;zLRp{{`ؠ0ɓQVT=5jwi+͟S"dN#"QhgmvA-v3tSAψ Rݒ.А5DshZr)LR*CmGu$Oҝ-hPY\J͏lI^-[ҴֆE(yvݟoyO|OE}xM}qmϒ'U!|V :WINWVOF5y9f2}_'SHřeV\J 9-@޾L:2%F+T%n?'"p_{] E9Y~!Ͼt* hɓX|/,ͧMa#S]O*I\V#j GVF>IƚA\}` J U7ڞeIFzh#}^+<˖-@&0R{ǝkgeUNÝh"Jaoؼy9H3bb;>ϲDm}9#[o܌[rpQSa\a\pBm~0T;jV_'v)L$&ѫ Ç-js;?Ew$*ǀkxxY%&\ Ol+ l|R2mܔχ^.gd-َSٕXwOoʤu3PZF!u|x΋t$%ORgԆަ i< GrV4ˈ3oN}si# OvJ%\'eKV Nwis+ys83 6 d`ߝ _\oi {MSӂd0œ|\ܣ;x;KCb=MNhL队Gzz1xISַV$҆ DYohpo0١w FnqV]M׍O\M7vA1E-ћ3a8j/I KB1?,S>hgs3ޱvz9 i9`5nIsu)m %:ۏD^OZ^~;Bɣ ^ݑu;vU<{K[8?FHcqyJ֑E%{fq|V.xecfRByfm;ҽ#;G;1M: q* ږV[7fϾ jl;bPy;6g8HÑgdvBqH,8pWY>ZVjHno;'B2 oYYwB*lv7܍3κT6l31>uj%G'PD+pL"u+UZ5|%d(׬#%i緸9tI6>]h,;J9PsGH՜Kowj.ӛ̬X%/f[qsj%>:jp8 =DO%(0eϙ[4Vӈ܄ؚPdWEʵR}T6ۧ7Ң,>Pl=ߏ7s˖؟z4Gy.<'j3KgY6$ X< S(yDGg_M*>C_Sq3/8wm##rۆuExYYiH-ؿ.X. o˴J3E95[dPi5> ?\rhZcJ^ (y22K3:g6w'F?j"ڧR0BVʾMi초`JMSؽ"K\~(N%<v[266)v&zB uY#Esx;;yoJӆW=kٕrΝm jɍ7g+TxϢyN%ˡs4|XֲIlGL88 &Z]Ǽ㺏5 ~3!E:7߻m,N\q3lۑX,&޴tY}sǞ]\}3/7NBxvLCy|m=I3%g%j%O'5kŁfa3bNIi$䙰٪d!Uhv$o˖~ >1 $1Q+%O= dSA7ĨEK[imJ+Z[vݺb%)|z/`}|;K#"+rKӳ(yew|,mNzGɣi^|)ܴtʥlfq2ƞZ&_HV#N03+/^];+ʫj]сm3 S(ya|i y6=5(e-)yuLTI $GkĿdi/TCE#2*yDDWDɣiJM-95뮼ꈎd,Ò N\]RN&Y0vU.fU4;<ǿ=_?|4 챎Ww}/߃~tǓx/+4rJ(9s X-flp*OOuڗG.B#Pe.ORbeAس/dW&)y8%7zoؕ%(yIr9 :qsnG߸ df߶rup+f7o?~b7_?|Ҝ|MFЫ|?r|uW ׉0H.$$c{` Md=˖ThgX>x|'kLoOrGw=^7g+48w=Ů=˻?ANi`t&B||ȔξA_<.sehɓvlN~o-vd6h37b<_Ft/5dɹ΍F"ߎplmhwQ^ǃqł7P+3z;=* p˵YoO#ZVD \hHVN!o +,p.ThgKpLʼn(:]׮T@%4X|ה&<{Hf^o~CetK7\LǎnEVx˸~z$L8yі'ٗ&.jΖIYJ|<<  Y(.BUJMShJ%Ƀ?vłyO>&yNc-~u6q늕c|hP4dZRCr- em;*65̼܁syngRp"AE <\ؐnz $gqXy߶~K}fr:7f8yƾ|;iץIKlBnT9|zF)Ͻ!2Ti#.єLQϊ2NB5^3e6&yk%VIj\^o{kyr+G3qZD3M03Waί1s!yVYYJ 䓳9B$Ĕ pbW){2c&RShJ%,ˇSB*%L Κex33aeێvө;tC_{]M s{ľ ̵2ٹ9*p2hGaFH=S%^rV' gv5#^OfX6:yD$I'Ed>CxC" Sm`㻞ʀKl)-:D.Pm x2xsۇ;yNg-iJ%OMlJk K6 鿼{Y(2/y( \54Q?-6 :<8-yI|{Xzr}Ql)yDDKڦ GA:lI~6@s[jͬ OɄ 6BmJ,KD%tצV<%EDDs6{)4Ͽr ])acg *s㌱wO>cX諻U0%$ 9:Gַe3{\뻝3/N}} tT?$On/[ǔXhZo㓓-$LKfp/NYLRM5ˏHضv#&bKiQ򈈈lؙ9#[o܌ҟA@98`mR\k@ 7j\tќ>Br|u3QN%Bn壟䀥,l<gY*NS9tv=Bq@e;{y/#mӳC: Tk#zOiU¼ Z{י(yfQ`KoY^1'.i%?ђ'QXcCx G":顭80Q|0j6 휂эڅɿߎpKޖm;E5T%}̰Qؑ7$}%)yDDKr< %.oϢٕAeApkNU,Nuuԉ~hg(QZڦ2d. Enݪ y7|4TO-tkQl3o?r`nٵߝKV⁋6lWҙ\6Õ4%9}%)9<{HPY;4?a%B&yFKʫnK,^|r-J23L|{fmz*j`y]p3S7߫qeێcOS~t7FẝIIO_f272NȬ%4jQCꙌ ӓwI'TV5:w'?d ov;3-:wd8;RΡw(-eEY qxH#""9kv)<ʡ-vLɓpdXI5U|&6L%p؉~rE5M=, />dhG1Ez޻~.H eaaBŵ:$3X|Eo]O-\4rOg%0 ӯcO/DF{xz<"""okohJx r#7oW]ݮv: Ƀ7lfA.޺beI\'Jb%y6=r;0GS_Ƀ+[!S`ť#mi2{޲BC3)8vt VOrJ]!y2ZCC} L%7]=CzDɼ鍜H+j81TRlo[Ѱ64H?#.09%\'v΢3svLiiV+ɃNj~i?\zTLvUr8ag;qcMuc\_9TsT8cF8?Logoqv"[DYN*g߁vܧ]pgBTh0{+7~zݑ~ȤČ8+#ABa =m+vJШ9_$]`ӆpt3FP!\:1=}g'm`&O2{rvrpz"0cMuHYT5ز 6!I?؏qG#W9UtB ';~!t)Ր1N/ ڹ9J@ K#"m)J]Sp2aթIu˅vPV?sg rtgLgd}jN\θnș(5IQ1|:hn':#!dccIWЍt/)Ѱ5ɕM HU}H'{4DDD ;y9)_oN1JXN9=[ؕթ4<޷?ry8l`çaiԬEfVE;8[vgF#""""S<pYE4b&+,زmGiS ϚֽC,rjWr`5@P~ )psܹv˫owU7?p5_t~eSO/dC[gEPJ'(u]w߫K^q[WO>vtICt,)q Hxcz gPOFl8mKoYޯF+8s9E,4 M7h#kP$}Neogة.C2ptyڡ7n5j*iKH?v=BI!na'7c/6I9Ȩ G .F4ב<;<NY|ŕW]ԚA7VD]"cwyT馥:r#PϾtգy(y0| P<)^n jcBؠ6෧[xىK}_{ݞ}!? słً2\F̜Bɷsa}u1H7|ĹY2W'\l'vsvb;h{4s+S5[S:E)_#""""%yp2qqk' l+O{$%5 amE/}Ƀ[NBKތ uʤSx瓯[){K/?xBJ LR`\"H!lDG2[uFFzq:;ؗ<\#YWhV*yDDDDd<#N_P0ӎL(y& %Tҗ<9^{5YQLfy8LqM^dh7'p8)ҊC3 cd8~ uCG߸:xԭKYܲl %Dd>@!o%wvRCW 0ɳ顭^v$%w8ё<XIJk%GGmٶ>8L#:!^'ˇK $;뇏րQ;#~CzL&sff{4` }թ x]YlL%Qs!:g!)yDDDD.rӺn=~Gb:w#$~uOR~=n4K?xAqUWv$OFd un3$LCdh&N U6Ϩ(Q%a{îXNCr;|ƄP ݴEGDDDDfQ$3ԄI%B|~-.t8?cjd_qm5re{"ZBk|A,eeh$y24rvwNcR ǣSJU]+p&)yҐ;\jjQzgAvfцuR򈈈ȴ%O-u0UsPfd CBU]wߋ^m8}LLd>ؿfKA?TVH/N}ߖgAčXUk) il5cPgh6+5+"jM#9j?؆tXJ]Pus_5H#""""%y'q/(4-\|EgyI7ؤyn\:W`X̑ضz:==6MxC MDDg [/yhl[q1L߶FBܒek(#VYI'=}!aؿ.cjws59H$Y+ȴ@v#wGsvݏ0 A}p cXJgRayo1^hN8Sڝ,ЈZf Uj6-I9xC[[5_;38 @3Qum+W<|u:F3;XŞ!֮Qmsy>[6 H /d7 ,􋯍e_"'Ra8[:翨ԟjeL 4z1V%\T'#pӳzx`ghf(Rf1ӳ2pl`Yhss8ģ9ai{w?mg\yn.JF>?wQ?=DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD|'? """2Y~iڔUCDDD5MzQhGDDDD<%)yDDDDDɣiJQhGDDDDɣiGDDDDɣiJQhGDDDD<%)yDDDDDɣiJ%iJ%iJ%)yDDDDDɣiJQhGDDDD<%)yDDc |hlGӔ<""oԚs;HӔ<""4+A%)y4MS򈈈GӔk {łܔY%EgA~=%)yD]2=Ƀo15۹loN|lD==` ?#I%7N|R?3,YB.>1:"v\Dve|"$x2a&mu@C'# V[ktMPGF9ND 'p5E;F})y4ͯ3?}׋g%O|m^vy%BP?r[J8Q|5f-/ƑҔ|e ] W#lfؙ)6iEgY xѺ%^ u;|kfJMLďn ɃyUWW*r;q/OW+-yu;P'Y;Ihkh Oj/]/-y] MO uD s-n \f]I6RsPHoFܩ Jr Vt/2' l`0yC*y4MGďn9;'mJN/-0ZĽot$O]E6-*_0H!HA"n1D4J($QT HA/hݍ6nf7tC875ky.ns9f5Ƹj 7{Y-$J*&QK s&z A 4'AkIWy%OT+Ru=𞹟fRT]U:(#2?<׵g+y&)o{jqdx EF~Sh3o^a-p>gtj^"5y׿? ެݏ?[r_C?XW,=TOevC؁/z"m%q/fK%sv'IVG^/843cf#tʸGN\3PLTa4?fK"4ɭU N<?4 %OCpN)WZ. ӊ_uyh-dqhՔYɣiJWi6m<:#y2@Jd ;o xݳcW==oTO4d&Yȷ?yr_w*m6oggb0Um%7Ot-կqH 'RW'i8xPbFD5b-zyg=#4"N"C)W7{M^*}?RlwGI(uCé񜝥#}WC%QJ%)y4}˙ lN?;u\}xfG@㒇~=keDa< {g_?3 }hlyɌK+~#N8<ÉCz'Io_얎M?)ynq)[1mv5 XcUD F 'Ppk@uCa/GӔDF`W\/xmn}у Vxexlg^LA;W}3<,c"\{O<y>|k}< ef)3ClTlQ.\}\MƂ+y4Mcl%nB=q px[ ^dvGUV 7}; %=.q;$< |xO_3b$<,gu\6#]wN^'=m>{7NEa9g-ạzJd$ɰy]&D|ps']qM#93\Nz:>>S.GӔ<֧]b,= SKfi˶ђq8l\4'v>)$юݪ4kKKgh\m|ZPS;t)ielCMFug9AʝphU3!zQ'UnԄT6r)q=K3C'ٶZF[p3S3C_ɣ)y<'i{ :oOt\}˓]v̋ȣy>ꁷgXÄr-<~~]J *!٦[[?uyЇps:@+Oip7\sI?~W>Vwi-4i1=_0סZ٭@D؞Իus#my,OLX>dSޕ<5yAk Fp(FU>-_̛IZ4tqpOXNɳCPRH6|zM`}ѼIWw$!$GȵHI6$#T҃P\ <BVĸFRW#?͓N-HuBp?dA?m\֏H xiK;4_N(P+zҰ<[ w}vs&/@o9[̳6LgYJ5z}E\9}:%}ܡrtW&;ҥ/EuN 93֛X} _okDM7jss2#q8W ypbkz];ɓ!lI ' ʡB.U-4L*=ۛP|:$~˱p*FB`0nD׶rRxDN/yrdPpkecMh3ILn)ʔ\.ex. j&:*<Էm:C-j5:[6]>T~KвU{ 7u$ m gցx@W+0tB23q8fyQLWv>3TNfc!ٟfUg@mU6>' M^d?IO .yٱƵCaq;Ce$3S+LT~jUmf淤x !_ W̫nnY~n3/ aEqex j&'V*iK_dU8I܊[D=JcHK8<,>nGӔN] ƇɃ1Z &]yѪ+#͸=|޶[5,zH'd`#y:'W!U%y2fR,ñD)i'!BY3,aȐ&K: VŒsهk?evIpb4t(Smi7nV"**)?ɓh޶ [n*]ج.aQ,F[Ci #iSΆSh%O&$ ?^c|;֐}A"|/ٝè[e>s >Qe$O(gu6sM8ܮgb( gSrLŪ]Eu}ssMJ6kB|LLz|; p%ϔsyb[Nz:[ۛvݓo%)y4}J Wഴ]̪U964\G넕<5 HeEػ"Q3n&8Q[޹Tf!-+N<Áat8dN;mBi-&L$Ou6-LҐ>X[9IIzKl]O䮾uN9 4*6\&^MWɣiJW'y@g puἒS^]8Ɉ Y_.JH[PqDʹ _0rX4<8X"e q盟ywpۥj2+:2yu"v!84o}EOލ{=Oo/8fWޒfRJٯ;TɔS37qvy\oԔ' hd\IZI ɗ_'#J0HJMt~ts3\Kzҩq-ł̛7}rRhG[WԖ<4J]DzQXK4Jo^4%x=Z&ҁȘ /8WmDo~ YSGN$_j̼V5aBevqv2ψI!hI$9Y f2ڎ頺%x=+yFZ*#o6] {vbc$Am`Gl͍FnްFl`=ȥHam6W׮@!1fh'bjqE%x=+yI|cre>9# nw5:x󖭵eWkdE=Qw+LNBjK<.S)#\k噡oY&`&#%$B%*HV,e[NI?#!PCɓӬH\>éĢ ;Ki G>[ÉiՉ* ͿGt~Du{۞<$.z;ݏn޲<{.١yP(x_!H?"P:|pf [$^8p(> PXv#,5~upѓ7-T+-S!y <,?U!UTNvNuInvrO p.El8(m/D%8U/JJVm|Fto< swڦ÷n?y$Unk{ۯ~v0kֶ" سUWƇ65[8WV:EY&ɓNV)׻~gɪqphkc$OB[,% 8cH94g"޺E3[Ƀ/pΊ2)W:c= .q>x +.Ӻ%b4 Zu%%yMdj<aMfTE!F.peOzXe2#-rЕRz]I8Q@Y?vFe#Xt%x=+y&K|rv>V3b$gu\vd{ 7zǞ'}^'ë@}HdUϏ!vn3Ehd0XUTB=VƇg(yeJx 7S(d76"vK)V_~%-𑯫/-~ο#RhΏnz۳eƶ!2< ...~i͸`gVw;Ǟ{e^ɓa|U\:4YY$U̚jB W: f"yҭB1DCEVNDT[o_#.NY:RZZF䯶Jj>44y+0Ֆ2FlϿTkR{VpYg$Pȓy%OdϑPm'ybdȷ?8\9o/-}CʁUm{yq\6'hT>\{-?IgG[oem̷4'$XA9adSB#>#wp`)yDDDf.y2BIAM5vZE[ɒ'}<I ^LN yPRY! bb'u.]}Yu3cq *!8W >!TKH?rF>T]U:(#2?<׵g+&$%Ԟa?sp7Bu(y4M#""2 9x+8Xq@._B^wlAdgڡKe ȄN H #yWQ-J2Ck+ӭE䭏2IɑK3 mdO~7N>d:tmHavMk!mJMS򈈈k`ؙg]F-¦Vlwl 5&3Z7~lvRhGDD<د;/cӫ7lܼek=덚R\pJ3R$Ojz$Ϲ?9/NFʕU&9wkZ7\]TɣiGDD<} /hÙ>Kzҩq-_̛W!feu:WJMS򈈈GӔ<)yDDDɣiJMa4%yUiGӔ<""":lΕW)yDDDɣi:W^A%)y4MSȉƝwߏϦim޲UɣiJQhGDDDD<QhQhGDDDD<%)yDDDDDɣiJQhGDDDDɣiJ%iJ%)yDDDDDɣiJQhGDDDD<%)yDDDD<)yDDDD<%)yDDDDDɣiJQhGDDDDĝwߏ4mAyV"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""rټe?-uӿy9)xi CxQhGDDDD<%)yDDDDDɣiJQhGDDDDɣiGDDDDɣiJQhGDDDD<%)yDDDDDɣiJ%iJ%iJ%)yDDDDDɣiJQhGDDDD<%)yDDDDNL_EɣiJ9 ټe+M;_72]AJMS iJQhW)yDDDɣiJMӔ<""4%yI(y4Mɣi^""":l4/I6M+HӔ<""4+ MS򈈈G4M#""JMSh%O_Oo{qcHaYsHߏOUPSOGӔ<""yVn;[wu8?ݾ}l32o#JR.䄕<9՗SͱٱC㢞?׮۰kS^t};AqKe2l}|=Ru#>9"$0#.peDy#[C8L)~eMJ@[%0O$ep;':k} S7Sh3QP`cٝy/-}|$>-+!=}W '!+_}1{:82o~iV2 ڡz'JI<!'lGG *]EE}"$L!CRK#%2oA{E \Pꑒ'!9‰; sagܔ'#jW)A<ծ4g""䙭䉜mtŗtm:xn}"2}q[7 BԱHcUE2W8WIC|UFV$0!3d)~+%(W&Tu! Qm!_v;'L.:N}*Fnwv%Ot T&r@6 ^8Z%|'bsXWl:! SU!Wɣi>DDDɳLm{y1[Z3SZ~ syZ`;Ճ"O<Ҭ[Yee>$-oKq^COmhy%Oڡ~.6INoE6,YDDD3sɓ)kZWq iGɒi)y~_m|q'Ahb|g +/Zuw>{"n凧K<x6.]}IU&H{uZqP50)l%)$JtoRKXAMs?#|E0|bY_[3줽HyS3, ߎPˌZLɣi>DDD3Z:f\_4»~s?G$6}i}]U' uώ]YQƮG2o&#y.Lb<)yDDkۥD'c&̻j-e5 R1̗?s%Rhک*yDQL?n/+jY! gλ?ٲUz_+3Ayr8|DܷVlԪ/9a%O"DS䴥7l QT2#)e&%LI*%|&pxB\|Sqjcѡw^~JDu]2Zɣi^J%ϸ8r(yu#"yNr}v݆vǓEUR.5m:_i t7ryoB 6ƉiwymiwۊN|;>-}8 5rHՍj"!3[1\pv霝>GӔuCGK<:.(rvSJ7~B#L(/\5MUvGߞ%)y4%&V? o8}#gwTgI<㣶_DsP-]aӫۇ3A٦oߒl[Ar</ ߗ_}1*=|qGk֖B~&20 7kP=lǗ^nC Ӛ^u+y~cjE÷d %EfL2^B9EfR]{l_DTga@qI*y"gjl[$¦>o2sc/G7bqI$j9ơ[Au8VʉC;ﶻ++ ℾp_|pu'<}46tPjo [VH&z#ٱڏGӔ<֧GDɳ8Ƀ9(| s.l`kmX}土D'z!^h²L-0e!IgWovi]w^fm{Z׽NkdQ;*#jv֙匳孏8bkSΣ3y:"$Ot T&r@ ic{ɑma3]Ɩ7NG1E4<iӬQ֝Lۡ$-oJ*v %OwhYND2ɇ y0XɖO򐓑jx5jr.2U+>A%)yO%gq0}:,˗ñ?_{`Co־OI*yp_:v݆ k {20jdɓΡq[Gi`vS:~d϶ ᤏX5ɓWČȜdIX肶޶ݻc϶G-y}m^\}4FsFV_~%j(mJMSX" y׌-DC\acyb% w۷'bڊcPik8NdCsMi&<ؚq"p,fEpV~x}VTbYJ.te$U ݄#WI Uc r%t$O*>6+!(>[SƉ< y<=%O-7sK<+yD'lI䙯!_[/@TY8ksk+y&jiOͰ|;rB3ĠR"Nɣ-ΖS;%~qo׀B& /RPQ|stxp+LvvL~}8\nY~G*;wQN Cm-n4`UtFğ~gsS9Rڑ=bKŒh/8(fާځRcٱqЪ_ y{yQ(BkgǮ\; 6bK$D[m%[FZQvwHZZg[;|CFeM˚}]'xKv4D<"J&ynnxgYQg^LQ8c)Zu䤀4>pQe<7!f쐉BѬ[V>%)c ؘ!4sVH+^YJ@P>SK/#Qqh3Ĵk0鏼d8fq8׮o0_m/!_fmCgH b; +B>\y^dUfGD~AW;d" O#y*ఒe*RL ljN)7%6uN7Dk"I>1o AYgo޲ud?]{ߘR綻}~ g,6+ ZjMdxմBJt&ZÇ\q59!!.)OJ%%}f~Eƹ~ :?sM)yP1p9hA~/8h7?,pDM:x3!Vpa/Bʨ8sBg.]}Y1wl9䡙u)d$휢MI#q"#_\cƣv¼//bEv4!v B ɓ>mn2ޓv~w&6<#lt ]$ek՜=O㇛lJAqmâU,Lsm(n.O̮Oy4a#+<n3/4%)c\,(ƇGw2&#qCW8ӿ E$ۆ6zƄ)ɓr,vP?m!(>mguVǠp|~sQ:3v#if¨,d2n9_Q:qY1gsS] (k+y~cxsy2+8΢hjK"a'yj҉LOa7|[>IjG|l; =VN.4oHɣiJWDNC. w4r'2leό(/U8?~W>iv" %OE~֋'SG$4PN2I-OD6.r8z3B34}rA%LvQ18xObO+y).]* syZw(yZ=v"j~ikEX 4Z*dMó4%QL#yrsoǵOƩƷϔ  GO+ZW;8J8Q^Ʊ _θ%y2kfV?1xC"%zCH,Y_[3TD=5vˢ-k\z͏>oGӔXUl~=VƳeo~290bFx/t稒$ަ3<i}]d|ޒ.O~׭CR"Nյñ?sPdR]卟p,N ܮ˼)WgN~_YqJzH<{7dH7?2Q([{Y5Sɣi""ɀ+i-oa'i(ẙ=Ck~t򂖭-W`ǣ7د nfb8B_Qa4M#"9)$OV,s3ΘkellxmiYyѪv>Nu/%b[芼fa fg*mRfr3rRb0xi30SFzƅ_ɣiJ%g[:%KFJ՗_ugu6o^;vsTOSz&KX.APVz}7>ٱP"{yj!d͏>#)\nc>\`/صEH6%)yDD =|CWY[jhE "rJ/O}P=lGG&jVWQLREH6r.R-2CeaNc;Rꑒ'oI*rɳoAu?M/y_9jT!5l+y4Ǚ(yf(yp;۱m$O| B¬t+ųE-⢓Hb?C֡IcUE29w]W(t_U ڊb;3Lp(yL7>0y#󙤓Ðd250< .\I-q<׶W"v8~64g""䙡䉇/4zA]fm(@ԔtpVv 7߷R#G;6՗_J-ɐȁvT‹P1Jǖ>?FQǪkZW$yk2p.T 45p9gd)%|'bsب)l4Vl޲573Gɣi>DDD3[Ƀ*ضϼJG)4.w[v}j\Ju}C߳cW*aIHf}nUz(#iy˝r sΊ|HT/G2B&Q(IOdC)@jo%9٨`wsfbQ|إ/KaMRh3%ψHfЧ_:v݆ k%σ5lIƻ~9NphJ;y^ɓr5 {h*Jm5'[mvTEၷd$Oڡ@Tʇd!zvUAp^0h<b)yyյծ4g""䙭+֬8%yHq>ܾmd8% >R4ӿz+_0Y`Wo!c8l do) u]=|̤#/UmȥqKsN<^=IU&yC8D}l'{UϝP50)gQ'yLR"oR⣽F́mLDD^:ȩdl$O*P'o-'Kȓ'ykۏ s?; y9.?K "lᠤ~&"ϫ/A <|5Jqdb8 3_%H9/@H,<5ֆGk%Äӎ! ȷAn)v݆&GӔ<"""xp éf\_4yUtFڞ'!O=KOtM{2eI'GkCH-<^C؟9(2j϶]cݳcW6g?I'.iq]ϼ],c;IPH.Z+(8Asr 9l@Z;_!憃!'(%)yDDDN(?{ ub'*5k۾koy)WV8jHq & yLtJFߝVGӔ<""ƞx~l'_-\*)Wg.ɳ~&B-:D6X.ʹ'&d͏>Ǟ{eV"e3QhGDDtkhɻ6;w}Y!-6uNݷy3ɃQ93նm#8*y4MS򈈈GӔ<%)""æiJMa4%)yDDDt4+ MS򈈈G4M#""JMSh%)y4MSλgӴS6o٪4%(y4M#""""JMS򈈈(y4MS򈈈(y4M#""""JMS򈈈GӔ<""""4%(y4M#"""4M#"""4M#"""4%(y4M#""""JMS򈈈GӔ<""""4%G4%GӔ<""""4%(y4M#""""JMS򈈈yMdl!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""wzUwbPKEb b +#D%_(j ":AP&3hTg,2hЂC -E^5qNN99\}}ZkX o8 hg̶!Zі " gOVG " $Q"[gR]IіK؈X" Xb6 "!D "X!"",C$ZR!Y"byD+< I3D,<,AD,<,$J<zd^싁_,஺ Լ 7ݚ[gX˓^}CXT$&%V%+Nު< v{,҅u~/eS\P>%O~?CV1Xmc-O=;>.{pmSyv4ڱmJ':!bp-ώwwy~ 7ԋn,CD,`Xַ3P}g_q†fCX.g};/]w*%yŃYCX.?n[gհ3wl9giy|p<_豓oGyğ/<YwkthCoxb96./:FY3_o9uje׵~lyc/_ST|_WlNBRos$d;WoڜM9IQr['gr) u/ ._|j2"_* ^~2z/fa-˳O; #^j7Rm&?n$̦[B::^5To}>lp$v]SV.xF-OTqRXFA,7,f>j:T#"+eyotV@&-WYru.{HD }T)pOz,hP2[Ց%)u,Kx'N~P< }wݑ I6|1L<]"GXXgyedyB}~ԭD$%ذqSe :fo鳠Jnv/qEK<|6w5I53%$y&mQ`f TjGQݲc?:՗͑dۺ4s.t,OHOؖ}O0:a4HXs`1CTȷSֵeV̧٬'4֏B8yݏZ #OQOɻThտ4Gx'J%˳P16+-H+_9Xo]X=-S[w-i{vj锇TneCf_$z4K>s4f5j9zt]W&34mi,w7XE}r~pk1du-Oە2/7$Ifn䳭?aiJu#]<+f@diqZ;]7SteŮT9l0_sQ)X˓4&_S{ڻvG"F;/əxg}!Yb=v;Y3hyʮ^{ rNjXS[NdSu1d׬XFڐkuEUuŦ]ijy,;eyN3S/Ns=%kJTo,Iɩ߽'W}X[f*/Wx u;bOY[S}5vvِ5LEΈɋo['AVi'3z&`童(RjbzۘwVuMx[5K[ ]oɋvʒdfT;%3Q+,r [N{X?MvgZ3W=/sM"Yn])EK,Ϥ>H.pYoZ}{s,_˓ڠH%EOVaR~dIRAQ>`vl?,%)h/,`Z}ʶ\Fk[l%Yu9hիS>"=byHE6zSBY}y,`܃)g'µoMRe.pU/>:Q,}V3$ד:du7R"YoԵw, {絷K.@x}'iJiǘnpU ^s[o 3 "ؙ&Ǚgb6h!͑dihO9{YuNkSS[&|< 'Yzur{?wL{=qSU+*3?}W,ZFAf-Vjͦ)5CLNoɤG5Π+ZXvnFv<$VEA?Ts"Rs6'4߷g_j?>}iuXqn]JS/w=?Vw4~S:btR<NLS9RZ-N꺺LUqY-+'=;]-$Smidn>0Ub()MĖgɔj?Iͤx~SUZ--&YIE VZs׬>˳RzUj94:Kiyby6|Ńq+IlG}H /ZEOu onu>+o Vm.Ri^4ivM}m-O|>cT:3?%%Ys<AJq%UI1{~JnR>^OOml@Դ85An5[ayX"*Y_ y왧^<~u=+o~xw=WWu[豓J[ʒl(h嵷ދ]Zl~uŔ X"HAcd~ߴ>5k]% "Zz=uf$`yJ7t.zZg};Y"܆pnX"Xw@3$lD,h@F(D$Z$J<H%XC`yX"ѪH؈X" !HH%XC$AD,!D "]jc?.+1bw|߉^>t$'ܽg xe#$pݍ|?`nVqJ87+~8)'7O<F {^gwd~4CV1(\Y.Ix-zC>}w;o.+c1.1-O|kw:ݑdyX"*gg_ x,Y8jybLn+o?zg؞^u'c;]xڧ^2eiޭ{I,C$ZŠ|pޝ+W }[G}իf஼~Б2/Ys;1qugMnV˳3byX"*¬S3ͯ>9WʬLhR6vf#9)-O|z|w+ͷyEk^g_jM^Mygcdml'&#,<;05pӭyuf[L[^Zy ~gx/#sRc/_\^g_dh׾Nی~TmJK o}(gyժl?;j})kFufH;95(x?PtUM)[5ccxWw٫G@}N^1ɤpD I-|b0fpCg n,<,Oy-PAӴ% i 7]~hZ#/[^wOx0ZjwLc-OR\gޞ +7]yRˀ۩;y+2eayrso پë~v$iKf/RYJWm*kG})8l6n:3u`V8 Va4"],DZ ,bkHlW&z ୔d7UE:;-ZIey$- Yn6ƬTڋy_!/'MϷ: Uͷݙ#߽㔌rAO~4blCG&rC|Ń*?ΏRBM2z1uK%?}|*)/zeScG~cy)ז`<{{פ߻=yiRShp1;Uټ%Ķgj~XdۍZާ%5o`AL>)֙m}/1_}ŧoy+vUU$KՄ xeT~… ,XA1y2f{¥K%ny_)<[MMmB[I&IKtK2PIh"sY)s$yNL|Vm9sv)劬cmuN˽WyycǶ1^|I?|ٓ4Ѓ&H oqkG&f.ԲT1zyC͎.<9jp'+ǟ/5^yh#A챙E<7cdx[<^,OWu_K T)ebyR@U2L)mrŻSqed2g/ Ĩ}Rg:jVFW^&ݰcdyڪ;EB/\yux L\#Mշ2(+}b`ިnմ$P5JI7tk]dyZ~k H]7}$6run>uݍ\~CfM>ҾNsW֧RkTmظu--w\lVUl35[c֪T}uӵxčGG2My~IK |*{˳,O*,Xjrgy1< )]ibZ'V'*J^O=/ D~A VFϫ&_4JLƥbV ?Ub8y[ꉶNR.:=3LM:uQּNS\N Qvڣ,SW]%Kz~֊x xuM-dkSn-CR.5)gE߷-u -]b;f#$Gq%jT4:rcQnց0S{ &.hyN2x+_'KY]j'\(봄6lZNK͒6[7Y߻twl ,ϲ 1y]*փ~ћ;O<|V˓R4iLFnO k*JNĖ'ta~ /}M߽_m'uoj ^5[1VVۥ>l5<}wxSzRJgycd'?[@VgAZQ@[ZPM#Voa&<94[ք~28qdmꢐ?;ž_XS`?p__Wھ:5KkZZ=glv:Ür9F?[O9I^,J<'WB'jS0,e=ւ7% f Hd_k/$z;u%hT7F% S)W0ɬ߽tI$V㱾)=9K VSJWM)[E24~Gj麰6GSҴ ՚T9JbSCR')iCKpRQ%S+lyo[ fyh7TtSF?^IP}R}UIlIKQԪYFT |CY?w$gyr*f?m]kz:/ 1.vڻrnˤ4HXgyZ7X^# .$u%fS!$km\8 D' FKIAl؛PPҜ/_Qќ o/[U O3si>Fۅv^Cgi9N'0)u)'mZ n')@gyc]o>&K=?no 3TѧrKfu(dBvoo9cxh#"ꙚAˇs"ا۵57nf?Tɵh˓QOjߺ<=zwL}:Sv=iQK+/ZagW-aԃ_[<,rXU(F?o7DXua.pxkkiʹyl'HV0xYz*$婻gs-O j+f15nJ{|U7LպSOAaWb\=:'_3{i,N_QjNZ|<7G {vXn9o ߌ塳\YGA)?I YRk֮ټeԪԳ<߳<ؒ CpLa=6\JlV[dkUs!byDR.AyБ؍~IN$IjrϚg l}5t?O1g~WGNԒǟ;pY}ǵ0j?{,C$ZŠh {G>8-??gy^_ omwcOd9w͚?<76Z!byDdy̥,1-]ο'?n*]j+zd^싁9䆍]~w'o[еo~m/Wg7u,CD,`7qB^V<3^v/_r=<\=^>t=_G/!"ZWḿx;:+lظmjcM}MgZnW,w9^ОGjP?uYBw?}+'odFM>,;i(.2^<&$_fe=z~X:Wml?;F.J ?hǶ|'?ݛղͼxy=˓3_q<9j}6__~뷎΀ 7YM6uQqշooU*5z~֯29a}ٗR]~efM- ʿ)~0u{w^Sl9_g-˳{.hm02'Rholدt4vZp5 M/Xe&^} Kk-Y}<[Jlģ`ܽ9˓Ǔ|۝$#:𱁵OKr MWu,Urb_9NRv,be:櫵/ru-O;cI(63_ŵhv {eJ˳, OŸKRͱ@=nIʗby_ItZ8J ?2Kc,w_@,El<9 Ҙ歔zv8 F3eay38{_9JnpX]pCg-$=v2Ms>-[WG}0xpW<^5ۓg_Ja4Zk ܩeyv9!\FfVzi5Ow;Y3hyR8SKs;P{-W򔛞hC`0E$}t ;7tk?Z;E<&]`yjR}SZ<)dzL,e-YLtdpglSV߁["k/u˗ݽl6;3Lb 秜~g%YTC[ z[”;85`cz0qzK? ڋ/I|Aڏ4zBdOR!N$Qum}<1XӌҺA^}bUE6bƥisƫ5nyFa5|7,g-Omkw+{.ݍJ[ۏW0hbjX,L۵1˓6 ,mG{+Pf\FNkjʦV3b|~ R<ߢf|nrj9:Koyd^aM.I1oMN, JW47XoSa5-+^ L&=%4j.2d>봴^IcoB%?9_ _$9(۷)9Ug*-O]=1OMMc8w'gfvo07Y<K}N6ΨRhON%i:mr?h-ju.ޠmƬ e 84'=:572B6;05DHsLqJ{3 GL7;;ɩtwU,ϒ)اRdcկ4YuR :UU+oW09mV'WMuZڷ%?@SXs6<===f?(;}qJeSu<瞧#t|$6(mL6ԋ2)h`G .YhyOVi|pիS6njOٗrGlK>Ux[ׅW6t55ɉ?-[7y{4Y,l\"Zh~Jb3"Yh|>ǬO/PwLRc)) TVql'uԩ^ƗA\,OLe{jzv)lN;q,Yd[Ox.RZ$soV婋 uɴu]^<RcYOi)mCWwϬ׮\ <vJSlzۯm~{hi=q_w=#];k+jb閧f-韸;eyFm?Im!b'8,Om[ Y^9W|h^4No&OY"H",C$Z,DV`y6D "XH "XH%X`yX"X> stream x-l+ 00000000000) `tUQJ֕UDUTYUt^զn+[X>Y{|Nfe?=_R DӢ0?Ew\<5<9U2VQ}}e_OT_|I-q_ Rm Rz+ ­[ Rub/h>=jECk\vXjf%SџD6EKd!=NG~|lEJ]6s4X0`S\?q. yq@ښYXͯUTphd; ɚHdSDO{_C wTE$(p)fd}rRhUUF{ 'e[$j,((M^HvLU:Ĭx)5?lTA wuz96{9.DTq+ױ2Ril3+O.]/mIݢAǎ.R3 NJ>zvgU RӠxK@L~ sVM M`$"FV! ӓ%Y2|Hzen=L'\>;=&5ׯν gTb3j]gۓ}1#ϯLؤ7E{/` 7V629|7+LW0j/ɮ`a_ 51+[7{dƒ2<R譥R?P{SᆔqmOgfKpW!<{tc/yj8X (ZA#>VSp^ +ѳ3q59?P>)M֍@xeibFb[Ü;OS+pI엃. s箦N-$LGY[ U7H MʻyK>ΏNMדR5*vŻ3o$*iL!.a&yJ-:vOhեl@ }l: umWJӽiPU\@􅧖߼nM?P[鏥c9M5?g\=2Op 6&G vAOx:ZѶ%!߳dk;~KtӼxxw49" $ _S?P5yz㇗| 22z&><f$(G>Qf^LHx^=ղ|̮SyskT񷚵EGםJy^= ÃEqFM_a ̙st/1cGv(Sޖ?U7x>L^q *8,W9[qJnӌT#y2A$f~z1x 'Xl䶦;w^]S,STj)qVX-K5NEs& pPw~;Toso~fwb_%(h<^[v ſ^ ] tm-Ai^ N%hE%Ǡ,*(jGF/r$w\ cJלkGhOD?p7׎XPJ-mƲ=ӠL)T5_5[1(9OPZ,Arn*v\wFEo^UǠTErσrl'Cs^;v5cPj=im}Kڵ OAo]+UR|o2-ݔqa+{O;emJ{[N6$JΗe'*I Jw䳠_%9(m9y Jp6rf$kOA>fpϘ\ߠ J9z5e?lA)ILփ+c;*ɰݾ:qURrr(ͰY>ʥyFmj>6yve~2<ʑk1 yɓ 'UPNL͝зX?m(E e$N3e=Ó΂g;9vM=/nfsd)E{`%z*ސp"s^:{z|4'|.Ah觹/C#SK;}pRD8p̟\wazʩTpsnބ)[*/9G-9BPEMv& $+Ej Tx\.x|G=~# ( ( (A!(A!(A!(A!( A A A@P @P @P @P BPBPBP8U"XwOH%([[> AA!(BP@P AA!(BP  Aa`_GP AI k/+,:A2Aa*BP@P AA!( (BP  A!( (,LBP  A!( (BP@P AA!(僩BP֛@Pl}_( A!( m A!(BP AA!(BP Aa`*BP@P A!(BP A!( (8ecT>A|Po/GAa*Y8ET>E*[[޳5^z4^SyrVņK#d1a*A׾v'7?$xQx>=f?+-]n2nղ3އ}(LP_2+)f_?gS6\n)T>/Aȹqg|gk}'~3e%(Lc#(9i8y׾6BP']A!(XMFBPoSb'? A!(:|{BP AI? A!(łEP A!( A!(;9Ubáܥ A3K}ʾ_Tu`uo6()BPb=0DhBP`ÒA!(89Tذ))BP җ5EP A Vذ0%BP 8s A!(xXђ}EP A g A!(!Grq+BP Ad?_A5UBPVPy:A!(s,Q9)犠+BP Ar A!(V6 A!(•CP A A!(a A!(x=9SXKd+Ne'2ץJPHlt:me#22n~g]=!;gӗ"S (V C (v\C (V@wb2BP`EAF)@P ؓC (v2C (Vd0BP`ž3BP`k A-^hLP m0BPOԉǏ`lcEm1l`:d-l[8޹-E޹-Wkne!bw`˶2v\:C`E+jrђM2V5C`ǩl3V8#)0V,K!! Rb=C`o/e?憷` o5#[xGllX›?fC #KR#Y` X`[<ATkx--8Z E-+Gu<K6!(!(d}x A%WA!(- X ;5A!(d[Z ё5@P (a #9d g LX*7 ixI(-i2BP`ǝcrMC*A!(WnLir=կg}BPKBP`ŎѕBP X+Z)BP l(8CP Ar A!(!cۍx S!(Q@P Ajd_O6UfY_sTo~)/?/s/|%Aa* ֤[c!(%~ABPLtU:BPL#ber A!(DBP-w A!(D3CoDP AIlPJBP|BPLBNA!(ؘ bcRbcM $($9(+2BPdLoj6A9A!(џ،J3 BP?1 ʲ?̘G A!(I J#犠BP,8\b BP>LOBP>fBPJiO A!( ۗ"(߸]_BP>}JW{"(޸™H9>~~lXt^=R'JDPN|fT<kg (LY}P$T|"GAa* ʗjO?{?2-k׼EY37Mq̟eL%ҳ`pu5\[gצ-'qD^G=7MqVz6Y>fk,22އ79ʿ2wC?Ŭp'7";8SQLAY%<^-6(W+z|٬s{+v,,#}b_9伖9iebJP>1bU;7nC!(غqcA!(ލ=e A!(nLBP AIVPLQ3b97rBP!A!(عqKlBPJj2.BPw,BPܸTWۿӧ(u,4A!(1m~,ݑKBPX Wyc#(6~cA!(/ A!(q$A!(̰(|p"(;EZBP Abu(2A!(9Z A!(223^EC}`u/GPo/4(vKAa*'"AW'EnEKAa* vY%(1IJk9\5=kZ_pIxN>L[>LXH-f0 -K0׻|z#(1+-=iO/3a*o_o|MPcvP*P^:S|yAchz<||>b~ g\ Sy{Pšp(,q ׫*Sy5!(P%(oA!(,:BP  A!(BP AA!(BP Aa!(BP@P A!(BPf`U2@PJVfi BP A!( (BP AA!(T A!(BP@P A!(BPe޼ʢCP E65,: FU|0BP  A!( (BP@P AAa`*DI=G.T묷 A ( ( (A!(A!(A!(A!( A AAxHGxxe$iۛxJOnʸܓ]&̯//ɓRU_d'?RSMg0qgA9QJԂ[ȹYKEf̭mjR:( 63a+鲻z^)u.rß(%K/DZ.| r|,'E̞q R8c&1 wv拳Ԇ8n ͟}pm"~QWaך9g@VV,z/24n_6k;*ɮuoE#[s醈9h6~vhɋ?V~ [J&4"۝i1 h=AooY֫ ߾*CR['lPswV/uW'3:!z|\4kqT<_荙QenER[oF u&0( CVso1•;vl2+wqȪRlIHSmЉgyJ*56,`rԚ1\95;a՛ܖkv݆k-*8NJ7=IOaV SsJ54 `OJN4#8 ԓQxRJqt5׉J]o+qx &iElLP:p VTFk3z Yї5?7?_y po &]`'hV&%ෙVR)@LOj϶U, u9tmlDŽς"L< / 6e`'@t~^`rUG;鲬w'jzfk=<#UaYK j ~s ;YX\0T<]N~[_/!ygvmbP*\7Be-Xr?p >.W4N¡,fU8\3bz 2Pw*Zřˠd-rTTW_ۗ~@+{Ф4Û?wJ^&jӡ\%zso8ۡfoJ܄rO{Ͼ&y JAؒqWAO)(JUd- ʰ$5(vaQC۷ٗA9i7<^p8DӾ/ nt~AL_1KU^,m|kȕa ˢr=t|2 JVo HS?rWr-RHhP8fLϬKŁʢN3}MGjR}J//ߋ^P~OuOG澜%w#r;Q5nq{r1im-ASI,X2^W àE* [~/A9`z^CPjHsm5nqrͣl#Z5S[.Z?9Q[&"|b/RG})9{Ԕ3uoBe uV;zs\==]<]<cP=soy X:G JKFSMi7AQcSs&Noۇޕu9 ˊ vN?dNcP\|NY7}r+m9y J4-YK)(Qit3mn7L솷XM9(emH=June=z-'AxW26Prσrb 6t | e s c`ӭspoy:̎ྊ@P > d\V?؇lg{6؇RK>}(믃Pucz#E[]9A-e<Ul_< 7E]ͰNЛgf,$El_zAɚMP](N'iU6Z2ۊpg(ze:u)ô:C;'#YU&9_47A< ],sÁϘZP:SP2O}OPvuG;Xj >WGeC5O#.(%ru͆ž{ .|茶#m'FaP; B:? J^TVQ*],mg^=SɑQ_'`N~+Yo[{J-͒C;8;%/>)ۜ6pFyiα9﫧XLg7vP߰Ssss|)8 &Qr[ۖZ"^d˹%]yJ̺n:bb=kykyi-wza[^s6}-O97?UY Wsz>ܜG6gV|3m-|t-.j^2  * ZK Sl4T&\Ԙ&bT  A!( (BP@P AA!(łBP@P A׫u]İ"5¢CP $~,BP A!(BP A!( (bT A!(BP  A!(BP@PX, A!(|l ; gwywBP A!(BP@P A!BP A!(BP A!(¢CP AԽAy%S!(w'"Ay5DO]+^V Y'w*6"r"(/g੼7(?M!(1W-kwK{ք"}/EwIT5J9/yYLʧD\92/;=y*Ac[|hrw4Yml!v5ˍ>}(YOH6A~;e冣+(`0 A!(%q+(mEP Auxa JuW0d_f῱(_mT/CݵjBP?BP AQ!BP AQ/BP^Xz6BP AY A!(ӕuEP A!(6#WBPl 5? A!(Pd_BP>EP A!(6JUBPlS<De[ bc A!(P A!(POTU AIf$7(0 AI4(K# A!(eOBPۗ<r&( ؗ"(߾žFBP_W˨ A!(/#"(O߾XrBP>}V{"iԽAy%S!(?Tg-ҩ^qcum۷EuG0(euriSۗ]="w[_}7S|0(?M!(?OޮwiYڍW"}/EYc"= Ò| ʧϣ_'oޱrv[ϮK|/&4%{=YmKT5;_0$CqʻCDvZVq݇<0Cӗ*1GyV.|x%\n8T>?լtJ` Q&vAٚ> SrV:S6s`#nA{ۛAzD)BP Ar6} A!(sG2P A!(vn_'A!(X}[7 A!(KD A!(sE A!(BP>OFKb]H?OP A!(Vn_+4A!(X}őgV*R'(%Y{/EBP;tPKKBPf嘠BP uBP u_z)BP A2TO A!(PW/BP!(+C]Y;f A!(P;['BPUBP !Wbg١,BPz!(D_{ e5R7ʢCP2;yމЍ]g!(%*J,OP Am;((bVQ A!(BPU.A!(VQV A!(!(*+z A!(0IP A A!()͈_z*S0S%sQ/0Le/\C`NJ SL]kFīC`GNnbȍ%q* ep%-rؑS`Q_s 622v\C`ZA 2 "wԬɸHP^-ʻ&W (P vY%(i;wMNMBP"ͩ!fg_f_;EASJ- ӓ=kZoK;$|*~@PbpF__0O#AǶOݨ[CiyOߪeXC`* fEP,NYXp؇T>O_2+ GyG򧯚A|PT>4A|P8SMBP A!(BP AA!(BP A!(BP A!(BP AA!(|3KdM (%Aa`*BP@P AA!(%BP@P AA!(łBP AA!(BP  A!( ( yMEbmjYt AA6 Aa`*BP@P  Xt AA!( BP@P AAԓXT&Ku2 U endstream endobj 160 0 obj << /Length 1965 /Filter /FlateDecode >> stream xYKs6Wp| M I<¦I?dfd"Wpngvm`",G9[H9%d6z]F بZ e'[tgh`>iN=kYx6 H~o]ɫrǗ3kO0\.7gd YWy$DjCXQv.7,(תr[@f$dx7xoQiXVjTmtY&6w)^ Sɋn( ;_%xg{EkNCՈR"7 fݾ ~MF@DziJ+>uZ8G驋zvyt}ĀM0E2$,G8.$,K,~z(CY`BaeVj_1᪱Ws:놉;vf&fY,3GJa '4<U1AQcΛrO26 @ $˸er .iИ4p2HfcaRq %NW_<%u.ʹOp[Eg+ v_2eقY:wyGRq @k #8oFa9 |PVE PƑoD&x=4.d{O2z`\~$_뇤¿]^- A?j;Agϻwݡ@*7ͧ}%!JR7nh%D,"|DBma"t3a?[ʎ1*S}<4)V,!w-Fk &f֓ M" ;"q5{,3"!pf/$=PVb-&!4jmԻݦ,J ߻5hڿ{ T'cĂ?C_?$+ =>Εtt'R/\k&]a:%bP#7A.`fz/FWΕ0 kA>|HԳq~`8Hq m P 3 /P&tRd%d?\hKmܶSyxei&a-ղUVmn6OP6#t{j1lv0޸&;'~Ǘ}Wy%=N:Qj&l ƽ:`,.,5.>2}z@fSn­}'Uv8Geiۦ/u"65F/(']M_aI [idp>ry$Vؾ7j txߴ'=NRQ$&v{f֋{R6x|y㯯(G'4v\Tﴫz-e^dX:ӵsAv|Hl F8 )[dO  滝Z=0yaT WDUbOUnTX=R W$1%eSvr[t~U稹RL ]ڋT嫺(HD>ug،QT@$[iD2Sw1 =BbW .4Z{J5>+,_?b뢅Ā)!~a|3! q~G!ovxSl| Ё`9a?e ioX< endstream endobj 166 0 obj << /Length 2438 /Filter /FlateDecode >> stream xZKsW0>Q Ɠ$\qn6#A2+%){&t Eʲgǖ{1`["GM\Wk$ ,yfT,Ë64& ޏ M.^,{b""e-5npߊPxɯ4n>d͝MA`1b4j'Dk”/9?asc.G,\ev<-M.[VQ]֍Ѽ8 uMe6fr.SYȵudߨ8SRdeb#ߧ#U~"DƤ + Tw;InfWf]um *L\Z|nO],KSx]$n~% `}b!%[tfPcJP¸Gʼ'pAX"٣I$ RE@g@MBDx ]|Jy;00"\ "ܝq#Ƭ\n]B M1d࿛m0BZ-0TR 05D9?P,^ YD1P f55X*pU\}ZmKJ5]=q`U㖃DJmTIsb :#*b"Y!5wgNd'a.l@C1gbĴmŸ8RrE%ͧ l߿;2s䵇?N( @/Ї)+<ʬ:=>?_\ͤӻsnvz Σ5QSoV:iϫrzh]пOv(!8i]zW375մnp3KсK7Y2ݽw Ox8='\1p?'o~vuw~K$bD.%Z6k/<.!࿻^Pm2H^Sc/w}^ŠY6m^)˼>=8Mt+.BwoG).rpc=, mWM6d}b7vK!:)\>}{vh7w(\ԟ= $p²*9ZB6%LՆ]hWzkiSe12f38 ᪕?*"C헻8 V@]9wBջo.P]Cۥ6+ᖰ@ihJ3z!#Cgb;HPGªR_e Av*)C湍r0 YvRE҅mgVg1l=/DΩqCOSǹKVMK7yAIYnITFNº`ƹp[.fZeuiKkapZeWK_*!1$PT9ǚ p".0%.!*aǧ2]lC]5u_6ӪJlT|d9K,+>lv~Ml> t^ b|uψٰ?Cg q1qɾ8l+*b0.j+/>$ Ǿ"mYr@(޺(-(% x,EiԨEAȠVQbCY\|mUFuC{@QZCb;ڼ_G_FزfoNC Ш"54{0(I$2 1.W6PDtI'uӲ|{MdB-f/א0Ig]m kwe6@^i7{?x-oX1Ķ̿13-Vqv0SSm{G򧩭qt$ 0Y5K0)vi%oFல!'fߖ;z+yvCU qYOTlt6߬WU'+]EM~ `4"J k~}n1q-p2 lYjOF0I$ 81|$ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 799 /Length 2163 /Filter /FlateDecode >> stream xZ[o~ׯ˽_mE62iPT I%Ktbआ%ٝo.;Ird$y@JR2ZR^IEZhM:1x2.Nd-&Ci2] uXM燞Z q "CD0DJ pɺה|J/ y`:`I$F X\C2 ^EG7D$>@KIBX3A" e( E2: @A E5A%$Xݠ1(*V0=WH[oa''X:'%ò d#s>" a>e * q3y^3ī9 F3<Ų^H 0* ")T Ke*ųk@ 33`)(0TI`"䄵;/Lx‚X 4߈ NL^Z;c`Ӫd&{{Rz]Q-YSTP'M]],ۧ%_6ӺtԆ~~o.i6.].˖r5o>.B zu1;*X]k\h vu0guX%{AuNUފ=i#+)pA` -Sfc^t0]7Ӣn|䋆.4OѬbS骮7[DuݢHQ5}KV[ẕjY6Ey kJ^\`Vv`V+O+0k J,A컕<O_iԹ(,;fLM'/OnV ՟|1 IG eGEss&7p_Ivf`krjYEG?$qCL|bwzZ.nu^>PvLMC2_`:Eﺵ˲3NY|7v:ؑĎ$v$#IIHRG:NݨЎ5E'׭yCv@6kLK)RD2JHDcFDrLw|`Ǣ|L֮ic>{47/MQ!6pjQWt[dsJ9ZxN[¥}ڞgH`/uF #ѣ Q„y\$B@`@$Ahy YѸ A(,en8#haQYTvZ[dQB6Cyn$bG2JR.x)|2n4X+?`sygZɍAӡ'/:]qcbЀa"';vm* /UҤ ggd{)hZx1:oR 4(Enb?bXdi؋ 4 RɋC%d<] ("pƉ6Zce""/;܋dX-ЉϰaXB>A-x?PCb'*}DyB55#r,AՍ#>ɠ)-XPU+MYᛮo{0GhQ6H6H'lTkFVMK>RFM z$I!{Fx&ed|.$ ' HJ| |z|WaFaç{+xUynU8͟P*F-5l,MUͿBGZ[4c釼^|">0ʮvBt;ұ fTiF4)#1]^Fy o܃h wzh~bx7m85;`j㏶?N4hm< Yg~x 7׿ZGi̧ɢLc(=lղlz3E9豑xH2 v_#EJxۓSqGXx^ߤTp]ٍ]p:Mdgi).}-6?n9ضnCoxNɯգ8Nq4 Ӱ!L[-oV~ o.߉D/< 0^_E#zLWy_f+w>-T~(8+/;~ endstream endobj 173 0 obj << /Length 2902 /Filter /FlateDecode >> stream xkF h0AqUI%o>hZ-I.?gFed@g=m:󫧯xB;J pD9MCi*f ^sgDW^%̪+@`)&SƈSiO >" d(GL)-멦<[|+UEon ^ppD>DZ,Ɖ=:ˆW[840¤u%I +"<-ºh82-E0;XDEDZws'CLn@ ÅV'^޳m!ﳼݢe>6c 2~I2d @2a'$c !꟯^1 N؄ ''9=9€ BHP~3q jkjʈP&e]?yvm\t^<Λm>ԚUC3e %h 4(; _()N%N ?K02&:>f[ SYu7EQ{ 4N$DR'&M%R@1A@IKwS壁 S%"Ԃf46C @8I~SF!QO?$V^&w$ahe@NQ#FJh20on3eOe԰dшcih@p$_" ܒt21D})qs /C=N<Y/r@'Y z6QG8>A9ƀv<#͘t>kd=$p-=fMg1r@4܎&^ OP9ُGߎ>Rcn>ٚXggzSs1mm1mַEbJ ߚm[ ۅ䨿HCu1yAG^$P'l Ob$K@ZeڤD[}CN϶Ma){̢3-:Mulx1Żv o%&̼,6Uz*2`+;,h\O0ًũ߼}0Ee] $F7#.6u7øm^rVaPB4=Rс8j}DЈR SCΩCtTICp}L__bc۠P%ϓx DZ$D1[0epnKxgwWW hҋ $ .C)YSMvy|{-g& 6fնl}o^Q΋w|``opbzEi0$?? \,-Nӹ45~ՓSfuQi== M@'Vk |mcv̓DQljQO[iG%-nՇq_ؑ;w4oiAgT}XΨy}Nn}(^JD21@ I":{&-`3xT倢Y4jfqC!Ig̳M ģ<$nEh?ML%lc*(ꋲAcr^3ĢL훖|CR^Ii8"GBr"Gw:"'zT%BmTb70cZOwvy}]w\;- prTL v?:؝G~n=]fϵ11}A P';&KBAgQDd߿xe؄ܹ+Q`?:,j9ZPSRV pl9w-t^z%Om0*v[G,3! 8ESۭ7 Z ݲ绩Ǫ(W~_fy4_w> npbq|Vժypb|vL/& ,xDu&.3O endstream endobj 179 0 obj << /Length 1387 /Filter /FlateDecode >> stream xXKo6W=hT&i !,;^R֒͡ÇlQv lR93~3Q8E8]p%(TFi$0ҚFSD F*W}ryYT.ף{a$ Z%R 4jxiVEL.\γ"oE Nku5|QKZ;R$H$ʖ=3Ω@$QgaGoO5}2"JG Cz2!K2 E 1O]=xϊe^*O'ہOX)8-MWbf "UEnQR|^y92Zz]PB(ӠX:E`u3 #<.}γ=ǞCd]! .;wHkزG.]QTӖj3vU96g_Q׬bLLhoqu>vH(oo_v#%َg7+8]r(yPG"+ I9f8HCQv|} : "ОVg<+:팂DB2N 0T+O;ׯ*oL][;2*;8c5BAf]vNNtmz<SX$HśDDi{b?$`T2s$O@> s̀4!4[b]Y:23SUT.̋ O"OE8h@%4anHp$ t6%S}JD#[O^lSJ#AMJ%;%ǝР jj?Qe"G&nT1O o֌Vl]ܾ2! Ca)aٔ) (PV)RrY̡ZJ5:&'ڗŸ~=}dK^Ŭ1˽;57o֪P1"277y#En_}B1ߘGmٲ ӈj: Nt}qr1hk<|T,敏j{IboX>wɯ#VY7}cތ}w~hp. o#~fuU{3&(r&F+Z!s0wڵ. )M@20.3ɤ]Sg}Ғȫ)Djм3ɖلˠӬ^ܹč}uC";wz"%:4<LJ 5$ez{OwǾ UkWlq#鑣;a[[i$>o~GAd з%rɴ~h~XT@n8%Eh@{ӒK͖H endstream endobj 184 0 obj << /Length 2013 /Filter /FlateDecode >> stream xZmo6_!A,EݢhVR*{qEvEj8yyfd]g<{wfy+mv~ΜY%Be"黉y;_m&SYo'翞qƽ2p \ ˋ"Gbk!3[ WMgE:K@vL@;AGs =+>kh:~^jp~0"䥩҆++krT^Wk׷iYn4ɇVqUKɦK 4^}Tz"r |q?q:g_tESBL`J;쁧3!ko>׮";7N]O߾OqAV&1lJŤ0 a=8tLc0*NyH;(PrC"4"yA0 ;b4E^uṎGN7U9Ty}W5}zM=L`xǧPcNr(;iMyKZuUư5(},B~fgaQ@ nx?!#.?M@E7_GcRK"f5پrp}%CyrտyP4$=L)8`Kc Hc))z,!c;2"!ڹL_ƤF I訂 @G W f1!u$#FhG8q]چjHŇAl_CӋ qyIv̅Nme5SZ!s8MY !a\)4.Z=W=oCYoH۲+jqe}[%6]L1p e֊nO*IMqƾ hT͠i D[%)j'w Mˀ (Wⅰ2č!j&)8L]hTlCW珑%UcPpk&m24 0IOJ"`[RbtӞ1uNnm mP^W]ur"w&AWi^vwJ@"8͟;]htjW:'8+ΉMI$p> stream xXmo6_!2u}{V 'Vip)ڻuwh#{h e6OO]?gfitaDJ-v0."̙L08gOu>3e8Ey "AҎ3?N MyشL2!HXΈ5%1VgŽ(űuBWMߖCw XyN4UK`jh) Cp4qG8 P;Ϥq>=uHU)9DDr 3lOėb A ^r*ِp+꺬~rf{(Ya!z!9$KL +ƀ}S=TIfib;,h.}@zaj܊o[yMBKI\/JQUXx9-7+V?rja%=K&FPetJĭ!df^g.ч@QOolܦ|[fmbǗ JL2#NMZw(k!Sr6]Sn(͛ *__B6@Ck!=\,3ѰcېThi㛱'p_n endstream endobj 194 0 obj << /Length 2447 /Filter /FlateDecode >> stream x]~j,E.چ$H/1p4'H1ǒy:=}vvv93;_8Xq: (Kd\\&Ae$ .U53bWt뺚ejîYř2#B&q pe%rM2&%7źt- ?i~3l@Ib ZHd |&@r\<`F%(S(D'~g2' }=UQ?&njxBcyD~Jb,kN&êT e&$TV%;(mr5ܡL`S-pʵ[U]>a8FID a.ypK]f x:yg6R3WM S.ՒΥ k9q!7] = h.Azc^3KwCwC;pCFWG4#K?B$MpW]S޵1)^4stNLi$S&0$ô5ꏹaһ?Ϲm<}  `!8`G3m'wc9t6&7D{-;8_=??ã_I>2 JgF, c7(U#AewLG-XH57JFJd -]XY=&Ib`G9 H(P̆kjp7Êx^)l2&JRۮ9N,T&i!NM&`jt2 ǩ"lR) ޗTR` Rlt+n!,E bsWxxw5mؽ!qmܵ?U"78p`o'PGsLl{C,J'e$:-)C)7 8(n(s,epA`,v]]׿`o1% e8 loCFQܗHIFPԛ*ǺFBOI< ʖӍg+8,ծdI[*w(3!hW̹Ў9D My,4.xUB#!Xh´`=BM4rJ>&šTJ Z(0T}:k`Ug3 d ̧)G Q ovr sC4@S%:eS$(R{ ̳XowSB 6ioGkC#`>4.,w%n|?Xo!^ s}& +rC1#}l᜛-(\A`t緾A:0 3j0` #1٭o(l-ȵ@ٕݚbb,g)nqGmwJ" sԓG=ߺ*}Xv9[?ӏ>0TOԻ씇+rhl"/S[#ׂ|zEo `A{ˆ,х@)cĚp]\"\ h/ hMhJ?L=k%ϊ؁u<=g' x`CVy8ª‘>##"ݓ۬X%3\,0 :\Ӈ # {{JT":D6) MID`Hr 8k endstream endobj 199 0 obj << /Length 2548 /Filter /FlateDecode >> stream x]o8=Bp2"ERRp=k;tw{CUmV\IN g$KiC"rHpšCoޛ'^+Aj/=I"X@;_x˶ЯyWd*oA*!0СNb&c w x@5A l{cj_moWyxhUO> ziĩ7_ \I4T >]N8Hu(QFi(hTdjB^_߿s\nKwV:\g]@M:>LP~ˊ[frrD'a8w֙/ͳRtehγLL_[T_7fKۼ͛yVUZj8Tz+Uk[dGD&>XeW*+ZD2veGBc^u$oBVHSMEk˰M4EgeQ_r6g[ %@ض%d B1RR/SwBؖ j$:(nT;+9%in-IU]h%v֥Yl6_qT&_mrF 4"^]:[eRdZTQ&IتMyK/{ 56qTӫL8 !OlM.m=u'+%ʤiP'TjlK=^9vnofD&OWWF v%dmCl;+q8g6RvÖvk$H5ZuG(eO].Uz`zxB2NZd8(LH\:Pwdg!]L}5ڿH00X.RiCD rbe ۹g!t%M7\B`h E͒hȘ$ $cd99O@TícJ $Fs)X\Ip©ǀQ  |Q"1_m0S^z06SBlrKYf2NlaRM CO 7B5sCMBkmmRL2oe7 Aw-5 ܹ=B8%Vp]@q?I!KCovSGfa;m QQMw`)qidH}ɆV$X A;X:,Q93OgtWQn\ UK_HuUwAڮ $Q>:sJnS s.@v媻N[W'j0-aH~" F#by)r6-''ЦQH $c53 u`~#B)p2eZ:GU aus66WHP\}l8@K. h%^*_lOpV.:B~H;"A$ɥIťa ///A?[@ V!/DŽg%G̉ዅA. )f46R7ț t$ yVztɝ q"a=(e!9 ?CT}upم|F=1> stream xڵVKo0ﯰ*ڸ~%+@*]¥hכ&K3mN3{of<ㄠ4N/DV t|d( 3t˼.]Fb]ҩ v~D0Q2DO| ?lE5 K?:΋U:H3]Fbp~Gvz# Ѿ: F]0S"!ah1 7+bHq,@ $7œh۱_hnOVz'fc 6j?G)8ĩ-ihm-ң0h{"?#!:O:CmݙE2,qUݨDqhk #u-['f}8d!\-)f]A͸TN^ԏR 9kXr UZǦ^ijs m9238 !UU_}{[PIBTȀJk5+ӢY_b}ޣ^ {E,Ќ>dl9>Kb|@:[>0x endstream endobj 210 0 obj << /Length 3574 /Filter /FlateDecode >> stream xks6BO#o$mI'mw:3a$慢T],Hk)IY_$ XO.&|NsVp$rkɤP]Sɣ|3ey:q_ξ9;-3MC[Ǔ Iӛ5ށK S^fr^E&aN&"F} ghfpn*Wc^^t!z"`>͞2d8y ̡Fdr{.&Z&4)&oO~DE)mY K+eXR&z^TMZ^xi̹,/١;r#'Səaϖe li8~usD&,RM uLtte`1gdsܾO.@;fp[%@u]|P! &U!^ EQڤѳ1Dud;[`*HԁKƤhM%WIIk&MT@>JJSWPL'^$hǥq$KP TNJELYfh(+EVTH:_dtex]hc&s/.TVLı r oSa2L`B9p|.C]Zu;`.XR׀` ٲS RbS g%Z~k‚:.(좎37|X^$XyVkW3My_='{; W0hF{&N}M0]VavҘu9uL7hupb+=L6Se}-[.>dhccQd b Ê.F>ƴ7\b3.R.a!u3όQ2ktULG2*,2_m 4*^p'/ QB8İe01Ic8'".>'bD??+=7#1" DYG @|ƭF\} u li~[.: dBi}fy~ K`HxH?z[ $Fॽc2 㓰ڌbZ Jߗ`Uˇf* ̈́QoT&UYݾ~ޱcc0M%;;3m4@ro{ks]4`i~'Lf,l$z0Ux`7FY纹-rAg#mP[RF}h$,X}}d ib S " mcBOpH )$btttL]IiwēGV`(Y3"D^o RxzԠRo?:4@( mW YC7o Li񮡵]OrbփR,tj9ۇ*1/<3pC_9RV://+wǰdtFnt{1F2 {ts 3Nn@hr<'XUEZSKϫkSpZR =p7aڗXGvY5Py':D_b~YoZf>XfJ+hq0XE$ N T` *T.\T]ܔEj< 1+E~ wOAF쿥&{{_X]t&p2tYDWHBr}y2)@ퟡ ߷(xFh,ZCa|Y }zGg !4X3Bdj X`@p c.4b{{Hܶ!=Q̅%go~x&, V'f51)+0ν(_L\At :h4#%0mD?d=Zk9EOQOv!~shuTda%uDa=\N0a,Bc&, ϩ匿lC l7{ }^= >e+,W&Z!ޕ~o׋[%H4CÓ'׃[g^bzuoqHH@M))ylSYA5WGWGEڠ Wi_Le( ddI `>B(’( >AuӤTͣt#MQAuŊ']wN`9veoYxT.9b,p} Mk#l_'NF4U? endstream endobj 216 0 obj << /Length 2065 /Filter /FlateDecode >> stream xZmo8_!f\hIŶU9خ, I9Ab[ ER|8^OiozUtpc{մ6$ %*ki45&)ᎦWjVP 'Vi{M$/yӽDShA:HB0h]*+YU>i^c!9` ?Д yV\GC}oK/8m],.X"+5tl`gT8Z!LXot6sƕ,1VNZYE }+z|g>S|%ћNPBi( >gNBa1ϢpEMOo7n(b`)js|u<<|@8A,7pj6pI$ oY2>蝪aH?D͞ϊtx!FٶHLzF$g fŷLYb }voe~ID/u'oH>7򓷩2vH'y5+' i`X\M7+J&/bז-y7!3)n{3bk$dGpNMyb(D(n,]aE!3{=Ey[ͧr~_4elKoҼHϋ,#|MgE5.`Uz+B &++M<p}V+ J=*C chCՊ~V)Iv$z l ~Tgׄ2~qCA$cl[E`)ўX۞(fefiLo`LXb+`mp#EHeS@+ryX=YG wjJ{kk!W|0NYyVMIg3M}rk0b\L F)Q)a\W-0D]0L]3s'^r~{ebR \Ub w z>nz:O鴘FN]Q6V~m7,]y&zMZ,^$[4\fmo4]LnHgl5><\~)kfs9saWH@l cB~0D[FXqlM#.6c"D}=8YAE8l5I-S|!h jƩ M7)s )J>+8KvR& ߙg;Y_"*HHk?!4ؗku4dԩDd \[pH܇hXЂnqUVz0n=whl>zI>DrTPQ4<^<MhọAebRA6|UyBhGvԎmG SIE<8$bhv %eL-* Ph+㤄d` ƒ" 5RB:ZkZZkhEǜTPe(& ߅JJrgy]Z (vrV#}2嚳lVlPSx ni\h]n_A P˥FV gUE>.N]hM ӍO`?I^ endstream endobj 221 0 obj << /Length 2109 /Filter /FlateDecode >> stream xZYo6~ϯУ-$N6WmgѢ[:h[$w(m-"^37a'糓+ \XQYb<<%`1OWũI<W̾;PL 9{\$왚\ ކT qAF5+Vy_ZR }M)۝iuJclvO5< <]Sk4;F!{q=#O8qmu@ufO~x @gLI-`bŲRn<" ~ \{$Fw,0KM"(#] H6H6XÂe \E.e$0?A8̘ qvЛaT0+rv4N`@X8wӕSӵ원gcIAMwn?0zFjySĭ-@՛^Ϯ;Á SӶGV6/t@܎ +Ei&ny'd4ՙϾ+"F1=0l\f(.වfaƾzEcr4Hx{F_& 6H?mS82V-Co"[O{M__6ѴEW;f8Ljh&R#1 :{tLߍfO 0@d9Gz4?0|Mz C|d3b𶟢pGg//'WFAΚnFBd t;vt7S|q=dYο6Ke| E k7sdE}|Ǩ.x6z}M`oM y>e۶ W& ax0jySoN .+NgU΢tGu%gQTpS:ei$~&QVZb brP9|8P>!1S۳pODZ eÊIނ)FV{R ޵k%Ƭ{4V9KjMߩyU鈸KV`D*AE f{5+X ȴk_y fiDTdx NB$X~z1q1AN89EWJ`G̭śNb͋*7gyi6H{Ԙ +%p}{7{@QxYb>{R9o!^eZ8ZS@?%ހŰPd=:L> stream x313T0P0P01P06U05TH1*24 Rɹ\N\ f\@q.}O_T.}g E!P E'?{>.WO@.. endstream endobj 244 0 obj << /Length1 1394 /Length2 5976 /Length3 0 /Length 6926 /Filter /FlateDecode >> stream xڍwT6ҡ")/!0CIw4JNC 3#1 ]"-J ")!t|cZ߷f{} /mSa D!q ,@@"@5/[Ok`( 0p0S@{ dAd@(7=0@cyPh GddnPqcP0`9 `7) |_Cˊzyyݱ"(M 0cO8 e!5j^3`ry1pAᆀ‘X=$ LuFh87X7&@"3 `pDF"8oM aQ'J4U`BB14+EQg5k aj(ww8Y:Gp](/ߒ# sZQ!s@[Ғ u eTzEGBp#C{8=)Q@@N$p2a7Hɖ0 o[ i_FUU7WX\ ,& Ҁ[?#:HGg.=φE.o%P_.?2+Ҽ7?uk`",򿡖߻k!U& ҉@iaPDxa8o֛\87~E| Jx` mc +5ȟ2TC E~n} 'H_aMap_ Q8 г?9hH G\= !I8 R@AB\jCUؽ6Ą(q= 9SzAv.;Ku\>\N\ I'hY^-挦R9U>ɋLnha{guY>3ŗO&Hٲ._y/Df^דo?N蟦|`y' G!ϡ.AQe1]pG^F&/DQydN pyi{Ö?Cc =ͤ/\} "iSL:Zte _>3552^ gK_xz:UJ!Ĝ-\3:n)f-fX2-hE/.~^i~YsE}_YN{*ߔGU42!?_7Yx$Qr_^sG?ŷK~ArwDIJF^q;bZq<0n^T8gYPt8`HǓ߾"g1$WCCw4@] wЩxD SoPs B(%#eZgaƏq0%>iSmɋazL!RD]q'vl\\s-Uۖ׹/5dojbBx7ab-^1Ϟi+mQ~I蹓rk} neSe%[[ /N&Ԛ蒼UkEtЉ1ݙմ)?Lxtq>aw["Mv;8cUuxԄKH̐@\_FjiVÇ7b [J0`*:#I1hShd~ˆZ4*[$I$Ivݱ5 LQ%u@f:݌j:]mq0kn I~xtPpzBN UL+j؜W"أ" 9n֣ U}w(#nǵm~םǖ.CfQ;8+X>Qٛ ߷AlLȸwSCma?ʑY(?>08To+slA:ZeZt*u !ḕ)=p! +#aҤ&cV)>W䳱b.)Fvm t紆*NJWT=VsG-y+?^}ufPbR/R.w;#v Jq9 ՞Nɵݽ$#ןAV쩩waQ(`l~5xS'|\X#i,vW\%_ֈ/jZM"o1~ ϔnB}sMטg>_h}}'ҋ`P`CwHyLRz;k$R-P|- n&F}SJZ}'ۓ90O,7U뻼RܝJdȺ/t\(cwnEE0i4ܸ`P%s54da |OӚ?GQQ0K,(kz[ne([Ų{GXWJ*ɽFˎ޽ ӿcqE*zxoȅYQcܵ6۪S?Q_yZ~" L9z 7= U!ΎBs rl3V-A3|)lZA a"2r}#:hyJߋM:Jy{sRPz<=IqMqѥ[watU\׎ȅ]!@IGkGVbf1޶+<+:lrǰ^7pK7c*K2|a9P0*0:,#ls{fJ }W *WL !6]RLL bwqI]9ҫi6жb]pN3 _4,xGVV {BH1Q8= EJnM430UICn5r*9n(w})#|$=׶vUMr`ۼ9?97)N>vYQDw KۼiT]YHJX_Ã&qyٻՅ B"*ts~ naW渄PۼiSl]V_X<E/fT?bo_sR7 Zv+/eF.5G3LJghw:p)m=Fyv;"q ܜ2"ˍ}!(~Xk// j)t=q~.ZՂ%*czk$QneލRd6Mf0ccr}a{@+U#r2|he4z8d3ZN_ةNaVx:)Ɨ^:1<Z1h/o+ߩ _!y evxI V<كAYࠫis-bR &y3趖!- qU+BJvEeht~,GQs0a$33ȧɥŒ|*e+|or7X8\՚,)f7+VN:x7(2{M{0뀅|86+3'aDr5#:Bh5^>Is=l&]?og.XY?FvɹgGt=QRz XӊHVݶ]N[2y[G}-av.70^M/"4}z";G6g ydK/}$zFowٱcKi$wybn+0%Ӕr(wjc: imן`I9֫Զ fV7&rIm=HQU)ǷZҏ^*Q|`lJ;wqSq+V/Z΀ TDEʠXoDuEń'O&П /xMdOc<ܿ)劼/k<ޗ3kx@֙aa8+.[ZHYvzpk-<0+^Gb|d(̀H8=4J uy::GbX&΂ƹz0׆}Q^[TWf0#LnOlg:2 9z:/JhPwLWns)͜+ige DblxĨx'cD'D?&k$vIdDMf<: >D~M7zɈp]! V!G)y-X")\"x>^)V麷Zy$=l2*ӍZI.ӵ 8p`@ߛvkso4SpTFyą ޵ŭ=dSޗد('ѝ U,/=%JఎQOAnYb# >Oq}څ"9f*|+>Ͽ2{ JNJܙaIbոX~5 l 6Pd {W sDZ1ﻶM+AC oxhnaww9 EK0 5| M3 mJMy9 }b %SAKbTR<pin)}7|@?==q91[حZBw;Tcj:)n=#}t-4וFڞκ'M%/9 ]b!˂ ~$ CЭi5VޢՋ4|K&kvpYǺ#xdp:X .{K뷈(g-N:]$zpnY\*)AqM83K#0- #oDY+븃&PୡAle6i^][Ǐ 3RϏf0SI|w2NE 0Řpb=K'lJ?*dˉtd\iV`i;r2i L_U NeHqk ~epVQY'Z4I^r P7#fkMF˾IF8nH{`|`⁀i}k?($$YRJgC0U"8)%^h] <{7t#FKhaE- _7}=U;ybZܘ?ָثӲ)uxDOxٰOևoISшs s-ǹG]3-/錊xnGQr˖E S0Y N+q1ˆO7loyi@Tޖn!BlÀz_S&"S򱇫gjz6{GlXMxvRՋ3(|W\?"1CJA|%=|+?> stream xڍvX7("LABa0CK16 ]" ݝRC ! )ݍH?v]}|cg畷FYAUPH,/O@   X;zc(@!%B cq:%0D! ! HT$&) BKk& Qnh pAb<܁P4F5X8 (_!8X$? ÇBd8y.,@PkϖZ`{@8۠P Na@4PooA|3 H7AA*|XW, aP83a~􇁠X aGap׬VDCX g}J4w7?}D =lHkmX;9"NP5? EńEPG rڀz!l bNP/mh!P2nh+TG?P?'sìQH;F̯/P@^!WPD^FC_5 ^E]pN࿃ipԅ9a/F2+Rqe ?`{NXhpˀojBNmUÂq ( G`TPkMzß g@BuPG K@l-<=F08n61O[סn(F$P_!QX ׳4$ F".B] "`[\΅wONwcA޾\ "lӯiE*A*-Z gF<޺ eRY1Y%㘞eV-^QdO!X֡~~eX˽ۅ*b[ S5K<ޜYu,RϘ_xi̢.|v)#"..[\Y^Izld +UJŻYzԀnغjsƶ<8'DH_` V&֨Ͽ~6 K^ '&zEG2W8n,8L_,qrdzu'wk<-`·3 FWh1O $Ksi.xW2Z@,!.D-Í~q+M v(ڬ fs/f #zE 9_K{8(Pv9aF0|m>mRZ8C+>*oYx`5h*Uxwv1IkesUyb>^7>eԬ 'YV[%dkbI (,缠(I*7#(n` zau.<ʺFyX͘dcSI2H%}{]Th6 &3*oЖrO m]' LbEe+{L:) (.#=YBo~ړRtsBmi#^QJDXD޳'WdИ6SS$ 5dV;g U܋rŘ7hN1)듾g h(&Ad]-W 1J!}=F,PtQ!K_rgIo[Ԫv|ϻCzi -օamF}U玗A}B1TJ[Dso:{"xAR3BM59Qa4/týN_65U^xUVU}Juէ"WWVO!1S) 5-O9kvr'R6L$WigX#V[=I-kp;iizKt6ȑΊG^W{`=~o6B \m! SKp-NJ#sM7M'ԙ4~®}WdY'$}$^=PuH2gO;+>;) _`p3򼛞;h,U Q[8Oݥ6bN# I:Ѯ&i|O*oo!Vu{͚C Bf FS$&Th$Qu {{_~ù [K u'^៪|JUΔizG<&>xw8e0BKخ~rq\۲d*W o7L<[$'675q\А+M`㖶k4ILA1JϦ\缜:]]RrǑqtnG*n\`|Nuφ朧o&Y #n]XI>?մnC _YUt8E a6KfV9 H[bo.Eq%'mSw6\r96q}DW1?Gr9p*[.';] &~#y €2Ia-v'c_01ňa\Fm//Y> VW;vF>k.mX8R:WɘaLL 34gb[HXP/W.ޏ1#lzհ~/b|]WN:~1{ ^qH2KtgNh `*S^Oq${'&i?9"a$q]v@e=Vaо[MQn'N\Me(^ڛl?E{5ls,fVsLȏhp Sak.C '>\|x<$@n׍6>»P}ݣ[#U (NJ94*|w RHzTśJE]pt_]>䩅,R,aTHIb+sts;JK9cf~ 2bv̝Y*}ŵgֵuu:eF꾑ˤT‹g'$; -'pz^AUnh[*υQ'&xLSKNjmG}[U%1?&s#38X.ZkgK'7|͆^9X4cٵ7{sƁ <_έ-`[8|7cC1W{aEjk.!&IKW*[ѣ;ABeŵB;F0GJ 0n;VM<镥M7E 6o*{('OɅԘu}T`%䞪?n܅K밑-*G $u0XO:nyߓ.zFܢC m:jFUAh2g^-yd{^][; >H OO;U|x/bTێE-YiQ/mN]#i؄u gjwᏸkqs1".'qFJ%/T&q11 CmUA2 |Y?V'p,y,Xl3O+<M7uwZH:cY˷ץg#]7ѤO9õL{QiVXXk0UDf"_?:{\O'Hn06AZ*jmܾV "_[%$omЌO$.főyӁbvowp">%F$fxD7Mg=}b>PëE z.SDVݸs|1Pixʞn t"<7;$ͅȈfs^؞No*q)O#E<1ːW]KM,!ӽM:9VH zCՆ\fOMT*^h!x/K/wiCiV=0\TkX>O/c܈5_xv/^apBYfצ^G\E!=Ԋ׆  emi*/B@}%:#kj>+*yЁ1 o>Ǵn1iÅnԫjfv曊HZ9UeڤnoҔ\Gw1VxWhTS.Y;ɩasnؗ#eNdEU5v@ ϱj1Du$7ܳ M9 I* 6^3xre,:R4CVEiPFau0FaJ[&#Y 9ذ M)AZ]$f1/x.ǒW[+UK؇xu o7.P_̶WbVF+I}OFU8~24}-j:S$0(Xrώ% -cy&%WZCY1ν8rKvn̲x!п=HɌz7ӻ㇇' j'y5o53Ж xqq[A|Vn9)h7[l"L>&8wa;f|VMQ*\'وFYP|è7f2s71]NLs[N^Ek&,4P5:af 3.,^rҼ>o7Aow9TsZ CM^F--֒=?ddH'+CE[\.7).6LW}YCz7$}nܭw^*Bxv ~m{^ۭ$4Ggʈv*5\'BʰI&?ɑX/,(fPOsf y,1Kl&segǴ9_dҪ-y o<o0=\=;?or%vM͗ n5N j2/V=h6*>~17(YYxyt :"֙CHFڬaxfSq](AIxx~PH70B(|r+#s3֯a!^W^·̏|kk|3u'L}z^>#+Jힾ~G{.m,Rz4 (^i/0Ng[e- s^InlX&~ӧ9{fԒK;l<Թ~ $/r3.;n1ӳ%~b2Ok2;*%s{:ĩ%JI>;Gf|Ƣ3$Po %E5T/"zJkrs椏+Ciփyu[pf:OH.#5˂U"XO†{?K]b0S1x}%kRճy&֗o@<NiT55<AGf\Z8GC >jJu|d2I u ^pdpЪ+9#1;x٪CYb,JJh|L3`mg:%\ki))@ tyG-|"F52 C`,w̃iE/f:6<sNIN\ZxaZLF'LcF4/. R~`B=HG+jI;Q#* cH4iϮQ axRZ%]WR V{4yZ㑕iIEtTU蛯l4;|lZlq}²+v,'|  t~R@b^r]> stream xmgXSY%6JARP"EzBBPB(RE1Q *HOb6RQp~Ly{}9{ݵm@`P&"m@sKyP(\ $%h$ K#Ih` \!'j Uf̃(@Le/,x1X<M`^A]@wxB{3ph@z0س Yy#JcE184V`^VX x/4ţؽPTkv>Xķ5G4CbO4 } qp=#|՝^X<H"I1Bg @X`QH-) &A{ݽW:  I @lIA`AC! C݇jaP!co>d pF_W{VH,dG>ٽt2#IDl0@n>]cD`SJ*TP] "x׋Θ_e\54:xF@iR3I傿=w TRgvՍzķt99y,R#Ƥ<$R{5x#w?D FnZ;O% \RoKi-^,!~M06ayh^)5;#F%ɘ>35sPцE Di˷xQ y:Dґ5v]9鋽i?8N~dZ?նV0_DWjۂۄK>^/U*K6M(^Dż9[hviPwdh DzEB lyc>,SpTdG`OJ9HezbToVL2\5OG-%e}1XkхTVbk崡`Ox)KS[YchS5`1v1h~Z~ڭ\bnՉM4O)X0jPcG7LSMrt X.;B ].I ZO6\QK+GaO= Huy5>َ5@ikVӮHaKKn.Wh:K>1T\sQ֑kN&/4άQŢ6Gر2 ֋*<5t1\ [M/`vm* >>ڧ##Eb!R9k!b|9) ՑmPJg}ΗZuI;C;ā<54){33tS+YUn:~p`$fy7X^BU'3'- r7<4ΜOG( endstream endobj 250 0 obj << /Length1 1987 /Length2 7002 /Length3 0 /Length 8111 /Filter /FlateDecode >> stream xڍww8mӶ=Qu:{Mt""JB(QKD/E' |~p?wsf9ϙx8DT Hg&T('3'1Ez8!< 3@8> 3dq|`zp fH f~pZ\ ±[] ߝHsp|Nh( ~%pN 7'('; /<_e#WDž, ABI\u$~IPz ~X#8.0K9׋8UvQ n(nXO7(RqJ]q_\(u]q@\ {}Q#0%I(ˉt yqx: [ ?Z W'6!!u :v@ƋA8-Pؿ/O RWA$0 ^\p'oKqR.pzn(qB"/\\Z'#Q%{]8V%kf\&(^N0w١ l{g~8KvE"W%rƠpEۈ[]` O# aR3Uٝ6%%%$N[t޹l':vx+3xǹR U(v7`z|mzM/_5#BקsivFmD+b-W8|Sfo]HŇkKޮ⃿*_D=cS!BN_`u{o\ ?rSg>-Ja$9yil^ Aꔻ2qu;gOi@.-# vNZK6`]џqʃgٍa [ȽZ"|Ճ-s-t{ݚool9<|1սC uR&|폴R4eYSrie)Roi>)!n@q?Ƅ+MzLjr9/OWd:W"fjGH߮[j=KQ(ekh5xyhy+?YP ;/{UMIS0)~ 0|My "z VҠ[\RM'Gt2m7%DT7 J9w3.w^MsW<&\#> 9bWh7̸QҢ^Iq}""ヤtejmiatB7^~mI\{Yk}Ne&ε Hc|E311׏WO, r =/,Lއlz]yk|u%"uHf]9OWMo7UX_knZW'wHF5`Q35S mj>͏ICr Pp"FaeAA?J )gM~ A^mT snZR8R:Vg7WY}zmF* pF1SoH~+ =ޣ]':O(~ rYY|DylRXjٵI-_fK=ѫqr#WE.,ZWͤXo}9b^A5aN%;A"lZDcQ:!#B&aKVpR֖ULǑA lmHB=hBYr*ATr= pJ'2݊dFt(ڷ5\TWjn6?۠ݷL>FXN. 8n8uIɎf[6#5Y$B`料gN..D=_e'RkfF< -!nt)+o0.LJMf-WHLyxV|;!Ƌ#`QAsFb+'~GͻC2CL@!nPqGG RP :+m[Ix܎-V茚b!90id"RE nY<(/GN^w?r3co uߌMO/ r#2͸jY^+q6%*yQ"q!| &ilu{?cj1+k3nլ [^C"o, ;$njؼ҈䴣xr L! Kճ`'sk Z nSW+^k84 ?a[H;QTᖪ ]ߦR]e0I] cٝ{}TGC0 SgUy@@ynگH%?1hǜ(&QopD9z tNWUi҇Za}j+C.cIv0WZe]|1쎅 3{sdߪTxX8<+BGZa1: Kr.Р͐G\?}g 4 u_g; WIXt)5чK1y_{qU98F*h~nCgJ *x1WK*"4x'TvuTٔ2:ur{2ԤTRb>xxV{5N vW?P @SqG.bN,~*|t>hnoT4G5HI2XⰉ)|4bzQ !9ۀ,Q 8\%izx;CRrt k)nM᦬i)nj,)"Z1yB\iw_/3o>d@}t2mrA M:R& >x@z&Kr3exھjrjyKCxYi564˓+?yUPB}+˵Q "ˌ0'tm#|*k}˳ݸ\8>+)>PAcR-1 Ok!,}޴V@ب&?vq \vpf;ieO@396Fx8\ջ+yj4O8춻ϩ˟qS;<Ӧ޴O?N=/}<(~(vFsE쁪K]'d~FD'QUz!/&&xe;1qy+ڜ$U)P1XINR|b֝XcitOl1SAw(#8v~ [N b %[)կee]N޵೼l2 p0nt3akk[N`p4BU4SF9(QHz]NJ<rGmxÅ,v'EOw4̕*Y-eb*Ko c1{d9޵>N^g_GNzV `nL<#mX eXQJxjݚV@̀z8{Uk|Ѣk`623Mpg*7Ia} 0I#SIێ boģ~3I,_$ЩGMZ%}gs ; HZ*{^. hz<^[Wo04(Ki $;ntO%UIQB60q+)sȦ}`VE;ƒg%⾯A{l;33=6w2a,[͝R!FO#t;4JPgF#LvNh#~Zx+XgG_?/^:Z`bݱ>RpGGWu@5N.E!۵$bK€^Vc͵Qf}-'sMе_|G/D? ޲*uD|]{:Tl| ])T5(L%_W&Ҧk}s׊b'5Zkk&:p.AMg ? F,G^qx3SQO1r%4.u w,eizt}  ¦1 ̈*OciA`?ޕ͉FN7 etV8UwVbsS*2yOmOaDvLdthEpAD6ft睔EͲ{`'#g(Y?9L;{͸jD+Fc*?Uc+HVå <5-B T[Yt}5l6j&+0u@*"R&$jE~4,X&r$_ y:kVȶv yjw0 $mHfP-oi[^0q-K@N\I|f=fE1f ?䚠IQ+QKl3!l/s'z\?"4 D>6]UW;!śec ,= ꪎ!mk6ۑǾ*VOONSȂ+^$@^->yR+JiᖾBca+j~T|7AQ3\zϪ9F x{B:NG2[ٽ!5k |Y(MعQqiCkjk]qsBgQ՚5oWt'is)E[+N(C2*i~fiq # 6ܧ-i! 3َ^5R<jm-MxVNLM{dmN[Jw^@%,$ W)2Y)+?3Qs3v}%~vݐ瘭^!X>@ O U>/,eMna gZVӻ0+-4cXKDkUsH18tSPW81ݭC{l6?v> u|"/Ę#̽Yu)6| vK<\bE7i22=/M[|gϹ}G~#;Astv(qEB Q$D͡A_/8't+ۿZ '`9/S:bIbØ 7o%|w͇3w'ψ|*^6/x4,ԚLQԳJ/|߭K.bCbR e!9u-[H ΏSTB;;IV3*<ǖ#"W{O`Ħ6{@BOq4X"6eV۵8#y> stream xmuu\5 !H7H %ݝC )%))%)ҡ(H>} kZ{ϗBMEb8p $@.掮G=`gdeggGt!Rn A;@)psCu]ͭ9;;  tX(ly -ݝw e;m qX* _̀UGo*;S wX*ʀ@j`7 ʿڎ {#H ִl@;G+WK ^`n_@ӿ*)0TiG h {@݇"/ yA{`cuAKNn+ _yylCF6'`|B6'$`dM qM AO ATOS{BP'e|B6'V Au] AA5ڳ `o '7r=B۰xV Ugbكܞy'{O1ǿv '_P^$r88@s' B|6CMA(35I3t'˿۫fvtv~a'l ھp!2"ܺ<'mMyLy?'gv~%uF|9'@ֻK>m6iLytz7g[mi4 V"+JkdZ{~Uic;E7oNw80Dҹ􎪗k+wQ)ļSQiSW$B1ǣ=SLnWk횸x ~=Bu^b*qͅR}Z~Aaw~nqE>lR])锦<#!6 <.O70Ng9#㘁qV|{›ФCio#YXe(`f:ܼ,[o-P;7p .G7r<^u ?,Xgoeox?nMatN6 -Aƙӗkx2%)03{}Tb4D ,beD4}RZ~ ƨ𪘶v_ |L(]k'SOHois&lv1:J[#L'?%F,(6}#ܐvw _IԺ{hk'*)//u:Cv xd8u# av aWj|*d' 0ӡAy9;ʹ? _^Mg\ZWOdFE6.G.{X ӃC \E݈P` 8 "i}k2 `3ik_;sP P93*³x|X`Zd;ϰg=[E_Wl׿%'L%h PFv<.1Zö;w XC|kKd':ǞU20RM3IUrT AXX ]W'LӖbCf)T;re*$El\\RjrH)>f 4Ķu YpA!L77)hKU#i(͢^ez-Uҋq/D6H )rvoG1e{@jE%4wѰ4C/Lk8 ^Z]?˄r6H2y( >` a|uQ[RLև-pެ]Rva%+1;X6edVD|K&M[c!Hi<+h#&엮*g_ϒ<~ߖmd .-nq2˿hpEk6)P*Wh޳ag/4յG=Mb@@I_Aߥ)YׄZ !> Ӥ&uG"ҡkdR1 r_ܿWN~;a<0#ۏO̚ v#EFJACDJz"l UV_muH%hS<,:Ϧs@GMd^?نkfchE* (`W!#N$VbWiʗ߻ξ@8[;zt-5~%Z}Rtסnpuv¥o_14m<X/qemrjR1^N|7>˟sբTSL3"F)rIBȋЁ[ B 4v. ?x$x+gJ ~161q9ȿIeIdl)l#'P4cQ"I Q\6 eQz]GJ$!XNlPO>ZWzTC[(m:vw+&H&UѬI >5 _NNPr1Ƥs2 %W++U-G5aL#29y ;ki3_NY2Lgɳ. +^j>ȫ7G^g>Rr%?>2%:s!Cl\JH*er7]R"/Z\eHA#q4J4`ޛv+-ւAYY0WrQ݄b”,ܝ1Lǔ&SIR./Dg9AڪҀ=fVpM/_ٜ>q%:dnÑ9& ]Oֺ'äN(9h!)_ /h|6/N(kbgusx<qַ2N}D&B0P*cW]v#L;æ+xw/JnJ1x_Z'2&5jq4#m.ݼ_r&ќu`ꡤdz]}4Z~BAM6~6pCe8Z&NoѝsؖꯖgBbDxK{.95*(cNG7Yx; 6ZPOV?^kD!KnMT\Y͍Zvr$Z%)ؔ%X@NWgɆֱ?m>#4"p̛"DH(Y$fZxI{ЅrIrgQSX)efdjf,-Nz>:fWuT, Rlk8g_)/Z?U6$lR~\z;rﶗ39+DJɁWoaV;cTo$\O(o#c Q%ALQ#9:\#.a \Qbx"'=; GةXYTHA&xa-Ab+S; T~du ҍe dttD2FbPGGPy9OMg R,-|לҫG,:50֋'ؿ1 &T!&26uO-| 0%7[1kpjǩ^;^APiթAYM7JOaׇxv~r7ŖF s+;DUðĕ$aBL5xۭq*iSv{Ι4+7+a1֙`lZ?JsVf2Q. ,2L&!4ьN _Du^JTH+6K\;YS2Ct>3/F k57otKMi{1֍DFx#:ԗ Ld*rbԍ$brt}CL̫RI ok#X82Tɶ?N=tef$Iţ6SˣG#Sͬxvk6-ĵ8t06m~No֞3h2q5Or!͛Q,X /]wؓXcxè--cK>18`hjݙ?hiM#{8MLd%nf* DA-et`A/{t$nfNsDt~3B5=T4Bh汮tXҚd^H);bYcTWͽe(Uj Pange\ ;̣⧁r.L^`Vɐu4x WxmUQq52sfU)jXbuJ W,OPŒRyݠ8u?I/M \ݝV,VroW~mvoAa O*7&̾į5wnigxz˚T`IT'IhPКG֪7U*"+GLW|` CX@;`h\|FB}QV socJQIQ,Pq/ qeNA-+? 4w:fQ0ng3TLNޕgIa!C /*B5.Z3Q<_}&8:s }S"A+.`DC+)[7d1|6B&d y%Uݫ#9NX?e1S;V40P*\+Ж^ cpp'hQ$|pwH"0~BchG0ƠaL*T) kdt"׏T>b܀n{91oaYOUqҶg]­sB>>Zz6L\% faRQ6Vp?vkXp>Q9vh iT`:gRJ.*˵lKiUϡH5JhJ;w\PAaIifw$ǭG¬"bͲOxQ QہG"ooTq 7L?գ!6ϻ }9MW?xk|:qaSO"Pj2m!h-2dR;[tU1ao^]8//S./ \Yyc6x05n$RmAH]:ǟ` եOkfQ'~LjLf2Mq\l-!czAjX1+맮ZW5SwƱyo kfAk`V3YMP?~ l'B}Ih(3*r`-?Nѥ!d[ޚrʹovI$c=әJ_ x ⪂UCbܿSEkӳ h0Xj7KZ Ԇ~ZW{UyW6p-],_^茜rn?7dս|Eγ lvhRm;\ڵA={j'+dQw5VJ\ot y:ĢfDNŻ=?o cRJ?TȪ}!,'od>#78]6[Q?^<:{H.(@WEK,n>CMM1A|~xnSוnh H{pp$.BR 攸S%[:/sp\%ִ_ȑŘ+1ݚײ/ U:L,!XyXn~ۘUQZuIi AOE*MW!\Bů ^~FmlGVLK#ݢ=NN>goٰE*Js/!xGCer Eh!u{eaez:r}.;҃7/xqXQtwxy;!_Vt .ʴYUd(S4: n&1ߓ!"jY{J-@~-FΚl&Ē@A*` HF0f,-_RѤPRͯs9a"i5׎I.sWXs)Y`m_ "3H7ퟛNƥ +CjU=A#ԇx3LVa TpI]KJcѸNuseU]-b{ERA# U%5ic~[/#{$20F]RRm {6Gi9]h~Q>5|,Ep2b|WqYuIjv/z폘wd}SmmqUHDGQa#g۬6Ů[F풓~E3]*{"{R"c@6&vaZ}ӄ-h2(,Hj3sȯ,Ƣr3VJ'nj[>mN*xN>Z4(s󦙡9)t$}w' 7<1uv@ê޷pŭq& ֮ҼŶ:~)hKLXVN0٭ɗpz ްa6IH%ě&8꓍0B*|lwNw5n]Aًɯ<݉u^~V#_<9τ+4k}GRnev84#k(|ĸ0bFYO]wpalacn 1\ȳn;JfK&cɁü.l.KOO?jC^rW;CD2bU yz1WX#H_u_+N}}(iOJ J|U:ýY'h=|@&;~΄biVKޙg7&4ua7I M;%JYtv$Uf_g"qI{Fbb]$e}Ci3cYɡ!-^kxGYTuxVؿvrĜ\m ۡfܾ\B#Rшi:iC񳈛BP5GY$ eY3m^k%U&yP9a/ Lfz) Uqg)J;(3p^j[uNDq[}r/@bdטg4֢x/@o'˰8 ANui!+jI endstream endobj 254 0 obj << /Length1 2792 /Length2 23330 /Length3 0 /Length 24926 /Filter /FlateDecode >> stream xڴuT=L7]CwwHwK4C0t7 ]-H HW. 9OsTdt6:;Y98*fNn@kw3V 4:;IB~ @ xppN@d` Pʹ] 2 tu2BB]A69YYg-P4wt9YTΞ- `1s8[zmM M&#$3Hiji˱%Td@Z@'kdwp- -}uNsp< 7e5H0Eӓ fsqd|qw +E(Z܀d5C "wN܀*ccO2 t2s8nlo%R *̿K:CfW/m{Nnn`elٻ^3[l* 2ZʐsbUq;@)4#om!:AO_;9{:v+['K[k;ٺbBc+ea? `eB>P|<0#N~͂Ov'+g&`g2Bv7h® 4?jɺ;89W3su/ʠ r4s1[7Y[/-_ˮ6(o'HBG -iats+ CM''?n2NΖN.^>di.^^/'-^t  V ߫ `mKAv?H. e9']Av?R]TW U Hu?R]?HR]TAkA]p \t ?Epx@AH'$Đ?oimqtS_"Odi ̬@.HE+?ܿǟ ܐV~;J B(! fp Bt B4p B:r2BB {q@k2?Ðd.f+hG0KGfw,_sBpQ~#w?'Emus_ Q/9!n=Җf%D737R@*) e *= p B/vD{!}dU꿏@On7?g`=P.E 2\M;߿W?_ђ^<9rC<kg?"7F^@ eg 0ֈ2ųl'zIpkٳ$;T@gey!`2=0$ʔȹ}DG93Bg@x)IzEιVј8+~_Bjg#C^&o: f%'ӢSQC7츶AuZ,/p+mRfTt&y \zs%q}HŇ>*eVRuطK)!RV=Mf5 }ړo6u[IK;ʾ;8 ,#Tt&͆L ۲)]Uemj~ß\wU:q(*MdGBJa!9%_وU R9egtiՈ$5;^C;[Snf͆ʱc9GO [BN>D]5C cB,;`+MDRl2AjXSөi91J<=p;]*)0zv?q"yjgߤ.*3NR'i&?b"]D2YQ(K$q2뱀LF1Qd6ZEY ~6A<[/PSK'jI- i.gAai̶fƄWN|;XN&oiK#|UX{+&wYn4uft}6_#UqW(-q}=[ pao:r1s["JWLڂ4*Vr<u> :J}}YC>-=Vˎ=m!Wo"jthEG[?5O:Xڽ.ү3f1( AN8-n 7YPu6$za3K ݭ͘X#>1h{yz?'x.6hFe2}u,R[j ˅ꒅ{Fub.zfP {XEd,oSꮸnS&+ EṀ,/C4zYj玃ni"QvXZ+"ˌZ'pO/4jXNbV`M&9@R]fbPGPԉUb)n6fthoI?eud; gDZ(v >$›Mz?4DLnW"VC4Įmm޾!1߬?RQ++{ί#I*0yxv c_hSaR{9X,`^v`FQ.5VGlӫ\&KE\Olqr>bS }7 >'a:zUz!u^6?ݳսG=|G\D8slFNb/K#gFK4##aN+1Q}QՄ y] <2?4|=]O8y#.w9/~C,W9zTtBĦ#S<7jN3Wv/?4_EGq^ 2lWGf)HQd8N)Hڝ1O4'3L?N2A7\~b):5Xfϗ͌ȉoQO^>ֵy('v"ey$ d$ N-S>IԎt^1<0ҸSyE~fZMn|Yl+c 9b+Dl4e{{U-)zaa~`0b؇#ujGP}(iK3}B *kX{ :5^ҢͰ!Tsa $рXd۱4ld ىwXg9g4?!qFW!_;bS6sF$ 2ThR;O ?PF 7*pKCeړqieޮ+V# =]GَQ!Jc+ WqYd5'̝bm;! dYIk7o xԤ =M# ~4NeƳ7DZHQ-= ev;cj UrXAyWs{E f|wڂF;^G٤ 'Ec/n1aUw-(RPFpG̡GU\PO5XP9O+>4*;߫|Yꔈ Jk1Huf_z#C{Rh4oUZRNEur7 pG/;$wL>׉md#[-W؏J\".gD"ljQmV>02hA%;*adzndyGMIĞ?s1 0}cZVu+R- :CҘh)Z K;MT{?շW'h@J|,?JfeÊ4(i K<7ai:[OY|]6h O0M\zW>K =H5jTlΎҒ_2qeK; ݊i ~l9झEk{ռM$<@iT igحj! K_M=.䨡O [1Q|rRHi0@@9 (eVQ1BA6gBy )^PigN(YZ4zoxdwn{ija;:<'m|mn#i .P~xT̶M|YV͏>2izY_ƃps9.mhBU Ջ^,x\Ʉ^7A_dĔ[ _1\mMW=(J*.bM[_O%[/8eIbP{BRw".C(zTj,p`9y{7]Hb:ӆ\TżbcGj))1Ò>ʃ_$ 6wUE:o $?+H]nc~b"YiҪYE'XQRrŁ8yJ1fkΫtC/44hz0h]͠ذݧ_q63ywapo(Eᄩ%m<]$$oADvޘg7c+^wk)DCiMvv8Pb-F$. )7L>?Q j ~(=ˌ3׽=EO13+TN L2\ʠ>WIl. UthU|Xz@ڔ+LFmvkP|Kzyse,B67lG}L0{6fV:]*a?4<գ1IFzKMʥ8Z\ik_0QzW΢/%bY$];Ļ2d}6gN[ߪQF11D׃MFmap Ysп}sϨM~]d*άTUfќ :Al9:b 6;HaO7q,7vؔQzF͹h%!-&dBZV֋ᤓiB۽5Џɦ;PrL$##?tkrdxC00]=ÿB谁}~F)ۮ b*|asmZ~Ʃv@Za*)"OgIaG44,Zy&.ҏB>RP5lY hV'?q9kCf\\^IMo#K oJ^>Ĩ WFąز#Gbr3T%vqʃtCP81]kpPvc{wYxA/6?B~҉k|cIbƹ8%{< iMnøQU:\&”tDƩMӚ9M %O}@K垭 j2+^QР"] 5gLi\zXM.D8Z&_hy^5OEVELGTd8:G>! cl8Wyp SmdeM MM ??4u_tMyE׼C蓺!`t"ާ9qK9n[[a*z6OuWGU$MlOoWȪJb53^Q9S("U R R}¬N>Ms=xpW9~z?&Ck,~`Lj'ۃs(Ta~FFG+gh;?Xcf=^DY<ɴ3Tž,ӵ/ŅAa*eg:]X6YQF7[bSU!_ IQ6L|3;g%`ms+dju}z. ,O*~f,]URI եYEShđ)ԹQtv¨I;pf`W|^bE51X8am\.DZw8mc,AfpgXrr"kBqɭýKí[nhJmE麥+?%MS!YL.,Ⱥ箸6 Mߦe_ #."M*9fg󍽕G!V>H7=L]P"qmIHk;ʍOؿXl; \aL[TS-h#$?dvW}p δؚMgG0.~~1>>{㗋aUiƌЖOphZ)i^<}\qHO< /-٬j4j9@-ouҍםJY x )Cxɣu_]$.͕4Ioܕor+O:D_ d]Uk8~Ŏ 3s[pާr9խf}! (n`YƒKf*0F-Je]!-x%8(x^]v0_jCK%LYϹ7;ϝF`&8%3D+`Zoe+lL-!TwV[Xr,x+7gٛ###7W]SKTwQ•σ%n}yr#:_xNޔ)I L>1g rT~+IveyBɷK33IqAIgNwIDȺ*d;p Iy c$5  7bW&f\ͥJCk jrkI u`l|>geab1   K__zN)v(aMA 8toŌټuwӚ89wk*.ՅiB<#n=Xаf=pRg+?%n9}$j7rࠏ7|D[έ%bѦI3Sj!Tf\[ܡKݹ䈠Dfzi@k&:뭪Qj0A ex n`7)?vTEwbLB{hc\=`wB |`/?B €ɫF]杲a6g֩ίo0.TQqq25Vͬ*־t(3y $:Wp@ce0=ݻSǙҁDu,;,Fo~<x^ VvBu=M^1 VTlZ:z|]udG˶(*[|.+HWUύIu6MB+!{խ%/YkW93~ 1}H$^pػc@H/ZvfE!:RdMwFWXcs3E5Q: Q{+aHLv]7y|q);x@!ֻWHf#Ɔ Xp$0.hmp F<9݌vq%M%4"0f&!uA67Ģ~bpFjŸ? 7>O e}K`w;PYn3G~ +'}!^xR Pg\ c*ֱVpHƭ GJPע1|/~ŀ8d}} T哹m *Gّ 0P N3Pڔ5BV؁8ێrL£"?[wI=Xֆ׈SI\;٩} O9de+L,h]드(oPHNSVر4ԢM6E`@KǾԙV@3 mPqɵghltEqr}nIi&s'0=v2NiU Z.D4yncRP:_ng3"j|-z O_|SH +2M0h<Z4CHJ1@n)Qt(T8a-T]I&&V0}b>y_ۧhVaAg誔yoyn<3lJk]c'BHB⌚TvTm38`2Y([͆ M^KBcx1 7&AHٮ  EGMBgL.!%H\!Lt? \ajB6EA toU6S耽aV s*~: pe[R'~īreΩr׮Q#7B fNNgKN|՟! s1LйҺƋUx?ez/^Jc7;p xزc^?I;UMK4TI C_'lgzj];]#w| b 6VɄbwgƊ' pYq)(>ivň&tGPZ}7\NkZ\I>6/8p-v"A+ҁ^O-<ә #CRfbk+bO(AvBrPb>8TN68jž}]]:޹j3iFhO}ߒ t[)NtpuZԵfW/Im4f;~ :3N D1jz:OY-þ#qvmX.Yqĵ$t{ůyäOfh:p9nH4b> ؖ&nv5rҐ"W+'0yry(I5$kC2 j篫|zU+f;"w^|͋_uP@+\JvpJ,{ZSNW>="NIVr.~A:z]p݌z~:S: AFh؜7V*JN/8c~NwVӔy*՜)/>2k^̜'k~o23wdfYZ.1Xo3hZx>IQ %Xc3Oej7y~( l 箖$1^ͯ5;`~SiIvg~n:33֡|wοvh\Gc?\UQjLLo6򔀐Vi cV$3 SEAg]#PoC*zȮ.gHߨ쉗%y4+_N5 cDhYl7] G'+R%5 ߑ^XZYH썒 Bl _u$\ i:eDɣć%VZ63lC'?d{[u릝UBxf3,NRwe(_^/ggDpzs 9pN0V GhaUdeL#4;GU2#VP:{pE~X&Dq;U+\=5dtg D"Cw 4ǣbۇBìtF?6q?S5t5 jq j9+LwYGE9ӊETNpD,@\R댗|8O$YG= v MqESq>y] _ɡ)I;0=>7\d 2bθ> v3݀&PQ6s ID#~obb{9Hkn1+|r7a$T-DkW(ȓa_cVF&tn@s+Ly>bw i͗`M^ 'Or qyQ=8GF[h KK뱆~bf S=6}]ԓs4=84MB¯.-IwB| 6&<€ xDSvY;{R |eXbm:5S?2.[X%f,D_X$Ŗp/mapbx9>;g84Υ@DXTp˃CSp$|ǒPw:(K-i-tO!ԃ[7[H|NL*Ov4 J7V[x+Zo8ˍKjz`02N/:Sۮ'Jt߉J=n ݌y~ms|mF,: β#v~[GEc<2E™VRCf^@ F OKZ>p3AY2`Ȳ}.Q)iq?L/0Ҍ)7lyzrZ~!kRT 3>Y߿!LWѸڎyBŪe7޶25tU.׹ɬh4*fBWǎxDTlQʬMkWXnz CLF0:m./Ѭ+,@1\AYlFj<zՌT'U{38pdͩW^ͩƐGAAoZ]UVňޮd[ 簏VR@j =^"nO؍~_ٵcueüNJEl0P6J?5Hnlo`|IaF [PZ4ndmyj_=: wMG6Gʏzgu+7z&-.Tއez:mW ˫ީcIɗ-1^Յ_x {(W<~>d6S HbZo<h)R~{fZ￴+m!ن6t2gEӤY9qɱ=v\ɱk@=ξIL]ݷ#:y V VB-|ZO%%]nh(E*>+\,!sXj}]!(ehw3e)ٹK4Ҏ2'{,gmWTf& ;{mBNGvҊܓc^mg|(%bP{wv\5z1tΩ>8uSp/׎~JH2WS>:Gw{2cr9=dòg*t2Zq$j}GJ'FchEaĽl WGؒͤu;RVmlDw' q'v e7SmԅxIaC~4{}!Ƚ$>Ah,xIƂIQU¤O1 C^[IeTkQ(WZZV4:ڪܺ{OxF!JA]Cm2;,0!۽qO"yΎt=MX0d 0t_b| FqN#2 o;&,ķmD^<P,K%1( k-^gIlFciTR > ~cه:UiuZutdF֧Vu(\4>BϧGfJ$UW Z@'N~J@i6x&%:Ձ8ŏ|:CqXl=dq4n,QK͏6CRVK&Wܼ:8gM+]_Y*S:{TWaU_}3FP:N lRK+Wbe@` bQ(t7l2ꭥW%c5 ^RT5P d_ 3l,>ي߸ >w.T $پē/ZMa,r~&GP4 ː9I}aJKB`o2qJ:vQB'aO)YAt3;ŧ7$vyh^Y>\-yV"y,ǬP/i[!tRmb\SqS#PlN?sgK+*Ҝx%rhzb˕VMzI#T R}efNJm>zK(j۲3xMe_[6մW#(DVR$?2J5ܹ4` ^_LIχ7gjJ rUS~Š<6W'+2(j6ąN$j}Ksop0UU3#-gmf7:=n撋2[XTL)L`*l̻ϰL?گ ܰeSx`.s2:<hr@~%&We7s`-'r*z')o7C~b΍ hÏT2r+[oc?qF!Pf{aRy}y}45)OMb0u,&EiV&drf'12z|e]ҢBĞ,!Tqx*m3VǢ#=nD>S5 SO'|7}n]D -axKϋf}5y}r2E#C [9R[;}`H]ar'cGq_U3DʾDGsx[5[O]Qk+H#.EUaiPkӂe5b"TuXQ6 ^_- 9 pEA†SNWߙ_|STC!!%N0dpA:Rl°1)%37IYI. 7&oܱe'B1ȠM0Weyڂ?.*;2ƅS419ƿf玈s3mbl8H e/`."dA` t ?Of0djGT,B&ѕB Hf/Y#Oo>*c^SiLeHBC+W.iKq >k$̔~70&Pl- "z>atw!j'+EuE,lG^L](y]ۆ_Ҝs"ӹcSa6@M2" n{D|NU%8FNv_5?#`'bY񘖆i#Ck|.S2am݇hC !VUuc``ը>I蚆a0UH r +CAqSwwYzd+cb4K0"-3Yۭ@NQvu]7(cP䭉gWO>xSȯfjMF[juZ3 n !բRu|KxݘpTl$į(4]\-N6+T5(o4rڴTzP'pyV'> -qv@r9 vF摃pP0W_ 7V -7RX`롦HAhD\|ۜPdhlJ TԝRZ7=o5/ Z:.[zJ3n{?k$*e^5J@~kTtɪ7֗r2h*T+Bl;l#@du%e1[C(6o9Y7/y]LtT6pWP^NJ^,*53X>K9ٰC"݇"WDk X r@ o/ ܜZ>wzel·,;=>]E$;E0>nDa|T|g4k!]\p|SKVTv޹c=3hq " 5`S9(-}'j`R z.uFvB-fw:) Wj:߁'5ۜNhH%$X1/ pbً)>9I=HZRsTVsK&P: bj[Obn5)C6\Vw.Ȧ/&LR/] %ܰs$u 7EcSs9E]R38׼)(u '0%O@ 5[}Y3gBq ̞~ .0nd^< .'K;j؏؀cm߳SяKkEG][2vq<46?ea9f([1w_7AF+u7I >f1B|{iCDԜ`[?r8w`K Z [oy۳UVC&E5%!ek/,,cpxfݞv 1Ҕl{ Ig%m@QXxJH Inp]Ӭ!'_N&Cw!'R7e}zQR:Ɵo7Ntmmy24D# S2?V>m~s| XDϴZ-™Ն̞iX, C!u-R+ރ6#.f"y:_NAa1}ٕ_aM9ƈ4}30h Q)F=\zD+b#'0g%oCs:d P ~RQ;dT 'o>[0/ eTdz[E7~DO`b鬒(VjRh98n.1X4rϨKGq5jkQ?QSQ?>zJd*Lhl(>o;cH:آ\-Df9/ZqKzXJ^9߈SH~Ɛ Ii̜'oBY:/15Oex2|k:N]k?k{Huʁ`a1, S} Z}9Dg(RafCAvh=}.ؒr1Ƅ?ˍz>jз!QiߌUק@ECC$gB  F8gӻ#% ogߥŲzKMoƆCVdql=J7^o 3+1 d%@D_!1ix"Uֹ|jP DRIQTqk%Le*hK718/s.rm%J|Y&̒(M*qm&W-A'6 : &ܤ.{=*USmO4 plaĆːFآfX"0Oӊ_!eu@ȶJ=k8V =.udd ]G!هmSgUH:ͳN*SVʬ~7/쩮..U*g8?QqQWWi<''{)[!RSnmPeIgfǕ}߁UҕP0GY`FFwbq.tQ[>,AvMs3[^\K{ ΩUfc0lQ_ ' LbgǸBӌ{ݟ86XcT?e*PD-a㓐Pmm84$4Sa)e\ec4S'tR䲳ˑ\)TovwG|rI>hvD~pM0xPaGL/8ڭTJT!BH'9 lToeVcݎ^D~]{'RlK1JyC[eK3|/{mR-&gDA /lie9[6b5%k^Ova8nbS QXruV^To ώA(@jBH[be._cXUH S0pףf[$̇ O2]4A. Bi\6?gg-vYLbEQH]76GeREVG\KK_M4euκ)oTȦ dJ( @ąc`Vq6B99X"Lu;peMU'[Rl%0R3Wpg.dD# k`1, S =|_9+^%C8k$(.a+fڹGXDG sDw 5~Gd] (s(c5lCgExO^Z ( Z*4:j$ UdO]l٠YШ ke_B /EJ8ߡ.UEJ\7+hǼ-LzޕZ0&Cm7؜ְӊ$Zz-/)Lc 8+O$ca6>GٲMk a0C2@{מAM_P &e @=:YT4bwvY_S4i|0{:5ЀTMdvߒ#P#D>~kplXh}t8CY>10d|zAUx9^(զeYI=O4=9qG9cztH0[{= 3#.W`x8ᰤ8gAʂd>Ξvsz5V1!0V]LWzt}n=kjO:Dcl6$ {!MvgǽQ0v %xU+o>8 Jہ^]^84JHe)'a~k3>MEXݯ[~]ɧ0}8 ~+ )G%F#K~k sTG)+\J[YH'#y(=Ow[9S~]rF~h!mnj/>hٚ*2-&=xY樜'3պE T-hD8E0B3ػV6\!9AJ@}Z;=nV \? ?I$ԘŽX ve"9\]PZ'Fͩ$Do+?1}\1zbUJ&Aa65^k8nkĘ(mcޜ1ُFNr]L3JVx#3@SM$E[kl|MP| (!Oƻ 6s3tM,kjY̌l>f/8/'#W O"8./ _?ۙ<ߙ?@Ҽo)` 4c9}^.66F@K5Ky,$-݁&Kؙ , Cw;f|.I]ULNIB%L@vVN@rpXg@){gϩrqdF\&#"HE*Ύ k9;Z0o˻ſ٢ w/waX?XSYX}#|?Wt-/LRBK}%MAQ0U` jJ\N! gPdx|4)1m^7Z+'oLw||$DFs3˺Hisg2ھFOx:Y'P%ꖵAα4c8ڠ/u/Mu;=bF,bJCvG =Q7_Xω\B !baRU ItLvOsVNE<9•nCwg%H.hӄA~.mErZRUbYH!"G6 ̬)g{:v_<1 Q= =u#@nSJNZ0e%ܖӌ?Gmhf<#p4~w{.|zb:DZNH:L<1h SE`.5aPf]B]xG21fPxk }ЦMncPc[k)=w~ ǚY,EKcq6)DpXl@UJ%_̊BFV!5Y!dhU Mv^>v+02zgz*; 44z9SwDr,FM-H [bp~PDkޢe!iV>7%(:͞L[g7[ HMv֣ :H 50j4jB0 :g~+d9b~I7&G>G@t#F5 <)ոVЏ:S^GHvz/*L:US?DB5H}L wADSwULZǿR͞4rq_a4՚hz!z|eAPFhɰFwfֽ+)V6w-C{ue*]n/5_5F.fHU_]ڤ~~[c>LPߟTܓ DlM.wHT΃!@H c#deNcx_z-#kG1mkZh$oⓛن) ӏB4Jc>ip[R@3}lCWcv.́|Aӓ"I,&䧚ץYV1zsJC0Az^sO+JzsRfGeQL{!\n? SAVzYSl'˫4NLik.v+C&nM33B.i6Mi[1 ‹- ;VwN)hnoUEkʃsMƈG m0 ͕hECppVZAs5K-|8qnU~ rc'Z fvtˣ7z')FH-L:K{^.@?OҌ4IC&9B(!zZ@کAKt#O]{3=5nO/:O&m*_q*xq갮V"͢că^Ne.+N2K s!%Nm8ZYvt2؅$}4L|͜s;@uS C%[?ϝULB!Gį0W DG?'I*Gf[À'"Ľcjה^Oc ^H>ۡ>Wʥ":/+WyԍEa/T0*zp q UL:fEMIC  vC?,[t05{]9,%d1օPiw6*5v]ZEFbhEofauut̘o..sk:!z/boOa5-T QZzbUM-4Ëf^iy\p)#eV-Z.wRK%ן-L)Rp2nt2F(^0:o4+h,R q*bN\eG ̜ne|瓯;(8+|b5{ؽG0Z ZlMuDe> NL ᛁq ޶x|]fz}*^\G9ZY"4 [- Fw4Bzx&xY=Jj[5D E4%IZlw֬>E xKgOmۙ&$+fت-샿3%Y)R4:{c19chcFq3;axƈP;ܷυAhϙ4MT浶ѰDRVQ3(I1bƕS ?&ή _neܠᩊ+Ow_ETp љV0Uz+`塅<<\;.jp|wk*\nfuԘ! jr'a/2+Eta)m<6ĔlУEkkp^=* i ,&17ՏIl^a求ZW,=20,j.f(Cd-QdjE'i=BZ5|pq=BԇSgˆhz!|ls%uSs6 1 xH,8N΃|tgfLj^[I 71;+R@VrD%'ۙ!޲xA{ El]IbB4mCR-m:mx4 P*h9 M@ײ(OŅf2SS3|ꌬچ^'fM!3E T(,GGJ8Gqx <\njɴmh_T -Ao8++J'–Ƞ/oTBs3xWv0[!o :QvJzєzl|O#KBޖIL ?y*rM-ht9ųF"F)];,#fdk R\?fArq;YB) BX=0SǤ!M>|İj{OVWCR(&ݺVw=\LȅKg UJ߈q,oЅd̨BO L||Q5[Oa Ч,SmY!c!f CǡNaMG+&cs/$]"| nj7S9Od g@qVyeS39!JcC)68;: W[SPWbF'.i CbT(B;, u^)c䔊a=>q=1"&٨S٥t*bccJkas mםn#ÜƇQ1l ǩPС3JEm;U{!2%pmNc$4Sv2-GaU:>̫06 aG]lďCR<0F=8!Wxې z){\>/Hvo| F?g/܇&- 9~}6U/=i $19X :wT[Z涮a`.4*Wz{lyQMxL[pSQL **ˏ:?UEs~Ш&3xN;({2 |kxôאtT>]9}h׸4Wp*ѻ7hͥWƥߵwr'=y6?E_1֟]Z?5d: ]lH,9Dv >Il,HM2@Iw9)厐d'-jK~UF: \;ǥ4l6dO92uM4Y=Zd?1\2Zzd#Q}^f(t^iJ?=URE,R36Va*f(G,GIc BE$IyDd(o1~&ӈ#KK2 $ @93I<`܎;LCY,PnUg.v?Pϳ5+O'4ηqo4R/~{T* g Ky4q4eGF}paWﮒd19Fl07&_=Rfe 1^Zjy+*oUݝj2=ɴ55+p@n0PP 񠗮ԸV_h Â6Ҵ!BkRHj۔ۛts\X5%^?Cv~5I+ gvAwg:GD~XdHs?bEt:?4dlߟ4D0ӾNyuک&M(E1Zv^øz8Bh' Cq8ŰxX7oV8J6C?tQ Hm'<{! j)\LH0YB23qW%5O3ڀzf3No6֠uD_'yUW#*[PD2z?Nn dmFbO )Z5\|8upǑGtV׭y 2 ~n=՞'Fh%ŎCe^bT1G: ׶I60x.+ lFV%1}\ u%f:UjeKENMI}䖠XT.1 Pn^ݐB!!Z[q" DKW"J9) h҈` > &#9)m‘ZkNb-hHc` wRZ15EPrv r6"h ;?|>})n[#"ICS J\.kYd?Ʃ6K@" ^d%';_ruS+&KW ⫧(wף/UgU~c6?JJeB1ZA{a4)vFεZ%>kǽ:i=J/,6z9*?~R䷹~LtK $=Tdz0v8IS3y$bHտ>J  % >[K\It{j'=4eLꛌr\DܓirnQ6(aV/*}2~!H/HT+b$YTs})n]Ԙ{>|KCI\RQG|oHyϱ< fK_w1%xv5{~-'~B72 8Q=V!'UnV&j]aqesm1!GvKD&YT}42p>&kҡi;8 BOE;ܖZĄF)Xגajgy9x@KW0Q~!6$>4D:t?ٞZ&11F妈 3ܖgf[lQX暦y^uFe|c^zo{B ohp#-E7"-J) {65!VlJz7D/5q}r1bR9m"Ckdf@q!½!@`tF;vfav+ÞɵvSw>vuZEĩLpKyvZ;C]ε`q!J"[QIY8 bދ8TOj *ns}]a:g2t+6v kag8gRn֌oR~?hH!8C 5 ~X?.JV Ho|CGv2َ̗W' Rqa;]dJ֓AP/{Hr- *O|~лB$8kmλ NؿI M|CSP,rm:f{n8UIA,6V{M.6垐ye!c,mosǯ:/oOrJNi{!UlX#1"_X }i\˽2M2i>m콡,P麾0DU*i$p Tb?@!H։7GQoW }BߗX3Q>CqAAT-RFq3h%a\/0|bKr^'3ft&]zӅL;|9ˣĞ*^8LAreon>z+ݘS-fK<=|V̠J_k<٧`^.LSnV5cnFR~N*7N s7ל>7(2-:P'8a'l27s"#<@oW]AҶd1=U 7_0J6ّUr(RaE< wϦ7Ks[9n$`$}G6OM:i3涠&s)y_/ j2WW9,4>ڥMA%8Rͺ)+ͽ-qд9q-+9`#Szϕ-.*@FC[SCCkl2}= up>*96 c n鹑SJ5eài&T;\rEO(Eȏ fl ;t0=࿱0NN~x& GϩUgКQ~5X|aC$g{B@36)!gvF4wv.kc%?0m,K9+fGSQM*ۂ&1]ޗTq&ͧG+-` )Ǐ!GEl/ hclQ?r(+qǠjѾljoό$(KR.]pB0{MpUY4L2]5ޘO_E2o ,6jXITeSm4@b0($-Gڒ׮T%iyRru*-J]# @͠Yx:QHn,J'7^x&$X13#ag!ɱ 5ȴD:z/+9>?rІh|O3N T=j8,e@RɺdBۚVNsGݠ ܾKd>(4 oTet⿑PF>d֫L: "̡_e4oHfOKڑM7bM*HJ^4jo^;6jihLÔ"ؤ+) {OG9zr}Ӭ)oFî6ZmW<[rCk'GQ˂un5ˆ/& =:!Ǚ|Gv/}ۙ //2?;ˉHcI|4d)g-Wȱ(6q5`z|b{³x8Bpp[s:bw&FmT=Y\=xܖYFo(QדMA:Ao_Rx YV>AV}぀/oԃHH4WҲG`d;baE@޷;ᆭ.&H$ue򲬐~m˺LEHu0JتS<(p3Yy"khHI_aoϼ[DDܽ@ǝAa+BK}A 3Cbq*p~mNx,.1|T%~a 1팦έAg6D pqn2~ {"W #v,)y:tK&M,KO 4@ңRFVP4.ҎH~&[mAm^Gb 8u2@~F"ocAc Yru蔬3:`P4g 5۰DRx]W?$xL|f />*)xEǸc0P\f}c~>E@mG~5O*Dz,UPi"uͩzq7*'G+_F ruڝ`!5915FPLq!]ͣJ?@}=@ ^@HF%)r%|Pk\ﭚyO5]. |\}gFN3ucݿ7QoܛN>O5Q`nsf\HԕiPN10{45@`eǃ֧QF~ O]Ɛ"ڏ+,+=vĴN>YW=-GMG#3qb\߽?y u sx堻n{)06HVEũˍN݌k-] bm.PW{,ՔP%-cfWl;Xr+#g\)r& g'q7\{c:1Up?X Lunr_KZ?"=ϳ kwf$SSGeO/Ԝ B@"?P2B AUDun { ':uX.gKyޑ hc K::%ğW`a+ܢ}hu߂jZJ05YG[|}\VW~XE`dρ-uag@N,/n_}̼f]bΫ Oq<1DMD7I$F* ]n׋XJ7n&v+& T%lm<7"j[-@c֫.adle $ק Wann4VH򨒭WhefYO t~t\#^&Ý!VV[fKDzgtaK*2Stw&Q/:Vw,l ܺܔzA^>ҹ}{"ǐ~,bDj"U5Z RLjO"![1O3CY aPP矞⮣ߩfnIlUKR/une{f>@ Eӳh.ۭFYY5џs~NɳJ,m r#LW!|9~|Jez?4P*bg#K[1n+UejbV@4bwx R_˂'BIS}Oo?^* i $9|oY"rG*q$bj $*V_{vϾ " ?IKL:anaъayۇS*dv '5 QxQGFǣ.남ǚJ[kpbrMg'hk7ݪ ʊ0l,>2q^rװ^ 3.:8}'Sqtp܇TS6[ׯAJuU˺";hA> S*IT+S*jΈ :P!’Ճw]}؀ni8ҧ.7RV9;=ma;l(֓fAiy 49V7k ܊3Rp%$ cH{ͩ/(輨{PmbH펑zr-RJ䢡sI_=Od4#+OX4j*ݫE%8{T>MDnvDDz2$(M\b!"|% )jwdlZ:bC'AL}E?ΝrGcv4b8vDyX@~-]Q<5&5j~áTR5NY0x5)AG Kʤċa)/(}Q9[96i˝%4311/TZ1R( C8^ퟃK_u|8Orܞ;r9Q>QX$ ȊP~5uV@6uE+9)Y:t_e3Vj9Hq18,B>2Bpg$qaMCV:SCMZږf 2g,_H=6C=0cDLBFph ʞ5 nE lQ_n7,UIGEd(&'8>׹spQen;LxUSI WaT\by W`hu׬-G ) d2 YBtyRmڰKixmDWw}!;ͽ]f"E0L1! /D`u[Ēӆ5}ޟt~h^]{J#!|B}wt QQE dkȁ/X[ -<qaD"|^ q9Q&]a568\9C*7h*>7JϯDU]$gi;Nf]ϮD*zoMSI4$ߦ2;-ᭂ*>2κY;=; bh/jQ,eg&|y8-PG"> Hjl5p\] w7{{ WLsCv} ȵʮY s蜵" cA'P?Jq"IO&QG*=NLqϢ@4"er,P;")L"-}-WtmdJcyusAt@C/3’79uo,ش~9пq5r{ݛY- iYj N:&(fyo!IJ$/5N B2VJu89y~IU@r*6gAll6EWlDu"lr*|ؔD+ڣ4f{t@m$  U[P[í6>GW'~-rAM]oFٱ4R/ 7ȚTTw+U4`T5}l,[R'NkA6Al S[qu~ћV7W;02 zha, u@6G3,ɼ/,iL<׺{^p#C#90ωcbWE yZHSuN=/>=1"h"yJjP] chÐwKH8H~c륚Ե'}QOFǢbcHp RtuڍQ$4%'b1cλ\Gu5 ᫌK.;ϩs^-jCXAWKD_{^kN$Bsa*dylj=_і4Ps]v6 j6[pqUA!ڒk#3l ǼJ˘m=<6F$;ylYh28W[C)Z H]sM)L⻝]EZDD; 6KV?qGd[:Ù+ $4(=ݭӴ)|SXf,Bh`^T-7EabwsN&e}λO@lK<(TA,rʻչ]mA mQwAU @\P;WfUݮ(p=# }^"J*j lƖY(D$PK \T$L0 ꙶ^C'^TeʬE$A l ȉě)i)ʙp%aW 3ḟTh Jaf+;vac y+.  py;VO _$Jf [L۸V-UR6[CO$yR0tGQsb%~<ǢBR)f|gø'7PIꞤsދ'GӪz*&sіGtUT.r?Q]uɥЃY֣).j_0j(^6jmǕ%x>F6McZO:1+ [; #cQB~RZWCAb?̜4n%@y2NF/)1(q]xLbfz.N LfC仢FN/[Fԉ=E$zzs*N:vG?҅[?tO*gp_gЀl /a}(1;K]&";Ԍ] `Xl)-RJA]񩔨+{Nivͳ(`AHzwlי;\&XF_ p@i z5l{Yrhk1nYPckcmQQVĶ)WAH&L|a$ uZŤ80uӂGHv0S<@V΃+J7r8)g=acWqlϺrORlTS9>onғW;x f_hWkPFj/sW\7@Aɴ6%uGų894}MuPOM9= xAN x "|'[4J)Mp0X'Lj*!7er2$bTad`K R? d?==m.veI;\* I GIsfS[,[^h*M˅,7%I|ͶI?cToJーy%Z5` zԄ .ުЯy (wV)\Ipīs|[T-L "'J:CK6$0cpL4c\""4_z;^&e٬tg\M: ͑#Qq&0fXbNU df^>T6zU17)?zcç%٨aOmVk5dwoTA;m *3~(s9䉼9X\CeSG/& 8fنgƔ}qI4cD!#6Dzof7$^^oSgu FK%HuL^}\=ъ*k4|U n>Ec-\]B$ҧ~BJ@m,D3CVȢWQZ0PIȦ>>Pp19&{+)xZ BӂoqOg9`% * "UEˆ׾4V]{cul3X#,{9Aoۃ,.]Bg4g0VU.=)g0,]o8`~)InJfP\(s@SOVg^W^+ aQЌs߯MiƁ ЊuAj0ى ^uw*P&̫$K$'tzױ9˺"\/z85=9 ǩpUj2<ؤXq;FS>X\ vGY͇]"F(k]20 A?z8 Riƶ'}bOHṠ,J䷢Z" .Es4P z(őP<^d_-JL$=߫]Ϝz,s #%-5kNtfxE\%sP,cKә-u8qN/p8,(!1wRꆒ^1yeTm/hӆC2/};j `xP-%4H4b{|w;X=}vƷV8 u]V1 )j8Sf}T'[ iܳXrIEQֹlTV͞RsRu;LLbYWrA7{&9Vj4PL5e1a7[RfŝG|俆&7f(D8[pՃKZ4k; S훢qTάoVn=k"  Ǩ{*(0MJIi1!T^ g]4QRh=]Mr5v T&WD2`۱)uoǛ vG}mF7+?Ivԇ~_rVkডåLJJQh"H[X{N s &“nlQ,Dnx{[(sG(g%3XfTH4$10Wmȃ:^Nc2z8>n!6W8Qk l?S")'@|F%ZZ$i(i.h'\d`0Տ ldV׷J2H蛄^v6;g~n d/ZU>@V`t̆Jd?ʝcw:xsy,ÊvJl@IL -~`zF '\ Y=upCMc7KRQܱ1Ez-2~=ZX.K|. u}D݈3F$2Ы!J&G@ZZTtdH%fa(%1vg"sbk|vH7&-=k4y;n9Ѣ&/2'~{ y%1tSX}QQB>skM0zGEѕ1J'ޅѽ8( %ѝң$DS.b18atX(-2..! a\TɢROKhSeMeY ;ݪE!wny®ǤUZֳQedU*4DB⻻6jIkXMfiE L2E 1Q ;ߪs =NRKdpM%E1_p[lo1;З"6ߧ= 7LDE= kʏ/r~SFkS >]B֊3F0 s~7:a'tO/}Id!j1bQigMP9[V0 =+CqmXmm~'r0 ٲ?厌Pa"yY>xE}zLZ{P'CSPI/{=}ȡe~r$֋QҀ1N yMF xɡnUs4!Gv77eDv,Zo>$55OW{Η~@0GɯIR^[26~>$עv*ĝdxzMSi=jVNp,){?[uwoZ Uki$&[.0m<>9?q0[cǨ!}3c[ae&QNTBėl1Hl0kr@G>Powysq)]3f^3V  fݰ+` pC9r[&4vRy۫\^\(!uVVsDz|9+a:NjguK٢ ,LN!<5Hد)&9c*:&l#-9IM^"AQNhصQTӦ d ɍ 58Lw@?UOA gJ% .C_f^E3c! vH Lpi6^{ "Mر=ԙGʱ:불`]f\(R7H92<Ǿ Gi:i;P%lG=D*'Msfe+մuqNr,k>ͭQAqX1լSKŵ2.P'.F߁2m ;FwGBaĭ!z۷'|C.aHhG20rϢx4 Rz»V:vqg-ӉA%^dxnj@F*a"!џRiwv[~6 r'dZ)'6 ɼ$FJ{~+ ^¥UȰOaY>Vh(FȦbϔzF=LEz #wc.*Uh8Ons{>֗;`ުat]K,bVbUmZw(=~^Pn6FNEG؉e(V17v*A,U6oS$5;׵s_s+6d{H:E׻൸SL KZƗ2~oR |RNwr90F-RKEPO{(U";0,Ad`0 *7"G\"vvOKK [TTpO"@Vn@цy*+t\Xz:sZ-Z?[;|^o0{y $S(rc„5Fu\\ 0~uenXk^̏'C_' ,5pt.m!8|o 3d;;"bU'[m쏶BuͫJ#++@ez̈́ VGƒ? AI&5ݓ¥=D*)Y<3~/Jw3@ R1T0P謤,*ܽܿV)܊WfmಋMWc(|hTOTctҬ2S d} Ze(GXFχRVσ?rTo@&c_prZ^I4mI#y0;R~$t8K`H]Fu!ݜim?[\¼!e@| R>U*ɴ-Î}LhJ(]0)(\-#KW,eg?xžjՄw~\ಙ7DH2ijw۽3h)ҾrTH}]/ԾT0m^ O TT.iCI& QEˠ,rdtVA{lN:s"3;~:G}{*/Lߗ7%ߛWX*nI l{_V 1rEjMiB;q,8ߥsvR}D# N+^K֘,d-Z e׍RV,*Y)lz#OjEb as@u'JdĞ rM< 4˒BGCbex$RE?4HSl *ӝ7cNHU'hqPonFsl`[Ϗ,ZmR UJҽ?_NbFpߌ\~'b=u+,1=$0a*8!ViQ3#߈N}#\iȕ(Z۲fGBJ}W[)SH|qI톳"*3Ai 3LbBVƦÐQyF f\s (<i$U~0'S !@W]J;.1 k96chl$]; Gӯ֎>P`YR+H"hl |qUJ=0up#"gOԯ1,T4i bÌ_46q:TX w !ڗvWF ɃPdo9?M)z3[m6[ؤcAܗ@ c]ƨ9rC2#|֥C2GǙf9_" ,`͢k=_|\!ε#fn(5C,Uh/[B`< K粋7}vnO-}kGd{U~bC">A+]D S~CrQ𣡢&w",SQYA}0A/ģ%d5;@8v>hȴƮ[ #VJ8фôՄ%FJz]I{,W(LHλS A{,lI#L8t0dY6<1$Ho_5b5X0GzD`kak= I l=4J;*go= Тf!=/i(\G5O(+NbZ: ' V2y`blN)`p4=aNȕ4M>dz3ъ"13%1SnЮ[^!eg.dRB1 =WImNOϕ]*@ 0-|KNoRaz %aDٕ89eq%fpRU]'\,4jmHT0a-|oA0=F~mR_:RDNϑ5Ix {AWM1ۙ WebRm0_e(+L`* ή@c")o:^-j&Z-uݩnn.DzMtL<+ZDo\cY aST|DĻ4ٚƔoME fϽwQ'>.C@y%L 81h !}`v~u&UC=9 +UU-A7XÆz2Mxg2N`fP02#&tCBeș/s>]m!V7J*B4` 4 rQYc) `K!VEIǣ( {vf/.JpE{p[[ڕyfΊ0aNcSk| Hd7?SjKg{35(+RY^½DCI*Hܑ=I{cPD*!=Y"~jݝmQ$Mq o C=+,9'EWG94%tO$]954EĮ׉ͮj!N;#rРy#– VИ%;Ժv Z,JTq*춚&0+zJ"+Q#v N Nz'In[>LD* 7VES駴87$kEβکkڋZnj6)ҙpD.:S5g 4cqu}nQo !UJ29E׼d.E%Y|}VLdf~ONd C f Sמ4iT gc%5*щ~ǟE4UFk b@.+̻alUd)dOjbFb=C,|K&t<7YF>\kڝyн6ؠW҃s~@5#>tj$ʂ??ލ?\+K)G`t] ,w,Fhor^q#jÅK'Sjli&CdxwZӼY0V\MT= kWo$6NzC?BP+݀蛮J !%?V'DTfPc]-{.}|=(M]2s[~ F.HWo9Զ4Lc1iPŃmMp=MOFI⌼2da^|h e Q `*1|ΠMI5i<}Y JĬ/͕/es]r{xd3˦jWr >d@gΓN6B( }l"͒'#ru M2[{[`ba~\`ES"XX8T&5mJMafD]1ahW o0s8NW!/}LM mn^`G+UKP\3Bűbm"dOm,>S҇s,}w߀ȹ|,xg> stream xڴeT[5 w .Mpww' qwww. 4;3{g],QjWS^$ JF@ k=3@FVIdD/bmi`a`bb'';Y<NS; OvN#+@蠯jdPe(X;ۿ 3"jmjgfb'+=L" i}C kg{ 3> v~T T`m PT* J mlETIYE &,,$UUˊ+ +k(33Y7SQ+-jlgmW #3 _MvWcAFt0+ȘA?$ 9[NzO{#W82qedVf  Hdh {QK  hg\vW?EWe;rwGo{ن {3{e,33_g q%ezZwW|b2<.&37}HAFVVOOv= kgf #?=7raT:?;3:@[ДO~o Xif |;v@O:ۂg:1+g5_TQid tG?$--T ҷ2tPJK M^db |ߏ ?g}X/?|shhXr;?rG,QFS]gbAFf  ;@N}XSltkB kw `lmg98,NR[F#[g -ߗbe7 hdyOhlwFwF%-aӭ6ߓ[-i G160{%Vf>w?HtV(xW[ 3=~Vr#DV)d~ [Dŝ @̜k`e/na".@CkC󤆠b/ܩ(rn2,uXԩ6|O@<&4QHghͤĶTFE:"Y&.*iY?܈ig׎4#L35* m݉/H^;kӀf1'[t v: GR!(N*FwHI½ ZFN89™jIc%=BŚ{1i:,Sq3#bTvijj"z=VlEb_|%h y2Q"@hkڄwA HNNy&hCtvs4/ߋ(ll SxOFD{~OrX&-W@oFS7bbW:i a!쇢#X}naT,A,rtvp@lͶ : &fS~7 anq@l<9(oj(JqJ2fܔy1LFgiU۳zW:ўJ#9?%R/;Y!(!/wAԝ _:J]]cݘ~ Ҫ>I{^\ Q[vTnQ'G&f%'ƏEۢy;Yd cFȀɨVRLD Mgp1_ ~9 0Qb|0Հ'_FCY~6pCȫ 9@^EnPv⧽\H)tTEgk =E0$$k$kPCe_Raz/?+#NWlQ]_k9q~׶n#[. MϦghP2fⒸ4l}ojpqdKBl=1.fx/2\#!id~>~Tjk@E2㵎\7\(4m 6RULvN$=D2P_ 'L|A$g\x1C~$Ys[]7o ɽ^ݷRRWwڂKr3Hd]ңa|;OdtAFL;b>qsqxV,>_/ TTi0x㊠cJvĕ 7+D븁r&"t}T=v*D@nO{N ٧NU(ʞuK.{e-o(cU Swj~i';s}M8HMAjw>xY fK6yꮐBZ|?"6u5H e&me„,ϡȱ j!ל6x$_UVbe;jE[r?xml^imI * 1PK02|J1\&0X?TH&ۮ MxWa*ȇn| t*k}0扄yr`֍mE#k=]3 a?keA SgM~$KIPS&o~ &"{]7P$~Ǐ M2N'C]HዦSЍ_f1pFA[oxTr*dyK{K㑶-#" !FQ? N`bM#輋WG(Ȗ^^s,YfssG y2 i9u8_ +}zRj{D%je!nLԠĸ$lڪߝUv ݩ9AR) ;'Fl #ĦFLR/רbX[LšI][} @]akfv6 ^=g O|USC#@}ͦ'`\$rbֲ^F7(?$rUdϧMOS)㊢evˋq|NQkx&JZ>$M^3v^kvJ7hOeY }Fy7U%>[rp_iD@%,6>t} 0,.RE~ ym  gdu FHttfR΢Aqze:7;O.k_X7u۹̟]m-Ni ǝ~x`k>mbK{4UR^WC吡 ݆/@?Z>8LAJ9~.#ԻU++q|>@5` CV%+'o\;Hay6ڳ}1Ej=7_KzH86"\nGT3Q *4yବA=Pgat,aX/8>gPPLyЛH_id '뚹d?:gG6NR0pR͂!Q_*p*IpjR3Ho,KGHY%Ii٪/ţKR\8)?m C[ZvJ&H !XHΩ(2ԅ9m M…-pCKxlQx۪mk&ҽC l L yJ>EFM3I@ِahC^8&7_wr= yy,m4:V|>n&pk0Za^KT"R^ 3JQDƾ?f*kdnfkKgoI -o]si!s1 i>ݝg-T#,V`G~na+> EiF`Ķ!>#hbQ[ $tiIP?٧J\@ ^7#[AnI+FOSdi`^0k<ڍ2޿ohQ%\?i"WZ8;r#rSן8QMM6\@FH{.z"!RuʤMcF3~|UMLR1!G$+Z2ĴfEKvƙL5` []Xf u&uFEdd)ضn7>'Yї~|pkVFA?]qM=wx&9Pۋ嗡LcsJ?,eE}!Q j63J q=Wu'>  .,l3޽`f&YÙ3 @IrjpHy=!:jAae9;4{#b;J-sjH??CB_|ܨ: -sF`23m{>&j(-ŮA+j!XK{Lm ~:A7e84QUVFᴣHtH#]')IGO$r4!/ML{pp?H?tC Jݣmr5Xزu +ZwXhv* |- #dJC zLK(/E.M4I9[kw-7} ▃G#yZSRlF=MSxE[giH.im2woUo l\Z-0M P6Վذ%0^tj^D~i%M_O0rBE~`>s^?| Y,2zeҊN2IO&'!-b=C$,?Ћ@. bƵrQ"F"A@|I\Uށ߂VE>;o m!PT@S#P q{EجSbx+σVɑ d$x<ӉƩeGL 10k^pcU֬ E#\0J>/9az~;s uƠulh')]o%^$cGy1x9ZaB3< 2\xEg|r,#k^.0J;]7)!i'4[M4V~9d.*"Ty8uz2\% }MxpI .Mt06Au"&8x,w_8Wxo/&Y˿ ]\^rm|M!*F`f!T2Zً5E2v*Ѿ>6|pŝSik{:f?u2TP〸6,?+ Fz{H [\ Q<=Î懭nW" X\^00M_/[*C(wc˦YjR]<ҁxJU$0X$L9lqr&#I?Bդof$_WPSPQ ɝkhҳz#zbAHG-ۊQbԩ5GCQRc ugKc<T\0hwOk /mp#Zz0kf Tjv_jR̷pZke'Ji;̊@<ꘌzI*M3 /EPEҹ ?S._?>hx-S_)]~": ?'B9D h a“M{z# D5 J^8g|7}9ʨG Z#"'}>69D5r ~! V{6LD3)⛐q1jPKEgF+Vl}y;c{+@zME(kO5]}tL.c;d(%1c[0|93Pv#u3L<}Ę ߂_uP1)l* k~~qx|z~p N)Pq٠Olex2Ct(Z!RkHOC%LKK֒k64CdM&qY~2-QdؒH P*n$w14=v0J c}.EvDe,T`w $;%.thA&J_ XIk ͒⛉Wy{:j3hmeWuY<!wGԇb)ƘxJu@d}2hC(>(U[ᤆ03(}b86v7[)v=zqBD-_3)wrϗ/hsuRYL6\q f|h$ Gqd%25M7肣椬R` zxwtUXbrQYpA8nW 4weL.NM2a:\yKK>P4U4O8?hXe1)~ z ~p U`4hk@ Qr_cZ*$膫J=Gǥ!>3šBdX>?\| @=Vm>喛dngxD}sT&6HxXY'PTqd] YS +^#i) W@9=f/{ />o(6r9D*|^N$!-z,{ln5Q< 966sƖwa7j@/A$Ҷt)[\܀3.gN~V=rEXB ƶ%.XO L{3R/}Y:dz; b* hP7%.ʞ[2~޻ݞ#\nၤoH2J$"JhLnWklYLv>p{䛱18:dHkRJZXw 1IfwlV!wVŨ;>SM]GXzqA p@Jp )|[Oe@8*ʕb1%lQtIřrf mpH+v@YB\o젼C5(+}9,R،N"Ah-} =T8A>&L$u3JFҜXۛfMt.QШB#F>W7*&E<3AG2|7Q'RvƟ;ϔK1ϒ:D<<>JŪΦu0)=Q-F"C@ =e1gl >n5H~R/uC~(CD<.D|+wM)~DC;[Iv6#X.X{Q8(+n[b2zSB.' U形j7Qb۶~3Rh.Dr7s&yOUQE0M9Ppa⪑ZV vy0n.13wko.+R_`E%8n`BAtjeĩ~w8u}UWSϮBOybjΪRsl 纪X^gogEiUcu2`Wh?jy`(5 . '6 !@*mmJxGMYtED $$/k3E1*q*a4p(NȮ(аEN/5fϫL8gL;X U q"@>ض`Ы.Ν-<s7x$×c)H\V]N&/6ƺ_1eN=#})63_l:!C:֖M \t:T8>z*]A1s;d1`jB<h8k ߼)t6.@U!b#ٱC1}܂̯ kTMxc21rVI"Pbia7'/`2) l~VkV4r'LY~a~Vԉ)%l?C꯻ as,vsI)6I>V5q%bǶP$ 42׺c (ZZwwn F=͙Cl2[l"YI vT9 DxvKfXb~^׹".Wɗ'jeB6&af=>ŤDPe.#𻠔R0R-ictbSrmG.AKO !QpW8`TnBQbTۮ=nwR_Vt͛=t|v[[!HxE =RȻ1`{%eKEIYDVn_C3m)60^% %x^{oJ1e> _N8}اn톉"?dߕdq}镰a&0>E%K!tZv_'4gX13:g!E fexfzn8෍~ C}{5r?Ia.ݖ$K{[qN8@\^m3y` ې&XvJ8A՗~.,'*A,.B+xium" .˗_u>L uvyGipiGb7y@C CTw%YRРür0:7`z7PW T1HZ? 4;} pPm .*.(E+K&Ҷ<)hį&d`NN͖z}ID^<>3'ʲ.p`Ƨpx[fĪH¯Ub̫K,k/[e-4G9 քb}&Zgs|HA0ԣgZ,r=>ːZ_7^]IS+B#<ըݚU!͸yvL?^f *9Fq314 K(D"tt3E"/C gyB)i)7q>@r_4,p5mFHӳwX>*"_5 gHMJޑij w+_=qa~|n"iCN0֦zZ}NBѪen2+Ī/Opd.X̭t̙gQt: OAhGV_qC_ɮ˘QT- 5-;xaˉX+t^}`$ӽ6R33<&1nt/h:t6)N 1D-ȴ왟aL)VMf(cڦ.͜@wpke[3Tthed(,<.8V!XS%8>ńt6"7ކHI9 Zw/3C';38&A;5CډKJW$P$잧(f8i蘑9TOՄ 10x_HCB&(Sckߐ^8Mr}H5;7`R3gkEd:WG,P2o|%pXV2EUS\瞗1Lڐ-FY+ur8E"Yǎh<,|#'6 U go.KmBƋjiSJꏴͤ#%}:iYȲn#tnquTَG҇_2HDA/z}kZ Ir3OϾp~DQKX~ҤZ\XH;]7 yhPixl(7v0V(̾<] v`O'*^Lt\MqO>'Mr'8' Y`%'.]`c3{o=7[ r; & +[RTcvcۚϪN e5#`1Gg % r^`8K@: /2kƝV&#Uo!FWiqü/t}ϛP(ϲǜ[:S@H'89\;oBOl% 6"}T867,1l2~Ǣy U]! Gؽ}R4q V="#IFuZS"@rF%*rD 0jK;}>ãAv.r]n @j$Q'ӚB5Όb6oNllvLlu ,F1fn3i0!"8[m48lYy/l u䦄G.5QєĮKL/6*9ƹ˻ 2Vc|mn0a.F- j:k7S$ 4 dK U辣CD5`2&fhJX~$Wm_Rincv'2bI>uPsh,Tb62Z2y-^] *<0@Oq,9%އjOoC \'꨻[[ EuFLLgEv7T2HfB?hj+?Of[v@Vۓ(ΪT>T,4%a:Q3A-];MLEO2i&] V9Fd{S?PBesZ36d *S fRg$wzFTW#תt^YM t̙nn0MgS޿;xhCW !,jVsR޼-o)2lC:rF%Hrw$S8\*a ʼMAkO;2x^0OB^UQ0-=dy>*̾TB<%t:߀E/)|CU~3I,Ĕwr[ C_nZ_>s{~5C=A&mGƂw{'.P*]Fƙ_Yli>i ܃(paë7D YS K"1$㴼e;[54ª0Әt$%w;rQ:7ޯpC8[(5vJajd(XYH.v]A!je'l^"!ɦaJr.kflj@AV&px4չFJ^+2۵@p>v9@ „]a|07=2OܴmDž}ʇtݢxVM qѺU9]ɦBf'P5Y*Hz=iošL$!lnH`fD] ]&c72[GͶ VMJV^UDi9X|Ǝ&iDroUW͢l6>z%#K N90SyVW&}Ke,T<کBJ~+20DMH/c7(^hc+vN7mSГ L]D]~Gg>nuXk^ xdu/6`<x;wI"%ZbUkyy^#E(ަ%Q3wElh42iQ5麾9*fmL-EX( ƝrZl`yUI$"Lr&UNx"%~@۹}*('x~ WGSθRHPۂ-nݕj-BJQJh$]"/JV..[f *PLxTBa5 `.#q2z1N8bdGI"@/MF6ʞ]|;rKrP8ƕ.DD布XƦJM+<-8R)mDTZ)W wvP4lwK4]0 GZF9SMH:]lFA x|HNn>09a'4Dզ;^+BYES' ө$ { @b4h +Q%Ȟ}*6br*٤ e-͐:24XFxveVڡ_֬k]-TݖFfH+>#BK-2"jܸc*'Mp'鰀[)*d;EzOZ_ 壆$1` ꍶظ&<`Ӱp^ny$SWOtͥ<#{Ў zijy^YEha-(RM_ȼM~J؟^j_ZR?$g3U`1;z˺V\LF;břy*n`yrRUtv`N"CǓ +U?oDy2PϋU)IFs,ɂ'M6sMw͸L ]ť&F) C>ߜg&cNsFq r)qS̆Mt~N v˄ЦnB0jUD.Mɞ *fWowT9-4yr"c| d9  f6tNqtB2_W?X=ǍIݲrq3 O<¶AEGǓ(%P $s}bdeJ/.F;J,t0tHLF0q{zWilځ-=gn_=(5 76 ]%W_ -ȃ5ŏs}CMĤ}Q:. 5!:c.1I6}U2>F\Acy]Qph;!xŨ?,1r6;J# Zi;٘ŽXw8'6e0cOe9Ӟ5aC Lz;]* ',QBrcD }G|V*[聦sVK5{= yy,YxWa,tu}= !b`!y%Ipg{;w2]ťحV5ӌQwz"ρuY5f j[i I8ƇMl)1Jb 9󺊥Br0^IuSSQkP[z&hŠo[T{oKJ%b=1B[uJ&p`%蟼^n!Ss) -hQ$,TF7xNA;G+cA7I[vAq$w>-dy{z: 1GV-_4=dzMJhZ%yr,G}yS-v- Ƌk8 \ϢԮ&8Zl*Wp54ڭyy!t¾ǣ$?!IvcaɿL0u~\[kU3hLsnNR6NzU/$F[w&nL|,~d  W@K|C9ݖdžx},J@<\p$l .tSS镛EɶO /quˉe#ٙ=0fRn G5PI ',!.fY0hac0>ԡhxyV ). tGa)f5&7ά?[>J-?7>\YbYA>dfIZ4-i1z_.Qѹ0Ci^~jMGGd?}n7'QEIvp-1jafߌ11QPnQHv [ayx{>~aUFJc`nkW܄ˋSVlA⍞3W>~kjj|L6*~L̃2 !Tmno8:ʎr'k}5qAy ˵^%l#AySKZUkL}%GlDHR]pI"%[ p;r(,h;`2E$hknjYab{e(zaX ,Ru/1٥i)x?ߡugɎGq +0ScP1+kaIFy~4 !-7 %e3+fU>6R~&ʧf鄮IBA&?֓`x!xzmU#{ ؆rb }₵)W1@4iyзpl@"V/gv,Az*Bנ/#U);KQ(9I^[^ǻj8 5~naÚ'q aSBM#|9 ?xb!H޿9M`YV梊Z o<;QَeLvesgZ*kj'%_8w>&ՏH-JfPGZ\N&,ۭz#/dyt3&y5'=~޴90S4DoiMXu0/ǟnj /s :SBƬNN4ZLe ziU̞0^euQP\٫|!-u3X&M3Ts0T"ywX`>ׯL7TWt [Z_FXF0Q,tzpqA_H/Ba(9ܫoJr6t mnm2$q%փ1f2Dʬ^fő_2_=VdXZc#vPSG&)rBQsvc:\pCHx?R3TXmx쿳9I 7;,sKKW*K0j "}GY@"JQx\S7=Aubi9z|i^܁t=|0\_~- tGEHg<*úz[|psweQ]ON_:]9A@T`'&yb],^T4r&T]Whיi NC)A¢ 1ZV:~H@gS fy»-oc\P sZ [̪t>Nj\r*jj9 ݡ&˭Q<`N~5=wfbR۟,RS,:"G[Dۜ&6uD$3 %R(?p'4[Y\&X3U $(}J+I&7BqX(pL}f' ͫ5sȢ x;sK/^[&T$۬%}/.}A<8\w=@6~GSf ..F1_˟afJ4qozͫLZFQQ9Rq0$AJX˥"*^@tO#IUImk+B_ġ}ʬm]`_%^'[NIJ@dQ`nB[tdOPxkq<_s萌u աM@8XhRH}j ި7H'&>ߢ̉+ agdDSSш;%ewQށ$Od4Vn=߰%M/h㭏NJ\?oX '%Hx3Ϭ+Xm%7>H {Sz'4` vE> stream xڴeT˺5$и[pwwƃwwwwCp`;}Yk|tSѣɈLLtLYeC;g&F:y#KGS3=##+!Nh Z䍁NfFF.82Ӈ`5x82(  @:#C)GO :?d [ۻ9[[ L_ernFK `oP1*))$U? +88;eU ZT 篊sZʇO?b*B* bL `:9[i_?jdoWFo w2w3djc`\L> 0W?46s6$n/(?>%16 8G Credv@S;C;@!`Ԅ_M".NNzmM]ce:6^ކncv.Ξ.3K?왥_6Y!9)q1e:Lǎ+O=!Qn'#;!R1;{[p'j1'kk;{7;nfigbg&. vlRafn 0L ?f?1x{9; mM-L?^༜ ]M@'So:1qL,B8,pU3p߮_㔚xLLW/q9C[SZxGEJ)gdkh_>KgqKwSKſ/CBv6:&U(~>.+>Dilmg `ee11? B224j 3730 =?bP_Z0?R.@oܟdg`0 #N"Nf߈7b0/0> ?ڛ~72Y`aQo??:~u?Q/{`3-y[ +M-M>"kttf8L P-,lEcȇj?ruCu#|05u75[Y7 Ji)+)$?>Ӊ#Kl*PA^h/#ɭoWAiٖX5}c(g#냏$&4F!WMLu%'_u.=:~"$ַ,73ЫSΖ xk#u7ώQĹbIzc I撘;W̔34т"__soCwƉQnLp;cvN0<{CG5Xɵ u `TU*4Mn`)_=O`-$}^"|Ayݾ˓_yDgm]H c VF ;}yNӣ[9 88TP$!O)x^B4I6qҕXzAɕC7*4hYFؘV9/G?uhqx >x~OčKu(3DT!@BobQ &e\At},2z,Gjr").{fY0:!+04̝ VH\@!:JbxlsLPo%!Ė.:{%mtĸ*tVd.fc"prct-zsOڷ3eh(p+}Ḗiܼ7+޶ }Hr?)&v!vm$z<`вz {&3`R|5:)js)^e\ /T]ba#Hn#=& w+3+< sXwMLDrj@4z5IFB} t\P?xchύ^,&.m9ʵmhb餟U05@5o@Hay o6M=oWAʏ|%ZtX ; ç }ǢKq 97]Y(!$nUMQwu&DwnV}guMM&e5H-PXrӗc CMƭX<[hvf(S=,%jX"|tfS+Sb8۹68b-yp@(U\wg[{Hx&ʂVTi@kۇ֝<47RDCHVcUX^@ܦV 69Y zUL' I= }SࠫVٌv/1`9ewXYH@Eeŧ\I ΟWX<bsV({~*~9f'9xl8dMމO^>SD=]31aQ63e.u|M>=kXn\JIկ9Ae~˙d>CC K+?~z8 lTU&q(D+h\>N!^{A263 6O_z< I ,K{uiNl|ʘo~_'o}16d 1'!mڱzt&?%%EGkFWݜKPn:n48'ߝ_Ң67ѱZ|F=ք(^]ƟDиsk o{Z;q0g d}m* X+!ūpQM @yo{7OУy]ވ dz;J6QTe80!n)2@`A,:&#b؎VC^D̚6N(`+A_z$;JM*<R|G?yo;}]N(bjB# U?,H&~j!\B >~~0\MlLH]y鷈 A\9BYRA{׏ r`٨Bu B0*u[卨+79[רRN.J"]Kd(|UwEkQpW֑^цk|)c^72gL$⮭KOvBBo~cv-qvu3Qz .|1UmO #ΰkCMX*,_ ֞B; 8ǐJ[vx}ƭI3dB Pq4X17N\-gWbťZ qlbrm1Y΋'AMmH`bY_Ͷw7/u~L,Vv+*\J 1rPC0 'zhVl4K 6{<;gs*oqø_ f&GW҂:8gOPkKr Ba\Q8C\q <=$([=($=<s:7u2& _l ~{;"n:BK ,lNvտ]E % & 1vwvjj&tYtaBo QkZ<iϻZ)*.t a (>' β1:ZP%чliAGtĦhBCYZU13Puo_ΚYU+2+ NSh H@X{3Sq@^fAZc{Nx=Eٿ Nnq7yΤ.|K0pDNT6/~~0V>mo/}4 5('thLDK>-Y9A6;2瑟ײT; /-iF†F2G<}&SYst^*Im!(uڱ)@wI蜫[34{&rRߦ슊ͭmS`kQ4a/޺hLȭY=F'mI3ͪ6ywǷυtA-*1kfIڈ%Symvj4Dz\W{^p]l sǣ`#l%ޭSEܢmdqP@Y_rf>-T%ٞ/*3[~VyFò,C'^>~Q|u 2UǮ6B@ͳ/MV1p >6Uܙ7)dYc"Ҙuмtlz6A/adţQkTI9.d36CAfBNd2JHi+ ='q.V|1{I\Zwq-E]. u1b

؁8a~iXt*~҂"Աo*Eg[Ȩc+MpVF;jFwut.X6s/ v oBAE^MN}wLBvgz:CNSƻ9֬P|ْ}?_"bW/ڊ!MNc̽0ZlJgеi1pqəcJ!RoUT7q2"ae9 4,GrVkz0 +Twu"8 \W%J'`qiWіUz(#6#i^&[N0J5(t((4+ ㏡,o˾SQke͒4? Kf^0t:nR¢3&sy~)Fsm`u>tXZFb!)9=' ˀ:b8\BqնsAjieLj7>Av)/)Xhn.O׎9' yUaɶX*Lp qa]&vl"jCb3ͪm;)IftC{Z[ch8^5ĂszPfo.%Yb@GTttqq;XZDNYB S9K3&5m9X9gV%`#]k5&GPȹןzcX~'F&~3K=L}d&$$\ N]EMR{m T(n0npګ¢՟pfɊ.e_!TNo-f60?@d fᱡK!g ;noi[1R^`7J)}՘+ sG }t4,!yGI &-=BPv+tyy[ y&K,ˑdҪ;/tv~kO3!Hǥ>imd쁈i: {~yFHzOH(*u"T9lGЗz_k/=Cw$GEw;5+UR3=칕@a?dIzl9d=~ n EgZ x4Wfmݥ4X55ͽw ,8b&tB|șRC;za+(_KN[ə m) ,7~uo=F+ʸwKztfE͏N>} EBB'~@7>xCQU8ǒòTѦ:s{qfsMmd=5?:v\Q(ϯ \~f$u녉{:;:g/Cw{-lG݄ pqw/*/geEfO|/m1M& B(مӚ ;O@&Dv/'_j*"=H:B:m=@3Wdپ'.{+ ח1/ Uw̗,.;ٱ`XvۛS V:ä9xH `xѻ\xB9qL*'JНXfӯ4UE}-ѹ|ɳ;A]zvۑA݆5[~럇CHybb`]Vy`rJ<ԧnцffl VVn1yF0Pnl =捍$K r?يw=A2WqEd@cq~jTn%G [zĽr#HנjETx0#v5Fn+"˷I͓_1GM O|6\Z+e`k90_qMVnD迱O*2:@c MP5{ffžoDV, BPh*̏>fE%S$gx'Fkꎳ Ceb, c(,: PHۖ4O*,\kjcXu!$Fѫ!{mgD_~j'#;QqD~wDQ^5 ~"!):F47`U|OUIHmz23a2αbɪvyF&opH)ZUiL.|Ӎ!j=*:Õ׈[SNцDž ܱ]Ɛz-b\iqz{Рѽ-[[O:_ D1xu(㦻KA6PPTq1Nªښ8l %W+m "E4`8mLJs؉#9P90߽ȊD \Ҥe +}PK0>8 Tϔu4>ð4]b:jKXO+fS+nn픮Z 3dcO{ J,-3k7#\!9'c=9OPr}gWк5ce륗GQ TȆFWzwB!HKfMxK >nzdC,/PwXxiۿ^mxI2_eϹ^@D@#ʿm&E]$Kp2]ȓǨ(Փ欮|m&kV~9cM5}Rs2m xrDg!uMJM02-٠XPvEEc瀳3;k*e.bXL'OMa$mu e97B8UQj`aN%`‹0$HkiDcvHIfHTPM빷VmFo_B.g)R{y˸_RmX{~}BQv54enɌO!U<Ч9Xgڒ΀ew[}i ͅ]ih Tq/GDS,tzu,^>3}iCSS=5!)Ԇֵ1"uG2;-肝Lט,87tB\ub8fJ|e!x/CfReb ]-ABف!-dyuG:\nQp}M.Fh^.+Ԫ#LpK!,( 6g"M 'u0xK},=ѿ(3RC~{8xD"7HRȌQnzY6-ď⒕*Qa&6doHy,6eܛW7H fLy!S=Wrܻ+9h%,ymnzTԪ%BOwO ;C5_Eg d?f 28Wd\.riQHr<h#-k9 ^wVumچYA7` *@.Q--j_Ic!Y?fx gXV/Xo̬_!"GuȏIy{ʍ6sU|/| '|YiAZv6P==*pVW |y8)vch ޜ+D2mwq xp;YE}WWNbxO\^`CD҆֟w`Wt/&O*nC/DlbȅrY/|R\SIby鿀ۯ"7\'ƣ#O_DuNw ճAX19Q;!cYeѥ1XPލ|Qh̹>@ٰdm4$3i-|B<43pPf酺=H.1iť̎+,2tY|&זQXSXLWY,WO^0=MHv)¾\'m,EtU팀˾" Sû.o(se^ɕо(*>7֭AQVO 2#ʓtae'tĐͻ7·rOl玬ٱ bMqκ:B)\0s<#i[Gn"Z"T_R/zhSҤU+1ӨZұg1}g6{0,KVjRB8)̭9҃enƲ@i|Iο3y_#ip4\"#i<4v#ty{O|P 1YP]~5 {VM0m@4 +7xyQ5?>l!\e԰ÄKvӨ _VyO;E p/ƾhLie|: 9(کԵ~|O" wDzTbV,ϛExho[9Pe y/f,w"jm=N?ӝ6vA951Q-ZY@yNMʋ šTE4KP-sT\ ,;H-da$+Fv}lPR0o~eExFErŷWRVw'[F`:eG%,TRvJK0 xqbx9 ꟻe^m mȽWrf%lUA4g `l u l$w>/A겈US|U1Xr0=&^0.ČIY2KpQՠKYOc3\+3?1csMȼ4zFe/L;}ū K?B)¬2BޛW>QsU7~2C}Ae. :Et d0ٌ HJ$;CPQo=R{ _K#16Z$Mр&vr{yV&mϘ4؆2(CR^uZ"bG*gLR7쌦KT=ݥn~AN`؈-zATv Cuj'#j}W3i;2w\+ƽH" ["xG=է͊#x?2AQHQc^$-VG ZMek nAJؼtdPz3>3CW;07RO;2 S)Z/\|Ӽ`h&V!?gbXpzr Jk[> MtmL/O@}[44PGApsA. Ó ~k] + kZaqN2a|o)J֨B#ouR帀nd-|Cu`n0Ǻk$ 5A,kIh7QūN/Dt<'"un 1\Syv߰"??*r {י3B̕6OABN]Jw];doۖz XXA]u%&g),*ۢ3,86R0`gEP"E2Fe3.jTGw ޱwfO* KQYԹ+VDcB]gM AL|92NraeRQ^KdۄE&0!6 ȸl/"EZ\lVGa jϨb9+wB_1JRf_ױʜ1 YºL@)}T9>i_^ +"Asze%U8:8/ bہ*w ( 8]ꩡZG'lMi pBl.@I2EkCb p}s~.hvqa^ߵ0^VZu|*64 5425v]$6$Ny*́sFYm؃|3enM8?b "0ycA]3Rq(T-szΐh'#B5Ĵ|1A&0#ZY0NM"U#M.'o-c"JEupk{G2hRr.#-GbAOXH>֤m˒SdU"^r# 1!ڤAooC`YtsZ]g3d.>FUgSA'UDfqP9K$k=I+ɩAc&꽲q{Jq"E}j̮*]3;+;Wm6f/(TA34>Dt~O7mb 5iE`gTlR3 j]#e?`_ra&FK:m`,^3ap&* =|`+EO2wD_ͰB6[@ޯVŨ^:]&6)+N0IFN)k7v,+*7qAe8.sGE\f X#f+213ӯi?_z`ƣ`X!bߢ]X70psP$΅tB~#L*9+Y*+[7YY#Zs6+ZVa& {!*Ŧ 5 ܱCB|)hp7ޕT>SHHB:2mnlVM_CJWMp\>0K$.Ϟ,ĜR[tGyޑ(qi; 4yd ~ +fanoWo7RN ?|aIHɰUD1=qĔP:2`1H g ra9)g&ޡIS"SL#7 )Q0_$r>IoL{j1tEy=E!bIާs%xrL ~Ut [R]2F?==) (M|I@aVG d:?—|0dC(`0(~j 5JT jzɘ2쵷.\[E;h+ٽOےc~T0'pw BEWޅPwRjJƕaYvj9WgJ/ip4J)F]{'U@v9n]R.qm'B³$,ylŠל=䪞`D+xF;pasjtp!G-+Dk:+'G_@taF.HIiCצm%۸|[RW]R97%N]7p*"PȜ;=1.awRB8-@ ,% ՠrb;O9a0>*̗lK3:IAtV+jS4NWBӬ6|/Ɲ`puO=S;8$l\_E v">kH2,;NIɰsh$mc}Rq,?o?Nl2{hҷmCe> !G @HYۻq+\P'cTs_9\Z)Y}= j?w7BSCIwqޥ0;g֏djڟvk_6"<,hDI;%T7|łFZ|8Vvk$:mB :I7y0ϠmSfN%i݉N9UaS̯>>MZ܂}5eGWN7Gt} O_'xͭI3{+xKZyP aetLG1Ez0@ kg2ZR7*>5]ݰY̻boiF 3Um\a#*cv"J5\㡓^ :YB&ݍ=UDNw1/[mt5G^%uq\ti.X'w3~ pcLI&Ѧ̅<믝nqe?iy?ܯ*bA{A]n(34I0OD>jз}(۰]l$KߋgԲZC).jZ&By _ZkhS88 ȯqT4x8z}p"SHpM~XJ1+̐,Pz.^p*ܤԭ˫yM7FmGN}q^5e6yl8{k%Zס(4tWV;my:!PlNqV v!%ϩ)?dyFdbi7 (UVKq0brsfu^sWo?xVX2rhTi,b;tI=k|g:QmzEkh4zi'-|Xh69^ՋUAR?[c1MڙGӳ%9Qm sfk}a@sx">=lTJ/U \2. { N4}myzVש n2@Z/Ci q8s-ۮ^x6.Ҳ2v.wu[7{?稾8 ~*9Q.0owa׵nqdV{dT> 30 ";%ߖ֚a/AJg6mJq OEoSjr?ɇ鈄Ɲ?_5+=Ʀw>[PwnV-а{J<}QnKiWy'Bb✨>UxNտqX9*&M)@clIY/RWkZX.dOԭ[ cLdd@xyHTbf!GPȺ ;_$o@x-,4rˤ)FgidapB^-_C7KW4^;hM¸:"o4EɸgMxMPǔHW7͉9 {YNF/>AcmdᜄaGKE_'y;`S8epg2, ht_h3n&lׄ9Qõa(.Kc&Oz5N=\R[la¾fjVm?lB /ȡt@07"2m(g'ՠixHqZ@gŜ1~_}~:ʣ/6}B 0x1=[s/mمVઙ{Wxo@2iKry݅^ g?;˸t_(?[2h>rC, }?j".v >hn9&CeMFL[lOeSZQ;YYɽy{Mb}kwe@>4p̣ETzrիƻJQDmѝV](*o ۖ9 50GЭGU#Vb%/YE6mPUH}h08J HUR( I- Mҳl]︧XK+↽2cL[KM|?=O՚N{&_l_+1Guk y˼#kGccJ_GG寴M  Bq6 G&{C8c :v L!a X&~-K~<lbpuzw |o6Ÿr %.}@sW{h Gi*E>Wb~bWNhtN?S# #gE6hrHBzM?ō JDIU~MB\c|2FiXY_?NJ㼗}Z \wY'jkz&z`̋aPj`\oa9dPAggA @DWV~AÂ5AY 1COߓgFx y6us۠klJ/.}mf<jVkͦnZftvw֨6~gC`=T^_l[ be3:ICt{;ehPC ^i<(-m6!δPn9 Q1s e ޜrmdc! ة`?A/C8XWqNJ1C+\f{!+Q ~Lo,,%l]?s@Ar!"NF#5}v.%;1ӼAHd{f䮨-jtᝈt03~J~iB~hHΰ1HcsA{:lDy9~ͲI:>^;dj~è)PΩ,7u$xQlӞi?~Xb P*]n; j_. 5͢7LO0^PTJh2 s)ԕ-*uεvr1f"tw|>(l{?휘:?[$RS[~[Ec0{Of_9haUP ?Z?)͂z^ghRR<R9VM w ǯ>S@ 3V &Xbs^W(]%1R=w2Xtr;VtmGmi7q›hQ@>O2F| .ʦtB])2rߊ$T4R|S8ѭP'fMg3OT+-'6`iy7-oܷZ8|M4odY;o."'R)P!]KS%1eZyn'r:YɌ-u.$k\r6qK*vHK]Ͷ7)Dn]M 3w wֶtw{e-q=":"u gYTYţ9%32f8cH peHAܲQm*lkjC"t%L{=wseW4Z2NֱlaY ,ӳGnI[ 7vO-15:Hu>\(G<"sCnN1w4#O꽎?!:4E> J^O]MCRVL~4]5:~O8~Y)>^)Ԛn99}B- PviHf ϘSc]S_FCuFMRg{\,ɤ"$:йc&qH|m ADBBN )ggjf :vtt{M&(+Dϣ^!쪩)'~*u;S5\0홲T%n]zK#x8q_r93I+D f{ܼUܙV2gpqf(s$ҪA h5[GB ^,l5YvY 6bIm/-O$qӊB37W'v7'-l Vm6fZ얉 RlduS+2S7>MA&o5 .gEj *eV(#7ښ҅h-tsu< L¼b6 NZ{FIMuャUt1jFb3o㽌G\'Z"szG, Tbܑ(>͖[5͈s7t<B:Wh),;~ ::yKxZM2]Yؙ QXk(Vؘ)•.!/VvïV |Fh,:WQ9΢>_$Ep ׏ 'kӇg6]Saiu横YI;i/|Pc}XveKt\i%侭.F 6[> stream xڭTeXiC%!RnC@{;9{]^Zz&zm=.0w@rq4Nz@u.Y8 w b31! @$ DBF0@DEErpGw `55bw NPk w8 !  9-mcM%@ AamgKP N6e@p0wkNX2N  CGt:@ ps&pﷂ!䈀gNH'WՖW'] z3paH !ײP'G=#_ 85AaO_}G@GG?YE:A`V|5APlߋ`;;#Aa'`0 G/ `? D?qwhEgLh=0 \=ohQA `}//7_N" ֆ"A6+ ~F`ukg.>Am ;C8^?yT uU 8ҾWxOЀiƐp ?p=l^ @$0oOz7{O@j; rF s[g!7{zMNKAgt˛6u:U|-7$,. >xʾLciJeQ{=ekH4Uc͟</e("rkLXglO]>0:{*HV?x\qvtѲJ!8;a> q\q*{8@j(cifD_{,l1 T;=.dSs qm@Cgu`ŬUOh0G*ߒ盿0}YT5>JS]"L6l0f6}7*!۶?ӍkjG/Jp(ߘej|84"|tkFóV~[|M0YG3P.-ZHIk\=y^ݩ;!]1H!m/yztY!sOS|WhRB'ޤD)sVtn5dM@鸏%>U.wHIBUXd'+T~堊YWCgq o+< :@%n^ՔI@06sk?ͨx>`[ik3vX^ -@7Şc<{OyzǓif^^>"4XHeZGAtr~苢6BƍH;^?,s+9;d:?>2!vwkF¬D>Xv;YHV}$Vݟ'Ph._>O'_ȓ|u1FW-BR~fWD&yG-5ˆƓ~[W>; q2H+?SuPm/hyrUuf˅ Ł(]GlFg}H`Y&_xgyKjZC[Ӏ11t].e曏b-57dm)(L>]`$5[pQܙ HXp d Hq#N4l'waer5gʶb[xQw!F]rIavX) pcTHww:z!"rX 9|8 P\k|t$|Lr\|i|IaV>H('p&tM[~%ּ8MS),s$grWdz#IOԽʄjw _ª)ō*NnTF:Mi;wAk=DpHCş?tf^qĨ}~Lg^u{ eK~X$H<߭@-|.3n9u^FvlߵxmV1$$]OODe{ LI ""4y^v{gX -?u-5@_gu{*92TdMI;/恚~>..bq hr^2updkOz;-~0d, ,˓ 7(QYYNù/1Ve]ڊqD,u{97'V\|1،X/ڣ:M$|ҙ-s͑aK`XTOj蚺*=rsq4{uZMs֔r(NU4d8C ,xfJ'nQ+w%2(2?kJۯ/^1}~?qS^Ey f?ղ\F^5b~p#0t_3?B=ң@lX=`Z!łHy{:Ӿjѻj!%FE֎c`Zf0ũv#G'UE,,ɏM)9Z(ZK˯>W]H'I0` poO4 uNԝˉq\/5-*.j'tDT^KA&)F3pN\^IjZG8-z~^Zg+8Ey ,LX^cRIcy tv*n=Ѽ3teY2zkbݭ:7> 2D-Cg-Ic\ :mI6&R YT 8gq m`m siIe&OKV~ax1zu͔Ì_Ϥ{\.ObV*9,0DK~Sou!pwu=+F}[}44=Cph 1n^ yg`ӏ6+~d*m[=[+IDj4W5} v {fmǷ';k]aKdNkui"~PlbJQ!gJD^=rlFNj!-ZbE3Gvu$߰VF/5Xtr+C(7 f"UJ6,w .ڗkZk:RӀßW0I %=!9#cu y=XDsأbmBy'Y J !4MK(=VRc lOˬ;ʷ>r-P٘ç'S8}-֗@HnTFĀ]-HZF\HcjW[k]ѥh66}J Rw"Νkmbǐq$$ [nTm6V . (γ{]g}Qy.)YEtNBQk5Ғ2]GڝC(c^ +l/sZ+._ 'g\ah튚UJU,BވFL GvD6g(sZТ  .-_ܭmUtmU)hIObz8El >TRaOXMD2]q ''wy`PhZd>kcj:"wŎ rgkЖk#0A3\Z; ri= ?68R_;FEFDqsWrA u.ϏČTꆋvɾ5☧kKDHN\n|]Lj- gɄA!gcxҾ5>ڭed9\лN]q:j1!A>kcf38|r_5VxE/T\c~`2d7@j?Z^SPi ,۠eL>0_&ˬ= _W##{x@eBNK~%C47_7"vLr_M[] OVag|WVf+^Ցεu` pkţJSXs KqR<#mEW} gXn-ѥൢaDZӮue<$`n0FǤ04/pv^f8|Y~%@ ǩsݵa, Icɵ4x6+ogJt֋ wu{UT"jLho0"ԇ ߽+ Fygѹb'm,@냖ǢoRg2<#׮)N ̵ U2]Xሢh0n΄Xe ]}/ ~ xZ[$Sw%oqUҜmh1WʞN뵼% |%qy:DK h%quT'F뾯妗x f$Sn1R +SɻwMo3\l>>eA=m ׉.o}J %. s54O! 1?t6W~jJvFB׺QZ :Wp[0f*bYRxv8ƀՠ"y(F|(Y5-l&])\/.iͬlꤲt~ aE~<-Pp%反 (~>ϗ7JD%Iz̓>jPHkpt&:(vg:5[qjKfݎиx:o\Lj"6ï9ԪZcN^O.톢\ڠSY);b,*U-0VgLd;HSRgvטn>}MaFirKGV K־A5$Oۘma""Zj&%mL,Q,5_KLk90Tn_K S)L֐*ֱזT;VVB(_B3g?dהo_DD6Bkf4S2c yJ4Tヱ _R8}Rl0J4<2B֫0j/<\Yn?)#UɄX xֻ8sX}K<*\Cwמ bZYQ\oĻ.;D:eǻf{jlk3~?Gqя#SpshyIm8>ֺ^Ucc࿩d*Due]xC`7|ѷ>va[y.ӻP̛f9N_jW Ι0d{OJ( ^~H_ +8,J[  8vJ =pp_85"8k OMCNw^L;ξS_ l.eFie[fp2| x[Yh8#k_lF taRCifG hg)3&qz 4xWʘc4Mv'oIRh& NsTfݾ|[Xhl@6ۿ .dWԪU{7-$|+sWp3܃PS;[O7_RD]B -,IHj`J^y;t?'7Glg#^u̟*`XF~}~lFsz]0`P?1q}X+\ՊM#xO xiĔ:]a\2}Ч^Bwy+\ħCx_ )&qIgҙKIe_:nJ|]?q *@4u=@?E <6SPH+e=>LD5YY]ɻe&K6Dv,y}穆BY"L~WlK>Y0U]2GCk_8G ↔1_[EMqR6=qpwƔhsJ5X4칰3op_zdfUPa,_XD+G*]8K{c^n\m@'kE'x:`\jɉ=w=WG歊7m_/({NJv&MGZ|̈rұ,.͔af}gy,,iD~*s 7GMm+caŜǗDžޕ(_ȵ268o.`}zώ€_=~##o#$֭E7D-z'^m>y9;=6O|Qz\w%Ct}zc/ =ܟ,5/ǩ޿&/$:/>`N3R nܟ^k `|Ȇ6Wg =4EIcРHۃ4qG5D XASfĸvܔH۔:.^r '^h(XdK&[_pb6Vz!c*Ǡ'Vg5} q}Ӎ'|(٧$)<}}l]jJV(J&`2 endstream endobj 264 0 obj << /Length1 1625 /Length2 5779 /Length3 0 /Length 6602 /Filter /FlateDecode >> stream xڭVeXVAR@@`n`p`HnD%$)%$ϵ|^Ϻ^VF=C^0x$:Pg;w7C["@h@Ub"ʶ($(C@!!>+@ v:8<I~DЖnP8 !8 M_B #`AJz:j5cqE'nZP#\?J͍ͥ!! (  A<$@p( @B"h MpC\HUOY8Q_ݠhGk _)4he P//_vꆄz}ɐaAEp8غa774 Wuo"0ֈZr>A(o(װhA?`w䟘w8~ ':[0!:%2?H%S`:c[ g Ll0`wES;^A!>?P7UE0t~ˍ`+ h#AaFPJ pcGwjfiC ohx^bb^a @BD?M$Y X ?NVQ_Ccs//n𢡊N@ H*)=3UNO٢ENg(?7 $Qls>z@{| yɵB coN~ٚK:I{=ߺnƶiӽ1EG&}t]qN9=rﱜ Ai  $շْwtu~n>j]NcOb|q=]yIf%3ں~g!ha\WsܵJ^)}rF^SX4T$#|+ /)Xіi¼p;)##.oeWI7CݛOYSKտynzoKgíy{F-:@= $ Ȗo}'HOP -fCKyJ)pHpIyҼ3 A"%#$MN3]p#|__΃b=Al~jOz.V3%,a3.6 ,!J۽ÃyĝN^~~Iuq$gnTݩ MҫG~O4Xs.a!l}zsσOn$[wzθ>Ij˛Q* } +?zNhZx]O}Vf%$c LIqv6ˉf| ƻօڞEu'Fxs!nuJSIm{9gM*@9Ph$nKNoJ i3AC[UԷ [VE^$ceq?dž9 nx||=lP?5ekH"6)vb+0^<ֳ p;oA{$!*9y׭uK'17N GU֬Iu`H͐۬y Xn𓁼_C2L'i1 JƊ^@fwY1.7D=>O_ٸD< >%kD\Ϳt/'tB(VF:"k>Ed] tnZYF?3~^Q9QwVT6ν6٠BD=ROiIO]ȕĄn윫J!HLjT;O:ò5mq9v,V8"+p&N&X>t/Eub*o"O{5T}QxfmG%"3Axj.,Aہٌ/bpV ȞVCs0{*885b[h^wط)5GBk/_pvvHpa2͹M"I_xQk+rQ.y"~PhKtF>N||A3 dK>fhjhuЫj_x&՘]\28z+'e~|Yz'>rnRj_9aY۔7a/YM;gvl)nI=Ncߺ3M֎Zo{'0;|>"j{{~6ٳI4sدMצ|?6=q['./ ~;֓Tz28_Mw!D}G887?2olۅ6}ŧ/j |}GWZ 8|;VEnFk.iP9n6, C}!׏GucX!0ئ'o]gi 4bp ˓Յz3,H."͓tf/UhjdPhi4ʰ]<`GlBSm,vP RmWmh~MQkLE룑We^)[qtнhUB ;krs"t>w;JG_OQK+z s^0υL&Iڗ+͝7r R$taXURU |+p/X VReGCiDuI7W|tc^#%kJU߈x-Sd3H_qMNJ2ng(:xJx$iOҫs + kSt 6_ wYжt|ؽ#8TH(']ăߞu3 E> 8?tlHH}i9Y72cYL8wVT}eI,+g,FN7OiAVjC&S>a{׫7x S8e)'" zfkp+f[n8l*5Q}!D9\S 06^[sSdlO~%nL@66~#6@Qսd9 i)Wao?ۿ>3.wuH׏=OgghY, 3!\_nI>VMVҾ}H@:K2ٮŚ%`e󟞣fwژ%*tՄ= ́M`@]݂w&<9z]CJ57<%Wƿ0gvfoÙZ•c7U(E3{ S3 3Q\ݤQ@ڎ;ijxň}ۆ3 σVw^QOjp <3ߎ,Y|;,pe|{O>u衡&7&{pz$qçJ9:5O? sLi$96JvpҀ(ז6[L󠲁45W?nM%ǐa^8AD'<~P4(7UoܡpNẪ/ob͊%%4Xa{g a %ѥ\;Ȅat5oxM7S..Ru,ҩB-l*j{"t[{ՌCG(ZN'5!Dַ|ʹ>?J = 9 ǑkBөƽ:fiN7!*-;Tytpucg$BEpKu}h!Wrx ZR _$R⎑wpu Lp(W` YeGږ/k60i|1<.8sFl"Q>?Rԑrǟȥ}g_0QUY.P"`8䇒#\=XZwj_Y&4ѯ[ zv[Nlt A^iLq hNOZ&m90tcHiY3A$4({گ9Ezk*"֤Ea$):L';X2`/iv7H>+YIJB_\Wj+nua7kf:ǦO?k2yĊG4a0Mkb]t^R z!!bNF֯X54ͩ`Qٵ ^ط2x.Dmf_bz5Udm5RV/phVXB 61PQ*Wz k?)ؗw$H.>7U_"#w5 %qQ%Pb-c5D3zH;bs=Γ?W9 endstream endobj 266 0 obj << /Length1 1144 /Length2 7096 /Length3 0 /Length 7863 /Filter /FlateDecode >> stream xusu\6 ҒC:t]C4 1C#%14H4݊ Hswydzuc]I[WaUFx| S uރ0/ W@ I "<$0W?Pp)E+B=PO }esprqrsŁ6~bPOv t/C=#VZG@G//7 ~~7{k=izs{pC) zm= ki{4@` + C]ײvՌu`Q! SŅm ߊ@V#~?w!OrSI 9630?iO 3˟s8sO]=+g/tԼ]`p {ӆy:epݟ/f`a?8}G3y?)();u?kжko/ }_@!l%##.|y7'E  'oa h+ 2^+j9ԚajbG')%:+tᒑGaҒ Q=b:7ay2A a4q1V<8ũ!.:8= ,-WOM Z/kɬPC D!*^6t&=׎r=}Oz61Ї }-{jz"*!'q&+rXHOmTG{y SzG?,ذy·i7~Ո#4JV8 TUਦj Xb#xFv܌`37RfWlvs+x Ҍw](]Fv#̥Uݹ˛8e`hAB,&aZI]@hw@KQ:+2v "N+.lCYӟ6/Ƶ0 RoxpqY& ˕s9528qe;hY6,OeFeSS[:HN8 ".F֩ m`_=!~G8} & u(]r?Q6Y1B\T_H5L?&_T'#VxȝZ_ꅻ>9zH}kgY}+ Z ۨăBh ^Jvn :=@D>%0>)՞O|0KV16}{ea 1ʎ]TN>ŕlr]ڣf5753}L&J1$x!? "~ϼ0Nf*i\`/!A| NEpAJ$ۂ3}#1WmA.љ(X\JvH"fe<@7֊n+=[2OM?2 HZLPxWm(L ^3?}&cOb/ _l3&Tb՛Rt^I44wFK9z)7̼{eqC%a?Cy[O۱K8C~#ǒfvw bpRY]F'W5ã(xPW@Sj7x7PH(5\}+Y)Et"PkV<L2/e<)/&n)f;tI(y ZMve|H(Џz)'[1lT,B*!aĉvuYx6S'(˹mQo~{6{q 7cAuڿ{(=K8{oNh=1[נͰ_ʵ\ѱ%&yV^Y\,%|/iOsNDIӼUOمo~t.b~6Phk@W[Gw+, 'faQrfoBM G\ sv]`=Bژ9;cN{n@3JƅWq8hҔuzٸ9/ w1RAU W( $aLP%5˚fA3@㓾}'`5+Bwz`q#3C;\ie 8"d e%П JXnug<v:}l,[xhژ9bZpҍ"]q'!Mit%T:wY,u<*1@n7?٫LKY|U>ٓ(r4ƱRd}wZJ'\!ΘZY!wZC#%HZ$d_R7S-=eש*aO-kC#S8F̕SE_'J-Wl(tS1@_2+-cOT[I>%S3C},I tlYVV[MW -?zI0CkZ/Bx#ѕ9V\[0/¨)z䰭ca;n~1Ć\ZKZ^|0AZ~?YzW׿h#7}½Xc92?뚂/ȪU ?o0 )OW!unqAҷ!~qA[7 oG^pZ/lBba.r٠4zsgݑj|Y=f >r_?l+;4 !_O_{֍N>L٢֒5ɀ]xǥ:ėM6`YE^[^M~6HX@ur468a5N"#|6Ȑ'T#dOn0J.(ĈBFEEN|י/$B+~^ħ|i9kKg4 g2_Pe0d6Ƙ4۔[?|a=*|A bA)7H(4@ n&hy|&)^lIP{Y[Lu^9EM[6Փlvyٸh ml_{p\+[$Fic5ZEz-uIʥ")i䅙`cyq⥵qΊ?k<))1772Uatm HVlDyR6y5}3=w@S45/ Dk>Ң[I9LN[Q3k?e7XwVbMM~}:IcaTDʜK/cjl/pK\O/3&թp4QQa8W5i_(1`]V0ΖyvOcFiZ2| ao8kh3K2~Q[zA:f Fͷ5ږֳ=X~.1@8GY,K}t!.S鎳gzNl5HL>Ϧp2g:GEN UTinKi7W{ x_@/yBgpUB]Gā6X\I`߳ Myt944vdMez'!5N˳^FwR#8C=/ع8MS8~HU9S4 ;;_>Uie4*^Y,ty8^xBѶזw‹>5JR҂coAx1{+bew6d5;F *cQ*sY(:"bϸdzc\tSe+3b RYڼŪ գD*ab%'cJ ̓r?*IUdR[oO~\ _纺cHhXD5?|(WAjz""h+o;w[_ $lbgRyZFG>|}m6r] %_z^HC&$ȫx>,ݣ]U# 2wz [p{?ՙ [ fE ->Q&@|6OníkLgmzԝ^6U&C6ɿHПwYPlӘ3(jk몱Ql)آCOG {P'E+@Črh1:x!briP ַ~Jtg#D6cu<ӗ$~C=r=(W0@OgifW,cdGT]٫'wu|"xBkvI42 ȱn(d}|1)OOޫK̓C SН]2? +` obVD:8PN:֣ˍXԊ"vDOK77?j^Uf|^aŐ%4ժaX*2:b%(o%F"Z'Mˊ6H5\FTr)pbKW}:eyAT`QF< &Ï>ujҪ8W]fZd]u29bAYˮ҂ȓM I<fjLpFL͙|džwi5Oj"9:102.Zj= lSAVhh_bv0CQD+I+bkrm4l2(\ob=[ީϲb|ܑ-JcF S-rgHYghxi\X=bAs[jqj.2rS#$5Vab2E-=W|Ļ=0`ݛ`OL HC#C# ٤wLJ?Tu~m踉{J<&𽓮QۺUw!3$Jp,Y^/iѠMLu sz44K 1eE;DE 뒜W:tqbL2JOpx:$5OI}<:a/B:SOz8w{ NY s=ysZZohbt/✬txHZt]XuQi#–*A| l[-#xԞ|I.IBJp䡰:"zYNq}ъ%Yvо'**#\. nW)8x|>V|eUs7WjpoRg/L1t5&&e]|c| Dv!Oݷ Ᶎ՚n`U VV&j{E ZiΒ o^>ٕː_VBY +$ڣS%?U(=֧h䄁W.FMW:2 o~/IbDǦ=, \M,l/]K((*ֆ PdHuC* mm*«x0u;ʡO6a cE`_u>8'j(e# ڠ \hב$ZަJ7/g8֟;量 ӷnOVel]\G;<ьo4Q,;py^+DDajYXd-R&$[*V0 \k@W Kre hd/afo|j"-;y3kFPNYBQxY%،΅̃n [vЋu^Q5WY%l;@ }[w=>:Lh)L)܁n~YwU( :F=Ynóh7jP-&֩T\4 "́ n'CGMc)$ ocb+gᆱ%,EhfӠ sM`8k> stream x\mS_ī}߽ @H!Mh3|0FXrsJdaצ2 ygU,aaje0Si W03+e}‚pX'< dxtp H~\xɄ~0֗p Iu$4Ť0'`RIh ]H85dHH`_3LX&3S .Jh3%DZ&8AI@}g0ZAV@1 F5 mRA]Kz 3ӐMȠ^6@B3-$@?#Ď%AL aAiCPŀRB@p8ʎ0K`0L@pMXj5 #e6L8t= }9`N`[,bރ9,HoJh XQ MXZ'%N \ރ, i= Z <$類2pV<Z'HHР5R",(cBYX )hk4Π@") G3F 2tNaR' ؊pGl;P*kZ2'Oz7wqizGiO'ôYIYy6ο dX ǟO5{cNz0Ior2Qvi%GϷB@ 9bRyotB';) =,L$dN Mzzӳz[2reyϲ|ϧ2 ? <Wp7ŏ o%S_0uRx:.dN]  C%!hc]S Ĭ:5U$P8ɇ)t~-]AX"+@_ a X4p[.^(% nÒx l4&j,qkt+1A ;2$ߡK ^!< bCF,wB K Ћ@y@ݘ4ؾo  7 @ ?sBh)EW.1Fbp VUzWFU$Cuúo` /!v)}"SLaֻKu~WzAK+hich Ob7ӆ[P9e=J QA95Dӧ6! ndN݊ CT|Q+p6;%wIQ\&,4.geAom<_Ы{A/ 0 ժfk*\e?sC|S|"X5P*pFپ`l})y8+ʍ)g<%l"j4{FsNA gBR-K]2!>P/6c G֨imP~c⹄noкr"U*ԗ5HE(WDk10o9ϊtS,JU@iK1MgDqx[cAU(=+&5K0Gs>L7rNXt1p @u1}ޒCӓE4kjJa> P]ЁzvU߬o̯C03LP4tCYez8aWNh'? :%"D(t6@S8''DpxbX;i,[ZdkLx ,G<'ٖXiU)+=XZ5oUVľۚ|=e*]I -?AZ7(ݨ\f]e&l{v:A>omeAZNZtP˵Jjd"Zc6G|g|| >M4~wu(oV,؉244Xo;)?g X☿w=2(t?Ld0cY'8Xo1`|4)' xy:c% }1I9߮/1XX'qӫtRdc29=E&(%9s\WWYH@EAqK^^NҔ擔NM{v(h~vsʶr` /W-ݲv>M7pذQJ.]* 6Z;yjm%ۤRٿ B٥3EL"3_Sb(("zBbg3th[#ćS5M&"JW*a#2_ήΦXdU<$Lh 6#\#ŲP dFJUZ|f6tc7Z5~qh-Tm\f Fb-~1+lV QR݈O5UrOҶhk`7Ք}C/`.n %%u5aT ΘNn^yg>RF+*-(%iGdR֢ T5R#*;nœ]_YȔ N.$j|+kxEJkszr+e"B3Yf,Z:fd6´[y=B P]Yؐ+HiLQ[M2K"Ds3 ]ջIVgq|/-Yt,!]S\Nfm5Jo.zQ0i.[.:fky EQsx٬]*&6msEv LK8߅p--:⩖xMPw!Ҙ~qt{2dVϋu%-LC;xwQɖ`pUn粩nH7 yIsXw;XD Id !lgzrEjmb!ڪ11oTO^U}㤩:$n^h|8-GX]jf=-3CV}̕JL/lY4N endstream endobj 283 0 obj << /Producer (pdfTeX-1.40.20) /Author()/Title(Introduction to GenomicFiles)/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20211026173124-04'00') /ModDate (D:20211026173124-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) kpathsea version 6.3.1) >> endobj 270 0 obj << /Type /ObjStm /N 28 /First 217 /Length 781 /Filter /FlateDecode >> stream xڥVn0+|  zi}D5$aEՃ!%F(ГPi5` 0,D z .@3HqB0e`_1 XW;P# rDH}? <;Sr:xhqq.z%u(\6S Wk`קPo[=Կ$;Zλw;ةNe$J Ϡ9}u I8&ZDةBLЄ5.MMH|̤M!mZJAlf6iTf> ivv(0S$ ~& ]{);w.(|a=S!SU,c7= B~~Py1ynwoա=aGg?P_ 6F #JňňcckA5T卉/](cWFGaO..k)8z͐^F)18<R0KDLY[U͜K<:7Ƿӏ{Lg)FVs:.2s ιj9\3ogӖQ4XZsJ|| <7862BCF6E7C1B75E130E823E4DCF61C2>] /Length 705 /Filter /FlateDecode >> stream x%;pMQ:ދ !!$!/I$BDDD Œ1ft:Y t)t 3Owu9{B63dX9pl#0J[ւ1:PdtN]#Yd:&PF# AF2-TUiA5YUjɚȴ:L4mȺ2?v4uMZMv&J6#kM6+kK6'kO6/HvI֙lA;٢+ْ;ٲ' ٞd7en^`B6g%p̂3<pBAogv2VȌe3f^i0kُ-[v,=+;k5]\ܙ:-q!Y;uwq]pzE5p^E/8]*:Ur 5N]xj6[puWe]S wFw4vM@'w7&:O{,>]ҠjyN\m`ũSGN}&7e#?uՎ[zNXGvrF-le,lGeHF\6Z\ 62P*@%g35Ya}CBɟ endstream endobj startxref 397304 %%EOF GenomicFiles/inst/extdata/0000755000175200017520000000000014136050457016554 5ustar00biocbuildbiocbuildGenomicFiles/inst/extdata/CEUtrio_11.vcf.bgz0000644000175200017520000000363114136050457021653 0ustar00biocbuildbiocbuildBC|XYs~Ul7/Fj%F-lʏi TRg*}e.#Qsܬw>0v=ۚG^-@tKC۴+vFS;]Cmil҆Vo7;jc}KDD@d ">?p_ v5U׻_w r8 CDKTP@#Q`"F4IõKE{&M$ |4_l0_{a1@?!?@iZW{ 7Wˢcj6B&? x>,6;xvqm} (d\s`@Τ.:54Cj rǞs'];޷OhlN[PacfKixas/A13Q>  _5 C#` , #4 Ui _sj1%qXVf\B~r]T> )o[^ُ"=mv [,:x%E Ҍˆr}a_$!ZOH@[dA{gQGKhPNVVqnbA?{#eAU;:T'!"UMϒ5|RD&/RyJYPG$AɈcCse㨤lUi^Χ+{r\;  rYbqO38>\hUճ܁ 杇Ɲ'suxߔSJxboeփsU,s3#9ߐK9e.ѓ@*R9/ޡs&d!+Y8A+ӆAkP݅tN %&&ԁ#}Nj t^ n%4]Y<A1`+9 l;|i; cr+Lըu#lJ^ET(AKN@7r̓ /23ർow(I?ċm68pd ^,+4%\9O$ 9e焗ywsy(Jkl#_Q#v.T27`θʇٰzX^ɏGUFtH{䛂zqGD~.b" ]񦳊?lě~Vgt(QV"+=xgXMl.Vk.wѾ5-PM ׈[eVtlYzK[mUZh2+Fh64JZTfiV9MS7w*X:p[j CoUN`|PUUb@m- QD|jW!p-iͪ"ުfXy-U7-*|8xcpMy[mҚnV$-ۆVeƚU;-uiUߢ* ug \iօOˇ2X)ů{%Ȏ$=YnNk0VLVPZUUUJ+u7 3W5vz z:f0k?&BCGenomicFiles/inst/extdata/CEUtrio_11.vcf.bgz.tbi0000644000175200017520000000022514136050457022424 0ustar00biocbuildbiocbuildBCxݱ 0 @ :JzYu+@XI|GJ1zur~Xߓ.2|\oخvBCGenomicFiles/inst/extdata/CEUtrio_20.vcf.bgz0000644000175200017520000004234214136050457021655 0ustar00biocbuildbiocbuildBCR2}[sɱ3ϯ@;@u ъitڻAQcIj<8?~395- tfU=o/><_>|\^<^^|]|޼=_/NoW7t}n77 oЗ?}?{ǟ^}9=«'_ȥX/YB Vzqzus7/^_ٟ_??<9:c?8zsڣ ٿIu2fa}ս9[[xDl\/hC1ջ|s}~'/{ϴ~Ц:}|__/K?҇ FwUW [j/^-ϟ8)#b˧œ˷_&N9\E+kzwy|E<}b6|$tu@1{>E,<'<''}z>=rǗ5"1tNg:߽rY]iO/_iqvyqus.|PSEBg=ˏ&zU盿xy.i?7s^M[5ճgy>1gZ:q3o]mᗟnz㯧g7 / qvsz ӟ8`ND|!Zke%)v~īh~i矞_d՚[拒}|yC"|pq-]ÄثקS2'mKhWۜ]JGVk+7$z\&~ iMK{Qh9Hy}iϟhmMy~I5LxzE?ItI}|D=I-i5s n~X0QE}:JOK5IJ~"5D|ڽ,.y/$&/o|f~U;$[Ku<7GN88~>Hpqj~z]o<wٻ/ӊ9L=x-7tŏ9߼|J3c,HfC;5Id9zjl =]ZG/zscsaDG]b=W%";Js*zL4?n.k%zӨc {~k0Ԛ'i;?նiK]/cc,592_=CTn] +Y@73T~f4蕎Q{ߴ%/O%ħ(#Ŷb~߫*Ȑ|Iw? +2^^^߇Uϯ $O䊜-~~GR5!dO^7.(HOMlK:gHBEO'rU#Lx`|}cH?&?|ln@-܀ tA57h%A78AK3 0v[ߠ=3fhWߠ Et@ognQ߁ZjB s܁Nzf;h[XT^Ճf {ZY=|P/Z3 nVY%ws$6Hdk9H^n@jk@9ZZgmh&1Ϗ_0̧{/~ß{,Qbcqں_ߤs$ݻ6@BD=^ywpXpX"/'/O<?$Yj0`P{zlW'L"֫H'H?%뽣ՓW?Gb%+f=xt)K_OY$z)DўqK%S'uKQjdF.` OW+==^+Z?7пw 2)^-SZ{RU1OLTjI+iSA,+PVjrEs,a2! } i7)\:7ZV >n?D1K&Tt> FΣCZD&w#G#Kbu8JңYD4hR-BdRgT+cYoMx}0jdoid{'i/uO>M!glJ5) ]>aڒzD[%AhҰv-ML|GX8,TV!3luF-nܸv%W6P2"$YF <3bu@mTΟEKiJgɲFªMکcZU?T|cP&0z^Vt 0qYN@ѻ X0Rm{^+ț~_HF+zO&Pnig]r|w2E[B ![4. _ll;mo$QuEıIN]J' ! B$V&j9RЁe[Eg#Y5sd;u)n.fݴxVIlU+VC8989>%u+eÒ%k 9Ur]r5UZ/[|6i,ʩYf>=&K7;Jޱ(AYͦ1=gHt!@%׹2/ay5udtd;r7 l@\d@?t;qҲJڮc&LB+g^HDZM}=Rh'weAX7tp*'nZiKWX5FJ婩g[/ ]0, GNz«53`}ꖶrS!${W H(|?x P`t8AYB` %h|b D^WR ܢZ`X=Dj"g'h"=ӑvi\Jh-$A7g"k˓>:Ǥ ae-!r?P[-ș\[-]JjZ`crBg(Q%ڊ?M^4Ԓ (yFR1>?R9Fe]yšW"K {ziGMmz/5$evs ]n'.-GٱWj~wБh?lq'W=0g"@y5Ҽ;HA6A%q(bXZ2"?w@jaYvBl, l(jV<($[ ?>ksnh˱e(E&Y`4¾F&Z5a鯖J ʜsrKrK)MTʑT!htDz 7yY"|C3$+LnM73gKn;VNuuU@GJN.!BU!~)*/YiY=.W신IQR)uGGaKfL&R}Ahs)[}KK9tdeGi}/ANkaC9)Mwnt/n`SV՞_SKgmpq.^ Pce(zDd 8|d@2!M!.ЧH;~G9`i ; =Nf{{6 ~LmlmyvH$Aj x2Y-[%750\ )(]HuĠ _q䠪"_Aw{)DN XKB=إRVG\]5th-Hi<9Z9ߩ"wrOo{%mбT7w;w-娏I`EDV|kUf`ZK Z59J|f-"t4C^joh_yPIyS{)GU:mCcp eqmgb*%<9\5D)듣G13S~߶eiNy$#73hvS\? T":+;eڼ(%`ʬW%SA>ll!8)|h udd}XҎ djc5Et-Ih#%*S Ȃ㲧=kGSIFxy[oquqZ㈋4$x^bPw2lgra{Q~Re/24+/a*?1Nˀ%Sp"*!$E^ChTOt "MT!P]=: H߹q26;UTS.`nj9NTOdrlTpZ*Dx5J?cGuMAQ-}dgܰh_GgTrԲq-ivMfsMۥŲf 7 )Ҵ4XP DS7D Ip( Eb<1ġWĔm$rHmϑ#lO &Zl'oPZV@" C'@ 2j>qi`5Xõ"oI dჍpxF΄faD(ekU(6M,[*DM6T&KMT DkX Yv'GȕˬX )'`T2n"0G%kV6F- h,Yl n~ئz,Զt$is+' ¦6=SNv0. +OF0rۋ!50D2{\8" +LYfU3Փt3ҫHȭ6K#sՕe~ҍȡ3uhgp\.F $<)mJk ۵\0(Y°CaG~Gg&x7+0}E.7@\d&Sh-|PN'.[b (Sm,$uIh &oM&wG:sMX9dmS\d@TI%zBWʮ r) IMq@W-x\#Q]pAc9E( J̀W@y۵h!GDeU嬀k ?4<#:`O+^ha>V.Ec$YatOmRm+6hɅhE km&la9#RDQ| w9KV'+Dg;S)< 6IH΁O:B^sVg 8i@M\s@DԍNR"J-ЉBo1NFCm$ma>S Йa!x'q}c'cTo3W|2&& ?Ó0p_ 7u~AgԅN+ZLnz h[!iMMsNKw$j*gn;B*[4*1.3}fcPc*X*&9\ԨzI2W&8 {B7[Zwv")^L=a أs3vi߰_G`y!IwzdQ ru0!.TKŵ:NE&ყ)ā'm4fw*~4*MaQXj nu[YKklWK 3͝e-m^ˡ1f KtHT eU\YfBP+Cʴq4e5vfh opئ Q\BCN^,/<}yNZ!|0jDMh(ƍ#19˃1YTFFH$-;KLi{Hjmڧfn½T)dHs 6D`hĈ)ꐜ]2U# @ER A˺  J]pu+L*O^Ĺ ~@/$m)D֊`0i -W%09H)s5LQ pTzYʤ-)3ޫmbBu;Z$ çbH lU[=ʼnm7ReSP͎ 9ٵ*: ۗيM. SrTd" s<;B1y;i7լJ[;1Z(AbRyCI|K 5&dT3vi`"#(vJSUj(kD*`rlMM(Zv:5DswN yyk(DE8g)]vn#J!BqHV"u=Rx~ck͸ng4QmibA8-ӻV.8oncM70_"_յ 28‡U-h5N$Ղsxs'!f 2#9df dĶX''Gӫ-ۥ!  38Z}>Ypfg}QR20VϗGcX.3 Vjr)<1ZqHF8Ӌ_6lS m{YkYy`H0::F I))Ɉ $h* [8M&FZNH5EfXnؗE ; < 4B{B׆߮xrڔ?+ HGGA_3mjhFqc,q|D&d~E[ea䰘6ef5MIG\쌭Z#!S]S K%[E8,ꉂzU &7u+B NŔkcgCc%:3VBp5/Dkں e::vRbƥhȎMIa{a4R['bx;3 x1+7Qmk??f:x;uvVOKq}trE`z9JBCK`&mɏzq@o`h.zxDikbwA>$]qMc7wt}17 }#Mm%>Hc3 2J eiuL+n(* @pPa hø; Fqv\KT,_0dq BUv*B6^1`X.5}S-ϕ7!@\&d Ĉ3&pkӢ͞Gp6ITh*ݣ<*pX Lxt ?*C'OuN 39=ta>S#TUL=ft8cgb2Acq* $jEMT]ig\ob mKc)ܭ6 jTBTuH40ڮCHfvs Fg2\!6vj8C9-4k5M[#u+Ϛ&URmd'6;Nudl:BDM^Wn :4) K|LYh-S "]A+QVx:菒+徒I0 b'I+%a<5b]r@ԎU=] |T.,<ww5t%ҁ}%Ԃblq"YzXp}وUDȨq<&b#: шY?{,* *2d3!aha+{tZ.+}*< lW>t2I=Eh335:YZ:U8J[[vzPgߘo6ͱV -ac̚7O:MfMZkbm1,v'@񃓈8(6@sFɄCW ߕiwW>֏Y>3~2aR؋ü :@h`D2GHow3K=Y ې)AN}1azV~~AK QW}Z$.s%khP*О A_c5{A hFmGO) 1$iUh'2R5!Dםq>T{p^Me.Re=!,JjXuhs'(\u?;$w )cIIY8*hYi/I>zc59:- *=d͑ۤ"h,0(@L(W5$yO/trޡ{OMJtuIt!2oTP%w3< %d,rg:nxtqJ^(SxO@Mw]V/ɜi!ZBCr\ێGr}f1#2#/5١D, I`Z?'2^Y,-HHKD圈}o w߿5>_Lc%޿'א󧿽/ÛaKw{D~O?zy}xӾy׾}߾B5W׺J|5g[i߫񗦥im?bsɑw\^.1Ç==|xwoݷ`O ~M~_<_e5rÜ юa 2տIZ6t%b5B$bQMJwe04f,77߼gW.mGf˯Pڴ8[ե6Ob0$F[ΎKԝ]v@?;099yI/a&͌ɝ`rXrzrŬ8!XSN 1dBra}NH~#3wy0wa"xmKKmoۧֆt!`W6th^FMvݙMD#%A?^j P闈/[EEL U Q⻏6~=)+o*K.GN[j^+J`{@`?>=XmRv@f\,x @ h;+g5*Ovd I0uhp3eIY՗ "Y\ 56'L0`A&;1:I3 MѪG`f``xڲ;O#uSi^j F!53G[a<^ĐIeO.BfsXACPxT11} ?qt_o*-@./K%Sd)$@p+V#V*ѢX6µYSHa16E.'] ,#HRe#pLnc+d9w]r>(Tf >qRLH吓#6RK7ᤷӊid8B!Ǻd@vYFڌ;>u}BQe~ $0oa* ;`hبmfju.Ea&e֑lE<7uJF١AT(Г_ X[gȌC c/(3Rf:Tvs̠®Z[2V]K &sWA8zW}Fa,KinxӊLzIݙPr!!Bn%U􅗼(=.+ArOiotJA,cO Άtydޱ:|ċ9W(ԓ;]_-Q̴$:Ϙo9Z, vmKSHb.ou%q'WZFh(c<#xfZ㧏pz[͝du9X$Cd-~NPaٺrW8Tp,JܑjCud` +dc/.91ho(7ъC»+ђOnKALde`Ol( N *\YQ/7]۠m$2r#\B;v.g\A6[Bu 5~*sg &AZoI*^,|(bхG Rd pj)JB*&znl. C4%G㰙W G7QL6> sD>=FI)`dä|鞚j+4H9jT{~"^`Tt& Th ɣUY2W+IaR!q⟢Hr3mC{jNT˥̪p`nˬ"9 Cd"IB7ozX{!A-ZfxB'Nѩ(^vRYߺNm.T|tH=_j$Qی:-5Pj QbWUʬVPsPȳ sLx1Wb}vBΛ@2ȨB]`j*;NN; 峁Zn U]*!v z) rMjXGζIasj8ݑBܭ6p(`B*•4(n4h 3̲9vC=W)B JQ@9LU.gz=aTgk="5ɟ^bm+[<2`u@oW,DR;\;]$R#>-Ь8#nFf;Հ+\yOOoV'h)ֆ;}5Vkv?E|)2J& l ͭau7uP||{ڍB#nyI6Kt$\0}YnV:wNhCۘRc5J: {fsPjc>ӦA\⪗0Jw< VЊ/1{PL""IjȏpRi,Oi**Cō zL-<_-7&ZYYbk8 r6s^ʴ]U,(8I D[Rpi^阎HgpkPsrN]ţ~U[\ R^{2?R{WrE &V̉ 4g]j] YWG])&/XgN,LYV BRu/a~蒩C)?C2 NH=`vҷ`jDjFNLο03Wwovux//||$wW'KS΃dwD!5Ӫx>cDp f` oܲ liӹ6An֌*k({RUʫՉIH@Ϥ}@X F<Dz2C:e9E c5wCWpq !;SSrYVj> fz晗dXVř^glN "(i.Ư.V+O mD6Y֦ ؄2J(BW/}[@|V A#w%jAnqhGq1 T\nXNM.7N〰ؼpW$URtM>WxJyj ȢnO%#WDyW?!B;qQK?+w' 9D@/^C] :2Vs 9q-+R vx%6/aaYȉ\)KJp=fTSvdK2~])*99c+<ږyw->rw7cyV-şΐ"+IGMݍlP7-M|=[p.;D>.KKa-uW -7*^pTBCGenomicFiles/inst/extdata/CEUtrio_20.vcf.bgz.tbi0000644000175200017520000000707714136050457022440 0ustar00biocbuildbiocbuildBC" U-34QY\.r͵R(Dj;ThʍTF#2i,-H-djJki,5rGT-;S}n}{_}?M… *T𗿚fџ5lP(QMQZVJ"SnIZw* _'?UV$](~p;ܲz_%y?g)=)t8?+-7:>N/E%!p.'^;[ǫ$'^|G!)y"w8>sy/K9> z5R'=E|N'ĥ @V'~n"p}MZ箿DX#_>H,RVSKŗ*o<(p8JN'[4Ut`{}*6p~RZ&_δwPMgIN(t=w~+w]7Ac-[Ile{EzS\߮[xM_s<(H{Nmd`Ĺ?jϵ$?|>5Xpwhz5C؟֏5".*-o~+y٫_O\rz6xk.&XSރsU$ON[ٞyO\~q!{bgtl.7'*EcU>ln8~7K .qjbcN2' ~nڊj{bǪCTہ/yI|Ď]oW~.^>[|=WL|%'[BJǰz-M}Kkl'sf불Ok,wIط0EfEgøu4JtzéIbto~O/eų3^]w?vP[<`r8_c=./։l_f;*Zoڛ'#^&?ב(~'_[ ۙyу3]<ć\7pmE=Ǿ)u]f 'ި⟝NǸ/l4k:=~x\=qk~2nf~~GĪ?v?h~2PwVwҿL??vay=ktү0N,-%Ӿ.t?qz4R<:֓|n?1rZ?~Žw{8q}>_/O?7mXf ~6ZOm|%^a;0.?id=9IōG餞/q9R~~tN';]=?1Q|g_/w}l7ݣZ8=39nW)yqI2q5`=")_b;)ݺ+֏ޚ:=Gv^G̣NNރ߿y믲~=OHy,{ZziݰC%l73OG\o1NyyVpeωl3߻^Q9>s~7CʋsNy~~-.OtI g;c_ڭ[lOA狷:GJYahK8q ڋ w]d<0.:j]pő?4#x5Z?zg?"q:韾Nolgf8_gMcN'ŕ 2.e=~bC:W0ģd`Ϻڞ.-lIlt׾pyQN#:=#yx7ߗF]e~.0߱~hE~vlN7-o,sy߻&:Vo\kDžGZiQǜ-˅"kV7X#k-2G Epp(gȚifd$cNdM0ɚYVɚY"k6"k&EBH&d]Vn9s(2w4s ;f墕9P9Ldn]f1s"{Ez73*dToY%rJE;|+ofgȚwf{AY7oY"ߐ{札#wZ+;㓻#M5A&ȠOpbE'&$sJ|4eF|d79["=QPOH  d-ES4:։h#><1dN4]1 >G'f 7$eJ|F+}gr.T>QK|M}Nf)?F)dIղF|p1FtA"BCGenomicFiles/inst/extdata/CEUtrio_21.vcf.bgz0000644000175200017520000002605514136050457021661 0ustar00biocbuildbiocbuildBC,}[sו3+Pñ־_bHQKօ3/,$)R!(:?{}7O^W7_V/>w_˷pvu}:.?~Vwwon=>9xӋ?<]6Ow?^}]mVz~~efYZϯVwx}w֛9>g?:ً~|W7 ֽǛ/śݗ߼x9Qſ<T؟^??899]/N|Fn۷=Y]ŇE}!ao}1\}_7uru;ZoVg3?~]hAf5^?u Ƴ_Kuj2.ՔǗj^}^Mze SćĈGt/?|٬/ί>oבG MңKYUG'ݮ5|X~}~n/>?_yEH:_7?{n3?7/nI _7S|ԃ-~.@Z6Z pssy}s[_G|7Vw˛?Em-/W2.n>~\!Wq a 珝eO ۛ󿭯.n~K~o VCnkx@:Ï+rϿ|jXkgKF[z$~5w$[h}kas{h's<_ka{]Ar7o$ɮzI/oq__MxѕY|"ciD|߼}ǧoO%?== ?[IUw{sCTve}^"g˽./\\_/׸^_ޮ?^kGSu1k:pPpލ$Q[$V ?~v:m%SڌB (fȍ=O_9`O+q kok ߥǿO^Ocxa49pϮf'ɫgŒ/ؒ/e?;YwoȥT `%xFzOBrv8;xb͛ (VhK%L,onD@jY(ՀR&8pURBiY:@KO pqqvtvP[l wJw I`FOgG.D9x B aJ70d]š`/ kqYW'm&"ߕv?h F@sR,,PR0o\xW..]rN_vDgu`pyJ!+E&ᐻ6)@:!PU4&Q(nBa g8-JH^N %f@ J$4[zd/ p.b2@f/NF󣢩'LN.IՓK8'0bFʥKT~a~W4uNqs[MNfd1,|k9&ts608# .tQBKDЭ'j[QpC[O5%txdt8# =Y ͿmE4|E)ĎwXFغ9*nZgDݎx[gj7wQ;c U6EADA (0ftbFmi dMro!`$Dҳ|Rzh3|v3 0ĭN)ܔo#rQa΋QxZ}v\5P-+>$\."~y/+!qg"Ka@)MH cC`YC s41^4Y"]Ml|KbRRe¸f%HЍY )gC^KYtM8'd92:lr^H)OD{GH= H>2Q^(BEdǕ QaiϠcFVA9A*Dݐ7I]ΐ(AVkiَ&CHAE.'@^`Ma{N(X%x  n0D5yZ{[bК%öyBB;\#Bʈl:cE!c9ydA¯$- ?7ܢfF  !UV: (!h VE[Ni>{|0FfCCoX3ϙ 3c( '\ؘ;?rtZ,2|NzPb_ d),oU,&1N*hC8ӉDLC5PG/71HZ - v%~~=.`Zo J3,ʠΠat5 `$^ MO8y#CGC8L\s'##E_{GH~&Z9P`ٗB,eZlO( Dt%@mEĻ$ZA I ~lpoT֭:q*!1:N@@V=U% %͠E˙I-pH<+dHv~@&4yəT3W m5>7ЇPS@GnȞLi,{,9\4~qҁ;*JS(- `%I2TT:T(ÁZPF=t c|ħ2v2dxS-xfO3) (֤JNBM2cX%%0aWKAxǾ j1pJa{t8EYc- zYCkN%Yu 焮X %] .%7.i40ط(6MFn 0 Ğc*y$9^;<.8ZPpTp3'9H*`U!E݇(8TPPKC!C$KmYf;; Zor [1E!&+<ՠiVI徬wQCAɠ4`V ~ip1HNHiY 뼥NzL@M" wȮgn0-ճW[lj[ႰuD|(= `4۳ eO8}QQ:S|!JɒTzX!\WZj, qmex[[YD5 qLߒRdT8sB'7o)z@Eă\JBALiɝRi]5TW0Y\zfdQa)z,(O/E`@Jva½DBMqmm¥3Sty,d}Vg;c!vOEQ &U}mVʔ*4h.W-"LxHr-P+6bh wjeXAl99 ]}>jRű7*N+:%+idսy"Ru*ȑlK3e{a,?aF\ó%-vʯ M4DkR4ʘU4:CIF4%V^` uڍ݉F<UMž9HkpKa"22{O@ <6Ym~0 qLT OfhazYӄ4eCSSr9|.G߾eSQ,vk:#1Q&X%qV!yb.bkX~PhMِN3zݙ@,X]?*IO=R쪓In,\hu u 5juTu@T㸋*7rʍd6)b͊J[NũNrܝG23L0cɫZSQf8' 9cE03>u}]O*=8RPd 0LmXd_i["t|ܸ5^Nov#ҩtPinњu9oǓbtJ>HKB[bgW&8M2|We+&QxۤYlksMyk~I ơCj&@䤌qAUϵb<}x։[TPVtIy,ZoYXItt%v[M҇c&Uvd-S+agB/SG";Q=S^^R''+?1K>~1g4<<4A2͌ r}E|`*ŁnvFf9mI;!-kdrGBH,Rg4oL62󽚹.9N9HaGpDDzFV* 1@caƦ&#_a}S6>;>y^+&̦b '9s=p3Hc.ީ3ӉI6b:(<b4;cXGhF,gyʩ?p-㈠X=;=;9V`yxڝ(Mad5eDؔY6̓c m(t /DSi`KGNLZѱ[B0A%߫DUs]s#pgr5_y\)4-Dɿd4:ނARpS.J0Ok gɷCz"b>5m={X,gy5**daaф<]*GPX {Pa>kJ8!+yy4NDŽ$Ji{ge˰Xη+&(s{ܹma<̖%K;:/TY w9QZ=C*I/l mJxrl7JQwZ]7=EI&ӄargڥ9ir: 2 X^M>[4ѥ1Z%'*sovr_2 ~n^e (3@n, mW Y'K4 zHaqU˝N#oS:!2(B{CI3tvtvw J-;DݨJk/!.ZaS ==yxB5G165{&c({M!u(z:]UE(JJaiҏgH M)NU&$`޳#  ˽utڅi:AFNHk{MٵjXMP0q%ߜ/WE\&O]Bs#\zlYMLOyiVo08m4Ǔڈsee1< yUJcΘ2 † \'9F xZҭ$kV f^A8 8;%Lֻ(uqr#h4j*_R"vv/3fT­A5x[ضz˝3a7i/8#+]s2]!`tf'o.;3BT#S‡.|hNBYL(hɎ1ŰʷxF2-k)NZ[*o2gN};Y t&&9,#]wƵB f5wo6VB,O\U=Ca ZYRp^/y2T5/t!KY,l)BRaFdH)OҔacJ ;%5|y(rb+`7kL"K+cWeSsF賥 ~> S( 0]m߄KyN^q%ۅ|5Ppa>h]:!PX$Sp<잤rRӽV S?K"j0DlV4[[;R@>R}; )wхq0L䨻Ro0Z6VnIBNJ!IcAB?,̼ixk[FJmI1Dq٤1xډeţf9~UĂNqnQ\ʒvSwt3ٽvԭD 7!v[&E-|:JNBL&U"4[ewp_!xQ4Л\Ծ0Sbޕ>kzʾ Ȳn",]| \lpڥƟ̤뤰ͤ7| 9 z|Z1y6hqoӪu ff[gMJ@AB`4>GIJTRQ8U ylkE3yFzZoJ\Q2q^ezٰSq+N u 5!H6ҟzR ߤVAN3k9Q+M}C_x;Հia 5q"N: eIeζ= 6x\ru:GX .`/hFqŐ_!Η BGNu ian &2y4ʫy4iYe1XkP497^7*|&WT;^F53$qP}4܁p]4 e1t<)fm pcɼDelFׄ:>^G`5vih )U˂zNEe`PRJ7KU- X rm)οiT1%E;E32=)ʂtɢ/>RܮJ0tcRݐ Æ n%U&d(TŠ|ْ8 "A^JI2<'01pV+yvtvl`1ǻkּQ1P6 e&#YXۘ"d90d3 I 3`? n3}!Y1vEe`Qل%q*xYQLP9D"vìa Mas}JDzRF=Ci6J` ٜǪxSqa@Xº0JCeK#BJǓՖy6;9Jn϶9=mj{c:$b!a u ‡fvd:<0BCP6rhc^c@-u;]!CӦis\ZJ|9(gQu 7D{lTߚ-,ʹMNPL'DZn,EXZ`!J2;HYy fDoۥ[[(pD3R+gpяy"`ZQ)r,35WZ8MCw_aV4Ni -S<Ș?ў,6 r'#(hx8ni331/lkU0K섡q Mj܍Ip-[̆)+T"O8Ovf@ބYܔ)>n~Q C/70}ʼn PVISerd&M+^1:vD;hLm{ji8ODY`F.aaZ@.Tvג i'5鬑0uӞ2|mL-'Pͪ !N!8-LC "IsEh [ |^X'&ѿ^g VU aBL }-7F& O.c2u0ef3TΝgb1Zύ['\ 5FHgBCGenomicFiles/inst/extdata/CEUtrio_21.vcf.bgz.tbi0000644000175200017520000000373314136050457022434 0ustar00biocbuildbiocbuildBCYlUU8%VBqATġ4" jQAE&gIq P R bQĔ!j "A};6{'͗k{9A6iOӎ7Vu95k~6QHWW-cDZ[d/##>8ʾᯋۏ VG G?c߮h!~]O=R˞{Xox㉛vxZ*渞Sޔ}[buyq_vsyp7^'{rǓ>gޥb0]'2B綔g\Ϛ _owC*[Ǯ4tp\_e=srqsĭ潲'h?ōűy\g?6,O'{ŝ= w>W2ΥC1c?zKcM۽)Ϝl/q{?FQͼS+ewJj?>y,3׊ڏ]_LJ.KO/_SǞCl롎uB7}!} 2x8\wo/ 7ُzq+~Li?6s+cy\S m]GُX9N7{r]:|q|=(tq}H wN?(l?Y'\S\o\?:';?y^$xF l?vŦb{^KsW1@x*f'n,1uR17mir=B'EsĞB9ybl(W؟<w^Kn@Ż>;?zX;wjϧSSxr{n>p/}w}uë6ۯ϶a~/ʝ߾pzu}wu? ?ϧ+|>1itߟ=y'||zwr8/۫-^8=rqu{{]]o/O-=uZO~g??ً'?Y^=YVb,YX.޿\ ]_eEW7&G_?^>o_חݏ=ڞ_\ś'ūxe Qon~y ɸ] C s~rq޾Ͽ rׯ;dZ?w` ~W[|r@6ۿ}^`W|g/N|œW_&J.ޒ _r֝}˧+|uY(%.z@d[="}Dy3xq}8w!I>m/{ٓgO?ݧ߾nP(狫_Pxz?fq==}ŻsRH! ^5W ~p4r#_o='dWx$(..Gxyt;$ݾ}k淼c[oy|; ԫ(qwxO;#t7?]!_O]/Wtcobx%ՊҳO*A)A?+V:˻OW{xEk=>/@ ?^oD~͓Z|DN3M-Z-KNDE4QOE5We/{3kBZ<|^u?"#BҎU|ӳ'>}3}W; _Y֚g˚zPt{X$W g9~?Oڛk9e﷿N+|L<( /9^q߾vo/w_?gP7$8_vxq~Ej Ua6;TvF9;#7d{vr}o9~0hݻY'Եxl *1_^91tMx;ߎW2V1ӏL_Qk~IC?}O[j9#yl09<5=F1*9 Oo/7lW:xC|}?hWPKzFS}Ńda~ޫbj? ^^\݇ӡUmϯgho?o1y=j$E+P@Z3,zFWr5ޢ^|Pl[=k'}/˳OA0‚\^]r>}! A95q. @Jى L}AS` įM\ L[;uh__=qAh. v)+1J;=u)[Wa" L]mSW4[8SwO6[QR)vf{)9p> m`'A}wH%S0ۜ럟'|z~ ?HĤ R $hN\^I7PW 1<<},m^'|cQ"Pj'8LCX m/ uZMc"f, %q$YnI\H)BzJ2Ymɥ6I|19a"Z6`bFI3,f=aSB  HQeG\R^0œ!֨/28 D=S(ؑr#a6G Α =UptJtNe]_Q|PUK t&|:OΑ k} )xC<|zʻA9/sřjs5&sR"ۧunৈ7#5" kHg5xXKTۆϊJGQ$ʺybؕ92JƸm sxN A wWKn\[[Uh*$D,JuKT_I^3}ݝ$Ra0eHEjܨa 跱f%iok\|E-%j|z-`H읍0yLRs2Jуhvzp,>2*9Q{Y0=krwm)(D2(ta̘;6qHI@/f1j?AZ՝6Q}٨OӡtkU{ , y?oy1mCW QV!FbAb !zS@!FZ&f@[^(Hv<^Ŷ]J,W *DM]^G}!b{i%afD2!S\d&aۦx//W0?v\iSj Jhpzވ8fȋLdNN6CPQj[~h.T;x9T_"9(Yi5m*h,]6 v+m켼bAa*DN5J ;*_B%RU$]L49# ~S}O yy M8-շ +%lBY=>9|x{<U7QZw(bfJK~ 耪{";$3]:9Cvbe\fiΛ,W1*3FA(VU>\̈YO_2?p=g5?}̆C\F9Q*uˠ\/- rlq}jr4A"wPFr[Ny^Dp:^hQ0 粊Eհk&QC[ %dV\Thct="Fu1$k-ger"RM=V9m4Dc~ 紹a"7i8T8Wh\8߲eY(rYYCI=#T;9frbI9匎 k=D7"h R몖1OZ>PVՓZ83hJv @ȅ>qn^ sX>=ϠџA\M "U)XAKC74eA_ fy ^VEP*"ߞ_p/47%ьl۵Cq@"A25 #ε^>%W-(<&rU6TDnr$+ZŽr/J4r*`wv̐H?֎GeUeђZvBqU)k>BrIDO;&Gz$Ov߆N=F+,5$Q<lqpnp>OB>H[agݤe]T*b~$?d"6''kKKԒs (sLL}k77 "zz1jY Ѝ+o}Jh}f73cY0b-,}yUE*LVU0htYS7 S"m:jW\uZ"1_CZtBme;E P^ʡSn)ZpX1b`U Bk4hSz+\ꞷLe"tZ4ֆBZl1iUl)֕uRJ煞$ſh,S6(.zDdA6 alkb$2F Bf5VUZ51b>R infϩ$TFk82ɲQ=g ,LV*.M*ʋV)}eSG_5"KC:u~V1 ?ғ *y8-cxS^0uҳSdZV-扭{eLz3$nBx0%r ȴI du&]jIZU5=!k 2Ge53SM]#ޫ$C:юf8\oG|0sAO99{B=צe ]r~D YYaCH>&L&-\)F$6âk6waP׎9*aUݲ޺8TzؽE41wðlpz*:2c;[Sƽ M;f/G=P($(6sq8 \C'؝sjԴggh&9i]U_MT `ekoۯ- p=);(^WָDll/'@E;Bd:m`>=wpoK 47{=n0ы4x7e"w4GCAsF䊺^sR;2 Q*ѕܨzPIM+#B*2&~{獎ⱐ5 PD\FGfM#Z)Ȇ+=0~,2wmoy(џ|瀇Po8ts0{4Mp?aT2I Sz!I:ɦ2]jϛMI)cBbCnɎTf@U^3` ڷil!@INQOчCƞnGBJ΂{w I f LB#u9TO3=;jb 1lmA\&)FK1ur, fkGt=qXqΥ6Wu>j"ߑ$Q.JuCbS}- IjVox;)+Ř;dU7訅dx(ut 6Ǩ)"2sV6Q)5pnX$4wL 9#{)L>sA@m~ cVdNZ{L@:х6NDH{W …QS-zzFy4 ^/}J)J􋱜ϭ/ŔޠKѵuޣd}؃`9hdw$֔yLR=Zg2'暟;ԚuN2 7c4?Y̢~m_v9;H]ۧx,RvF{v3(dS mHqEembQY@ܣ6~lS\2\@ -A)UbVlNHP0j)c2vŌnOJwc?.DُsiPThu0) .5\ݜHb n2:ґE+۝:׵ML~"Y4Zn 261T[Z~<9. cKY.mM58ϞB.Խ9YS(jk^J>'wϡth%R0\&Qӡfj*T|/liv2,IV Nw;:]Hnjqb&,mSqJSϓ_˔ OuӖPXM$QkR47VOIjQg * >rj x1J$ 0`Fx8q (6Q#Ԫ44/w%Pn^%h~ CN9(VÚ]G)o.i4F_lf߼t( c55WB`s,,A>i2xФ8MhVmiamSJ,6ݨE;F+Y9#CN:h.7ZB݄D@vx >Rk+\pҨ浵T& L zX_cӍ3lC:W$nid !襉x; #kUffWf5 7jlZqx̷O'Ⱥ aWu:Υx UbpLmO186W)꒬ ӹA'p"# #JZFiGw ySJq4wu+\сH8]<{𠹑pF0{KoWRo59<#ͰAw߬m w׭r{V.P{Kz4a H*1 BI?M0w]0aI.`VI?]uqŴ!*g$!v Tnmo67_/A y|;TFPzL\C)!]!^RL_D)1 L qSfڸ.W0t`h4(j;N9}1э6Ҧmh֥#U(hKBr]wԚ118cĠp9Z};0/KýpmR]f[-Э d@I8LڀI yjX;0+X]&4*µaod z3 +>|yS ]C™s.Gu"B#d7ݾ щRpzGT\³ND&0{ \0:ld\K-,G)\7h vr1םE&[_-@v$Q1]ؘɡ啴 ΋iAVRC𕍉@c*Z0#s:$ZA)n-5td=+6<_o힙F( ( *"0y/v7Ȏ3 ({3yhϸsV ia gKҋ]fO%\Q3N.f7LQn x@u.(Êkaur F7OUT ?M0e^*ENw]R,L$ox@ zR/)ݝW;3t7JwϜVۛoKg4Y3D2UZ!)̂röM zôۛjf2FY4j U!.fn&y~CgwMnG'\:En?%Uid{7lEL9S_gV1J9*J#Y"-  0s-VzLoO͛ d*.(HFjTZ<dž[ٽ{aR1]D2#ѻXЭ լquvu 7֐3Fyᝄ hS,'XRD^kQ+F!uJzq9*d\{C!^^q;[zALk"؏ic`ћ)tg;rg2 21AhD7}c q=U< !/"u0gc\)4C٪Lb~})#<hSQ%ۤ(q` ҌM1c2fZV8[$C5[8Yz_b'x"=hKq6Mjel4U1 -i& Lmae2օEsž\/AL(Hxr\xƈ/3(BuE7ވ -UZޱ~D2b@vl{}zM=`Yjab5Tq2-Ӡ5唃̊!f K\mgg\eeb4l{iPB+*ŞQq: nI*,N}wsN2ԢלkR=8qFm~Ø>٠4ryjŊh"H?'{xhZPlKt+аHeۏԤQi)eҥ)zrV kC 4CĜ" 祖bIxGvbP_7L+7`xY+y1Mb2UKn5tyeyQv$:56@7hbR()LH )zJúHlC``T%0B(^*]nK& }Jg) ꌝO;Km*Aˍ% t=PxlRL 4Ѓ n^PR86vF z}5NvF;UJ#DTk BxF^ؽn4v+9š9: k jN< A;ZjX975M;\kԅJFw\SY'Ŗ^skG,+sLe'*Kw1F4`L1@`ls/Um-QY}Ԍj7a sue#$6W7niS'"ViePC&IMs|vD)L~3g5M9 C!@봀Lqݍwd V+Э qVZoW+?,mZ9#ㄡvd˜8&|B\mqBԏ1P0"|r!>Йlhs@ b알{B>Ai{2m+1zgG*7@k^Sqf mn Tf)k ,m/ r=X;$)tgbNdBd:RdpkpHH="*\uvÓHF bV@➸@w?+LPA,Gs7ќ _y]Q\(c:ͻb7ln' HnOho-U;-?Nd#fSF\Jh77mh##p`ӮWixsKB›^& ȑzh3ZS;NB7r½w⇀L0r1]π{ihU.+,\~) |{}3d-="8LS)nU^Doq?--cٷGJ=-}h;G ^4ƭTBLI톗@dC[6d)㴧''ѧ=`yil92 LbVb:$%`őN/[x}? /;PME< BhY?IqfC2J?n7ĝ%k PgFx)޹p)~ȼ~Ԭ@-c1Fm* \qzل5soO`F uL=f!m-^_/Um?Π eU',-RӞQpFY5nScpPlt: '6K2|{ l)a~3tbEu[#Ihxほ'6[ް$`0D1Uj 읙t`-x, le\Y@z[ˌe!kc& Ȱ{#f% pCCЌ,alNh9J_jQzzW>DY@l{\S~#$KǮo4 N"^1a8O (ʁ5ΓeEQ xA" vj,-ܞòȃťcP3Bx,E|g؍79ձ8I7{V˪=mc﷓W6Psr4ϕ:"AP}w6 ;+Q# r8>uȣ10@)jII3`J^(:&KUcw 2$0Ic,; 4 @ܫGD0Y$F$wX "}&/1UchѮ7˸Yq;ZGZvj= CkX +o@#}kkn`1H v{({C_SaHIZ}w{*[˼*mCd+z-F'nFOմ {/0jtViqm蹣 >ZOu)bLNNqF F~NʀMOA_PvB=hnY%)_gz@h]ЭM 8MS6@a}8S||9d@U~vmoPȽԟ@YW\i@R:i^:خωSAXT_\^S)" ]g+6vv(xhy:p^MЩK@O >pAR^%^V$LꓣMۀiݰdo,/#3i}Z֫lu:$ ﷡TH`@$ t?qa4sXx4;:4oj #gMapOF%l`;Ap][` P}_q@Iٰ]QW4&>76. Y,cȖMKoXt]L9A?ܒ49?qcXU4 6*2sP+!gcG1ƞ.!%hd^8w0R'Bm9w+ohCI4P0¢)B]S8c7n'<  Mg/J\Yk7WPG&aD^W]߯*W!eM_@ Cق4~l[v3MаMH±3cdy;ZtWdsrp lsv6& ׿ 74u8-BrL7f9FbpQ9Ą4|7RD bO;`UKiGgLjQ55:z7]8]WPUBX@K `=z:3Lָӽ!)`{oo@.KPv'ō " ~%p?Z35~IxBCW]oF|f~ {ݽHN%a Fau8i_{GQ$%9 Rlx$13{|N)6\}m3$H/:KږmWb|y #6agbl6flnz3[mnzng[Y۲Q휭RlWsB׫5h|uݗ&/VymȏU\4FlV> YŌ3yvy{`k܇r.1ˆ4++ ؝,߮oV95|-|%˝Ҏ"@a,%-ŧWϩ7dR-<ǯ_?Z<>_0*SQh@ b}]iRe$I|g;4I~Rӳt>2j@i OM^4.=o0l_]yqiO@I< 74VOsGv T1]}|zlB#rxmH-RvƉ5ТWB)r%^ %w W|,9_,`SPRAT1 !ii~NCCH0f($H90W띱C鿏ҝ4 tُ+0R~ \.UxwAad"h:\j Otd&Km0/WKKb=](a0v T. > UqmaA[GR H#+ . nhO8k1>u˝4V$рM9dS_7T}D%~dRD$?.S!֐>U*ĈS 8?R}th2BuKGhx13y-r#J[ ']Ku;(Ca8BV&Qb!{OQK42\T;ߣO*T|,CcDaxCK:Pk^tCKwŽZ%$T;J <CwJ~`*+@&)Kaj (瓎۵O)QێawJq2uܓ<x,OIRE S0S*P& #$)E*0HTQp8`-Z&B3 ज़`=hv,׍w"a P}785nw㓓eEw)Ih;NL--u.MԯN!dBCGenomicFiles/inst/extdata/CEUtrio_22.vcf.bgz.tbi0000644000175200017520000000471514136050457022436 0ustar00biocbuildbiocbuildBC U1\вYP6Ȩ@[ IC07d6CY$ F 1 4u St!]`0@>V!Nsfݻ]Ι<}s{ܹyRڡCAA1xO/KE2icү^+Ċү/yqB_7Y~cfψ#plK>%HHJ?t5$/X/n}Vg{& 6?~̿~%3x:j|D/=v\kɅW'榅&rksW[SVo\kδGM ]X m_qX~iwrgq}sLc=r S<~d]^P#x`/{$o77Xyz"3*ĵ%qX_[gLj/zޘkG^zX{FB/ؾDi{I,yY8oXq!AS>d(e;y}#Eϓs,|xcu8Ok6=3+~Hsɇϳlt}Kn2G[~G%VX#=GtN?~$?q\*2K&=v'<,>xmy[kBgaoI./VߏKoww#Pk>Z~o,exy>ú9;sťb`xz)q|1_7؞>T~ٿOu)k}p_*m=r0~=^Z&i{7_P)>j=2ߋv<\ϊ9kߺF<7y}RK-<7?=y.:2/K]m?|/ӣxMX^?'+),-b-b-b-b-b-b-b-۹J~kRD7^GM[?Rd& #*óqșJΐe ψe KD΀LQi)9\1<ej-r@ᙠ1CNdzJ"r%93,ؔ5i-r%W rFG2r&)9[DLCș\3!g3b"fCHlm|4.$BIBr9 Y(HDr œGó!9x}=mo+ xg#E8J&lrd~⩒xʆ<%9βMrǵ I|g-R$Z2;-uHNl`ErKr~e I.d$w֑X&5U/$gX[%92Er4J,ɍ.ٜ+9j#KrLKrK9i925s!-/ s'#9M=ZId$l$'m$l$'lHr _ܯl sfRMDr TGJr;uR+5mԄ ~IDj˰5s%5M2MjD)֚| kV kdo)'ىH DI"Rs$5H8%*?9"--ghmJԶk\KjP(ZNjB$""1 BR!U`pGX&wf|y>HFj'(q)äVBX3$ (*tBCGenomicFiles/inst/extdata/CEUtrio_7.vcf.bgz0000644000175200017520000000362714136050457021605 0ustar00biocbuildbiocbuildBCzXr}fk!v"!)Ce朼>M*ݺLF$S)?XHeÖtCDσs}0ˏ.zNjr|=Loy[f- oӞm6AOHܯXdf kXX'6hB?#UQJ|_B& wYt,_W2tZڇ崟p2^goC0ߝSG ['~Dw4# -NWHNf92e>o ۛ2%md!U̯|&. DS'\蓠M|rR ѓI9`"R7#)dO7vNb:7DSDG}=Py"%T(!B` "v՞/nC i݅>s`@Τ.:u4Cj rǞs'];޷OhlN[PacfKixas/A13Q>  _5 C#` , #41 Wi _s1%qXVf\B~r]T> )o[^ُ"=mv [,:x%E Ҍˆr}a_$!ZOH@[dA{g@KhPNVV> qnbA?{#eAU;:T'!"UMϒ5V^>Jf)u"gM<%,( #dDyйqTRr약9O_΅g~|хU,ŧ {.qYG @tCsCe9:^{,?8};;Ypqz廋Cć|:<?Նw󫯓g3՗k7 ].oc4 >yϞ<~ˋ?=?-ίoWzzݣ˯Wltvq3<닙|t38_3?'?O?rvWOF9‰_oF5Bc&yWlo6&WW=3OO/|z;~ 㓯7?{|R<7?}]}(ܛ>|\x/1g#wRtunv=/nf|̻9oZyٻrs_=F"~V׷%:oو/ݟZz5%Fꋷ^#r˧ѓwAl>堕}b~~v1l}<|_}~O=o쓛7xOʣ2VO'ïȯw=ЛG7WKϞϞ?gї?F_g>1헛O{OKH˧~E%ލG/?z`zUxu.a~.痙sY.]܆wy9~P0g^˛>qs(/fs,F?vv~3:-ndanc|D_ًdqTa/´V<+KtYY;m\i(&/xӋ·?\>0uA޳˷׳;/o`uw碝X2zdl*Enl\cӄ-gKywSb7֪7KZžM?:O{Vwb1[,ؑ3L\JI w}84 *^?3z~ze4O%zS*kmՃBAa^5UA)=b~N%~=Ŷ¹W`VxU)nxO3vEGcZN<CD馿9p th`C-}b K9)GWa}}/fn>>FG-l\|} 5o R` E|-o @ $ }O ƇBu%>cu;熴,0Ⱥa'c, b; )wrM.[=XA`SsZd,@}ՂGDT-x&tdW ; c}z{dV"`_;VGo{my*s4 |џ_/o=9x^ßr@$Az8dN?A;'.m/N0a/߼98} _Փ?O<6 T5{῱O^1#V1'_>8>>>y9=~5}ٓ˟!L8S7ǧd~l|c7S3?k3!_><>8d6x7V-"H./. ˻ҥ]*_qFW,aE8~~nP[7|T^>~d#X~*C+Zy`OT:c|{ahjG^h:2Zvg8L &;AnPņpHdޟE3[rשj`8-W|y2n{XI3RGeYMCK-v)XvfoOT BnYLe&H 2]\- BG&4--`R&Obu쩥9;N{6o|~pOd*n¢+j 5䑂bRaK[Cz3XǭЩf7S[ʑfDy̘Qe!!+i+U{!I]]BLn 50Lm}+) #ZX}'&|2FWK dy~G&Xyb7 ;z0X1uSvkTUEJ[3%Kc[kؾN6ݪwz^I^'? cU>ؒ?6 (j,ҍEzZ I\y8>5y7uܥ)YQޗ S'LJRz40|JZ"RHZJ@Ğ_Ϡo%(w,"`@Cdn @mM#iQP=8b'+ux]dKGI 69bD(EߏQFWb/Icwp) TNݯ"PCM&׉ܼaÏIC[5`4ϮJh,,%b-4dt1Z'2gjB=ᙪ ʹ.q[]5:+QSնg F/LjC,ަ j7pR[Բ&t}J`:Ƴd= Kj=^BWߤ;8]2Ɇn%E|fZ7}a^'VbՂՖ' QP ;NJ=8HQ?/lleCRYZ^]֙ n Le֠Db!86:c: irf4z vps13=^ q .!f ^o'Zߣ ݒW!<}u:pÇg+X.(CĸP1%0WD4A4t2l/3iiIH} Ʊ)j{G=,0 E3O3Y.3fSe&dI)Y^pW+Pra$?^P`'[YS;Wv (VTF ײ"FLPoZnLC72-X Qv({!ar{fb ʖrz.Xlv1 Fjs0Ъ_Xl+ |Q 0.zXY kX>W}Ӕ"W?R11ua9r(yvl{CfdU6Psz~E"ِ3'#0uq@ܷCqֱ-+Q,Ί;ROtz}'vB 4ݧPHe9͋ב`ĥ$[ 1 x3|\Vj˪/j=&c#|0hR  *U("[Kk{\JZe֖f*6Kf4R{x+׻׻[%42:̖oz8 @} w$ᖗU1-ͻ+6!nekۚܰl=~K jJt ;L'1K? Q qM #R@JDԂ;DӵM&:hbkP P1ZtP SJDݱz{VQ︣DVˆNY HJz۴vbʸ~=6ZeAxڲ ]nq[MDJT٪U+DzV k}#1Y|yz,1c zvsڂeazek ĉo7odo_סu呝jM6qZ (^%>pg*pg9>X)&'6l kzKʨlɥ~3oY(%Yh޾n^X4jl9^BУh˃΢.'{G.V\eJȎv-T-U/pX BY2oJofAf$7-Jh4 ZD᤺Kh< GڦqȤrP50D56 fkKghVb+)#v@k5V9fQnQ;B$r .BXM,~`A<֜C+.WlTh{t !> NFJ,A u ڥ >Jf hU7NKD8@*T! FF)J$t1OB ʙCra@m +>+D)&7 Nв=ʮ8łtJⲊ#5lI ]rJ2sa)b/;ȯ hWߖ}`gGZ岑ҫ`,pPhpvU fM"9|MDžBﺺOqMU8SցqmF}T748m+)ݩX(~t7ygbVՆkJT_o9,nc[G61J, E Hy,@X6m@\ ll-s;Yn) t^kJsfI!(wx+\EOf dcl𢠩Gko?ٸMCe\P.DڰF5Xt2#帟W2)EKd-,^m"/ulLŠrvuTiG$:a?LdTn"CJ+ `H1 Jc$uAIXưH+9C2 Mz]I롢Z!vsvvZDi( vVWM)mu be -Xa9Xv_uP Rw 'ѳt񴛋-TEeE)bv~=eD]xX)kR;ͣcp^%rގXmk6h94N8ZKX=6*I*V~$eRMdg_.H?klfpLTZ˫S[+تڃڐAK.dAAhoc{iBQz>וʍ0wܺf`y٪uQeůUR3R[/1U6Yl S y𠅁#)q(1sB 3jHj 9Ohf,t@2 ɗPѱ]tJ٨] 2&r98~YNOOi*j}{#vxiY=,ZNU+,SltN*96ᔃz7FXڢ쌂[:e2H{Pbt.h(,IE龵17eͶ= e$Иjh @f8b96fj\XKR(l5Mځw_\,`RR:ET[CzƂgɉw06ڝ}(G ܠ~US=loEȘ㽲 w\:1Yy,u}vjU|c&+#[uQe bWHp%dbCY` ]Z!Q/febGMN芾lhBRU)m`< ;̭K  j)8'ɵ\'Xe+Q)7_ Fn$(3fud̠&2RT5ǎH|tB+^skQZ1<'ڀCJ)PČKXaxwO@y ;ܱDB% #Zӷ%w+".jl3dĖjf7[T ;nѳ^$+5*9EAWJrtOJO<ݓǘS\25}(MFMs*![3_ٟ=S4Jٯ ),*N^̆(֝<7r/I]DG EOrhX߰-+KD'#rI2@ }&et6dA$('LJ:t[ Θc7eEF%0B8?]A_.901Dt7\;@1v$#)0HwNEY|cWF>*K'.b3X>)ޡhor3`#MI}*r\+b=8;fG\ozy$h2&l۷9feF@HIU4kz'd̀:1J5p0wXv[/bm:}g&*ϒHGfh7) cIReA)F./I-1 n6ܟ "ajRYeje]=˙/dIA]ŸѭR6v7Y?-*Ʋ(NĿe \xzrzğ)_U^W>U 3PH[˂HMCuu 1BE2 L 6a6KNfcd ;[l`B^vEGY[]mkpCfY7S۬]ٯzn#q5t` t9}O\;녌p>'?'cS)Đl{1† إՑx*^QxlaD#XTľp70 Qn 7(x/h7Q)Rn-y|YR`H0]Qt܎5G=w ߪ[gH/xs­GZYJڶ;QȜtƙI%@Z(vlE}>v BLV?SOvLfrC;J@S'$v!s锃e3$8&vnۍ)v:p+K5 jBfvr؅O`Ή9N0D.Ba})&$.mZ)%gd _6n]AB@'0x@y7ޖ o[ tڙ\u~${b| Z6@xoomV2:?i^lQ.G3\6?vc ~*?Tt TR)BM?Ƒti߁Ͼ-߷Y;-}P9X\W(8n},wY.̋o$^Gl{/ {E`(D]W0'n.WV{'ܠ]Oc҆PFxrwպD |bc3ׂqX+ޛ,5/+/ruº' k!Xihlw LIcr"/%Qa)Ô]vGiUeRTxyz2Fь%eh!=rܴ%T~aH121T~w,.gE>/힔-Vc1;[+L191 l5g4 Lg.i해]آJ{;غ 낱=&K@,n4iL16נ3ݛZ;IDuLCV;P:'6}'6Lˌ,PH%z9teUXg~ Fvb ~ːDlRF4 t!R`[s! 9I'liv.^8#$,>2H1(zfNw 6mRDAs$-An~|,d6cw1BWĬO^O}|~nR}pvՖ-,Vc~WCju˷sU %b!#uGܾm [oq<%EvENsP\t@Xxj^NbkgP׆"0ne;Z󮠘MuHh9?i92Ar,,XVNN >tƻiapS%xeUǑ҈<}%'~V5UmPbMZ UhCAC\trS)=O@+v|/ H'#;NS~dS'C, Sk@W@+IHdP'@m6Mጢ3qԬy9=F^@ lRN@: J4B#L$% UEzZ_;H9m/REv;${iTaTNM ʶ$96&WITf:Mp 0ά.ڲU dmsr_>Le~-o'} ˫Xn5f8ɃvPKS{Ka]W{)7XId7"lfGm^biF!= SN?a zoP3RDO~yfA "!{rwAf5OQ$m ]@Jnhg<+ lp^qX1aPcE6V C:X(zNeӲIA-@V2%OdN̿ ?Qh$ʳ;%}&e<~evq!Z6xr>9@{wAT`cDq ALAط9W6ޢr]هL*Aצg>RW|ToT=ZR0rКғ: [H,}<2ĺBA Wf*'Y Exd n6TJB`G S^;DPIK،mZLjVhR-(1&E\  HY{QRZAbz2 }%$'VMF$Y00eFimK$=]=WXʫ!&{ 7|;x%S2tnFQk&1W6Z>pRLvN}lY͒¹C9 3MFnL [h'@Z)hveBFpN-WBC]O0cǎr! j⮪jBDaW;NCPGa1 >Ģ[]-b,ET55XUOl^Kusm\f_kgUWu&<9Hu)tuX-f5_njy?.&54n2&2(e* j+&[a. J:8& QBX.!>=:Xx1`a\; J(.ڲ|Ca:v6w gA`Ne$j^XZ%[^O]&r#qܔaN!2ě+鲎!GJ?P_rXR'K8 賂m|ΊR;V&r}؛Xհ7j` F}ʖr=3B,m%N$!6iOvq|YwߟgPy˂z2 6*LAjzno_q(ui3'K }fmݺ]\vծպM>LYJLLh$5HniU=BCGenomicFiles/inst/extdata/CEUtrio_X.vcf.bgz.tbi0000644000175200017520000000631714136050457022422 0ustar00biocbuildbiocbuildBC pU5BBXK-e 0`,Ȓb 6(X5( %F¢@:6+ F@ +;Pp]>f,߿{Ntd?T?;2+6AK^~{jB5ޅˢ#G6u|爗}TDO BPpw? pZ0χwQ>um&êPj $?$* 1>̛U!}הE*\OM-?h[= Ƶuj(k,Kt0GQz.|>KE|ym{WcUݘOc (W;^܅zQ}D&(d̳qq8=wY:/?s5|r=}+ ױ\qXyS=5=W؞Վ{MY_}nWkV qy-<{w@Qx劫wgwg=c|p<8>ГKMʧW9U7_*f1oWDex功s'?\^ͬ q i8Znp5!?>9z3,W˩Y+n_r4~]sy-W&~KS8.i<::O<_}v>b7)mmc?GCg~4|5_l* k:7g{S;;Q^ayW獭o8Φ΃1|<#2_'Gun!Ľ2a2z~됿V N3qz%Q^+py-<'pz?p+Ͽ: ;1ojC̃_e(Eqc̙0/]=u} e;Tus"+9:JyJlj9IGyt~|*dG?~Ӎ^]Gm= p^4x7E:zc?suU 3 94_u<a^gim{&Uߛ_/5\ú|!ry|GkGyl^F=dڽ1K3o#ld{V; p^qJܮ39_`7}׳a5 `Q.z6;=ίCGX:^ LuC`^躥'۹ڷJp^q<<|nW}Okf{S?IObuֻ[~n" U}B<݌2ʣnjf{P;Oσ&q~Wex\:Oμ)_v7]mOYC>uElojgO֋S:~p ]G`]mz`昷^Saս!oL{'7xQ]u4MڧNuiwy;wnrS,nCwZi2go>]TYQ4,Ϫ\#gݭ>gjgܬ>t+Rwv@_Uߑ3C}_s]h;J;RX]oS0M4[}Q=fiRߑ7Cr7V߉6]%! >4}G=4M3mt3|Y0z^lOWϦ6at|7gP5ukF= VYogPh*'M,6qhYުKY..ӽ+owC8[ջ*U]R\+zGizzW;L|N?wՙQn]4S+L4MnG!mlnz_ƙizɯ̘xtyϝ~nwO,A<ˁliPig\)96jD2 2LO2Msś;{54]ot x̜iz)854Mowl|wYzi,,v\NьYX`zWd{,nRL{K1xochrLXaVH5M{\^]흎Hsc3M4!iii51"[[<[W4w7Ms6vc~ᬺ5Fmveek Van]mݦ?d KLin5m/$6BC/;/CQ` Xlf@,5p% ߠHn  ұ^H(Zգ*"ҤDOϹoƷmܩ/1}f=c7?|b8}^}XOXg}3s#P%33Wx=a=-vF=rN:q=s7伐f'ڃ5,rz.G )zpɞY/~ze;^yc;7Y;rUg}Xmzog;:?BCGenomicFiles/inst/extdata/CEUtrio_Y.vcf.bgz0000644000175200017520000000473614136050457021651 0ustar00biocbuildbiocbuildBC X[sH~V~EWN}"`sd3/z"$" liG$eDέ7oV+?:QC՛7]|ύ݇⑿l'X"7)[xoHj ?" gu5WQۜ:{KWjU7쑙%_u儑B wA'.7(& [< fNE v1< v~ˑF<܇k˥E"H׿N~z7q-7DU}C QU\>EVEt( W2p?Znao&t~;AT0[rϏfQ΄DE|̓sdO,ВM F !$:%8D‹oaėEa6w]OVrqt#CUuԠs$CAA3FטC{u@ȟw+; {˞)QZC{(t;(>B rT{E dCQ> @;H_]_R6<@+>Cyl|:3WKh;+qڂLeheȃ۔AtA_po(o"YDhHv#` dYsjRoyHZD+sY"3{pTbJBO3f\N|N!mm)A:{FN[B^/$6;~[0tflhE$!ZQm%qMhB)@:uDxպ bYlg ]Ai0N9Б/$$qi3B'Za>t#JF9ps\8*zQvEyi^W/^\ݠ؏/BDNDSv{3)YG݂杇ǝ'z[fgxt;^Z;B&vCI,[Gd|GŔDO"Tq}5b-XFDNA+F@$8CC(뀯鹡ΗժQH z-Kf~e-l N^=9Un@̻ Jp["@p.tiV KQY:lLmm˴$&l]+9SfKۘ隩uJJ}nZ4V ;8dl%`[e.<ܚE];G[' kQ9VNMݧ#f܂ݭㇾ2|(2(pNPFn+OEvT%y i%6IO 3fQmhntie)d4[ ZovU]=ΤCè@XP?jc$ͪa4jجtg;5۵Նck׆ 5bw1fӚ+F+*l5\SO>^Zթ;gȯ U/'DN{) P`)h* J~ѠHL'z9kX+ft*Bt2Qb2#uBjy +.+R،Q 8 %~O6`>1K!"P51abj(DU#Yl5hžG11H&Sz9kV) Tx~˄[¤*'Hd)@6S.F l1;̺Y%?) *6tb*>Wë5){dhpf1}pJeØjdLt0-M세¤6[9>8S%ˮ(YWmy}k'BCGenomicFiles/inst/extdata/CEUtrio_Y.vcf.bgz.tbi0000644000175200017520000000040214136050457022410 0ustar00biocbuildbiocbuildBC1jAYI#qZK&x 9EC؉vyئ{3.6M)e]iU˰7X^ԩr8Itm?w<ߩfQcs)YCr{6;]$I$`~!I$Iyi-0I$I$I$I$I$I$I$I$I?:+ nqBCGenomicFiles/inst/extdata/seqinfo.rds0000644000175200017520000000051414136050457020732 0ustar00biocbuildbiocbuildb```b`f@, "%n;ս>;U;D ׉.c&ktaeYsH4anT[ LkGkN,u`n|pcӽtfe ;c`p  Ak  X84KF( f%C*UZ^Q ,v,J.I,禢Y_l$,n a #01La 3ư1`a24 ,#82L,38βv0a@ AbXXRKҊANGenomicFiles/inst/scripts/0000755000175200017520000000000014136050457016611 5ustar00biocbuildbiocbuildGenomicFiles/inst/scripts/methods-FileManager.R0000644000175200017520000001210014136050457022541 0ustar00biocbuildbiocbuild### ========================================================================= ### FileManager objects ### ========================================================================= ### Tasks to manage: ### - (split) divide problem for parallel eval ### - (apply / MAP) function executed on workers ### - (combine / REDUCE) collate results from workers ### Thoughts: ### - Parallel exection: ### Should be optional (large data, shared memory). ### ### - chunk/yield/iterate: ### These are are independent of parallel and appropriate ### to include in apply/MAP step. ### ### - I/O considerations: ### Potential problems with parallel reduceByRange() and ### single ff or hdf5 file (all hit same file, same time). ### ### - run byFile but reduce byRange: ### Extraction of multiple ranges is more efficient ### using a param (reduceByFile approach). If memory isn't ### a problem, we may consider a fast method to combine ### elements of the list returned by bplapply() across ### list elements. This would allow the user to run byFile ### but reduce byRange. ## case 1: whole file fl <- system.file("extdata", "ex1.bam", package="Rsamtools") fm1 <- .FM$new(files=c(fl, fl, fl), chunkApply=countBam) ## case 2: ranges param <- ScanBamParam(which=GRanges("seq1", IRanges(1, 20)), what="qname") fm2 <- .FM$new(files=c(fl, fl, fl), chunkApply=scanBam) fm2$run(param=param) ## case 3: BamFile single yield bfl <- BamFileList(c(fl, fl, fl), yieldSize=50L) fm3 <- .FM$new(files=bfl, chunkApply=scanBam, chunkCombine=return) fm3$run(param=ScanBamParam(what="qname")) ## use yield_reduce ## iterators pkg icount ## case 4: roll your own yield fun <- function(i, ...) { open(i) on.exit(close(i)) ans <- NULL while (length(res <- scanBam(i, ...)[[1]]$qname)) ans <- c(ans, length(res)) ans } fm4 <- .FM$new(files=bfl, chunkApply=fun) fm4$run() ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Standard S4 ### setClass("FileManager", representation( files="character", chunkSplit="function", chunkApply="function", chunkCombine="function", parallel="BiocParallelParam"), prototype( parallel=bpparam()), validity=.validity) ## validity would confirm required methods ## constructor FileManager <- function(files, chunkApply, chunkSplit = function(object) length(files), chunkExtract = function(object, i) files[[i]], chunkCombine = function(x) unlist(x, use.names=FALSE), parallel=bpparam(), ...) { new("FileManager", files, chunkApply, chunkSplit, chunkExtract, chunkCombine, parallel) } ## lazy split ## load_balancing ## should have more tasks than nodes but not more than ## by a factor of 100 (or even 10?) ## sequential, non-scheduled, no knowledge of length } else { ## pre-allocate result list to retain order sx <- seq_along(X) res <- vector("list", length(sx)) names(res) <- names(X) ## start as many jobs as there are cores ## don't need to wait for all jobs to finish ## can access elements of 'jobs' individually jobid <- seq_len(cores) jobs <- lapply(jobid, function(i) mcparallel(FUN(X[[i]], ...), mc.set.seed = mc.set.seed, silent = mc.silent)) jobsp <- processID(jobs) has.errors <- 0L complete <- 0L current <- lazySplit(length(X)) ## iterator curr <- nextElem(current) ## advance curr to number of cores while (curr < cores) curr <- nextElem(current) while (length(i <- nextElem(current))) { s <- selectChildren(jobs, 0.5) if (is.null(s)) break # no children -> no hope if (is.integer(s)) { # one or more children finished for (ch in s) { ji <- which(jobsp == ch)[1] ci <- jobid[ji] r <- readChild(ch) if (is.raw(r)) { child.res <- unserialize(r) if (inherits(child.res, "try-error")) has.errors <- has.errors + 1L ## a NULL assignment would remove it from the list if (!is.null(child.res)) res[[ci]] <- child.res complete <- complete + 1 } else { complete <- complete + 1 if (length(curr <- nextElem(current))) { # spawn a new job nexti <- curr jobid[ji] <- nexti jobs[[ji]] <- mcparallel(FUN(X[[nexti]], ...), mc.set.seed=mc.set.seed, silent=mc.silent) jobsp[ji] <- processID(jobs[[ji]]) } } } } } GenomicFiles/inst/unitTests/0000755000175200017520000000000014136050457017124 5ustar00biocbuildbiocbuildGenomicFiles/inst/unitTests/test_GenomicFiles-class.R0000644000175200017520000000051714136050457023760 0ustar00biocbuildbiocbuildtest_GenomicFiles_dimnames <- function() { gf <- GenomicFiles(files=c("a", "b")) checkIdentical(c("a", "b"), names(files(gf))) checkIdentical(list(NULL, c("a", "b")), dimnames(gf)) colnames(gf) <- c("c", "d") checkIdentical(list(NULL, c("c", "d")), dimnames(gf)) checkIdentical(c("c", "d"), names(files(gf))) } GenomicFiles/inst/unitTests/test_VcfStack-class.R0000644000175200017520000001725114136050457023123 0ustar00biocbuildbiocbuildextdata <- system.file(package="GenomicFiles", "extdata") files <- dir(extdata, pattern="^CEUtrio.*bgz$", full=TRUE) names(files) <- sub(".*_([0-9XY]+).*", "\\1", basename(files)) seqinfo <- as(readRDS(file.path(extdata, "seqinfo.rds")), "Seqinfo") smps <- samples(VariantAnnotation::scanVcfHeader(files[1])) colData <- DataFrame(row.names=smps) test_VcfStack_construction <- function() { ## empty constructor checkTrue(validObject(VcfStack())) ## named files checkException(validObject(VcfStack(unname(files)))) ## all files must exist checkException(VcfStack(tempfile())) ## constructor with files only checkTrue(validObject(VcfStack(files))) ## constructor with files and seqinfo checkTrue(validObject(VcfStack(files, seqinfo))) ## constructor with files and wrong seqinfo nm <- names(files) names(files)[1] <- "BreakThis" checkException(VcfStack(files, seqinfo)) names(files) <- nm ## constructor with files, seqinfo, and colData checkTrue(validObject(VcfStack(files, seqinfo, colData))) ## constructor with files and colData checkTrue(validObject(VcfStack(files, colData=colData))) ## constructor with files and wrong colData checkException(VcfStack( files, colData=DataFrame(row.names=c("Break", "This", "Now")))) ## check override check - bad! checkTrue(validObject(VcfStack(files, colData=DataFrame(row.names=c("Break","This", "Now")), check =FALSE))) ## constructor with seqinfo and colData checkTrue(validObject(VcfStack(seqinfo=seqinfo, colData=colData))) ## constructor with seqinto checkTrue(validObject(VcfStack(seqinfo=seqinfo))) ## constructor with colData checkTrue(validObject(VcfStack(colData=colData))) } test_RangedVcfStack_construction <- function() { ## empty constructor checkTrue(validObject(RangedVcfStack())) ## constructor with VcfStack object checkTrue(validObject(RangedVcfStack(VcfStack(files)))) ## constructor with valid rowRanges object checkTrue(validObject(RangedVcfStack( VcfStack(files), rowRanges=GRanges(c("7:1-100000000","X:1-100000000"))))) ## constructor with invalid rowRanges object checkException(RangedVcfStack( VcfStack(files), rowRanges=GRanges( c("7:1-100000000", "X:1-100000000", "19:1-100000000")))) } test_RangedVcfStack_construction_2 <- function() { stack <- VcfStack(files) gr0 <- GRanges(seqinfo(stack))[rownames(stack)] checkTrue(validObject(RangedVcfStack(stack, gr0))) gr1 <- gr0[1:2] checkTrue(validObject(RangedVcfStack(stack, gr1))) gr2 <- GRanges(seqinfo(stack))[c("1", "2")] checkException(RangedVcfStack(stack, gr2)) } test_RangedVcfStack_seqinfo <- function() { rstack <- RangedVcfStack(VcfStack(files)) value0 <- seqinfo(rstack) ## valid update of seqinfo -- reduce seqlevels value <- value0[rownames(rstack)] seqinfo(rstack) <- value checkIdentical(seqinfo(rstack), value) checkIdentical(seqinfo(rowRanges(rstack)), value) ## fail to drop seqlevels currently in use value <- value0[setdiff(seqnames(value0), rownames(rstack))] checkException({ seqinfo(rstack) <- value }) } test_VcfStack_subsetting <- function() { ## default data is 7 files x 3 samples object stack <- VcfStack(files, seqinfo) ## test empty subsetting checkTrue(all(dim(stack[])==c(7,3))) ## test numeric subsetting checkTrue(all(dim(stack[1:3,])==c(3,3))) checkTrue(all(dim(stack[,2])==c(7,1))) checkTrue(all(dim(stack[1:3,2])==c(3,1))) ## test character subsetting ## default object names ## files: "11" "20" "21" "22" "7" "X" "Y" ## samples: "NA12878" "NA12891" "NA12892" checkTrue(all(dim(stack[c("X", "11"),])==c(2,3))) checkTrue(all(dim(stack[,c("NA12878","NA12891")])==c(7,2))) checkTrue(all(dim(stack[c("X", "11"),"NA12892"])==c(2,1))) ## test mix numeric and character subsetting checkTrue(all(dim(stack[c("X", "11"),1:2])==c(2,2))) checkTrue(all(dim(stack[1:3,"NA12892"])==c(3,1))) ## test GRange object subsetting checkTrue(all(dim(stack[GRanges("20:862167-62858306")])==c(1,3))) checkTrue(all(dim(stack[GRanges("20:862167-62858306"),1])==c(1,1))) checkTrue(all(dim(stack[GRanges("20:862167-62858306"),"NA12891"])==c(1,1))) ## errors if out of bounds or value not found checkException(stack[4:8,]) checkException(stack[,2:4]) checkException(stack[c("X", "19")],) checkException(stack[,c("NA12878","NOTFOUND")]) checkException(stack[GRanges("19:1-235466666")]) } test_RangedVcfStack_subsetting <- function(){ # VcfStack object with 7 files and 3 samples # GRanges object with 2 ranges and 0 metadata columns Rstack <- RangedVcfStack(VcfStack(files, seqinfo), GRanges(c("7:1-159138000", "X:1-155270560"))) # empty subset checkIdentical(dim(Rstack[,]), dim(Rstack)) # check sample subsetting checkIdentical(dim(Rstack[, 1]), c(7L, 1L)) checkIdentical(dim(Rstack[,c(TRUE, FALSE, TRUE)]), c(7L, 2L)) checkIdentical(dim(Rstack[,"NA12891"]), c(7L, 1L)) # check file subsetting and updating GRanges object checkIdentical(dim(Rstack[1,]), c(1L, 3L)) checkIdentical(length(seqnames(rowRanges(Rstack[1,]))), 0L) checkIdentical(dim(Rstack["7",]), c(1L, 3L)) checkIdentical(as.character(seqnames(rowRanges(Rstack["7",]))), "7") gr <- GRanges(c("X:1-100000")) checkIdentical(as.character(seqnames(rowRanges(Rstack[gr,]))), "X") checkException(Rstack[GRanges(c("X:1-100000", "13:1-100000")),]) } test_VcfStack_replaceFiles <- function(){ stack <- VcfStack(files) checkTrue(class(files(stack)) == "VcfFileList") checkTrue(all(dim(stack) == c(7L, 3L))) # replace with character files(stack) = files[1] checkTrue(all(dim(stack) == c(1L, 3L))) # replace with VcfFileList files(stack) = VariantAnnotation::VcfFileList(files[1:3]) checkTrue(all(dim(stack) == c(3L, 3L))) } test_VcfStack_readVcfStack <- function(){ stack <- VcfStack(files) # all files temp = readVcfStack(stack) checkTrue(all(dim(temp) == c(1000L, 3L))) # test read by numeric and read by character temp1 = readVcfStack(stack, 1) temp2 = readVcfStack(stack, names(files(stack[1]))) checkTrue(all(dim(temp1) == dim(temp2))) # test read by GRange gr = GRanges("11:1-100") temp3 = readVcfStack(stack, gr) checkTrue(all(dim(temp3) == c(0L, 3L))) gr = GRanges(paste0("11:1-", seqlengths(seqinfo(stack))[levels(seqnames(gr))])) temp3 = readVcfStack(stack, gr) checkTrue(all(dim(temp1) == dim(temp3))) # test read by range out of bounds checkException(readVcfStack(stack, GRanges("11:1-1000000000"))) # check multiple temp4 = readVcfStack(stack, 3) temp5 = readVcfStack(stack,c(1,3)) checkTrue((dim(temp1)[1] + dim(temp4)[1]) == dim(temp5)[1]) # test RangedVcfStack gr = GRanges("11:1-135006516") Rstack = RangedVcfStack(stack, gr) temp6 = readVcfStack(Rstack) checkTrue(all(dim(temp6) == dim(temp3))) gr = GRanges(c("11:1-135006516", "21:1-48129895")) Rstack = RangedVcfStack(stack, gr) temp7 = readVcfStack(Rstack) checkTrue(all(dim(temp7) == dim(temp5))) } test_VcfStack_vcfFields <- function(){ ## empty target <- CharacterList( fixed = character(), info = character(), geno = character(), samples = character() ) checkIdentical(target, vcfFields(VcfStack())) stack <- VcfStack(files) flds <- vcfFields(stack) checkTrue(is(flds, "CharacterList")) target <- c(fixed = 4L, info = 26L, geno = 9L, samples = 3L) checkIdentical(target, lengths(flds)) } GenomicFiles/inst/unitTests/test_pack-methods.R0000644000175200017520000000542114136050457022667 0ustar00biocbuildbiocbuildFUN_IL <- function(i) IntegerList(as.list(start(i))) FUN_RL <- function(i) RleList(as.list(start(i))) .unpack <- function(pk, gr) { dat <- lapply(pk, FUN_IL) upk <- unpack(dat, pk) checkTrue(length(gr) == length(upk)) checkIdentical(start(gr), unlist(upk)) dat <- lapply(pk, FUN_RL) upk <- unpack(dat, pk) checkTrue(length(gr) == length(upk)) checkIdentical(start(gr), runValue(unlist(upk))) } test_pack_unpack_no_op <- function() { ## empty gr <- GRanges() checkIdentical(pack(gr), GRanges()) grl <- GRangesList() grl@partitioning <- PartitioningMap() checkIdentical(unpack(IntegerList(), grl), integer()) ## no re-order or re-group gr <- GRanges("chr1", IRanges(1:5*5, width=3)) pk <- pack(gr) checkIdentical(ranges(unlist(pk)), ranges(gr)) .unpack(pk, gr) } test_pack_unpack_order <- function() { gr <- GRanges(c(rep("chr4", 3), "chr1", "chr1"), IRanges(c(10, 1, 100, 5, 2), width=1)) pk <- pack(gr) checkTrue(length(pk) == 2L) .unpack(pk, gr) } test_pack_unpack_distant <- function() { gr1 <- GRanges("chr1", IRanges(c(1, 5, 30000, 30005), width=3)) pk1 <- pack(gr1, inter_range_len=1000) checkTrue(length(pk1) == 2L) pm <- pk1@partitioning checkIdentical(width(pm), c(2L, 2L)) checkIdentical(mapOrder(pm), as.integer(1:4)) gr2 <- GRanges("chr1", IRanges(c(1, 30000, 30005), width=3)) pk2 <- pack(gr2, inter_range_len=1000) checkTrue(length(pk2) == 2L) pm <- pk2@partitioning checkIdentical(width(pm), c(1L, 2L)) checkIdentical(mapOrder(pm), as.integer(1:3)) gr3 <- GRanges("chr1", IRanges(c(1, 5, 30000), width=3)) pk3 <- pack(gr3, inter_range_len=1000) checkTrue(length(pk3) == 2L) pm <- pk3@partitioning checkIdentical(width(pm), c(2L, 1L)) checkIdentical(mapOrder(pm), as.integer(1:3)) .unpack(pk1, gr1) .unpack(pk2, gr2) .unpack(pk3, gr3) } test_pack_unpack_long <- function() { gr1 <- GRanges("chr2", IRanges(c(20, 10, 1), width=c(5, 2000, 5))) pk1 <- pack(gr1, range_len=1000) checkTrue(length(pk1) == 3L) pm <- pk1@partitioning checkIdentical(width(pm), c(1L, 1L, 1L)) checkIdentical(mapOrder(pm), c(3L, 2L, 1L)) gr2 <- GRanges("chr2", IRanges(c(1, 10, 20), width=c(2000, 5, 5))) pk2 <- pack(gr2, range_len=1000) checkTrue(length(pk2) == 2L) pm <- pk2@partitioning checkIdentical(width(pm), c(1L, 2L)) checkIdentical(mapOrder(pm), as.integer(1:3)) gr3 <- GRanges("chr2", IRanges(c(1, 10, 20), width=c(5, 5, 2000))) pk3 <- pack(gr3, range_len=1000) checkTrue(length(pk3) == 2L) pm <- pk3@partitioning checkIdentical(width(pm), c(2L, 1L)) checkIdentical(mapOrder(pm), as.integer(1:3)) .unpack(pk1, gr1) .unpack(pk2, gr2) .unpack(pk3, gr3) } GenomicFiles/inst/unitTests/test_reduceByFile-methods.R0000644000175200017520000000373014136050457024314 0ustar00biocbuildbiocbuildfl <- system.file("extdata", "ex1.bam", package="Rsamtools") gr <- GRanges(c("seq1", "seq2", "seq2"), IRanges(1:3, width=100)) gf <- GenomicFiles(gr, c(one=fl, two=fl)) MAP = function(RANGE, FILE, ..., param=Rsamtools::ScanBamParam()) { Rsamtools::bamWhich(param) <- RANGE Rsamtools::countBam(FILE, param=param) } ## reduceByFile test_reduceByFile_MAP <- function() { ans <- reduceByFile(gf, MAP=MAP) checkIdentical(length(ans), 2L) checkIdentical(unname(elementNROWS(ans)), c(3L, 3L)) ans <- reduceByFile(gr, c(one=fl, two=fl), MAP=MAP) checkIdentical(length(ans), 2L) checkIdentical(unname(elementNROWS(ans)), c(3L, 3L)) ## summarize = TRUE ans <- reduceByFile(gf, MAP=MAP, summarize=TRUE) checkTrue(is(ans, "SummarizedExperiment")) checkIdentical(names(assays(ans)), 'data') checkIdentical(dim(assays(ans)$data), c(3L, 2L)) } test_reduceByFile_MAP_REDUCE <- function() { REDUCE = function(MAPPED, ...) { head(MAPPED, 1) } ans <- reduceByFile(gf, MAP=MAP, REDUCE=REDUCE) checkIdentical(length(ans), 2L) checkIdentical(unname(elementNROWS(ans)), c(1L, 1L)) } ## reduceFiles test_reduceFiles_MAP <- function() { ## No REDUCE applied, MAP returns ans0 <- reduceFiles(gf, MAP=MAP) checkIdentical(length(ans0), 2L) checkIdentical(unname(lengths(ans0)), c(1L, 1L)) elts <- lapply(ans0, elementNROWS) checkIdentical(names(elts), c("one", "two")) checkIdentical(unlist(elts, use.names=FALSE), c(3L, 3L)) ans1 <- reduceFiles(gr, c(one=fl, two=fl), MAP=MAP) checkIdentical(ans0, ans1) checkIdentical(length(ans1), 2L) checkIdentical(unname(lengths(ans1)), c(1L, 1L)) } test_reduceFiles_MAP_REDUCE <- function() { ## REDUCE applied single time after MAP, simply unlist REDUCE <- function(mapped, ...) do.call(rbind, mapped) ans <- reduceFiles(gf, MAP=MAP, REDUCE=REDUCE) checkIdentical(length(ans), 2L) checkIdentical(unname(elementNROWS(ans)), c(3L, 3L)) } GenomicFiles/inst/unitTests/test_reduceByRange-methods.R0000644000175200017520000000223614136050457024471 0ustar00biocbuildbiocbuildfl <- system.file("extdata", "ex1.bam", package="Rsamtools") gr <- GRanges(c("seq1", "seq2", "seq2"), IRanges(1:3, width=100)) gf <- GenomicFiles(gr, c(one=fl, two=fl)) MAP = function(RANGE, FILE, ..., param=Rsamtools::ScanBamParam()) { Rsamtools::bamWhich(param) <- RANGE Rsamtools::countBam(FILE, param=param) } ## reduceByRange test_reduceByRange_MAP <- function() { ans <- reduceByRange(gf, MAP=MAP) checkIdentical(length(ans), 3L) checkIdentical(unname(lengths(ans)), c(2L, 2L, 2L)) ans <- reduceByRange(gr, c(one=fl, two=fl), MAP=MAP) checkIdentical(length(ans), 3L) checkIdentical(unname(lengths(ans)), c(2L, 2L, 2L)) ## summarize = TRUE ans <- reduceByRange(gf, MAP=MAP, summarize=TRUE) checkTrue(is(ans, "SummarizedExperiment")) checkIdentical(names(assays(ans)), 'data') checkIdentical(dim(assays(ans)$data), c(3L, 2L)) } test_reduceByRange_MAP_REDUCE <- function() { REDUCE = function(MAPPED, ...) { head(MAPPED, 1) } ans <- reduceByRange(gf, MAP=MAP, REDUCE=REDUCE) checkIdentical(length(ans), 3L) checkIdentical(unname(elementNROWS(ans)), c(1L, 1L, 1L)) } ## reduceRanges ## TBD GenomicFiles/man/0000755000175200017520000000000014136050457014720 5ustar00biocbuildbiocbuildGenomicFiles/man/GenomicFiles-class.Rd0000644000175200017520000001426414136050457020665 0ustar00biocbuildbiocbuild\name{GenomicFiles} \docType{class} % Class: \alias{GenomicFiles} \alias{class:GenomicFiles} \alias{GenomicFiles-class} % Constructors: \alias{GenomicFiles,GenomicRanges_OR_GRangesList,character-method} \alias{GenomicFiles,GenomicRanges_OR_GRangesList,List-method} \alias{GenomicFiles,GenomicRanges_OR_GRangesList,list-method} \alias{GenomicFiles,missing,ANY-method} \alias{GenomicFiles,missing,missing-method} % Accessors: \alias{files<-} \alias{files} \alias{files,GenomicFiles-method} \alias{files<-,GenomicFiles,character-method} \alias{files<-,GenomicFiles,List-method} \alias{dimnames<-,GenomicFiles,list-method} \alias{colData<-,GenomicFiles,DataFrame-method} % Methods: \alias{[,GenomicFiles,ANY,ANY-method} \alias{[,GenomicFiles,ANY,ANY,ANY-method} \alias{show,GenomicFiles-method} \title{GenomicFiles objects} \description{ The \code{GenomicFiles} class is a matrix-like container where rows represent ranges of interest and columns represent files. The class is designed for byFile or byRange queries. } \section{Constructor}{ \describe{ \item{}{ \code{GenomicFiles(rowRanges, files, colData=DataFrame(), metadata=list(), ...)}: } } } \section{Details}{ \code{GenomicFiles} inherits from the \code{RangedSummarizedExperiment} class in the \code{SummarizedExperiment} package. Currently, no use is made of the \code{elementMetadat} and \code{assays} slots. This may change in the future. } \section{Accessors}{ In the code below, \code{x} is a GenomicFiles object. \describe{ \item{rowRanges, rowRanges(x) <- value}{ Get or set the rowRanges on \code{x}. \code{value} can be a \code{GRanges} or \code{GRangesList} representing ranges or indices defined on the spaces (position) of the files. } \item{files(x), files(x) <- value}{ Get or set the files on \code{x}. \code{value} can be a character() of file paths or a List of file objects such as BamFile, BigWigFile, FaFile, etc. } \item{colData, colData(x) <- value}{ Get or set the colData on \code{x}. \code{value} must be a \code{DataFrame} instance describing the files. The number of rows must match the number of files. Row names, if present, become the column names of the \code{GenomicFiles}. } \item{metadata, metadata(x) <- value}{ Get or set the metadata on \code{x}. \code{value} must be a SimpleList of arbitrary content describing the overall experiment. } \item{dimnames, dimnames(x) <- value}{ Get or set the row and column names on \code{x}. } } } \section{Methods}{ In the code below, \code{x} is a GenomicFiles object. \describe{ \item{[}{ Subset the object by \code{fileRange} or \code{fileSample}. } \item{show}{ Compactly display the object. } \item{reduceByFile}{ Extract, manipulate and combine data defined in \code{rowRanges} within the files specified in \code{files}. See ?\code{reduceByFile} for details. } \item{reduceByRange}{ Extract, manipulate and combine data defined in \code{rowRanges} across the files specified in \code{files}. See ?\code{reduceByRange} for details. } } } \seealso{ \itemize{ \item \link{reduceByFile} and \link{reduceByRange} methods. \item \link[SummarizedExperiment]{SummarizedExperiment} objects in the \pkg{SummarizedExperiment} package. } } \author{ Martin Morgan and Valerie Obenchain } \examples{ ## ----------------------------------------------------------------------- ## Basic Use ## ----------------------------------------------------------------------- if (require(RNAseqData.HNRNPC.bam.chr14)) { fl <- RNAseqData.HNRNPC.bam.chr14_BAMFILES rd <- GRanges("chr14", IRanges(c(62262735, 63121531, 63980327), width=214700)) cd <- DataFrame(method=rep("RNASeq", length(fl)), format=rep("bam", length(fl))) ## Construct an instance of the class: gf <- GenomicFiles(files = fl, rowRanges = rd, colData = cd) gf ## Subset on ranges or files for different experimental runs. dim(gf) gf_sub <- gf[2, 3:4] dim(gf_sub) ## When summarize = TRUE and no REDUCE is provided the reduceBy* ## functions output a SummarizedExperiment object. MAP <- function(range, file, ...) { requireNamespace("GenomicFiles", quietly=TRUE) ## for coverage() requireNamespace("Rsamtools", quietly=TRUE) ## for ScanBamParam() param = Rsamtools::ScanBamParam(which=range) GenomicFiles::coverage(file, param=param)[range] } se <- reduceByRange(gf, MAP=MAP, summarize=TRUE) se ## Data from the rowRanges, colData and metadata slots in the ## GenomicFiles are transferred to the SummarizedExperiment. colData(se) ## Results are in the assays slot. assays(se) } ## ----------------------------------------------------------------------- ## Managing cached or remote files with GenomicFiles ## ----------------------------------------------------------------------- ## The GenomicFiles class can manage cached or remote files and their ## associated ranges. \dontrun{ ## Files from AnnotationHub can be downloaded and cached locally. library(AnnotationHub) hub = AnnotationHub() hublet = query(hub, c("files I'm", "interested in")) # cache (if need) and return local path to files fls = cache(hublet) ## An alternative to the local file paths is to use urls to a remote file. ## This approach could be used with something like rtracklayer::bigWig which ## supports remote file queries. urls = hublet$sourceurls ## Define ranges of interest and use GenomicFiles to manage. rngs = GRanges("chr10", IRanges(c(100000, 200000), width=1)) gf = GenomicFiles(rngs, fls) ## As an example, one could create a matrix from data extracted ## across multiple BED files. MAP = function(rng, fl) { requireNamespace("rtracklayer", quietly=TRUE) ## import, BEDFile rtracklayer::import(rtracklayer::BEDFile(fl), which=rng)$name } REDUCE = unlist xx = reduceFiles(gf, MAP=MAP, REDUCE=REDUCE) mcols(rngs) = simplify2array(xx) ## Data and ranges can be stored in a SummarizedExperiment. SummarizedExperiment(list(my=simplify2array(xx)), rowRanges=rngs) } } \keyword{classes} \keyword{methods} GenomicFiles/man/GenomicFiles-deprecated.Rd0000644000175200017520000000076614136050457021662 0ustar00biocbuildbiocbuild\name{GenomicFiles-deprecated} \alias{GenomicFiles-deprecated} \alias{getVCFPath} \title{Deprecated functions in package \sQuote{GenomicFiles}} \description{ These functions are provided for compatibility with older versions of \sQuote{GenomicFiles} only, and will be defunct at the next release. } \details{ The following functions are deprecated and will be made defunct; use the replacement indicated below: \itemize{ \item{getVCFPath(vs, chrtok): \code{files(vs)[chrtok]}} } }GenomicFiles/man/VcfStack-class.Rd0000644000175200017520000002364714136050457020032 0ustar00biocbuildbiocbuild\name{VcfStack} \docType{class} % Class: \alias{class:VcfStack} \alias{VcfStack-class} \alias{RangedVcfStack-class} % Constructors: \alias{VcfStack} \alias{RangedVcfStack} % Accessors: \alias{colnames,VcfStack-method} \alias{rownames,VcfStack-method} \alias{dimnames,VcfStack-method} \alias{files,VcfStack-method} \alias{files<-,VcfStack,character-method} \alias{files<-,VcfStack,VcfFile-method} \alias{files<-,VcfStack,VcfFileList-method} \alias{seqinfo,VcfStack-method} \alias{seqinfo<-,VcfStack-method} \alias{seqinfo<-,RangedVcfStack-method} \alias{seqlevelsStyle<-,VcfStack-method} \alias{seqlevelsStyle<-,RangedVcfStack-method} \alias{colData,VcfStack-method} \alias{colData<-,VcfStack,DataFrame-method} \alias{rowRanges,RangedVcfStack-method} \alias{rowRanges<-,RangedVcfStack,GRanges-method} % Methods: \alias{vcfFields,VcfStack-method} \alias{assay,VcfStack,ANY-method} \alias{assay,RangedVcfStack,ANY-method} \alias{readVcfStack} \alias{show,VcfStack-method} % Subsetting: \alias{[,VcfStack,ANY,ANY-method} \alias{[,VcfStack,ANY,ANY,ANY-method} \alias{[,RangedVcfStack,ANY,ANY-method} \alias{[,RangedVcfStack,ANY,ANY,ANY-method} % Helpers: \alias{paths1kg} \alias{dim,VcfStack-method} \title{VcfStack and RangedVcfStack Objects} \description{ The \code{VcfStack} class is a vector of related VCF files, for instance each file representing a separate chromosome. The class helps manage these files as a group. The \code{RangedVcfStack} class extends \code{VcfStack} by associating genomic ranges of interest to the collection of VCF files. } \section{Constructor}{ \describe{ \item{}{ \code{VcfStack(files=NULL, seqinfo=NULL, colData=NULL, index=TRUE, check=TRUE)} Creates a VcfStack object. \describe{ \item{\code{files}}{ A VcfFilelist object. If a VcfFile or character vector is given a VcfFileList will be coerced. The character vector should be files paths pointing to VCF files. The character vector must be named, with names correspond to seqnames in each VCF file. } \item{\code{seqinfo}}{ A \link[GenomeInfoDb]{Seqinfo} object describing the levels genome and circularity of each sequence. } \item{\code{colData}}{ An optional \link[S4Vectors]{DataFrame} describing each sample in the VcfStack. When present, row names must correspond to sample names in the VCF file. } \item{\code{index}}{ A logical indicating if the vcf index files should be created. } \item{\code{check}}{ A logical indicating if the check across samples should be performed } } } \item{}{ \code{RangedVcfStack(vs=NULL, rowRanges=NULL)} Creates a RangedVcfStack object. \describe{ \item{\code{vs}}{ A \code{VcfStack} object. } \item{\code{rowRanges}}{ An optional \link[GenomicRanges]{GRanges} object associating the genomic ranges of interest to the collection of VCF files. The seqnames of \code{rowRanges} are a subset of \code{seqnames(vs)}. If missing, a default is created from the \code{seqinfo} object of the provided \code{VcfStack}. } } } } } \section{Accessors}{ In the code below, \code{x} is a VcfStack or RangedVcfStack object. \describe{ \item{dim(x)}{ Get the number of files and samples in the \code{VcfStack} object. } \item{colnames(x, do.NULL=TRUE, prefix="col")}{ Get the sample names in the \code{VcfStack}. } \item{rownames(x), do.NULL=TRUE, prefix="row")}{ Get the names of the files in \code{VcfStack}. } \item{dimnames(x))}{ Get the names of samples and the names of files in \code{VcfStack}. } \item{files(x, \dots), files(x, \dots, check=TRUE) <- value}{ Get or set the files on \code{x}. \code{value} can be a named character() of file paths or a \link[VariantAnnotation]{VcfFileList}. The return value will be a \link[VariantAnnotation]{VcfFileList}. } \item{seqinfo(x), seqinfo(x, new2old = NULL, pruning.mode = c("error", "coarse", "fine", "tidy")) <- value}{ Get or set the seqinfo on \code{x}. See \link[GenomeInfoDb]{seqinfo<-} for details on \code{new2old} and \code{pruning.mode}. } \item{seqlevelsStyle(x) <- value}{ Set the seqlevels according to the supplied style. File names and rowRanges will also be updated if applicable. See \link[GenomeInfoDb]{seqlevelsStyle<-} for more details. } \item{colData(x), colData(x, \dots) <- value}{ Get or set the \code{colData} on \code{x}. \code{value} is a \link[S4Vectors]{DataFrame}. } \item{rowRanges(x), rowRanges(x, \dots) <- value}{ Get or set the \code{rowRanges} on \code{x}. \code{x} has to be a \code{RangedVcfStack} object. \code{value} is a \link[GenomicRanges]{GRanges}. } } } \section{Methods}{ In the code below, \code{x} is a VcfStack or RangedVcfStack object. \code{i} is a \link[GenomicRanges]{GRanges} object, character() vector of \link[GenomeInfoDb:Seqinfo-class]{seqnames}, numeric() vector, logical() vector, or can be missing. For a RangedVcfStack object, assay and readVcfStack will use the associated \code{rowRanges} object for \code{i}. \describe{ \item{vcfFields(x)}{ Returns a \code{\link[IRanges]{CharacterList}} of all available VCF fields, with names of \code{fixed}, \code{info}, \code{geno} and \code{samples} indicating the four categories. Each element is a character() vector of available VCF field names within each category. } \item{assay(x, i, \dots, BPPARAM=bpparam())}{ Get matrix of genotype calls from the VCF files. See \link[VariantAnnotation]{genotypeToSnpMatrix}. Argument \code{i} specifies which files to read. \code{BPPARAM} is the argument to the \link[BiocParallel]{bpmapply}. } \item{readVcfStack(x, i, j=colnames(x), param=ScanVcfParam())}{ Get content of VCF files in the VcfStack. \code{i} indicates which files to read. \code{j} can be missing or a character() vector of sample names (see \link[VariantAnnotation:VCFHeader-class]{samples}) present in the VCF files. \code{param} is a \link[VariantAnnotation]{ScanVcfParam} object. If \code{param} is used \code{i} and \code{j} are ignored. } \item{show(object)}{ Display abbreviated information about \code{VcfStack} or \code{RangedVcfStack} object. } } } \section{Subsetting}{ In the code below, \code{x} is a VcfStack or RangedVcfStack object. \describe{ \item{x[i, j]}{ Get elements from ranges \code{i} and samples \code{j} as a VcfStack or RangedVcfStack object. Note: for a \code{RangedVcfStack}, the \code{rowRanges} object will also be subset. \code{i} can be missing, a character() vector of \link[GenomeInfoDb:Seqinfo-class]{seqnames}, numeric() vector of indexes, logical() or \code{GRanges} object. When \code{i} is a \code{GRanges} object, \code{seqnames(i)} is then used to subset the files in the VcfStack. \code{j} can be missing, a character() vector of sample names, a numeric(), logical() vector. } } } \section{Helpers}{ \describe{ \item{getVCFPath(vs, chrtok)}{ Deprecated. Use \code{files(vs)[chrtok]} instead. } \item{paths1kg(chrtoks)}{ Translate seqnames \code{chrtoks} to 1000 genomes genotype VCF urls. } } } \seealso{ \link[VariantAnnotation]{VcfFile}, \link[VariantAnnotation]{VcfFileList}. } \author{Lori Shepherd {\url{mailto:Lori.Shepherd@RoswellPark.org}} and Martin Morgan {\url{mailto:Martin.Morgan@RoswellPark.org}}} \examples{ ## --------------------------------------------------------------------- ## CONSTRUCTION ## --------------------------------------------------------------------- ## point to VCF files and add names corresponding to the sequence ## present in the file extdata <- system.file(package="GenomicFiles", "extdata") files <- dir(extdata, pattern="^CEUtrio.*bgz$", full=TRUE) names(files) <- sub(".*_([0-9XY]+).*", "\\\\1", basename(files)) ## input data.frame describing the length of each sequence, coerce to ## 'Seqinfo' object seqinfo <- as(readRDS(file.path(extdata, "seqinfo.rds")), "Seqinfo") stack <- VcfStack(files, seqinfo) stack ## Use seqinfo from VCF files instead of explict value stack2 <- VcfStack(files) rstack <- RangedVcfStack(stack) gr <- GRanges(c("7:1-159138000", "X:1-155270560")) rstack2 <- RangedVcfStack(stack, gr) rstack2 ## --------------------------------------------------------------------- ## ACCESSORS ## --------------------------------------------------------------------- dim(stack) colnames(stack) rownames(stack) dimnames(stack) head(files(stack)) seqinfo(stack) colData(stack) ## --------------------------------------------------------------------- ## METHODS ## --------------------------------------------------------------------- readVcfStack(stack, i=GRanges("20:862167-62858306")) i <- GRanges(c("20:862167-62858306", "7:1-159138000")) readVcfStack(stack, i=i, j="NA12891") head(assay(stack, gr)) head(assay(rstack2)) seqlevels(stack2) rownames(stack2) seqlevelsStyle(stack2) seqlevelsStyle(stack2) <- "UCSC" seqlevelsStyle(stack2) seqlevels(stack2) rownames(stack2) vcfFields(stack2) ## --------------------------------------------------------------------- ## SUBSETTING ## --------------------------------------------------------------------- ## select rows 4, 5, 6 and samples 1, 2 stack[4:6, 1:2] ## select rownames "7", "11" and sample "NA12891" stack[c("7", "11"), "NA12891"] stack[c("7", "11", "X"), 2:3] ## subset with GRanges stack[GRanges("20:862167-62858306")] rstack2[] rstack2[,1] ## --------------------------------------------------------------------- ## HELPERS ## --------------------------------------------------------------------- paths1kg(1:3) } GenomicFiles/man/pack-methods.Rd0000644000175200017520000000461414136050457017573 0ustar00biocbuildbiocbuild\name{pack} \alias{pack} \alias{isPacked} \alias{pack,GRanges-method} \title{Range transformations of a \code{GenomicRanges} object for optimal file queries. } \description{ Given a \code{GRanges} object, \code{pack} produces a \code{GRangesList} of the same ranges grouped and re-ordered. } \usage{ \S4method{pack}{GRanges}(x, ..., range_len = 1e9, inter_range_len = 1e7) } \arguments{ \item{x}{ A \code{GRanges} object. } \item{range_len}{ A numeric specifying the max length allowed for ranges in \code{x}. } \item{inter_range_len}{ A numeric specifying the max length allowed between ranges in \code{x}. } \item{\dots}{ Arguments passed to other methods. } } \details{ \subsection{Packing ranges}{ The \code{pack} method attempts to re-package ranges in optimal form for extracting data from files. Ranges are not modified (made shorter or longer) but re-ordered and / or re-grouped according to the following criteria. \itemize{ \item order: Ranges are ordered by genomic position within chromosomes. \item distance: Ranges separted by a distance greater than the \code{inter_range_len} are packed in groups around the gap separating the distant ranges. \item length: Ranges longer than \code{range_len} are packed `individually' (i.e., retrived from the file as a single range vs grouped with other ranges). } } \subsection{Utilities}{ \describe{ \item{}{ \code{isPacked(x, ...)}: Returns a logical indicating if the ranges in \code{x} are packed. \code{x} must be a \code{GRangesList} object. } }} } \value{ A \code{GRanges} object. } \seealso{ \itemize{ \item \code{\link{unpack}} for unpacking the result obtained with `packed' ranges. } } \examples{ ## Ranges are ordered by position within chromosome. gr1 <- GRanges("chr1", IRanges(5:1*5, width = 3)) pack(gr1) ## Ranges separated by > inter_range_len are partitioned ## into groups defined by the endpoints of the gap. gr2 <- GRanges("chr2", IRanges(c(1:3, 30000:30003), width = 1000)) pack(gr2, inter_range_len = 20000) ## Ranges exceeding 'range_len' are isolated in a single element ## of the GRangesList. gr3 <- GRanges("chr3", IRanges(c(1:4), width=c(45, 1e8, 45, 45))) width(gr3) pack(gr3, range_len = 1e7) } \keyword{methods} GenomicFiles/man/reduceByFile-methods.Rd0000644000175200017520000002050014136050457021207 0ustar00biocbuildbiocbuild\name{reduceByFile} \alias{reduceByFile} \alias{reduceByFile,GRanges,ANY-method} \alias{reduceByFile,GRangesList,ANY-method} \alias{reduceByFile,GenomicFiles,missing-method} \alias{reduceFiles} \title{Parallel computations by files} \description{ Computations are distributed in parallel by file. Data subsets are extracted and manipulated (MAP) and optionally combined (REDUCE) within a single file. } \usage{ \S4method{reduceByFile}{GRanges,ANY}(ranges, files, MAP, REDUCE, ..., summarize=FALSE, iterate=TRUE, init) \S4method{reduceByFile}{GRangesList,ANY}(ranges, files, MAP, REDUCE, ..., summarize=FALSE, iterate=TRUE, init) \S4method{reduceByFile}{GenomicFiles,missing}(ranges, files, MAP, REDUCE, ..., summarize=FALSE, iterate=TRUE, init) reduceFiles(ranges, files, MAP, REDUCE, ..., init) } \arguments{ \item{ranges}{ A \code{GRanges}, \code{GrangesList} or \code{GenomicFiles} object. A \code{GRangesList} implies a grouping of the ranges; \code{MAP} is applied to each element of the \code{GRangesList} vs each range when \code{ranges} is a \code{GRanges}. When \code{ranges} is a \code{GenomicFiles} the \code{files} argument is missing; both ranges and files are extracted from the object. } \item{files}{ A \code{character} vector or \code{List} of filenames. A \code{List} implies a grouping of the files; \code{MAP} is applied to each element of the \code{List} vs each file individually. } \item{MAP}{ A function executed on each worker. The signature must contain a minimum of two arguments representing the ranges and files. There is no restriction on argument names and additional arguments can be provided. \itemize{ \item \code{MAP = function(range, file, ...)} } } \item{REDUCE}{ An optional function that combines output from the \code{MAP} step. The signature must contain at least one argument representing the list output from \code{MAP}. There is no restriction on argument names and additional arguments can be provided. \itemize{ \item \code{REDUCE = function(mapped, ...)} } Reduction combines data from a single worker and is always performed as part of the distributed step. When \code{iterate=TRUE} \code{REDUCE} is applied after each \code{MAP} step; depending on the nature of \code{REDUCE}, iterative reduction can substantially decrease the data stored in memory. When \code{iterate=FALSE} reduction is applied to the list of \code{MAP} output applied to all files / ranges. When \code{REDUCE} is missing, output is a list from \code{MAP}. } \item{iterate}{ A logical indicating if the \code{REDUCE} function should be applied iteratively to the output of \code{MAP}. When \code{REDUCE} is missing \code{iterate} is set to FALSE. This argument applies to \code{reduceByFile} only (\code{reduceFiles} calls MAP a single time on each worker). Collapsing results iteratively is useful when the number of records to be processed is large (maybe complete files) but the end result is a much reduced representation of all records. Iteratively applying \code{REDUCE} reduces the amount of data on each worker at any one time and can substantially reduce the memory footprint. } \item{summarize}{ A logical indicating if results should be returned as a \code{SummarizedExperiment} object instead of a list; data are returned in the \code{assays} slot named `data`. This argument applies to \code{reduceByFile} only. When \code{REDUCE} is provided \code{summarize} is ignored (i.e., set to FALSE). A \code{SummarizedExperiment} requires the number of rows in \code{rowRanges} and \code{assays} to match. Because \code{REDUCE} collapses the data across ranges, the dimension of the result no longer matches that of the original ranges. } \item{init}{ An optional initial value for \code{REDUCE} when \code{iterate=TRUE}. \code{init} must be an object of the same type as the elements returned from \code{MAP}. \code{REDUCE} logically adds \code{init} to the start (when proceeding left to right) or end of results obtained with \code{MAP}. } \item{\dots}{ Arguments passed to other methods. } } \details{ \code{reduceByFile} extracts, manipulates and combines multiple ranges within a single file. Each file is sent to a worker where \code{MAP} is invoked on each file / range combination. This approach allows multiple ranges extracted from a single file to be kept separate or combined with \code{REDUCE}. In contrast, \code{reduceFiles} treats the output of all MAP calls as a group and reduces them together. \code{REDUCE} usually plays a minor role by concatenating or unlisting results. Both \code{MAP} and \code{REDUCE} are applied in the distributed step (``on the worker``). Results are not combined across workers in the distributed step. } \value{ \itemize{ \item{reduceByFile:}{ When \code{summarize=FALSE} the return value is a \code{list} or the value from the final invocation of \code{REDUCE}. When \code{summarize=TRUE} output is a \code{SummarizedExperiment}. When \code{ranges} is a \code{GenomicFiles} object data from \code{rowRanges}, \code{colData} and \code{metadata} are transferred to the \code{SummarizedExperiment}. } \item{reduceFiles:}{ A \code{list} or the value returned by the final invocation of \code{REDUCE}. } } } \seealso{ \itemize{ \item \link{reduceRanges} \item \link{reduceByRange} \item \link{GenomicFiles-class} } } \author{ Martin Morgan and Valerie Obenchain } \examples{ if (requireNamespace("RNAseqData.HNRNPC.bam.chr14", quietly=TRUE)) { ## ----------------------------------------------------------------------- ## Count junction reads in BAM files ## ----------------------------------------------------------------------- fls <- ## 8 bam files RNAseqData.HNRNPC.bam.chr14::RNAseqData.HNRNPC.bam.chr14_BAMFILES ## Ranges of interest. gr <- GRanges("chr14", IRanges(c(19100000, 106000000), width=1e7)) ## MAP outputs a table of junction counts per range. MAP <- function(range, file, ...) { ## for readGAlignments(), Rsamtools::ScanBamParam() requireNamespace("GenomicAlignments", quietly=TRUE) param = Rsamtools::ScanBamParam(which=range) gal = GenomicAlignments::readGAlignments(file, param=param) table(GenomicAlignments::njunc(gal)) } ## ----------------------------------------------------------------------- ## reduceByFile: ## With no REDUCE, counts are computed for each range / file combination. counts1 <- reduceByFile(gr, fls, MAP) length(counts1) ## 8 files elementNROWS(counts1) ## 2 ranges each ## Tables of counts for each range: counts1[[1]] ## With a REDUCE, results are combined on the fly. This reducer sums the ## number of records in each range with exactly 1 junction. REDUCE <- function(mapped, ...) sum(sapply(mapped, "[", "1")) reduceByFile(gr, fls, MAP, REDUCE) ## ----------------------------------------------------------------------- ## reduceFiles: ## All ranges are treated as a single group: counts2 <- reduceFiles(gr, fls, MAP) ## Counts are for all ranges grouped: counts2[[1]] ## Contrast the above with that from reduceByFile() where counts ## are for each range separately: counts1[[1]] ## ----------------------------------------------------------------------- ## Methods for the GenomicFiles class: ## Both reduceByFiles() and reduceFiles() can operate on a GenomicFiles ## object. colData <- DataFrame(method=rep("RNASeq", length(fls)), format=rep("bam", length(fls))) gf <- GenomicFiles(files=fls, rowRanges=gr, colData=colData) gf ## Subset on ranges or files for different experimental runs. dim(gf) gf_sub <- gf[2, 3:4] dim(gf_sub) ## When summarize = TRUE and no REDUCE is given, the output is a ## SummarizedExperiment object. se <- reduceByFile(gf, MAP=MAP, summarize=TRUE) se ## Data from the rowRanges, colData and metadata slots in the ## GenomicFiles are transferred to the SummarizedExperiment. colData(se) ## Results are in the assays slot named 'data'. assays(se) } } \keyword{methods} GenomicFiles/man/reduceByRange-methods.Rd0000644000175200017520000002037014136050457021371 0ustar00biocbuildbiocbuild\name{reduceByRange} \alias{reduceByRange} \alias{reduceByRange,GRanges,ANY-method} \alias{reduceByRange,GRangesList,ANY-method} \alias{reduceByRange,GenomicFiles,missing-method} \alias{reduceRanges} \title{Parallel computations by ranges} \description{ Computations are distributed in parallel by range. Data subsets are extracted and manipulated (MAP) and optionally combined (REDUCE) across all files. } \usage{ \S4method{reduceByRange}{GRanges,ANY}(ranges, files, MAP, REDUCE, ..., summarize=FALSE, iterate=TRUE, init) \S4method{reduceByRange}{GRangesList,ANY}(ranges, files, MAP, REDUCE, ..., summarize=FALSE, iterate=TRUE, init) \S4method{reduceByRange}{GenomicFiles,missing}(ranges, files, MAP, REDUCE, ..., summarize=FALSE, iterate=TRUE, init) reduceRanges(ranges, files, MAP, REDUCE, ..., init) } \arguments{ \item{ranges}{ A \code{GRanges}, \code{GrangesList} or \code{GenomicFiles} object. A \code{GRangesList} implies a grouping of the ranges; \code{MAP} is applied to each element of the \code{GRangesList} vs each range when \code{ranges} is a \code{GRanges}. When \code{ranges} is a \code{GenomicFiles} the \code{files} argument is missing; both ranges and files are extracted from the object. } \item{files}{ A \code{character} vector or \code{List} of filenames. A \code{List} implies a grouping of the files; \code{MAP} is applied to each element of the \code{List} vs each file individually. } \item{MAP}{ A function executed on each worker. The signature must contain a minimum of two arguments representing the ranges and files. There is no restriction on argument names and additional arguments can be provided. \itemize{ \item \code{MAP = function(range, file, ...)} } } \item{REDUCE}{ An optional function that combines output from the \code{MAP} step. The signature must contain at least one argument representing the list output from \code{MAP}. There is no restriction on argument names and additional arguments can be provided. \itemize{ \item \code{REDUCE = function(mapped, ...)} } Reduction combines data from a single worker and is always performed as part of the distributed step. When \code{iterate=TRUE} \code{REDUCE} is applied after each \code{MAP} step; depending on the nature of \code{REDUCE}, iterative reduction can substantially decrease the data stored in memory. When \code{iterate=FALSE} reduction is applied to the list of \code{MAP} output applied to all files / ranges. When \code{REDUCE} is missing, output is a list from \code{MAP}. } \item{iterate}{ A logical indicating if the \code{REDUCE} function should be applied iteratively to the output of \code{MAP}. When \code{REDUCE} is missing \code{iterate} is set to FALSE. This argument applies to \code{reduceByRange} only (\code{reduceRanges} calls MAP a single time on each worker). Collapsing results iteratively is useful when the number of records to be processed is large (maybe complete files) but the end result is a much reduced representation of all records. Iteratively applying \code{REDUCE} reduces the amount of data on each worker at any one time and can substantially reduce the memory footprint. } \item{summarize}{ A logical indicating if results should be returned as a \code{SummarizedExperiment} object instead of a list; data are returned in the \code{assays} slot named `data`. This argument applies to \code{reduceByRange} only. When \code{REDUCE} is provided \code{summarize} is ignored (i.e., set to FALSE). A \code{SummarizedExperiment} requires the number of rows in \code{colData} and the columns in \code{assays} to match. Because \code{REDUCE} collapses the data across files, the dimension of the result no longer matches that of the original ranges. } \item{init}{ An optional initial value for \code{REDUCE} when \code{iterate=TRUE}. \code{init} must be an object of the same type as the elements returned from \code{MAP}. \code{REDUCE} logically adds \code{init} to the start (when proceeding left to right) or end of results obtained with \code{MAP}. } \item{\dots}{ Arguments passed to other methods. Currently not used. } } \details{ \code{reduceByRange} extracts, manipulates and combines ranges across different files. Each element of \code{ranges} is sent to a worker; this is a single range when \code{ranges} is a GRanges and may be multiple ranges when \code{ranges} is a GRangesList. \code{MAP} is invoked on each range / file combination. This approach allows ranges extracted from multiple files to be kept separate or combined with \code{REDUCE}. In contrast, \code{reduceRanges} treats the output of all MAP calls as a group and reduces them together. \code{REDUCE} usually plays a minor role by concatenating or unlisting results. Both \code{MAP} and \code{REDUCE} are applied in the distributed step (``on the worker``). Results are not combined across workers in the distributed step. } \value{ \itemize{ \item{reduceByRange:}{ When \code{summarize=FALSE} the return value is a \code{list} or the value from the final invocation of \code{REDUCE}. When \code{summarize=TRUE} output is a \code{SummarizedExperiment}. When \code{ranges} is a \code{GenomicFiles} object data from \code{rowRanges}, \code{colData} and \code{metadata} are transferred to the \code{SummarizedExperiment}. } \item{reduceRanges:}{ A \code{list} or the value returned by the final invocation of \code{REDUCE}. } } } \seealso{ \itemize{ \item \link{reduceFiles} \item \link{reduceByFile} \item \link{GenomicFiles-class} } } \author{ Martin Morgan and Valerie Obenchain } \examples{ if (all(requireNamespace("RNAseqData.HNRNPC.bam.chr14", quietly=TRUE) && require(GenomicAlignments))) { ## ----------------------------------------------------------------------- ## Compute coverage across BAM files. ## ----------------------------------------------------------------------- fls <- ## 8 bam files RNAseqData.HNRNPC.bam.chr14::RNAseqData.HNRNPC.bam.chr14_BAMFILES ## Regions of interest. gr <- GRanges("chr14", IRanges(c(62262735, 63121531, 63980327), width=214700)) ## The MAP computes the coverage ... MAP <- function(range, file, ...) { requireNamespace("GenomicFiles", quietly=TRUE) ## for coverage(), Rsamtools::ScanBamParam() param = Rsamtools::ScanBamParam(which=range) GenomicFiles::coverage(file, param=param)[range] } ## and REDUCE adds the last and current results. REDUCE <- function(mapped, ...) Reduce("+", mapped) ## ----------------------------------------------------------------------- ## reduceByRange: ## With no REDUCE, coverage is computed for each range / file combination. cov1 <- reduceByRange(gr, fls, MAP) cov1[[1]] ## Each call to coverage() produces an RleList which accumulate on the ## workers. We can use a reducer to combine these lists either iteratively ## or non-iteratively. When iterate = TRUE the current result ## is collapsed with the last resulting in a maximum of 2 RleLists on ## a worker at any given time. cov2 <- reduceByRange(gr, fls, MAP, REDUCE, iterate=TRUE) cov2[[1]] ## If memory use is not a concern (or if MAP output is not large) the ## REDUCE function can be applied non-iteratively. cov3 <- reduceByRange(gr, fls, MAP, REDUCE, iterate=FALSE) ## Results match those obtained with the iterative REDUCE. cov3[[1]] ## When 'ranges' is a GRangesList, the list elements are sent to the ## workers instead of a single range as in the case of a GRanges. grl <- GRangesList(gr[1], gr[2:3]) grl cov4 <- reduceByRange(grl, fls, MAP) length(cov4) ## length of GRangesList elementNROWS(cov4) ## number of files ## ----------------------------------------------------------------------- ## reduceRanges: ## This function passes the character vector of all file names to MAP. ## MAP must handle each file separately or invoke a method that operates ## on a list of files. ## TODO: example } } \keyword{methods} GenomicFiles/man/reduceByYield.Rd0000644000175200017520000001703014136050457017741 0ustar00biocbuildbiocbuild\name{reduceByYield} \alias{reduceByYield} \alias{REDUCEsampler} \title{ Iterate through a BAM (or other) file, reducing output to a single result. } \description{ Rsamtools files can be created with a \sQuote{yieldSize} argument that influences the number of records (chunk size) input at one time (see, e.g,. \code{\link[Rsamtools]{BamFile}}). \code{reduceByYield} iterates through the file, processing each chunk and reducing it with previously input chunks. This is a memory efficient way to process large data files, especially when the final result fits in memory. } \usage{ reduceByYield(X, YIELD, MAP = identity, REDUCE = `+`, DONE = function(x) is.null(x) || length(x) == 0L, ..., parallel = FALSE, iterate = TRUE, init) REDUCEsampler(sampleSize=1000000, verbose=FALSE) } \arguments{ \item{X}{A \code{\link[Rsamtools]{BamFile}} instance (or other class for which \code{isOpen}, \code{open}, \code{close} methods are defined, and which support extraction of sequential chunks).} \item{YIELD}{A function name or user-supplied function that operates on \code{X} to produce a \code{VALUE} that is passed to \code{DONE} and \code{MAP}. Generally \code{YIELD} will be a data extractor such as \code{readGAlignments}, \code{scanBam}, \code{yield}, etc. and \code{VALUE} is a chunk of data. \itemize{ \item YIELD(X) }} \item{MAP}{A function of one or more arguments that operates on the chunk of data from \code{YIELD}. \itemize{ \item MAP(VALUE, ...) }} \item{REDUCE}{A function of one (\code{iterate=FALSE} or two (\code{iterate=TRUE}) arguments, returning the reduction (e.g., sum, mean, concatenate) of the arguments. \itemize{ \item REDUCE(mapped, ...) ## iterate=FALSE \item REDUCE(x, y, ...) ## iterate=TRUE }} \item{DONE}{A function of one argument, the \code{VALUE} output of the most recent call to \code{YIELD(X, ...)}. If missing, \code{DONE} is \code{function(VALUE) length(VALUE) == 0}.} \item{\dots}{Additional arguments, passed to \code{MAP}.} \item{iterate}{logical(1) determines whether the call to \code{REDUCE} is iterative (\code{iterate=TRUE}) or cumulative (\code{iterate=FALSE}).} \item{parallel}{logical(1) determines if the \code{MAP} step is run in parallel. \code{bpiterate} is used under the hood and is currently supported for Unix/Mac only. For Windows machines, \code{parallel} is ignored.} \item{init}{(Optional) Initial value used for \code{REDUCE} when \code{iterate=TRUE}.} \item{sampleSize}{Initial value used for \code{REDUCEsampler}.} \item{verbose}{logical(1) determines if total records sampled are reported at each iteration. Applicable to \code{REDUCEsampler} only.} } \details{ \describe{ \item{\code{reduceByYield}: }{ When \code{iterate=TRUE}, \code{REDUCE} requires 2 arguments and is invoked with \code{init} and the output from the first call to \code{MAP}. If \code{init} is missing, it operates on the first two outputs from \code{MAP}. When \code{iterate=FALSE}, \code{REDUCE} requires 1 argument and is is invoked with a list containing a list containing all results from \code{MAP}. } \item{\code{REDUCEsampler}:}{ \code{REDUCEsampler} creates a function that can be used as the \code{REDUCE} argument to \code{reduceByYield}. Invoking \code{REDUCEsampler} with \code{sampleSize} returns a function (call it \code{myfun}) that takes two arguments, \code{x} and \code{y}. As with any iterative \code{REDUCE} function, \code{x} represents records that have been yield'ed and \code{y} is the new chunk of records. \code{myfun} samples records from consecutive chunks returned by the \code{YIELD} function. (Re)sampling takes into consideration the total number of records yield'ed, the \code{sampleSize}, and the size of the new chunk. } } } \value{ The value returned by the final invocation of \code{REDUCE}, or \code{init} if provided and no data were yield'ed, or \code{list()} if \code{init} is missing and no data were yield'ed. } \author{Martin Morgan and Valerie Obenchain} \seealso{ \itemize{ \item \code{\link[Rsamtools]{BamFile}} and \code{\link[Rsamtools]{TabixFile}} for examples of `X`. \item \code{reduceByFile} and \code{reduceByRange} } } \examples{ if (all(require(RNAseqData.HNRNPC.bam.chr14) && require(GenomicAlignments))) { ## ----------------------------------------------------------------------- ## Nucleotide frequency of mapped reads ## ----------------------------------------------------------------------- ## In this example nucleotide frequency of mapped reads is computed ## for a single file. The MAP step is run in parallel and REDUCE ## is iterative. ## Create a BamFile and set a 'yieldSize'. fl <- system.file(package="Rsamtools", "extdata", "ex1.bam") bf <- BamFile(fl, yieldSize=500) ## Define 'YIELD', 'MAP' and 'REDUCE' functions. YIELD <- function(X, ...) { flag = scanBamFlag(isUnmappedQuery=FALSE) param = ScanBamParam(flag=flag, what="seq") scanBam(X, param=param, ...)[[1]][['seq']] } MAP <- function(value, ...) { requireNamespace("Biostrings", quietly=TRUE) ## for alphabetFrequency() Biostrings::alphabetFrequency(value, collapse=TRUE) } REDUCE <- `+` # add successive alphabetFrequency matrices ## 'parallel=TRUE' runs the MAP step in parallel and is currently ## implemented for Unix/Mac only. register(MulticoreParam(3)) reduceByYield(bf, YIELD, MAP, REDUCE, parallel=TRUE) ## ----------------------------------------------------------------------- ## Coverage ## ----------------------------------------------------------------------- ## If sufficient resources are available coverage can be computed ## across several large BAM files by combining reduceByYield() with ## bplapply(). ## Create a BamFileList with a few sample files and a Snow cluster ## with the same number of workers as files. bfl <- BamFileList(RNAseqData.HNRNPC.bam.chr14_BAMFILES[1:3]) bpparam <- SnowParam(length(bfl)) ## 'FUN' is run on each worker. Because these are Snow workers each ## variable used in 'FUN' must be explicitly passed. (This is not the case ## when using Multicore.) FUN <- function(bf, YIELD, MAP, REDUCE, parallel, ...) { requireNamespace("GenomicFiles", quietly=TRUE) ## for reduceByYield() GenomicFiles::reduceByYield(bf, YIELD, MAP, REDUCE, parallel=parallel) } ## Passing parallel=FALSE to reduceByYield() runs the MAP step in serial on ## each worker. In this example, parallel dispatch is at the file-level ## only (bplapply()). YIELD <- `readGAlignments` MAP <- function(value, ...) { requireNamespace("GenomicAlignments", quietly=TRUE) GenomicAlignments::coverage(value)[["chr14"]] } bplapply(bfl, FUN, YIELD=YIELD, MAP=MAP, REDUCE=`+`, parallel=FALSE, BPPARAM = bpparam) ## ----------------------------------------------------------------------- ## Sample records from a Bam file ## ----------------------------------------------------------------------- fl <- system.file(package="Rsamtools", "extdata", "ex1.bam") bf <- BamFile(fl, yieldSize=1000) yield <- function(x) readGAlignments(x, param=ScanBamParam(what=c( "qwidth", "mapq" ))) map <- identity ## Samples records from successive chunks of aligned reads. reduceByYield(bf, yield, map, REDUCEsampler(1000, TRUE)) } } \keyword{manip} GenomicFiles/man/registry-utils.Rd0000644000175200017520000000476614136050457020232 0ustar00biocbuildbiocbuild\name{registry-utils} \alias{registry-utils} \alias{registerFileType} \alias{findTypeRegistry} \alias{makeFileType} \title{Functions for creating and searching a registry of file types.} \description{ Functions for creating and searching a registry of file types based on file extension. } \usage{ registerFileType(type, package, regex) findTypeRegistry(fnames) makeFileType(fnames, ..., regex=findTypeRegistry(fnames)) } \arguments{ \item{type}{ The List class the file is associated with such as BamFileList, BigWigFileList, FaFileList. } \item{package}{ The package where the List class (\code{type}) is defined. } \item{regex}{ A regular expression that uniquely identifies the file extension. } \item{fnames}{ A \code{character} vector of file names. } \item{\dots}{ Additional arguments passed to the List-class constructor (e.g., yieldSize for BamFileList). } } \details{ \itemize{ \item{registerFileType}{ The \code{registerFileType} function adds entries to the file type register created at load time. The point of the register is for discovery of file type (class) by file extension. These are List-type classes (e.g., BamFileList) that occupy the \code{fileList} slot of a GenomicFiles class. Each List class entry in the register is associated with (1) a regular expression that identifies the file extension, (2) a class and (3) the package where the class is defined. At load time the register is populated with classes known to GenomicFiles. New classes / file types can be added to the register with \code{registerFileType} by providing these three pieces of information. } \item{findTypeRegistry}{ Searches the registry for a match to the extension of \code{fname}. Internal use only. } \item{makeFileType}{ Performs a look-up in the file registry based on the supplied regular expression; returns an object of the associated class. Internal use only. } } } \value{ \code{registerFileType}: NULL \code{findTypeRegistry}: The regular expression associated with the file. \code{makeFileType}: A List-type object defined in the registry. } \examples{ ## At load time the registry is populated with file types ## known to GenomicFiles. sapply(as.list(.fileTypeRegistry), "[", "type") ## Add a new class to the file register. \dontrun{registerFileType(NewClassList, NewPackage, "\\.NewExtension$")} } \keyword{methods} GenomicFiles/man/unpack-methods.Rd0000644000175200017520000000363714136050457020142 0ustar00biocbuildbiocbuild\name{unpack} \alias{unpack} \alias{unpack,list,GRangesList-method} \alias{unpack,List,GRangesList-method} \title{Un-pack results obtained with a pack()ed group of ranges} \description{ \code{unpack} returns results obtained with pack()ed ranges to the geometry of the original, unpacked ranges. } \usage{ \S4method{unpack}{list,GRangesList}(flesh, skeleton, ...) \S4method{unpack}{List,GRangesList}(flesh, skeleton, ...) } \arguments{ \item{flesh}{ A \code{List} object to be unpacked; the result from querying a file with \code{skeleton}. } \item{skeleton}{ The \code{GRangesList} created with `pack(x)`. } \item{\dots}{ Arguments passed to other methods. } } \details{ \code{unpack} returns a \code{List} obtained with packed ranges to the geometry and order of the original, unpacked ranges. } \value{ A unpacked form of \code{flesh}. } \seealso{ \itemize{ \item \code{\link{pack}} for packing ranges. } } \examples{ fl <- system.file("extdata", "ex1.bam", package = "Rsamtools") gr <- GRanges(c(rep("seq2", 3), "seq1"), IRanges(c(75, 1, 100, 1), width = 2)) ## Ranges are packed by order within chromosome and grouped ## around gaps greater than 'inter_range_len'. See ?pack for details. pk <- pack(gr, inter_range_len = 25) ## FUN computes coverage for the range passed as 'rng'. FUN <- function(rng, fl, param) { requireNamespace("GenomicAlignments") ## for bamWhich() and coverage() Rsamtools::bamWhich(param) <- rng GenomicAlignments::coverage(Rsamtools::BamFile(fl), param=param)[rng] } ## Compute coverage on the packed ranges. dat <- bplapply(as.list(pk), FUN, fl = fl, param = ScanBamParam()) ## The result list contains RleLists of coverage. lapply(dat, class) ## unpack() transforms the results back to the order of ## the original ranges (i.e., unpacked 'gr'). unpack(dat, pk) } \keyword{methods} GenomicFiles/tests/0000755000175200017520000000000014136050457015307 5ustar00biocbuildbiocbuildGenomicFiles/tests/GenomicFiles_unit_tests.R0000644000175200017520000000005314136050457022255 0ustar00biocbuildbiocbuildBiocGenerics:::testPackage("GenomicFiles") GenomicFiles/vignettes/0000755000175200017520000000000014136071655016160 5ustar00biocbuildbiocbuildGenomicFiles/vignettes/GenomicFiles.Rnw0000644000175200017520000006764114136050457021227 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{Introduction to GenomicFiles} %\VignetteDepends{GenomicAlignments, RNAseqData.HNRNPC.bam.chr14} %\VignetteKeywords{parallel, sequencing, fileIO} %\VignettePackage{GenomicFiles} \documentclass{article} <>= BiocStyle::latex() @ \title{Introduction to \Biocpkg{GenomicFiles}} \author{Valerie Obenchain, Michael Love, Martin Morgan} \date{Last modified: October 2014; Compiled: \today} \begin{document} \maketitle \tableofcontents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Introduction} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% This vignette illustrates how to use the \Biocpkg{GenomicFiles} package for distributed computing across files. The functions in \Rcode{GenomicFiles} manipulate and combine data subsets via two user-supplied functions, MAP and REDUCE. These are similar in spirit to \Rcode{Map} and \Rcode{Reduce} in \Rpackage{base} \R{}. Together they provide a flexible interface to extract, manipulate and combine data. Both functions are executed in the distributed step which means results are combined on a single worker, not across workers. We assume the reader has some previous experience with \R{} and with basic manipulation of ranges objects such as \Rcode{GRanges} and \Rcode{GAlignments} and file classes such as \Rcode{BamFile} and \Rcode{BigWigFile}. See the vignettes and documentation in \Biocpkg{GenomicRanges}, \Biocpkg{GenomicAlignments}, \Biocpkg{Rsamtools} and \Biocpkg{rtracklayer} for an introduction to these classes. The \Rpackage{GenomicFiles} package is available at bioconductor.org and can be downloaded via \Rcode{BiocManager::install}: <>= if (!require("BiocManager")) install.packages("BiocManager") BiocManager::install("GenomicFiles") @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Quick Start} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Rpackage{GenomicFiles} offers functions for the parallel extraction and combination of data subsets. A user-defined MAP function extracts and manipulates data while an optional REDUCE function consolidates the output of MAP. <>= library(GenomicFiles) @ Ranges can be a \Rcode{GRanges}, \Rcode{GRangesList} or \Rcode{GenomicFiles} class. <>= gr <- GRanges("chr14", IRanges(c(19411500 + (1:5)*20), width=10)) @ File are supplied as a character vector or list of *File classes such as \Rcode{BamFile}, \Rcode{BigWigFile} etc. <>= library(RNAseqData.HNRNPC.bam.chr14) fls <- RNAseqData.HNRNPC.bam.chr14_BAMFILES @ The MAP function extracts and manipulates data subsets. Here we compute pileups for a given range and file. <>= MAP <- function(range, file, ...) { requireNamespace("Rsamtools") Rsamtools::pileup(file, scanBamParam=Rsamtools::ScanBamParam(which=range)) } @ \Rcode{reduceByFile} sends each file to a worker where MAP is applied to each file / range combination. When \Rcode{summarize=TRUE} the output is a \Rcode{SummarizedExperiment} object. <>= se <- reduceByFile(gr, fls, MAP, summarize=TRUE) se @ Results are stored in the \Rcode{assays} slot. <>= dim(assays(se)$data) ## ranges x files @ \Rcode{reduceByRange} sends each range to a worker and extracts the same range from all files. Adding a reducer to this example combines the pileups from each range across files. <>= REDUCE <- function(mapped, ...) { cmb = do.call(rbind, mapped) xtabs(count ~ pos + nucleotide, cmb) } lst <- reduceByRange(gr, fls, MAP, REDUCE, iterate=FALSE) @ The result is a list where each element is a summary table of counts for a single range across all 8 files. <>= head(lst[[1]], 3) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Overview of classes and functions} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{\Rcode{GenomicFiles} class} The \Rcode{GenomicFiles} class is a matrix-like container where rows represent ranges of interest and columns represent files. The object can be subset on files and / or ranges to perform different experimental runs. The class inherits from \Rcode{RangedSummarizedExperiment} but does not (as of yet) make use of the \Rcode{elementMetadata} and \Rcode{assays} slots. <>= GenomicFiles(gr, fls) @ A \Rcode{GenomicFiles} can be used as the \Rcode{ranges} argument to the functions in this package. When \Rcode{summarize=TRUE}, data from the common slots are transferred to the \Rcode{SummarizedExperiment} result. NOTE: Results can only be put into a \Rcode{SummarizedExperiment} when no reduction is performed because of the matching dimensions requirement (i.e., a REDUCE collapses the results in one dimension). \subsection{Functions} Functions in \Rcode{GenomicFiles} manipulate and combine data across or within files using the parallel infrastructure provided in \Rcode{BiocParallel}. Files and ranges are sent to workers along with MAP and REDUCE functions. The MAP extracts and/or manipulates data and REDUCE consolidates the results from MAP. Both MAP and REDUCE are executed in the distributed step and therefore reduction occurs on data from the same worker, not across workers. The chart in Figure \ref{reduceByRange_flow} represents the division of labor in \Rcode{reduceByRange} and \Rcode{reduceRanges} with 3 files and 4 ranges. These functions split the problem by range which allows subsets (i.e., the same range) to be combined across different files. \Rcode{reduceByRange} iterates through the files, invoking MAP and REDUCE for each range / file combination. This approach allows ranges extracted from the files to be kept separate or combined before the next call to \Rcode{MAP} based on whether or not a \Rcode{REDUCE} is supplied. \Rcode{reduceRanges} applies \Rcode{MAP} to each range / file combination and REDUCEs the output of all MAP calls. \Rcode{REDUCE} usually plays a minor role by concatenating or unlisting results. \begin{figure}[!h] \begin{center} \includegraphics{reduceByRange_flow.png} \caption{Mechanics of \Rcode{reduceByRange} and \Rcode{reduceRanges}} \label{reduceByRange_flow} \end{center} \end{figure} In contrast to the `byRange` approach, \Rcode{reduceByFile} and \Rcode{reduceFiles} (Figure \ref{reduceByFile_flow}) split the problem by file. Files are sent to different workers with the set of ranges allowing subsets (i.e., multiple ranges) from the same file to be combined. \Rcode{reduceByFile} invokes \Rcode{MAP} for each file / range combination allowing potential \Rcode{REDUCE} after each MAP step. \Rcode{reduceFiles} applies \Rcode{MAP} to each range / file combination and REDUCEs the output of all MAP calls. \Rcode{REDUCE} usually plays a minor role by concatenating or unlisting results. \begin{figure}[!h] \begin{center} \includegraphics{reduceByFile_flow.png} \caption{Mechanics of \Rcode{reduceByFile} and \Rcode{reduceFiles}} \label{reduceByFile_flow} \end{center} \end{figure} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Queries across files: \Rcode{reduceByRange} and \Rcode{reduceRanges}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% The \Rcode{reduceByRange} and \Rcode{reduceRanges} functions are designed for analyses that compare or combine data subsets across files. The first example in this section computes pileups on subsets from individual files then sums over all files. The second example computes coverage on a group of ranges for each file then performs a basepair-level $t$-test across files. The $t$-test example also demonstrates how to use a blocking factor to differentiate files by experimental group (e.g., case vs control). \pagebreak \subsection{Pileup summaries} In this example nucleotide counts (pileups) are computed for the same ranges in each file (MAP step). Pileups are then summed by position resulting in a single table for each range across all files (REDUCE step). Create a \Rclass{GRanges} with regions of interest: <>= gr <- GRanges("chr14", IRanges(c(19411677, 19659063, 105421963, 105613740), width=20)) @ The \Rcode{bam2R} function from the \Rpackage{deepSNV} package is used to compute the statistics. The MAP invokes \Rcode{bam2R} and retains only the nucleotide counts (see ?\Rcode{bam2R} for other output fields). Counts from the reference strand are uppercase and counts from the complement are lowercase. Because the \Rcode{bam2R} function is not explicitly passed through the MAP, \Rcode{deepSNV} must be loaded on each worker so the function can be found. <>= MAP <- function(range, file, ...) { requireNamespace("deepSNV") ct = deepSNV::bam2R(file, GenomeInfoDb::seqlevels(range), GenomicRanges::start(range), GenomicRanges::end(range), q=0) ct[, c("A", "T", "C", "G", "a", "t", "c", "g")] } @ With no REDUCE function, the output is a list the same length as the number of ranges where each list element is the length of the number of files. \begin{verbatim} pile1 <- reduceByRange(gr, fls, MAP) > length(pile1) [1] 4 > elementNROWS(pile1) [1] 8 8 8 8 \end{verbatim} Next add a REDUCE to sum the counts by position. <>= REDUCE <- function(mapped, ...) Reduce("+", mapped) @ The output is again a list with the same length as the number of ranges but the element lengths have been reduced to 1. <>= pile2 <- reduceByRange(gr, fls, MAP, REDUCE) length(pile2) elementNROWS(pile2) @ Each element is a matrix of counts (position by nucleotide) for a single range summed over all files. <>= head(pile2[[1]]) @ \subsection{Basepair-level $t$-test with case / control groups} In this example coverage is computed for a region of interest in multiple files. A grouping variable that defines case / control status is passed as an extra argument to \Rcode{reduceByRange} and used in the reduction step to perform the $t$-test. Define ranges of interest, <>= roi <- GRanges("chr14", IRanges(c(19411677, 19659063, 105421963, 105613740), width=20)) @ and assign the case, control grouping of files. (Grouping is arbitrary in this example.) <>= grp <- factor(rep(c("A","B"), each=length(fls)/2)) @ The MAP reads in alignments from each BAM file and computes coverage. Coverage is coerced from an RleList to numeric vector for later use in the $t$-test. <>= MAP <- function(range, file, ...) { requireNamespace("GenomicAlignments") param <- Rsamtools::ScanBamParam(which=range) as.numeric(unlist( GenomicAlignments::coverage(file, param=param)[range], use.names=FALSE)) } @ REDUCE combines the coverage vectors into a matrix, identifies all-zero rows, and performs row-wise $t$-testing using the \Rcode{rowttests} function from the \Biocpkg{genefilter} package. The index of which rows correspond to which basepair of the original range is stored as a column \Robject{offset}. <>= REDUCE <- function(mapped, ..., grp) { mat = simplify2array(mapped) idx = which(rowSums(mat) != 0) df = genefilter::rowttests(mat[idx,], grp) cbind(offset = idx - 1, df) } @ The file grouping is passed as an extra argument to \Rcode{reduceByRange}. \Rcode{iterate=FALSE} postpones the reduction until coverage vectors for all files have been computed. This delay is necessary because REDUCE uses the file grouping factor to perform the $t$-test and relies on the coverage vectors for all files to be present. <>= ttest <- reduceByRange(roi, fls, MAP, REDUCE, iterate=FALSE, grp=grp) @ The result is a list of summary tables of basepair-level $t$-test statistics for each range across all files. \begin{verbatim} > head(ttest[[1]], 3) offset statistic dm p.value 1 0 1.1489125 2.75 0.2943227 2 1 0.9761871 2.25 0.3666718 3 2 0.8320503 1.50 0.4372365 \end{verbatim} These tables can be added to the \Rcode{roi} GRanges as a metadata column. \begin{verbatim} mcols(roi)$ttest <- ttest > head(roi) GRanges object with 4 ranges and 1 metadata column: seqnames ranges strand | ttest | [1] chr14 [ 19411677, 19411696] * | ######## [2] chr14 [ 19659063, 19659082] * | ######## [3] chr14 [105421963, 105421982] * | ######## [4] chr14 [105613740, 105613759] * | ######## ------- seqinfo: 1 sequence from an unspecified genome; no seqlengths \end{verbatim} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Queries within files: \Rcode{reduceByFile} and \Rcode{reduceFiles}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Rcode{reduceByFile} and \Rcode{reduceFiles} compare or combine data subsets within files. \Rcode{reduceByFile} allows for more fine-tuned manipulation over the subset for each range / file combination. If differentiating between ranges is not important, \Rcode{reduceFiles} can be used to treat the ranges as a group. In this section read junctions are counted for individual subsets within a file then combined based on user-defined selection criteria. Another example computes coverage over complete BAM files by streaming over a set of continuous ranges. The coverage example is performed with both \Rcode{reduceByFile} and \Rcode{reduceFiles} to demonstrate the passing ranges to MAP individually vs all at once. The last example uses a MAP function to chunk through subsets when the data are too large for available memory. \subsection{Counting read junctions} This example highlights how \Rcode{reduceByFile} allows detailed control over the combination of data subsets from distinct ranges within the same file. Define ranges of interest. <>= gr <- GRanges("chr14", IRanges(c(19100000, 106000000), width=1e7)) @ The MAP produces a table of junction counts (i.e., 'N' operations in the CIGAR) for each range. <>= MAP <- function(range, file, ...) { requireNamespace("GenomicAlignments") ## for readGAlignments() ## ScanBamParam() param = Rsamtools::ScanBamParam(which=range) gal = GenomicAlignments::readGAlignments(file, param=param) table(GenomicAlignments::njunc(gal)) } @ Create a GenomicFiles object. <>= gf <- GenomicFiles(gr, fls) gf @ The GenomicFiles object or any subset of the object can be used as the \Rcode{ranges} argument to functions in \Rcode{GenomicFiles}. Here the object is subset on 3 files and both ranges. <>= counts1 <- reduceByFile(gf[,1:3], MAP=MAP) length(counts1) ## 3 files elementNROWS(counts1) ## 2 ranges @ Each list element has a table of counts for each range. <>= counts1[[1]] @ Add a reducer that combines counts for records in each range with exactly 1 junction. <>= REDUCE <- function(mapped, ...) sum(sapply(mapped, "[", "1")) reduceByFile(gr, fls, MAP, REDUCE) @ Next invoke \Rcode{reduceFiles} with the same files and MAP function. \Rcode{reduceFiles} treats all ranges as a group and counts junctions for all ranges simultaneously. <>= counts2 <- reduceFiles(gf[,1:3], MAP=MAP) @ In the \Rcode{reduceByFile} example junctions were counted for each range individually which allowed us to see results for the individual ranges and combine them on the fly based on specific criteria. In contrast, \Rcode{reduceFiles} counts junctions for all ranges simultaneously. <>= ## reduceFiles returns counts for all ranges. counts2[[1]] ## reduceByFile returns counts for each range separately. counts1[[1]] @ \subsection{Coverage 1: \Rcode{reduceByFile}} Files that are too large to fit in memory can be streamed over by creating `tiles` or ranges that span the whole file. The \Rcode{tileGenome} function creates a set of continuous ranges that span a given seqlength(s). The sample BAM files contain only chr14 so we extract the appropriate seqlength from the BAM files and use it in \Rcode{tileGenome}. In this example we create 5 ranges but the optimal value for \Rcode{ntile} will depend on the application and the size of the chromosome (or genome) to be tiled. <>= chr14_seqlen <- seqlengths(seqinfo(BamFileList(fls))["chr14"]) tiles <- tileGenome(chr14_seqlen, ntile=5) @ \Rcode{tiles} is a GRangesList of length \Rcode{ntile} with one range per element. <>= tiles @ MAP computes coverage for each range. The sum of coverage across all positions is recorded along with the width of the range. <>= MAP = function(range, file, ...) { requireNamespace("GenomicAlignments") ## for ScanBamParam() and coverage() param = Rsamtools::ScanBamParam(which=range) rle = GenomicAlignments::coverage(file, param=param)[range] c(width = GenomicRanges::width(range), sum = sum(S4Vectors::runLength(rle) * S4Vectors::runValue(rle))) } @ REDUCE sums the width and coverage for all ranges in `tiles`. <>= REDUCE = function(mapped, ...) { Reduce(function(i, j) Map("+", i, j), mapped) } @ When \Rcode{iterate=TRUE} REDUCE is applied after each MAP step. Iterating prevents the data from growing too large on the worker. The total width and coverage sum for all ranges are returned for each file. <>= cvg1 <- reduceByFile(tiles, fls, MAP, REDUCE, iterate=TRUE) @ \begin{verbatim} > cvg1[1] $ERR127306 $ERR127306$width [1] 107349540 $ERR127306$sum.chr14 [1] 57633506 \end{verbatim} \subsection{Coverage 2: \Rcode{reduceFiles}} In the first coverage example we used \Rcode{reduceByFile} to invoke MAP for each file / range combination. This approach is useful when analyses require data manipulation at the level of each file / range subset prior to reduction. For many applications, however, distinguishing between ranges is not important and the overhead of an lapply over all ranges may be costly. An alternative is to use \Rcode{reduceFiles} which passes all ranges as a single argument to MAP. The ranges can be used to create a `param` or passed as an argument to another function that operates on multiple ranges at at time. This MAP computes coverage on all ranges at once and returns an RleList. <>= MAP = function(range, file, ...) { requireNamespace("GenomicAlignments") ## for ScanBamParam() and coverage() GenomicAlignments::coverage( file, param=Rsamtools::ScanBamParam(which=range))[range] } @ REDUCE extracts the RleList from `mapped` and collapses the coverage. Note that reduction could have be done in the MAP step on the output of coverage. Because all ranges are passed as a single argument, MAP is only called once on each worker. Consequences of a single invocation are (1) reduction can be done at the end of the MAP or by REDUCE and (2) REDUCE cannot be applied iteratively (this requires more than a single output from MAP). <>= REDUCE = function(mapped, ...) { sapply(mapped, Reduce, f = "+") } @ Recall `tiles` is a GRangesList with one range per list element. We have no need for the grouping in this example so we pass `tiles` as a GRanges. <>= cvg2 <- reduceFiles(unlist(tiles), fls, MAP, REDUCE) @ Output is a list of length 8 where each element is a single Rle of coverage for all ranges. <>= cvg2[1] @ \subsection{Coverage 3: \Rcode{reduceFiles} with chunking} Continuing with the same coverage example. Now let's assume the result from calling \Rcode{coverage} with all ranges in `tiles` does not fit in available memory. We need a way to chunk through the ranges. One option is to use \Rcode{reduceByFile} to lapply through each range in `tiles` individually and then apply a reducer as we did in the first coverage example. Because the `tiles` GRangesList has only one range per list element this approach may be inefficient for a large number of ranges. To reduce the number of iterations in the lapply, the ranges in `tiles` could be re-grouped into a GRangesList with more than one range per element. Another approach is to write your own MAP function that chunks through the ranges. This has the advantage that, if resources are available, an additional level of parallel dispatch can be implemented. MAP creates an index over the ranges which are passed to \Rcode{bplapply}. The data are subset on each worker, coverage is computed and reduced for the ranges in the chunk. <>= MAP = function(range, file, ...) { requireNamespace("BiocParallel") ## for bplapply() nranges = 2 idx = split(seq_along(range), ceiling(seq_along(range)/nranges)) BiocParallel::bplapply(idx, function(i, range, file) { requireNamespace("GenomicAlignments") ## ScanBamParam(), coverage() chunk = range[i] param = Rsamtools::ScanBamParam(which=chunk) cvg = GenomicAlignments::coverage(file, param=param)[chunk] Reduce("+", cvg) ## collapse coverage within chunks }, range, file) } @ REDUCE extracts and collapses the RleList of coverage for all chunks. <>= REDUCE = function(mapped, ...) { sapply(mapped, Reduce, f = "+") } @ Again `tiles` are passed as a GRanges so the chunking in MAP defines the groups, not the structure of the GRangesList. Output is a list of length 8 where each list element is a single Rle of coverage. <>= cvg3 <- reduceFiles(unlist(tiles), fls, MAP, REDUCE) @ \begin{verbatim} > cvg3[1] $ERR127306 $ERR127306[[1]] integer-Rle of length 21469908 with 489540 runs Lengths: 6818 9 8 1 1 2 2 ... 3 5 8 1 10 863 Values : 0 22 23 19 17 18 17 ... 20 22 21 23 22 0 \end{verbatim} \newpage %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Chunking} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Ranges in a file} Both \Rcode{reduceByFile} and \Rcode{reduceByRange} process \Rcode{ranges} one element at a time. When \Rcode{ranges} is a GRanges the element is a single range and when it is a GRangesList the element can contain multiple ranges. If the GRanges is very long (many ranges) working one range at a time can be inefficient. Splitting the GRanges into a GRangesList allows \Rcode{reduceByFile} and \Rcode{reduceByRange} to work on groups of ranges and will gain speed and efficiency in most applications. This approach works as long as the analysis does not depend on keeping the ranges separate (i.e., MAP and REDUCE can be written to operate on groups of ranges instead of a single range). For applications that combine data \emph{within} a file, chunking can be done with \Rcode{reduceByFile} and a GRangesList. Similarly, when chunking through ranges to combine data \emph{across} files use \Rcode{reduceByRange} with a GRangesList. \subsection{Records in a file} \Rcode{reduceByYield} iterates through records in a single file that would otherwise not fit in memory. It is similar to a one dimensional \Rcode{reduceByFile} but the arguments and approach are slightly different. Similar to other \Rcode{GenomicFiles} functions, data are manipulated and reduced with \Rcode{MAP} and \Rcode{REDUCE} functions. What sets \Rcode{reduceByYield} apart are the use of \Rcode{YIELD} and \Rcode{DONE} arguments. \Rcode{YIELD} is a function that returns a chunk of data to work on and \Rcode{DONE} is a function that defines a stopping criteria. Records from a single file are read by \Rcode{readGAlignments} and limited by the \Rcode{yieldSize} set in the BamFile. <>= library(GenomicAlignments) bf <- BamFile(fls[1], yieldSize=100000) YIELD <- function(x, ...) readGAlignments(x) @ MAP counts overlaps between the reads and a GRanges of interest while REDUCE sums counts over the chunks. <>= gr <- unlist(tiles, use.names=FALSE) MAP <- function(value, gr, ...) { requireNamespace("GenomicRanges") ## for countOverlaps() GenomicRanges::countOverlaps(gr, value) } REDUCE <- `+` @ When \Rcode{DONE} evaluates to TRUE, iteration stops. `value` is the object returned from calling YIELD on the BAM file. At the end of file the length of records will be 0 and \Rcode{DONE} will evaluate to TRUE. <>= DONE <- function(value) length(value) == 0L @ The MAP step is run in parallel when \Rcode{parallel=TRUE}. `parallel` is currently implemented for Unix/Mac only so we use multicore workers. \begin{verbatim} register(MulticoreParam(3)) > reduceByYield(bf, YIELD, MAP, REDUCE, DONE, gr=gr, parallel=TRUE) [[1]] [1] 21465 163154 75498 212593 327785 \end{verbatim} Taking this one step further, we can use \Rcode{bplapply} to distribute files to workers and call \Rcode{reduceByYield} on each file. If adequate resources are available this example could have 2 levels of parallel dispatch, one at the file level (\Rcode{bplapply}) and one at the MAP level (\Rcode{reduceByYield(..., parallel=TRUE)}. This example takes the conservative approach and runs \Rcode{reduceByYield} in serial on each worker. The function `FUN` will be run on each worker. <>= FUN <- function(file, gr, YIELD, MAP, REDUCE, tiles, ...) { requireNamespace("GenomicAlignments") ## for BamFile, readGAlignments() requireNamespace("GenomicFiles") ## for reduceByYield() gr <- unlist(tiles, use.names=FALSE) bf <- Rsamtools::BamFile(file, yieldSize=100000) YIELD <- function(x, ...) GenomicAlignments::readGAlignments(x) MAP <- function(value, gr, ...) { requireNamespace("GenomicRanges") ## for countOverlaps() GenomicRanges::countOverlaps(gr, value) } REDUCE <- `+` GenomicFiles::reduceByYield(bf, YIELD, MAP, REDUCE, gr=gr, parallel=FALSE) } @ \Rcode{bplapply} distributes the files to workers. Each worker uses \Rcode{reduceByYield} to iteratively count and reduce overlaps in a BAM file. \begin{verbatim} > bplapply(fls, FUN, gr=gr, YIELD=YIELD, MAP=MAP, REDUCE=REDUCE, tiles=tiles) $ERR127306 [1] 21465 163154 75498 212593 327785 $ERR127307 [1] 23544 181551 91702 236845 341670 $ERR127308 [1] 23236 178270 84027 234735 355353 $ERR127309 [1] 20890 160804 82120 208961 305701 $ERR127302 [1] 20636 140052 89834 208824 283432 $ERR127303 [1] 22198 149809 106987 226217 281000 $ERR127304 [1] 25718 150984 94198 223797 316043 $ERR127305 [1] 25646 145655 79854 219333 327909 \end{verbatim} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rcode{sessionInfo()}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= toLatex(sessionInfo()) @ \end{document} GenomicFiles/vignettes/reduceByFile_flow.png0000644000175200017520000026606314136050457022271 0ustar00biocbuildbiocbuildPNG  IHDRQnIDATxg^bGؑmlM SMlnXM5%iIUd0a(K-thtB[iIUj)%bf,0]8iJ'3D32?G&|~]k=$""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""{s NIRo_nm>}iDmbʴWqaj}oޘ>WDDDDDDDvk+g+~@i\ݤ0(\qNWW>][9>ק0Zoi70_QRrk\ewumq/;8ͧϵ- 6] ߞbN04_t`s0+:,==OU|cc ˼8ؘ;|rAX}״#mW4mҠ^|j[#>L|~?u[D3^ϵӿ6) wQD &Dh4=:b~ey~nxfHGG}TUijTMmՙ~XF4Bw˲O5V=~>;z]eڗg(O gR8gh^NG[<0`?ѦԎ"xxF\!ߚ5Gyr ܻߛm}ez}F{˶>=m7:kL=ߦ͈/(۴:?W5Jz4?O15U"J:*""""""sAtgmZku2p{͎^/jmٻg}3}}{%D|,`:ƌ^oE̶/M/iWěoeӤjO*Xb ս(7EDDDDDd,㹁#\q^,siOpi`|-s} G[ _ShT#`ޝG4"cih:r ~2J!_[?)F[Śnx=("""""";|M0"2: s,r5MBy{?~ӾdCD͓+dnXJ=B|e=&@[gFyrRk, ,Љ=`qNRՑ^}ԢZk#h_>ϷykT 95u qHA}$׷8ޗ4*7쟬#l LxIȮGc [#bR@j4E-| hjbRk|qMjUDyc=7͏dyq/ 5:iʍjK[sSSӤS|EnچgEnr]fn4JO72NZ_mQ §,]uO^XpYC+GԾmwNuH~Rpyv]#\Ӧȑ:JеAr|kՙt01HDDDDDDĩ0_Jޘq_mNjZrW۴`]@QO ^'lPPٲwn6Mݼ;-R4MJҠz[Z;4'4F|O:[(֦ݳZΡEDDDDDd'2d9ɩQuil{v25[k˾ߖ6h_yE, |B""""""""CR$sZ@jnLӵ]ّ!]ʮ~l;[62푙udGg?ض:E|̵꙯Xc\=꾅mE}ݽ9{@. rϮ1o=Gޓx|٘]Qm㪇DdkۋX߫eo>_[}~m{#wi_yP8"7w&9}\]3C@[y-?gOc//]u= U{w5 ܳn~߷zƾ!(WV?&WV?n|J'4]^=l?GjG~yzADyk#MȹQn=㙁2=;J@{!DW>ZE>?i gu9k(ykڍ 9"J~xL /÷V3Xr/ ʃ]}@zYVc+guo.-$˃鷼6ϭ^X}}7DWUyC!rnE7W^뜘*N0З(ԗzgKn_2E,`6/\]Gg2Y]O =\Cal^@"J~nor~m  +e>"JyvzNDNu':Gޛ>,2Vr~9}r%wJE}k3Ϡd9vy=#k\^paD7<W?.u"ɣǢF]@_=rys-cF9#JyyŒ>^wyQj:Q59oPo(\/"צ"*[S BoopBDQ9vzcu˝Q-]{E.2} "ʍ5SD9ZxjcRwG{l(Q-"Ssqy4.0Tred+#{kCyr(sv@. [(s>g/㔘x| 5+Q8COQDN4RF]~xgZ~wm(Ί(3~xSEdkRhخ㯷BiEi"4}(}G oNo_aED.Ru4'ADyn0-3mϞYӝM^[)yEEdãG(/$("J0?[NNV'0o8kM-6`aY;xNxw|\S7u\sί6Ra֮8"yc7Z<_,0".O }" wNYK9S ߝ>0N~{8goqQsiC2CZj[x}jpy\w*dgE9Ui]\0R0yEdȗ_/?L3bַ|/%m; )WDyf?7iD^PDQDL+}<4x}pz=T-^(H`jg ~@.\ۉd}wuMT2DHO0[,ByL[>Dzm/rueQ>]T׍ռ%Lw?½G6m\_^ȐKkF}ge(o~|nkӫy[}s}lnùQ ҕ04W洿""Js*"G5f~#}yx 3qo+,\0BCm޻&g΍ΗyR]Ǜg<oĚ\rȱ17:>7F]+F^˃>ϕ6DstKP_>Tm+'ֽTpIϾʽZw5zyڹZ*^Z-uzy5fKXm9VQDvE9|\9_TDvz6SDDDD(""""""""@k'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""3\m74Mӎ*"""""'n-MӴ )"""""r?y/iڡ졏Ɉ)7ȹQ~[?iv(CHQDEM4EQDY/o[9Eƛh\=M-}^2щQDDDDDDv@D[?_97_:vOk iOM̟(ї{MDz\yɘG'^SDSo '<`ٜp@$/|ia<QFoݛÈ(}ՈщQDDDDDDv@D6\ROz\XJDa=eúQ-" GC(֮QDDDDDD΀Iq{ 0˷>OSX3[wy~W~mo'z}"`^AK/?b Ŝ1r"ʏ={RDQDDDDDDιRkĩNI@~/>' rPz){H^AxyS'PX\^~7K=D[ecr;a=-_7vJDa_sooߎ+AI^SDA b ⯩!QhO7)}|JԞgZ#2gN5gdʩ#eaه>'u5E D@G RdD`A!r%Bs" 1DhRz?:[e(+I]MD"l" w̿$M3Q'UFQDDDDDDDLReF" @h qRD"/23@l>8H:OڒZ.(YW&""""""rNDjr4Nq.=i9=%H75*ϨAsSJDDP%iMua>뢆 EMEDDDDD䌋(#F!5(t4CPwu'" [RS\\*j!]!1LRvٿ?~hj"Ȏ(DW l)B"FcZd " ]B N桦 IaXdc#e>!욈2C~D8BVC<׈uH ,"(8u`{ "RQp~ >/%#Y&ә.O TkDqQ2lh>Hy%m (D=Q;%퓦)i""""""(()9DӴk(h""""r84|RQ4MSDsɞ?i3F9aDE4E9"Ύx_4{Ύ(10C k1},;< 5tl5)"i: WM/Cow,9~oҭ~޽c/~? G>7i:_*b}˯Ϳ/hr 8l_<@p^⑏m̯} j ]?C?r^tO韾c/ʯM[?瞜]Ϳ}(3/{O ;H{hvDMR12Ao=R?O{vus!ԏyַ}`dú0&ϺlӾu";_I78_J>P$Ab=O0їkD&"\{Y7Ha{ ˭kEEMSD١ ! ˑZѝU{'>}M`^}_'C]_|~pa|to8/?/b۴FGbu81HvptaH o^ `yPH388o>eL׾/+>ў޷ݖK/+>yؿ &9n\3_|zo8>٧" `]=Oq}gY2~zD-U?A[v>'$ &ljs}2uL`4&>r"(h)FdrSIm:N!,@8lc?8q6 >k]8e~ -D?cZ}Bndu>a?~K9e95lcDڰRQ>ɴ/ xgc9os^dI?A(7ArjOr5 "STl~A7D  0@8?#yᚆ'B1'a""""(" 1dO;<"u"!4Y88y;?gd"6M`Ӡ(o֋S2j$FlMjk*Wp%K0q؉n?"LF-D`Kg}:, C͗:=V"i#Rc"6V1A[GhCIy$,֍5WU̺Ӈ| ;֓G4a""""(" Nd)K)#`4DvDs'l;t.( FqNZ ǩZuqG` 88]X/4qJ K2qz:LHIW78Į}]da}Kx#F!"j# hPlZW%$~f "1(`"Xwg!Fּm1jҩݹFXSaTG8Lp)ĉ#@XǺF*"^0Q2! Z$B#hCt6/EFb\o}1|xDH G4xTys~'``6wG_q]$(5M2Ǜsǰ= 10a"""6GQ4Mh" rOE~nzjnEi"n (N;Q &6JA!aZEwDD) 2@ AOw!рȂD԰f6GD8QDRD*HȇiR %6%c4bH+LGwj:L7CH`[luN%M(CV!1C^]6qr׉` FʾG4_ͥ"""<1G;!ecgsf- 󌆕 x]Z5 y5y 5m!!og3qǃ<4)3fqm>`ytշ7>,g]?ϰ٢WbKEhHhz"Hl+zpq8TpZp~񬟷zFDaO8ԯ$28У,Q)BǻZG>Utk43u6R6'8)T˰MGT^Gpv¹}3"RDT.,~S8n|Of*"zDQPI_p}!'+ϐ߅e =#)@s"dt‹?}Uŝ>4tm'BH]3F_qqpNo!OEq}/9&}EQL#9D.ӻCj),0c: h=g]Dǂ~XHۚ^9. umI|M8iƹ:"JwOR)Ne:g](ٷM v9%%$SRy> Ҏ0htsȴ}}޺D[0dz^,KR!Z?Ac~3K-S65tFucZ}T"'olΌ"""!Ea=7ވ!N_VvNDp: x}dg7݉d]GA5"PQ-K_0muggt,oQ`ϺhKWrI"@X'_Dy "`^}QOF64p:OeXU"yQ4M;~K- (}D|-CZwp#$G K" \EPa_R qABYprczrPy& "1quVaat,f>u+e4u(~M=ږ7N+fr<R)DZG|AQ%)bz85ʦd9$e˜@2ODL'I;Dp= )dT>gRpڗmgMDI/?8] wE(h)}DFHIN_$#"MmT[a1';#'e`!DT;UD}{y,Q4w Ck.(9s,TR ,(K$U:w7\(h)}DCH"@Gm>SmT#zMj^o#R ZC$ Q ۈ(u$-}w82i2)ٗ]Q\DqS1tDuH4¾l m:DE4MEDDćs $!xjwFHMш;8KbȒ^҇9GĨo7Q :=@ytaG0_-FEt(SG")8ǂ}bQ$8k" 4H: CAH5q.µ:4}9>mixbZG|++Ε~/ϙ/֙Xvy_Gq~̝>((쨈BJOcFN_.>t!l*`8D;QB ;qdHI*Q"K։( Bb|_,!l?6< Q;aDoT栅eYB"QDmFq-y¾ka:]\_1%Lz\EQ2RȸԚ4 RJǻGPq~ s)}K#9a@9j_]_Gōj=bD9vsFrL$""" f[:|4*:̈#׿d78;M+)3ӪǮ䞘1]b~X4ue]D!*Tg +C#O!kұHgDt U!$z.Y}hDQF}-NDk[Qю~9BGq]+KK"MγQ#38YqYN荴3X'm+%ۊ(Y?baR Q}TZghw]M"'q-G49e[,ҹs\ƹXCHDDDEeE]{#T# (Gz,P u6ߜqiQGm8`GT^0d+ent8jym#$j ki(;"ohf\:HD?dK"ʺ!G+GE(Mә؟QB5g"EEEE# NA"D&!"N=BR2ϼ8D!awMԛ-u(hKu:ruXQtCDJ:˶" i}|IA BADCWeU!!h'QȟEDձl25{`0!iLc""kDD%m# s@?N>O;"z}OtP rNj<>.H_>((($QRdZF(D&u0j݇n"RM=!Lq^eT!''/ VDᠦ~Ѻtz։(at& m]:O-;FšQj>T;E|F\^'15%׾" ۠op7wW" f꟤Px>6OrS[).#1$^R[ oh/}kԃb}?^GK?UmvL$""`Ig4*E3m(LUul։(=deȒM fN=5`։(Dht>y24{#a軐\3!&6)bD7Qvm*DD[u QzTQ FڧΓMDL$""iQRP& 6]ÜnUP]'QpDl#$dd 1'S;KBDD.ڠ<}u19~ѱ.:mH.;"lhKH ;zBjI{պGtDDtQ4MSD9d:b9@"& CB֜O &u4 FDm2 q4=uHhW IYhDPOSr"d(7Qh#oUD̮(zۚ'5CkcO!EDD]E4E#(,KDj417I"):r)!(DyNDA`'DD -e#hQlj }B(ADZ7"05Q "J΁: {E u%W؎v2VM9.睐<KP80{:yQ!CVϑf뼉(iR_@WM567RCfιβնk^)$ޮgݹƎmNa:<΂8Yh;+y䢍Γ8QpYb Q5%"J=̏\;,56XOagSZ<`9%5Tw҇u8cwj5CB?i"UHP$g(MEXOMQK#FGGIEqCED䜈(q ҅y9'<(<3(چ7cGKokyfU~"gDz,x8GDa ocr L %tg7׹FawXNj'דׅeajyQӒvz2TnFD:$Y7*KQI2?GQCD,sM)a=h-HUiԄg:f*1Ow>hSqǎ2^#!iYở#?Xust1˾~>1>ښ>}ߣghw=f_Nf!Uܯ70nEEs*@p]s(XHlqYpǃ`>D/+o.O7bqCERy1ƨR{[ӻzHq~F(}) qGÜW̟sy8恶[Moh灝IӨ÷cuo%ϴ3,DéI=ǖ4{ND\"`D!\G87JMȱ{s{L?/rO:hZ.(ڝʥ)+'eN+${VG;u_yLEDQnL|"Gw fNP"037bY?Fh$'[ HވFSQ]DDaZؑqG"D/88IhP og>A{}\a=81l+$)/Pn9թXAFDI͟u {OӶi]K&HDzuk" b\ں\A&j!rHm|QnIv<"j#Z߬Q4E3 %%&'J"Ok LtMR.RzpQeP^ous\}/?ǏF :&'?ɯi@c9 #"Q6p @0y@dK'5R&EC/} Ԧ~4nkIDIZ,|z8#fɵsZ"JDclIqK\D"{ytX>PsDhXJ~""0=lrި# Ee%q?ވo]E+oR|1Tm9G}Cg?(QqJQӺ""P[;';byY:8(DB[jےCо&fڮs+3SQ4M~1QD949SC oQ֋('ՁQNw5:%']$b ņDt3rYaT'?I8晳D<Rjܱ@0iǨ8q(9su7#ԡZϚ¹tm ՑբsL> QD (hJEDDeVDI 6J>Q֋(5DH2A#R ^IMQP/7r)-/xc{ZET3OɾλE@*ApȾ}I[Q%b謉();7F5RA KuiQ\K#(hc*"r(%.S8ݙ\e3%)=D⩽pqFY3jD\brIg^<1}H@i@]5?C2?Kn882?"f"Jޖסk%m]@(;(@}ߑN Fd8JȒu"JEH`|p3mmS2xl?7q]Vք" ni²}G$hBRK&5Q(.8oQؗumc=,SS6"YJJzYtns$EMtw~˓:WZz"ż9)VA0Tq4#'8$5BV)XGu"(O޶ܶ8GO?Qv걡qxFX%чoo#8s^ > a1=+."M1 !0&˴bx>t\'HumI Ǡ4D 6-ND3'pֵvs/k?Gh輣}9, Ri该c~Ш#xX=iN~mgME^>9@EDdE o}w@D9}Xo q&⏊GGaǢ(E R'eD9" ǡE!|! ;|^iVWI߯ΚB߮Qx"WDQD(D1l3_WvHD3%t]BdB i]у(9 %O!Ηqlϓrsq_4B6_E@#@l@G #A$(Dh֑u(ZSܽ*yQ /|>"&<Ǒ""+ջm{݇~\^^%^ۜGoq4'W4M;'MWAW$jbEF*"CD I2" bdZ~zx}Q.>""rq**bD%y?iޯ #Ds"CI-F>u2ZoFMTD]!"eCpmkݏ*98M~}EӴ.9(Qj(C'ͧoHQq^EiצnPC {[s Ked E9%bsPQm#|>`yvF> fq^1ǚs[Vivc_1:&D!Je$2PںFa<DDaUb̓E Al}?.@h:N0 h5$Bk,!{y9O桉g?q)JoxH]<m+zpycywTI}tWV!7x̛0<cFxXiYy&jt~G#t'Q(nBD&߄<P;z-O^l"jZ86(=ϗ>d_ Ǜk@iE"=塃]x dn(XCR}ۧmE ;rZvAדu( (Lt:+ɈwFĎ"9y)h)#5 ZQ;X"G鑜}?g TUD=);){?ZÍ-<4?d| 5 #[|!eG9yK:rK ?6}TARTB>" FdIُCEN)}[%6Qߜ-oQ8N 'CKDq|85g1]wL\LDOȹߑ~2}yXӟ8yuP%{zIj$Џi[O+ʃ9mHD\Bx%%b w=9qvRs4J)^()x/ EDN]@ycucOy;#!5G0FA\ !TG:#8ݬgǐW!7 PܲN 9ED )=8?G" goDAWt{"T8^_iM?䘳#7qGge9Ѐm1OB|P#ʱ\#uVaaݱE%l#p>3/bR:ORL_O<~pkG" ۉk"<l.WW, Q]@̈Ѐp<f`zN)F$$fA~^4nkID\xfK=ڇDff$,i(9{Y̩j_Қj$}6 R89rF"tJ4MSDQD0\X *'- )Vn#/x s! V')a^ZnRF#'%RA;8ER;x_@Hwsops9Hoj u,H扈PRϓDL"A- 2LC0%dFR_hlj>gMD8ź#>EEЧI! Ț(p+xLEDΆcPv޻3 ֕Ȁ*t$8$7U#Ό,CO4 *P?#8z(8DD`9f&HbC":zIgY"Xx>8Uez}3g9LjIPDzmr,-䘮[5PΚ¹t<HRՈ@Z'ΐړQ֍1 (p{򘊈rhM8o(NDIZJ/Yz?u&lfF9"J y"@g9jDԺ1K5QFǰ69AQ%EL7Q2OhI;7ssq!ҏqf֓Q68i[(O¾l -xuM TOʽmn_Q4M~19}nnnorhǑTD3%[cOdBDO fMѤ0-h$ $'EtEEwČ9'}$lt#]bԷ(/D̃x+=jHOj[r>c ':)$]#>m9=(}m5%|hs쒢SSsN$\}, E Y4>WWg46GLE?.Qz{"-VwMSDQDs}uc{= {wqpr'?" 7IB!l*`[}#'( "v?D!]'`(47>y8GYwjPKFp. DӖ8Xy]so& 7s²}G$hBߦLj+mKq\GG%/zX:w}s}|q8s>%=}8ѰADἨ.MR#8zFۧ4ѽ0WSVFv.LO i| VQ4Ew۾= 89=<'7SA<סlA>C$q\k <`R4ևɭ>΃qQ;>bF8n 8IgD?1]z38ImiAa_YN7dv6 cBBck4ѱ|@He? RO "۫M&^u։(}Dڿm{wݣs 9W8HC_#,n{Oҙ '-V@F9?젣i""" ɾ+iu,x a8:.Y:F!5@m1ዏz,Bl*Hø*pzZQyy~j-u?ժ$lskb4<{B#B,ADQ$h^Ҵ,?m/)QD rw޾AoP{ E3~{2KLG IE:J%o7RP:c~!7m}ͼ(<&k#:4\D %^I?^|1K8S)$+Q/O 7DeԨBY:ߒ&6gKEɷQ-I;HMD'4"!P(==I]ӎծ~Y((^$"Qg88'qR'UT9J%ևT^ssN3j]n%z"(QRG !1ujGZŧUBDm$%*Fw9ΈzC6@\aDQږyF" ~ꅬ7Q6&]\:q\ִS=oi'kO~Y0ƷV7z> aʰ9ӹ<#F NEM"< (gl]#EG#~=} q0ٖh)}4.,;*^>٦eo"Ȥ~Fjb?^KoO""" $[EQ.AӼ줈hݑ\L3i'DP#Òvz4 ъs\ bK"/&f4|p/rS ]V6Qz})R~(]ER {iaσ']wEMQ֊(Іnf$B֟IK" )ܭT "6`(DFNY'e鈴Rn)UɭU4I󮈢i"ʬH>5KnS$A(snHRݤMDsEp.Lz&" #T#ŧ_ESDV?JoNEQDQDwngT3BLQ_5֗jF 97gjG}HLF*gFKedF;#XoF.!E`QC65ֿ6Ԅ6@ŮgMD)%8$bW; (4[G{ʨ;děkZ* )|Cϣ!s WQdtrh3ue9νQDQDDD0۫Oa(gLDٞVC~N vC\m֏҇e>bmNp8JR$$oӷ=88,34ZFm@<$ yp sHq%{h2Iea>{UtAcތ,CM>3-IR~IG1u-0jyX4VF }8F4bٌ#BÊ(SίD"nDY8sҰzHD\BxÑ%|t_(JdnD9qvRsp`09YD4MSDKNq|>" N`O DDHDYpH}˿$,op{Bx:oyRX9RK`2?>@@dIZ% &Q7Aug[eqXu/ cXzjaD,>ft>пڊ(vm)x$ZtDy>Jo\]\j݋z88Q4MHEDDNW?DD\UDQDVD!cj)=8X$" #FJ[jߤ/Q4MHEDDNW?Dϝ~}FE:L*ORBZoNGn~""d=;U,}x3W$#` :)J4I$j4 }ڏQDw$Z4D 3K[jR~3B }0pD4ڎc\)FMwSD4g"E9=+Q(w+pPqqER5wWkJ-Ћ:& t 8"DT;UD}{y,QD$ (C-[GH^Bq(9suP' -GgQD[68}$Hę2/BiSn9*:hSEM|&9/~߁}! (I$% ]D(Gv zj,zaӑN b)Jn*dA̓v}3HK=X;I(҈"o1ږ&з)Ȗ b>7}!jQQ4MHDDxgE,$4Z<(8K#,sNTj,(]lH6" Q,}=-$qXxR "MzӈDa;~#Ͱ]9jRYQths.p p~ћ17Ǘ{KQs29G-QVK͓<i>ۡ(q{" )=IQ"yѐU@(;(@}#'( -#D,Y'`[V:>qjvTmpY1e8OubӚ(ߨ>A "x_D6dLZh})DڵmePw}s}|Au2ǝ>t&Ųp54 ~Z+) cw$>wdk{Ĵ-562~#vD+4KSDɕBu+fSCo3x;xq:p3R-X7AةFqUZ)|>.ӺXC6p˴Aǃ1 !ʼnęi29 ]Da?9޴:+ziI[`T'}N:ϜZ6=~y T qp.ioBZhR$9'"cQ(UH:;k@޴mqiKQH:ruX.YR:DQQU`X7().R &u?i5z g{u}C J-AצU?sOHAjČp/)5vwYP-",0?ܣzT!Q]_OHµ; ps1ϨǺG8 ,4I9&Lhm&y=.ш>Kc[rFcztEW 9O" 6' y桙D&o>UDD8 eaqmÉb_G) : G_qq\G1Z')D]=3tM|G*"<̵>`" .!4^ƺSxmm]A g_^9' bK fݖM,׈Hڂy S:gGi@HI/c(ǹ=D@DZnq>D8>5߉gq|{LRD#v'%oNBD'eES~M#dZ97*k46ө32aqjqIիEO{_iĊ888ٛ qFL Z=DbzH"duEV(*,[ D pWsiVI=hk8d8uXgoc+w1e愉`%Y7H:KԔηޖIiUD/E"GvGEӴ- 4^ g4#sQNK{fcR8u4Umd&zpSu&dji.og"VܞK-,Ob N}[T jk!bBB">r+#uA)IHM(uDŽeN,';E, X[EAC`BX5"ZDXXM(NX/m}f^Z-BͶÌ2#h bI`wK4ʙca{ok"6V?8dw"逜|3>qhuRYDHzL T-HX&I-ZSCZjLD/`(ZvlVha!"֒H"R̟# Meěi&mT&M"lFSuz*(8?P1 A,Nm=AKb"""+i: (PgiӞŸ:IHFO  _GI$HĐ5@ȨK' 4TvR6A#/jm DmHA-AX[Rk!g"lv42ThXqI4 )A)B{Lo>5-Ǖȑs:D'zژ!D*:aEerUl;"".NimEMEG LmuAùNZMu|3t^\pq\Sb.BTE!F\`IɶiQg:Bt6'I=IGؙxT}akDi5/#^OfP(WW!CsN.^D0IF[bZsc1΍vH2,3EErΣ"""gV?6_+DEt@vUDI\PiD "FQKX?ә̾%̓ef~ɾ̶#s- G '%zle:/N:mz ENdI. ,ez 0eOaFDc[m&b)Ĵ?l9uZe(qAsT7EmZ\+DEt@vYDѴb^"""k7 !_GӴgn(hmpϚ"M^Z|Ү xzbRӴsgQ49Q4E95_Lmk{)()șq]!"""i(""r&xm:ِmEMQDDva&h8X[-|66?x4L1סq>1D23hϣ|<9: ǔaz2 ,QX8A;jq91Wm eKF8]0^95`[%D#80,>wqyu}Euq"ӦF!@?!O0wL;Juҧ [O>̱sG)!?)݈:UTDc 9K" \ DMD8]0מ{Q?"$|Tt`X <\HD!2j[G"myCDA0pǮQ˹F$ m~pxO0ʞ"""WV?.""2/`85eh>Ք@dۈ(bBnZH{3JegBDCxa}0I'^} #NQ`b}}=C@s5`'ġMWg@'ؾHCF?+{}sufFDŽb(""rѸ綽w޽mw""rE;jmyNDaQ~ڏ:yj1\k̉(8߈H$ p $qI]"_Kq5AMº#U " ƾ:,Da ,EK6IS]4c[](s.i[8'PD;ΕWs" rIeQDD"v5e)PAdecNDۈ(DlRX6ʼns1' 4?Q5zD)L,SE9."JDԉx@"A]$Jh4]zRϵM`}[]y:=s"ʜsFiZ(""r1BDDΚ" Ne.1*CQ(IAD5'F"JAFA#̉(,#R3FX 4D̉ Q%т.6 b!%¹/K+sٗ|[<!ix4'HM;Z0(""ܷQmlwYQ耼?(8 <"Bh^ꂰ4!AAFDDO 5Q"H`Am$f堽Q(I1S{,lc_7s.ubn 2?']iIb|0=h覣'QDDՏʋv%CZD`mJG|N]_#,6u3jP9h;Ԝ.xӣDP17aED1~/DE}GPMUbADIغ4(""rys]!""EDI PpX \jRͺkEpٗ~" pk= V)GF2 FKQRCd':qDj#3})eNDA\E 8m"","w.¨"7Ӈ3F047I!Cta;뫢\\:"]z׍<]s=֭uQD΃wn%CDDΓ{+,[tatše:)3(G= VA'5C6I!"Ia}>=^"p".4%REmDl(#h"`(6BZgva+Njۣ_ZM(Q<Ag#{!"""""""2Ig- yY(Y""""""""cH!t-1?8BE!"""""""2K#~ТEM4EiȮY""i"""c>< (DDDE4MEDDy4EM4EiE!""(i(""2#E!""(i(""2#{Ȟ>[""i"""cOX""i"""4Ѣ=`iam()Ⱦs4?aQsN5M;\{EMQDDdc>= (d9vvM^7_󡈢i"lD&,wEgGt>W4Ms]`BQ4MSD4MSDy, QD4ME4MEDD9 _>k(hi"""c, QD4ME4MEDD: L*CQ4MSD4MSD1[i"ui"!eEE4EMQDDdOXi"㊦i(""2Ux2 Zi"㊦i("CiWn۳vx4?b^vi:+9\:vE/zHH! ^kО=vO=r?|v'ΗwyKK_~s_=<̃bQ>}7_?&O7:|/)xi }t.WADp.qFoYН>os/=JYGD}{Pִ!DBti[{|mDc?oOی}5YuJDLv`" y/yr \)>D6C ʖkCE"}Aqw.TDrJT̮2FIJ=7} m?|"i>)xj }|:WED^҃0@TY&m$i= -2g(yǢBwү۞{{ϼ$qnw?|qN3ߓr>D$$.1UhX|DZ﷿ KC=J-Qoӊ(;\ˢu(\גso}ūwmm͊(t9Qh#skKidi.Жh)ʒQD4g"Eoڡ ByҮhJ" QcGp \ǡFsNDxKCE7/G\,9?{ZolᜪАm80΋3.QqWdŎy꾖(-"SQuZSs({(+#eojE(\<&BͧBۢHuԞ3"i>)xa eE'WQDC\SzpqGN#Q uĆ8ulW#d?hC$t!~ѷ##%zn!M[Ȑ8|!IYo-}Q;U"͇"4k[%Dܪ9)d] DIp!eh4"i"7iPJ5(8q*xOEj\PeqQ" >|nu:a(}ʊѶ(i("ޤCH_rd_.*(8)#ҝ(Q'y\6'ʲHeN:s!aLDIZGFd{DQzG(;ɹ!FDHgFV˅)gRߚJ5"t?#ҶF繯"6sXYhIQ4MQDIk0~t:vAUQaUtMDt{#RHDDd=%s)?&+8l#R^KdENZDRzMHމ hsZA:OR7Dt!mi"MZGd \u$@*ĜledQ2lwG" GVI*%Q ± PNsuʹvsٕXNL,D8;6MdUhJS,zd5EVE.$fٵUS*H}]NAdSD4MSD&@kIDATؿd^u%)=u!47s Ϥ(q$#%"1 N屎p1S #YN&9N@XLsdHQ8DDNji_" Dzb;(Zu/\{ʳ[]Qi'?U|H62WV,-*-4Ʋߔ?(i("ޤ>t\Cgj" ^wqR' 3"/xی?g 8uY"@jA4l_kyq-$҄HH '&bND!}R|I"ʲQdk#(C=ϕԯrˎ%)ik:GrWe^. a>3RKv!(d%%66vY,ͩOZXi"N@Q4Ms,q\4pDZӾtt´| 4"i%+8vbf8lE/zRt´{ |i<_EMKW4M;qx[1י)Z cE&ȡgR,kH4K6@@.;~} _#{8KJ~#w=;8w.2u )+!}v9q4s`|k>sb;D%׸ld9/LӖcⲉDsNe4oeg'%v3 uʾSc1'Jq:UɒuQD4g+Tvo}ūW0xk^w@VKE y4{o;~ %j,X7V8/Nwutfqصk7^M|_cfei s,a9d΁x\27hB4Gݱt#c܎]V9/[yp9nAV≰>::JC_]<]?sYynu\v MPfmbEM|wRD=l˛/oKDm:D8ymoSaD4*І8n>[D! Lv8ѐs;E6"i>;^)ƍ( a1ќoqx[E:<s{PMS}0sőHP]Gb_RH9c~3r ް~~KKD]DC?kġ(e~ДȂ.PvguDpPӆk%rqUq5)#=PiWD)(~cĢaE&5YSsF퇈޶v(?샾k"TΉ(\GF=eK9(D$qOqkE(BFbveIMYUuSqjBVD4g+Tμa0dY:e-YByB <}pE΃'*$'x$Nw& (_9[^q_݁ā?سm/[I-9(%^q*(eA`Ge`:[e" zUDavD"9XQ}D ~Œ.ph=!!s2$qs}#$ MZ&PS*Xz?QF#eUS^/RD Y6rln>6Z#mh'ǚnܣT(m@E4QEe;W8y>ޤ-{N(<2==(˲*t (W]D9Ib#ƹAD*2*E:Ԕ1*;iED"TwDDbta 1^Fw;^)ȹ(<tC!8<"m{."N;p~rX" N\}}ϛt Xgs" ;^Yw"J^^ yb:]}9px#y'̓!M,KJb|F2un~uAT"=*t%XVB n3gWo%)Q~OLV.UTc=څQw\;F%eYʰ"vx5m~Ku^ƿ}r" <,Ȭ>j(Niپn;:nms&{bw߫4jW" j]5gܻµBG-ˮ-e>YEU׶lc*'*}c˜s϶[,\m3W4ME8veQz ec*hJ Esx!nKOhցad7Jb2ubǛݿ`%|23ek\4jgFi{/xE>K{-{HDA؞~ VJ;giنH{-ȹO9mr~^>c<;ur}Es17ys# :ud$?G`ٗ#S[lv4=" NrV8mʵX qiꉱqDwx>n#QH9bߣnWCqN1\q"zuѪs(Pe'+#BӟkEoOh8OD* 0ǹ,Rp s6ge!}OeQ$Igq}OԬ5R玓ם;Αcs[ROs쟲@}\Rn}..m/DZGEvBBxܧ #uvFҎY  6i.+OkjzU#)!"Ҷ3-DF}IJٺHB$UD!&bC>_񺨗=9Q.ze#qU eu~y{"J.z9_ue.2f3e"FԆPuY&ح"J%30~qsp/}}9Q2f[{eS̹3H6ס=vQh죧Yv%db]Nv ѲtrH8ֲ Թ~e KzF̶s˭y1<4_O{-<\[f灉{čh<\[_>:#`̭svγZuNgrGg6hwq((> y~C@lٯFDI;'^F>'LzP"LA؆W3-c@zMP΅sg7ՉdG8sjdQ&+0Fe>х.֔Q'ƾqؙW]$bНU~_vwӖiqrڽ62,/~ןEG1b6P3?/U̧hkP=*s /TFܜIy)rN*$ 4w<0piԁlK#Ws5[=93S0zg 42ZjN<7z:glBdxIyi/}~>V#okh(~͇CYR'V\G迧 Wùvppk>j (1y@LuG>Fxa{F4op,&+ zZe ^V ¶Qr_[LԹ)oD|WeF(MuJqj}V.,qѪ'\}0$tE&y$P/ݥ).D-QxYE꣆oIbZR:Kyw{_έOF]'$$FԷSDM=f8?~ٜ2F崉}!u(\CRKrm\kԜ*•-+f]BK]##y1& )47,@E4n+TDDI)o!yG<)y_y .o6k.AsnypiqN<(k!83WAPʾmV=\,;NGzgR_DɶUHNyV7c-9}g 6pK/&Wg8n,dxøq(iu3cΉ(Dt0VE0Ʃd=4Ǡoꮯ S7i_C[W@8\MV?Ec㈯QCmSLDAq)Y uZE줌|wM7%Ds,967 mvd!*׿d(p;^)ȩDƒ:Mܙ|*A;< p mZ-xH؁CvI[^s]G_Nr DNduYu"d>>ЂC]HI޷9VD8\{ۉ ]DICM#%z>{:!fF?Bgqz> oز?eDU &}}"ƈ{n1C3W+K+XYRי.Q@ZD[/JD=v+!Qd2فWǠiu*;Q[`sёC?F ɹ&)oq<֫NRӲ=snՑ)-岇eW)칈2ppdq,qJQE>W79LC,i!9ξV\g^*p}qx83&8CQCC tgE C|RAtExq.%|*)\ǃ\*%oNO3ow3vQ#8͑7b:" N Be#o%8=G>0hCQS#%WKeI]7I/dQt#%"ECPW2:" mT'r1F4᳌}%Dp>!Q.8nQI="]U(\e<=.}G&uNyv":Q\Y1.J9e!QV_iu*;oMƃo#&m]ʔ7\9- ϰ[oQZFY> @w:bkn0u6Nɨߧ&r"@(#8c6@R˶:Iy,[a,emF3Lf;n;:.T6EK1|9~Nmk&cµfI9uWˤ^58octmS*[?g˖8,V(s1{sݽ!,Kꋎt TuJ4MSDQ.v*oķIS#ZeӔy[x>:dMDAux^ =v~)'ne_75ꚮ@Im;m뢋(Lӝ.V-q(ê4/:8ߑ`=SDӴQM%V ;afSy[Ix#uùzK17^% ~LJP_-Cehmض>ޣdU6ۈ(#3'u(D[}o{mDa$u(qm喽g*hvpsڹu]+%,~trސ, !䛈(@x=;i=q"K.KSD/#q۹"65u,}Q uru_SΫN#orm55h.ƃ}QD4MLDZqK;_Gw;a?~h:StQ4Ms,q\43Dt4i=Q4Ms,q\4MED'Ls TgUD4ͱqE4E0́t9(v&e~&CcL&wssFeX%e|lslbGe|uS&۳&b ooʚew7h|F۩\I.s$KNNs(L$"ޤH/r }ɑ}u:]vAUQ89Wc e+0#f7^%Lg(Ƃ8_=~=cg/o=.~?y}Qjm*Y='vV"JD@k q}u>/o>61<塈iD("ޤ<"t\o(Y\KD}{Pӆej o 3Cw]b)]=il7X};·e5I_!U# p PqZ9<){ω(q u*8;~}*`DTiW%={[z?v\f"i>)x.@zt̮hJ" i9= (u7o:[e"~(8+IGd{?cTW~/8.G86D$q}>Oh@zXs@[4Ĕe" b 2O" BXԡ.rtkHOʓkþ!`NDIys8nE(5,ֻ!0q}]H-Gj[N{(L$"ޤHe t+h)=(8ա&Zat9 ͈ t41xp!͒BJ{Dao?ǪBC߆7)"l_'%rA,<2Q掵LD'2#?u:ed$t#݋ߤ /RDAjY5rln>CđiC;=G&ZKE4QDIk2v:gF^%%5#jD#Ȃv~ >#U؆t!ӷ2J!f}c>Q4IʂkDN q E(U!]Ӓõ:_% n!&r(%%ze B{Y!1WD4g"Eo! 3{E8](I$w),8UhKsĞE[AhSE!xuiRE ;DdPR>HsԺ@ & %NzmIJ3)[2ij1W?mҜF% oymՖͥ0"(";a*h3xv ݧvQWQDIoHHQă*`8qW͉(Q4&QEPE,Q'*ٞc;@ ):bDWj]do:!j7Ek!&D*l3'J7̵S/(YRD4g"&]Ɓ|KRSz29jQWpG+ ֹIq:ҝ@JMD*69:Il&΅Q+s.X F5Z,ES'ڍ`h^1zꃘh%Ǯy06MRw?d,(L$"ݤyM;6UDA8 z1bhQc%wDXW٩%D>A37 âM,q"R"Z5˪X7hUu`bYfp3).u宩{E[U'HD,[%Uj,6gueeؕ!p툈*˶5G4EE]rԡi->>/-o-$.5\EENxį+ĩȎD9BH"Q2:" )AR]rIA!ZFY$z\ئAQfUYn"pmbJ/j4PR.Zu/\\":$UIDMo#seBrNcC.QD4MEE,+gwY;|¹Q쿗uǴsgD^-V@2m]Jy5;8پn;:.ה7uih048(&⢟諸`µfi9uWˤ^5"Q8oKFF9ꄹ]DΖ-qL*Qߧ9mRQ&GE4Ew, D\Jg'h>rFD](* ۶.„U6ڪ%׍ĠVH~H󡈢i"{#E5ptGgҽW~WEl#0 ^'J<:TE]o" s{mD%u(g}m'-󡈢i"kG4oq">+pމa,쿦W9lkmrm55Dt֖|t>Q4MSD'>iQ"i(ցi(""2i<_Zi"i"4?fQ"i(i(""2K'K3ؿEMQ4MQDDdOLG- QD4ME4MEDDy4^lq"i(i(""2 ;EMQ4MQDDd%- wcGӴò;EE4Eܼo8dOj]WD4MEDDOO', s!!M>1EE4EيۧA'"i(""5N0+""(i(""`(h)<((DDDDDDDD!Ŕ5@@1GDDDDDDDd􈈈)=""""""""kbJ#"""""""􈈈)=""""""""kK SzDDDDDDDDVrDDyҢڑ=8R^kqDDyE!"""""""2)=""""""""kPSz^mq̓Z""""""""\_([""""""""tdO/N[-y>0GDDDDDDDd%o]#"""""""SzDDDDDDDD$)=Z""""""""ܽ8Q>oQ#{fq"bq”ܳ0GDDDDDDDd%􈈈)=""""""""kp”|d.NY""""""""<8Q(DDDDDDDDAg&!VCDDiڮYٖG{- C>ug4MNeӛ#*""ې', W}o<4M;!(i fZCDDQ4MSDSC(h"""2[ɗ- QD4MEDDdkGtCEMQDDDE!""()stC!"!""()tSyE!""())BDDQ4MSD̑EMQDDD7QD4MEDDd5O7/Z""i"ݦi"ia(""r~Ȟn>oݣķڼ={Bʥvvyn?WAo|}/xxy]ᗞ|joʘrٗ:l"i((""r|x嵱~mǏ"0y|| p\.i"ՊF!{?6QIQC?"ʭxՍW|kBȈ/xO_+9D ʯFw7z]Ql{" uX(TDAɵO?{S)`[wM~~<"i>\h/'=*>c'u9gnO9sb (mW>FJh#B嶩ޗ(R~S#]{G+!ϸQ80l#`w_ғTĕGN4i@T&"ʏ;smxO8=s*mcy1C06BMA|zn<}"́63\,(uY&lH#:띈(ZIyɟ箁E6bEkCp#eNDIzbE(9.5YZ~lcwhDaiD(""rq =ö" rOAi9}YO=r ۮ#pT"&ġg?HDR"pt sb DK$M I+x5J?A@XP#+&)ĕ9oG`@<f" 4'Dò9Q9L8"Q>L{(1!}QVg.zi%ľkfSߩsEM4EX^rd_nD+Q$a!g8D,0E?yuF3OėLRw~ w!|jT@j&ls<چ2A}x:a)Q(5*fY]JD;֜¹s q@d~Z'XI)9S oADŵrQri"""{rd_TDa%B;r ) uXRqvD8 զs .$;0D8>(]8$u%>'Bh>(HLK e["P٪H҅Q"S'#/헶R>}(i(""?Ⱦ7#/(-yw2ǜΜ( 9#'3gp㨯+q1:^&]3Jȼ'/mh}QRskM#PbE([sK eE{H"i"/L7,NR|QQ6Qpvq i,c΍ThQQ'~s9GEU"J҇NFq'%Ǚdt}QrDPj %%*A*:㻋QRs+lkg>jF(i(""_|~!}HEeS%S'N']s±sLDYLH *%+ E "$+D4 U*ؐDdCT@Pvk" 4ۊ(rzmL|/]|-qLԔ V]Dal8|6Z~{LӸva)&/Q7(i(""Ȟ않(((9T/s̽GX`~]%FVQ1.Xy;XJvQ&A]GDA4A$A8!FTp|ι"Cg,UdڕBY*MDΕҿiS\/p]luIJ'd_2e98z!v1v=WǶuEČƴIJ#" ?.gy-D0v+(\jB "Pd]8)0gf!$u(D6z,D:smDmcDAIxi"ȈOO7QQ.!R>KC@@I +(XVHW#]gkV9UyN')THtzي(98hvEưӾtDstzfq>i"iEawOߞUHCӠđ؇lEMOW4M;1xb.,0EKDǧAsGvm_Y>9"*<~KNeOPeUuzXy~{9JS}(gʢ.},(EMQFDȾ2 lڇleen/8]Ok89VVyeYU=sVC^܈QD5~mw:XS+\]2FY3)i8KJDם2^gY'vq-ǨK|׫kG>~\|F"j?<c.JH7|ӧ4\E4n+E卋Qrp[Ŷ888` }" /q\PpYҖ"'(E:l0D[_%nqSw}|OX}?z>q,8qIDmQ~8i,L}XD-R7l+Y(76Ǡ6uQ.Ry(eA9_*F(Ŕ u2Ա"i:܎W֩rl'}ZʡQ_0J͉!^+ >dG-K 6QHsD(D^w~?7'ࠏ^h oUԛUߏz]P\{OID֪>Je}nU:3JA.&ͺxS?[DA;KW}rފ(p;^)@HY[٤2h3HxDE7#q=ÿ8tqRBy~Dx Rzʃ2*;ʛ:/oHDxz΁I6D\zD=["g̢<=eۂ"i:܎W֩}QH258'Ug= 1N2%lط " rO2]"y@S<É㙨M1{H{!G3sNDqPw8qD{J8GUhAOҹА#!&+,rM5ehe~lNZn8wkM$&eSδqR('k&FDI9U,Q/Z嶓j+hx""ry(SF98~m0q"(KuyE"5'Q KDdFN#C|0KO}ؒp>A7is%)LDd6 ms6uRD.Re:Ϝ¹R2_ מMj b!$\DO#$oMSH%׶Fk$WDɹ0jWD4M:)쫈@BA_''mppJpq|LD+DQ D@#Geo(:a,GrcD4oT?8N: "¤6ѥX$uYD."@"q<"zzƲH Q! % ז )5x1}e(WDgsɤGlJmu/b#vaIE4n+TDrK>rd/7Ks85Z0DtQ!G,'>^7O\q"JN$,)Qz0/.ZDɒs+lq~Cq}.wۮƣi"~qˑ}~or&"J:7N \VsA0!:.U|-qq"seb:ORHֲkuEhKΉ(zDDԖ616+դmV)~ÌTW^yռ]D곭1ǨV'5(MMq3HDV]u>?ɤjEeƵ 0E+|цhKE*J{+3i9zWDٌkx4~u+RE,sy8C8w1{ĕ*1JDOvvD{GvY(9ԲKܛ|!Ȯ+DԨ s" u%euDD mFTp]]"<7Kj]dBLH(Ue"D 6\'M,xR˃v>6]DY>ȒFʊ향h'lqĕ99?ٸiEEiJD^vUqϭ yن{+),cA+SnM8_?Q1bGLm7}Ms'ioGi쁈Pp|֮ʹpo$j V,BF("VMTvR{tћ$cy桢G@pn{A" L]D9]DA\PQotm 5orm)G"ȹFEtZDqnuϛ;DUsѨ >zf㊦)h;2^=sd٫Q:cR3NEDt/CˮvEk8>A#anJEiL,DY+GR :E++߃p`pZG/im GzXV巈|QS-μF/M\j~.(+=_ùQU0fъW|^*Ͻ8ZD#+E[?9KODz{>8e{~㷤@'w!^sD=}ӹQDD)t=5=p?zd8w4ė#c,gc=k\K찺y<P؈y39*$.oI?Ljeޚgŵ>˜sI3~yz|ݼ#nVDAm,ZjQ_~h?~K?韴1 m5 B 湓_KI/u;M;\ORzQDDv7;죋U|VOo|"J]uG g}:;y & g:N *T=ɔxX"lw*O_ҸrQFPp8?T;H=%ZHΧim2v>9#y'C=ɵpMse@\{GSK__7erZ-Ҷ.зi7xBL<>2{[}Nq3i&ׯXn2#;'굓€=;0Շo5q ~NJhzM"7R g]k !qp6!ԯDQܫ!["rܞUGF-k,tm1ƣ'' Vfޔϯ;^KvR(5GXerDk;Ooy6QxqĵٲJ{_EXuDa9n5/Qb>Jt_W UDQDL" dɿMs<ّrFb aFxH*I#/ݩFDAɤ#Tj6Gs=k)>GüEEz-"Lj8EcQl8gD:UI9dr [[ɵmƫVOKHD-[eo[>3ow%п{ f" (""(,<:9z ʮ!o9Jp}uN윓wslpz"+'iBTo=NiEFR\'97Ď:f%f]&EDߚ~ R 2q/I7Ia_DԲ垒^l'ZDN' s4'Jyzfl'*/ۈ(Geq^'sBDA$}NH"">(YL]C&(#|L(ごƓ. p IDם2!9qdMd?-uSh<<ژ42a!זske]!";u͵SXwg6h_QG;=)>MiD(±\C済,Y2)=ن3 `\cB瑥V JQ2VO9=s /ʊ>MPD,Ϝ7rӲqZ=e\1Ua%3JXC8jѶhR2lIJSПsFDA&MME΅k`EDeIu!)T+(Jq8Gox`]&A܈<,y0 h$$859;Y5rd[7Q(MA;?U12ܪ`ɯL3s c2ў?+*чmķڅaWk=Fw]?bZm'+9n#T$:" ,>NRKoӤ)C!GrU47U۬CҲ o*t]J3ivsas7a< ͉1sfy]ʾ ]]e6G"J GdײHm*,e"ʪk|FqYtyY& $).ځ"Lc [5oN٦}={tCZ\}g #!y~6H')<O؆YO9>:"=dƉI]YԷ8dm&W(o=>L׷Z8fM%oEDx$ߠ)S'YDDΫS90RzO]긶· ·6X-q~ a%Ҷ3+)5>?q=<%oBg//oPrmY6ެַμ5)17m]l D!fRϑ8uFk1N:e:Yf/ʲχi"u*"2''q"v,՘ 8888t88iqb~jv'7';N©ʹoYDA)=ZDd&*|@g2>Iٜq<@>QNz3g+D/.˗4%Ӿ8]ZϬ֐ ժЀ6OmKwmGc?W(i+$gٜ(I1 5-e>uQDNHõQViM6"JʩLi'=:zbihQD4MJED䊉(KGw2 ُ7xWR]~Zs ۮ8" Sz0Q3ʴ}Qc^ш8/+1t'/}9v%\·MD꒿{ 0x e0#|lSaĆ*m룽"I w3'd# מMyq뜈smC+D^(KM\\/\SɟGRD4M[:QDYyH:u=߈}*đ"uňcYrZkE8q# HD7Du c8UNAYW2KU!/k':Fa_I "ʲ".^LUv(Rh, D{!j;ƫN$W=K% ז )b&*.JDx6W|Oٲy%hſ~J(p;^Y""(K --Dd MEP3 ۏSv.wh" e-"t%AuQ֙;s"Jw3~DMDD\m7ШdޓWRDkS8lWW8K%uֹ6@-K(C)pcnI4ΪIk)%jL̼leEMtSEYᄈf6Q#(f.Mym4oڳ:NNu.p8GEIc" Q9IgѬ+$2bHα#fB:1D4YOV}w.Hm(y(#p=O瘔~>G˨%/RD:B϶(G޴O suiu*")}uNY%dк.V'{$dG]S8%R.u*dx2q Q8֢A3',jN2̫D6A;H $+D4 چ* d"cf`"@@ kCxXUzAY5ƺ"JǨF ׃ѰqM~G" eSSrϑuD9;h=c{ӸvaE?U0JY5׎Q4MvNEDQ6Q2$g"uD8ARqÜt΃7ŋ4z[:il6C 6XbIirB,G8f$Rz G L1:j0-)FI%k0%z"Do.swsw??x‹szZ+eM$,ۏMҎК(5ܛ]D)S#cr,3QjZ>iZׯb5MC6Zu#k[͸!(q;O-rݨj*2s\chȾ﫬_3_帲L53G}u3&*I;8tY#sj*~lRDͰʴj;5#4+(ᩁZӨ[4mw>e8bd4|7՝'ii0yd_Ҹ:jU%Ғcs֟DM#ݯ+B?VJ Ͷ S=d$ǔmtعF>$$&&[Ү#{$n0ue&z%]`2,Mm[ߏM+Jyhɕ}-k&J2%Va|w{꾋yl QG\&M{l& ipWL8E&~*o1'Sp9 zXtHRoxX{SM1]s_cpTW%U":&J+Yt0J|& Jv~'u>ᙇp2QNF5hXKV@Ut&J8h3cδ&J2F:~~(EecKVJXd췹]]OBD'6]ffZM"8fFqj (vеOeE(^1>Hrc+%g?gIX MBD'*]l& 1Q"2~*L"O"bDa8D≸BDbLz2IA0i_Gr1JSfߤr.i񝈘(0QT־P5~6>3cM1&ߵLWfɠ@Ʒ~۷yJSS?,7ySU͵i 7=;Ol?s}}YC*T,LQ}e?wD!"u"(* `Mfr)ne:|̈|GuHFI2QbhQfe^Dɵz''~g~(^[f6r s;?>)4Qþ2&L$& DQa8% o&MJ4eo?O#=&J5c|7}͙1iO}gVR(em̢iܵoLܭk,LtYvlMқ(O_6esg}>h%&;aŀ)k2QHJ15QХ\2Q`vV:&ʟ?Q}x'v-G>?)J~x>oٟdH{KedQHcO?Ym%[& ,g򮌒g]͸.ˌ8C}q&Jյ&RKƔcȱԱ,Zo~>:Q KLoY_,;,ٜseߦgMZq;o0|~r8~& DQa8$%Dߥ'4“iқ(i] Ͽ|y{_x嵕LjPVBY_L4_n>>g2`h 4ԫ_ݔX1O;w-#de,S?cq1R}  mḵir^똙(DND@%(i]z*aDyu ]mc44'^5bbΙ(YKVLC{L2ڌM(h-w2sS ԉ(dcv,!N(1Xsm8xDNd2x1NbhdtMښ5kLkF-pڕry$ |^ɾiD)jߜku^c^4&ʢ5.D)llCSZ4nLo[Z5MD!"u"& *DQ]zRJo$b)N#U>OUDs&JHQ1xԹ]D~{2CS;jܓ)9_^;4+[e(]j=1U,i5~N[9U1j\ZDyȵu:l%lM=t3( Z[c յ1U׷.QՎD!"u"(tLL4vL6Fn,4;n4(]jdclcTJlZc4է>ukuoXRǟ~l\G=kd DkQ0Qrdfk&J˵9r_s& 1QP>&J ~n: aɤX4n5W5QqDSL XDM72ҘYv4ȱ[FkdܔdVw5>J. eb<1eB{5Q4䳍(3#R;eܴ]j5̔ZvlYG;OϦߞZ_ wڄʘJi )CDDL>d!6VNu v0D\׬=5&JDis3 ;4Ӯb4IL1S]&Ǜϳon=ɶfܐ-1W`iݔeuL לjjޘ+9,S) ,3GYץ٦7VO.[mfI̝,.i%kf1Q03҅ɛKK]}| ^ڶݯ2SLL~AmD d{j>I)iRCLo1m2nŐud}"Z )%3eמϵ8 7M-JvJ{L&Lpz!l}=}3lѦL~&k & 1Q8Fʳ4G5v18pU# .dlz^D1vc: Ze`U21bt}Q]4@(DD8d[Ԁj)e;YK&MtqP,R >[]bL|DN[20j`: ~NY(L""& `nfƒuM>I&IJ,zD!"& 4VL(7o[V\o64_ۧ}Qqfܻ7_if_YxmΏ{xΏkx|w*.Bk<46?$Zǹ;Sa~܎4_+wo7='5vQ19qno.[:^쎯5j6w)}8.;rÍ݋6\foFRҜ1I`ѬX43 7,߾|~Ffپ?c2͗8CK{h>%؟GcX->\miܣNJ5c|2z{܌u~v41,߶&5>ۙ!m&IfydfBSÍТl~w/4խ6Cx\ǺprΌm v<_\9l{9Nq9f}|eQ5.um=3$Y4Gp[_vwo3*st3ūz3lnTHy?I9ra>x]7x;N|NQtZ#F%Fhj\ə%FH;8=w+ .}k=mn籉߼4cD|mX@yݽw!2׍a@mFѕݶ}nIw.'^njryjjkKapc7[G(o 5hgn(u[C~|yޙ8ۻ=;,ڸhP6YW'=Wv?zh✴{y[-$N,sqXʓz}͉߶¯ X*6.wcskc?Un=^pOM|ampyhsk2$C zOͪldg}_4ʙHJ݇|vmKqGO1jPv,9v8]ͧw*%빻l'c 9ÒXzEE pigI|jLj6#p}L0/u ߝ뾻|3vwvp ʿOwNf;8?L; M~Vv+̗vfԎs`suujg}DO.XW_v+to> h?3[!05-06s 8W'fs/n-1vgb|;̹ummRtDi@jTyX :,/ip y}fu*?;N<5}aẑJw|t߳yon]ͧ5zw=-װԔ^vwaj͙cJn9NwfEqTb$K!fȣT,26ӭnS8pyfO6}u^9+ߵ]lv}ɱ: 9zm<9wf9?LO\7ӊ84i Ɩb,pig N; 8fJ SC qa2l>g2oMמg[ܨ[ y:qۖ>;\`!o-]Mߧ?<}g ;f+Ng{=t_]3wuۈ rDٿ geoX1%6^$:>/n鑙߷drrf,G?QcQ0Q`zw 5`2=gǿϏ_m289\ćw/Z杙Jҳ /҂AL9`bÎIr63>N{sWKn2}Y:~Rn}.!6e>L5&Fq=pgg}TJoIp28&wVh <-z[(4eJg<<6Q|[t)4}ym~&Ƭg'}ufv(m9|yT*\O>?{ϰU Íoz'Fզ2H9& M쟋_y}r&R'DcǙ&v:ah,k<;ܘ1R?G泧f}_d-M]]=ֱ~Pu΄kIDATἲrϨrM(q =X_ܛÎsrv,lךǹn:0ߗ. L]pɉg9ʼ2o6a>pD.pjLٲIe܋RY(oO;GDvhWjAz\=j_vg}T%}+.'nDZS~xU7kg4m+(s27Ą)=7̹W4QiN73-RLFClyv!Rc W0QO3Q0c{ڝMܾ.-cYw{8%<=w,ιx^cŗ!}άa2\qM2w/0Qo>;3>& Y{NM|e؝D9&Ӎ hӐ2Qnm*EazE@iNehOc\Vl`n˾|a ]D|i ;Ʌ5Lv9e7m4YtCL`߹+iVv 0\,Rsb8\j^4ʓazvȫ''Dyko xrqVl(g`>0=ű,;EʢLw3Q(/_2QpdM/4 DVRߞU9~cf9& zp}\5LK*+NƎv6f1L.8-{DݳSc$ ccnݞ81Qݠn;o_*2QpdMwa>@[rUwS1bAM0xpDW?hfw7vXDy%8&0\&;_?/6(aL^x1#6a>]mT-fex78^K|y"!e.ys؝5}KSxFl3k(_S/j5Q_f(( l C+_eT <v+ɕVS\DyS(Ow3s~S'gLn'꙯]Ly1cfg雷[3YN˾ "¨׎B6|xDIY}/cy1j^kh^?Ք)aTJtT}GnY/yf|P>CȻ]qvLw qy3S^*U|y\q)P<~YN{,徉Bk&Tm `,.ϥNuWқÍ3錑VoM<Ӳgp1#sW8F;e@ w _U{y/ovԾP hx+7JWVnq , yvXoNx84: 7xn;[&,sk{S}ƒ;F%Iή?/clyEEqߒ}mSHs>./泘ώXo);ܶ&mL87?;Q/:aX +LDI%\W. 5o'& d~ ODtluBD薮}k`+Dt8<>q/JDL~qQ\!"q;?w[}":fJ㨚( 8(*jD s;D s;D s;DD!"q4vBDDL"b1Q4."b& i\+D$hi\+D$p0>iZk9& Dׇ`hi\+D$pٮd?pGڭ{?Ua!ҸWH8(*ه^ap q9(* X!8Eu +(D$DQa`J6(DDLT(DDWJ64."bD!"B\!"q& @$VD$DQap 9(* 1QHD!"& l& 1Q(d3QHB\!"& *L"+":q¸n:Xݯ9*L"b+Dt|ܣ_Hl& 1Q":>qn;^=pۡѽA]`?+w퓟x>kM|_+[?>?/k돲]Y|L"b+DtLLʳ N~o?|{O͵63}3m,~ Hsm~oz3QBDDqMk?ʜ~Lϓ1sD!"Qq(DCyh=>~Ƿm}ʯo&JO8CȟQJk(:sڏ]z3TD"bV%;FL,{7QSc<#[~߷~mT,Y_>3Q~?XD!"Qq(DC{h"Oɸ)mfJ1;]\wU1QHET\!"& 1QX(*IJi Fe;N$SD!"Qq(Do{n6LT+fى{& +DD!& xS?8+#(M,L"RWBL8&/mݵjk ?D`Ly뿶}n2;22_zlJ>կ/^{/GX=1rޢ|s7\5iD_wCI15JY(ba4R疏*>1US1;qdQ䳌rLK=eivih *`ْ\ {3Q^ݛ4QRSosp:w9D' hf5)ߵʵJ%sR/~P&UD-м7GjYj <KYG{5QjZ'OjfŪk?3mVY2:bicDғ냋sm-DYܶc.3PD#nF"eY(^҅M(QުMH?#箦vl}6D[z,Tce1vgrYRˠ0yXg[SH*sid͢osgL|jXϔ%&1Q>2&J̳9skݟ5;X'Dx\M>:e-cXWuMO~v\{]j{$ϗ.S宍<^xbb9,%>>\}smW0TrM]E&ʢmfHog; ˾_(٧ćW,Ǖkem4ZtGDi{+Ƙ˱ļו{圇:'DX\M2骋ȦL<Dz2Xl:&JNOrTZ*+ kpU%9Ts caST4HUZV*&m' mҚߤW7:7ee[9g&5ZdҞsRFM9:T̠3n((SG[̾inTdXJH7Qʔ++O ޖrE&Jm7qs]%(zլ,x4ϭћz1ߚi$vm<ūV*+ǫ<r/Ngy*e@&CuuK^2w3HUs39yZ͹ٟW^TdgŋdǦ\ΑeٟEH/(=[zrKlks2T7xs]%Oþ*<9US2Ql)}%9Uo*Km븙(QLu[E' soD9*Z+z˦kv-{`.5W1QuL2WRVC$Dm2+7珊Fqս}$^ލI85+Eɐi ޫzlZC-3U~࿖.m˕ټΘ(LK[z!ޖK%{-ɪmq6-(m唉*<\;nH/2Цw$ce ۚ(Sc~T%aRL%VE9G/;T~iqQV5QjXTfUe$͸U{DYea}4 (UT_on8qd5q(4{tSy*fDIPUӝau=əxz&Je$]Y8{WG>)yv O~._/aon٨2 ~_R2~D#tvŷJ5;7l90ֱNkD ʘ(SԮb$!-f1;XDg|i'fafe_j41RV5QЪ{՘0I3Q2&J[7iŀ:B&A,BͶ&Mհ 쿾V!3zj_ uLcL'{WyF>ثnPuǭW=g~2羟ZoL8zd O'+=TDk:M'oAbj M2 ڷJmJ:Sӝ'ak#!smkwh0G2eqX6 IߤR12]_ƺ1&IbԬe\DI4Z2,ZwLl;ֽ}&dq֦?XA}!e,*k{1Qr?MMrЎD#[z{=# P*pyb FLTShg'iMT()caUeS&J;&H R`eQ2$Ib\6N믑7e$%ٚ4uoXj"sVY2QV940| ,,4}_n[\LĕyϔHҥ2fjMWsj`6d=ܣfK v-^MXԘ(IA{N=^LzIfV(s勉aw_ӯ=T>˞MMnMz6#"aaU%JetjR1#ѧ_[H%0FtLTӰȶj:z;M{~JU)vԚyS&J͚A#0O?ZM(4SoַlMep0E|?BSU&Vt-KS'VM]>ߦꪘrX%6fEŪEAd2\ڮ(2Tj\rӢS8VLRHLى2Q*S5uY>YUC7~^L7G,'*H?e7 (p;tשtKkfds%~&ma(x~ۯZV4v,᜚/_*}Yn+RX1# Kedj'3REǞߴovkiO3M]fd}LS&*VOo\뛺R\4.ͪǗ _F䫍Qsq,( -'V݊!158ROuXHmIt(yS?m2mꜷq/yCiݙh(fɴKJ&R:Sw蟳yYMSN"$݌Qڏ_zHo6i(0ͣw2emJ%' < Ҙ$TN{NC(oӨCe7ﳾ7 ǶіfY&o7pd!VT8(GIyR}P;m>)"O|Zf,r65&j|/K׸`Ru&'kpE^pOB3Q` όAa?jTh#:QʼHN mPڭK_YO*;YfhtkV3Q0R2}˾dM?MWT+}7;TQ*tUR}cdTmMEo74TUD(t8n: F gͼT!&k LJtyy pWW> #ׁHWH`7G%BDL""& zwKwd3Q\"B\!"q;TU\"B\!"qi+** X!84xnWVap q9n-]@d0DbBD|^UVap q9{K;ʞUVap q9ys|D!"& sLdAsԦ44'-"b8D1K~Ҵ!"& sLPY(l6;D sLyҩƅBDӜgt@cHB\!"qi PCq!8BPCq!8Rd@cHB\!"q%\d@cHB\!"q9BƅBD o|[hi\+D$0ͫC9;D sLs>[:tf;/=pGDW917>" sLsۖv2Qt:ϳDtlBD<=8 ilaD&j@S0[Îo( ;׆n=aDyʩa@`ؙ|n1QTL̓n`' `;&N45\vL i҇δƷ;q/JDL~qQ\!"qpRu%vc_{뿽ODLi`UE\!̓N4vBDDLs˖;!"& 0MeT@c(DDL4g ;DD!"brq& 1Q(B(DDL T;DD!"biP;!"& 8l.N?,eh;D s)ѱpӇGHeKBQf轭Cq!8B\vAӡ{?!>- E=ƅBDpZd؂-' E=@$V+D$d$ 2QBDD4HP]̝Θ=2D!"& &Au}{ATf(DD!"bd$N__vE2D!"& &A̖:ף2D!"&  #Au}zCTf(DD!"bd$NsnKoag`Y(L"b1Q 2T'xcܟIeBDL׈( \-ݢH*L"bFDD4HP[zoܗ 2D!"&BDL@i.񪢨2Q" #Au'}xwKw(,( 1Q 2Toag&b2QHB\!"& AF: "?*L"ҸWh:_VY& i\+Dt,܅qt_sNWqo)Pf(DDWxŹGuM3J4>)L"b+Dt,vz'C{?h_y\o7?K/_.ß:m~|G_ڏ]zw׾}v] ZrA;2{?rw[/v_{kɟ}˯>Ͼ׾v{T,a5"oW]dK.گΜvKC,࣋G]};}gm[~߷n7yڟ?|L;Q̦f\]v՗1.R.6u_Lf{?~#C$fƟ_瘝;Th>ԃBDL""&k#?n_2/.A(iG~_>{?{/}+6+Rn^U̖91~(ep~>m63BD* 1Qrbd?S-y\nDۙ"}oM},자,g?,/ڮ=~l+w5ʛd̦l̲);FboS&JWL|q?2DJWe:Ĝ3Q֚oY2b(D"*('A2vA5~~Oo[M,#VPGRğ|[^f*4k!ZD)2٘(D"*(L񖿧TIȂ,,4!㱤M~e*{̖>73&iSlM2dTy3QRf~?L"RWBLSkd|IV!2lFbz,]zio XL}/q}sbuL.q钓L7e@I6K;J1QHET\!"& 1QNV @_t 8(2o9x Ygʘ("m3}dY. Cc[eKlq]_v414Q201Ui@!~qRLO~ⶁ2WO6fe1Jc*uZ`'E1r@9oQshU9u-gNg}i>9>S}WA& X~O6:|TѭrN(8(gjS?81,~({kn_S tL&&8c[4-y kTҸJwT&ddԹ\<ݼԩQ2PbдJwNA [Z]:`cmrkvdsc ђSmrVfe2YwayLK=cOsc9UYjYwAYjh٩{.H_R9ߤMzԕ"FP^>.c˿f&1lfI}{)kW3© 7bT6Y,wsĄ{%6#.$<+-ݯ2Nas[&ӨNfIoN%.etTbT7Qbzf{sj0Q̪Y6faް}b^*9i >FZQ{.bA_&J{]TLk!VAw.e7zLv>c'P*!܈/<3Qr<:97S7QbrWkR s~=& g׼͘(}&Wۭ|]%Mlz^&ͺ&J/5#^>] nzRƗzƹ6^?+*{W.+̙(u.˞}g.Uc7ُeN.3QO 3Q4T}cG{x]1&fܓ'tΙ(O/>,W#fvw?>g%KOM^qq-єi2%iy+7R HM$lT@ɗ$+)>oKS1mE)t;j׶AQ]j_uSsu @NQ5}&J=}[RKs4f*U-FTybDimV 7Q6Wh}̎*2Qb6g=QXعl:&JTkle5ܨ>,%J|Di3Z*$u{]M9*S7h^ ϨrR2Vukh܎_3,uċ{T7zNYgXK۱zs4{3x&M8NJnM s‚[/[ږ߉X?`N.2H5VMUr7bC{9i7XD mQ2Ub^As&J2:򐯱T[e7yЏ+pH*ٟZ_ĩw#T%" Qej[7K b\7LŪu E&J䜴J*f9uk*U0ϛ9W kΕÜ枯yVOu)~tV>ƊMĕVc/qMv՘5._qm^dv#5Q*$UW ũ}n4k67S>:l%ρeq6VW*+ǫ<7s/ygdξL=ۛ(e5[[KOF<ʠIfk> z6Kl?ϳ_혜*^ĐI6ۮy^f*Y2mVK qDatL꽝 \D.=y(tWC} SΘuWG)FFU$!07YeL\"mw4(*U }H!P29'[ު"(9'mcٚF9Uy5(ϐ<,%JϦ j2rTV\M9K)ZV\vUk(b()\U)SƓ}c9?ipE%۞IG"UTn [%,{UzM}h Ͷ=zTziվ.S/=2͌?Da8]q;=f( ԗٕk/W&ߙ( y^LiLVJw 򶤭XH^v7AUcdcd+5Qz۞~{2ejgn4ܜT<*8+Oג4Qa(W#%:'5hy[1Zdo(L|e>!(9teIv۞ ?)W)Q]1hMuImcԸ 5nɪ&*HSc)4ZwL֘}sWV0NrVVUe.VR _H{/1zf>ߧ2|LuLWRySw3Q(t4Hf8{[̞]pfDi§JTC hLE$*5p.Ho,3QjPKL?}퀂ɎiT颹Rot4ۥɺkFQ5Q2&J[uޢ1N+())s}M(aW q.1yu[j(nDq[s](D?o6^.|jlU'J7sxڧDhjeoDIVnE L 2:A- 0ư|F(Dk:tIH7{%󼱘2ob`/aUeQwWfW5QߏR76is"ooL?^@3:(yr-*FX̝ɓ}5M|W}Ç՝gjM :#Em`eqXhS&Jz樘X05eyc-1w*?uL<>TtI\ro6b㥵w m%ﻙ(UbNe9U2Qrl96eAvqR*)l<M yXgeL=I0QX°%oPMcR[?}z2J*]uUeS&J;NJ*1}̒e&J>9ּMMoK2Rg^&gjM}~euL+f Lfhճ??u)ϓv˨͝jحrl,ӮGqWoJ}Ooq3QksA^]=ЗVmY~+}<1-,fESaIfHğs;wŪ4s\e۱(R3V2?5(2;񧿗г__< DkŹ}WUiI5|_H,u64t2g/&J fV=(sږ)_10Q4NRu0&/4)1USpouե)RsfKDU~W5Q";U I巺̤P C3{*&J*)Os&Rƈ^{f ڔs\rٿuMq\Ʃn>wiHbհS3ueO=j5TkkrV/<έb 8')mWоR-Sӡj/&JL9b]S7w?Uso̩ZD ;v 4Θ<T88J<%A[O;}-2DyQ4ĖwMk甇zSSfp*Y>l>rv1\cLucɛZoEyjמlojE۬A;e<`؛(U[tluH9uT&>r}QTseNńb۲Pc$dziŪEjObI(M|VeF~?#ꜷq/9_1vW9tM/(z+/kү+K^^dNۛgSsoN+7r~~?5^cgY*lJcNpK8oyo]X%@yLe0ClOL?~g +o|eE}=+ %=1e7hTSToR Uf*2ỳTYOMYL%,e('=VxL›VNW7zMu1O=/܎x{n {Q^jǫ˺ܬRb̴L:zʽT]#7<{xJLBYJjUT1QbTw¬R+'10eNU9TӀ9J][L֑tJC*%c[4ަt*L8'x~ؙ"9̌>э$e6e4ӬcIO(,&7eYo֓xߴ)qZ&vj+HjgKar]6]^{ 8ύ܏Ѧys21*ψ׀P(D9&͆,4 qSGLe `W%XŚN-~l7SNEvjߎonDTSkKW>xؖ5h?FG;fn2Uy5X;HkL-#'eRnK1Hs<֕tRbdq(ursϷs]hTD5Jp8T&uf_#&k#m-Z^m.ӡL>5Zћe{o>{]k}w'e3;cxXh;mZs'}=6+c\xB&}D1;;7rlefRZ/mYW2wͬޫ ddGwϿ)GjD!"& 5Κ(`jSe71Q2/I?)`Hǖ^el:2C2LG>jͤDYK֗1RVvD3|e}$#e5OJz3n: e+euy(DD!"bY%d}eNI\fyASǖsd@̍ !A~O2HLe7'ʑysv&J]2?b6dL[%Y_mYOl^̑& es(1QBDDqM(WIO*)8Iwu61QbČ򴼆Աy?Y+1XޝϥX>Ws=T;[`0TnW:2L"b1Q\SD1Nґ $vRjXM:r$WC"fۼW.ǖג#Fib'%O9S<>w;3Th6S3w&eז}YFt}2aŐ[TM*ǵ:O vy=qVidV(2rٖ*9SbHL"b1Q2߮t^WAr )8~l;_s\f}O,&Y$x WB(Yܣ⠓W gߜ$i1Rt;z2}U:3_y,vB]AP;>2[%J6IXbl33( 8?tTK$THg,vXI* bl, n̽MWoMWͯ2K_L"b+Dtt .^__fEPeE\!"g:d$Nsiq0?2D!" q( \1<*L"ҹW萑:O12D!"&BDL@yj~o/t2Q"!#AukF%yQeE\!"& CFTs2Q^V`TST̓a< +#.`LJr٩'K>yV& ynV&JG1!|sX)9|bX(t*0Wr0DyʩDɒ;=L y_aet԰2Q>Ts۰2Q^Y`S02Q~ͩڅ^VF-Nу?rl/,es<_7vsBDLqΉ"^(ܸwƀ.5cJdO|_yKo.[`?7oß;b|ϻu翱|?WED!"& 5涅^OJ#̉OD񿾙 <'?~/L"WBL oMnd?x>(/˿_kD˯,3F?__ǔ;5|t{wp1QHCT\!"& 1Q\`V$}ukΪ'FEm&Go?Y o*'̏~~e>rU^s_?h3.2O2r|Ey/?bhWDŽY1Ndn~RH*6U L㉑S۷qMymse8rXNL[=f |&J:~ {Lzot^߷`c.鴞;tbٹ((Q1LkFw|I6(xhqo1eu6&6OB}m{*~P:Q1m}~}W] {cIg56Q/4hw)Ae̙(}|9gS7Qr2)s{= 7qu߁o_wпD9Bۙ(5O:re*嵘(e&lk$3?3o+w MzLI9̒q #ūڲRTgNe(͔kOSǻDj>T75'wϣa>S&籃&tC26Q$$2KFw~(a&J&J2bz.ǐ4Z3%ǖdEe[Ѧհ[]M ]Mqߤd;Fayҩyk܉cŕߛߟmѽ2S4Qr>sͭVCJitPQw+&Ju8TDIIroFy6FmM'1͆+sCkIy~Y(QLxTLVmP*^nuL9R>q\mymNjx\>?J:}hB{ NP0mL27'bU1r:}oUOLGgiXgFӱŹMo4*K*$XdD[yrHR~<(&k5Z*rik2kċĂvJbJ쮩մb"6|+gLSdI*|m[%n.2N#s!pTOXw6e+dm~XM p4T#L|njv>s&1NC#dBԹȿR{D9;s^ÃhiF(iqmzNRWl0JC~c<eWU\&ML i=0](6&JMyŪĎcnڛ#ule*zsY(흌sc{7eo*1E"6YHvM~޷>+4&I^ĂzHӚ&*Y6sn& ?shd¯]DٱьT/L4~+ӜG1QAiĦBMca]d0/հZ}4TOGʌ5}Rۛ(I6iDõM,Ø&vjPGE5(|gdۮڰ26-8Sy}rp4D9s3>5̧Sv&ʶb' SKx= Oksw&JhZ &JHg6'o_iJ*;mT(aCLz%sp2QڇGGYL]6Q:8G}e\Cz҈ 7QpWi265Q2 !jm:6&JVzlۡmIb@JG;1uOz4%צ1HS ܉yʝkVO:AoMc.$yL RWdОV۸Mc+IJus{\&JoLtI}N-h1]Ƹ_,:<(?sCve8O;b@k Ps퇔U֎bNyRuq(]1) D9(Dyxñ(ғFa:Ik X3J2>w&ϭ3Q'id6dRONii&)C j:0N,㬹ZjbټQ Q2EjݟƭIQ]mrD=TsKV͔u\5=O2{('Wh;%v^mЂۼ6ujų|_bFif%`ML˱&$~94s\fk͗sqк!Ǜ֙؉?yama_77-{;xUFz;l-irjj/DISgmjglj̕v%-Ҿ'wf弚('vʸRĮ}:x5~75Qi?T#{c$dhVoDI]"04(m)H/FD S+UG#۴fP\&Jq3?َyk5wJ (cl}GolZyz>tS161i2E|ߡ%ЙM&lSohI!r"MŠUNMbYwe~cXg} se8,&qrbV*}Crm&(ӯo?侯:?ǀD513SFSo+wmbs|sCߜԖi& hd3Qf/SZ&/O-׍mR͑':Ss4 ms 7^3( ؤbM c~d6~yDm9syM-SX 9e.Ԥ1IJ9cfjDc\M_iLCSuSDm簹R&v0kɜL.e=)q>zjxOŪԖSCbg>}37پsޞ:'z%j펉RbK+K^ 2rg0erUVf~sSǗ}Ls9|Wl;)>NJ`Ow=Z#8i\:OmRB:K+T0y]b:m'gM~;̱r<9M bpyg?)i$W6q~O6gMV9nY?!q+e.J]Թ`)Mu6JOViMc*}Y$Ͱ}S`{JAXS#1CiwŘID2t_/s2V6t9>ZĹҠ?z램r;?6V9jƓHh& ]-pTꎩKS+}jDqM[(1CX ~!|ۧLekS鈵&J:6ɀIjtS:sGm81Q6:yOa:ʚ]3;NJkYMLv)NyQ .D=/(p&0tbTIo3&h&WIP mǰ&'tMcHJ3QBDDqMG2Q9bddD5ԧ7Q?[_ɤ&5|W0yBcLL}:ԄBDL""&k 8%J?&[FEmL̝IIR&JsrYaL& 1Q(D33QbZ~Rd bfN5pd$&Iv >-D!"& 5%+d٘&:ä,DOV#k?<1Rr:OVi)$F.d۬Nre(DD!"b+LZGLS9!8٦\Vr!Ӯ$1AjL*ۮP9W}1Haf,Kɒe0QBDD!& J+?w64 BDDWaU6d9md'$s$k%)x& 1Q"o:9kdgP>dOCIe}ԥ(DDW\Ź1nA!fE\!"gD!" q94(;X!8Eu +w"`h0Db9( L"b8D0Q4(DD!"bD!"&kDDL4(Ds!l&  shdk0DbBDL ׁH߉H:9(D!"& F};!r ?Gus\Z|bfϯ_}NDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDv]nfSboNegQ_$g86ݵnGuvrXuqel וO;x;<P\vdjEDDDDDdr80t[85vIpD9EDDDDDdrgr`_܇8å :KiC^W'3d W/vEA"q&vY{}eg\, 7uoFiO=hZH*^\ZAYozzƲSRϏœsoK' ϳ#~0FcDt*W\Mhpkx9G\wQ5?H]1!"""""r 'jr*YBtοc"nOݚ~Wo)fAhZoԯk}DlM7߯9O^hCu~ky(!^}m`뺋Ch׷o7Km>ۯkFa""""""K#p׎8SI86 pҶߟjn8Kmn+_ok !/?WN:hʹ8Y{லԿQ>nF]x0Ns0ے 16$g"fTt`߇(*+trH<&/y]s]{, ȉWn^o͡*C2$T]Yqq^x8yaQfq """"""-r}#@Lx~}7$ghY$Q)>"< G<+K2\/zu:yV5ݸs."IĨ9Prدu"P~LG9*^8rms,˹M>pD׎Sp^ƇǺ@nTYȘ'rWIK/wӲ׺S~O%n<VRֽ=OG~rڣuwS)Ov e^6td7,8ڍG=7圉`ZMKő6wwz( v>[C-xz8W/lH72m৺\6*gʔsvg7l-U0c`}Zây}qs@]nnlmu_9LVu{Fʚr  ';46{ q_'{h;tg2mwt'، ve7H6,Mi4H)ё61]y#mZw˳qu>^̈s5ő*q)"""""""@bU˳@AT8u8OirvAA5b4ӕ^~"""""""{2%/S y6!s{3"$ G-蘗vD9Y/CKNsZ%vǂP ryKPDDDDDDdoS}[\^h`)ݺc.&exPLMBKEDDDDDD6$"ĩWz6&bʉ_/OODDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDq#6,rʁ}:W,#_DDDDZowt;"Ήu{j^W>{ {M/;Ĺ~K.+ll4-y5y'ݰ(#"va7eK\Xv9u1/ilxGMS|@vgmځɲ F_YqNtx>xtz>YY&U<#-.UֹN'/Ad%xJGttʺxndEݾk3cRn2?e ;{^/yt&=uS(;-G¯=ٵ/+8qq,UZr} OldO}"-,Nÿ'OoK O^. S^?2-+ϩ,"ļ]qtc6e1k ف2e Ktm>ۋ%["y#)'lQq񐿧6^u9=q8#ˁuSē;R׍!;py7̿8{dL<ɂCwDVYy,;:zNgpߢxC'w'Ѧ>ye(6 ?;-дk=zw=e#ys9Əq.ulg3%$ yA|ņx/Ӆ 7`V꺬2wށkG\^. %%a;y3axw"9ϗu2j'Ow/JK<"B-^L @H~NFC<9#lcx+戬1lw1jnÃDœG:W'ODu ,a:7$edhO.~}Y&rM `\!6:4Mdē=W GqQœ㍾N'Cv@v:/~,IO͑Yw,I^DvM;kL'iOٛNә}mL&x"rpœgm%ΖgPΛR1J.'q?UXwqV.z83evsz(aS^d'{^EDDDDdē?iڶ EDDDDDDO4MODDDDDDD4MDDDDDDd.'. ӿkgzwSdYcg}~iK:f+_N-k'""""""( ^.` ِаl }hR~þ/vA2D&n;I=ng^xE]S<Mv~{A4I&B< im Ug"^lOD1T~!Rœ_:+koT<ODDDDDDVU<9O¹gɷo & mGxۏ}yhDDO&lb w_z!p\q?q=3{JXVMj2gLۿ}wo}۱ hm/n??Mwy޾7s};׾:CkgN)(Oma~Gl~x珽m} bBDkw_޵;th.M?߼uo=}yW' vZk޾ loa"""":9(i˖jwmV3g/D,}QfِȲaeaZ]Xe_8ceVhg{:{'ﺪ98hžj}~Ϭ}OM nh[6A]sFnZ6lWS<MOvโqC0ȏmpuꏣ:8yrD!/ <% ?p!RsYpl }PO!!?cx gz"3?:D] Q}E;Q>6б+5*_eqh8V+$-;39Fo!FDa88D4>N+*c!S'qoba[ȶ ;}_Ív &)K( b PC_Q?ڹ/DxAY?I}B@48~8?B8C\bYF'Fh&seܞ *SE,e}cf.\/~Ofm2ن6~F!k>[CODDDDO4Md_L>DDDDO4Md'|9!j8 #"Hf%5CQ~ĉ,?j uN8Hppq!Ύ}@pA~Ė:uX1<=puem:UR<Y`ǘp:Y[EtO4Mdמ+88n|G1E8 Y9<Y:#4oŠ< X~BX`[7S9eA@ 1! ʞ'~pcb89 ;eisMk7 ʹ;V?ĝZa1lBÀ&jGlCìbW-__;'r̘:9 ep.m!q.9?6!6ڣ>\qx?UO2h,7WȲw_޹թ[o8h8:8X<-K:G<q@IuXpu̶8#}{NʑbCDX"r?w#tp> N":qu솎:BHDt(1'c-BsMa8RvJiEղ>#>q}~WB#rk bPuh:8tӂss(dXC eo )NhDēYxbu[~Fsmr0x $RǴ:&a%'D̒06rFOb8d{5LVs*ewsk6xNL9gN-곘=qgOjTPGBUM1ǁ{x֨e<>O`r؆(:e35jYpAo9Et`sg>w 2N:YupV?]X889tCx|3E$|i[Hh_aOQ< l|sҲ U,aЬE< cq#Ҭ JqDjyi QS'<5 85iH~1]*Q11>7q߳xĶQ يx9Ss ɳ%yz~Ohy'~^ZP,Q<g!#Ct'{K< /y|xv" _&Ǿ"S>3 s>)jNO"(*:n[sKeœЗ{:81e!;O8ԗuWE':i9CP[-;>cs&x:o2r"v0C SWǕcژ8ǙݴC`&YsD(ʞ8~PǵR#2y¾xnR/]J(~+Ǎg[M~Qi%ϑȍ甲#G}y9W<"E9~xBY؎69Ǜv"V"Lh>TDd'C<OxBg8ev+!сk(LY;Ȉt,qG?u\6N#b|8(`㫃>(_LǦ$mM,kEBTe('+_[Ek[T 9~x2T RMO"?ޭyGv`zx=YY߸~wR${:3F =y~~uʜ?Ċ<}y7^ǐsDN@ȑѮ!܌{Ǩ\7"E"7XG.þk{"s2{(N)VƴZA92̧-'m$U߭go3G'R<񜊈suFG":ah'tFgvj:iTV5:]2,fBNsql\T'W 6M<LI΃,a#$<YHhH;=\ЇUa|^^gI*t džo:8yC|5Ca9_]1'-fىcNH:b_Or 0tY&"D~O he'1i!n[y-j<3A<IHe;ˌzfҲM/UxOODDO8'8-1n8?`HJFG+3 0fyBWOf^q= M8[yh':#1M6>s,1it}^^Ya91wC$ _o_*v4MS<4g+ϩȁOͤa|m'Q'!shF_*v4N≦i>|^)xBN;[MnGRGzϵfŗMsE4a>ODDx$@c=9-HЉXw"L 7w'o\%a^)XP5f|AÝc9ɼWBD4D>ODDVL4*-b+i#F"j* ".[{ԥ=W4M ϫ~Ohi }"ODDxbGa \ vGn4t' ē_^DE1xO~z˚2|'0 ms$N1!"a,9C2:XN ?NJO|"H|DǣU: 1/ O"ڋ}.Q!V;ԁD;R7, C_x²}IJc_Xe5J*GgERְ>! #:/(%Zx犦iœ?x~>Hēo<}{_Lz~8ڈ>]PчayK{Q^c1 e;wא@{8x""2#vͺ=bx: /Y|72s1xP|L&tX, #8fl <(~ñLt4,DtD G&AGX=({γ;tHXaJtr40ChlTOD[P'G]QuBqc90E;'C [wK~=0UGL5|D'})#;/} gbχ(>pZ9rwQ5'"Z躽Z_>vwlOB Cw"j%ċ6~A#cCK|A~"K|ŏp\ʓְMtL:TM: }hS"C;O5$PPRw:` ^! ENOXbn'!v-:5h܊zuZ꘯=X9iX^*կ~&uf'Kh-6խ7x!ܾnu 9Ocsh+20b!T$t r9lu,I+yfK<9eЩG<zNQ5#RE{q<:8e)E$P"2q!xE"RiL<|6Z ;CSkw}^ihiT""jy犦i<gl[ZR޲j1tTDDdyylݎy(l\0>/m/KUxcVZSX2' 1Kdeav;x_갉8G9:Nc6E$_!DЧa Iᜌ%n ${hƝF`DpF\-:KO\4M[x7"~Z?F7xBjG)s8DPƛgy11/Ъ3Nu\Y/ K~6cm$: cxM 8:'1mP;듢tʳt.Wppjc Dmvqd:+E'1ffU<Gn|٢>!HD1:o=?U\U<^F[Ѷyɦ5vkظZ3}sԡJ\C\K.igҞW?^r~;e+ ݜsލ'""N^`Ov/ "Z3q>l&{e$-r,Db֡/1xbFM|=1 JBi  DͿyYUP_OG Q%8wQ m1-O(RV:j!ftiOW4MS<ODpP6ē*<0$PN3!ggNkF3,}EW:xiT+)h'"r0~NhZ f`hdQ(514|'=RxBվ6lXCO4MsE4MDDV|HMK< NzK?|lΓ)xNEDv rĴvECg\"C3:q8 LKI8Olg҉DXv(fútG脜g$w9GycS>M<*'8X+RH1s˹}qP[g9@_5gHV8$ d~Y,oگ+ڑeJ5x¹"*f➈kuY NjlYC'Fђ2Pnem1."kv\p3^Oh}H4_f}a 3/%1EUvFYēħ>;y7rq bta縦)h'"uk/*cM%;!aӢ:x2UOrBmmx@@tPߐk#:526}2euu:qp\$5C}Lg"ze}Y#CvfO":(G\\kk"C6.GNOD)S~1LqÑp'pWֹ'1"+5=es,I %);J#"6DPb9(9ZI΍CغwKp:B@`G<zNQyM8^DtMDgE$PBɧn8QTU<8WO(Z{WHFK[Eii#rtēYxsS5OZoӆb}9dcm0K"D"?Qn8x=Aɽ+v<ODDD䗌Ohә' bJ+Qd.3x_gl8^55 m#ۋIԿ:8bQ7o1)#KސZ.^OF`D pF7Oħ:$mx2˵r# rޯ xp Ͷȓim9'FulxҚQ'dSx)A:ynIQ'''2'I6Y3c4x±S>$pO>)OO"_e‘YP/ܷ-DYCjlSDi e밶_-7n]w8t?rC~:n^Oh|ީ;#9jdڵ:'"L<}9`y%Ge˘ŭUxBy|8q/߲>6>5MDDD{cx1|!a8 B_c碊'8|y^Yƶ%,cE6'#4MS<]j؎ª˘f' R _xù` 朣!dZ$R7n伈lQ!y&('#4MS<rc; \^!D0 M82BԨ'XxW-5+2gG<i≈Grc; KMO4M&""3K ;v<)h3LDDd3O/Q\jxi0_( 9l؎R4œgaaf{k 5MDDDV;v𘓎1Ӆ9oxiN}{l>taF^̬/7-3߻jWm'Z%Iע0Ym^_(1 ubIMOVۈ8͘A  n' ߧnm"n م֣O<3(0;˙Q~GL97aF,{Lպƾ=x"""u]8-v"Nx  8sr-jE],~_uÔ!uVf),V!B!(ĴD[F1\82!F;Q.LTuk'"L]FtN.됱UW6m9ekE\;>ODDdӿLn)DDӴ(0wM g$rub,-cрK'~W몉 ?0e`8B[;w=!DI~ N9Q,G`oOũg}ԣKU-lGPf*bb(MBBP:R?¾~ Xްyd9Ç~T3zSֱd|C"m@]3~9lOۅ¹mXF#u3prdqcX\;-1LS<sh^^7RCO4Mo &N%N&0pPq\uScXS_?yDqq?= Aa8&t|l)@(328g/Ó:Pp#b%mqZ?"$  m3&Q~D ]#ThLjN86e.=bD?3~gh+Zh'KYo#Q?6s"!"CwD ŵbPODDd9ѿH)DDӴ(C]\Nv:p`ǖw%N1NsDDBRboiËrA8Ul@qc,!F^d1$D{>AFM0[pXm2O#DBANZ5(7Q0#;0 !PݒEʂXEh3ꒅf}8.쓲߬µ1|.)p"զMxي(+=6!}DɐX󉄸Bc N.Q5RT@e8+@NfAp@r;L6;AbE XB<(G Db\oI`㷜7%-c(cBurHI^Vg6vZKϲbm9ʵ)d^#'cdh=5"F_ -pޫÞdG4B5ȃ#p[CSƖ3g9?e!$8Y8֔&N3D36䩏)/Uۂm9%?mNu%62PVʑۆJcOl۬&o9?6#e6ogz_OQz}QV!בrQ(yf[Gޕy!z7OMDDDÓCvDDӴO4mXDdKS<ɑ!;β# ur2iYLxi3"f)ssxҦq*RӴ'uc(شؚ≈_gm YrNӴwxi≈*/+l ٣(hx"""9BDDO4MS<].BDDO&S3mw;ƾxf*ִӌ:.{]cL1:g;C4=V2>gnJR\Dlm~MS?=)KԃmS{Z?i_ֻ}8ZfZO^6r[Ffu:>󻿿w׾wK,G$Sx煶X}wC?#c|^;umD$qO'עS!+ֹilS*'پ?'wk|Oئ G,|d8YW<]_4>d_{GnE]\EDv-Y-ڷ 23!4mʼn]xhĹa:`D7vQPf!އOD]sŻ$q }V4Q<-rkxЦUO.ðOmOfj 1$o1!Ͻ}A(Yņ{ڑ}ۆ4%"@+Z%r{{hu D,j*ll~~įl!(F -j(<'D,{h≈*)BDDxB3_xU`oZ(onI<'"#b CG"2 AGma+ \(z_AKfD!DHJyhh-bR-ߐM{DIz!ڃb"2 M3*{MDDDfֿ4.9DDd;ye8,vbYaaVoڰp/Ȑxsm0C ([g8"ȂC(KD?e[O0gݎ蝱!6 5-b m To<ؤ cK$A.ihF)t݉M!""&tTB´1&ī'D̒06@5jbHo$(8u3¾GaG͛wfT ލLULĴ ]OZä A<@8CVœh䠽[-uAV#/c`n wi &+l;e''""2W/Wl 9 F xI?@r~"!Y<$ DrၐS4"c- ?c Z#Dڐr 唯%ble !% ķSM:nSB≈eM!""E<P_!@^ D"["2$m9'HȔigOBXNOB`bjۜhBL1\f B0mPvV!glBI9ʆ3->"287ù玡a9)"L"]sҴc"m5kehx≈ / 9 _qqtq%Jr6AuVN~裓8[WQ"΢YuI7mA# 81ODěi 'YDHZU(īy85v|E]h+}^=e,M#%B^y*APwq6xhL|1T5dlPD&luʜW8&_L^YaF#Ery?bu} 9l?K&b9G5e]F5x@ƶ4vἑh11kB[ؐ8-T._5jfODDDLˋBDDVQ<^т\,:)ǨCHk YB\Xv!섰RL}]2lN'"""]wGϦœaɲc0ey|1uEOkx͢HCxRf1dNDn'M67ӆh𵵟]sw}yx5c]~m=jx"""C^CDDg)]5MӶ`'}Hxxڦ}*4M[*""-6f Oirɺ%6F6!IBDDDDDDDd39A<9gSlvO""""""""9ҽu;lsl|'""""""""әDDDDDDDDdg;󝈈4! ‰NDDDDDDDDDDDDDDDDdwrM!"""""""7œ6F.Y7z{PݪwI1DKlkˡ(ƈCb9 =!J>-pBLp^*(oIjnDGJ"Jmb)Tł)\}w9㌽ßg9k9k1B!tmSvB!B!n'wB!B!;'B!B!6_ivē!B!BfG8yƮB!B!؍4;vB!B!n<'G !B!BxOε+B!B!Nǥ͎p]!B!B4;vX"l)yL!:V<Kv J)7.p^R<&bB@8߮K\_Rn/[KW> !X!\>^+IJœ/ol=?^Rn1<%8H)xBB}nW)≔R*!؍ۇg x"T8o?~yKԁ{OBl""'r]X= g431v:oӮ17nq tAw~ӎ͟޺Cou gc k^3Mnaǿ?8>&9 ~`ob(C]f6\{mU8:5k!gr9#w?)H)] !DDO:'x*p<^ { /q]Ż~@ Ox,:BY8o@~Qxp‹ȡB"6 fY\Z5&WWYc"m aXk(DB_ƵOBl"Ê'rē's#7]^|2!!=OB}#!jQ"'E)'΋Ar>ňxLSsgwgo >qFB}װ>҆1D]hO\,q}0%F,O*R͂/Σx"'Bp;W< 'Heq\jپ76$`*TAz\ykP|ո3!A(o.8>FaA&x"u!EO[:綅 U 0NΓUO k-s 1u≔R.d;Җ-ÚBwrHDnxCwq{l7|vj~'4:PO*f :Qb(q|kMLN-5k[mC !'~u-8}°O"&.>LDϓiȸA!c'RJyl0_ZF.P,!IN g#w~ 001"1r\}$BwXl-]x>+'yRsc<$'Mr{$iB-^sumC!dE']ch"YSxxJ;벹7?5≔R.^o8"≔R*xM/ùY<Ԇ{~'#jluq| g|11YF~W=Zbꥂ;PaGhEyUPa"-X`PE0{D<󵠞!t:'cU~ϢmCm\kFR(֧OaLOOBMťm !o1NCC >|2>0 Pعf#{!^!xs!|2-UT\4HUDJ<|I8szcP8>'X>P#k'Rqbg0=waʯ3Nh_pQvCwlW ?C[?iۻd%!q$eq@~,Hm3#Q26u s2PvvS{Y+M""x2)3zw<_xws߽T<BSƹ'Nvrbvި.Q810](4Ƕy6ϟ3[][b5iK=F KsM=c#%4-y7iH; C$QF4,,8>[C, A!PY$tՑkOm㼴 ϶ˌ/ı|?k!gncq[W3sW!$':_9O"5Ĩcx<9?x"3n'Ovȶ٘$E@8|D.E #cKŷ,Ms*aD σ~'Hx¶| f1z]tyP.\@4ۤ<7!k,6XḼhɂ⯊|ۆXyxK5b|-c/K,\hF Թ+R*cKM  o^{ɹ`-5B9w<&M"D(#"E(ֵCs.H[)9(aOj /ZDy!*:nB0x2yE>bab$2bNa<\}K<eђ#{/)➯soN yDfc>\f΂,y90 ϮQ\+ubflE![b尐1y9 K EQʈ~ Rfy4xµŢ)1i]nEais^!8-îYPj%`IDATq#}o³:3qexx.Yȼ"OS#w!0_> 1:> k}ȽG9aoco7=M1'v_UsR8WUʨssN_gs$y=C(uW&uзx.91 C2`(#r9bM5_Pڜ,??ya//-Yc9Q&r<2xrScvWxyD<_8/mW<B7ckZsyt_V4\D,d0o~R9t(.$ޚ[Ul\@[|>FPy1]yQsJěB&D`xƨ/\_AX 15/Fo>8f\EmENxB[iCȠ.Vs' CG[ϛj`͂/Iⴻ-p.j^BGsCx!>&QƵo)t[;\8SsWCrHN=2JkṜrG3+:GbPF9kx.`RF~y]9Zƞb$*V@qB$ ➏sB[$Dظ?"`od3nNYQO5Y|!WZ!$Oı.ۼtϓu!] eO"/&s\7<\"@#!@ym,›7i ӕgصkuO[:綅 xc1+dxB},$@.γhɞ[haɤvA'3W)1> .laHŵ~Q3-x&22\7oNFD kl0ƛzX %2x2I,Q> '~u-8}[a7%[ؚ,3"1]'<+Dk۪zL06H@ F[&Rꮐx2yEܙغ;\ ;Ucj$Nc8`bvauNK"7 FxcC{W< Ol)^fW^pxڋ'3ޫиs7.V3{<'\'obw˱Ӽ T<Bۜ>9Ԝ/œÏ[<4xpE>[x2k { -/kHBaA?zDGxXR7S,^΋Q\GHboX^/v7oj=3^0O[zO8(!W$mCm\kچwȋ;}ױ'\Qm10Qˎvw;^c,}/dc$G<ފg FRI |Y˙Ϙ#97c { [:3'b2NcN5'tyyF.!By~pXA P"gN`K4P~[r~ˉT_R(!&`xhrS5Ĝ>hxz~s^n,B ܮx=jSs\1uowx[հcœU iOJ z.]Rע'x🆣*7lN0P=׬)@CDJēT8̚d=+G p6M9^GG䙀w>G 1˛'b۫BA ,~69\$oÌ\9'{ty@ M|xQcE]r]y8dqĘgE]8q7Om\CY<{PPv@aڛ3K8wl ,.YI2o6Ax*s]$xċxD,Stmc9O; C} u'o m]x"T<H)OT= 8 m^vI 1e(Ѫ/H`5)1߱SͰ+ CD3Qޡiݙ}x|@o?|ՠC0&E4${]c Y0ªb \'z$$ sJ=yz'!=G#\oB۸ܛ!Q'^rFncQ+D'eOW'BeT}$L-A511)#/cCoa8~ZkVv \u!/[n}nxBSvO "d \u'\>GߜoOcr9wA,)Ix\KN 9L{y'y,IOF!ap-1 v%BX޲"6OW^S!ĺh+ ̃ MB\3Χ娭IT `<$)+i$mO¨<;-!!ƞC\ ?M뇧Bp e8=Hr\ >p <j^Ğ uY<ׂT z$Iԁ2mQK g7b üOBl2BeVQqG}O<8/"TbDr1u>>(9'"3W<#6"lO<Buqݳ' C} " &{-Saa;5?DTs G'OOyxЗ<'Ge x  ^>7a0U8x״m"6 hܰ<^qO#?`jj~Q96{o)H)] !X\NΩs\{W\s$U<ɻ]02 }T< 3٥oKd\dϓ^v rw]ׂx( ˿1/$J5g%MS"XWKkYUϓiȸA,1ui`OB, wms()O`g*PXE$Bw0Ux5"h)D]wes]orbص旉iNVD% Yp"S a9䥊'cU~ϢmCm\{ 8{Jt[(\>5KOVF;b|VwkRoIHҷ:bZ 'RJDB!V{qs*A5P֖Ox$9)"DOk2^~a.C0 IZL㶍08~TYf::R*.8 Yxgd J̗$uaBa%Je$?Ű.rIΕMƊ'RJ1!ɇ3 K@|y!W7;!@[{.O%+RJ!4hͨ${8l~;mH£>zS/hQuycFdf "mYGV07?yކB!B!^<&% (W !dӼAA0mL(ۿ|*p~œ'$}-1C+okvBwB!BOˤ)Cozɰ<8Ǿ؜چ#B!B$ē_)B{;+}IcCdɟ]ҕ'%]gc(L,|jpr攷!B!b'xvLj|$3$즫$| cɫom|Tn뫝9WL;xB͉!Y͎gɏhBmB!BO"i,[u&5 f DO:LL)#[v}qlpN*[<90kwyw46{I{[K!B!ľO@8 Oω%+!Bxo"&r i'$QN uA!)HmޗDǶy6 &Ϥ"<o'!B!Z?}[Nzqt|v 'wҮ2,G9y,o7[o?|~OmӜ}'KT{!B!b3 _}[_΁K~emw}u뵯{Ͼ5N|wO8p27UG=M͟|7"V \q.||0]|Ir?mOi8G=@< |* (W9攷 |#B!Blx聠Pg7;';> ϏBhOc9?"_ɡ7yPV;wՍzQVkx`>O@CFK)/!GwRn 8㌟,p^R& !5]yJ=?HJ8OxyO-^!Q7BxA#΅ s73ƿ5 K|6L xREL" X$O~\7cu{v>84z ӕ6eqUv᲏v&ok&]hN(O+RJ!6N"<.N'qq?=x Q)≔R*_nzO{ǧ}1pR*H).M;y=5{Pb;6;^9?vR*H)O,Wy=ޞ=1eH+W 8JsyEJ&t${}=(D?Iɑr$ƹ>7WaB(H'=xO弲P =ǹRJx"tBpv]:+Ih_lvvޓ'RJ)T<‡܈ tV'1'ڲdޓ'RJ)T<‡܄ t'gn󩶬{I)≔R*Yz< {'϶h=x"TtbiP=eβm_ۖI9o?^5_~>2cⓟO>*OGs̓3,y{OxrJmh޸Sl?sp<8(?%í rF]wzMo__ ׽~z[g9)8q,#Lr/hP5~ !P.ueFwj<t81ﶻpӭ{?)H)] !&~8#7 r#.s= SBOY'.VQ}5׼f0_}.#s!U!>:'Z|-؀ʯkM*p,|a^I7 Ef}v-Z<~߫Ǵd|#6#O rG3m3Gmߛg c 3O %{>q{g"^$'?͘觜| GP!D$ Q<+)"?K)(ց1GKO;z}w!~P< ~PvP:6O7"<%@u'oO@[zp.]Wg p*'22]ak{|`lC3)k"!f)..q̑,6vɹxe<[m=RO\(xAWCw01 2ݯ]'=T8 h?*8;%V0DZK(^3|O dC9hS,0 ĹC P yu-gc™T"&WWT@qa7Ĉm:H50VOCr>G 1ث1D5(sON "b'RJ99hceU!>ON-'.VEo)6xR)r~LƆb Ov¯7 (xsOOb7Br:|!#wH'B=2g 9^'Ww"e-B 8& #ɔAapkOQ 'x"BQu@$!$5d*$αnIԿYa<Ԑ1)\x|e!qbAfBx&z6c+z2|,^<]D ,v*-6 Fz') 16b[q{ml:L>(&tf\1#2-!0oӦI񼔛Z_ ׂ٘"܄-jV՗'x! "S|O_}>KdqOWc֡[Bϒ'ca8x"'^S!ĦvbWKp m$qT\4H)OaW> f9\u #fē*-Q#3· [>7)Pq %0(>npLJ^i.xݴ;f}OAGn|-kQ̹~ߋAI =SaIœ&%ap%doD;ixNuggHۼ"≜jϥXk…6KDݜ6xp6?goIz\xRY'=8RM"o-BWD@[zp*UUgK,X-me\ﮰ5Cy$|^1\?;sccGg|FsL73toM#7{>s$>|c~ڦ=Wi<M{׽T?5ɕO6_1&#>{+//X?0g &>糾'&+q}qYc74XOQ.y֐mUO{ݱx6((KCH뵢xs܋xpRCwXpbj%;vD  a fEx^ 9o,1VY@bF(^3|OdCs yĂ(1!!ԅHu-XP3x*Bd"DuG"y_>& UxN{rx1iS̹OYQFGڈ'32 Wܻ,h_΂㋗J|ue|#vG/$|zR^ԃX{)s(SqsppO"|Z;}8} EJn9'(~yѵ|a O%0(K~uLgY<,$WW}"qyBи.4}^B(= `?b9{hc6%W|Vi%u"tܿ1q901X= 3E؋ ă61#'7}ʯofm8g=csx}~"1Û2[9G$/F wM {0B' 1c}<sv sxYU!Ĵ]wXzy#ϔ]ta?gT,! iCk3)6㵮yR~R99;'{)wPR!D5dCNϕw\ϓ.NoEQQ4 XXcg1Q+'{ȃ)A!O]uD29? axR{W8&c,1YHEhs-Sר9̷x^]W]M !&Sslg-ʙaO!L5_1y=#L>?%x>>BBz>:x:օg}3xV._D1 &7d~ΓP80͵ eI,B96e89O2t->Xhs7'ц-ބ98dn@J޵X.dYxB{ږ  4?}u}G^q}8Ohװ{1U..Ð{"BAɘx9<"wkxEE+a?qNuԜ'*ɞ+^}ɓ_=? MxZM+p?tēë~V<BL S'r c S]M N"澊',bYL$H.⃷!Wwq:'v7PqLx8 ʠmPN%hTC<P>OBDn\D \wpI^y&[$?nIH_r0jXro0vW丘_cK0T3-QbŖ!2RwE/ܿy>]5( & WxFzo6|ų.F(bY_YF#!cM1 "zpq+s밝 }S0" ÎoeOBAh8c"7Jg5N$c{rSkݺ;TW_ ^ /ԽA'BI,0!clǛH)Pd@TzmWyPR&wo06UN]NȿIJQ?œŐ7-\Ĺ"l62bYgkQޘAZg%p`[y'RJ\bqi;)܌sIbh>oH15?oWc᲋ 1H]p/\&K"[fz%d/`"t (̇,v#M116*IpO4NNOV-i㶭+"چ`;D'RJx"OxIqXjY6]֏JfHĖmDaH[]yp^b8kH5LmZ s$t1"T<'Bp~O6Sœz Z.BH'#x0IgW[!!lx1+^'U2y~ǰs" y-xV Vg09r9+([~pS.*kA;@V< 0S _\.DmmoiTUN_Q $ZQ B;T)9\mI]Uׁu{O}mClmYxB942.=!pYdK0Px"tM$bq~;s@DxI 98A<rq08kL5:Ḻ3'o 1&-uH ̩>]F5#$gI5G c5d*$QOW-+,Ku[DJH!&vRDxgAאœ5l86WY !B͂ԅ1 (H_P¿#DJH!~=\w$Bw7EOã/9j$m]O 9L֮] 8F*r>>(&tf\#2-x]11|r@"/H|&@DڧU!T<B\\>^P<'RJ)T<BэۇŊ'RDJx"'B!v!x"TaW)≔R*!؍ x"T+Ēۥͣ+R51kB!/vB!B!n<'+B!B!vwDē' !B!B8O^iv/B!B!O5;5vB!B!n'B!B!qO+B!B!v@sj !B!B݈-o+B!B!v#,]!B!BgmfG@9B!B! NOn+B!B!v|''B!B!qq#̓vB!B!n<(WB!B!qO#cW!B!B''?+B!B!v@RC!B!b7jvē !B!B8'OB!B!q6_ivs!B!BxOn+B!B!v{vB!B!nWq^R*!X >L~xBk)T~K'IO[~ֽKy|9˶QQ:E5o'WfL|swv≔5B1nh,/l c _A~Яt~y`[?u[/{[o?3~_>ɳ8_?ܺ-luA_ _ı}"$:z[| F!P.uev A!2wׁ!-{+u;~o7Mߵ7^H9)/[xB[m mp.]Wg p*'&,Cآsm1(H)])!ɏ.](C#r9W! ڡlu} &C4 Ig@X&?0U8vw‘CrXytHQ_1j Q6cO_xbpa4EDZ^D)^{ƩC /\+6m(<8 ]`ID|^ }`) c Ly5W9#`Rg3yPMLja9 ÅX}TBUE*Mc]y-O;ìH¹j 5voP!uKD:qOhZxQ_񒥶S┢%"fy1G:9Z]$f#aHQ'/vQg asLIg"S;D\xf1O?ErbWD9hȝ_:lsD;_kU#S"͓0^L$sjI-g~o(uȘRJ-<2ȅb#{ijYVͫsCe Cw0?rR|=thMk3ذlL;y ~&muΉI\?:9dy]k_X("@l3,㈘|Olc$Ŵv2inE$#be3~Q2Occh1&]^v\auVy}ảji(TDd0u}^=h`1S IbQyI zFPr(aLk kcj1)(tR3: < 6X#0OLH. ayX yA>7Hy2M9'+й"zkQ8瓲0fh(TDdy6݋XIdu̓$8&uΈRJDi楾bnLah ݱ't"}[sH4}=>TFe$!fMΩ1/$4M4V''C!{mrlyl,بc(ZDX#a5O(E(U$:ӘyF2AYs/k?*bXT;#J)y""w.ݾzq'1%*\1IJA8=oiBR*6R'J)0+K""u+yQ%OܞQ#+~DeDF2oh(OWR'JDD Nþz}BG y_z76_*6R'J)0+K""u}m@%rM,D䰑$ Ͼ_F˰_;7 (L+ 998,j=`=H=:ka'<[s\ýHIR1qqS$uZfP,/6Sxlk&9˕\_E|=h6Ϛ扈"'(즟xa 30-,yMXs?F~D~60f0μg>Yц…伳,3 ~Ӎ̦µdf~Lk⺲=fjrRc=s{Z&!q^IJm߾ei=}ĽӘf޳)99}:1Vmg"^4J9Uk9s#uaRN]4O[}碟9uI/v<[}F$ yPAhǃ%:T-;qC/xGۤџɍ8Cbu<:]?QkWk){L[b-xPln:<D`>eeH[ !E'D徥LdS,~7G'Eg23xQΉ9؟N>F4OԜ=V<ܶ--?ɍ<;Q뺾Glyں+y2zEmcCX7\Ps2QV_-uX֑c]랟T'ľS߱<7~mr.Zr}9͑|,ߺlz|z}m,LYŐy= sl~|6t3uh\<ߝ{7ɠ瞌ho[x6uaI'Y4yqR$ncJĐ!e>LJyo} -c*xcCcѺ4nX'5O8"T͍bύ@/& < fmW :4D-cki-9ӫSn9c{'sWmCV4=FNdpNe l1A6P?֑gW5g/ی:a̐vu@}esxXM)uQ熙_ 0c 1OV_adP(1>?wyYCcr6(_=}|cvDD/^le(lF+Nr?3:uiC'""8?XQXKk(\,H!ug6O"I~{ɛ &:|F?޾tّZ : po>&,b3OhGio'tbPE,ULШ!lyrWI\V0(- EpEyw1=F꓅+jshV=f`?F9'"e6%|oR)sc+V$Qq:|FcWqGg/':!c~1zs.yZܻwly-m-m@9g=eD}~1JhA߸/(%0A49Lh EuGz2;Ͱȹ3h5; 4zCl&$`i'4lkMIo[t)lQ$,NE7 5g$k6s1ա&ȽDR5 (؍y9E=3F$V}:*1ϑ(<É0&Q=8娑H M4^:mpL'+e̵"JnNTgP \vbDge</8Ng<͓<$Չpw󵋇S4bاf$Lִƹ1iwn?4.҉QBӨ+aH8iG8"fhs'@Nۡ7inE$mEXLp\|s|}0֢Sߚ<)Lǎ7ᬗ>~U$\ rzN WԦ̵x"lLe%fٍyBfPC1Nη2}~~&iVZ#K#1w6O>w|"yenPQt~6k3#㺱Lk[r]5g1`}~P帿(?oyi\؉7NQ<}2 vs1]$7e8y'1bkAt|2s߶ndHR5O)'qhx22tO;͙MȝT͓jyZ0L'1@a;iIlܛocO1MԯԉufuFX(0wE/ܿap!yت󈒫 m[Ik<#7U6S}ų2Iĸ(a'0˱<1E6vbPfr`֨i7Sg5ODDl,ԈCUF eYnZEnzƨe׉,R>.fj՗~~Ӷ߱c'"";|P!`CŴF7EztFok-&PJ„΃m-:^yۈ*zc^<M8-^d-`ñ(EɈ#;2Oxc:ei^ ^coe;'J)%oD*MBA.o A >CoW!#\1jҡ d#!d4X5l yXǐyi3!h,_syF2IOGyQ޸< Qm-o?% tc5c0@]DXwINNk%Q!9a/9OZDt 09w V߭F FcԒ'J)ϿRJDiɎ̓0#r 7>XsFf=j082/gwZ?Z""0cاݚ'E1+Us'C ٦r^#e.Cㆎ"95:e0tS $tav2 г~l )) UC7fm6X!M"G#,Ϻ9!c fbvo'!q9W ͹LD.8gc )̦f̓^C Jyozi -S1srsC"a[|T͓9/@X&?0U83Ԭvw6wc(T.6O)"0?f@5R& &TʴW cyKFS}LıRyM$""ybCa'1 =jЇ&: c LyRQMkБw0)䳿 ϙs>Vn"̶|,{ep\cFWuKD:qOl2YlTi(lh0Ob6uByBΆ:+N(##tY9Q',WgӚ'"9Ae"vnG:lsTscׂFF"͓0BR>9>ꐩ8'` lY9^';IQ+y2M9'GDغCH3Oq>9jpk9ryM$""yyDG9BdD"xaMR%j$ϚM-:lVvz-y¶4q9Cƹ:P2j4580 C判0'J)D"""'Jd*1X"lNpcyBTN.J̶3yEWOL5O|F(4ODDDlk!O1\̛yDT$TgPN'Hdc?gddžaBD"j(扈h(͓t5u-88Wv3D1yrqf96w,Q$aa'>#R'"""6m(x->^QJY0TJi(DDD4Ol(x-R'J)0 ^KR:LDDdiqu}^Vl}Fo똗}&0Kn+oxzDDDDDD@\wt7y^O]z?oϟHnOdOWp#).t{T6Ir*6st}.}MDtʟ.됿ϦJt>khسλu 9~7OH|Ͳ̇-CN'Ǒ~KɁy?s&mиuT6a۾87t8]wOk8GEDDDDDd7;}rܽoc+#_)gS 5ib"L6ec'1jY6'}qb6SLռ6"5ߺTK88j :zOtQ'Tr.EDDDDDd7,ؘ$O {tnE~͕Q?t$3eщ?v2r1D“Ý}'lhM^-:u'=[ (8W?q#1;T:وx}wIt8Μr.G,ű:׋pq.)&O3/ \sO_Η=M""""""^S)|0G,9 GcWɏ!-7t~tCBcTL0M#8a: S<ܗ}BxkX4ˆk,O,E""""""r$kQZκٵu~N/:"G鍟.M3[M5^m#JotDj.'F~6< O_y{`Ц_rj0]k̓ݰkCN;xٞCsDDDDDDd!Vna)@?x`X7YɆOXxss0EdJ hQ~מΗm~bk^ll7g8?'1=0`<9hlF.LHwGDDDDDDDH&rBsy^ny;#K6jr V"WN׳5n{]y>8uz͑9WF:3@Grl(ZXYj?mZ2OCdm/nkGxcUQgɹ=j4uR2v2]3M]5.^놇0$;ii-bȵ_bwsȹ}>kXu#D[~ޞ?[\DDDDDDDfS 3 3Vyh^O%Dk&5ujr:L=ל/'GaNg"""""""2O0!joʟS&f6E@Pט>ט% 1Y sK)"""""""|МH,KXf9n3#//"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""8>ٟC^xzj|"}w6bF%""""2ozq|optάu}7ں`hY^|A.7?k!vwæ3|C4#f/{'Ꜻ~7 i1%q.^nYK _ݩyK"w@#0ɑw*\>72"'Ov͓g2g˄ynzz\2vF)z9uOX6?/,NðwXWjܘϗ-JЬs|0^.5yrOʲ͓}x8/wx]wuvxC&qߞA:*w_yreDazRv ~x*w{)Dyr4J,{JY>tSـňy|q.̓WSǓRZyrm`Ȃ7亞6_<폑r'SZlJXc] VS8W:[ ax̓R~|=e%'/:Ł:JwJ:"ʵݐ1VO:X.-n㍆NX dYe̓i=ڲO4/˽Gf0O6_.^;mOy"rg'mbZy\9Om^(˞hs3}Gn NO6FfE'5O䠚'xror+2adm+}v=P2hx\١yrWt|nk216z=y"rǛ'Gsn3/<:%tLbgnx^mp|[oe^rdncf0O.?e%'2GS6&<s͓Wyfm%:byF)mڼl?5g/sogs-Ϥ6}ÆyZ^.IQrrj?m8缔H hw~3}(-W+C߸o,쿏3~oGY"{䯧\< N􍲫侴̽C&ݼm.w_jY$Yrhpʑ̡~=-rG']9<&gdHyR~IkEi>:Y/wџNŚ#OFzD"|ډOeJG|VZnshnq)?0O.w Ͷ#"\@""rsb/]!˻#ߍIKS& =wJYnE>bQݩ|Aɾ(m'~Nj7|"ţy""""""puDG >扈29mo"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""PάRjeuzE)e='"""8ήkM)G>YzE)5o}""""{E%yxoͿZ1=OERzNDDDd__]o*VLt,yb:h(TX(DDDD(ezE)e='"""b'G);+J)9;9J٩#Rs"""6m(x-R'J)9yяOڭy<)w=Q_=xQCDD+WpDEſk_ݧl h(4ORj.}0Ǿ~/a`ݥ6*ćRJD)4O""wy+I;RJixMEDh[7M_y/7S=_-6| 7̇lj(笯|v\˷}>q;ذ1瞏~'~r:t;G S?0W0g~>Tl4(eTD)e=g}KDd5Ty o˓`˿X+/]=yTڿCFR6@5ORsW>DDyϲbΆB~6~ &'J)<񚊈h'Hz:D0'>Ho~͇lj(笯|vɯw.Q~77BfbA)'J)9+]""oYa;$_߄'Ceqג!R1jh pMẅw9MkY:8PC!yZ|768qmU>7Si]0^@K::kF=4'tn{LXO꬝Ogٵ(q쓞cJk*"y#䗞F:Cǿ{آs;>1f '?_Xg*͓%׍ef6H]z:'3)k]/IxQ]! p~VܾǺL S~WߨCz?PR6<9RRg"-Qqk’W,Cx[MӁ:LkAqlHN+U>ܣIZU4Je4eZyzE ܟ9H;A lZDug"'|q>e;5O0)DFw>gF<;G"`"Wѩm=VI>iy扈h! Lp l(o'PDL3?a´Nh3oV2){lI!/CؗԺ+iujMz^j-Kѱ2OrW9٧|}!QmK[ǨWg5O/eLa/NbӖ~e0wq^g5~Ԏ\_j$K[J͓hd]h@d rԡ;Df=­yY3O"$G/?lh,Y: 84L& eh{h>Sm'axQDsv!@({Z`XaVEBݚ'p:6 ,ȵB:4h/4D$7~Xߊ<c:D#'  ehy'=NZ'a@}va` ׄc@d/}DZzk_8WCJKy0=x(dֺb_+jzM) 1$L2y];;4l'<;0fjY59\q/͓D'۲znaeH&܋<#2Ce˓/O> %[#|F9m a}>^r2ȧ6:L'""ܽ'Fcx) EOg5Oh=y20I c>ҹzԧ\YKc-:<,naBTH^(u;aS>iGNl#> ^/jV1:e?'qM9|l1o~Z8%#l$&‰]C'^Q&FK/_+G)s4I Iɐy1dD[URNa$bʃ̓lȫsWN++}@ۢ>?eT^> 0B(CmPKjԾ<zy]pZΐy;6vr-C8Ɩc~Љj[޸p:<uK2yHLPҰta_"IDw7gc1tf8ߘ*wH8As,!p$K`9Ov]}yS'a[k?':ynHʗ։VT񲢵݈<Y Gº>L&>l{dckP'a+FJӚ'1D$j|ȩ vR" <$%°kFg$wB,Fz<7gu:4'9u(2DDȐ3& ilO9/d̵^Q% 2/=!F°<[O/0Wl ׶&bx-5Ӑ7y|`,^Q'o)Խڭy0H}I=$] g1,Il.w z>p؏IϷ;VM5?ZX=*"QQ9OxjŋvbIZ'""ĺ+/r;[;adcE>HX廑䡲c$ykФC~5Ǫ HEqAG=ǿad )̅ >}6e, 2:P4yi<{qL v'A mߞ[q_Ov' WS;$R{]v5 )cVVx.`0=uSD]8M\~0`45s52McD:)"U<3tr'ڳznv"=/f0AhwI~K3Idwb`V\}{XDoݿxvcj!)}&wyRNUb)FśxgJ<@ڱLkcci! s'@=Q ߭ߥQR ˛'m}sG|G|O:eZpN&m'CƳUkka sP9\v+O6VDw\ ~e|yf}EX&Rzh(jZW7^S?>ĖavǦX{>aIuZ9PͲ&Eo!1 fH\j/|Xjd$Tm+bQg<msr4T[GezODD:vM kу$ yF{*l:&4m򐡁2J\~?[4jKc"2O0N"ם`'EcE&I-S݉0ymɵ Ԣ֩[xý{NڿsI$˼ o+)9BSyKDd'S~Dh.:txrc>T]3G 5bx!aq"<6w$y°gX.'i(4ORj_sYRt.5;|fٷ c+%*aބ2oFnbRJzB_o]6\2UØ$V!ڄ vrSy c ^K+4ORs"""[aFk6JYWh(DDDr\alCkuRzNDDd+[ byo؆R) VZRԉ c 扈GNlk(TX(4ODDdxvQ'65ORv*WR'""R0λC c ^K+4ORs"""[9?P޴alCkuRzNDDd;o6m(x-%<9s/[JĐ{<ER5CvDDDDDDDDFpyrCDDDDDDDd+[uOv.u$f9 9N0NTlyrS!"""""""7[C 2Nn밧CDDDDDDDd+[Ov^n'y*DDDDDDDDr5\.OVNw7=""""""""ye\Tlzw<9=-]O,ݭ&j!ܩ<ٛ'=ΚRju|{zE)u>DDdqXTmڃg^o+VL|Sѱ8o;#Îz:dѝ__]o*VLt,yb:W=b'G)y<\O{*NRJD)e=y"""۹?$TRzNDDDrob'G)yR'""2SRJi s e5(ezE)e='""+ª'6DCkuRzNDDV='JD)yR'""C c 扈,‹'JD)yR'""Cy3+񿾿;k6g~cbA)'J)9+]"r@x,. Ǿz;ذrY~k?s}oow|l# `ΰ JuTdyBD &|E٘("Y0P·lj(笯"rpx(XXyҟbD|~)_/oBbA)'J)9+]"\+5O M"d7># GmY&PYܵ$ klf#˴stYlol?79ouǞ#\@ks{G_ysזkjC8G_ͯz uv~_zPѶ LQp_~W^?~,o &r 33U1+L_CeqגkƲ?tF-ס+SO(3wC4aV4Mu>0/( a*'3,ŬUl(|jGNF}A]E\Fc\DIeG{?WxʹEͤ3p h߻ kBy$^:L)@󶛇L$!J8T.?1y~7%طsIuFOn ӊ:!Bv1bxˤeb6bАؗU盜>srMN̓>4*o/ O)LB9;`IWxj1cX Kz7T=:aɤ!z9=ctTe{9uP䍢~üzm߬1\c&7u8oN&9b;=W#QDQ׶r1vb8l|RG0t&gch/YYEQ/Fl3GG0y}^#1#yvZ"o<rh]p&y7K>y;Wm/@3 7+'񠧡Id[I!ތTCe EnDK !͝rJL5OjKnPi5 OzADih6v>ƮEVE'qM9|l6qOêqY8%;5)qpQ~O瑷C=0Of+E65f+yF1|) t[;F΋D{jYu}ءƶXbi?bE8rKG1L CyȀãL󯯘0$ER2>!+b X`yex}su>9s_9>{Z[kq̹ :gL >:E9$&PPxu @!6M:^!w1āz*&%oyjM4JIJdidQ"*ן?oOO(79%לaK=Y 2ٖ[fƌcpai'"n tN)EeV]1ϛ.i)7I̕pCc4DK$ҰryR4QƉOtXcQ90beER'i| \&;pRq<яNlMBVe{idj?)'M K9˜lodMS6f\e$489TMO sFG4G5OěMyZΓ'(&F}QѶ+ޖiHy|+h,yPPDё۪yiPL^<XMs<5̓E<11'ef <62^rmALd1mRiW0U tiGcb0 e[%<i:0i<) 0h8|T4h\Q$dT RRǹ)|{6'1=fi+JMZjH6jsxٺrĆI~Eñ J s9՜J4A 00br2ۂ:דFOC;ӣ<.!~<^@=$'Wϓ24OʉrǦ4O8)uӪy5}ҁܙߠXqidż5:{Ooέ[0=1xq 'j|;(g7I<-ChXG<೑AL M1-%ut䈙1emP&&I[vhM1)8< 5m@^~/}/sefdVX~MS}H}OGyʢP}YMٜ6'+4ODdms<&+IOYv)cIF t[6 Ѧ2aS}bFyn4`8>ǢT{*<.yB!ش *'$~LcҲQ(; <fPI<33}7o\嚧[Y>NRJDȺKDPt Z[1iK$RI$Ʋy~ R9:\axHj/ )1x6lO#D!OH#̹,?+]jɢ{ha>[U]=oCTM:y}6mc|meF[~eLmj(s+.Y\A9x6ᘗxc'192Kg$fw9㎣LG,/O6܆atrtIj't9nPVdJ2& VҘ'6N21*l$~6R8g7e:(q5Т5۶qtLS'94XbrDSKHtIOa?''d+h(4OR'JDD!Zg=d:e0n2!|`xNi4۴-I,ئ0o$\C '6Mj(4ORJDiH3ٹZׄTm}ṙ'dv`0 Y'2CyǾ;6yLKmk(TWR'"KZ]vqyǦ K4ORJD)4ODfŁP .࿶@aX&fI'w]gƚ'J);qNdUn03t7lg0=T ?6_'0;R'J)y"bEV5 ®^?|'s"NRJiXQ svGϼZ2S)y2iXQ Lur̹jeEJ)qNDĊZ-M0Z1L-bTJi(扈Z`z>WGjsدX4ة^t/zg,EOri kWR+D4OIHG 3iK-$[rk͸2Ή扚y$O۾^Vd8V/ZN1(s"2ˏ}K{u~{[;'{Gs?yy?>;=HZly2,&Ut$1O}:?wsս3w1@8ϝxl_؏Dϼ#;?#9\Ci<s^6 0N^`㵇='7OyuTy>'""""""2 d:p34|~{m G?~w3?OFȰw{qnw- s{~o[͓-sq>+ovLB9?Y1l7Ɛja 2{zgoDoiڵmyYɐm-w?;t{w7I9kse ǎ<7C''dԶ6O6Gt>d̓j=3EDDDDDDDdĵ̫2yWi1O:Us&w*V{+J)㜈yb]]=}]T\XfR m` RjzKEDDMΓ:jsubWj ȯUCyDvddyuʓRjt7qE)e͓`RǺ:WoǒGխůF &=]]jcRjAR8'"VM;:'?_8qk|uOzՃHuJp]W_)RZyr1v*TWR9;zs{lv[{ˏ}]<;!2)ä.Ug|r"N R8'b`Ʌ2Ƙ!{?ray{?L1A^?6euI̛r.S)e¸<YlP|P^gϝxsG ~Γܟ /[OݿMt0cDDoyaű>o΃'" Y'F?r{!ۤ<^[60/~n/V\&l6d'#gpf L1PNUs\4g8ֹdRNqE)y"I9Aj?dl0&w"a`pmRFF˯=c#a3 , <߉!A#+ ,f޾wb009PN׆0Y(_x6@~f ƚ'J);扈k2i )'$3c0=S>XAņRNqE)y"bgNL{\ֶhBMD)e¸<3 z1el};ݝ/}=Ǚo>߶2'sx'xǟ{eo̒yrMɳ/[w^9'>og;;XmöRѠ Pqxe%" mumNǻڜkծn\1;~ꝝ s ({ۇ1]:4'ћ?@lg + J{z}+ J-yBFvey0R'jqn[ղ՟"̞;>r v!mrjȤ v^7uhW璉'>*yrr[k5ODdw ֗-]X%Cꬔ/vuox9̓[c'!444OdJ ^M $Or6Jކ}2| >ĵscp> 6dwT}hȄ6\ȾsG( 6(E'adek1*RaqmcVz'mru,y?&5uȌ;1̶⚄uzy2ո6_\c:/qE{{8qcUFٜy$64 c7Y c$e992|^s_~"^!y&İԦ5DY:$ӈWq7)o2OC]ᥔuc =NJ6+ϑlT!s>ȦD X}O ΋1(s+qPOt"^)1<&QW wrscĂrή0֩0X#dz.|hf{z{-BYRf?e)>`;^pFۋp|΃tG_w΅8)Ӑ{!F{3r扈Lʡj1 e #T<6Pi\$5i{4^87'fK<)yhPAӠ't[$h ,44!kS& %?9i(w9ߝsAÆm>4F-"%?<ߔ[ cӸHͧ]I|2K$w8IچpO"M헦sʯ1ٴRyҔ;i&扈1tI[f2WyH.1i_Sj' 0F5ObSIף'[3B>s*3IhTp-b~~bkϕld$<_LϠ|(2CdH4B9:W{y2ո6ΓGS"F9Fl<)ľ1lΕZy"[m.-1/(kɉ'OC<7+;1 d<,6[4Oh Ұ'|(k&шʝr΃r~ߖm'Y|Ҩh_/i(LCAAy26B9~;SCAFGnItIK9lC[y#.CńRē<܎k~g,!&وLebyr>8qyMmJgLr]TU[}J!,e`SF㓘'/O=ӇI8 $fF Y扈l{U쨆q4bL^!FÎ H4LF0(y*͓h<uۄ44ilG`Tqc| ߌJ?"SQҺc5u&V!#4>3/l>ͥ򷠁0"\i4O0ObՎ< N߇CwhLF*O;c0q-̸ 0O#f,:;6FJA9B,Oǹ)|{6'|W*3zˇ6dx2mF扈K 9y:I~E-?Ijr:r XJ=m?h-rl ^zsczǥQR^: ߏ}4,xI>xr<-ڛ~ >k|y:4y9OKϼ|?OL! \a)͹C}Kl{b> [e{hat|;(g7I<\~< -K,bs'#FfưЖ::rr6i\W\63ce{ˬ78< u]F݋O~G,a{>WfFrM딯QalPSQ򰲘DvϏ6ĠPf|g^嶟扈lK;tIqbHMe6lGM.w~F$<70T\FP0s;m"Fqxo*"p wyҴmˤcJ<ə(ܕ$rђ#M&A6 iZpy~yq^)'DQ8dž K'J)㜈HKn J+4OR9'vu c J+4OR9쓣6m([*e%" u`zc5{YイsБ/wҹvN RJ<1^Yw`T/nWEwt~o|wwg^|meyd ӔuBJyII o>ha!/mC6\:m&#xZɠ߽7lՠ6l SPܧ{+f,C 4<ϰך8Gk+Ąsɰ!<8,lxҼղ'\Q^E1T^DDVuE*KidҀrסk<79bat~0؆k7;;71iC C#RdW[#g$~mv:FW  O~| %Ν{cq53Ff߉ae$20# n͓?0Rƈq>&.1(q/pcFb1&&f6QȖ&9ia2D) G bx|>gw`ܷvyq4}x>G?~w; İԦ4|T-yi+8 ԛ|7' ~`.O(:p ecEsdh;9| hw >ve(&5sb@MߛxBl䁍扈* a WJꉮa<ɺbUg=7tx6O@tl^ECSs`Р@##̞|Pa8Ya{߰߉ uyOczD 2Otb8w 0׃߄c&pihmǤO6\6MKmydXqES0ý@9^'żQ7 r d_g?6CgnP}@X'b8b+Ơ-s5DHkb2I5097A,( cqǵ;_M4x}}E==e?@yC`{|nD9>c155sQ~s>mL.9Ly"";̓ך*si(Z4yBおnCǹL_s-e*'/dy.gd[Fo3<$L-0%{<]Cwh8< 4lx=7yR"M헦sʯ1ٴȼyƒ2|'tBfh>Oz{jo975ˆ P>.q|?OLysVYᷠckut+rߜ[9$7]+ 'w\.MCD m{M4VObct݆ M!D#sdd(c(3cʹ#۠2+W\63ceL҈yCPybZ:.Dɿ'|a=_=Z)_~"z4ݘDlGŸ 1,;4wj<1@`L @O)wL؆`ߧqF/ύ Ǣr)'yf}yU3OI4xR#8VNNKyBgfnxz;cP12Gmک0(4OW]"" 0#C$&Á'Ʋy~ EsULRA#i3,eJ288M<)t9̐* '>'аy'H9)L 1 6̪H<,ڤY?m4,R8gYh$>Mc +mX5E ^ΞιjM Iy2q1B000QRŧјdlefNQD)e3^yҴm<cJ<ə(%vFCtzIѼ)n2 b~a?:yO PRJDil<)`f`> `<)l<k C L 1(擈Ux a<"RJi(<+I,ڦ]5OR'J)y4ODDdl$̈rB71F FNy^yj\QJi(*̎2 a?SB& 0VaR9L<-Y`L F"1 @H!cJsĪ'